【转】使用Xcode 6将你的项目本地化
原文转自:http://www.cocoachina.com/ios/20141004/9827.html
iOS和OSX支持40种语言的本地化,Xcode无疑为这一过程提供了强有力的支持。苹果将这一多语言适配过程细分为Internationalization(国际化)和Localization(本地化)两个阶段。
国际化—准备你的APP
在将你的APP适配各种语言本地化之前,你得先让你的APP富有国际范儿,也就是说国际化是一条通往本地化的必经之路。在国际化阶段,你需要让你的APP与语言和区域独立。
苹果的框架已经帮我们把不同语言的数据分离开,这更有助于我们管理这些资源,包括图片、声音、视频、文档、用户界面文字(甚至代码中编写的用户界面文字),它们会被建立在同一个bundle中。
NSLocalizedString
我们来使用NSLocalizedString来让用户界面的文字国际化,不过这些文字不是在IB上输入的,而是在代码中产生并赋值的:
1
|
func NSLocalizedString(key: String, tableName: String? = default , bundle: NSBundle = default , value: String = default , #comment: String) -> String |
上面这个Swift语言声明的函数可以直接返回一个经过本地化处理过的字符串,这就使得你在代码中给一些控件文本赋值时更有“国际化视野”:
1
|
self.text = NSLocalizedString( "SHARE" , comment: "share score" ) |
因为不用的语言会有不同的专业名词,所以最后的comment参数很重要,它可以暗示翻译人员这段文字要表达的含义。而第一个参数key的内容为基础语种的内容,将它作为“键”来映射其他语言对应翻译后的“值”。如果我们需要在字符串中插入其他内容,这时需要改进下:
1
|
let text = String.localizedStringWithFormat(NSLocalizedString( "I got %d points in Spiral. Come on with me! https://itunes.apple.com/us/app/square-spiral/id920811081" , comment: "share content" ), Data.score) |
localizedStringWithFormat:方法保证了插入字符串中的内容也被转化成本地格式,比如时间格式、数字的格式等。而此时在Swift字符串中插入其他数据就不能使用\()了,只能用百分号占位的形式。
对应的在Localizable.strings中可以这样写:
******
这样就将英文与中文键值对应起来了,注意那个“1$”表示是在键内容(即英文原文)中第一个插入的数据,因为不用语言表达同一个意思时,插入字符串中的数据顺序可能会有变化,这个”数字+$“的标记记录了它们原本的顺序。
NSFormatter
NSFormatter算是老朋友了,它把数据转化成人们易读的字符串,而且还会根据不同语言和区域进行格式上的优化。它默认使用当地的语言习惯,我们不需要配置任何参数。比如显示时间日期,数字,金融,字节计数等格式上的本地化。现在iOS8和OSX Yosemite加入了健康相关的功能,NSFormatter也加入了很多新的量词,比如能量、长度高度、重量等方面。
NSBundle
你的APP构建于很多文件夹中,而不是一个单独的文件。这些文件夹被叫做bundle。它们不仅仅包含了你的APP,还有你APP的扩展(extensions),你的构架(frameworks)等。而NSBundle提供了获取这些bundle中资源的标准API。当你使用这些API的时候,它们会自动使用符合当前地区语言的最恰当的资源。建立bundle是Xcode的活儿,所以我们不需要手动去管理这些资源文件放在bundle的具体位置,而是告诉Xcode哪些资源可以被本地化,设置好资源文件对应的语言,然后就交给Xcode去管理这些资源文件在bundle中的位置吧。
所以我们在加载一些资源文件的时候依然向以前那样从bundle获取url就行啦,Xcode已经帮我们替换成了本地化的资源,前提是你已经在Xcode中设置好了当前语言版本的对应资源。
Xcode
在Xcode5中支持了使用base国际化并用自动布局优化国际化后的界面,现在其他资源文件也可以这么干了,甚至可以在Xcode中预览界面布局效果。
点选一个xib或storyboard文件后,在File Inspector中的Localization中可以设置支持的语言。Xcode会自动从界面元素中提取出文字到strings文件中,翻译人员可以根据注释来在对应语言的strings文件中进行翻译。当然也可以直观化的转换成界面形式的文件来直观化翻译工作:
其他诸如图片、声音、影片等资源文件也可以通过类似的方法本地化:
在Xcode6中我们可以在Debug时预览不同语言和地区APP的界面效果,这样我们就不用在debug阶段不断的切换模拟器或真机的系统语言了!首先要在scheme中更改下运行APP的语言和地区:
注意到后面还有两项:双倍长度的模拟语言和从右到左的模拟语言,这两种是模拟极端状况下来考验我们UI效果的。比如在表达相同语义时英语的长度要比汉语长很多,而德语又比英语长一些,这很可能让APP的界面造成混乱;而还有语言是从右到作的(古汉语的写法?),这也都是一些APP需要考虑的地方。
在Xcode6的Assistent Editor中我们可以无须在模拟器或真机上运行APP就可以在设计界面时预览界面的本地化效果,并在右下角的语言选项中切换语言:
PS:语言和地区这两个选项是有差别的,比如当我们将地区设置成瑞典,虽然我们没有提供对应的瑞典版本的界面文字翻译,但是时间日期的显示方式等还是会遵从瑞典的习惯来显示。所以地区这一项可供选择的选项包含了所有地区,而语言这一选项只包含了我们在国际化工作中所支持的语言,因为只有国际化中支持的语言(比如上图,我只加入了英语和汉语)才有相应的资源文件;而NSFormatter地区格式优化是内建的,无需我们提供格式。
本地化—翻译你的APP
之前国际化的工作就是将工程变得有国际范儿,建立起了支持多语种的架构,那么接下来就是苦逼的翻译工作和本地资源准备工作,说好听点儿就叫本地化。
首先要把表面上的工作做了,也就是翻译用户界面上所有的文字。当然这不是程序员该干的活儿,更不能直接交给谷歌翻译,而程序员与专业翻译人员沟通时还是需要成本的:首先把需要翻译的内容从工程里整理出来,然后交给负责翻译的妹子,等妹子翻译好后再把结果导入工程中,嗯目测工作量亚历山大。PS:为什么翻译是妹子?
就算妹子再萌,也不能因为这占用了程序猿们宝贵的工作时间!Xcode6简化了导入导出这些资源的流程,它会检查IB资源和源文件并提取“source strings”,并生成XLIFF文件。翻译好的XLIFF文件也可以通过Xcode导入到工程中来生成和更新资源。嗯,可以把省下来的时间干一些其他的事情咯。
PS:XLIFF是由软件开发商、本地化服务提供商、本地化工具提供商等团体共同倡议和设计,由OASIS标准组织发布的用于本地化数据交换的格式标准。它基于XML技术制定软件资源文件格式的转换规格,其目的在于提高软件的本地化作业效率。
导出和导出XLIFF就是如此简单,选中项目,在Editor菜单中可以就找到:
也可以通过命令行的方式进行导入导出XLIFF文件操作:
1
|
xcodebuide -exportLocalizations -project -localizationPath xcodebuide -importLocalizations -project -localizationPath |
迭代开发—更新你的APP
无需把翻译工作推到最后去做,因为导入和导出XLIFF文件是可以持续集成的,一边写代码,一边把现有内容导出XLIFF给他人翻译,这样能提高效率。每当有新的翻译修改时也可以及时更新,Xcode会把XLIFF文件内容与当前翻译进度合并;在导出XLIFF时可以选择导出当前开发使用的语言还是已经翻译中的语言,这些强大的服务无疑是Xcode6所赐予我们的。
【转】使用Xcode 6将你的项目本地化的更多相关文章
- 使用Xcode、Android Studio将项目链接到Git
一.使用Android Studio创建本地git仓库: 1.检查本地git环境:在Android Studio中setting-->Version Control 点击Test按钮,提示suc ...
- 解决Xcode 6 编译Cocos2d-x iOS项目失败
在Xcode 6 beta里编译Cocos2d-x iOS项目时可能会失败,提示如下错误: Undefined symbols for architecture i386: "_fwrite ...
- [Swift实际操作]九、完整实例-(2)在Xcode 10中创建新项目
本文将在Xcode中创建上一文<在iTunesConnect网站中创建产品>在iTunes Connect创建的产品具有相同的Bundle ID的应用程序. 在项目模板窗口中,选择单视图模 ...
- 新版Xcode无法新建iOS空项目解决方案
--感谢同学分享-- 操作说明: 拷贝Empty Application.xctemplate文件夹至 /Contents/Developer/Platforms/iPhoneOS.platfor ...
- 关于 从别人电脑上 高版本的 Xcode上拷贝过来的项目的 不能运行模拟器的 解决方法
如图 从别人电脑上 拷贝过来的 工程 打开后 点击 iOS Device 只有 一个选项 没有模拟器.这说明 自己的 Xcode 的版本比 创建这个工程所用的版本低.所以 要睇啊你tar ...
- remove xcode recent projects from dock menu 移除xcode dock菜单显示的项目列表
Launch Xcode Select File->Open Recent->Clear Menu Right-click the Xcode icon and select Show A ...
- XCode iOS之应用程序标题本地化
1.XCode项目中创建一个.strings 扩展名的文件:打开File > New > File,选择Resource中Strings Fils,如图:点击下一步,为文件命名为(强烈建议 ...
- 我收录整理的优秀OC技术类文章
自定义导航按钮UIBarButtonItem 关于导航栏的六个小技巧 ios开发的一些小技巧篇一 制作一个可以滑动操作的 Table View Cell - IOS - 伯乐在线 一个 ...
- 不修改Xcode项目加载Reveal
关 于iOS UI调试工具Reveal的配置,很多初学者朋友可能在网上搜索到一些文章,这些文章大部分都是讲述了如何通过配置Xcode项目,通过加入一些库文件, 并且在程序中编写额外的代码来调用Reve ...
随机推荐
- SAP 质检使用非物料基本单位
今天也是奇葩了,物料A基本单位平方米,转化单位卷,销售和采购是按照平方米来采购,但是质检的需要按照平方米来做抽样检验.... 程序开发的: 修改该物料的工序基本单位为卷,再修改检验计划基本单位为卷 程 ...
- win7_oracle11g_64位连接32位PLSQL_Developer
工具/原料 已经装好的64位Oracle数据库 window7_64位的操作系统 PLSQL_Developer 9.0以上版本(目前只有32位的):下面有下载连接! 官方的 instantcli ...
- 理解squid的正向和反向代理
1.相同点: 访问的走向都是:客户端 -> 代理服务器 ->真实服务器 ->代理服务器->客户端 2.不同点:正向代理语义上更侧重于,让代理服务器去帮忙请求某个网址.让代理服务 ...
- qml的打包问题
qml2的打包问题: 相对于早期的项目,只需要打包plugin和动态库.带有sqlite的程序如果需要打包,需要打包如下东西: 1.打包AppData目录下的 Local/Qt Project/项目 ...
- GUID
前言 全局唯一标识符,简称GUID(发音为 /ˈɡuːɪd/或/ˈɡwɪd/),是一种由算法生成的唯一标识,通常表示成32个16进制数字(0-9,A-F)组成的字符串,如:{21EC2020-3AEA ...
- mapreduce job提交流程源码级分析(三)
mapreduce job提交流程源码级分析(二)(原创)这篇文章说到了jobSubmitClient.submitJob(jobId, submitJobDir.toString(), jobCop ...
- 数列F[19] + F[13]的值
已知数列如下:F[1]=1, F[2]=1, F[3]=5,......,F[n] =F[n-1] + 2*F[n-2],求F[19] + F[13]? #include <stdio.h> ...
- Redhat6.x下如何制作虚拟机快照和镜像封装
一.虚拟机快照 1.确认你的物理机上的vg还有足够的剩余空间 [root@hacker ~]# vgs VG #PV #LV #SN Attr VSize VFree vg_ ...
- “人少也能办大事”---K2 BPM老客户交流会
主题:固铂轮胎工作流项目分享-K2 SmartForm下的工作流快速开发 嘉宾:王彦(固铂轮胎IT资深经理) 国内业务规模越来越大,流程越来越复杂,跨部门跨组织的流程纸质审批非常复杂,内控的要求越来越 ...
- 《同一个类中不同方法之间的调用相关问题(省略的类名或者this)》
//同一个类中不同方法之间的调用相关问题(省略的类名或者this) class A { public void B() { System.out.println("b方法运行"); ...