我可以在按钮单击时以编程方式更改Localizable.strings文件,而无需重新启动应用程序

时间:2018-04-04 10:54:54

标签: ios swift localization swift4

我正在创建一个使用2种语言的阿拉伯语和英语的应用程序。我已设法将布局更改为阿拉伯语的RTL和英语的普通。我还添加了阿拉伯语和英语的Localizable.strings文件。

当选择英语时,应用程序选择英语和普通布局显示,并在第一次或每次重启时启动应用程序时显示阿拉伯语和RTL布局。

它不会在运行时获取阿拉伯语或英语Localizable.strings文件。有没有办法做到这一点。

2 个答案:

答案 0 :(得分:2)

您可以更改从

中读取的当前捆绑包
extension String {
      func localizedStr(language:String) -> String {
          let path = Bundle.main.path(forResource: language, ofType: "lproj")
          let bundleName = Bundle(path: path!)
          return NSLocalizedString(self, tableName: nil, bundle: bundleName!, value: "", comment: "")

    }
}

在行动中 enter image description here enter image description here enter image description here

在此处查看演示local

答案 1 :(得分:0)

尝试以下代码......它 可能会帮助你解决问题。

第1步

extension String {

    /// Returns the localized string value
    public var localized: String {
        if let bundleName:String = UserDefaults.standard.value(forKey: "USER_LANG") as? String {
            let path = Bundle.main.path(forResource: bundleName, ofType: "lproj")
            let bundle = Bundle.init(path: path!)
            return localize(withBundle: bundle!)
        } else {
            return localize(withBundle: Bundle.main)
        }

    }

    public func localize(withBundle bundle: Bundle) -> String
    {
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }

}

第2步

  • 将用户名默认存储在按钮上。

示例

// Strore Base bundleName when english button is clicked
UserDefaults.standard.set("Base", forKey: "USER_LANG") 

// Strore fr(short from of french) bundleName when french button is clicked 
UserDefaults.standard.set("fr", forKey: "USER_LANG") 

第3步

用法

  • 在字符串文件

"lbl_name"="name";

// name will convert in French and English too
"lbl_name".localized

谢谢!!!