WindowsやMacOSXなどのOSがワンクリックで言語を変更するだけで、突然、すべてのメッセージボックス、ボタンなどが変更されるのではないかといつも思っていました。
この種のメカニズムはどのように実装されていますか?
ありがとう
WindowsやMacOSXなどのOSがワンクリックで言語を変更するだけで、突然、すべてのメッセージボックス、ボタンなどが変更されるのではないかといつも思っていました。
この種のメカニズムはどのように実装されていますか?
ありがとう
国際化の鍵は、ユーザーに表示されるテキストをハードコーディングしないようにすることです。代わりに、ロケールをチェックしてテキストを適切に選択する関数を呼び出します。
不自然な例:
// A "database" of the word "hello" in various languages.
struct _hello {
char *language;
char *word;
} hello[] = {
{ "English", "Hello" },
{ "French", "Bon jour" },
{ "Spanish", "Buenos dias" },
{ "Japanese", "Konnichiwa" },
{ null, null }
};
// Print, e.g. "Hello, Milo!"
void printHello(char *name) {
printf("%s, %s!\n", say_hello(), name);
}
// Choose the word for "hello" in the appropriate language,
// as set by the (fictitious) environment variable LOCALE
char *say_hello() {
// Search until we run out of languages.
for (struct _hello *h = hello; h->language != null; ++h) {
// Found the language, so return the corresponding word.
if (strcmp(h->language, getenv(LOCALE)) == 0) {
return h->word;
}
}
// No language match, so default to the first one.
return hello->word;
}
UNIXライクなシステムでは、メッセージはカタログであり、ファイルに保存されます。プログラム的に、Cはgettext()
国際化とローカリゼーションのための機能と、文化情報を取得するためのlocale.hヘッダーを提供します。
これがここで取られたコード例です
#include <libintl.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
setlocale( LC_ALL, "" );
bindtextdomain( "hello", "/usr/share/locale" );
textdomain( "hello" );
printf( gettext( "Hello, world!\n" ) );
exit(0);
}
MS-Windowsでは、を使用しMUI(Multilingual User Interface)
ます。プログラムでCでLoadString()
関数を使用できます。チェックアウトhow to do
。