MCLocalization 1.1.6

MCLocalization 1.1.6

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2016年3月

Baglan Dosmagambetov维护。



一套简化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许可证下使用。