2014-02-13 27 views
8

我在測試本地化功能的小型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

回答

3

默認語言的順序是OSX和iOS
用戶設置不可編輯的(據我所知),但仍堅持!

該應用程序傳遞指定要嘗試的語言的數組AppleLanguages(或如此..)。該NSLocalizedString宏將嘗試,直到找到一個正在運行的加載順序排列它們出現每種語言,然後使用該

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

+0

從iOS 8開始,用戶首選語言列表是可編輯的。 – ThomasW

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"); 
0

我在斯威夫特的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: "") 
}