iOS -- 国际化,不跟随系统语言--(不能使用storyboard、xib等)可网络上搜索 storyboard国际化

本文主要是介绍iOS -- 国际化,不跟随系统语言--(不能使用storyboard、xib等)可网络上搜索 storyboard国际化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:网络上关于iOS国际化的文章很多,但基本上都是基于跟随系统语言的国际化,笔者就不赘述了-0 –

今天要讲的是不跟随系统的切换语言版本方案,即程序内部的切换语言版本方案。


一、总则:

       应用内部语言不跟随系统语言,由应用自己进行控制,通过配置多个语言文件,根据用户的选择动态获取不同文件夹下的语言文件,显示在界面上。

       最后把用户选择的语言持久化到本地,下次运行时读取。


二、应用内的国际化

1、新建工程

      新建Single View Application工程,取名为MyInternational。

                                                      


2、添加多语言文件

      我们选择使用自己的语言文件,而不是系统的localizable.string,因为在项目开发使用svn时,多人操作同一文件可能会造成冲突。

在Resource中添加新的Strings File:

                                                            

       

      取名为hello(记得Targets要勾选项目)

                                                                 


      新建完成之后会生成hello.string文件,把它拖进Supporting Files里。


3、配置hello.string国际化

      首先配置刚才的hello.string文件。

      点击hello.strings文件,点击圈中的Make localized(本地化)。

                                                                             

    

      只有English,没关系点击确定。

                                                                


4、配置项目国际化

      网络上很多配置方法不靠谱,因为新版的Xcode位置“+”号的位置换了,这里教大家正确的方法,点击项目—>选择Project—>选择Info—>点击“+”号。

                                                     


      点击“+”号后,添加中文,当然也可以添加其他的语言,弹出对话框,infoPlist是配置系统的国际化文件,可以配置图标之类的多语言环境,不属于本文范围,nib文件看需要配,这里选择不配。

                                                      

      

      配置完成之后,再看hello.string便分成了两个文件。

                                                                                 

      完成上面的四步便完成了项目内的多语言环境配置,下面来看看代码怎么写。


5、添加需要的字符串

      分别在hello.strings(English)与hello.strings(Chinese)里面添加对应语言的字符串。

      字符串的格式为“key”=“value”;键值对(别忘记分号!)

      接下来配置项目需要的字符串,一个用于lable的显示,一个用于button的显示。

 

    hello.strings(English)

    "invite" ="hello atany,come to join in us!";

   "buttonInfo" ="change Language";

 

    hello.strings(Chinese)

    "invite" ="你好 atany,快来加入我们吧!";

    "buttonInfo" ="切换语言";

 

6、看看流程

                                                     

【实现思路:】

      在初始化首个Controller的时候,进行应用语言的加载。首次加载因为userLanguage(应用内语言)不存在,则使用系统当前的语言,保存到userlanguage,下次直接读。读出来之后,获取到对应文件路径,得到文件的索引,储存到工具类InternationalControl的静态变量bundle中。

其他地方需要用字符串时,用工具类获得bundle即可读取相应文件中的字符串。


7、新建工具类InternationalControl

                           

InternationalControl.h

[cpp]  view plain copy
  1. #import <Foundation/Foundation.h>  
  2.   
  3. #import <UIKit/UIKit.h>  
  4.   
  5. @interface InternationalControl : NSObject  
  6.   
  7. +(NSBundle *)bundle;//获取当前资源文件  
  8.   
  9. +(void)initUserLanguage;//初始化语言文件  
  10.   
  11. +(NSString *)userLanguage;//获取应用当前语言  
  12.   
  13. +(void)setUserlanguage:(NSString *)language;//设置当前语言  
  14.   
  15. @end  

InternationalControl.m

1)创建静态变量bundle,以及获取方法bundle(注:此处不要使用getBundle)。

[cpp]  view plain copy
  1. static NSBundle *bundle = nil;  
  2.   
  3. + ( NSBundle * )bundle{  
  4.       
  5.     return bundle;  
  6.   
  7. }  

2)初始化方法:

  userLanguage储存在NSUserDefaults中,首次加载时要检测是否存在,如果不存在的话读AppleLanguages,并赋值给userLanguage。
[cpp]  view plain copy
  1. +(void)initUserLanguage{  
  2.       
  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  
  4.       
  5.     NSString *string = [def valueForKey:@"userLanguage"];  
  6.        
  7.     if(string.length == 0){  
  8.           
  9.         //获取系统当前语言版本(中文zh-Hans,英文en)  
  10.   
  11.         NSArray* languages = [def objectForKey:@"AppleLanguages"];  
  12.           
  13. <pre class="cpp" name="code">        NSString *current = [languages objectAtIndex:0];  
  14.           
  15.         string = current;  
  16.           
  17.         [def setValue:current forKey:@"userLanguage"];  
  18.           
  19.         [def synchronize];//持久化,不加的话不会保存  
  20. }  
  21.   
  22.     //获取文件路径  
  23.     NSString *path = [[NSBundle mainBundle] pathForResource:string ofType:@"lproj"];  
  24.       
  25.     bundle = [NSBundle bundleWithPath:path];//生成bundle  
  26. }  
  27. </pre>  

3)获得当前语言方法

[cpp]  view plain copy
  1. +(NSString *)userLanguage{  
  2.       
  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  
  4.       
  5.     NSString *language = [def valueForKey:@"userLanguage"];  
  6.       
  7.     return language;  
  8. }  

4)设置语言方法

[cpp]  view plain copy
  1. +(void)setUserlanguage:(NSString *)language{  
  2.       
  3.     NSUserDefaults *def = [NSUserDefaults standardUserDefaults];  
  4.       
  5.     //1.第一步改变bundle的值  
  6.     NSString *path = [[NSBundle mainBundle] pathForResource:language ofType:@"lproj" ];  
  7.       
  8.     bundle = [NSBundle bundleWithPath:path];  
  9.       
  10.     //2.持久化  
  11.     [def setValue:language forKey:@"userLanguage"];  
  12.       
  13.     [def synchronize];  
  14. }  

8、拖nib,配置点击事件

一个button,一个label,button用于切换语言,label用于显示信息。

                                                                        


9、配置加载的第一个Controller,这里是YGViewController

YGViewController.h

[cpp]  view plain copy
  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface YGViewController : UIViewController  
  4.   
  5. @property (retain, nonatomic) IBOutlet UILabel *inviteLabel;//label  
  6.   
  7. - (IBAction)changeLanguage:(id)sender;//点击事件  
  8.   
  9. @property (retain, nonatomic) IBOutlet UIButton *btChange;//button  
  10.   
  11. @end  


YGViewController.m

1)加载:

[cpp]  view plain copy
  1. - (void)viewDidLoad  
  2. {  
  3.     //注册通知,用于接收改变语言的通知  
  4.     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeLanguage) name:@"changeLanguage" object:nil];  
  5.   
  6.     [InternationalControl initUserLanguage];//初始化应用语言  
  7.       
  8.     NSBundle *bundle = [InternationalControl bundle];  
  9.       
  10.     NSString *inviteMsg = [bundle localizedStringForKey:@"invite" value:nil table:@"hello"];  
  11.   
  12.     NSString *buttonInfo = [bundle localizedStringForKey:@"buttonInfo" value:nil table:@"hello"];//table为hello.string的文件名  
  13.       
  14.     [_btChange setTitle:buttonInfo forState:UIControlStateNormal];  
  15.       
  16.     _inviteLabel.text = inviteMsg;  
  17.       
  18.     [super viewDidLoad];  
  19. }  

2)点击修改语言方法

[cpp]  view plain copy
  1. - (IBAction)changeLanguage:(id)sender {  
  2.       
  3.     NSString *lan = [InternationalControl userLanguage];  
  4.       
  5.     if([lan isEqualToString:@"en"]){//判断当前的语言,进行改变  
  6.       
  7.         [InternationalControl setUserlanguage:@"zh-Hans"];  
  8.       
  9.     }else{  
  10.       
  11.         [InternationalControl setUserlanguage:@"en"];  
  12. }  
  13.       
  14.     //改变完成之后发送通知,告诉其他页面修改完成,提示刷新界面  
  15.     [[NSNotificationCenter defaultCenter] postNotificationName:@"changeLanguage" object:nil];  
  16. }  

3)接收到通知执行方法,刷新界面

[cpp]  view plain copy
  1. -(void)changeLanguage{  
  2.       
  3.     [_btChange setTitle:[[InternationalControl bundle] localizedStringForKey:@"buttonInfo" value:nil table:@"hello"] forState:UIControlStateNormal];  
  4.       
  5.     _inviteLabel.text =[[InternationalControl bundle] localizedStringForKey:@"invite" value:nil table:@"hello"];  
  6. }  

如果有多个界面的话,需要每个界面都配置接收通知,用于修改界面。


10、运行界面

                                                                             


                                                                             

可以看到点击切换语言之后,语言切换成功。

退出程序再次进入,保留了上次选择的语言。

 

atany原创,转载请注明博主与博文链接,3Q吐舌头

 http://blog.csdn.net/yang8456211/article/details/12031667

 —— by atany

这篇关于iOS -- 国际化,不跟随系统语言--(不能使用storyboard、xib等)可网络上搜索 storyboard国际化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969148

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

hdu1240、hdu1253(三维搜索题)

1、从后往前输入,(x,y,z); 2、从下往上输入,(y , z, x); 3、从左往右输入,(z,x,y); hdu1240代码如下: #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#inc

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传