博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ios开发应用内实现多语言自由切换
阅读量:6540 次
发布时间:2019-06-24

本文共 1342 字,大约阅读时间需要 4 分钟。

需求描述:应用内部有一按钮,点击切换语言(如中英文切换)。

说起来这个是好久以前做的一个功能点了,刚开始也是没有头绪,后来解决了发现很简单,把方法分享一下。
1.原理。
查看NSLocalizedString(@"abc",nil);的定义。

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

然后思考,为什么这个定义会定位到当前系统默认的语言对应的strings文件呢?
如果这点想通了,那问题就迎刃而解了不是?
2.具体解析
重定义NSLocalizedstring。

1
2
3
#define AppLanguage @"appLanguage"
#define CustomLocalizedString(key, comment) \
[[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%@",[[NSUserDefaults standardUserDefaults] objectForKey:@"appLanguage"]] ofType:@"lproj"]] localizedStringForKey:(key) value:@"" table:nil]

不用解释了吧?查找对应的strings文件。
3.用法

1
2
3
4
     if (![[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage]) {
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:AppLanguage];
        }
label.text= CustomLocalizedString(@"sub_menu_download", nil);//@"离线下载";

4.切换
点击中英文切换按钮时,

1
2
3
4
5
6
7
8
NSString *currentLanguage = [[NSUserDefaults standardUserDefaults]objectForKey:AppLanguage];
        if ([currentLanguage isEqualToString: @"en"]) {
            [[NSUserDefaults standardUserDefaults] setObject:@"zh-Hans" forKey:AppLanguage];
        }else
        {
            [[NSUserDefaults standardUserDefaults] setObject:@"en" forKey:AppLanguage];
        }
        [[NSUserDefaults standardUserDefaults] synchronize];

程序还要再做进一步的界面相关的处理,如是tabbar则重新初始化等等

转载地址:http://owpdo.baihongyu.com/

你可能感兴趣的文章
聊聊spring jdbc的RowMapper
查看>>
[Java代码] Java实现直接插入排序和折半插入排序算法示例
查看>>
PPP中的pap和chap认证
查看>>
nginx服务器的内核优化配置
查看>>
Netgear wndr3700v2 路由器刷OpenWrt打造全能服务器(十二)恢复
查看>>
如何实现在虚拟机上的Linux系统上安装vmware tools
查看>>
机械硬盘显示无法访问磁盘结构损坏且无法读取,里面的文件怎样找到
查看>>
开启博客的第一篇
查看>>
Exchange2007-Exchange2010升级-06 数据库高可用组的创建
查看>>
phpHiveAdmin是如何通过Hive/Hadoop工作的
查看>>
[翻译完成] 树莓派搭建Google TV
查看>>
双向链表内结点的删除(4)
查看>>
项目总结
查看>>
JSON字符串转成对象
查看>>
云端对决,新旧势力的PK赛
查看>>
SaltStack 中ZMQ升级
查看>>
grep,egrep使用以及正则表达式的使用
查看>>
在java实现redis缓存技术的基本操作
查看>>
implode 和 explode
查看>>
(转载)AppiumDriver类架构
查看>>