На iPhone NSLocalizedString
возвращает строку на языке iPhone. Можно ли принудительно NSLocalizedString
использовать определенный язык, чтобы приложение было на другом языке, чем устройство?
263
На iPhone NSLocalizedString
возвращает строку на языке iPhone. Можно ли принудительно NSLocalizedString
использовать определенный язык, чтобы приложение было на другом языке, чем устройство?
Ответы:
NSLocalizedString()
(и их варианты) получить доступ к клавише «AppleLanguages»,NSUserDefaults
чтобы определить настройки пользователя для предпочитаемых языков. Это возвращает массив языковых кодов, первый из которых задается пользователем для его телефона, а последующие используются в качестве запасных, если ресурс недоступен на предпочтительном языке. (на рабочем столе пользователь может указать несколько языков с пользовательским порядком в Системных настройках)Вы можете переопределить глобальные настройки для своего собственного приложения, если хотите, используя setObject: forKey: метод, чтобы установить свой собственный список языков. Это будет иметь приоритет над глобально установленным значением и будет возвращено любому коду в вашем приложении, которое выполняет локализацию. Код для этого будет выглядеть примерно так:
Это сделало бы немецкий язык предпочтительным языком для вашего приложения с английским и французским в качестве запасных. Вы можете захотеть вызвать это как можно раньше при запуске вашего приложения. Вы можете узнать больше о предпочтениях языка / локали здесь: Интернационализация Темы программирования: Получение текущего языка и локали
источник
Недавно у меня возникла та же проблема, и я не хотел запускать и исправлять всю NSLocalizedString, а также заставлять приложение перезагружаться, чтобы новый язык работал. Я хотел, чтобы все работало как есть.
Мое решение состояло в том, чтобы динамически изменить класс основного пакета и загрузить туда соответствующий пакет:
Заголовочный файл
Реализация
В общем, когда ваше приложение запускается и перед загрузкой вашего первого контроллера, просто позвоните:
Когда ваш пользователь меняет предпочитаемый язык на экране настроек, просто позвоните еще раз:
Чтобы вернуться к системным настройкам по умолчанию, просто введите nil:
Наслаждаться...
Для тех, кому нужна версия Swift:
источник
Обычно я делаю это таким образом, но вы ДОЛЖНЫ иметь все файлы локализации в вашем проекте.
источник
Не используйте на iOS 9. Это возвращает ноль для всех строк, переданных через это.
Я нашел другое решение, которое позволяет обновлять языковые строки без перезагрузки приложения и совместимо с genstrings:
Поместите этот макрос в файл Prefix.pch:
и где бы вам ни понадобилось использовать локализованную строку:
Для установки языка используйте:
Работает даже при последовательном переключении языков:
источник
Как сказано ранее, просто сделайте:
Но чтобы избежать перезапуска приложения, поместите строку в метод main
main.m
, непосредственно передUIApplicationMain
(...).источник
NSAutoreleasePool * pool ..
как произойдет утечка нескольких автоматически выпущенных объектов.[[NSBundle mainBundle] URLForResource:withExtension:]
раньше.Хитрость в использовании определенного языка, выбрав его в приложении, состоит в том, чтобы заставить
NSLocalizedString
использовать определенный пакет в зависимости от выбранного языка,вот пост, который я написал для этой локализации продвижения обучения в приложениях ios
и вот код примера локализации приложения в ios-приложениях
источник
Что вы думаете об этом решении для Swift 3?
Простое использование:
источник
Как упоминает Брайан Вебстер, язык должен быть установлен «как можно раньше при запуске вашего приложения». Я думал
applicationDidFinishLaunching:
оAppDelegate
это подходящее место для этого, так как именно там я делаю все остальные инициализации.Но, как отмечает Уильям Деннисс, это, похоже, дает эффект только после перезапуска приложения, что бесполезно.
Кажется, это работает нормально, если я помещу код в основную функцию, хотя:
Буду признателен за любые комментарии по этому вопросу.
источник
[[NSUserDefaults standardUserDefaults] synchronize];
после звонкаsetObject:forKey:
Мне больше всего нравится метод Мауро Делрио. Я также добавил следующее в мой Project_Prefix.pch
Поэтому, если вы когда-нибудь захотите использовать стандартный метод (который использует NSLocalizedString), вы можете быстро заменить синтаксис во всех файлах.
источник
NSLocalizedString()
читает значение для ключаAppleLanguages
из стандартного пользовательского значения по умолчанию ([NSUserDefaults standardUserDefaults]
). Это значение используется для выбора подходящей локализации среди всех существующих локализаций во время выполнения. Когда Apple создает пользовательский словарь по умолчанию при запуске приложения, они ищут ключ предпочтительного языка (ов) в системных настройках и копируют значение оттуда. Это также объясняет, например, почему изменение языковых настроек в OS X не влияет на запущенные приложения, только на приложения, запущенные впоследствии. После копирования значение не обновляется только из-за изменения настроек. Вот почему iOS перезапускает все приложения, если вы меняете язык.Однако все значения пользовательского словаря по умолчанию могут быть перезаписаны аргументами командной строки. Смотрите
NSUserDefaults
документацию наNSArgumentDomain
. Это включает в себя даже те значения, которые загружаются из файла настроек приложения (.plist). Это действительно полезно знать, если вы хотите изменить значение только один раз для тестирования .Поэтому, если вы хотите изменить язык только для тестирования, вы, вероятно, не хотите изменять свой код (если позже вы забудете удалить этот код ...), вместо этого попросите Xcode запустить ваше приложение с параметрами командной строки ( например, используйте испанскую локализацию):
Не нужно трогать ваш код на всех. Просто создайте разные схемы для разных языков, и вы можете быстро запустить приложение один раз на одном языке и один раз на другом, просто переключив схему.
источник
Options
как в более новых версиях Xcode, которые Apple предлагает также.Я придумал решение, которое позволяет вам использовать
NSLocalizedString
. Я создаю категориюNSBundle
вызоваNSBundle+RunTimeLanguage
. Интерфейс такой.Реализация такая.
Чем просто добавить импорт
NSBundle+RunTimeLanguage.h
в файлы, которые используютNSLocalizedString
.Как вы можете видеть, я храню свой languageCode в свойстве
AppDelegate
. Это может быть сохранено где угодно.Единственное, что мне не нравится в этом, - это предупреждение о том, что
NSLocalizedString
Марко переопределен. Возможно, кто-то может помочь мне исправить эту часть.источник
#undef NSLocalizedString
незадолго до#define
отключения предупреждениеSwift версия:
источник
В двух словах :
Локализуйте свое приложение
Это первое, что вам нужно сделать, это локализовать ваше приложение, по крайней мере, на двух языках (английском и французском в этом примере).
Переопределить NSLocalizedString
В вашем коде вместо использования
NSLocalizedString(key, comment)
используйте макрос,MYLocalizedString(key, comment)
определенный следующим образом:#define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];
Этот
MYLocalizationSystem
синглтон будет:Установить язык пользователя
Когда пользователь изменил язык приложения на французский, звоните
[[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];
В этом примере этот метод устанавливает для локализованного пакета значение fr.lproj.
Вернуть локализованную строку
Установив локализованный пакет, вы сможете получить правильную локализованную строку от него с помощью этого метода:
Надеюсь, что это поможет вам.
Вы найдете более подробную информацию в этой статье от NSWinery.io
источник
Свифт 3 расширения:
Использование:
источник
В файле .pch определить:
источник
Возможно, вам следует дополнить это (в файле .pch после #import):
источник
Решение Swift 3:
Дали несколько примеров языковых кодов, которые можно использовать. Надеюсь это поможет
источник
Вы можете создать вложенный комплект с набором локализованных строк, с которыми вы хотите сделать это, и затем использовать их
NSLocalizedStringFromTableInBundle()
для загрузки. (Я предполагаю, что это контент, отдельный от обычной локализации пользовательского интерфейса, которую вы можете делать в приложении.)источник
для моего случая у меня есть два локализованных файла, ja и en
и я хотел бы заставить его en, если предпочтительный язык в системе ни en или ja
я собираюсь редактировать файл main.m
я проверю, является ли первый предпочтительный en или ja, если нет, то я изменю второй предпочтительный язык на en.
источник
Вы можете сделать что-то вроде этого:
источник
На основании ответа Tudorizer сменить язык, не выходя и не перезапуская приложение.
Вместо макроса используйте класс для доступа к предпочтительному языку, чтобы проверить наличие кода определенного языка.
Ниже приведен класс, используемый для получения текущего языкового пакета, который работает для iOS 9:
Используйте приведенный выше класс для ссылки на строковый файл / image / video / etc:
Измените язык в строке, как показано ниже, или обновите метод «changeCurrentLanguage» в вышеприведенном классе, чтобы получить строковый параметр, ссылающийся на новый язык.
источник
В Swift 4 я решил это без необходимости перезапуска или использования библиотек.
Перепробовав много вариантов, я нашел эту функцию, где вы передаете stringToLocalize (Localizable.String, файл строк), который вы хотите перевести, и язык, на который вы хотите перевести его, и что он возвращает, это значение для та строка, которая у вас есть в файле строк:
Учитывая эту функцию, я создал эту функцию в файле Swift:
Для доступа ко всему приложению и в каждой строке остальных ViewControllers вместо:
Я заменил его
Я не знаю, является ли это лучшим способом, но я нашел это очень простым, и это работает для меня, я надеюсь, что это поможет вам!
источник
Эта функция попытается получить локализованную строку для текущего языка и, если она не найдена, она получит ее с использованием английского языка.
источник
Я хотел добавить поддержку языка, который официально не поддерживается iOS (не указан в разделе «Язык» в настройках системы). Следуя Руководству Apple по интернационализации и нескольким советам Брайана Вебстера и Джона, я разработал этот фрагмент кода (поместите его в main.m):
Это хорошо работает как для Storyboard, так и для кода NSLocalizedString. Код предполагает, что пользователь будет иметь возможность вручную изменить язык внутри приложения позже.
Конечно, не забудьте добавить правильные переводы Storyboard и Localizable.strings (см. Ссылку на страницу Apple выше, чтобы узнать, как это сделать).
источник
Вот достойное решение этой проблемы, и оно не требует перезапуска приложения.
https://github.com/cmaftuleac/BundleLocalization
Эта реализация работает путем настройки внутри NSBundle. Идея состоит в том, что вы переопределяете метод localizedStringForKey в экземпляре объекта NSBundle, а затем вызываете этот метод в другом пакете с другим языком. Простой и элегантный, полностью совместимый со всеми типами ресурсов.
источник
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
Что бы вы ни делали, лучший способ - взять короткое имя для указанного языка, то есть: fr, en, nl, de, it и т. д ... и присвоить его глобальному значению.
сделайте вид выбора, чтобы он выскочил, как выпадающее меню (комбинация кнопки, при нажатии которой вид сборщика появляется снизу со списком языков) и выберите нужный язык. пусть короткое имя хранится внутри. сделать файл .h + .m с именем LocalisedString.
Установите глобальное значение short_name равным полученному значению в LocalisedString.m Когда выбран необходимый язык, назначьте NSBundlePath для создания подкаталогов проекта для нужного языка. например, nl.proj, en.proj.
Когда выбрана конкретная папка proj, вызовите локализованную строку для соответствующего языка и измените язык динамически.
никаких правил не нарушено.
источник
Для Swift вы можете переопределить
main.swift
файл и установить там строку UserDefaults перед запуском приложения. Таким образом, вам не нужно перезапускать приложение, чтобы увидеть желаемый эффект.в паре с удалением
@UIApplicationMain
в вашемAppDelegate.swift
файле.источник