はじめに
OSの言語環境によって動作が変わるアプリケーションが存在します。
例えば、ロシア製のマルウェアは、ロシア語環境のOSでは動作しないといったことがあるようです。
Windowsでは、アプリがOSの言語環境を判別する方法として「システムロケールを確認する」という方法があるようです(これ以外の方法もあると思います)。
ということで、「Windowsでシステムロケールを確認する方法」を調べてみました。
MSの公式文書でのシステムロケールの説明は以下にあります。
learn.microsoft.com
※ちなみに
Windowsの言語設定には「ユーザーロケール」「システムロケール」「入力ロケール」「キーボードロケール」etcと色々あるみたいですが、「システムロケール」がそのOSが利用されている言語環境を意味していると思って概ね問題ないのかな思います(特殊な利用環境でしか、それぞれを異なる設定にはしないと思われる)。
システムロケールの表記について
システムロケールは「[言語コード]-[国/地域コード]」という形で表現され、それぞれにLCID(Windows Language Code Identifier)という識別IDが付いているみたいです。
昨今ニュースでよく見聞きする国/地域のロケールは以下の通りです。
[言語コード]-[国/地域コード] | [言語コード] | [国/地域コード] | [LCID(10進数)] | [LCID(16進数)] |
---|---|---|---|---|
ja-JP | 日本語 | 日本 | 1041 | 0x0411 |
en-US | 英語 | アメリカ | 1039 | 0x0409 |
ru-RU | ロシア語 | ロシア | 1049 | 0x0419 |
uk-UA | ウクライナ語 | ウクライナ | 1058 | 0x0422 |
be-BY | ベラルーシ語 | ベラルーシ | 1059 | 0x0423 |
zh-CN | 中国語(繁体字) | 中国 | 2052 | 0x0804 |
zh-TW | 中国語(簡体字) | 台湾 | 1028 | 0x0404 |
ko-KR | ハングル | 韓国 | 1042 | 0x0412 |
ko-KP | ハングル | 北朝鮮 | 未定義 | 未定義 |
MSが公開しているLCIDのリファレンスです。
learn.microsoft.com
システムロケールの確認方法
幾つかの方法で、Windowsのシステムロケールを確認してみます。
PowerShellで確認
「Get-WinSystemLocale」で確認可能です。
> Get-WinSystemLocale LCID Name DisplayName ---- ---- ----------- 1041 ja-JP 日本語 (日本)
WinAPIで確認
WinAPIだと「GetSystemDefaultLocaleName」と「GetSystemDefaultLCID」で確認可能です。
Vista以降だと、「GetSystemDefaultLocaleName」の使用が推奨されています。
from ctypes import * info = create_string_buffer(100) WinDLL('kernel32').GetSystemDefaultLocaleName(byref(info), len(info)) print(info.raw.decode("s-jis")) > ja-JP
from ctypes import * print(WinDLL('kernel32').GetSystemDefaultLCID()) > 1041