在故事板中为视图元素运行app时切换语言

时间:2016-08-31 06:25:25

标签: ios swift localization storyboard

我有一个应用程序,我想要更改应用程序内的语言,这可以正常使用localize.strings,但此代码不会触发main.strings文件。

以下是settingsLanguageVC中使用的代码

import UIKit

let AppLanguageKey = "AppLanguage"
let AppLanguageDefaultValue = "en"

var appLanguage: String {

get {
    if let language = NSUserDefaults.standardUserDefaults().stringForKey(AppLanguageKey) {
        return language
    } else {
        NSUserDefaults.standardUserDefaults().setValue(AppLanguageDefaultValue, forKey: AppLanguageKey)
        return AppLanguageDefaultValue
    }
}

set(value) {
    NSUserDefaults.standardUserDefaults().setValue((value), forKey: AppLanguageKey)
}

}

class ViewController: UIViewController {

这是stringsExtenstion.swift中使用的代码

import Foundation

extension String {

var localizeString: String {
    return localizeString(appLanguage)
}

var localizeStringUsingSystemLang: String {
    return NSLocalizedString(self, comment: "")
}

func localizeString(lang:String?) -> String {

    if let lang = lang {
        if let path = NSBundle.mainBundle().pathForResource(lang, ofType: "lproj") {
            let bundle = NSBundle(path: path)
            return NSLocalizedString(self, tableName: nil, bundle: bundle!, value: "", comment: "")
        }
    }
    return localizeStringUsingSystemLang
}
}

1 个答案:

答案 0 :(得分:1)

试试这段代码:

  

TabBarController.swift

import UIKit

class TabBarController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    setTabViewControllerParams(0, tabBarItemTitle: "ONE".localizeString, navigationItemTitle: "ONE".localizeString)
    setTabViewControllerParams(1, tabBarItemTitle: "TWO".localizeString, navigationItemTitle: "TWO".localizeString)
}

func setTabViewControllerParams(index: Int, tabBarItemTitle: String, navigationItemTitle: String) {

    if let tabBarItems = tabBar.items {
        if index < tabBarItems.count {
            tabBarItems[index].title = tabBarItemTitle
        }
    }

    if let viewControllers = viewControllers {
        if index < viewControllers.count {
            if let navigationController = viewControllers[index] as? UINavigationController {
                if navigationController.viewControllers.count > 0 {
                    let viewController = navigationController.viewControllers[0]
                    viewController.navigationItem.title = navigationItemTitle
                }
            }
        }
    }
}
}
  

Localizable.strings(俄语)

"ONE" = "один";
"TWO" = "два";
  

Localizable.strings(英文)

"ONE" = "one";
"TWO" = "two";
  

Localizable.strings(法语)

"ONE" = "un";
"DEUX" = "deux";
  

Main.storyboard

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="nUR-Hp-pCa">
<dependencies>
    <deployment identifier="iOS"/>
    <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/>
</dependencies>
<scenes>
    <!--View Controller-->
    <scene sceneID="CyN-qL-pwy">
        <objects>
            <viewController id="pYF-J2-lCH" sceneMemberID="viewController">
                <layoutGuides>
                    <viewControllerLayoutGuide type="top" id="7sj-ZO-H6Z"/>
                    <viewControllerLayoutGuide type="bottom" id="z8T-yS-yZZ"/>
                </layoutGuides>
                <view key="view" contentMode="scaleToFill" id="fUH-or-StF">
                    <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                </view>
                <navigationItem key="navigationItem" id="t7h-zd-rWW"/>
            </viewController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="yti-8g-g3h" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="1837" y="905"/>
    </scene>
    <!--View Controller-->
    <scene sceneID="qSl-mU-Ice">
        <objects>
            <viewController id="6og-vK-uE7" sceneMemberID="viewController">
                <layoutGuides>
                    <viewControllerLayoutGuide type="top" id="8pT-ac-TqX"/>
                    <viewControllerLayoutGuide type="bottom" id="xne-JP-NAW"/>
                </layoutGuides>
                <view key="view" contentMode="scaleToFill" id="cy0-Zm-dW4">
                    <rect key="frame" x="0.0" y="0.0" width="600" height="600"/>
                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
                    <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
                </view>
                <navigationItem key="navigationItem" id="Yme-f2-Ybt"/>
            </viewController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="sj3-Kd-b6r" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="1837" y="244"/>
    </scene>
    <!--Tab Bar Controller-->
    <scene sceneID="hYk-it-5Yg">
        <objects>
            <tabBarController id="nUR-Hp-pCa" customClass="TabBarController" customModule="stackoverflow_39242174" customModuleProvider="target" sceneMemberID="viewController">
                <tabBar key="tabBar" contentMode="scaleToFill" id="ZIu-fS-Ven">
                    <rect key="frame" x="0.0" y="0.0" width="320" height="49"/>
                    <autoresizingMask key="autoresizingMask"/>
                    <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
                </tabBar>
                <connections>
                    <segue destination="9ZZ-tm-gKt" kind="relationship" relationship="viewControllers" id="tba-rV-XaM"/>
                    <segue destination="QV0-6J-vKg" kind="relationship" relationship="viewControllers" id="MnC-tA-o6W"/>
                </connections>
            </tabBarController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="5R8-Ki-Qv1" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="205" y="575"/>
    </scene>
    <!--Item 1-->
    <scene sceneID="5eX-TM-S1f">
        <objects>
            <navigationController automaticallyAdjustsScrollViewInsets="NO" id="9ZZ-tm-gKt" sceneMemberID="viewController">
                <tabBarItem key="tabBarItem" title="Item 1" id="6fX-a0-rTY"/>
                <toolbarItems/>
                <navigationBar key="navigationBar" contentMode="scaleToFill" id="LaV-6J-YLJ">
                    <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
                    <autoresizingMask key="autoresizingMask"/>
                </navigationBar>
                <nil name="viewControllers"/>
                <connections>
                    <segue destination="6og-vK-uE7" kind="relationship" relationship="rootViewController" id="H4K-P1-t3E"/>
                </connections>
            </navigationController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="n57-4l-GAt" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="1025" y="244"/>
    </scene>
    <!--Item 2-->
    <scene sceneID="nqO-69-Jkp">
        <objects>
            <navigationController automaticallyAdjustsScrollViewInsets="NO" id="QV0-6J-vKg" sceneMemberID="viewController">
                <tabBarItem key="tabBarItem" title="Item 2" id="YyT-40-7qX"/>
                <toolbarItems/>
                <navigationBar key="navigationBar" contentMode="scaleToFill" id="ukb-bm-c5h">
                    <rect key="frame" x="0.0" y="0.0" width="320" height="44"/>
                    <autoresizingMask key="autoresizingMask"/>
                </navigationBar>
                <nil name="viewControllers"/>
                <connections>
                    <segue destination="pYF-J2-lCH" kind="relationship" relationship="rootViewController" id="gRY-up-TJA"/>
                </connections>
            </navigationController>
            <placeholder placeholderIdentifier="IBFirstResponder" id="geq-VQ-SVO" userLabel="First Responder" sceneMemberID="firstResponder"/>
        </objects>
        <point key="canvasLocation" x="1025" y="905"/>
    </scene>
</scenes>
</document>

enter image description here