一套简化iOS应用“即时”本地化的工具。
苹果有“标准”的方式使用NSLocalizedString
来本地化iOS应用。它足够灵活,除非有很好的理由不这么做,否则你应该坚持使用。
我在iOS应用、网站上,甚至可能在其他平台上开发的应用中复用相同的本地化文件。JSON的优势在于几乎所有现代平台都有处理JSON的库。
作为一个附加优点,它更容易创建不依赖于本地化人员熟悉C字符串转义或使用针对iOS应用本地化不专门的翻译服务的工具。
MCLocalization使用JSON格式的字符串文件。内部,它是一系列字符串的集合。以下是从示例项目中的示例:
{
"en": {
"greeting": "Hello!",
"message": "Tap on the buttons below to switch languages",
"glory": "Glory Glory, %name%!",
"mustache": "mustache",
"lovely-mustache": "What a wonderful {{mustache}} you have!"
},
"ru": {
"greeting": "Привет!",
"message": "Нажимайте на кнопки для смены языка",
"glory": "Славься славься, %name%!",
"mustache": "усы",
"lovely-mustache": "Какие замечательные у Вас {{mustache}}!"
}
}
如果使用多个JSON文件,每个语言一个文件,文件应只包含那个语言的字符串。
{
"greeting": "Hello!",
"message": "Tap on the buttons below to switch languages",
"glory": "Glory Glory, %name%!",
"mustache": "mustache",
"lovely-mustache": "What a wonderful {{mustache}} you have!"
}
每种语言的字符串集合通过规范化的IETF BCP 47语言标识符(与NSLocale中使用的相同标识符)引用。集合中的字符串通过键来进一步识别。
将“Classes”文件夹中的文件添加到您的项目中。
通过加载字符串初始化本地化
使用单个JSON文件
[MCLocalization loadFromURL:[[NSBundle mainBundle] URLForResource:@"strings.json" withExtension:nil] defaultLanguage:@"en"];
使用多个JSON文件,每个语言一个文件
NSDictionary * languageURLPairs = @{
@"en":[[NSBundle mainBundle] URLForResource:@"en.json" withExtension:nil],
@"ru":[[NSBundle mainBundle] URLForResource:@"ru.json" withExtension:nil],
};
[MCLocalization loadFromLanguageURLPairs:languageURLPairs defaultLanguage:@"en"];
使用文件路径的旧式方法
NSString * path = [[NSBundle mainBundle] pathForResource:@"strings.json" ofType:nil];
[MCLocalization loadFromJSONFile:path defaultLanguage:@"en"];
MCLocalization会尝试根据设备的语言偏好确定最佳匹配的语言,如果匹配失败,则默认语言参数作为“回退”设置。
以下是获取本地化字符串的方式
_label.text = [MCLocalization stringForKey:@"greeting"];
以下是使用占位符的方式
// Given the "key": "%a% {{b}} [c]", the following call will return "A B C"
[MCLocalization stringForKey:@"key" withPlaceholders:@{@"%a%":@"A", @"{{b}}":@"B"}, @"[c]":@"C"];
MCLocalization被设计用来辅助“即时”本地化,使得应用的UI能够在用户更新语言设置后立即更新。要更新本地化语言,可以设置如下:
[MCLocalization sharedInstance].language = @"ru";
本地化语言将被设置,并且将发送一个
使用MCLocalization时,我推荐以下模式
在AppDelegate中加载本地化字符串 application:didFinishLaunchingWithOptions:
NSString * path = [[NSBundle mainBundle] pathForResource:@"strings.json" ofType:nil];
[MCLocalization loadFromJSONFile:path defaultLanguage:@"en"];
在您想要本地化的UIViewController中,将所有本地化代码收集到一个专用函数中
- (void)localize
{
_greetingLabel.text = [MCLocalization stringForKey:@"greeting"];
_messageLabel.text = [MCLocalization stringForKey:@"message"];
_labelPlaceholders.text = [MCLocalization stringForKey:@"glory" withPlaceholders:@{@"%name%":@"Man United"}];
_mustacheLabel.text = [MCLocalization stringForKey:@"lovely-mustache" withPlaceholders:@{@"{{mustache}}":[MCLocalization stringForKey:@"mustache"]}];
}
从 viewDidLoad 中调用该函数,并将视图控制器添加为 MCLocalizationLanguageDidChangeNotification 的观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(localize) name:MCLocalizationLanguageDidChangeNotification object:nil];
[self localize];
默认情况下,缺失密钥的本地化字符串将为 nil。可以设置 noKeyPlaceholder 文本代替
[MCLocalization sharedInstance].noKeyPlaceholder = @"[No '{key}' in '{language}']";
{key} 和 {language} 占位符将被相应的设置所替换。
此项目中的代码可在MIT许可证下使用。