如何设置iOS应用程序的默认本地化
我正在为说俄语的人开发应用程序。俄罗斯附近的许多国家都有第二语言——俄语。我的应用程序有两种本地化:俄语和英语。我需要将俄语本地化设置为默认值。英语应该只适用于像设备语言一样使用英语的人 我知道苹果建议在设置中优先使用首选语言,但我有一个重要的理由不遵循这一建议如何设置iOS应用程序的默认本地化,ios,objective-c,iphone,xcode,Ios,Objective C,Iphone,Xcode,我正在为说俄语的人开发应用程序。俄罗斯附近的许多国家都有第二语言——俄语。我的应用程序有两种本地化:俄语和英语。我需要将俄语本地化设置为默认值。英语应该只适用于像设备语言一样使用英语的人 我知道苹果建议在设置中优先使用首选语言,但我有一个重要的理由不遵循这一建议 如何将俄语本地化设置为默认值?您可能需要在Info.plist中将俄语设置为CFBundleDevelopmentRegion的值 CbundleDevelopmentRegion(String-iOS,OS X)指定捆绑包的本机区域。
如何将俄语本地化设置为默认值?您可能需要在Info.plist中将俄语设置为
CFBundleDevelopmentRegion
的值
CbundleDevelopmentRegion(String-iOS,OS X)指定捆绑包的本机区域。此键包含一个字符串值,该值通常对应于编写包的人的母语。如果无法找到用户首选区域或语言的资源,则此值指定的语言将用作默认语言
更新
如果您确实想要并且需要覆盖操作系统的语言优先级,您可以使用AppleLanguages
user defaults键(不过,正如您所知,不建议这样做):
我认为您需要使用文件中的
本地化本地开发区域
键
我没有找到正确的解决方案。唯一适合我的问题的方法是使用
NSLocalizedStringFromTableInBundle
而不是nsLocalizedStrings
。这种方式不允许对图像或笔尖进行本地化,但使用字符串时效果很好
首先,您需要定义当前设备语言:
NSString *lang = (NSString *)[[NSLocale preferredLanguages] objectAtIndex:0];
NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"]];
接下来查找此语言的捆绑包:
NSString *lang = (NSString *)[[NSLocale preferredLanguages] objectAtIndex:0];
NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"]];
如果找到捆绑包,请在NSLocalizedStringFromTableInBundle
中使用它:
_label.text = NSLocalizedStringFromTableInBundle(@"LabelText",nil,myLangBundle,nil);
否则,请查找并使用默认捆绑包。正如eofster所说,您应该将
AppleLanguages
键设置为NSUserDefaults
以所需的顺序排列语言,但为了在第一次午餐时工作,您应该很早就开始,甚至早于applicationwill午餐with选项:
对于我来说,这个解决方案非常有效,并且在使用NSLocalizedStringFromTableInBundle
时具有优势,因为它也适用于故事板和NIB
下面是关于Swift语言的逐步解决方案
init
方法,您可以使用UIApplication
子类自己替换首选语言列表
override init() {
if let languages = NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages") as? [String],
let language = languages.first where !language.hasPrefix("en")
{
NSUserDefaults.standardUserDefaults().setObject(["ru", "en"], forKey: "AppleLanguages")
}
super.init()
}
Swift 4:
override init() {
if let languages = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String],
let language = languages.first(where:{!$0.hasPrefix("en")})
{
UserDefaults.standard.set(["ru", "en"], forKey: "AppleLanguages")
}
super.init()
}另外,如果您不仅要进行本地化,还要进行国际化,请不要忘记检查日期选择器、日期格式化程序、数字格式化程序等使用的区域设置。在我的应用程序中,我只有带硬编码字符串的俄语本地化,但我使用带有本地化包的库。默认情况下,库中的字符串为英语。因为
NSBundle.mainBundle.preferredLanguages
是[“en”]
在我用CbundleLocalizations
键在Info.plist中指定应用程序本地化语言后,它们变成了俄语:
CbundleLocalizations(Array-iOS,OS-X)标识本地化
由应用程序手动处理。如果您的可执行文件未绑定或
不使用现有的bundle本地化机制,您可以包括
此键用于指定应用程序处理的本地化
此属性数组中的每个条目都是一个字符串,用于标识
受支持对象的语言名称或ISO语言标识符
本地化。请参阅中的“语言和区域设置”
国际化中的国际化与本土化引导
有关如何指定语言标识符的信息的文档
首选语言有时返回“ru_ru”,但我的lproj是ru.lproj。所以我决定换一个解决方案。 我在所有可本地化的字符串文件中添加了“test.lang.phrase=“YES”;如果找不到本地化,我将加载默认本地化
NSString *result = nil;
NSString *testLang = NSLocalizedString(@"test.lang.phrase", nil);
if ([testLang isEqualToString:@"YES"]) {
result = NSLocalizedString(str, nil);
}
if (!result) {
NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"]];
result = NSLocalizedStringFromTableInBundle(str, nil, myLangBundle,nil);
}
我尝试过这样做,但没有结果。如果您按下Info.plist中CbundledevelopmentRegion字段的值,您可以看到XCode仅为该参数建议了11种语言。我尝试手动输入“ru”“但没有结果。您的应用程序有俄语和英语本地化,并且该键设置为ru,对吗?”?然后选择其他语言,比如西班牙语,用户界面仍然是英语?我注意到,至少在iOS 7中,操作系统考虑了系统首选项中语言的顺序。因此,如果您在英语之后切换到西班牙语,则顺序将是西班牙语、英语、俄语,并且应用程序将使用英语。看看情况是否如此。例如,在俄语之后切换到不支持的语言。是的,如果顺序为:西班牙语、俄语、英语,则应用程序使用俄语。但是,例如在乌克兰,很多人在买了iPhone之后,会先选择乌克兰语,并且永远不会改变语言顺序。在这种情况下,乌克兰用户的第二项顺序为英语。设置
AppleLanguages
键可能会出现问题。你可能必须很早就设置它,就像在main()中一样。这个问题已经有6年了,苹果没有解决它。这就是人们的答案@hasan83不为我工作。你能提出一个解决方案吗。