iOS 本地化 国际化 相关的工具,命令,和可能遇到的问题

来源:互联网 发布:人工智能未来的发展 编辑:程序博客网 时间:2024/06/05 05:57
今天有个同事问了我一个关于IOS应用程序国际化的问题,当我准备给他讲解的时候,突然发现现在的Xcode做国际化跟以前的Xcode做国际化有点区别。所以自己再仔细研究了一下,写下来并将以前的日志更新,供大家一起学习。如有任何意见或建议请留言。

根据Xcode的版本,IOS程序的国际化分两种。

一:Xcode 4.5之后的版本
一般要对程序进行国际化,主要有三部分需要国际化。
  • 使用Base Internationalization来对用storyboard或xib创建的UI界面布局进行国际化。
  • 使用InfoPlist.strings文件来对应用程序的名称国际化。
  • 使用Localizable.strings文件来对应用程序中Code创建会使用的字符串进行国际化。

  1. Base Internationalization国际化
"Base Internationalization"是 Xcode 4.5 推出的一项功能,使用该功能,我们就不再需要为应用程序支持的每种语言修改我们的storyboard或xib文件了。而是在一个应用程序中,只有一组storyboard或xib文件会被本地化为默认语言,这些storyoard跟xib文件就称为Base Internationalization。当我们将本地化语言添加到某个应用程序中时,Xcode会生成一个包含所有文本的字符串文件,这些文件里面包含每个storyboard或xib文件中的空间显示的文本,或者辅助功能标签或提示信息。Xcode会以这个storyboard或xib的名称命名此文件,扩展名为strings。因此,MyStoryboard,storyboard生成的国际化文件为MyStoryboard.strings。

注意:我们使用这个应该要Use AutoLayout。

其实当我们创建一个project后,默认我们就使用的English语言,这个是Xcode创建时的默认语言。并且
MainStoryboard_iPhone.storyboard, MainStoryboard_iPad.storyboard这个两个已经被localized成了English。

iOS 国际化 - Ian - Ians blog

在 Xcode 中,选择 HelloWorld 项目,并显示“Info”面板。
iOS 国际化 - Ian - Ians blog

选择“Localizations”表格下方的“Use Base Internationalization”选项。

Xcode 显示一张表单,要求您选择要用于“Base Internationalization”的storyboard。(在选择这个选项之前你可以先将storyboard都先点击打开看看,有的时候表单中没有列出他们,只要点击打开过就会列出来了。这可能是xcode的bug吧;如果创建失败就重启下xcode然后再试试吧。)

iOS 国际化 - Ian - Ians blog
 
 当您请求某个“Base Internationalization”时,Xcode 会将另一个文件夹添加到项目。如果在 Finder 中查看项目文件,您将看到一个名
为 Base.lprojde 的文件夹和另一个名为 en.lprojde 的文件夹(用于英文本地化)。第一个文件夹中的是串联图文件;第二个文件夹中的是InfoPlist.strings 文件。
iOS 国际化 - Ian - Ians blog

 iOS 国际化 - Ian - Ians blog
在完成此项任务后,Xcode 会更新左边的列表,以显示新的本地化语言。点击 MainStoryboard.storyboard 旁边的展示三角形,以显示这些文件的基本(英文)和简体中文本地化。
iOS 国际化 - Ian - Ians blog

上面你可以看到变成每一种语言都有一套Storyboard。其实,我们也可以将这些Storyboard改成.strings文件。
iOS 国际化 - Ian - Ians blogiOS 国际化 - Ian - Ians blogiOS 国际化 - Ian - Ians blog

更改之后就会变成是文件形式的,这两种都是可以直接互相转换的。
iOS 国际化 - Ian - Ians blog

 我们可以看到MainStoryboard.strings文件里面的内容。对于Storyboard中的每一个字符串,Xcode将文件显示对象标识符的键、句点(.)和指定给改字符串的属性连接起来。

/* Class = "IBUITextField"; accessibilityHint = "Type your name"; ObjectID = "PzI-FE-QQF"; */
"PzI-FE-QQF.accessibilityHint" = "Type your name";

/* Class = "IBUITextField"; placeholder = "Your Name"; ObjectID = "PzI-FE-QQF"; */
"PzI-FE-QQF.placeholder" = "Your Name";

/* Class = "IBUIButton"; normalTitle = "Hello"; ObjectID = "fYK-eX-amY"; */
"fYK-eX-amY.normalTitle" = "Hello";
当我们在对MainStoryboard.strings文件做国际化的时候,有可能Storyboard中有很多个IBUIButton,这样我们是通过ObjectID来识别每一个button的。
iOS 国际化 - Ian - Ians blog
 
2. InfoPlist.strings文件来对应用程序的名称国际化
    当我们需要对应用程序的名称及其他外在表现进行国际化时,我们一般使用InfoPlist.strings文件。Xcode在默认情况下会创建一个InfoPlist.strings。
  一般Info.plist里面的名称只是对外显示的display key,如果要在InfoPlist.strings里面对它进行设置时,需要使用它们的原始key。当我们需要查看原始的名称时,使用如下操作:
iOS 国际化 - Ian - Ians blog
 我们先选中InfoPlist.strings文件,此时它是一个空的单个文件,然后对它进行Localization。
iOS 国际化 - Ian - Ians blogiOS 国际化 - Ian - Ians blogiOS 国际化 - Ian - Ians blog

然后,我们在InfoPlist.strings(Chinese)里面添加配置。

/* The name of the app displayed on the device*/
CFBundleDisplayName = "您好,世界";


3.用Localizable.strings文件来对应用程序中Code创建会使用的字符串进行国际化
   当我们需要在Code中使用字符串显示时,我们也需要国际化显示的内容,如:alert。,此时我们就可以使用Localizable.strings文件来实现。
首先我们new一个strings文件,并命名为Localizable.strings, 然后我们对此文件进行Localization。
iOS 国际化 - Ian - Ians blogiOS 国际化 - Ian - Ians blogiOS 国际化 - Ian - Ians blog
 
然后,在Localizable.strings (Chinese) 文件中添加配置。

/* The string displayed */
"HELLO" = "您好,%@";

在程序中使用宏定义NSLocalizedString来从Localizable.strings文件获取当前本地化语言的本地化字符串。

NSString *greeting = [[NSString alloc] initWithFormat:NSLocalizedString(@"HELLO", @"The string displayed"), nameString];

该宏中的第一个参数,采用字符串文件中的一个键,第二个参数采用给本地化人员的注释。该宏会返回与用户首选语言相对应的本地化语言中键的值。您可能想知道此示例将给本地化人员的注释作为该宏的参数的原因;毕竟,您已经在 Localizable.strings 文件中,为英文和中文写了一则注释。

大型应用程序项目,通常使用名称为 genstringsde 的命令行程序,从该程序在代码中找到的信息生成一个字符串文件(默认情况下,该文件名称为 Localizable.strings)。该实用工具查找 NSLocalizedStringde 宏的每次调用,提取键(也是初始值)和注释,并将这些项目写入字符串文件。然后,您可以将该字符串文件,添加到项目中的每种本地化语言中,并翻译这些值。


有一种情况是当我们已经对Storyboard进行了国际化。此时如果我们又修改了此Storyboard,比如添加了其他的控件,此时MainStoryboard.strings文件与"Base Internationalization"文件的 MainStoryboard.strings就不同步了,我们同样需要对这些新添加的控件进行国际化。我们可以使用命令行工具ibtool,从"Base Internationalization"文件的 MainStoryboard.strings 生成新字符串文件,然后将该新字符串文件条目添加到现有的MainStoryboard.strings文件中。

  1. 启动“终端”应用程序。

    此应用程序位于“/应用程序/实用工具”中。

  2. 在“终端”的“Shell”中,连接到项目文件夹的 "Base.lprojde" 目录。

    例如:

    cd /Users/UserName/Projects/HelloWorld/HelloWorld/Base.lproj
  3. 在提示符后输入以下命令:

    ibtool MainStoryboard.storyboard --generate-strings-file NewStuff.strings

    可以给输出文件命名随您选取的任何名称(本示例是用 "NewStuff.strings")。

  4. 在 Xcode 中,打开生成的输出文件,并将新字符串文件条目(即“Your Name:”标签的注释和键-值对)拷贝到中文 "MainStoryboard.strings" 文件。

  5. 翻译新字符串值。


二:Xcode 4.5之前的版本(不变)

例如:依系统设定的语言自动奇幻适合的显示字符串
MultiLanguageDemo01.gif 
在Interface Builder设计时的界面

MultiLanguageDemo02.gif 
若系统设定为English则显示英文界面

MultiLanguageDemo03.gif 
若系统设定为繁体中文则显示为繁体中文界面


如何建立自定义的语系文件:
1.在
Resources分类下新增文件 [右键/Add/New File...]
2.在分类中选择Other后再选择 Strings File
MultiLanguageDemo04.gif 
3.将文件名设定为 Localizable.strings
MultiLanguageDemo05.gif 
4.在 Localizable.strings 檔案上按右鍵並選擇 Get Info
MultiLanguageDemo06.gif 
5.选择左下方的 Make File Localizable
MultiLanguageDemo07.gif 
6.将分页标签换至General
MultiLanguageDemo08.gif 
7.选择左下方的 Add Localization
MultiLanguageDemo09.gif 
8.输入新的语系名称 zh_TW 然后 Add
MultiLanguageDemo10.gif 
9.您会看到目前您设定了English及zh_TW两种语系
MultiLanguageDemo11.gif 
10.在文件清单中您将看到 Localizable Strings (English) 及 Localizable String (zh_TW)
MultiLanguageDemo12.gif 
11.开启后编辑预言字符串就可以啦,如下:
Localizable.strings (English)
  1. /* 
  2.    Localizable.strings
  3.    MultiLanguageDemo

  4.    Created by babyfish0226 on 2009/3/6.
  5.    Copyright 2009 __MyCompanyName__. All rights reserved.
  6. */

  7. "DemoTitle"="This is English Version";
  8. "String1"="Apple";
  9. "String2"="BAnana";
  10. "String3"="Orange";
  11. "String4"="Watermelon";
  12. "String5"="Strawberry";
Localizable.strings (zh_TW)
  1. /* 
  2.    Localizable.strings
  3.    MultiLanguageDemo

  4.    Created by babyfish0226 on 2009/3/6.
  5.    Copyright 2009 __MyCompanyName__. All rights reserved.
  6. */
  7. "DemoTitle"="這是繁體中文的版本";
  8. "String1"="蘋果";
  9. "String2"="香蕉";
  10. "String3"="橘子";
  11. "String4"="西瓜";
  12. "String5"="草莓";
MultiLanguageDemoViewController.h
  1. //
  2. //  MultiLanguageDemoViewController.h
  3. //  MultiLanguageDemo
  4. //
  5. //  Created by babyfish0226 on 2009/3/6.
  6. //  Copyright __MyCompanyName__ 2009. All rights reserved.
  7. //

  8. #import <UIKit/UIKit.h>

  9. @interface MultiLanguageDemoViewController : UIViewController {
  10.         IBOutlet UILabel *lbldemotitle;
  11.         IBOutlet UILabel *lblstr1;
  12.         IBOutlet UILabel *lblstr2;
  13.         IBOutlet UILabel *lblstr3;
  14.         IBOutlet UILabel *lblstr4;
  15.         IBOutlet UILabel *lblstr5;
  16. }

  17. @property (nonatomic,retain) UILabel *lbldemotitle;
  18. @property (nonatomic,retain) UILabel *lblstr1;
  19. @property (nonatomic,retain) UILabel *lblstr2;
  20. @property (nonatomic,retain) UILabel *lblstr3;
  21. @property (nonatomic,retain) UILabel *lblstr4;
  22. @property (nonatomic,retain) UILabel *lblstr5;

  23. @end
MultiLanguageDemoViewController.m
  1. #import "MultiLanguageDemoViewController.h"

  2. @implementation MultiLanguageDemoViewController

  3. @synthesize lbldemotitle,lblstr1,lblstr2,lblstr3,lblstr4,lblstr5;

  4. - (void)viewDidLoad {
  5.     [super viewDidLoad];
  6.         
  7.         //系統設定取得適合的多國語言字串
  8.         lbldemotitle.text=NSLocalizedString(@"DemoTitle",nil);
  9.         lblstr1.text= NSLocalizedString(@"String1",nil);
  10.         lblstr2.text=NSLocalizedString(@"String2",nil);
  11.         lblstr3.text=NSLocalizedString(@"String3",nil);
  12.         lblstr4.text=NSLocalizedString(@"String4",nil);
  13.         lblstr5.text=NSLocalizedString(@"String5",nil);        
  14. }
0 0
原创粉丝点击