一个语言管理器,用于处理在不重启应用的情况下更改应用本地化。
AKLanguageManager 可以使用 CocoaPods 安装。将以下行添加到您的 Podfile
pod 'AKLanguageManager'
您也可以使用 swift package manager 进行安装。
dependencies: [
.package(url: "https://github.com/AmrKoritem/AKLanguageManager.git", .upToNextMajor(from: "2.0.1"))
]
注意:如果您已经配置了您的应用使其可本地化,请跳至步骤 3。
1 - 通过转到 PROJECT > Localisation
配置您的应用使其可本地化,然后添加您想要支持的语言(例如阿拉伯语),将出现一个对话框询问您想要本地化哪些资源文件(如果存在任何文件),选择您希望本地化的所有文件。
2 - 将 .strings
文件添加到您的项目资源以本地化您的字符串字面量(最好命名为 Localizable.strings
),然后转到文件检查器并在本地化下方按本地化。
3 - 对于 UIKit 项目,您的默认语言必须在使用 configureWith(defaultLanguage:observedLocalizer:)
设置您的 rootViewController 之前设置。例如,您可以在 AppDelegate.application(_:didFinishLaunchingWithOptions:)
方法中设置它。如果默认语言未在您的 UIKit 应用中设置,您将遇到错误。
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// you can use .deviceLanguage to keep the device default language.
AKLanguageManager.shared.defaultLanguage = .en
return true
}
4 - 对于 SwiftUI,将您的根视图作为子视图添加到 LocalizedView
。
LocalizedView(.en) {
ContentView()
// Animation that will be used when localization is triggered.
.transition(.slide)
}
5 - 请注意,您将必须在呈现的视图上调用 localized()
。
VStack {
...
}
.popover(isPresented: $isPresented) { // same goes for other presentation styles.
AnotherView()
.localized()
}
注意:默认语言是您的应用首次运行时将本地化的语言。
1 - 如果您想更改语言,请使用 setLanguage(language:)
方法,并将新语言传递给它。
在 UIKit 项目中,除了语言之外,至少必须提供参数 viewControllerFactory
// Change Language and set rootViewController to the initial view controller
@IBAction func changeLanguage() {
// Swap between anglish and arabic languages
let newLanguage = AKLanguageManager.shared.selectedLanguage == .en ? Language.ar : Language.en
AKLanguageManager.shared.setLanguage(
language: newLanguage,
viewControllerFactory: { windowTitle in
// The view controller that you want to show after changing the language
let settingsVC = Storyboard.Main.instantiate(viewController: SettingsViewController.self)
return Storyboard.Main.initialViewController ?? settingsVC
},
animation: { view in
// Do custom animation
view.alpha = 0
}
)
}
在 SwiftUI 项目中,只需要语言
import SwiftUI
import AKLanguageManager
struct LangaugeView: View {
var body: some View {
VStack {
Text("Select a language".localized)
.fontWeight(.bold)
.padding()
HStack {
Button("العربية") {
withAnimation {
AKLanguageManager.shared.setLanguage(language: .ar)
}
}
.padding()
Spacer()
Button("English") {
withAnimation {
AKLanguageManager.shared.setLanguage(language: .en)
}
}
.padding()
}
}
}
}
2 - 请注意,在 UIKit UI 元素中,图像默认情况下会根据语言方向更改方向。如果您希望 UI 元素(例如:UIImageView)不更改其方向,您可以将其 shouldLocalizeDirection
属性设置为 false
。
@IBOutlet weak var fixedImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Make the image direction fixed even when localization direction change
fixedImageView.shouldLocalizeDirection = false
}
3 - 请注意,在 SwiftUI 视图中,图像默认情况下是固定的。如果您希望根据所选语言方向更改图像的方向,请使用方法 directionLocalized()
。
Image("image")
.directionLocalized()
4 - 字符串、整数和双精度浮点数可以使用属性 localized
进行本地化。
// where selected language is .ar
print("01.10 key".localized)
// prints ٠١٫١٠ مفتاح
print(01.10.localized)
// prints ٠١٫١٠
print(01.localized)
// prints ٠١
5 - 数字默认情况下是本地化的,您可以通过将属性 shouldLocalizeNumbers
设置为 false
来停止数字本地化。
// where selected language is .ar
AKLanguageManager.shared.shouldLocalizeNumbers = false
print("01.10 key".localized)
// prints 01.10 مفتاح
您可以查看此处的示例项目,以了解 AKLanguageManager 的实际应用 🥳。
您也可以在此处查看完整的示例集。
欢迎所有贡献。如果您不知道从哪里开始,请随时查看已知问题和未来计划部分。当然,也欢迎您提出自己的问题并为它们创建 PR 💪
1 - 启动屏幕中显示的字符串未本地化。 #6
不幸的是,这是 Apple 按照此处所述的预期行为。
2 - 更改应用语言时,图像素材的本地化版本不显示。 #7
我们目前正在调查此问题。当前的解决方法是为每个图像本地化使用不同的名称,并使用本地化字符串获取它们。
3 - SF 符号图像在方向更改时尺寸会缩小。 #8
1 - 获取带有注释的本地化字符串。 #9
2 - 本地化复数。 #10
3 - Carthage 支持。 #11
4 - 检查文本语言。 #12
此库的灵感来自 Abedalkareem 的 LanguageManager-iOS 库。请查看他的作品并给予他应得的赞誉 🚀
请查看许可证文件。