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_BTN和POWER_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")
Sea*_*bet 16
也许这应该有帮助吗?- iPhone:本地化/国际化默认字符串文件
默认情况下它应该回退到英语.我刚刚将手机切换到我的应用程序未本地化的语言,文本全部是英文的,正如预期的那样.
重要提示:正如@hyperspasm所评论的:要扩展/重新设置此选项,后备语言是用户最近在设备设置中选择的语言,该语言也在应用程序的包中表示.
@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)