Ответ 1
В нижней строке вы можете изменить язык внутри приложения. Но, необходима дополнительная работа. Я перечисляю фон об ограничениях для каждой версии iOS и затем предоставляю решение. потому что, объясняя решение, вам нужно понять причину этого.
Обновление (iOS 9 +)
Ключ решения: semanticContentAttribute
Некоторые говорят, что этот способ не является официальным и может вызвать проблемы с эффективностью.
Направление пользовательского интерфейса можно принудительно отключить, не закрывая приложение:
UIView.appearance().semanticContentAttribute = .forceRightToLeft
Примечание. В IOS 9 нельзя отключить RTL (Navigation и TabBar). Пока он заставляют работать с iOS 10.
Единственная оставшаяся вещь, которая не может быть принудительно RTL в iOS 10, - это кнопка возврата по умолчанию.
Изменение языка наряду с форсированием макета не автоматически заставляет систему использовать локализованный строковый файл связанных с языком.
Ниже iOS 9
Короткий ответ:
Изменение языка приложения не приведет к форматированию макета в соответствии с выбранным языком без перезагрузки приложения.
Линия Apple:
Apple не предоставляет этого, потому что они не предпочитают разрешать пользователю для изменения языка из приложения. Apple подталкивает разработчиков к используйте язык устройства. и не изменять его изнутри приложения.
Workarwound:
Некоторые приложения, поддерживающие арабский язык, отмечают пользователя в страница настроек, где пользователь может изменить язык, чтобы макет не вступил в силу без перезапуска приложения. магазин ссылка для примера приложения
Пример кода для изменения языка приложения для арабского:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"ar", @"en", nil] forKey:@"AppleLanguages"];
Это не вступит в силу без перезагрузки
Как изменить язык приложения без перезапуска приложения
Решение состоит в том, чтобы предоставить ваше собственное решение для локализации:
- Использовать базовую интернационализацию, но не локализовать раскадровки.
- Создайте один файл строк и локализуйте его на всех языках и базе (английский).
- Поместите функцию языка изменений в
ViewController
, которая запускается перед любым другимViewController
еще до вашего основного. ИЛИ используйтеunwindSegue
, чтобы вернуться к контроллеру корневого представления после изменения языка. - Установите строки для ваших представлений в методе
viewDidLoad
для всех контроллеров представлений.
Не удовлетворяйте точкам 5 и 6, если вы не поддерживаете ниже iOS 9
-
Задайте ограничения для ваших представлений в методе
viewDidLoad
для всех контроллеров представления. -
Когда вы устанавливаете ограничения, используйте вправо/влево в соответствии с выбранным языком вместо ведущий/конечный.
Пример класса языка (Swift): Инициализируйте объект этого класса в своем классе singlton.
class LanguageDetails: NSObject {
var language: String!
var bundle: Bundle!
let LANGUAGE_KEY: String = "LANGUAGE_KEY"
override init() {
super.init()
// user preferred languages. this is the default app language(device language - first launch app language)!
language = Bundle.main.preferredLocalizations[0]
// the language stored in UserDefaults have the priority over the device language.
language = Common.valueForKey(key: LANGUAGE_KEY, default_value: language as AnyObject) as! String
// init the bundle object that contains the localization files based on language
bundle = Bundle(path: Bundle.main.path(forResource: language == "ar" ? language : "Base", ofType: "lproj")!)
// bars direction
if isArabic() {
UIView.appearance().semanticContentAttribute = .forceRightToLeft
} else {
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
}
// check if current language is arabic
func isArabic () -> Bool {
return language == "ar"
}
// returns app language direction.
func rtl () -> Bool {
return Locale.characterDirection(forLanguage: language) == Locale.LanguageDirection.rightToLeft
}
// switches language. if its ar change it to en and vise-versa
func changeLanguage()
{
var changeTo: String
// check current language to switch to the other.
if language == "ar" {
changeTo = "en"
} else {
changeTo = "ar"
}
// change language
changeLanguageTo(lang: changeTo)
Log.info("Language changed to: \(language)")
}
// change language to a specfic one.
func changeLanguageTo(lang: String) {
language = lang
// set language to user defaults
Common.setValue(value: language as AnyObject, key: LANGUAGE_KEY)
// set prefered languages for the app.
UserDefaults.standard.set([lang], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()
// re-set the bundle object based on the new langauge
bundle = Bundle(path: Bundle.main.path(forResource: language == "ar" ? language : "Base", ofType: "lproj")!)
// app direction
if isArabic() {
UIView.appearance().semanticContentAttribute = .forceRightToLeft
} else {
UIView.appearance().semanticContentAttribute = .forceLeftToRight
}
Log.info("Language changed to: \(language)")
}
// get local string
func getLocale() -> NSLocale {
if rtl() {
return NSLocale(localeIdentifier: "ar_JO")
} else {
return NSLocale(localeIdentifier: "en_US")
}
}
// get localized string based on app langauge.
func LocalString(key: String) -> String {
let localizedString: String? = NSLocalizedString(key, bundle: bundle, value: key, comment: "")
// Log.ver("Localized string '\(localizedString ?? "not found")' for key '\(key)'")
return localizedString ?? key
}
// get localized string for specific language
func LocalString(key: String, lan: String) -> String {
let bundl:Bundle! = Bundle(path: Bundle.main.path(forResource: lan == "ar" ? lan : "Base", ofType: "lproj")!)
return NSLocalizedString(key, bundle: bundl, value: key, comment: "")
}
}
Пример класса языка (Objective-c): Образец Swift предоставляет полное решение. жаль, что вам нужно его самостоятельно преобразовать.
@implementation LanguageDetails
@synthesize language;
@synthesize bundle;
#define LANGUAGE_KEY @"LANGUAGE_KEY"
// language var is also the strings file name ar or en
- (id)init
{
if (self = [super init]) {
language = [[[NSBundle mainBundle] preferredLocalizations] objectAtIndex:0];
if (![language isEqualToString:@"ar"])
language = @"en";
language = [Common valueForKey:LANGUAGE_KEY defaultValue:language];
bundle = [NSBundle mainBundle];
}
return self;
}
- (BOOL)rtl {
return [NSLocale characterDirectionForLanguage:language] == NSLocaleLanguageDirectionRightToLeft;
}
- (void)changeLanguage
{
if ([language isEqualToString:@"ar"])
language = @"en";
else
language = @"ar";
[Common setValue:language forKey:LANGUAGE_KEY];
}
- (void)changeLanguageTo:(NSString *)lang
{
language = lang;
[Common setValue:language forKey:LANGUAGE_KEY];
}
- (NSString *) LocalString:(NSString *)key {
return NSLocalizedStringFromTableInBundle(key, language, bundle, nil);
}
@end