当我在设备语言上独立更改应用程序使用的语言时,只有关闭应用程序并重新启动它才能生效。如何不需要应用程序重新启动加载所有笔尖文件和.字符串文件再次取决于所选的语言?
我使用这个在运行时更改语言:
NSArray* languages = [NSArray arrayWithObjects:@"ar", @"en", nil];
[[NSUserDefaults standardUserDefaults] setObject:languages forKey:@"AppleLanguages"];
5条答案
按热度按时间eoigrqb61#
这对我很有效:Swift 4:
创建一个名为BundleExtension.swift的文件,并将以下代码添加到其中-
现在,每当你需要更改语言时,调用这个方法:
ekqde3dh2#
我对带有标签导航的Kiosk模式iPad应用程序有类似的要求。该应用程序不仅需要支持动态语言更改,而且必须这样做,因为该应用程序在加载新版本时每周才重新启动一次(平均),因为大多数选项卡已经从笔尖加载。
我尝试了几个建议来利用现有的Apple本地化机制,它们都有严重的缺点,包括XCode 4.2对本地化nibs的支持不稳定-我的IBoutlet连接变量似乎在IB中设置正确,但在运行时它们通常为null!?
我最终实现了一个模仿Apple NSLocalizedString类的类,但它可以处理运行时更改,并且每当用户进行语言更改时,我的类都会发布通知。需要本地化字符串(和图像)来更改的屏幕声明了一个handleLocaleChange方法,该方法在viewDidLoad时调用,并且每当LocaleChangedNotification被发布时调用。
我所有的按钮和图形都是独立于语言的,尽管标题文本和标签文本通常会随着区域设置的变化而更新。如果我必须改变图像,我想我可以在每个屏幕的handleLocaleChange方法中这样做。
这是密码。它包含了一些对nib/bundle路径的支持,而我在最终的项目中实际上并没有使用这些路径。
MyLanguage. h////MyLanguage. h// //
MyLanguage.m:/// MyLanguage.m
wwwo4jvm3#
不要依赖在笔尖文件中设置的字符串。使用您的笔尖只为布局和设置的意见。任何显示给用户的字符串(按钮文本等)都需要在Localizable.strings文件中,当你加载笔尖时,你需要相应地在相应的视图/控件上设置文本。
要获取当前语言的包,请执行以下操作:
并使用bundle获取本地化字符串:
此外,对于日期格式,您可能需要查看
要使用它,您需要为您希望使用的相应语言/国家/地区创建一个NSLocale。
wecizke34#
这就是我所做的。我猜诀窍是使用NSLocalizedStringFromTableInBundle而不是NSLocalizedString。
对于所有字符串,使用这个
要更改语言,请运行以下代码
在此之后,您可能需要调用任何更新代码来将字符串更新为新语言,例如。再运行一次
就这样。不需要重新启动应用程序。兼容系统设置以及(如果你通过iOS设置设置设置语言,它也会工作)。不需要外部图书馆。不需要越狱。它也适用于genstrings。
当然,您仍然应该执行通常的操作,以保持您的应用设置:
(and在你的viewDidLoad或其他东西中做一个检查)
pes8fvy95#
您应该创建自己的宏,类似于NSLocalizedString,但它选择字符串的捆绑包基于您设置的NSUserDefaults值(即不用担心苹果语言默认值的值是多少)
当您更改语言时,您应该发出一个通知,说明哪些视图控制器、视图等应该监听和刷新自己