iOS开发那些事-iOS应用本地化-文本信息本地化
文本信息本地化在本地化工作中占有很大的比例。包括了:应用名称本地化、系统按钮和信息本地化,以及静态文本信息本地化。
系统按钮和信息本地化
还记得天气预报应用背后的“完成”按钮吗,它在中文环境下是“完成”,在英语环境下是“Done”。
还有一些系统给我们的提示信息,连接蓝牙设备时的系统提示。它在中文环境下是中文提示,在英语环境下是英文提示。
系统按钮上的文本和系统提示信息的文字我们都是不能修改的,但是如果我们不进行本地化的设置,即便是这些基本信息也一直都是英文显示。我们可以尝试在故事板中创建画面,在导航栏中放置两个系统按钮Done和Edit。然后分别在英文和中文环境下运行看看是否有变化。
事实上,它们一直都没有变化,这是什么原因?原因在于我们没有对工程本进行地化设置,打开工程中的PROJECT选择L10N,点击Localizations下面“+”,弹出菜单选择“Chinese(zh-Hans)”,这样就添加了简体中文本地化文件。
这样我们的工程就同时支持中文和英文的本地化了,系统按钮和提示信息等也都已经实现本地化了,这个过程不需要编写代码。
应用名称本地化
应用程序名称本地化是一个很重要的问题,左图是中文语言环境下的iPod touch桌面,右图是英文语言环境下的iPod touch桌面。我们会看到日历、地图、股市等几个应用名称都有本地化。
我 们要编写一个应用它的英文名是:“Localization”,中文名是:“本地化”。打开工程L10N应用,找到工程中的L10N- Info.plist文件,该文件是工程属性文件,应用程序名称就是在这个文件中定义的,但是我们不能在这里本地化,要想本地化必须借助于另一个文件 InfoPlist.strings,InfoPlist.strings是可以本地化的。在上一节系统按钮和信息本地化 后,InfoPlist.strings下面会有两个文件:InfoPlist.strings(English)和 InfoPlist.strings(Chinese)。打开Finder看到en.lproj和zh-Hans.lproj,它们的目录结构如下:
├── en.lproj
│ ├── InfoPlist.strings
│ └── MainStoryboard.storyboard
└── zh-Hans.lproj
├── InfoPlist.strings
└── MainStoryboard.storyboard
CFBundleDisplayName和CFBundleName的键能够配置应用名字,CFBundleDisplayName键配置应用显示的名字。CFBundleName配置应用短名字,不超过16字符,显示菜单栏和应用窗口信息中。
InfoPlist.strings(Chinese)文件的内容如下:
CFBundleDisplayName="本地化";
CFBundleName="本地化";
InfoPlist.strings(English)文件的内容如下:
CFBundleDisplayName="Localization";
CFBundleName="L10N";
运行结果,图标下文字显示的是CFBundleDisplayName键配置的名字。
程序代码输出的静态文本本地化
应 用中的静态文本都应该实现本地化,但是它们可能是通过程序代码输出,也可能是通过IB在nib或故事板设计输出的。采用 “Tabbed Application”工程模板创建的标签应用程序,它的两个标签上的标题First和Second,以及画面中的文字都属于静态文 本。
同 样都是这个工程如果在创建过程中分别创建基于故事板和nib技术的两个版本,故事板版本的两个标签上的标题是通过IB在编写在故事板文件中的(关于故事板 和nib中静态文本的本地化我们会在下一节介绍)。但在nib版本中两个标签上的标题通过程序代码输出的。FirstViewController.m中 的构造方法:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSLocalizedString(@"First", @"First");
self.tabBarItem.image = [UIImage imageNamed:@"first"];
}
return self;
}
SecondViewController.m中的构造方法:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSLocalizedString(@"Second", @"Second");
self.tabBarItem.image = [UIImage imageNamed:@"second"];
}
return self;
}
在 这个两个构造方法中设置标题属性的时候使用了NSLocalizedString宏,NSLocalizedString宏本质上是调用NSBundle 的localizedStringForKey:value:table:方法,NSLocalizedString是从默认字符串资源文件 (Localizable.strings)中取出本地化的字符串。
字符串资源文件默认命名为Localizable.strings,文 件采用UTF-16编码。如果静态文本不是很多可以自己创建Localizable.strings文件。选择“Supporting Files”组, 打开菜单File→New→File…,选择iOS→Resource→String File,输入文件名 “Localizable.strings”。
选择文件Localizable.strings打开文件显示检查器,点击Localization中的“Make localized”按钮,这可以帮助我们创建本地化的Localizable.strings文件。
点击“Make localized”按钮弹出一个选择本地化语言的对话框。我们可以选择English,然后点击Localize按钮。
然后再按照事实上,添加简体中文本地化文件
英文版中Localizable.strings文件中添加内容:
/* First */
"First" = "First";
/* Second */
"Second" = "Second";
中文版中Localizable.strings文件中添加内容:
/* First */
"First" = "第一";
/* Second */
"Second" = "第二";
使用genstring工具
但是有的时候字符串很多,提取和编写起来很麻烦,此时我们可以借助于命令行工具genstring,从m或mm文件中扫描下面宏,并取出字符串输出到本地化文件中。
CFCopyLocalizedString
CFCopyLocalizedStringFromTable
CFCopyLocalizedStringFromTableInBundle
CFCopyLocalizedStringWithDefaultValue
NSLocalizedString
NSLocalizedStringFromTable
NSLocalizedStringFromTableInBundle
NSLocalizedStringWithDefaultValue
CF 开头宏和NS开头宏两两对应,NS开头宏是Foundation 框架是基于Objective-C语言的,CF开头宏是 Core Foundation 框架是基于c语言的。NSLocalizedStringFromTable和 NSLocalizedStringFromTableInBundle函数是在自定义字符串资源文件名时使用。
下面是genstrings命名的基本语法:
genstrings [-a] [-q] [-o <outputDir>] sourcefile
其中参数:
-a 在存在的文件后面追加内容
-q 关闭多个键/值对的警告
-o 指定输出目录
因此如果我们想输出到en.lproj目录,则代码如下:
genstrings -o en.lproj *.m
这样就在en.lproj目录下面产生了Localizable.strings文件,需要注意的是上面的命令每次运行的时候都会覆盖Localizable.strings文件,如果内容不想覆盖可以使用-a参数,然后在文件中进行修改。
iOS开发那些事-iOS应用本地化-文本信息本地化的更多相关文章
- iOS开发那些事-iOS应用本地化-资源文件本地化
资源文件包括:图片文件.音频文件以及前文提到的Localizable.strings等文件,它们的特点是都是随着应用一起打包发布.但就本地化而言无论是图片文件还是音频文件都必须实现的步骤都是类似的,因 ...
- 给iOS开发新手送点福利,简述文本属性Attributes的用法
给iOS开发新手送点福利,简述文本属性Attributes的用法 文本属性Attributes 1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSF ...
- iOS开发UI篇—IOS开发中Xcode的一些使用技巧
iOS开发UI篇—IOS开发中Xcode的一些使用技巧 一.快捷键的使用 经常用到的快捷键如下: 新建 shift + cmd + n 新建项目 cmd + n 新建文 ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)
iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...
- iOS开发UI篇—ios应用数据存储方式(偏好设置)
iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...
- iOS开发UI篇—ios应用数据存储方式(归档)
iOS开发UI篇—ios应用数据存储方式(归档) 一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同 ...
- iOS开发UI篇—ios应用数据存储方式(归档) :转发
本文转发至:文顶顶http://www.cnblogs.com/wendingding/p/3775293.html iOS开发UI篇—ios应用数据存储方式(归档) 一.简单说明 在使用plist ...
- iOS开发——基础篇——iOS开发 Xcode8中遇到的问题及改动
iOS开发 Xcode8中遇到的问题及改动 新版本发布总会有很多坑,也会有很多改动. 一个一个填吧... 一.遇到的问题 1.权限以及相关设置 iOS10系统下调用系统相册.相机功能,或者苹果健康 ...
随机推荐
- VK Cup 2012 Qualification Round 1 C. Cd and pwd commands 模拟
C. Cd and pwd commands Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset ...
- Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面
Citrix 服务器虚拟化之二十七 XenApp6.5发布服务器桌面 XenApp可发布以下类型的资源向用户提供信息访问,这些资源可在服务器或桌面上虚拟化: 1) 服务器桌面:发布场中服务器的整个 ...
- hdu1498 50 years, 50 colors --- 最小点覆盖
给一个矩阵,里面有一些不同颜色的气球.每次能够消灭一行或一列中某一种颜色的气球,问你在k次及以内,有哪些颜色的气球是不管怎样也消不完的. 那么思路就是,对每一种颜色的气球求最小点覆盖.>k 则为 ...
- iOS开发——动画总结OC篇&所有常用动画总结
所有常用动画总结 先来装下B,看不懂没关系,其实我也看不懂-
- 内存管理和@property的属性
内存管理和@property的属性 目录 对内存管理的理解 Objective C内存管理方式 内存的管理 对象的所有权和内存管理原则 合理解决内存管理带来的问题 自动释放池 @property的属性 ...
- 虚拟机Linux和Windows之间互传文件的好帮手WinSCP
WinSCP下载地址:http://download.pchome.net/internet/ftp/down-34064-1.html 安装很简单,这里就不做介绍.下面是启动后的界面: 在主机名(H ...
- 重置kafka的offset
如果你在使用Kafka来分发消息,在数据处理的过程中可能会出现处理程序出异常或者是其它的错误,会造成数据丢失或不一致.这个时候你也许会想要通过kafka把数据从新处理一遍,我们知道kafka默认会在磁 ...
- The Socket API, Part 5: SCTP
转:http://www.linuxforu.com/2011/12/socket-api-part-5-sctp/ By Pankaj Tanwar on December 29, 2011 in ...
- E - 娜娜梦游仙境系列——莫名其妙的插曲
E - 娜娜梦游仙境系列——莫名其妙的插曲 E - 娜娜梦游仙境系列——莫名其妙的插曲 Time Limit: 2000/1000MS (Java/Others) Memory Limit: 1 ...
- structs 2 学习总结(一)
转发请注明出处 1.页面传值. 传值 前台 <s:form action="login1">//action 名字 需要在structs配置 用户<s:tex ...