LocaleManager
这个库可以动态修改区域/语言。
对于从右到左的语言,用户界面方向将自动更新。
需求
- Swift 5.0 或更高版本
- iOS 9.0
- XCode 10.2
安装
首先,您需要从 github 复制此项目
git clone https://github.com/amosavian/LocaleManager
然后,您可以通过将 Sources/LocaleManager
目录添加到您的项目中,或者创建一个 xcodeproj
文件并将其添加为动态框架来手动安装
swift package generate-xcodeproj
使用方法
初始化
首先,将以下行添加到您的 AppDelegate 类中:
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Your initialization code here
LocaleManager.setup()
return true
}
}
准备故事板
在 Main.storyboard
中为根视图控制器设置 Storyboard ID
为非空字符串。
如果您不使用故事板,请将 LocaleManager.rootViewController
设置为闭包或返回应用程序根视图控制器实例的方法。
向用户展示可用的本地化
您的应用程序应提供本地化列表给用户。您可以通过以下方式根据项目获取可用的本地化列表:
let languages = LocaleManager.availableLocalizations
现在 languages
变量是一个字典。如果没有本地化,该字典将是 ["Base": "Base"]
,所有其他本地化将在其后添加。
您必须将字典的键传递给 LocaleManager
的方法,而字典的值是对应键的本地化名称。例如,“de”在英文环境中是“德语”,而在德语环境中是“Deutsch”。
当用户选择了一个本地化后,继续下一步。
动态更改本地化
在这里没有特别之处,只需添加以下行
let localeID = "fa"
LocaleManager.apply(identifier: localeID)
如果您有 Locale
对象而不是标识符
let locale = Locale(identifier: "fa")
LocaleManager.apply(locale: locale)
这将在更改语言时引起翻转动画。如果您不想要这个动画
let localeID = "en"
LocaleManager.apply(identifier: localeID, animated: false)
移除任何自定义本地化,允许iOS根据系统语言选择本地化
LocaleManager.apply(locale: nil)
如果您之前使用了其他库如 maximbilan/ios_language_manager,请首次调用 LocaleManager.apply(locale: nil)
以删除残留片段,以避免冲突。
获取活动地区
let locale = Locale.userPreferred // e.g "en_US"
print(locale.languageCode) // e.g "en"
本地化数字
默认情况下数字不会进行本地化,要显示本地化数字
// Int
let n = 10
label.text = (n as NSNumber).localized()
// Double with 2 fraction
let d = 10.12
label.text = (n as NSNumber).localized(precision: 2)
// Percentage
let d = 0.5 // 50%
label.text = (n as NSNumber).localized(style: .percent)
格式化字符串(仅Swift中)
使用 NSLocalizedString()
方法,您可以从 Localizable.strings
文件中获取本地化字符串。如果返回的字符串是可格式化的文本,可以轻松填充占位符
let completed = 10
let total = 15
let completedText = (completed as NSNumber).localized()
let totalText = = (total as NSNumber).localized()
let template = NSLocalizedString("Progress %@ out of %@ items", comment: "")
let formattedText = template.localizedFormat(completedText, totalText)
镜像图片
由于iOS中的潜在错误,如果您有一个需要为RTL语言反转的图片,不要使用资产的方向属性来镜像图片,而是使用 image.imageFlippedForRightToLeftLayoutDirection()
来初始化可翻转的图片。
附加步骤
如果您的应用程序需要更新用户界面(例如清除缓存)的额外步骤,请使用 LocaleManager.updateHandler
属性。
已知问题
请检查 问题页面。
贡献
我们非常希望您为 LocaleManager 贡献代码,有关更多信息,请查看 LICENSE 文件。