iOS 开发中的国际化

1.普通的代码

许多软件需要支持多语言。
这就需要开发者在开发过程中小心的使用字符串。其中一个原则就是不要把字符串写在代码里。
下面的代码就是一种错误的写法。

// 错误的hardcode写法
NSString *str = @"This is wrong!";

苹果其实给了我们一个宏
NSLocalizedString(key, comment)

// 你应该使用NSLocalizedString(key, comment)
NSString *str = NSLocalizedString(@"key", @"comment")

那么,这个NSLocalizedString中的key和comment都是哪里来的呢?
实际上当工程在建立的时候会包含一个语言文件夹(.lproj)
比如简体中文就是zh-Hans.lproj文件夹,英文就是en.lproj。

在这些文件夹里有一个名叫Localizable.strings的文件,它实际上就是一个键-值对应的表。
内容大概会是这个样子的:
“key” = “string you want to display”;
“key2” = “string2 you want to display”;

如果你需要使你的工程支持多语言的功能,你并不需要手动建立这些文件夹,但是你需要建立第一个.string文件。

方法是:
1. 在你的工程中新建立一个文件并保存到默认语言的文件夹中。(file->new->file->resource->strings file)
注意,你必须把这个文件命名为Localizable.strings,除非你想自己指定string table

2. 假设默认语言是英文,那么把这个文件建立在(en.lproj)文件夹中。
3. 添加中文支持。
点击这个Localizable.strings文件,在屏幕右侧的属性栏中添加新语言(点击+号)。

4. 添加所有你需要添加的语言,你会发现这个Localizable.strings左边多出来了一个小三角。
实际apple帮你把这些strings分类好了,你的下一步工作就是编辑这些strings文件。

假设我们现在开始编辑Localizable.strings(English)
请尝试在里面输入如下代码

"key" = "This is ENGLISH language.";
// 多个键-值对以分号“;”分割

在编辑Localizable.strings(Chinese)(假设你建立了中文的strings file)
请尝试在里面输入如下代码

"key" = "这是中文语言";
// 多个键-值对以分号“;”分割

接下来的工作就简单了。
正如你看到了,所有的“key”后面都有一个相对的语言的字符串。
你需要做的就是在需要使用string的地方使用宏NSLocalizedString(@”key”, @”comment”)
比如你在工程里有一个button名叫button,那么你设置它title的方法应该想下面那样

// 设置按钮标题
[self.button setTitle:NSLocalizedString(@"key", @"comment or nil") forState:UIControlStateNormal];
// 注意,上面的key就是你在Localizable.strings文件中定义好的键-值
// 这样,在你重新设置设备语言之后,这个按钮就会根据语言编程不用的字符串
// 英文: This is ENGLISH language
// 中文: 这是中文语言

2. nib文件


code我们可以很轻松的搞定,但是如果你的工程里使用了nib文件亦或是stroyboard那就复杂了一些
有两种方法来解决这个问题
1. 你有多少种语言,就建立多少个nib文件(with different languages)。
2. 尽量使用IBOutlet。 比如你有一个按钮,那就你就做一个Outlet然后在代码里设置这个Outlet
的title。

《iOS 开发中的国际化》有2个想法

  1. In case the many weather normal water coursing into your handbag louis vuitton hurricane drainpipes are actually triggered fill up these lakes, we would have completed more than enough. handbag louis vuitton With regard to handbag louis vuitton today all of the rain that’s decreasing merely obtains varying in many of the dirt of which collections a empties.

发表评论

电子邮件地址不会被公开。 必填项已用*标注