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";

  中文文件中加代码

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

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

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

四、Storyboard或XIB国际化

先将中文版或英文版中一个做好后,再进行国际化,这样会省事很多,我这里先做好了中文版。

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

展开storyboard文件如下图

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

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

这时候你就可以在.storyboard文件文件上直观的改你需要改的语言。

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

1.方式1

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

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

2.方式2

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

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

六、应用内切换语言

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

//自动跟随系统
- (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 {
    [[NSUserDefaults standardUserDefaults] setObject:@[language] forKey:@"AppleLanguages"];
    [NSBundle setMainBundelLanguage:language];
    NSBundle * currentMainBundel = [NSBundle getCurrentMainBundel];

    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中,代码如下

#import "NSBundle+LF.h"
#import <objc/runtime.h>

static const NSString *_bundlekey = @"_bundlekey";

@interface BundleEx : NSBundle

@end

@implementation BundleEx

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName {
    NSBundle *bundle = objc_getAssociatedObject(self, &_bundlekey);
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}

@end

@implementation NSBundle (LF)

+ (void)setMainBundelLanguage:(NSString *)language {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        object_setClass([NSBundle mainBundle], [BundleEx class]);
    });

    objc_setAssociatedObject([NSBundle mainBundle], &_bundlekey, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

+ (NSBundle *)getCurrentMainBundel {
    NSString * currentLanguage = [[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"][0];
    NSString *path = [[ NSBundle mainBundle ] pathForResource:currentLanguage ofType:@"lproj" ];
    NSBundle * current = [NSBundle bundleWithPath:path];
    return current;
}

@end

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

不知不觉写到天亮了,未完待续

时间: 2024-12-05 01:58:37

iOS 国际化最新最全教程+如何快速国际化一个现成APP的相关文章

IOS开发之国际化篇第二章:文本信息国际化

本文是以XCode7.2.1为开发平台 在第一章中,我们基本了解了国际化是怎么一会事,介绍到有3种国际化,接下来的几章就会分别介绍这3种国际化,第一个是文本信息国际化 文本信息国际化包含一下几点 系统按钮和信息国际化 应用名称国际化 程序代码中输出的静态文本国际化 -系统按钮和信息国际化 系统本身会自带一些系统的信息,系统按钮等,这一些系统自带的信息提示,按钮文本都是由Cocoa本身自带的,他们都是统一又系统管理,例如Done在英文环境中是Done,还有系统提示信息,如下图,在不同语言环境系统会

OpenCV On Android环境配置最新&amp;最全指南(Eclipse篇)

简介 本教程是经过本人多次踩坑,并参考网上众多OpenCV On Android的配置教程总结而来,尽希望能帮助学习移动图像处理的朋友们少走弯路.这也是本人第一次在简书上发布文章,如有不足,希望各位dalao能够指正,我也将及时修改.配置上如果遇到问题,也可以在评论里留言,我将尽力帮助解决.如有转载,请标明出处http://www.jianshu.com/p/b260ebb1c180.如果您使用的是android studio,请参考下一章OpenCV On Android环境配置最新&最全指南

OpenCV On Android环境配置最新&amp;最全指南(Android Studio篇)

本文是从本人简书上搬运而来,属本人原创,如有转载,请注明出处:http://www.jianshu.com/p/6e16c0429044 简介 本文是<OpenCV On Android环境配置最新&最全指南>系列教程第二篇,也是配置教程的最后一篇.通过对android Studio里opencv环境配置讲解,快速帮新人解决入门配置问题. 本文内容是本人经过多次踩坑,并参考网上众多OpenCV On Android的配置教程总结而来,尽希望能帮助学习移动图像处理的朋友们少走弯路,如有转

Docker最全教程——从理论到实战(六)

原文:Docker最全教程--从理论到实战(六) 托管到腾讯云容器服务 托管到腾讯云容器服务,我们的公众号“magiccodes”已经发布了相关的录屏教程,大家可以结合本篇教程一起查阅. 自建还是托管? 在开始之前,我们先来讨论一个问题——是自建容器服务还是托管到云容器服务? 这里笔者建议大家托管到云容器服务.对于中小团队来说,很多情况下,团队中的运维人员是缺失的,或者运维人员的水平非常有限——大部分比网吧的网管就好那么一点,从成本.安全(云端产品往往提供了一些解决方案,比如权限控制.灾备.高可

Docker最全教程——从理论到实战(三)

原文:Docker最全教程--从理论到实战(三) 往期链接: https://www.cnblogs.com/codelove/p/10030439.html https://www.cnblogs.com/codelove/p/10036608.html 写在前面 容器是应用走向云端之后必然的发展趋势,因此笔者非常乐于和大家分享我们这段时间对容器的理解.心得和实践. 本教程持续编写了2个星期左右并且一直在完善.补充具体的细节和实践,预计全部完成需要1到2个月的时间.由于编写的过程中极其费时,并

iOS 面试常见问题最全梳理

序言 目前形势,参加到iOS队伍的人是越来越多,甚至已经到供过于求了.今年,找过工作人可能会更深刻地体会到今年的就业形势不容乐观,加之,培训机构一火车地向用人单位输送iOS开发人员,打破了生态圈的动态平衡.矫情一下,言归正传,我奉献一下,为iOS应聘者梳理一下面试题,希望能助一臂之力! OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错的编程语言,

Spring_MVC_教程_快速入门_深入分析

Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门 资源下载: Spring_MVC_教程_快速入门_深入分析V1.1.pdf SpringMVC核心配置文件示例.rar 作者:赵磊 博客:http://elf8848.iteye.com 目录 一.前言 二.spring mvc 核心类与接口 三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明

最新phpstudy2016安装教程及流程

最新phpstudy2016安装教程及流程,帮助站长快速搭建网站服务器平台! phpstudy软件简介 该程序包集成最新的Apache+Nginx+LightTPD+PHP+MySQL+phpMyAdmin+Zend Optimizer+Zend Loader,一次性安装,无须配置即可使用,是非常方便.好用的PHP调试环境.该程序绿色小巧简易迷你仅有32M,有专门的控制面板.总之学习PHP只需一个包. 最新版本,完美支持win10服务器,贿支持自定义php版本.对学习PHP的新手来说,WINDO

PHPCMS V9轻松完成WAP手机网站搭建全教程

---恢复内容开始--- 应用PHPCMS V9轻松完成WAP手机网站搭建全教程 用PHPCMS最新发布的V9搭建了PHPCMS研究中心网站(http://www.17huiyi.net)完成后,有用户提出手机访问的问题,于是着手搭建WAP无线站(m.17huiyi.net). 用PHPCMS V9完成wap搭建需要以下几步: 第一步:域名解析并建站 进入域名管理,建立A记录,解析至相应的IP地址,比如将m.17huiyi.net 解析至202.165.183.12 ,在WEB服务设置中(IIS