本地化子系统提供了创建多语言应用程序的简单方法。
初始化
在使用子系统之前,需要加载本地化字符串集合。通常的做法是在应用程序启动时执行此操作。可以加载多个集合文件,每个集合文件只能定义一种或多种语言。例如:
Localization* l10n = GetSubsystem<Localization>();
// 1st JSON file format
l10n->LoadJSONFile("StringsEnRu.json");
l10n->LoadJSONFile("StringsDe.json");
// 2nd JSON file format
l10n->LoadJSONFile("StringsLv.json", "lv");
JSON文件必须采用UTF8编码,无BOM。示例文件位于bin/Data目录中。JSON文件必须具有以下格式之一:
1.LoadJSONFile(“StringsEnRu.json”)方法将自动从json文件中选择语言
{
"string id 1":{
"language 1":"value11",
"language 2":"value12",
"language 3":"value13"
},
"string id 2":{
"language 1":"value21",
"language 2":"value22",
"language 3":"value23"
}
}
2.必须将第二个参数传递给LoadJSONFile(“StringsLv.json”,“lv”)方法,以告诉解析器将加载哪种语言
{
"string id 1": "value 1",
"string id 2": "value 2",
"string id 3": "value 3"
}
可以定义任意数量的语言。请记住,语言名称和字符串标识符区分大小写。“En”和“en”被认为是不同的语言。在加载过程中,按照查找顺序对语言进行编号。索引从零开始。第一个找到的语言被设置为初始激活。
使用
Get函数以当前语言返回具有指定字符串标识符的字符串。
Text* t = new Text(context_);
t->SetName("Text1");
Localization* l10n = GetSubsystem<Localization>();
t->SetText(l10n->Get("string 1"));
如果字符串id为空,将返回一个空字符串。如果找不到翻译,将不修改地返回id,并记录警告。使用SetLanguage()函数在运行时更改语言。
Localization* l10n = GetSubsystem<Localization>();
l10n->SetLanguage("language 2");
语言更改后,将发送E_CHANGELANGUAGE事件。订阅它以执行必要的用户界面重新定位(文本、精灵等)
SubscribeToEvent(E_CHANGELANGUAGE, URHO3D_HANDLER(Game, HandleChangeLanguage));
void Game::HandleChangeLanguage(StringHash eventType, VariantMap& eventData)
{
Localization* l10n = GetSubsystem<Localization>();
...
Text* t = static_cast<Text*>(uiRoot->GetChild("Text1", true));
t->SetText(l10n->Get("string 1"));
}
文本UI元素还支持自动翻译,以避免手动操作。
Text* t2 = new Text(context_);
t2->SetText("string 2");
t2->SetAutoLocalizable(true);
其中文本值用作标识符。另请参见示例40_Localization。