6

我想在我的应用程序中有一个选项来更改我的应用程序语言(只是应用程序语言而不是整个系统),你能给我一些提示吗?

提前致谢,

我知道本地化!

4

3 回答 3

2

您可以通过使用从 Xcode 设置的自定义构建标志来执行此操作。这样,您可以在本地化下运行应用程序,而不是更改设备的所有设置。

我在http://abizern.org/2012/03/18/simple-localisation-testing/上写了一篇关于它的博客文章

Github 上有一个示例项目,您可以使用它来查看它的实际效果:https ://github.com/Abizern/SimpleLocalisationTesting

于 2012-07-20T11:41:32.770 回答
1

我已经制作了由 .plist 制作的自定义本地化,其中充满了字典数组。像这样:

kYes
  en = @"Yes"
  ru = @"Да"
kNo
  en = @"No"
  ru = @"Нет"

在我的项目中,我制作了一个单例类来读取这些字符串。在选项中,用户选择所需的语言(首先启动应用程序从当前系统状态中选择语言或设置默认语言)。选择的语言必须保存在文件或设置中,以便下次启动时使用。在单例中,我有+getStringWithKey:. 所以我通过@"kYes" 并获取仅适用于应用程序的当前本地化字符串。此外,无论如何,您都需要将标准本地化文件添加到项目中,即使是空的,因为如果您不这样做,您支持的所有语言都不会在 iTunes 中显示。

于 2012-07-20T11:38:37.897 回答
1

我实际上在考虑如何更改应用程序 ui 中的语言的另一个想法,尽管它迫使您 1. 手动设置所有字符串 a 2. 提供一种方法(通知),当语言设置发生更改时更新所有 ui 元素。这个想法基于 iOS 用来查找字符串的本地化版本的相同方法。因此,作为先决条件,您必须提供具有文件夹结构 language_id.lproj 的包(例如 AppNameStrings.bundle),其中 language_id 是您要提供的语言的指示符。您可以通过创建设置包来创建这样的包,在 Finder 中打开它并删除 root.plist 文件。接下来,您需要一个可用于从包中读取的函数。这是我用来读取本地化字符串的 2 种方法。将以下方法放入 GlobalDefinitions.h 文件中

#ifdef __OBJC__  
NSBundle *yourNameBundle(void);
NSString *YourNameLocalized(NSString *stringToken, NSString *language);
#endif

以及 GlobalDefinitions.m 文件中的代码

NSBundle *yourNameBundle(void) {
static NSBundle* bundle = nil;
  if (!bundle) {
    NSString* path = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"YouNameBundle.bundle"];
    bundle = [NSBundle bundleWithPath:path];
  }
   return bundle;
}
NSString *YourNameLocalized(NSString *stringToken, NSString *language) {
  if (yourNameBundle()) {
    return [yourBundle localizedStringForKey:stringToken value:@"" table:@"Root" language:language];
  } else {
    return stringToken;
  }
}

您必须在 NSBundle 上创建一个类别

[yourBundle localizedStringForKey:stringToken value:@"" table:@"Root" language:language]

因为标准方法缺少语言参数。在您的方法中,您打开相应的 language.lproj/Root.strings 文件并扫描它以查找 stringToken。如果找不到它,则返回令牌本身,否则返回文本字符串。每当您需要某些文本的本地化版本时,您都会编写例如 label.text = YourNameLocalized(@"Token", [self provideLanguageIdentifier); 你就完成了。到目前为止我还没有这样做,但它应该可以工作。

于 2012-09-06T09:26:43.283 回答