[IOS]如何在app里面改变语言

参考:https://stackoverflow.com/questions/9416923/ios-how-to-change-app-language-programmatically-without-restarting-the-app

核心是使用

NSString *path = [[NSBundle mainBundle]pathForResource:currentLanguage ofType:@"lproj"];
    
    if (path) {
        localeBundle = [NSBundle bundleWithPath:path];
        
    }else{
         localeBundle= [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]];
    }

 改变localeBundle的值

 

 

思路:

1.使用

 

 NSLocalizedStringFromTableInBundle(@"TNC_title", nil, localeBundle] , @""),

 可以实时变换不同的国际化文件

 

*国际化文件一般在文件目录系统是放在lproj后缀的文件夹中的:形式如zh-Hant.lproj(繁体)zh-Hants.lproj(简体)en.lproj(英文)

因此在上文的pathForResource:currentLanguage中也需要对应相应的文件名。

 

2.再刷新一遍UI的text获取

 

基于项目的代码示例:

建一个工具类.h:

 

#import <Foundation/Foundation.h>

@interface LanguageTool : NSObject



+(instancetype)getInstance;

- (NSBundle *)getLocaleBundle;

-(NSString *)getTap;

-(NSString *)getCurrentLanguage;

-(void)changeLanguage:(NSString*)language;


@end

 

 

.m:

 

#import "LanguageTool.h"
#import "SessionManager.h"

#define CNS @"zh"
#define EN @"en"
#define tap @"change_language"

static NSBundle *localeBundle = nil;
static NSString *currentLanguage = nil;

@interface LanguageTool()


@end

@implementation LanguageTool

//单例
+(instancetype)getInstance{
    static LanguageTool *manager = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        manager = [[LanguageTool alloc] init];
    });
    return manager;
}


-(void)changeLanguage:(NSString*)language{
    
    currentLanguage = language;
    
    NSString *path = [[NSBundle mainBundle]pathForResource:language ofType:@"lproj"];
    
    if (path && ![@"en" isEqualToString:language]) {
        localeBundle = [NSBundle bundleWithPath:path];
    }else{
        localeBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]];
    }
}

//这个方法的目的是,如果什么都没有选择,就使用系统默认语言,否则使用用户选择的语言,并且不会因为关闭app而改变。
-(void)judgeLanguage{
    
    //Get last change language
    NSString *lastChangeLanguage = nil;
//使用一个持久化,保持上次的语言选择
    lastChangeLanguage = [SessionManager getSession:[SessionManager getLastLanguageTap]];
    NSLog(@"last chage language: %@",lastChangeLanguage);
    
    //语言优先级:currentLanguage > lastChangeLanguage > system default language
    //user 没有设定语言时:获取系统默认语言
    if (!lastChangeLanguage) {
        if (!currentLanguage) {
            //获取系统默认语言:
            //截取:zh-Hant-HK 去掉区域保留:zh-Hant
            NSLog(@"-------system language:%@",[NSLocale preferredLanguages][0]);
            currentLanguage = [[NSLocale preferredLanguages][0] substringToIndex:2];
            if ([currentLanguage containsString:@"zh"]) {
                
                currentLanguage = [NSString stringWithFormat:@"%@%@",currentLanguage,@"-Hant"];
            }
        }
    }else if(!currentLanguage){
        //当前没有切换语言,app内有设定语言,优先app内语言
        currentLanguage = lastChangeLanguage;
    }

}

- (NSBundle *)getLocaleBundle{
    
    [self judgeLanguage];
    
    NSLog(@"------current language :%@",currentLanguage);
    NSLog(@"-------system language:%@",[NSLocale preferredLanguages][0]);

    NSString *path = [[NSBundle mainBundle]pathForResource:currentLanguage ofType:@"lproj"];
    
    if (path) {
        localeBundle = [NSBundle bundleWithPath:path];
        
    }else{
         localeBundle= [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]];
    }
    return localeBundle;
}

//标记
-(NSString *)getTap{
    return tap;
}

-(NSString *)getCurrentLanguage{
//    if (!currentLanguage) {
//        //截取:zh-Hant-HK 去掉区域保留:zh-Hant
//        currentLanguage = [[NSLocale preferredLanguages][0] substringToIndex:2];
//    }
    
    [self judgeLanguage];
    
    NSLog(@"current language:%@",currentLanguage);
    return currentLanguage;
}

@end

 

 

使用在需要切换语言的地方点击后调用:

 

//如果当前是英语就切换成繁体
if ([@"en" isEqualToString:[[LanguageTool getInstance] getCurrentLanguage]]) {
                [self changeLanguage:@"zh-Hant"];
            } else {
                [self changeLanguage:@"en"];
            }
//通知其他页面也切换语言
            [self callLanguageChangeNotificationReceiver];

 

-(void)changeLanguage:(NSString*)language{
    
    [[LanguageTool getInstance] changeLanguage:language];
    
//刷新某些UI text
    [self initTableResource];
    
    [_tableView reloadData];
    
    
}

 //例如这样刷新:

 

-(void)initTableResource{
    
    _dataArray = @[NSLocalizedStringFromTableInBundle(@"Home", nil, [[LanguageTool getInstance] getLocaleBundle] , @""),
                   NSLocalizedStringFromTableInBundle(@"customization", nil, [[LanguageTool getInstance] getLocaleBundle] , @"")
                   ,
                   NSLocalizedStringFromTableInBundle(@"TNC_title", nil, [[LanguageTool getInstance] getLocaleBundle] , @""),
                   NSLocalizedStringFromTableInBundle(@"localizable", nil, [[LanguageTool getInstance] getLocaleBundle] , @"")];
    
    NSString *app_version = [[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    _app_version_string = [NSString stringWithFormat:@"%@ %@",NSLocalizedStringFromTableInBundle(@"slider_version_info", nil, [[LanguageTool getInstance] getLocaleBundle] , @""),app_version];
    if (_version_label) {
        _version_label.text = _app_version_string;
    }
   
    
    [self initContentVersionLabel];
    
}

 

//设置通知:

 

-(void)callLanguageChangeNotificationReceiver{
    
    [SessionManager setSession:[SessionManager getLastLanguageTap]
                         value:[[LanguageTool getInstance] getCurrentLanguage]];
    
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    
    [center postNotificationName:[[LanguageTool getInstance] getTap] object:nil];
    
}

 

被通知的页面接收通知,并刷新一下UI,操作并不复杂:

-(void)initNotification{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTextView) name:[[LanguageTool getInstance]getTap] object:nil];
}

-(void)refreshTextView{
    _tncTextView.text = NSLocalizedStringFromTableInBundle(@"TNC_text", nil, [[LanguageTool getInstance] getLocaleBundle] , @"");
    _navItem.title = NSLocalizedStringFromTableInBundle(@"TNC_title", nil, [[LanguageTool getInstance] getLocaleBundle] , @"");
}

 

资料:

1.http://blog.youkuaiyun.com/feng2qing/article/details/60479620

 

Flutter本地化(国际化)之App名称 Android和IOS的国际化配置,App名称的国际化、本地化 阅读详情

相关推荐

XCode启动参数和环境变量

前言 这一部分介绍XCode中Argument/Options模块,通过这两个模块,我们可以在启动App的时候传递一些额外的参数进去,覆盖系统的默认值,从而实现特定场景的调试。 Options Options这里的内容相对简单,但是却容易被忽略。 Core Location用来模拟App的位置 Application Data 可以用于测试CoreData的Scheme迁移 Ro...

Leo的专栏 6388

App多语言设置

app多语言设置

李平的博客 781

iOS 多国语言本地化与App内语言切换(Swift)

一个好的心态和一个坚持的心很重要,很多冲着高薪的人想学习前端,但是能学到最后的没有几个,遇到困难就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可获取!!!就放弃了,这种人到处都是,就是因为有的东西难,所以他的回报才很大,我们评判一个前端开发者是什么水平,就是他解决问题的能力有多强。分享一些简单的前端面试题以及学习路线给大家,狂戳这里即可获取!!!

2401_83601703的博客 2528

iOS应用内语言切换功能

当我们的应用仅仅面向国内用户群,一般仅支持一种语言–中文就可以了。当面向国外用户时就需要进行国际化了,不仅仅是语言的转变,也可能包括设计风格,页面布局、交互效果的转变,如微信,微博,QQ这类应用都有着切换语言的功能。iOS常用的国际化流程1.建立strings文件。2.在Localization勾选支持的语言,在不同的后缀的同文件名的strings中设置标题。3.使用NSLocalizedStrin

勿在浮沙筑高楼 1860

iOS小技能:APP内的本地化语言切换(案例:登录界面切换中英文)

前言 应用内切换语言生效的技术实现方法 销毁根控制器,重新进入一次(采用) 通过发通知,到各个控制器更新文字(不采用) 用法 [LBAlertController showAlertTitle:QCTLocal(@"tips") content:QCTLocal(@"str_cann_printer") cancelString:QCTLocal(@"cancel") canc.........

专注于计算机研发知识和资讯分享 2万+

iOS应用内切换语言实例

iOS应用内切换语言的实例,很简单,所以不用很长的描述,为什么还要这么长的描述。 若有问题,博客下留言:http://blog.youkuaiyun.com/zyq527758142/article/details/49100207

字符串的本地化

一个应用在进行多语言本地化的时候涉及到大量的工作。因为这一期的主题是字符串,所以本文主要探讨字符串的本地化。字符串本地化有两种方法:修改代码或修改 nib 文件和 storyboard。本文将专注于通过代码实现字符串的本地化。 NSLocalizedString NSLocalizedString 这个宏是字符串本地化的核心工具。它还有三个鲜为人知的变体:NSLocalizedStri

cj772728583的博客 1945

Android中app内设置语言

类似微信,在设置中,弹框选择语言,关键代码以及封装的都在,弹框和界面需要根据自己的需求自己搭建,这里没有以弹框的形式出现。整体思路是:选择语言,退出app进入指定类,根据保存所选的语言进行选择

iOS本地化学习小结

国际化学习国际化也称作本地化,为了使不同国家和地区的用户能够有良好的体验,需要对自己所开发的应用进行不同语言的适配。

集腋成裘 402

数据标注的下一代SOP,可能不是Word,而是一段Prompt

再给几个反例:“这个只是正常纹理,不算。真正用于数据生产的Prompt,可能至少包含:任务定义、正例、反例、边界案例、优先级、输出格式、验收逻辑。一个项目100个人,如果100个人对这句话有100种理解,最后返工的就不是一个框,而可能是几十万帧数据。一个项目启动以后,项目经理先研究SOP,培训组长,组长再培训标注员,最后几百个人按照同一套规则干活。实际上一个成熟的项目经理,最重要的能力之一,就是:把客户的业务语言翻译成生产规则。真正让项目难交付的,从来不是80%的普通数据,而是那20%的长尾数据。

AI数据标注猿 296

光电振荡器(OEO):从原理到应用,解锁高频微波信号新纪元

本文深入解析了光电振荡器(OEO)的核心原理与前沿应用。OEO通过巧妙的光-电-光转换机制,利用光学谐振腔产生高频、高纯度、低相位噪声的微波信号,有效突破了传统电子电路的频率瓶颈。文章详细拆解了其工作流程,并探讨了在雷达系统、高速光通信及精密测量等领域的硬核应用价值。

weixin_29231027的博客 367

iOS 国际化 (国际化文字内容不改变,app名字国际化,一键切换语言)

首先我们要分三个步骤讲解怎么一步步实现app名字国际化、内容国际化、一键切换国际化的: 一、app设置内容或者可以说是app名字或者可以说Info.Plist中的东西国际化 app名字国际化 1、首先新建文件command+N 选择,然后next 记住文件名字必须为:InfoPlist,要不然系统识别会失败! 然后点击create,文件工程中会多一个不带箭头的文件 ...

aiqian1239的博客 380

YOLO26改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLO26中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLO26,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 255

新手入门安卓/IOS移动应用开发

本来打算做安卓移动手机APP开发的,结果师兄说如果

Curry Base 751

深度学习部署工程师--8(docker+TensorRT部署到推理+yolo人体检测)下

本文介绍了YOLOv5模型通过TensorRT加速部署的流程。首先需要检查磁盘空间,确保有30GB可用。文章对比了不同推理方式的性能:int8量化+TensorRT可达200FPS,纯TensorRT为166FPS,CUDA为147FPS,CPU为93FPS。重点讲解了将YOLOv5模型导出为ONNX格式的详细步骤,包括修改Detect类的forward方法以移除decode运算,使用git patch批量修改代码,安装必要的依赖库,以及通过onnx-graphsurgeon工具修改ONNX图结构。最终目标

FJN110的博客 495

【大模型应用开发-FastAPI框架】(八)Sqlalchemy+postgresql简单增删改查

语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型”。SQLAlchemy的理念是,的量级和性能重要于对象集合;而对象集合的抽象又重要于表和行。因此,SQLAlchemy采用了类似于。社区中成为广泛使用的ORM工具之一,不亚于Django的ORM框架。和declarative等可选插件可以让用户使用声明语法。SQLAlchemy首次发行于2006年2月,并迅速地在。SQLAlchemy“采用简单的。二、安装postgresql。一、SQLAlchemy简介。的数据映射模型,而不是其他。

2098

IOS知识点

1获取系统语言设置       NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];       NSArray *languages = [userDefault objectForKey:@"AppleLanguages"];       NSString *preferredLang = [lang

YouChangJiang的专栏 1544

从理论到实践:AI设备维护系统的架构实现

第一部分:理论基石——从设备维护的演进讲起,理解AI如何重塑维护模式;第二部分:架构设计——详解六层高可用系统架构,明确各层职责与技术选型;第三部分:核心技术——拆解数据处理、特征工程、模型训练、部署等关键环节的实现细节;第四部分:实践落地——8步流程带你从需求到上线,附代码示例与工具链;第五部分:案例研究——风电齿轮箱预测性维护系统的真实案例,从问题到方案再到效果;第六部分:挑战与展望——探讨当前技术瓶颈与未来趋势(数字孪生、联邦学习等)。准备好了吗?

大数据洞察的博客 1251

iOS App的国际化,以及App内的语言切换

一、国际化文件 其实国际化跟我们的NSDictionary差不多,我们要支持中文和英文,就会生成两个国际化文件(.string为后缀名),然后在两个国际化文件中,设置一个Key,在中文的国际化文件中这个Key对应的NSString值就是中文的,在英文的国际化文件中这个Key对应的NSString值就是英文的,这么说太不好理解了,我们先把国际化文件生成出来,然后使用一下,你就明白了。 首先新建一

huangmindong的专栏 1万+

《FreeRTOS 入门与实战》第20章:移植到 RISC-V 平台

处理器上下文保存/恢复机制中断处理与任务切换的协同时钟源配置(通常使用 Machine Timer)平台特定的汇编代码实现// 典型RISC-V移植文件结构FreeRTOS/├── Source/portable/[编译器]/RISC-V/│ ├── port.c // 关键移植接口│ ├── portASM.s // 汇编级处理│ └── portmacro.h // 架构宏定义。

2301_79143213的博客 450

Python 爬虫实战:于好大夫在线抓取医生评价数据,选择优质医疗服务

requests:用于发送 HTTP 请求,获取网页内容。或 lxml:用于解析 HTML 页面,提取目标数据。pandas:用于数据清洗和分析。matplotlib和seaborn:用于数据可视化。time:用于控制爬取速度,避免对服务器造成压力。通过本项目,我们实现了以下目标:使用 Python 爬虫抓取好大夫在线的医生评价数据。对数据进行清洗和分析,找出评价中的关键词和趋势。根据分析结果推荐优质医疗服务。

u014481728的博客 3409

iOS-根据系统语言更改App名称或其他配置

要根据系统的语言更改app的名字。

qq_36428855的博客 2537

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

iOS开发——iOS国际化 APP内语言切换

最近一个一直在迭代的老项目收到一份新的开发需求,项目需要做国际化适配,简体中文+英文。由于项目中采用了storyboard和纯代码两种布局方式,所以国际化也要同时实现。上网查了些资料,实现了更改系统语言后,修改app内语言的问题。具体国际化方式可以参考下文: 3分钟实现iOS语言本地化/国际化 这篇文章讲的比较详细,很容易实现。 这个需求实现后不久,产品又给我提了一个需求,让我要在app内实现语言...

weixin_34417200的博客 276

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

iOS 开发修改app名称(display Name)后实际app名称没有变的情况

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34375054的博客 4019

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Flutter App名称跟随手机语言改变而改变

1.如下图所示,点击左侧导航栏中的文件夹图标——>点击Runner——>点击PROJECT中的Runner——>点击Info——>点击Localizations下的+号图标——>选择要添加的语言——>点击Finish按钮。2.在android/app/src/main/res/values/styles.xml文件中添加App的名称,如果没有这个文件请自行添加。3.在android/app/src/main/res/values创建values-xx文件夹,这里的xx是所需语言的。重新编译运行就可以了。

AiFlutter的博客 1049
上一篇: [Android]如何使用Anko(不断更新中)
下一篇: [IOS]刷新tableview后不丢失cell的selected状态
jameskaron
博客等级 码龄20年 31粉丝 663原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值