代码之家  ›  专栏  ›  技术社区  ›  Ron Srebro

创建本地化的iPhone应用程序,但允许用户更改应用程序的语言

  •  14
  • Ron Srebro  · 技术社区  · 15 年前

    我正在开发本地化的应用程序,一切正常。问题是我想允许用户在app settings文件夹中为特定的app专门选择长度。这应该是用户的手机设置为一种语言(如法语),以设置应用程序以英语工作。

    我目前正在使用nslocalizedstring获取本地化字符串,但通过查看宏的所有变体,我找不到一个可以让我指定语言的宏。

    有什么办法吗?

    4 回复  |  直到 13 年前
        1
  •  12
  •   Community CDub    8 年前

    有更好的方法可以做到这一点。你可以这样强制语言:

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

    并通过以下方式撤消此设置:

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];
    

    铌。您通常需要重新启动应用程序才能使其生效。

    考虑一下你是否需要打电话 [[NSUserDefaults standardUserDefaults] synchronize];

    我同意不需要允许用户指定语言。但是,有一个例外是能够覆盖该语言并将其设置为开发人员的本地语言。如果用户可以使用开发人员的语言(例如我的英语),那么如果翻译不正确,他们可能希望使用该语言的应用程序。

    我引用这个答案: How to force NSLocalizedString to use a specific language (事实上,答案对我不起作用,但是按照评论中的想法做的。我做的撤消操作。

        2
  •  15
  •   Rob Napier    15 年前

    这里有三个问题:

    • 其他资源(包括NIB)
    • 系统消息

    最后一个几乎肯定是不可修复的,所以我们将保留它。它们将以设备语言显示。

    另外两个是可以解决的,但是你需要用手做更多的事情。对于字符串,不要先创建一个可本地化的.strings,然后对其进行本地化,而是创建完全独立的表(english.strings、french.strings等),然后使用 NSLocalizedStringFromTable() ,将语言作为表传递。

    对于笔尖,有两种方法。您可以将每一组本地化的NIB放入自己的包中,然后传递该包,而不是 nil -initWithNibName:bundle: .另外,你也可以在找到笔尖后手动装入笔尖。 [NSBundle -pathForResource:ofType:inDirectory:forLocalization:] .

        3
  •  3
  •   object2.0    14 年前

    从应用程序中选择特定语言的技巧是强制nslocalizedstring根据所选语言使用特定的包,

    这是我为这个写的帖子 http://learning-ios.blogspot.com/2011/04/advance-localization-in-ios-apps.html

    这是一个示例应用程序的代码 https://github.com/object2dot0/Advance-Localization-in-ios-apps

        4
  •  1
  •   geowar    15 年前

    正确的“用户体验”是让用户通过系统首选项面板选择他们的语言,而不是您的应用程序(或应用程序的设置面板等)。没有办法覆盖每个应用程序,我们不希望任何应用程序更改系统范围的设置。