Swift Objective C UIKit SwiftUI iOS tvOS CocoaPods Swift Package Manager

AKLanguageManager

一个语言管理器,用于处理在不重启应用的情况下更改应用本地化。

屏幕截图

安装

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 库。请查看他的作品并给予他应得的赞誉 🚀

找到我 🥰

领英

许可证

请查看许可证文件。