ios10+swift3.0 app多语言——国际化和本土化

开发一款国际化的iOS App,则必须考虑支持多国家语言,如何实现呢?

第一、国际化——多国家语言;第二、本土化——数据、时间、货币格式等。

一、新建工程LSMultiLanguage

二、Main.storyboard设计界面

732FB274-8362-4378-B2D8-B7F3D482FDE4.png

如上图所示,默认语言是中文。为了国际化设计,要求不同国家的用户所见界面是适合当地文化(本土化),图片表示用户所在国家的不同,商品名称描述、数据格式、金额币种、日期时间。

三、增加多语言。(中、英文)

1、点击工程名-->右侧选中project名称-->点击左下角localizations下面的“+”,选择语言chinese(简体中文)

20150321094349970.png

2.弹窗口中勾选main.storyboard和luanchscreen,该操作的目的是实现界面设计时(非程序运行)相对固定的描述性文字的多语言,如“商品:”、“销量:”,等等。

20150321094711665.png

3.点击finish完成后,点击main.storyboard,Xcode右侧的属性监视窗口即可看到增加了chinese语言,同时我们把english语言也勾选。对launchscreen.xib执行同样操作。

20150321095151787.png

接下来,用main.storyboard界面举例,launchscreen.xib是类似操作。

三、设置界面标签描述文字的多语言

1.点击main.storyboard下的main.strings(中文),

2A39DEFC-B381-4048-932D-F698037FF1C4.png

右侧文件的内容是xcode自动生成的,“=”等号左侧的是对应界面元素的ID,右侧是对应的文本值,我们只需要修改=右侧内容,这里我们只需要设计标签文本的中文,“商品”、“销量”、“利润”、“时间”,其对应的右侧值稍后在代码中动态修改后显示。为了简单起见,可删除该部分内容,完成后如下图所示:

00CFFC69-8269-4608-B53D-609385F7367A.png

2.点击main.storyboard下的main.strings(english),设置标签文字的英文,并删除多余部分,如下图所示:

72A061F0-9634-4161-9546-40B54109839E.png

3.标签文字多语言设置完成,我们看看界面效果,点击main.storyboard-->右侧点击-->再点击如下图所示:


C0B7C1E6-EC60-4D78-92A2-F00630BBFBAB.png

然后点击视图右下加的语言,切换成english,在界面设计时(程序未运行)即可看见多语言效果:如上图

四、设计标签右侧对应值的多语言,这个在程序运行时动态设置。

1.界面上的值标签与viewcontroller代码关联,即对象抽象定义

054759ED-A53B-411D-B0EC-28C1E8C81663.png

2.向工程中添加新文件——多语言字符串文件,并命名文件为Localizable.strings


4CDDE724-964D-4C8A-828E-1B22450A52AF.png

3.设置Localizable.strings文件支持多语言中、英文,点击该文件,在xcode右侧属性监视窗口,点击localize...按钮

7F3785FA-12EE-4237-9ED8-7E3F605A7DB7.png

同时勾选english和chinese,

70132875-A787-49A5-8951-7E84DE461008.png

4.分别在localizable.strings(chinese)和localizable.strings(english)文件中设置商品值标签“苹果手机”的多语言文本:key=value

1F068481-8098-49C5-B59B-4170E7B360CA.png
1FCE4B87-2875-40A5-8CD8-9CB07558E89A.png

5.在viewcontroller代码文件中,视图加载完时设置商品名称,使用NSLocalizedString方法

lab_Product.text = NSLocalizedString("PRODUCT_NAME", comment: "商品名称")

6.设置数据,货币,日期时间格式本土化,不同地区数字格式不同,币种不同,日期时间格式不一样。我们分别自定义数字格式器、货币格式器和日期时间格式器:

 // 数字格式
    var numberFormatter:NumberFormatter{
        let formatter=NumberFormatter()
        formatter.numberStyle=NumberFormatter.Style.decimal
        return formatter
    }
    // 货币格式
    var currencyFormatter:NumberFormatter{
        let formatter=NumberFormatter()
        formatter.numberStyle=NumberFormatter.Style.currency
        return formatter
    }
    
    // 日期时间格式
    var dateFormatter:DateFormatter{
        let formatter=DateFormatter()
        formatter.dateStyle=DateFormatter.Style.medium
        formatter.timeStyle=DateFormatter.Style.medium
        return formatter
    }

7.在viewcontroller代码文件中
viewDidLoad()方法体内给相应的标签赋值,代码如下:

 override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        lab_Product.text = NSLocalizedString("PRODUCT_NAME", comment: "商品名称")
        
        lab_Sales.text=numberFormatter.string(from: 99999);
        //利润
        lab_Profit.text=currencyFormatter.string(from: 2347898)
        //日期
        lab_DateTime.text=dateFormatter.string(from: NSDate() as Date)
    }

8.设置模拟器语言为英文,运行后界面显示如下:

![803E1119-6F2F-4371-B56F-9C71EEED8ABC.png](http://upload
![Uploading BA8DFB72-08CD-4A86-8AC2-1F353A512B7F_778214.png . . .]images.jianshu.io/upload_images/1830761-2545448ed53015d2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

设置模拟器语言为中文,运行后界面显示如下:

BA8DFB72-08CD-4A86-8AC2-1F353A512B7F.png

五、设置图片适应多语言。

不同语言时,图片需相应显示不同图片。
点击工程目录中的图片1.jpg文件,再在右侧属性监视窗口点击localiza...同时勾选english/chinese,完成后,如下图所示:

056F7D62-4457-4E00-AF01-7BBCEE9DAA24.png

在磁盘finder中打开flag图片所在的目录,打开en.lproj目录和zh-Hans.lproj目录,可见同时存在相同的flag图片,

106DDE29-E4C8-4BEF-9A7E-4142C74BFC50.png

此时用相同命名的图片替换en.lproj目录中的同名图片文件(已存在的一张图片1.jpg)。
这时项目中已经变了图片。

A6229744-2228-44B0-8C1C-493BB82129A6.png

六、设置xcode调试环境或切换iOS模拟器语言(中文、英文),运行app后可见效果。

推荐阅读更多精彩内容