【问题标题】:Translating iOS app to unsupported/non-standard languages将 iOS 应用程序翻译成不受支持/非标准的语言
【发布时间】:2012-05-02 20:00:52
【问题描述】:

我正在扩展现有的 iPhone 应用程序(4.x 及更高版本)以支持更多语言:爱沙尼亚语、拉脱维亚语和立陶宛语。

在我的 iPhone 和模拟器中,不支持这些语言,而且我很确定在这些地区也没有针对它们的特殊固件。

如何才能最好地制作支持它们的应用?

我想出了两个我不太喜欢的解决方案。它们都不允许我在应用程序中使用一种以上的语言,因为用户无法从 Settings.app 列表中选择捆绑的语言。这意味着必须为每种语言提交一个版本。

选项 1:滥用 en.lproj 目录

对于每种目标语言(lt、lv、et),我将该语言的字符串文件放入 en.lproj 目录中。

优点:使用众所周知的机制。该应用程序只是认为它正在运行英语。

缺点:严重破坏了我的本地化工具。它让未来的维护者感到困惑,因此容易出错。需要一个奇怪的构建设置。

选项 2:滥用 NSUserDefaults[AppleLanguages]

NSUserDefaults 中的AppleLanguages 对象包含应用程序要使用的语言列表。通过这样设置,我可以让应用程序从 lt.lproj 目录加载例如立陶宛语:

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

(由于历史原因,我已经做了一个稍微复杂的版本,以删除应用程序的某些版本中已弃用的翻译。否则即使我不再将它与应用程序捆绑在一起,旧的安装也会选择 lproj 目录。 )

优点:使用正确命名的 lproj 目录。与本地化工具很好地集成。简单的设置。只需main.m 中的一行即可实现。

缺点:尽管很多人都在使用AppleLanguages 键,但这个解决方案使用它来加载其他不受支持的语言,所以我担心我可能会如履薄冰。 p>

乐问题

  • 其他应用程序通常如何支持这些“不受支持”的语言?
  • 有没有办法支持它们以及通常支持的语言?
  • 您如何看待 AppleLanguages 黑客攻击?

【问题讨论】:

    标签: iphone ios localization internationalization


    【解决方案1】:

    为什么不在您的应用程序中添加语言设置然后使用此代码(我在一个项目中使用它,用户可以根据我的客户的要求在应用程序中切换语言)。

    它基本上覆盖了 NSLocalizedString 并使用相同的文件结构(en.lproj 等)来保持您在使用“apple-way”时使用的相同语言文件。

    试一试!

    .h 文件

    #import <Foundation/Foundation.h>
    
    //#undef NSLocalizedString
    
    #define ___(key) \
    [[I7I18N sharedInstance] localizedStringForKey:(key)]
    
    #undef NSLocalizedString
    #define NSLocalizedString(key,value) \
    [[I7I18N sharedInstance] localizedStringForKey:(key)]
    
    @interface I7I18N : NSObject
    
    @property (nonatomic, retain) NSMutableDictionary *i18nTable;
    + (I7I18N *)sharedInstance;
    - (NSString *)localizedStringForKey:(NSString *)key;
    - (void)setLocale:(NSString *)lProjFile;
    
    @end
    

    .m 文件

    #import "I7I18N.h"
    
    static I7I18N *sharedInstance;
    
    @implementation I7I18N
    @synthesize i18nTable=_i18nTable;
    
    + (I7I18N *)sharedInstance {
        if(!sharedInstance) {
            sharedInstance = [[I7I18N alloc] init];
        }
    
        return sharedInstance;
    }
    
    - (id)init
    {
        self = [super init];
        if (self) {
            self.i18nTable = [NSMutableDictionary dictionary];
    
            NSArray *validLocalizations = [[NSBundle mainBundle] localizations];
            [self setLocale:[validLocalizations objectAtIndex:0]];
        }
        return self;
    }
    
    - (void)setLocale:(NSString *)lProjFile {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"Localizable.strings" ofType:@"" inDirectory:[NSString stringWithFormat:@"%@.lproj",lProjFile]];
        self.i18nTable = [NSDictionary dictionaryWithContentsOfFile:path];
    }
    
    - (NSString *)localizedStringForKey:(NSString *)key {
        NSString *possibleI18NString = [self.i18nTable objectForKey:key];
        if(!possibleI18NString) {
            return key;
        }
        return possibleI18NString;
    
    }
    
    @end
    

    更新 1: 使用[[I7I18N sharedInstance] setLocale:@"yourlang.lproj"] 切换语言时不要忘记构建所有视图(所有NSLocalizedString 依赖项。

    【讨论】:

    • 这似乎是解决不受支持的语言的好方法。谢谢!给我打勾! :-)
    • 这对我不起作用,您能告诉我如何调用此方法来设置可以使用的语言
    • 看起来很有用。如果有人能把它翻译成 Swift,我会很高兴...... :)
    猜你喜欢
    • 1970-01-01
    • 2019-05-29
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多