zoukankan      html  css  js  c++  java
  • iOS 国际化最新最全教程+如何快速国际化一个现成APP

      同学面试时遇到一个问题,面试官问他,有一个现成的APP马上要上线了,怎么在不改原来代码,也不改xib、storyboard里的文字的情况下快速实现国际化。这里应同学请求写下此教程。反正国际化的步骤都要搞一遍,干脆写一个详细、全面的教程。

    一、配置国际化语言

    点击progect->info->localizations下的‘+’,选择你要支持的语言,默认支持英文,如下图

    二、应用名称国际化

      新建一个Strings File类型的文件,且名称必须为InfoPlist。

      选中刚刚新建的文件,在Xcode的右侧文件检查器中点击Localize,点击Localize后,会弹出一个对话框,展开对话框列表,选择我们需要本地化的语言如English,然后点击对话框的Localize按钮。

      再看Xcode右侧的File inspection变成了下图的样式,勾选需要支持的中文、英文,如下图

      你刚刚新建的InfoPlist.stirings左侧多了一个箭头,点击箭头可以展开,可以看到中文、英文两个文件。在英文文件中加一句代码

    CFBundleDisplayName = "LFInternationalizationDemo";

      在中文文件中加一句代码

    CFBundleDisplayName = "峰哥国际化示例";

      运行你的APP,查看APP名称,切换手机语言,再运行你的APP,查看APP名称。

    三、APP中文字国际化

      和应用名称国际化一样,新建一个Strings File类型的文件,不一样的是名称必须为Localizable。在Xcode的右侧文件检查器中点击Localize,然后跟上面步骤一样直到可以展开中、英文两个Localizable.strings。

      英文文件中加代码

    "账号" = "Account";
    "登录" = "Login";

      中文文件中加代码

    "账号" = "账号";
    "登录" = "登录";

      解释一下:冒号左边是key,右边是value,使用时我们用的是key,然后NSLocalizedString方法会翻译成对应的语言。由于进行国际化之前,APP是中文版,所以用中文作为key,为快速国际化打基础,否则做不了快速国际化。

      然后给label、button设置文字代码如下

    self.lbAccount.text = NSLocalizedString(@"账号", nil);
    [self.btLogin setTitle:NSLocalizedString(@"登录", nil) forState:UIControlStateNormal];

    四、Storyboard或XIB国际化

     先将中文版或英文版中一个开发完整后,再进行国际化,这样会省事很多,否则你要在多份storyboard或xib上开发。我这里先做好了中文版。

     选中storyboard,跟上面步骤一样,在Xcode的右侧文件检查器中勾选支持的语言,如下图

    展开storyboard文件如下图

    打开Main.strings(English),或Main.strings(Chiness),发现都是中文的。这时候你需要将Main.strings(English)中的中文改成英文。

    如果你觉得密密麻麻都是文字,分不清对应哪个控件上的文字。你可以将.strings文件变成.storyboard文件,像下图这样(不推荐

    这时候你就可以生成多个语言版本的.storyboard文件,可以直观的改你需要改的语言。不过我不推荐这样搞,因为一旦布局有改动,你要改多个.storyboard文件的布局,用Main.strings方便点,只需要关心文字,不需要关心布局

    五、图片、声音文件国际化

    1.方式1

      搞两套图片,一套英文命名,一套中文命名。然后跟文字国际化一样获取当前语言图片名字

    NSString *imageName = NSLocalizedString(@"icon", nil);
    UIImage *image = [UIImage imageNamed:imageName];
    self.imageView.image = image;

    2.方式2

      两套图片一样的名字,将其中一套图片拖到工程。选中一张图片,跟前面InfoPlist.stirings文件一样,在Xcode的右侧文件检查器中点击Localize,勾选需要支持的语言。然后,右击1@2x.png->show in Finder,我们发现在en.Iproj和zh-Hans.lproj文件中多了一个名为1@2x.png的图片。将这个图片换成对应语言的图片即可。

      声音文件跟图片一样、不说了。

     六、应用内切换语言

      到手机设置里切换语言太麻烦,我们可以做成应用内切换语言。

    //自动跟随系统
    - (IBAction)autoLanguage:(id)sender {
      //获取手机语言 NSString
    *phoneLanguage = [[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]; [self changeLanguage:phoneLanguage]; } - (IBAction)chiness:(id)sender { [self changeLanguage:@"zh-Hans"]; } - (IBAction)english:(id)sender { [self changeLanguage:@"en"]; } - (void)changeLanguage:(NSString *)language {
       //设置本app语言,注意key一定是@"AppleLanguages",即使下次启动APP,也是现在设置的这个语言。 [[NSUserDefaults standardUserDefaults] setObject:@[language] forKey:
    @"AppleLanguages"]; [NSBundle setMainBundelLanguage:language];

      //如果你的storyboard生成的多个语言的.storyboard文件,则获取当前storyboard的bundel如下 NSBundle
    * currentMainBundel = [NSBundle getCurrentMainBundel];
      //如果你的storyboard 生成的多个语言的Main.strings文件,则获取当前storyboard的bundel如下
      NSBundle * currentMainBundel = [NSBundle mainBundle];
    UIStoryboard
    *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:currentMainBundel]; MainTabBarController *tabbar = [storyboard instantiateViewControllerWithIdentifier:@"MainTabBarController"]; [UIApplication sharedApplication].keyWindow.rootViewController = tabbar; [[UIApplication sharedApplication].keyWindow makeKeyAndVisible]; }

      这里setMainBundelLanguage和getCurrentMainBundel两个方法是封装在 NSBundle 的 category中,这里不贴出代码了,后面会给出demo

    七、如何快速国际化一个现成APP

      篇幅太长就不贴代码了,这里讲下思路,具体代码后面会给出demo。

    1.代码中设置文字、设置图片的快速国际化

      前提条件:本教程第一步、第二步走完,本教程第三步生成了各语言版本的Localizable.strings后,按产品要求将需要翻译的文字按键值对格式写进各语言的Localizable.strings中。注意:如果现成的app是中文版,则key要是中文。

      思路就是利用runtime的交换方法,将label的 setText方法换成你的设置文字方法,在你的方法里先获取对应语言的文字,再赋值给label。你可以写一个UILabel的category,在category将系统的setText和你的设置文字方法交换。你原项目代码不需要做任何处理,连import这个category都不需要,即可快速国际化。图片快速国际化同理。

    2.storyboard或xib中设置文字、图片的快速国际化

      文字的国际化见第四步,只是有一点要注意,不要生成多个语言的.storyboard文件,应该生成Main.strings文件,如下图。打开Main.strings(English),或Main.strings(Chiness),发现都是中文的。这时候你需要将Main.strings(English)中的中文改成英文。

      图片的国际化见第五步的方式2。

    demo地址https://github.com/zhanglinfeng/LFInternationalizationDemo

  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/zhanglinfeng/p/7468666.html
Copyright © 2011-2022 走看看