将iOS应用程序翻译成不支持/非标准语言

13

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

我的 iPhone 和模拟器都不支持这些语言,而且我很确定也不存在专门的固件供这些地区使用。

如何最好地制作一个支持它们的应用程序呢?

我提出了两个方案,但都不是很理想。因为用户无法从“设置”应用程序列表中选择捆绑的语言,所以两者都不允许我在应用程序中拥有多种语言。这意味着必须为每种语言提交一个版本。

选项 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密钥被许多人使用,但此解决方案将其用于加载其他不受支持的语言,因此我担心可能存在困难。

问题

  • 其他应用程序通常如何支持这些“不受支持”的语言?
  • 有没有办法支持它们和通常支持的语言一起?
  • 你对AppleLanguages hack怎么看?
1个回答

9
为什么不在您的应用中添加语言设置,然后使用此代码(我在一个项目中使用它,在该项目中用户可以根据客户要求在应用程序内切换语言)。
它基本上覆盖了 NSLocalizedString,并使用相同的文件结构(en.lproj 等)来保留您在使用“苹果方式”时使用的相同语言文件。
试试吧!
.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 file

#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"]


这似乎是解决不支持的语言的好方法。谢谢!打个勾给你! :-) - Heiberg
这对我不起作用,你能告诉我如何调用此方法以设置可行的语言吗? - ashokdy
看起来是一个有用的技巧。但我希望有人能够把它翻译成Swift... :) - Roland Tepp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接