Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >iOS字符串的本地化(APP 内的本地化切换) 、nib本地化、图片本地化

iOS字符串的本地化(APP 内的本地化切换) 、nib本地化、图片本地化

作者头像
公众号iOS逆向
发布于 2021-07-05 12:45:35
发布于 2021-07-05 12:45:35
1.7K00
代码可运行
举报
文章被收录于专栏:iOS逆向与安全iOS逆向与安全
运行总次数:0
代码可运行

前言

使用本地化功能,可以轻松地将应用程序翻译成多种语言,甚至可以翻译成同一语言的多种方言

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

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

I、nib& info.plist 本地化

  • 本地化前的准备

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

在这里插入图片描述

打开ViewController.xib(Chinese)文件,修改里面的文字信息

info.plist 的国际化

https://blog.csdn.net/z929118967/article/details/92388239

II、图片本地化

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

  • 预先准备好的图片替换对应语言的图片即可

例如替换中文 zh-Hans.lproj文件夹中的home.png

  • 在代码中照常使用图片即可
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[UIImage imageNamed:@"icon_hyxq_youhuiq"];

III、字符串本地化

应用场景: iOS APP 内的国际化切换 (对话框中的文字)、 应用名称本地化

3.1 APP 内的本地化切换

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

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

文章:https://kunnan.blog.csdn.net/article/details/103733872 原理: 1、自定义解析本地化字符串的工具类LanguageManager 2、应用内切换语言生效的技术实现:采用销毁根控制器,重新进入一次 3、本地化字符串指定参数顺序

  • 效果

划重点

1、字符串的本地化 2、自定义解析本地化字符串的工具类LanguageManager、 3、例子:登录界面切换中英文(内含demo)

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

1、销毁根控制器,重新进入一次(采用) 2、通过发通知,到各个控制器更新文字(不采用)

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

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

存储国际化英文字符串的.string文件长度受限,需修改逻辑拆分子文件存储。 https://blog.csdn.net/z929118967/article/details/104300695

如果你的字符串资源文件名不是Localizable.strings,如KN.strings,那么你就得使用NSLocalizedStringFromTable()、NSLocalizedStringFromTableInBundle来读取本地化字符串:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//NSLocalizedStringFromTable(key, tbl, comment)
NSLocalizedStringFromTable(@"Tip", @"KN", nil);

  • 完整的读取代码如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

//程序的本地化,引用国际化的文件
#define QCTLocal(x, ...) HZLocalizedString(x, nil)

#define HZLocalizedString(key, comment)               HZLocalizedStringFromTable(key, @"Localizable", nil)
#define HZLocalizedStringFromTable(key, tbl, comment) [[HZLanguageManager defaultManager] stringWithKey:key table:tbl]



- (NSString *)stringWithKey:(NSString *)key table:(NSString *)table
{
    //假如为跟随系统
    if (self.languageType==HZLanguageTypeSystem) {
        return  NSLocalizedString(key, nil);
    }
    
    //返回对应国际化文字
    if (_bundle) {// 修改成为,从另外一个文件找,先从文件找,如果找不到就从文件二找。
        //NSLocalizedStringFromTableInBundleWithKey
        return [self NSLocalizedStringFromTableInBundleWithKey:key table:table];
        
        
        
    }
    
    return NSLocalizedStringFromTable(key, table, nil);
}




//{// 修改成为,从另外一个文件找,先从文件找,如果找不到就从文件二找。
- (NSString*)NSLocalizedStringFromTableInBundleWithKey:(NSString *)key table:(NSString *)table{
    NSString* tmp = key;
    if(_bundle){
        
        tmp =NSLocalizedStringFromTableInBundle(key, table, _bundle, nil);

        if([tmp isEqualToString:key]){
            // 继续从备份表查找
            
            NSLog(@"开始从Localizable1 找key:%@", tmp);
            tmp =NSLocalizedStringFromTableInBundle(key, @"Localizable1", _bundle, nil);
//            NSLog([NSString stringWithFormat:@"结束从Localizable1 找key:%@",tmp]);
            NSLog(@"结束从Localizable1 找key:%@", tmp);


        }
    }
    return tmp;

    
    
    
}



  • 效果

3.3 iOS本地化字符串指定参数顺序(应用:app内的多语言切换)

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

文章:https://kunnan.blog.csdn.net/article/details/103733872 原理: 1、自定义解析本地化字符串的工具类LanguageManager 2、应用内切换语言生效的技术实现:采用销毁根控制器,重新进入一次 3、本地化字符串指定参数顺序 ———————————————— 版权声明:本文为CSDN博主「#公众号:iOS逆向」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/z929118967/article/details/108793150

IV 、genstrings本地化工具的使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
➜  MainViewControllerDemo git:(master) ✗ genstrings
Usage: genstrings [OPTION] file1.{m,c,cpp,swift} ... filen.{m,c,cpp,swift}

Options
 -h                       shows this message and exits.
 -encoding encoding       assume input files use specified encoding.
 -SwiftUI                 enables SwiftUI Text() support.
 -a                       append output to the old strings files.
 -s substring             substitute 'substring' for NSLocalizedString.
 -skipTable tablename     skip over the file for 'tablename'.
 -noPositionalParameters  turns off positional parameter support.
 -u                       allow unicode characters.
 -macRoman                read files as MacRoman not UTF-8.
 -d                       attempt to detect encoding if read fails.
 -q                       turns off multiple key/value pairs warning.
 -bigEndian               output generated with big endian byte order.
 -littleEndian            output generated with little endian byte order.
 -o dir                   place output files in 'dir'.

Please see the genstrings(1) man page for full documentation

  • 生成字符串资源文件的另一种方式(通过终端命令genstrings)

苹果推出的一个用于自动从代码的NSLocalizedString提取生成国际化字符串的工具;

如果使用NSLocalizedStringFromTable(key, tbl, comment)来获取字符串,资源文件会以tbl参数作为文件名

使用步骤:

  • 首先添加获取字符串的代码,比如在ViewController.m
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    NSString *tip = NSLocalizedString(@"Tip", @"dialog title");
    NSString *ok = NSLocalizedString(@"Ok", @"dialog button");
    NSString *tip1 = NSLocalizedStringFromTable(@"Tip", @"ios进阶", @"dialog title");
    NSString *ok1 = NSLocalizedStringFromTable(@"Ok", @"ios进阶", @"dialog button");




  • 打开终端,定位到ViewController.m所在的文件夹,输入genstrings ViewController.m命令,生成字符串资源文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-rw-r--r--@ 1 mac  staff   714  9 17 11:52 ViewController.m
➜  MainViewControllerDemo git:(master) ✗ genstrings ViewController.m

➜  MainViewControllerDemo git:(master) ✗ ls -lrt

-rw-r--r--  1 mac  staff   140  9 17 11:54 ios进阶.strings
-rw-r--r--  1 mac  staff   140  9 17 11:54 Localizable.strings


在这里插入图片描述

  • 将资源文件导入项目即可,然后打开资源文件,可以发现已经生成了key和comment
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
➜  MainViewControllerDemo git:(master) ✗ cat Localizable.strings
??/* dialog button */
"Ok" = "Ok";

/* dialog title */
"Tip" = "Tip";

➜  MainViewControllerDemo git:(master) ✗ cat ios进阶.strings
??/* dialog button */
"Ok" = "Ok";

/* dialog title */
"Tip" = "Tip";

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iOS逆向 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL操作之数据定义语言(DDL)(二)
简称DDL(Data Defifinition Language),用来定义数据库对象:数据库,表,列等。关键字:create,alter,drop等。
ha_lydms
2023/08/09
2460
MySQL操作之数据定义语言(DDL)(二)
MySQL数据库、数据表的基本操作及查询数据
存储引擎比较 |功能|MyISAM|Memory|InnoDB|Archive| |---|---|---|---|---| |存储限制|256TB|RAM|64TB|None| |支持事务|No|No|Yes|No| |支持全文索引|Yes|No|No|No| |支持数索引|Yes|Yes|Yes|No| |支持哈希索引|No|Yes|No|No| |支持数据缓存|No|N/A|Yes|No| |支持外键|No|No|Yes|No|
星哥玩云
2022/08/17
3.1K0
MySql基础之约束
给某个字段/某列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。
冬天vs不冷
2025/01/21
1640
MySql基础之约束
MySQL(五)之DDL(数据定义语言)与六大约束
前言 前面在数据库的讲解中,其实很多东西都非常的细节,在以前的学习过程中我都是没有注意到的。可能在以后的工作中会碰到所以都是做了记录的。 接下来,我将分享的是MySQL的DDL用来对数据库及表进行操作的。   mysql中保存了很多数据库、一个数据库中可以保存很多表。   对数据表的增(创建表)删(删除表)改(修改表字段)查(查询表结构)。  注意:这里的操作对象是表,对表的操作也就是表的结构,和表中的字段的操作(字段和记录要分清楚)   前提:表是在数据库下的,所以要先确实使用哪个数据库。 一、DDL之
用户1195962
2018/01/18
2.1K0
MySQL(五)之DDL(数据定义语言)与六大约束
【MySQL数据库】数据库的约束
MySQL数据库通过约束(constraints)防止无效的数据进入到数据库中,以保护数据的实体完整性。 MySQL中主要有六种约束,分别是:主键约束(primary key),非空约束(not null),自增长约束(auto_increment),默认约束(default) ,零填充约束(zerofill),唯一性约束(unique)。
小小程序员
2022/12/05
5.8K0
【MySQL数据库】数据库的约束
Mysql常用sql语句(2)- 操作数据表
https://www.cnblogs.com/poloyy/category/1683347.html
小菠萝测试笔记
2020/06/09
5310
Mysql常用sql语句(2)- 操作数据表
MySQL常用语句
  今天天气很好,大晴天,心情也好好的。就将MySQL常用的语句总结一下,记录在随笔里,也顺便分享分享。日后,这篇随笔我将会持续更新,作为我自己的MySQL语句大全。
那一叶随风
2018/08/22
5280
MySQL基本操作
表是数据库存储数据的基本单位,由若干个字段组成,主要用来存储数据记录。表的操作 包括创建表、查看表、修改表和删除表。
星哥玩云
2022/08/18
2.1K0
MySQL基本操作
第三章《数据表的基本操作》
1.关于表 表示数据库存储数据的基本单位。一个表可以包含若干个字段或者是记录。表的操作包括创建表、修改表、删除表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性约束的过程。 1.创建表: 数据表属于数据库,在创建数据表之前,应该使用“USE <数据库名>”移动到指定的数据库下。 如果没有选择数据库,创建表时会报错; 创建表的语法: CREATE TABLE table_name ( 字段1 数据类型 [完整性约束条件], 字段2 数据类型 [完整性约束条件], … );
全栈程序员站长
2021/06/08
1.4K0
第三章《数据表的基本操作》
MySQL学习笔记(3) - 表的基本操作
使用 SHOW CREATE TABLE 语句可以用来显示创建表时的 SQL 语句。示例:
张云飞Vir
2021/06/24
4660
MySQL约束
约束是一种限制,它通过对表的行或列的数据做出限制,来确保表的数据的完整性、唯一性。
阿年、嗯啊
2021/04/27
1.7K0
MySQL - 简单笔记
创建数据库 create database if not exists mydb; 查看mySQL服务器中所有数据库 show databases; 示例: mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | keai | | kenvie | | mydb
kenvie
2022/01/20
2990
Mysql-5-数据表的基本操作
1.创建表:之前需要use database database_name 然后create table 表名(); 例:创建员工表tb_employee1,结构如下表所示 字段名称 数据类型 备注 id int(11) 员工编号 name varchar(25) 员工名称 depld int(11) 所在部门编号 salary float 工资 mysql> create database
用户1173509
2018/01/17
1.7K0
MySQL基本操作
##这里的num 是int类型,name是字符串类型,date是日期类型,price价格是双精度类型,这里的double(5,2)是整个价格长度为5,小数点后有2位
指剑
2022/07/17
3930
MySQL常见约束条件「建议收藏」
约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败! 约束条件在创建表时可以使用, 也可以修改表的时候添加约束条件
全栈程序员站长
2022/11/04
1.6K0
mysql简单基础
枚举:enum,enum('男','女'),你男可以用1表示,1对应男,2就是女,这就是枚举。
不断折腾
2019/09/23
9120
mysql简单基础
mysql基本sql语句大全(基础用语篇)_mysql查询语句汇总
mysql> show variables like ‘%storage_engine%’; #查看mysql当前默认的存储引擎
全栈程序员站长
2022/10/03
2.8K0
mysql基本sql语句大全(基础用语篇)_mysql查询语句汇总
MySQL常用基础 - 小白必看
2、create database if not exists 数据库名 (判断数据库是否存在,不存在则创建)
EXI-小洲
2023/01/09
1.2K0
MySQL常用基础 - 小白必看
MySQL 常用的指令
mysql.server start 启动 mysql.server stop 关闭 quit 退出
陈雨尘
2019/05/23
1.4K0
数据库update语法-MySQL数据库 | SQL语句详解
   -- 语法:alter table 表名 add 列名 类型(长度)[约束];
宜轩
2022/12/29
2K0
相关推荐
MySQL操作之数据定义语言(DDL)(二)
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验