LocaleManager

这个库用于即时更改本地化/语言。

对于从右到左的语言,用户界面方向将自动更新。

Swift Version Platform License Release version

要求

安装

首先,您必须从 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
    }

}

准备 Storyboard

Main.storyboard 中,将根视图控制器的 Storyboard ID 设置为一个非空字符串。

如果您不使用 Storyboard,请将 LocaleManager.rootViewController 设置为一个闭包或方法,该闭包或方法返回应用程序根视图控制器的实例。

向用户显示可用的本地化

您的应用程序应向用户提供本地化列表。您可以根据您的项目获取可用的本地化列表,如下所示:

let languages = LocaleManager.availableLocalizations

现在,languages 变量是一个字典。 如果您没有任何本地化,则该字典将为 ["Base": "Base"],所有其他本地化都将在之后添加。

您必须将字典的键传递给 LocaleManager 的方法,而字典的值是相应键的本地化名称。 例如,“de”在英文环境下将是“German”,而在德文环境下将是“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 语言翻转,请不要使用资源的direction属性来镜像图片,而是使用 image.imageFlippedForRightToLeftLayoutDirection() 来初始化可翻转图片。

额外步骤

如果您的应用程序需要额外的步骤来更新界面(例如,清除缓存),请使用 LocaleManager.updateHandler 属性。

已知问题

查看 Issues 页面。

贡献

我们很乐意您为 LocaleManager 做出贡献,请查看 LICENSE 文件以获取更多信息。