obj-c app未以编程方式进行本地化

时间:2017-12-08 11:59:27

标签: ios objective-c

我尝试通过NSBundle - NSBundle setLanguage: (NSString *) language的扩展程序以编程方式更改语言。我有几个应用程序本地化。

某些本地化版本可以正常工作,但在安装西班牙语和意大利语时,我会看到localizable.strings参数的名称,而不是本地化的字符串。其他一些语言也是如此,但并不是所有的语言。

请告诉我可能是什么问题

UPD:

这里有一些英文行:

"CLOSE_TITLE"         = "Close";
"PAYMENT_TITLE"       = "Pay";
"PAYMENT_TITLE_IN"    = "Deposit";

他们也是西班牙语:

"CLOSE_TITLE" = "Cerrar";
"PAYMENT_TITLE" = "Retirar";
"PAYMENT_TITLE_IN" = "Depositar";

有扩展代码:

#import "NSBundle+Language.h"
#import <objc/runtime.h>

static const char _bundle=0;

@interface BundleEx : NSBundle
@end

@implementation BundleEx
-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle);
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}
@end

@implementation NSBundle (Language)


+(void)setLanguage:(NSString*)language
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
                  {
                      object_setClass([NSBundle mainBundle],[BundleEx class]);
                  });
    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}


@end

2 个答案:

答案 0 :(得分:0)

如何将新的本地化文件拖到项目中?我发现当你向xCode添加新语言时,最好先从xCode中完全删除整个文件夹,然后同时将所有内容(包括新语言)全部拖回:)

答案 1 :(得分:0)

事实证明,代码具有不可打印的空格字符&nbsp;,因此不会翻译此字符后的部分参数。 XСode不显示此字符。如果您翻译Web服务,就会发生这种情况。当我在所有本地化中删除此符号时,一切正常。