将iOS应用翻译为不支持的/非标准的语言

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

在我的iPhone和模拟器中,不支持这些语言,我很确定没有特殊的固件可以在这些领域使用。

我怎样才能最好地使一个支持他们的应用程序?

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

选项1:滥用en.lproj目录

对于每种目标语言(lt,lv,et),我将该语言的string文件放到一个en.lproj目录中。

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

缺点:破坏我的本地化工具。 它混淆未来的维护人员,因此容易出错。 需要一个奇怪的构build设置。

选项2:滥用NSUserDefaults [AppleLanguages]

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

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

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

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

缺点:即使AppleLanguages键被许多人使用,该解决scheme使用它来加载不支持的语言,所以我担心我可能会在冰天雪地上滑冰。

乐问题

  • 其他应用程序通常如何支持这些“不支持”的语言?
  • 有没有办法与通常支持的语言一起支持它们?
  • 你如何看待AppleLanguages黑客?

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

它基本上覆盖了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"]切换语言时,build立所有视图(所有NSLocalizedString依赖[[I7I18N sharedInstance] setLocale:@"yourlang.lproj"]