Kev*_*vin 11 localization ios swift
我知道有不少帖子说不应该这样做,或者不可能.我修改了一些想法,现在我问这个问题,因为我想绝对确定没有其他选择.
选项1:
最流行的解决方案是改变AppleLanguages在这个岗位.我不介意要求重启,所以这对我来说是一个可以接受的解决方案,除了你不能以编程方式重启你的应用程序(找不到方法,或者被Apple拒绝).要求用户手动重启应用程序并不理想.
选项2:
接下来的解决办法是让合适的包和执行localizedStringForKey的每一个查询UILabel,UIButton等等.这可能是一个有点乏味,但还好我,因为我已经加入localizationProperties(类似于此),这些意见让我能有一个集中的字符串文件.
AppDelegate.swift:
static var userLanguage: String?
{
set
{
let defaults = NSUserDefaults.standardUserDefaults();
defaults.setObject(newValue, forKey: LanguageKey);
defaults.synchronize();
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle());
instance.window?.rootViewController = storyboard.instantiateInitialViewController();
}
get
{
let defaults = NSUserDefaults.standardUserDefaults();
return defaults.stringForKey(LanguageKey);
}
}
Run Code Online (Sandbox Code Playgroud)
Localization.swift:
private var bundle: NSBundle
{
get
{
let bundle: NSBundle;
#if TARGET_INTERFACE_BUILDER
bundle = NSBundle(forClass: self.dynamicType);
#else
bundle = NSBundle.mainBundle();
#endif
let lang: String;
if(AppDelegate.userLanguage == nil || AppDelegate.userLanguage == "en")
{
lang = "Base";
}
else
{
lang = AppDelegate.userLanguage!;
}
let path = bundle.pathForResource(lang, ofType: "lproj");
if(path != nil)
{
let toreturn = NSBundle(path: path!);
if(toreturn != nil)
{
return toreturn!;
}
}
return bundle;
}
}
extension UILabel
{
@IBInspectable var localizedText: String?
{
get { return "" }
set
{
if(newValue != nil)
{
text = bundle.localizedStringForKey(newValue!, value:"", table: nil);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
选项2的问题在于,这仅为这些字段设置语言.布局方向将保持不变,并且不会使用特定于语言的布局等文件.
通过扩展,UIApplication我可以指定一个自定义userInterfaceLayoutDirection,它可以在LTR和RTL之间成功交换所有布局.
DemoApplication.swift:
class DemoApplication: UIApplication
{
override internal var userInterfaceLayoutDirection: UIUserInterfaceLayoutDirection
{
get
{
if(AppDelegate.userLanguage == "ar")
{
return UIUserInterfaceLayoutDirection.RightToLeft;
}
return UIUserInterfaceLayoutDirection.LeftToRight;
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,当我设置AppDelegate.userLanguage应用程序时,将重置为初始视图控制器,显示新语言,翻转LTR和RTL之间的布局.这没有解决语言特定文件的问题,我也注意到文本在其自己的边界内保持左或右对齐.
由于我找不到本机iOS类的源代码,我无法看到在启动时设置了哪些语言特定的变量,所以我认为它已链接到NSBundle.mainBundle.我试图通过使用方法调配来覆盖它.
extension NSBundle
{
override public class func initialize()
{
struct Static
{
static var token: dispatch_once_t = 0;
}
// make sure this isn't a subclass
if (self !== NSBundle.self)
{
return;
}
dispatch_once(&Static.token)
{
do
{
try jr_swizzleClassMethod("mainBundle", withClassMethod: "mainBundleExt");
}
catch
{
print("\(error)");
}
}
super.initialize();
}
public class func mainBundleExt() -> NSBundle
{
let bundle = self.mainBundleExt(); // Due to swizzling, this is the "super" method
let lang: String;
if(AppDelegate.userLanguage == nil || AppDelegate.userLanguage == "en")
{
lang = "Base";
}
else
{
lang = AppDelegate.userLanguage!;
}
let path = bundle.pathForResource(lang, ofType: "lproj");
if(path != nil)
{
let toreturn = NSBundle(path: path!);
if(toreturn != nil)
{
return toreturn!;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,似乎mainBundle仍然使用默认值.
所以我的问题是:如何mainBundle赋值?启动时设置了哪些其他语言特定变量,例如userInterfaceLayoutDirection.我假设有2或3个这些变量.最后,这可能是有效的还是我只是在浪费时间?
谢谢.
我以前遇到过这个问题,并且我使用过一个库。它帮助我即时更改语言。尝试使用这个: https: //github.com/Decybel07/L10n-swift
L10n.shared.language = "en"
L10n.shared.language = "en-GB"
Run Code Online (Sandbox Code Playgroud)
运行时,可以通过设置语言属性随时切换语言
| 归档时间: |
|
| 查看次数: |
4954 次 |
| 最近记录: |