【问题标题】:Localizing iPhone app for Region为地区本地化 iPhone 应用程序
【发布时间】:2012-06-26 18:33:07
【问题描述】:

我有一个应用程序,它包含所有内容,无论以英语显示内容的语言如何。在应用程序的产品部分中,产品内容基于 plist 显示。可供购买的产品取决于位置,并非所有产品都适用于每个市场。

在我的模拟器设置中,我的语言设置为 English,我的 Region Format 设置为 Singapore

在加载已本地化的 plist 之后,我首先做一个日志以检查我是否确实将 SG(新加坡)视为我的区域。

NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
NSLog(@"LOCALE: %@", locale);
if([locale isEqualToString:@"SG"]){
    NSLog(@"singapore do something?");
    productCategory = [[NSArray alloc] initWithContentsOfFile:[[NSBundle mainBundle] 
                                    pathForResource:@"Products" ofType:@"plist"]];  
}

当前结果显示我的日志语句记录 LOCALE: SG 这是预期的,但是我的新加坡特定内容没有加载。

我已尝试清理项目并从模拟器中删除应用程序。

这就是我的 plist 文件在我的项目导航器中的显示方式

我做错了什么导致我的本地化 plist 无法显示?

【问题讨论】:

  • 我的 InfoPlist.strings 文件只显示 /* Info.plist 键的本地化版本 */ -- 值得注意的是,我的英语和英语-英国本地化文件工作正常,但是我注意到这些是语言设置而不是区域设置的差异。

标签: ios localization plist nslocale


【解决方案1】:

本地化(从应用程序包中的相关语言文件夹加载翻译资源的过程)完全基于语言设置。所以pathForResource只关心语言设置,忽略区域格式设置。

区域格式设置会影响字符串和依赖于区域设置的数据类型之间的转换(双向:解析输入和格式化输出)。例如,如果您将 NSDate 转换为字符串以进行显示,根据区域格式设置,您可能会得到前一个月的日期(如在美国)或相反的月份(如在英国)。

[NSLocale currentLocale] 指的是区域格式,因此您只是在调试中查看了错误的内容。

这里有更多关于此的信息:https://developer.apple.com/library/mac/documentation/MacOSX/Conceptual/BPInternational/BPInternational.html#//apple_ref/doc/uid/10000171i

编辑 请参阅下面的 cmets,这似乎更复杂。当语言设置为中性语言(例如“en”而不是“en-US”)时,Region 似乎确实会影响本地化。

【讨论】:

  • “本地化...完全基于语言设置” 这句话是真的吗?如果我将字符串资源本地化为“es”和“es-PY”文件并将语言设置为 es 并将区域设置为 PY,我的 iPad 应用程序会选择 PY 而不是 es 的一般语言本地化。如果我将区域设置为其他内容,例如秘鲁,应用程序将正确回退到 es 的语言字符串。
  • es-PY 表示巴拉圭使用的西班牙语。您可以使用 es-PY 作为语言运行应用程序,并将区域格式设置为其他格式。语言会影响您将获得的本地化字符串(如您所描述的),但区域格式不会(相反,这会影响您读取和写入日期、数字、货币数字的方式)。
  • 我已经在 iOS10 上测试过了——如果我在捆绑包中有一个 es-PY 和一个通用的 es 本地化,然后将 iPad 语言设置更改为西班牙语(通用,非区域特定 =“es” ) 和 es-PY (Espanol-Paraguay) 的区域,它将获取 es-PY 区域字符串而不是一般的 es 字符串,证明该区域确实会影响字符串(如果您在捆绑包中有该区域设置)。如果然后我将该区域切换到其他区域,例如秘鲁,因为我没有该区域字符串本地化,它会退回到捆绑包中的通用 es 字符串。请参阅 AppleBundleGuide->搜索订单部分
【解决方案2】:

我曾经遇到过同样的问题,不知何故找到了一个非本地化文件。对我有用的是使用:

[[NSBundle mainBundle] pathForResource:@"Products" ofType:@"plist" inDirectory:nil]

这将始终搜索所有本地化文件并根据用户设置返回正确的文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2011-09-08
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多