obj-c 应用程序未以编程方式本地化

Posted

技术标签:

【中文标题】obj-c 应用程序未以编程方式本地化【英文标题】:obj-c app is not localized programmatically 【发布时间】:2017-12-08 11:59:27 【问题描述】:

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

一些本地化工作正常,但在安装西班牙语和意大利语时,我看到的不是本地化字符串,而是localizable.strings 参数的名称。其他一些语言也会发生同样的情况,但并非所有行都如此。

请告诉我可能是什么问题

更新:

这里有几行英文:

"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

【问题讨论】:

你能显示一些英文和其他语言的字符串吗?所以我们可以检查那个代码 不清楚,我想你应该分享一些代码。 【参考方案1】:

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

【讨论】:

我一个一个添加文件...好的,我试试【参考方案2】:

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

【讨论】:

以上是关于obj-c 应用程序未以编程方式本地化的主要内容,如果未能解决你的问题,请参考以下文章

未以编程方式检测 Dismiss Popover

标题部分未以编程方式显示在集合视图中

附件未以编程方式发送到邮件中

Android:导航抽屉标题文本视图未以编程方式设置

UIView 未以编程方式显示在 UIScrollView 中

X 位置约束未以编程方式更新 - Xcode 中的 Swift