iOS小技能:本地化(Internationalization & Localization)

2,529 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

引言

  1. 本地化(l10n)是应用程序在对两个或两个以上不同语言的适配,使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言。本地化不仅涉及更改语言交互,还涉及其他相关更改,例如数字,日期,货币等的显示。
  2. 国际化(i18n)是设计和构建应用程序以促进本地化的过程。

Localization is the process of translating your app into multiple languages. But before you can localize your app, you internationalize it. Internationalization is the process of making your app able to adapt to different languages, regions, and cultures. Because a single language can be used in multiple parts of the world, your app should adapt to the regional and cultural conventions of where a person resides. An internationalized app appears as if it is a native app in all the languages and regions it supports.

developer.apple.com/library/arc…

I 本地化

开发规范:始终把面向用户的字符串用 NSLocalizedString 包起来。

1.1 添加本地化功能

如果要添加本地化功能,需要为每种支持的语言创建一个子目录,称为”本地化文件夹”,通常使用.lproj作为拓展名。

在这里插入图片描述

当本地化的应用程序需要载入某一资源时,如图像、属性列表、nib文件,应用程序会检查用户的语言和地区,并查找相匹配的本地化文件夹。如果找到了相应的文件夹,就会载入这个文件夹中的资源。

NSLocale实例包含了针对这个地区内特定一群人的所有语言文化基准,其中包括:

  • 语言
  • 键盘
  • 数字、日期和时间格式
  • 货币
  • 排序和分类
  • 符号、颜色与头像的使用

每一个NSLocale实例对应着一个_地区标识符_,例如en_US,fr_FR,ja_JP和en_GB。

标识符包含一个语言码(例如en代表英语)和一个地区码,例如US代表美国。

1.2 字符串本地化

  1. 本地化字符串指定参数顺序

原理:在%和@中间加上数值(1(1,2$),数字代表参数的顺序 文章:blog.csdn.net/z929118967/…

  1. 【iOS APP 内的国际化切换】1、字符串的本地化、2、自定义解析本地化字符串的工具类LanguageManager、3、例子:登录界面切换中英文。

从CSDN下载【iOS APP 内的国际化切换】demo源码:download.csdn.net/download/u0…

文章:kunnan.blog.csdn.net/article/det… 原理: 1、自定义解析本地化字符串的工具类LanguageManager

2、应用内切换语言生效的技术实现:采用销毁根控制器,重新进入一次

3、本地化字符串指定参数顺序

划重点

1、字符串的本地化

2、自定义解析本地化字符串的工具类LanguageManager、

3、例子:登录界面切换中英文(内含demo)

应用内切换语言生效的技术实现:

1、销毁根控制器,重新进入一次(采用)

2、通过发通知,到各个控制器更新文字(不采用)

  • 效果

在这里插入图片描述 在这里插入图片描述

1.3 数字和时间格式本地化

使用NSDateFormatter和NSNumberFormatter时需要设置 NSLocale,这样做能确保日期、数字和货币能根据用户设置的地点信息显示正确的格式。

iOS小技能:时间格式化 https://blog.csdn.net/z929118967/article/details/124838767

- (NSDate*) dateFromString:(NSString*)stringTime dateformatter:(NSString*)dateformatter localeIdentifier:(NSString*)localeIdentifier {

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
#warning  真机调试,转换时间 需要设置 NSLocale
    NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];//zh_CN  en_US en_GB
    [formatter setLocale:usLocale];
    formatter.dateFormat = dateformatter;
    return  [formatter dateFromString:stringTime];
}
- (NSString*) stringFromDate:(NSDate*)date dateformatter:(NSString*)dateformatter localeIdentifier:(NSString*)localeIdentifier {

    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
#warning  真机调试,转换时间 需要设置 NSLocale
    NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];//zh_CN  en_US en_GB
    [formatter setLocale:usLocale];
    formatter.dateFormat = dateformatter;
    return  [formatter stringFromDate:date];
}

1.4 日期键盘本地化

            //1. 设置日期键盘类型
            UIDatePicker *datePicker = [[UIDatePicker alloc]init];
            [datePicker setDatePickerMode:UIDatePickerModeTime];
            NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"zh"];
            [datePicker setLocale:locale];//本地化
            //2. 设置日期格式
            NSDateFormatter *dateF = [[NSDateFormatter alloc]init];
                [dateF setLocale:locale];
            [dateF setDateFormat:@"HH:mm"];
            NSDate *date = [dateF  dateFromString:@"01:00"];//设置默认日期
            [datePicker setDate:date animated:YES];

———————————————— 版权声明:本文为CSDN博主「iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:blog.csdn.net/z929118967/…

1.5 nib本地化、图片本地化

nib本地化前的准备:先创建本地化文件夹(zh-Hans.lproj),让应用程序支持对应的语言环境,并选择选择当前需要本地化的资源

在这里插入图片描述

图片本地化的应用场景:不同的语言登录显示对应的图片

在这里插入图片描述

blog.csdn.net/z929118967/…

1.6 info.plist 的国际化

国际化app相关的权限弹框

在这里插入图片描述

blog.csdn.net/z929118967/…

II 本地化切换

2.1 一个语言对应多个字符串资源文件的方案

应用场景:解决部分英文国际化没有生效的问题

思路:存储国际化英文字符串的.string文件长度受限,需修改逻辑拆分子文件存储。

文章:blog.csdn.net/z929118967/…

2.2 选择相应的本地化资源

NSLocale +preferredLanguages会根据用户的偏好返回一个IETF BCP 47 语言标识符的字符串数组。可以用这些值来定义HTTP头里面的Accept-Language字段,服务器就能选择相应的本地化资。

[request setValue:[NSString stringWithFormat:@"%@", [[NSLocale preferredLanguages] componentsJoinedByString:@", "]], forHTTPHeaderField:@"Accept-Language"];

2.3 APP 内的国际化切换

  1. 字符串的本地化

  2. 自定义解析本地化字符串的工具类LanguageManager、

  3. 例子:登录界面切换中英文。

  4. 文章:kunnan.blog.csdn.net/article/det…

2.4 中英文切换

  • iOS用户协议及隐私政策弹框:包含超链接属性、demo支持中英文切换

kunnan.blog.csdn.net/article/det…

在这里插入图片描述

III 本地化工具的使用(genstrings)

genstrings 从 C 或 Objective-C(.c 或 .m)的源代码文件生成一个 .strings 文件。一个 .strings 文件用于为应用程序的不同语言作本地化。genstrings ViewController.m

genstrings苹果推出的一个用于自动从代码的NSLocalizedString提取生成国际化字符串的工具,genstrings 会浏览每个所选的源文件,以及每个使用 NSLocalizedString 的源文件,把键和注释追加到目标文件。

  1. 在运行时,NSLocalizedString 会确定首选的语言,并在应用程序包中找到相应的 Localizable.strings 文件,例如法语文件fr.lproj/Localizable.strings。
  2. 如果使用NSLocalizedStringFromTable(key, tbl, comment)来获取字符串,资源文件会以tbl参数作为文件名。

blog.csdn.net/z929118967/…

see also

iOS处理语言工具CFStringTransform : 智能地处理用户的输入内容,经典应用场景【索引】blog.csdn.net/z929118967/…

更多内容请关注 #小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域;更多服务和咨询请关注#公众号:iOS逆向

#define NSLocalizedString(key, comment) \
	    [NSBundle.mainBundle localizedStringForKey:(key) value:@"" table:nil]