在iOS中本地化字符串:默认(后备)语言?

Vol*_*ing 39 localization internationalization ios

有没有办法设置在应用程序不支持设备UI语言时使用的默认语言?

示例:我的应用已本地化为英语和德语:

// en.lproj:
"POWER_TO_THE_PEOPLE_BTN" = "Power";
"POWER_PLUG_BTN" = "Power";

// de.lproj:
"POWER_TO_THE_PEOPLE_BTN"  = "Macht";
"POWER_PLUG_BTN" = "Spannung";
Run Code Online (Sandbox Code Playgroud)

现在,如果我在设置为Italian应用程序的UI语言的设备上运行应用程序将使用键字符串POWER_TO_THE_PEOPLE_BTNPOWER_PLUG_BTN.

必须有一种方法来指定应用程序在这种情况下使用的默认(回退)语言.

从上面的例子中可以清楚地看出,使用英文字符串作为键是行不通的.

我现在看到的唯一选择是使用NSLocalizedStringWithDefaultValue而不是NSLocalizedString.

Ken*_*yen 19

为了避免所有那些冗长的语法,并为翻译人员提供更多描述性的var名称,我派生了我自己的帮助方法L()进行翻译并回归到英语

NSString * L(NSString * translation_key) {
    NSString * s = NSLocalizedString(translation_key, nil);
    if (![[[NSLocale preferredLanguages] objectAtIndex:0] isEqualToString:@"en"] && [s isEqualToString:translation_key]) {
    NSString * path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
    NSBundle * languageBundle = [NSBundle bundleWithPath:path];
    s = [languageBundle localizedStringForKey:translation_key value:@"" table:nil];
    }
    return s;
}
Run Code Online (Sandbox Code Playgroud)

Localizable.strings看起来像这样

"SOME_ACTION_BUTTON" = "Do action";
Run Code Online (Sandbox Code Playgroud)

所以在我的代码中,我会L(@"SOME_ACTION_BUTTON")用来获取正确的字符串

虽然有时候关键比翻译本身更长HELP_BUTTON_IN_NAV_BAR = 'Help'但是它节省了我很多时间来解释什么是帮助我做翻译的人


小智 17

您需要确保Info.plist中CFBundleDevelopmentRegion的值是您想要回退的语言区域.(例如"en")

  • 这似乎不再起作用,只在设置中测试了芬兰语设备.该应用程序具有芬兰语和英语翻译,`en`在Info.plist中定义,用于键'CFBundleDevelopmentRegion`仍然是芬兰`.string`文件中不存在的键不会回退到英文版. (4认同)
  • 这应该是目前正确的答案。 (2认同)

Sea*_*bet 16

也许这应该有帮助吗?- iPhone:本地化/国际化默认字符串文件

默认情况下它应该回退到英语.我刚刚将手机切换到我的应用程序未本地化的语言,文本全部是英文的,正如预期的那样.

重要提示:正如@hyperspasm所评论的:要扩展/重新设置此选项,后备语言是用户最近在设备设置中选择的语言,该语言也在应用程序的包中表示.

  • 后备语言是应用程序支持的`[NSLocale preferredLanguages]`中的第一种语言.它并不总是英语.如果您更改设置中的语言,它将移动到列表顶部. (18认同)
  • 要对此进行扩展/重新定义,后备语言是用户最近在"设置"中选择的语言,该语言也在应用程序的包中表示. (6认同)

Mak*_*ele 5

@Bogus answer in Swift 4, works like a charm on iOS 11.1:

public func NSLocalizedString(_ key: String, tableName: String? = nil, bundle: Bundle = Bundle.main, value: String = "", comment: String) -> String {
    let fallbackLanguage = "en"
    guard let fallbackBundlePath = Bundle.main.path(forResource: fallbackLanguage, ofType: "lproj") else { return key }
    guard let fallbackBundle = Bundle(path: fallbackBundlePath) else { return key }
    let fallbackString = fallbackBundle.localizedString(forKey: key, value: comment, table: nil)
    return Bundle.main.localizedString(forKey: key, value: fallbackString, table: nil)
}
Run Code Online (Sandbox Code Playgroud)