Локализация в арабском направлении изменений - PullRequest
0 голосов
/ 02 апреля 2019

Здравствуйте. В моем приложении я использую этот модуль https://github.com/Abedalkareem/LanguageManager-iOS и прокомментировал весь код, который изменяет направление просмотров, но когда я меняю язык с английского на арабский, он изменяет направление текста при повторном открытии.приложение меняет направление слева направо, и когда я снова выбираю английский, все в порядке, я хочу отключить, я не хочу ничего делать при смене языка.

это код моего языка man

ager
//
//  LanguageManger.swift
//
//  Created by abedalkareem omreyh on 10/23/17.
//  Copyright © 2017 abedlkareem omreyh. All rights reserved.
//  GitHub: https://github.com/Abedalkareem/LanguageManger-iOS
//

import UIKit

class LanguageManger {

    static let shared: LanguageManger = LanguageManger()


    /// Returns the currnet language
    var currentLanguage: Languages {
        get {

            guard let currentLang = UserDefaults.standard.string(forKey: "selectedLanguage")
                else {
                    fatalError("Did you set the default language for the app ?")
            }
            return Languages(rawValue: currentLang)!
        }
        set {
            print("raw value\(newValue.rawValue)")
            UserDefaults.standard.set(newValue.rawValue, forKey: "selectedLanguage")
        }
    }

    /// Returns the default language that the app will run first time
    var defaultLanguage: Languages {
        get {

            guard let defaultLanguage = UserDefaults.standard.string(forKey: "defaultLanguage") else {
                fatalError("Did you set the default language for the app ?")
            }
            return Languages(rawValue: defaultLanguage)!
        }
        set {

            // swizzle the awakeFromNib from nib and localize the text in the new awakeFromNib
            UIView.localize()

            let defaultLanguage = UserDefaults.standard.string(forKey: "defaultLanguage")
            guard defaultLanguage == nil else {
                return
            }

            UserDefaults.standard.set(newValue.rawValue, forKey: "defaultLanguage")
            UserDefaults.standard.set(newValue.rawValue, forKey: "selectedLanguage")
            setLanguage(language: newValue)
        }
    }


    // Returns the diriction of the language
        var isRightToLeft: Bool {
            get {
                let lang = currentLanguage.rawValue
                return lang.contains("s") || lang.contains("he") || lang.contains("ur") || lang.contains("fa")
            }
        }

    /// Returns the app locale for use it in dates and currency
    var appLocale: Locale {
        get {
            return Locale(identifier: currentLanguage.rawValue)
        }
    }

    ///
    /// Set the current language for the app
    ///
    /// - parameter language: The language that you need from the app to run with
    ///
    func setLanguage(language: Languages) {

      //   change the dircation of the views
//        let semanticContentAttribute:UISemanticContentAttribute = language == .ar ? .forceRightToLeft : .forceRightToLeft
//                UIView.appearance().semanticContentAttribute = semanticContentAttribute
//                UINavigationBar.appearance().semanticContentAttribute = semanticContentAttribute
//                UITextField.appearance().semanticContentAttribute = semanticContentAttribute
//                UITextView.appearance().semanticContentAttribute = semanticContentAttribute

        // change app language
        UserDefaults.standard.set([language.rawValue], forKey: "AppleLanguages")
        UserDefaults.standard.synchronize()

        // set current language
        currentLanguage = language
        print("---curent langugae from lanagugae maneger \(currentLanguage)")
    }
}

enum Languages:String {
    case ar,en,nl,ja,ko,vi,ru,sv,fr,es,pt,it,de,da,fi,nb,tr,el,id,ms,th,hi,hu,pl,cs,sk,uk,hr,ca,ro,he
    case enGB = "en-GB"
    case enAU = "en-AU"
    case enCA = "en-CA"
    case enIN = "en-IN"
    case frCA = "fr-CA"
    case esMX = "es-MX"
    case ptBR = "pt-BR"
    case zhHans = "zh-Hans"
    case zhHant = "zh-Hant"
    case zhHK = "zh-HK"
}


// MARK: Swizzling
extension UIView {
    static func localize() {

        let orginalSelector = #selector(awakeFromNib)
        let swizzledSelector = #selector(swizzledAwakeFromNib)

        let orginalMethod = class_getInstanceMethod(self, orginalSelector)
        let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)

        let didAddMethod = class_addMethod(self, orginalSelector, method_getImplementation(swizzledMethod!), method_getTypeEncoding(swizzledMethod!))

        if didAddMethod {
            class_replaceMethod(self, swizzledSelector, method_getImplementation(orginalMethod!), method_getTypeEncoding(orginalMethod!))
        } else {
            method_exchangeImplementations(orginalMethod!, swizzledMethod!)
        }

    }

    @objc func swizzledAwakeFromNib() {
        swizzledAwakeFromNib()

        switch self {
        case let txtf as UITextField:
            txtf.text = txtf.text?.localiz()
        case let lbl as UILabel:
            lbl.text = lbl.text?.localiz()
        case let btn as UIButton:
            btn.setTitle(btn.title(for: .normal)?.localiz(), for: .normal)
        default:
            break
        }
    }
}


// MARK: String extension
extension String {


    /// Localize the current string to the selected language

    /// - returns: The localized string
    ///
    func localiz() -> String {
        guard let bundle = Bundle.main.path(forResource: LanguageManger.shared.currentLanguage.rawValue, ofType: "lproj") else {
            return NSLocalizedString(self, comment: "")
        }

        let langBundle = Bundle(path: bundle)
        return NSLocalizedString(self, tableName: nil, bundle: langBundle!, comment: "")
    }

}

// MARK: UIApplication extension
extension UIApplication {
    // Get top view controller
    static var topViewController:UIViewController? {
        get{
            if var topController = UIApplication.shared.keyWindow?.rootViewController {
                while let presentedViewController = topController.presentedViewController {
                    topController = presentedViewController
                }
                return topController
            }else{
                return nil
            }
        }
    }

}

я делаю это после смены языка, но ничего не происходит

 UINavigationBar.appearance().semanticContentAttribute = .forceLeftToRight
               UITextField.appearance().semanticContentAttribute = .forceLeftToRight
                    UITextView.appearance().semanticContentAttribute = .forceLeftToRight
                   UIView.appearance().semanticContentAttribute = .forceLeftToRight

На арабском языке текст отображается справа

Ответы [ 2 ]

0 голосов
/ 02 апреля 2019

UIView.appearance (). SemanticContentAttribute = .forceLeftToRight

0 голосов
/ 02 апреля 2019

Вы можете использовать view.contentMode = .right, это заставит контент независимо от того, на каком языке он находится, например, когда он на арабском языке, он меняется на левый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...