web-dev-qa-db-ja.com

Swift:アプリ内の言語を変更する方法は?

使ってます Localize-Swiftライブラリ( Link )を使用してアプリケーションをローカライズすると、.stringsファイルで正常に動作します。問題は、右から左の言語にローカライズする必要があり、Interface Builder Storyboardを介してローカライズする必要があるため、RTL形式でビューコントローラーを正しく見えるようにできます。問題は、ストーリーボードをユーザーが選択した言語にリアルタイムで設定するにはどうすればよいですか?

たとえば、2つのストーリーボードファイルがあります。

1- ... /ProjectName/Base.lproj/Main.storyboard

2- ... /ProjectName/fa-IR.lproj/Main.storyboard

リアルタイムでそれらを切り替えるにはどうすればよいですか?

スキームとデバイス言語で変更できることはすでに知っていますが、リアルタイムで変更したいので、ユーザーにデバイスを再起動させたくありません。

ありがとう

7
KababChi

私の答えが見つかりました:

NSUserDefaults.standardUserDefaults().setObject(["language identifier"], forKey: "AppleLanguages") 
NSUserDefaults.standardUserDefaults().synchronize()

残念ながら、ユーザーはアプリを再起動する必要があります!誰かがアプリケーションを再起動しない解決策を見つけた場合は、私に知らせてください。

8
KababChi

カバブチの答えは正しかったと思います。ただし、Swift NSUserDefaultsの新しいバージョンでは、UserDefaultsに置き換えられているため、コードは次のようになります。

UserDefaults.standard.set(languages[indexPath.row], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

これらの変更を適用するには、アプリを再起動する必要があります。

4
jordivilagut

デバイスを再起動せずに言語を変更するには、「lproj」バンドルを切り替える必要があります。

あなたはこのコードを使用してそれを作ることができます:

class L012Localizer: NSObject {
    class func DoTheSwizzling() {
        MethodSwizzleGivenClassName(cls: Bundle.self, originalSelector: #selector(Bundle.localizedString(forKey:value:table:)), overrideSelector:
            #selector(Bundle.specialLocalizedString(key:value:table:)))
    }
}

extension Bundle {
    @objc func specialLocalizedString(key: String, value: String?, table tableName: String?) -> String {
        let currentLanguage = Localization.currentAppleLanguage()
        var bundle = Bundle();
        if let _path = Bundle.main.path(forResource: currentLanguage, ofType: "lproj") {
            bundle = Bundle(path: _path)!
        } else {
            let _path = Bundle.main.path(forResource: "Base", ofType: "lproj")!
            bundle = Bundle(path: _path)!
        }
        return (bundle.specialLocalizedString(key: key, value: value, table: tableName))
    }
}

func MethodSwizzleGivenClassName(cls: AnyClass, originalSelector: Selector, overrideSelector: Selector){

    let origMethod: Method = class_getInstanceMethod(cls, originalSelector)!;
    let overrideMethod: Method = class_getInstanceMethod(cls, overrideSelector)!;
    if (class_addMethod(cls, originalSelector, method_getImplementation(overrideMethod), method_getTypeEncoding(overrideMethod))) {
        class_replaceMethod(cls, overrideSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
    } else {
        method_exchangeImplementations(origMethod, overrideMethod);
    }
}

ここでは、BundleのlocalizedStringメソッドの実装を交換しています。注:関数の参照ではなく実装を交換します。

ここで、didFinishLaunchingWithOptionsデリゲートメソッドのAppdelegateにこの行を追加します。

L102Localizer.DoTheSwizzling()

その後、ViewControllersをリロードする必要があります。 Main.storyboardで、ルートビューコントローラーのStoryboardIdを「rootnav」に設定し、このコードを言語を切り替えるメソッドに貼り付けます。

let rootviewcontroller: UIWindow = ((UIApplication.shared.delegate?.window)!)!
rootviewcontroller.rootViewController = self.storyboard?.instantiateViewController(withIdentifier: "rootNav")
let mainwindow = (UIApplication.shared.delegate?.window!)!
mainwindow.backgroundColor = UIColor(hue: 0.6477, saturation: 0.6314, brightness: 0.6077, alpha: 0.8)
UIView.transition(with: mainwindow, duration: 0.55001, options: .transitionFlipFromLeft, animations: { () -> Void in
}) { (finished) -> Void in
}
2

NSBundle + Language サードパーティクラスを使用できます。

2
Keyur Hirani
  1. アプリの再起動が必要です。以下のコード行に従ってください。

    UserDefaults.standard.set(["language identifier"]、forKey: "AppleLanguages")UserDefaults.standard.synchronize()

  2. アプリの再起動は必要ありません(答えは提供されたソースコードのカスタマイズが必要な場合があります)。提供されたWebリンクに従ってください。

http://www.factorialcomplexity.com/blog/2015/01/28/how-to-change-localization-internally-in-your-ios-application.html

0
iDevAmit

多分 RSMultiLanguageポッド はあなたにとって何か便利なものですか?私はそれを自分のアプリで使用しており、アプリのユーザー言語を変更する可能性を提供します。 ifループを使用して、ユーザーの場所に応じて設定できると確信しています。そうすれば、アプリを再起動する必要がない場合があります。

RSMultiLanguage

用途

サンプルプロジェクトを実行するには、リポジトリのクローンを作成し、最初にExampleディレクトリからpod installを実行します。

インストール

RSMultiLanguageは、CocoaPodsを通じて利用できます。これをインストールするには、次の行をPodfileに追加するだけです。

pod "RSMultiLanguage"

作者

Roy Ng、roytornado @ gmail.com

ライセンス

RSMultiLanguageは、MITライセンスの下で利用できます。詳細については、LICENSEファイルを参照してください。

0
David Seek