我正在扩展现有的iPhone应用程序(4.x及更高版本),支持更多语言:爱沙尼亚语,拉脱维亚语和立陶宛语。
在我的iPhone和模拟器中,不支持这些语言,我很确定他们没有特殊固件可供在这些地区使用。
如何才能最好地制作支持它们的应用?
我想出了两个我不太喜欢的解决方案。它们都不允许我在应用程序中使用多种语言,因为用户无法从Settings.app列表中选择捆绑的语言。这意味着必须为每种语言提交一个版本。
对于每种目标语言(lt,lv,et),我将该语言的字符串文件放入en.lproj目录。
优点:使用众所周知的机制。该应用程序只是认为它正在运行英语。
缺点:对我的本地化工具造成严重破坏。它对未来的维护者来说很容易混淆,因而容易出错。需要一个奇怪的构建设置。
NSUserDefaults中的AppleLanguages
对象包含应用程序要使用的语言列表。通过这样设置,我可以从lt.lproj目录中加载应用程序,例如立陶宛语:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"lt", nil] forKey:@"AppleLanguages"];
(由于历史原因,我已经做了一个稍微复杂一点的版本,以删除某些版本的应用程序中不推荐使用的翻译。否则,即使我不再将其与应用程序捆绑在一起,旧版安装也会选择lproj目录。 )
优点:使用正确命名的lproj目录。与本地化工具完美集成。设置简单。只需要main.m
中的一行来实现。
缺点:即使许多人正在使用AppleLanguages
密钥,此解决方案也会使用它来加载其他不受支持的语言,因此我担心我可能会在冰上滑冰。
AppleLanguages
黑客的看法如何?答案 0 :(得分:9)
为什么不在你的应用程序中添加语言设置然后使用这个代码(我在一个项目中使用它,用户可以根据我的客户的要求在应用程序内切换语言)。
它基本上覆盖了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:
在使用NSLocalizedString
切换语言时,请不要忘记构建所有视图(所有[[I7I18N sharedInstance] setLocale:@"yourlang.lproj"]
依赖项。