【问题标题】:Change iOS app's language on the fly即时更改 iOS 应用程序的语言
【发布时间】:2011-09-03 06:45:45
【问题描述】:

我正在编写一个 iOS 应用程序,我希望用户能够独立于 iPhone 或 iPad 的语言更改 UI 语言。问题是,当语言发生变化时,如何为当前显示的视图重新加载适当的 NIB 文件,以及如何加载适当的 .strings 文件以使 NSLocalizedString 正常工作?

【问题讨论】:

  • 您知道人们可以在“设置”应用中更改语言,而您的应用不应该为此提供单独的选项,对吧?
  • 您可能需要一个单独的选项,如果您希望某种语言成为后备语言,该语言与用户语言列表中的第一个现有本地化语言不同。这是一种很常见的模式。

标签: iphone objective-c ios localization xcode4


【解决方案1】:

这应该可以解决问题,假设de 是用户选择的新语言。还要确保您正在重新启动当前视图。

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

【讨论】:

  • 感谢您的快速回复。但这不会改变整个手机的语言吗?
  • 不,您不能从代码更改手机配置(至少是“批准”代码)。
  • 这里是语言名称的所有表示形式的列表:loc.gov/standards/iso639-2/php/English_list.php
  • 重要的是,该语句在应用程序启动之前执行:在 main() 函数的 main.m 中执行,在调用 UIApplicationMain() 之前。
  • 如果您希望更改在应用启动后的某个时间立即生效,请添加 [[NSUserDefaults standardUserDefaults] synchronize];
【解决方案2】:

就我个人而言,我不喜欢将 NIB 文件提供给翻译人员的想法。相反,我设计了 NIB,以便为非英语语言提供足够的空间(通常它们需要多 50% 的文本空间),然后我将所有文本资源存储在 Localizable.strings 文件中。

然后,在我的代码中,我为每个 UI 控件设置了文本。

[_myButton setTitle:NSLocalizedString(@"My button title", 
                                      @"My description for translation file, e.g. including chars limit")
           forState:UIControlStateNormal];

我发现这使翻译过程更易于管理。

要回答您最初的问题,您可以将此代码放入您的 UIViewviewWillAppear 函数中,以确保每次 UI 重新出现时都会重新加载它。

【讨论】:

  • 我刚刚完成了我的应用程序的本地化,我必须同意你所说的。 +1。
  • 谢谢,这绝对是一种方法。我将再次与我的客户讨论这种语言变化的事情。使用 NIB 文件进行本地化的另一种方法是在检测到语言设置更改后询问用户是否要重新启动应用程序。
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-24
  • 2013-03-04
  • 1970-01-01
  • 2015-05-09
相关资源
最近更新 更多