2014-02-13 5 views
8

У меня есть следующая проблема с небольшим проектом iOS 7, на котором я тестирую возможности локализации.NSLocalizedString не работает по умолчанию на базовом языке

  • У меня есть проект по умолчанию, с одним VC, в которой у меня есть одна кнопка в середине сцены
  • в моей ВК у меня есть IBOutlet моей кнопки под названием MyButton
  • в методе viewDidLoad ВК я настройка кнопок Заглавный:


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

  • Я создал файл в Localizable.strings конец активировал ее для локализации для следующих Языки: Base, голландский
  • содержимое каждого файла следующим образом:

/* Мой комментарий для моей кнопки */ "MY_BUTTON" = "My [VALUE] Кнопка"; где VALUE = Base, Dutch; поэтому метки должны быть My Base Button & My Dutch Button

Проблема: Если я запускаю свое приложение с использованием языка симулятора как нидерландский, метка (как и ожидалось) «Моя голландская кнопка». Если я запустил его на английском языке, ярлык «Моя базовая кнопка» (вроде нормально ...)

Однако, если я запустил его с языком телефона, установленным на французский язык, и ранее я установил его на голландский, ярлык кнопки не по умолчанию для Base, а вместо этого отображается снова «Моя голландская кнопка»

Любые мысли по этому вопросу?

Благодаря

+1

ли вы установили Localizable.strings файл на французский также? –

+0

на Mac можно установить порядок для языка, может быть, заказ играет роль также на iOS и французский, голландский, английский из-за порядка набора языков? – Volker

+0

No Localizable.strings для французского языка. Я хочу поддерживать только английский и шведский языки, а для устройств с другими языками, отличными от этих двух, я хочу, чтобы приложение отображалось в Base (на английском) – tufyx

ответ

3

порядка языков по умолчанию является параметр пользователя на OSX и не редактируемый (AFAIK) на прошивке
НО все еще придерживались!

Приложению передается массив 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

Я имею в Swift в 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: "") 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^