有没有办法设置在应用程序不支持设备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";
现在,如果我在UI语言设置为 Italian
的设备上运行该应用程序,该应用程序将使用键字符串 POWER_TO_THE_PEOPLE_BTN
和 POWER_PLUG_BTN
.
必须有一种方法来指定应用程序在这种情况下使用的默认(回退)语言 .
从上面的例子中可以清楚地看出,使用英文字符串作为键是行不通的 .
我现在看到的唯一选择是使用 NSLocalizedStringWithDefaultValue
而不是 NSLocalizedString
.
8 回答
也许这应该有帮助吗? - iPhone: localization / internationalization default strings file
默认情况下它应该回退到英语 . 我刚刚将手机切换到我的应用程序未本地化的语言,文本全部是英文的,正如预期的那样 .
Important: as @hyperspasm评论说:要展开/重新定义,回退语言是用户最近在设备设置中选择的语言,也在应用程序的包中表示 .
为了避免所有那些冗长的语法,并为翻译者提供更具描述性的var名称,我派生了自己的帮助方法
L()
进行翻译并回归到英语我的
Localizable.strings
看起来像这样所以在我的代码中,我会使用
L(@"SOME_ACTION_BUTTON")
来获取正确的字符串虽然某个时候关键比翻译本身更长
HELP_BUTTON_IN_NAV_BAR = 'Help'
但它节省了我很多时间来解释对谁帮助我做翻译的问题您需要确保Info.plist中CFBundleDevelopmentRegion的值是您想要回退的语言区域 . (例如“en”)
我的解决方案感谢https://stackoverflow.com/a/25928309/3664461
Global.h
Global.m
用法:
此解决方案不考虑用户首选项顺序 . 相反,如果用户第一语言未本地化,它将始终回退到Base下的内容 . 此外,如果特定键未针对当前语言进行本地化,但它存在于基本本地化中,您将获得基本本地化 .
更新:
从iOS 9开始,区域包含在语言区域设置中 . 我更新了代码以处理它 .
在不替换任何方法的情况下执行此操作的快速方法是"overriding" NSLocalizedString定义并使用Apple uses用于此定义的方法来替换它并在"overridden"方法中添加额外的回退逻辑 .
我已创建类别
NSBundle+FallbackLanguage
以支持后备语言,您可以在github folder上查看 . 您只需在实现中指定支持的语言数组 .NSBundle+FallbackLanguage.h
NSBundle+FallbackLanguage.m
在Swift 4中的@Bogus回答,就像iOS 11.1上的魅力一样:
基于Bodus解决方案(thx btw . )我创建了这个类别,因为你也需要“fallbackString” . 所以我必须检查设备当前选择的语言,并将其与我想支持的语言进行比较 . 只需导入 Headers ,您就可以使用Apple默认宏
适用于iOS 9.x和11.1 .
NSString Helper.h
NSString Helper.m