NSLocalizedString没有默认为基本语言

问题描述:

我在测试本地化功能的小型iOS 7项目中遇到以下问题。NSLocalizedString没有默认为基本语言

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


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

  • 我产生Localizable.strings文件结束启用了本地化以下语言:基本,荷兰
  • 每个文件的内容如下:
我的按钮*/ “MY_BUTTON”= “我的[VALUE]按钮”

/*我的意见; VALUE = Base,荷兰语;所以标签应该是我的基本按钮&我的荷兰按钮

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

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

对此有何看法?

感谢

+1

是否设置为Localizable.strings文件的法国人也? –

+0

在Mac上,可以设置语言顺序,也许顺序在iOS上也起作用,并且由于语言顺序的设置,它是法语,荷兰语,英语吗? – Volker

+0

法语的没有Localizable.strings。我只想支持英语和瑞典语,对于除这两种语言以外的语言的设备,我希望应用程序以Base(英语)显示 – tufyx

默认语言的顺序是OSX和iOS
用户设置不可编辑的(据我所知),但仍坚持!

该应用程序传递指定要尝试的语言的数组AppleLanguages(或如此..)。该NSLocalizedString宏将尝试,直到找到一个正在运行的加载顺序排列它们出现每种语言,然后使用该

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

+0

从iOS 8开始,用户首选语言列表是可编辑的。 – ThomasW

我已经创建了下面的类,它支持回退到一种可定制的语言。在我的情况下,我使用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"); 

我在斯威夫特的equivalent

public func LS(_ key: String) -> String { 
    let value = NSLocalizedString(key, comment: "") 
    if value != key || NSLocale.preferredLanguages.first == "en" { 
     return value 
    } 

    // Fall back to en 
    guard 
     let path = Bundle.main.path(forResource: "en", ofType: "lproj"), 
     let bundle = Bundle(path: path) 
     else { return value } 
    return NSLocalizedString(key, bundle: bundle, comment: "") 
}