首页 文章

iOS App的非英语默认语言?

提问于
浏览
37

我正在为欧洲的客户开发一款应用程序 . 我是美国的英语演讲者 . 我们的应用程序将支持多种语言,但不支持英语 . 我的应用程序中的所有字符串都在翻译的Localized.strings文件中,为不同的语言正确设置,并且当设备设置为正确的语言时它们都正常工作(设备的语言是德语= app正确地为德语本地化) .

如果设备未设置为我们支持的某种语言(例如,设置为英语的手机),则会出现问题 . 在这种情况下,我们希望手机能够回归德国,但事实并非如此 . 我们看到的是,手机正在使用Settings.app的国际部分中语言列表中最高的语言 . 对于我的手机,列表中最高的非英语语言是法语,因此当我运行该应用程序时,它已本地化为法语 . 如果我将手机更改为德语,然后返回英语(这会更改语言列表中的顺序),则应用程序将本地化为德语 .

对于不受支持的语言,如何确保应用默认为德语?我使用this tutorial来设置项目的语言环境 . 这包括删除首次本地化文件时创建的默认"English"语言环境 . 在项目文件中,我添加了:

developmentRegion = de;

另外,在Info.plist中,我有

<key>CFBundleDevelopmentRegion</key>
<string>de</string>

没有成功 .

任何想法,将不胜感激!

3 回答

  • 43

    违反特定语言并不是你应该努力的目标 . 假设一个住在法国并能说一口流利法语的日本用户将他的手机设置为日语 . 您的应用程序默认为德语,尽管它有法语翻译;我猜这不是你想要的,而且肯定不是用户想要的 .

    出于这个原因,我建议尊重用户设置的语言优先级 .

    既然你不想支持英语但是用英语开发了应用程序,那么你最简单的方法就是在编译之后立即删除 en.lproj . 这将使应用程序只使用您计划支持的语言,iPhone将选择最适合用户的语言,如iPhone的默认设置 .


    deleting a specific localization 有一个非常直接的解决方案:

    让Xcode使用所有当前本地化构建应用程序,并且在删除代码签名之前删除 en.lproj 文件夹,并且该语言的所有本地化文件都消失了 . 您可以通过向目标添加运行脚本构建阶段来轻松完成此操作,其中包含以下一行代码(它是一个Bash脚本):

    rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj"
    

    代码签名总是在所有构建阶段完成后启动,因此只需将构建阶段放在当前阶段的末尾即可 .

    Note 这增加了构建时间,因为Xcode重新创建了所有英文文件,因此您可能希望在测试期间禁用此步骤 .

    我希望这对你来说是一个可行的解决方案 .


    关于"the app must fall back to German in the case that an appropriate localization doesn't exist":

    问题是 is an appropriate localization ?如果用户的第三个选择是法语(在2种不支持的语言之后),此解决方案将使该应用程序回归到法语,这是一个适当的本地化 . 比手动设置用户的第五选择德语更合适 .

    应用程序启动时会发生什么变化很简单:操作系统会按照“首选项”中的设置下降用户语言列表,直到找到匹配的本地化并使用此语言 . 许多应用程序默认使用英语而非德语的原因仅仅是因为英语出现在德语以上的大多数用户语言列表中 . 系统没有固有的语言偏好 . 如果删除英文翻译,则只会显示您要支持的语言,并且在这些语言中,将使用用户列表中较高的语言 .

  • 14

    我不喜欢发布这个答案,因为它运行 against 苹果人机界面指南 . 本地化是用户应该设置的东西,而不是管理层应该决定的东西,因此需要某种默认语言的管理者不会理解任何东西,应该改变业务 .

    话虽这么说,有一种方法可以按特定顺序强制iOS使用某些语言 . 我主要使用它来调试本地化而不需要将设备语言设置为其他东西,是否可以使用它来解决这个问题中我不知道的不存在的问题 .

    用户默认值中有一个键 AppleLanguages 指示要使用的语言顺序,通常设置为用户在iOS首选项中设置的顺序 . 如果您更改此订单后,应用程序将首先尝试按该顺序查找本地化 . 您可以做的是阅读当前语言首选项并决定默认为德语,如下所示:

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

    请注意,您需要在 UIApplicationMain 之前的 main.m 中执行此操作,否则您需要重新启动应用才能使此更改生效 .

    我不能说明没有人应该在真实的应用程序中执行此操作,除非您一直执行并实现允许用户手动更改语言的首选项设置 . 如果您只是默认使用给定语言,则用户无法选择更改 your 选项 .

  • -1

    在didFinishLaunchingWithOptions()函数中尝试这个

    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de_DE", nil] forKey:@"AppleLanguages"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    

相关问题