NSLocalizedString不默认为Base语言

时间:2014-02-13 12:56:40

标签: ios objective-c base nslocalizedstring

我在iOS 7项目中遇到以下问题,我正在测试本地化功能。

  • 我有一个默认项目,有一个VC,我在场景中间有一个按钮
  • 在我的VC中,我有一个名为myButton的按钮的IBOutlet
  • VC的viewDidLoad方法中的
  • 我正在设置按钮的标题:


    NSString *title = NSLocalizedString(@"MY_BUTTON", @"My comment for my button");
    [self.myButton setTitle:title forState:UIControlStateNormal];

  • 我生成了Localizable.strings文件,最终启用了以下语言的本地化:Base,Dutch
  • 每个文件的内容如下:

/ *我的按钮评论* / “MY_BUTTON”=“我的[VALUE]按钮”;其中VALUE = Base,Dutch;所以标签应该是我的基本按钮&我的荷兰按钮

问题: 如果我使用模拟器的语言作为荷兰语启动我的应用程序,标签是(按预期)“我的荷兰按钮”。如果我用英文启动它,标签是“我的基本按钮”(有点好......)

但是,如果我将手机的语言设置为法语启动它,而我之前将其设置为荷兰语,则按钮的标签不会默认为Base,而是再次显示“My Dutch Button”

对此有何想法?

由于

4 个答案:

答案 0 :(得分:4)

默认语言的顺序是OSX上的用户设置,而不是iOS上的可编辑(AFAIK) 但仍坚持!

应用程序传递AppleLanguages(或左右)数组,指定要尝试的语言。 NSLocalizedString宏将尝试按照它们出现的顺序加载数组中的每种语言。直到它找到一个工作的语言然后它使用它

比较:How to force NSLocalizedString to use a specific language

答案 1 :(得分:3)

我创建了以下类,它支持回退到可自定义的语言。在我的情况下,我使用 Base.lproj 作为我的默认语言内容的文件。

<强> StringUtilities.h

@interface StringUtils : NSObject

#define GetLocalizedString(key) [StringUtils getLocalizedString:key comment:nil]
//#define GetLocalizedString(key,comment) [StringUtils getLocalizedString:key comment:comment]


+ (NSString*) getLocalizedString:(NSString*)key comment:(NSString*)comment;

@end

<强> StringUtilities.m

#import "StringUtilities.h"

@implementation StringUtils


//Returns a localized string, with fallback to version of Base
+ (NSString*) getLocalizedString:(NSString*)key comment:(NSString*)comment {
    NSString* localizedString = NSLocalizedString(key, nil);

    //use base language if current language setting on device does not find a proper value
    if([localizedString isEqualToString:key]) {

        NSString * path = [[NSBundle mainBundle] pathForResource:@"Base" ofType:@"lproj"];
        NSBundle * bundle = nil;
        if(path == nil){
            bundle = [NSBundle mainBundle];
        }else{
            bundle = [NSBundle bundleWithPath:path];
        }
        localizedString = [bundle localizedStringForKey:key value:comment table:nil];
    }
    return localizedString;
}

@end

如何使用

导入头文件并使用GetLocalizedString宏而不是NSLocalizedString宏。

#import "StringUtilities.h"

NSString* str = GetLocalizedString(@"your.text.key");

答案 2 :(得分:0)

我在Swift中有一个equivalent

X_train = (27367, 64, 64, 1)
X_test = (4553, 64, 64, 1)
y_train = (164202, 11)
y_test = (27318, 11)

答案 3 :(得分:0)

在这里使用Dirk的答案是在字符串扩展中实现为计算属性的Swift等效项:

extension String {

var localized: String {

    var localizedString = NSLocalizedString(self, comment: "")

    // If a localized string was found then return it.
    // This check is based on the fact that if no localized string
    // exists then NSLocalized() returns the key itself.
    if self != localizedString {
        return localizedString
    }

    // No localized string exists.  Retrieve the display string
    // from the base strings file.
    var bundleForString: Bundle
    if let path = Bundle.main.path(forResource: "Base", ofType: "lproj"),
        let bundle = Bundle(path: path) {
        bundleForString = bundle
    } else {
        bundleForString = Bundle.main
    }

    localizedString = bundleForString.localizedString(forKey: self, value: self, table: nil)

    return localizedString
}

}