在运行时更改 NSLocalizedString() 的语言

7

我有一个iPhone应用程序,其中有一个按钮可以在运行时更改显示语言。我查看了NSLocalizedString(),它将根据系统首选项返回适当的字符串。除了硬编码所有显示字符串并根据用户语言选择在运行时返回之外,还有哪些选择?任何指针都将不胜感激。


请参见 https://dev59.com/LnI-5IYBdhLWcg3wy70d。 - Elliot
4个回答

15

根据用户 "object2.0" 的帖子,我整理了一些示例代码,供您在应用程序中使用,以便在运行时更改 UI 语言。

主要的本地化类执行了较难的工作:

-(NSString *) localized:(NSString *) key
{
  GameInfo *gameInfo = [GameInfo sharedInstance];

  // langCode should be set as a global variable somewhere
  NSString *path = [[NSBundle mainBundle] pathForResource:langCode ofType:@"lproj"];

  NSBundle* languageBundle = [NSBundle bundleWithPath:path];
  return [languageBundle localizedStringForKey:key value:@"" table:nil];
}

假设你在一个名为utils的全局类中有这个函数,使用以下代码调用该函数(例如将单词“Settings”输出)。

NSLog( [utils localized:@"Settings"] );
更改语言的方法:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:langCode, nil] forKey:@"AppleLanguages"];

不错的总结 :) 顺便说一下,如果我们在用户动态更改语言后将所选语言保存到NSUserDefaults中,我们也可以从NSUserDefaults中获取langCode。(虽然我不知道这个操作是否会很耗费资源) - aslı
@CheckSmith 为什么要用 "ofType:@"lproj" ?? 我经常创建 Localizable.strings。 - onmyway133

5

使用此功能可以强制设置语言顺序。

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en",@"de",..., nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];

那么使用
NSLocalizedString();

展示本地化字符串...


5

1

正确的“用户体验”是让用户通过系统偏好设置选择他们的语言,而不是通过您的应用程序(或您的应用程序的设置面板等)。无法针对每个应用程序覆盖此设置,您也不希望任何应用程序更改系统范围的设置。


5
我不同意。对于电视游戏,我更喜欢日语,因为我从小就玩日本的游戏。但是对于其他应用程序,我喜欢使用我的母语。 - AechoLiu
我们的应用程序可能不支持在一些引入了它的国家/地区的系统首选项,因此用DE覆盖EN将对许多拥有非默认语言(EN)的客户获得优势。 - Jonas Byström
这假定应用程序不会同时显示多种语言。 - Monte Hurd
我听到了两个增强请求:1)用户应该能够针对每个应用程序指定首选语言,2)能够指定语言优先级列表。请参见https://bugreport.apple.com。 - geowar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接