我想在我的iphone应用中为en_GB和其他'en'子语言本地化字符串,但是XCode和iphone拒绝让这种情况发生。我为en_GB和en_US(我尝试了连字符和下划线)创建了一个“Localizable.strings”的本地化用于测试目的,但它们只是无法识别。唯一有效的语言代码就是“en”(在XCode中显示为“English”)。
我无法相信这是不可能的,所以我做错了什么?我也希望得到典型的“级联”行为,如果在子语言中找不到字符串,例如“en_GB”然后如果可能的话应该从“en”中获取。帮助
答案 0 :(得分:6)
当您从iPhone偏好设置的语言列表中选择“英语”时,这实际上意味着“en_US”语言。
因此,在Apple使用“英语(英国)”等其他子语言更新软件之前,我们将继续使用语言环境设置,并从另一个字符串表中手动加载字符串。
但是,语言和地区区域设置是分开的原因:英国的西班牙用户可能希望根据当地习俗格式化日期/时间,但是用他们的母语编程字符串。检测区域区域设置(英国)并因此显示英国字符串是不正确的。
所以基本上目前无法做到这一点。
答案 1 :(得分:4)
你正在做什么应该根据文档工作。但似乎iPhoneOS实施与文档不一致。根据{{3}},不支持en_GB语言,只支持语言环境(日期格式等)。
答案 2 :(得分:2)
答案 3 :(得分:1)
我发现了同样的问题。
顺便说一句,如果你看一下iPhone设置 - >一般 - >国际菜单,它使语言和地区之间的区别非常明确:
语言:
语 -
地区格式:
- 美国
- 联合王国
本地化框架似乎只关注语言,而不是区域。
我很想向Apple提出增强请求,因为IMO用户可能想要在美国使用英国英语(用于文本)是合理的(例如,电话号码应该在哪里)采用美国格式。)
答案 4 :(得分:1)
创建一个单独的字符串资源,比如说UKLocalization.strings
,并为每种支持的语言创建本地化。对于en
以外的所有本地化,此文件为空。对于en
,它仅包含具有唯一en_GB拼写的字符串。
接下来,为NSLocalizationString创建一个替代品,它将首先检查UKLocalization表,然后再回到标准本地化表。
e.g:
static NSString* _locTable = nil;
void RTLocalizationInit()
{
_locTable = nil;
NSString* country = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];
if ([country isEqual:@"GB"])
{
_locTable = @"UKLocalization";
}
}
NSString* RTLocalizedString(NSString* key, NSString* ignored)
{
NSString* value = nil;
value = [[NSBundle mainBundle] localizedStringForKey:key value:nil table: _locTable];
if (value == key)
{
value = NSLocalizedString(key, @"");
}
return value;
}
答案 5 :(得分:1)
我不确定它在哪个版本的iOS中引入,但iOS 7肯定有“英国英语”语言首选项,它将从en_GB.lproj
目录中获取资源。除非你使用更专业的*方言,否则不应该在网上漂浮各种黑客。
*看看我在那里做了什么;)