Как установить локализацию по умолчанию для приложения iOS

Я разрабатываю приложение для русскоязычных людей. Во многих странах рядом с Россией есть второй язык - русский. Мое приложение имеет две локализации: русскую и английскую. И мне нужно установить русскую локализацию как по умолчанию. Английский должен быть только для людей, которые используют английский как язык устройства.

Я знаю, что Apple рекомендует использовать локализацию в приоритетах предпочтительных языков в настройках, но у меня есть важная причина не следовать этой рекомендации.

Как я могу установить русскую локализацию как по умолчанию?

Ответы

Ответ 1

Я не нашел правильного решения. Только один способ, подходящий для моей проблемы, - использовать NSLocalizedStringFromTableInBundle вместо NSLocalizedString. Этот способ не позволяет локализовать изображения или наконечники, но со строками он отлично работает.

Сначала вам нужно определить текущий язык устройства:

NSString *lang = (NSString *)[[NSLocale preferredLanguages] objectAtIndex:0];

Далее найдите связку для этого языка:

NSBundle *myLangBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"]];

Если пакет найден, то используйте его в NSLocalizedStringFromTableInBundle:

_label.text = NSLocalizedStringFromTableInBundle(@"LabelText",nil,myLangBundle,nil);

В противном случае найдите и используйте пакет по умолчанию.

Ответ 2

Я думаю, вам нужно использовать ключ Localization native development region в файле info.plist.

enter image description here

Ответ 3

Вероятно, вам нужно установить значение русское как значение CFBundleDevelopmentRegion в Info.plist.

CFBundleDevelopmentRegion (String - iOS, OS X) определяет родную область для пакета. Этот ключ содержит строковое значение, которое обычно соответствует родному языку человека, написавшего пакет. Язык, указанный этим значением, используется в качестве языка по умолчанию, если ресурс не может быть расположен для предпочтительного региона или языка пользователей.

Update

Если вам действительно нужно и нужно переопределить приоритет языка ОС, вы можете использовать ключ AppleLanguages пользователя по умолчанию (хотя, как вы знаете, это не рекомендуется):

[[NSUserDefaults standardUserDefaults] setObject:@[@"ru", @"en"] forKey:@"AppleLanguages"];

Ответ 4

В моем случае в моем приложении только русская локализация с жестко запрограммированными строками, но я использую библиотеки с пакетами локализации. Строки из библиотек были на английском языке по умолчанию. Потому что NSBundle.mainBundle.preferredLanguages были [ "en" ].

Они стали русскими после того, как я указал язык локализации приложения в Info.plist с помощью клавиши CFBundleLocalizations:

screenshot

CFBundleLocalizations (Массив - iOS, OS X) определяет локализации обрабатывается вручную вашим приложением. Если ваш исполняемый файл отделен или делает не использовать существующий механизм локализации пакета, вы можете включить этот ключ для указания локализаций вашего приложения.

Каждая запись в этом массиве Propertys является строкой, идентифицирующей название языка или ISO языковой указатель поддерживаемых локализация. См. "Языковые и региональные обозначения" в Руководство по интернационализации и локализации в интернационализации Документация для информации о том, как указать языковые обозначения.

Ответ 5

Как eofster сказал, вы должны установить клавишу AppleLanguages в NSUserDefaults на массив языков с желаемым порядком, но чтобы работать на первом ланче, вы должны сделать это очень рано, даже раньше, чем applicationWillLunchWithOptions:

Что касается меня, это решение прекрасно работает и имеет преимущество при использовании NSLocalizedStringFromTableInBundle, потому что оно также работает с раскадровками и перьями.

Вот пошаговое решение на языке Swift.

  1. Сделайте подкласс UIApplication, как описано здесь: Подкласс UIApplication с Swift

  2. Второй метод переопределения init вашего подкласса UIApplication для самостоятельной замены списка предпочитаемых языков.

    override init() {
        if let languages = NSUserDefaults.standardUserDefaults().objectForKey("AppleLanguages") as? [String],
            let language = languages.first where !language.hasPrefix("en")
        {
            NSUserDefaults.standardUserDefaults().setObject(["ru", "en"], forKey: "AppleLanguages")
        }
    
        super.init()
    }
    

    Swift 4:

    override init() {
    if let languages = UserDefaults.standard.object(forKey: "AppleLanguages") as? [String],
        let language = languages.first(where:{!$0.hasPrefix("en")})
    {
        UserDefaults.standard.set(["ru", "en"], forKey: "AppleLanguages")
    }
    
    super.init()
    

    }

  3. Это все. Если первым предпочтительным языком является не английский, вы замените список русским языком в качестве первого.

Постскриптум Если вы занимаетесь не только локализацией, но и интернационализацией, не забудьте проверить локаль, которая используется сборщиками даты, форматерами даты, формататорами чисел и т.д.