• 前言

    • 语言本地化,又叫做语言国际化。
    • 是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言。
    • 往往一些应用程序需要提供给多个国家的人群使用,或者一个国家有多种语言,这就要求应用程序所展示的文字、图片等信息,能够让讲不同语言的用户读懂、看懂。
    • 进而提出为同一个应用程序适配多种语言,也即是国际化。
    • 语言国际化之所以又叫做语言本地化,这是站在每个用户的角度而言的,是指能够让用户本地、本土人群能够看懂的语言信息,顾名思义,语言本地化。其实语言本地化 == 语言国际化!

1、前期准备配置需要国际化的语言

  • 简体、繁体相互转换

  • 配置需要国际化的语言,这也是国际化之前的准备工作,无论我们是国际化App名称、代码中的字符串、图片、还是storyboard和xib,都需要进行这一步的准备工作(一个项目中需要且仅需要配置一次)。
  • 选中project->Info->Localizations,然后点击"+",添加需要国际化/本地化的语言,如下图(默认需要勾选Use Base Internationalization):

  • 此处以添加法语为例,如下图:

  • 弹出如下对话框,直接点击finish,如下图:

  • 同理,添加简体中文、繁体中文、韩语,最终结果如下图:

  • 备注: “zh-Hans”和“zh-Hant”是简体中文和繁体中文的缩写。这是标准的缩写。H可大写也可小写。"en"是英语的缩写。ko是韩语的缩写,fr是法语的缩写。其他语言请百度各国语言缩写即可查询。

2、各种国际化

3、查看/切换本地语言

  • 原理:应用启动时,首先会读取NSUserDefaults中的key为AppleLanguages对应的value,该value是一个String数组,也就是说,我们访问这个名为AppleLanguages的key可以返回一个string数组,该数组存储着APP支持的语言列表,数组的第一项为APP当前默认的语言。
  • 方法一直接代码获取:
	/************** 方法一直接代码获取:*****************************/
#import "ViewController.h" @interface ViewController ()
@end @implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad]; NSArray *languages = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
NSString *currentLanguage = languages.firstObject;
NSLog(@"模拟器当前语言:%@",currentLanguage);
}
@end /************** 方法二宏定义获取:*****************************/
#define CurrentLanguage ([NSLocale preferredLanguages] objectAtIndex:0])
  • 控制台打印结果:

  • 同理,既然我们可以通过AppleLanguages这个key从NSUserDefaults中取出语言数组,那么我们也可以给AppleLanguages这个key赋值来达到切换本地语言的效果,从此以后,我们就无需频繁的去模拟器的设置->通用->语言与地区 中切换语言。

	#import "ViewController.h"

	@interface ViewController ()

	@end

	@implementation ViewController

	- (void)viewDidLoad {
[super viewDidLoad]; // 切换语言前
NSArray *langArr1 = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
NSString *language1 = langArr1.firstObject;
NSLog(@"模拟器语言切换之前:%@",language1); // 切换语言
NSArray *lans = @[@"en"];
[[NSUserDefaults standardUserDefaults] setObject:lans forKey:@"AppleLanguages"]; // 切换语言后
NSArray *langArr2 = [[NSUserDefaults standardUserDefaults] valueForKey:@"AppleLanguages"];
NSString *language2 = langArr2.firstObject;
NSLog(@"模拟器语言切换之后:%@",language2);
}
@end
  • 回想一下,我在上面的技巧一节中提过:切换语言无需在模拟器中设置,只需要在Xcode中进行如下设置: Edit->Scheme->Run->Arguments Passed On Launch ->-AppleLanguages (语言代码)。其实本质上就是给NSUserDefaults中名为AppleLanguages的key赋值。

4、获取国际化文字

  • getTranslatedText.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*- import os
import re ########################################### 文件需求设置 #################################################
# ================== 需求修改 ================== #
# 运行环境:python3 # 需要获取翻译文本的文件所在文件夹
main_dirPath = "/Users/lelight/Desktop/桌面文件/工作中/铭浩蓝牙WiFi"
# 需要翻译的文本输出地址:文件不存在自动创建
destop = '/Users/lelight/Desktop/untitled'
########################################### 共用数据类目 #################################################
m_fileType = '.m'
h_fileType = '.h' def all_path(dirname): result = [] # 所有的文件 for maindir, subdir, file_name_list in os.walk(dirname):
# print("1:",maindir) # 当前主目录
# print("2:",subdir) # 当前主目录下的所有目录
# print("3:",file_name_list) # 当前主目录下的所有文件
for filename in file_name_list:
if filename.endswith(h_fileType) or filename.endswith(m_fileType):
apath = os.path.join(maindir, filename) # 合并成一个完整路径
result.append(apath) return result def is_contain_chinese(check_str):
"""
判断字符串中是否包含中文
:param check_str: {str} 需要检测的字符串
:return: {bool} 包含返回True, 不包含返回False
"""
for ch in check_str:
if u'\u4e00' <= ch <= u'\u9fff':
return True
return False """
替换文件中的字符串
:param file: 文件名
:param old_str:旧字符串
:return:
"""
def repleceFileStr(file): file_data = ""
chiese = []
old_str = '@"'
with open(file, "r", encoding = "utf-8") as f:
for line in f:
objectArray = re.findall(old_str,line,flags=re.IGNORECASE)
if len(objectArray) > 0:
for objectStr in objectArray:
index = line.index(old_str)
if index > 4:
myLocal = line[index - 4:index]
line = line[index + 2:]
if myLocal == 'Log(':
continue if is_contain_chinese(line):
# print('====' + line + '\n')
print(line)
if '"' in line:
index = line.index('"')
chiese.append(line[:index])
dep = ''
for Chinese in chiese:
dep += Chinese + '\n'
with open(destop, 'a+', encoding = "utf-8") as f:
f.write(dep) #加\n换行显示 def reNameFileContentStr():
for dirName in all_path(main_dirPath):
repleceFileStr(dirName) reNameFileContentStr() with open(destop, "r", encoding = "utf-8") as f:
duplicateRemoval = []
for line in f:
duplicateRemoval.append(line)
duplicateRemoval = list(set(duplicateRemoval))
allStr = ''
for result in duplicateRemoval:
if is_contain_chinese(result):
allStr += result with open(destop, "w", encoding = "utf-8") as f:
f.write(allStr) #加\n换行显示

3分钟实现iOS语言本地化/国际化(图文详解)的更多相关文章

  1. 【转】iOS申请发布证书-图文详解

    摘要 发布产品到App Store所需证书,2013年5月26日测试 IOS 发布证书 distribution 打包程序 真机调试证书 本文讲述发布证书的申请,申请真机调试证书请参考:http:// ...

  2. iOS - 实现语言本地化/国际化

      实现iOS语言本地化/国际化(图文详解) 前言 语言本地化,又叫做语言国际化.是指根据用户操作系统的语言设置,自动将应用程序的语言设置为和用户操作系统语言一致的语言.往往一些应用程序需要提供给多个 ...

  3. 全网最全的Windows下Anaconda2 / Anaconda3里Python语言实现定时发送微信消息给好友或群里(图文详解)

    不多说,直接上干货! 缘由: (1)最近看到情侣零点送祝福,感觉还是很浪漫的事情,相信有很多人熬夜为了给爱的人送上零点祝福,但是有时等着等着就睡着了或者时间并不是卡的那么准就有点强迫症了,这是也许程序 ...

  4. Windows-009-Win7 操作系统安装图文详解

    此文主要讲述 Win7 操作系统的安装,配以详细的图文介绍,希望能对亲有所帮助,若有不足之处,敬请大神指正,不胜感激! 若是亲在虚拟机(VirtualBox)中安装 Win7,其前期虚拟硬件系统的操作 ...

  5. DELL R720服务器安装Windows Server 2008 R2 操作系统图文详解

    DELL R720服务器安装Windows Server 2008 R2 操作系统图文详解 说明:此文章中部分图片为网络搜集,所以不一定为DELL R720服务器安装界面,但可保证界面内容接近DELL ...

  6. 全网最详细的大数据集群环境下如何正确安装并配置多个不同版本的Cloudera Hue(图文详解)

    不多说,直接上干货! 为什么要写这么一篇博文呢? 是因为啊,对于Hue不同版本之间,其实,差异还是相对来说有点大的,具体,大家在使用的时候亲身体会就知道了,比如一些提示和界面. 全网最详细的大数据集群 ...

  7. MyEclipse *的安装步骤和破解(32位和64位皆适用)(图文详解)

    不多说,直接上干货! MyEclipse *的下载, 见 http://www.cnblogs.com/zlslch/p/5658195.html 简单说下, MyEclipse自己会带一个JDK,它 ...

  8. 分区助手里如何从临近盘(如D盘)抽取一定的空间给已经快满了的盘(如E盘)(博主推荐)(图文详解)

    不多说,直接上干货! 分区助手是什么?(博主推荐)(图文详解) 分区助手各版本比较(图文详解) 分区助手官网使用教程(专业版.绿色版和WinPE版)(图文详解) 安装分区助手时出现“分区助手已安装到你 ...

  9. java.util.ResourceBundle国际化用法详解

    java.util.ResourceBundle国际化用法详解 初识国际化和ResourceBundle 这个类主要用来解决国际化和本地化问题.国际化和本地化可不是两个概念,两者都是一起出现的.可以说 ...

随机推荐

  1. Errors occurred during the build. Errors occurred during the build. Errors running builder 'JavaScript Validator' on XXX

    选择项目--右键Properties--Builders--如果有则取消第一项“JavaScript Validator”的勾. http://blog.csdn.net/error_case/art ...

  2. Redis的持久化机制

    持久化机制 RDB:快照模式AOF :日志模式 多数据库– 一个redis服务器内部默认有16个数据,编号О0-15– 默认操作是编号为0的数据库– 可以在命令行用select选择数据库127.0.0 ...

  3. MySQL 常用启动,关闭,登录脚本

    MySQL 常用启动,关闭,登录脚本 规范化mysql的启动,关闭,登录 1 cat mysql_env.ini #set env MYSQL_USER=system #注意用户权限 MYSQL_PA ...

  4. MySQL执行计划的讲解

    最近同事在执行线上执行一条MySQL的查询语句,数据的话在9000条左右,但使用左连接的时候查询速度大概在15秒左右~这速度确实是无法接受的~ 经过简单的修改,变为内连接的话,执行速度不到1秒. 下面 ...

  5. 数据库:ubantu下MySQL数据库备份方法

    1.编辑/etc/crontab文件设定定时任务,在制定时间执行backup_databases.sh vi /etc/crontab # /etc/crontab: system-wide cron ...

  6. Windows Backdoor Tips

    名称:在用户登录时,运行这些程序 位置: Computer Configuration\\Policies\\Administrative Templates\\System\\Logon\\ 中 d ...

  7. 1106SQLserver基础--变量、运算符的使用,if...else,while语句

    数据库---变量(对数据库中的数据没有任何影响) 作用:临时存储数据的作用,起一个衔接的作用,为了方便理解存储过程. 例:Declare @hello varchar(20) Set @hello=’ ...

  8. oracle错误-ORA-12519, TNS:no appropriate service handler found

    转自:https://blog.csdn.net/u013147600/article/details/48380841

  9. 关于contentprovider的几个问题

    说说ContentProvider与Android数据存储的关系? contentprovider是程序之间共享数据的唯一方式,android中没有公共数据区域的说法,每个进程启动都是不同的用户,与P ...

  10. day17 9.关闭资源与异常处理

    Java程序跟任何外部设备进行连接之后,都要把连接断开,把资源释放掉.Connection是一个重量级资源,Connecton占内存,Connection的获取是比较消耗资源和内存的.finally是 ...