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

  • 相关阅读:
    【幻化万千戏红尘】qianfeng-Android-Day20_LruCache
    【幻化万千戏红尘】qianfeng-Android-Day20_Bitmap二次采样
    【幻化万千戏红尘】qianfeng-Android-Day20_Handler_Looper_MessageQueue
    【幻化万千戏红尘】qianfeng-Android-Day19_导航栏制作
    【幻化万千戏红尘】qianfeng-Android-Day18_Fragment
    【幻化万千戏红尘】qianfeng-Android-Day17_ViewPager
    【幻化万千戏红尘】qianfeng-Android-Day16动画
    【幻化万千戏红尘】qianfeng-Android-Day13_SQLiteOpenHelper
    【幻化万千戏红尘】qianfeng-Android-Day13_SQLiteDataBases
    【幻化万千戏红尘】qianfeng-Android-Day12SharedPreference、内部存储、外部存储
  • 原文地址:https://www.cnblogs.com/zhanglinfeng/p/7468666.html
Copyright © 2011-2022 走看看