iOS 需求 多语言(国际化)App开发 源码

一直觉得自己写的不是技术,而是情怀,一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的,希望我的这条路能让你们少走弯路,希望我能帮你们抹去知识的蒙尘,希望我能帮你们理清知识的脉络,希望未来技术之巅上有你们也有我。

前言

某些公司希望App支持的多语言文件弄到线上去,通过下载多语言文件的方式或者通过接口请求json数据回来,进行多语言显示的方式,解决多语言的问题. 经过自己在网上查阅过很多资料跟我自己想的都是一致的,无论是下载文件读取,还是请求接口,都是返回json的形式,然后我去github搜索相关的SDK,也是使用json的方式来实现多语言数据的使用.

不能解决的问题
另外.其实多语言弄到线上去,最大的一个帮助就是,更新内容的时候,直接可以热更新,不需要重新提交审核,其实并不能完全很好的解决全部问题,
1.主要是app有新的页面(功能)开发,就需要有新增的字段,也是需要重新提交审核.(只能解决原有的字段内容更新)
2.如果从线上下载多语言的字段,为了防止下载失败,通常都会在项目放入一份多语言的json文件进行备份.而且要跟线上的保持一致.如果是这样的话,线上的那份就多此一举了.本地本身有一份跟线上的一模一样,就没有必要从网上拿,如果本地不备份存在安全隐患,万一接口访问失败,整个app有很大的影响

能解决的问题
1.如果字段的内容是由不同不部门或者受到区域限制的问题,可能放到线上,其他人修改比较方便
2.如果发现内容有问题,需要及时更改及时使用,需要等待审核这段时间.

多语言代码逻辑图

在这里插入图片描述
github上有一个DialectSDK,是用于多语言的开发,通过下载json文件,进行保存,可以加载本地的多语言文件保存到缓存中使用.从github下载是有问题的,上面源码的链接是已经修改好的

该第三方的思路是对的,符合公司的需求,但是该第三方下载下来,语法编译不通过,修改之后才能够进行使用,多语言文件的使用逻辑有问题,需求进行修改才能正常使用,我对该SDK已经修改好了

使用

从缓存中加载数据

Dialect 每次启动通过load方法读取

判断某个语言是否有数据

[Dialect localizationDictionaryForTable:@"en"]

加载本地文件并保存

NSData *enData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"json"]];
NSDictionary *enJson = [NSJSONSerialization JSONObjectWithData:enData options:NSJSONReadingMutableContainers error:nil];
[Dialect setMainLocalizationDictionary:enJson table:@"en" update:NO storeOnDisk:YES];

读取字段数据

[Dialect stringFor:@"message" table:@"zh"];

更新数据并保存

NSData *enData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"updateEn" ofType:@"json"]];
NSDictionary *enJson = [NSJSONSerialization JSONObjectWithData:enData options:NSJSONReadingMutableContainers error:nil];
[Dialect setMainLocalizationDictionary:enJson table:@"en" update:YES storeOnDisk:YES];

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675043.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python:流程控制

4.1 顺序结构 在任何编程语言中最常见的程序结构就是顺序结构。顺序结构就是程序从上到下一行行地执行,中间没有任何判断和跳转。 如果Python程序的多行代码之间没有任何流程控制,则程序总是从上往下依次执行,排在前面的代码先执行&#xf…

第5章——深度学习入门(鱼书)

第5章 误差反向传播法 上一章中,我们介绍了神经网络的学习,并通过数值微分计算了神经网络的权重参数的梯度(严格来说,是损失函数关于权重参数的梯度)。数值微分虽然简单,也容易实现,但缺点是计…

STM32内存管理

一.什么是内存管理 内存管理是计算机系统中的一个重要组成部分,它负责管理计算机的内存资源。内存管理的主要目标是有效地分配、使用和释放内存,以满足程序的运行需求。 内存是计算机用于存储程序和数据的地方,它由一系列内存单元组成&#…

Flink 2.0 状态存算分离改造实践

本文整理自阿里云智能 Flink 存储引擎团队兰兆千在 FFA 2023 核心技术(一)中 的分享,内容关于 Flink 2.0 状态存算分离改造实践的研究,主要分为以下四部分: Flink 大状态管理痛点 阿里云自研状态存储后端 Gemini 的存…

利用路由懒加载和CDN分发策略对极客园项目进行性能优化

文章目录 前言1.配置路由懒加载2.项目资源打包3.包体积可视化分析4.cdn配置 总结 前言 极客园项目的完成之后,我们需要对项目进行打包以及性能优化,优化用户体验以及加快响应时间,本文只列举了路由懒加载和cdn分发的策略 1.配置路由懒加载 …

政安晨:快速学会~机器学习的Pandas数据技能(二)(索引、选择与赋值)

小伙伴们,今天这篇文章里讲到的操作,专业的数据科学家每天都会执行这个动作数十次。你当然也可以做到! 概述 选择pandas DataFrame或Series中的特定值进行操作是几乎任何数据操作中的一个隐含步骤,因此在使用Python处理数据时&am…

怎么给《Cyberpunk 2077》制作功能性MOD

Cyberpunk的官方mod支持【REDmod】:https://www.cyberpunk.net/zh-cn/modding-support。官网有三个视频教程,其中第二集演示了脚本的替换,比较合程序员的胃口。 REDmod 是《赛博朋克 2077》的免费 DLC(须购买游戏之后才能下载&am…

【Java 数据结构】String进阶

字符串常量池 1. 创建对象的思考2. 字符串常量池(StringTable)3. 再谈String对象创建 1. 创建对象的思考 下面两种创建String对象的方式相同吗? public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 …

前端ajax技术

ajax可以实现局部刷新,也叫做无刷新,无刷新指的是整个页面不刷新,只是局部刷新,ajax可以自己发送http请求,不用通过浏览器的地址栏,所以页面整体不会刷新,ajax获取到后台数据,更新页…

计算机毕业设计 | SSM超市进销存管理系统(附源码)

1,绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约,外国人迈克尔库伦开设了第一家合作商店,为了更好地吸引大量客流量,迈克尔库伦精心设计了低价策略,通过大量进货把商品价格压低,通过商店一次性集…

Nginx中logs的nginx.pid文件引发的问题

Nginx中logs的nginx.pid文件引发的问题 Q1:nginx: [error] CreateFile() "D:\software\nginx-1.22.1/logs/nginx.pid" failed (2: The system cannot find the file specified)Q2:nginx: [error] invalid PID number "" in "D:…

掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧

目录 虚拟机介绍 虚拟机的关键字 服务器架构的发展 为什么用虚拟机VMware 虚拟机和阿里云的区别 功能角度 价格因素 应用场景 优势方面 找到windows的服务管理 配置VMware 关于VMware安装的几个服务 vmware如何修改各种网络配置 关于NAT的详细信息(了解) NAT(网…

Ribbon全方位解析:构建弹性的Java微服务

第1章 引言 大家好,我是小黑,咱们今天聊聊Ribbon,这货是个客户端负载均衡工具,用在Spring Cloud里面能让咱们的服务调用更加灵活和健壮。负载均衡,听起来挺高大上的,其实就是把外界的请求平摊到多个服务器上,避免某个服务器压力太大,其他的却在那儿闲着。 Ribbon的牛…

Netty连接通道中的Channel参数模型

ChannelOption(Channel中的连接参数) ChannelOption.SOBACKLOG ChannelOption.SO_BACKLOG对应的是tcp/ip协议listen函数中的backlog参数,服务端处理客户端连接请求是顺序处理的,所以同一时间只能处理一个客户端连接,多个客户端来的时候&…

传输层协议 ——— TCP协议

TCP协议 TCP协议谈谈可靠性为什么网络中会存在不可靠?TCP协议格式TCP如何将报头与有效载荷进行分离?序号与确认序号 确认应答机制(ACK)超时重传机制连接管理机制三次握手四次挥手 流量控制滑动窗口拥塞控制延迟应答捎带应答面向字…

使用ESP-01/ESP-01S接入Homekit远程控制电器

一、准备材料 ESP-01/ESP-01s 芯片 、 继电器模块 、 烧录器 二、下载固件和烧录软件 固件地址https://github.com/RavenSystem/esp-homekit-devices 烧录软件下载地址:https://drive.google.com/file/d/1_M4EzolaJWpYXts_FwUIqH8pZWqy-fye/view 三、烧录固件 …

【原创】Qt库open62541 MinGW编译

一、前言 为了统一公司的驱动层开发,准备采用OpcUA的方式转发底层数据,而服务器有Windows Server,也有CentOS,因此想用Qt开发一个基于MinGW的OpcUA Server,这样就能跨平台部署。这里记录一下,希望对你也有用…

神经网络 | 常见的激活函数

Hi,大家好,我是半亩花海。本文主要介绍神经网络中必要的激活函数的定义、分类、作用以及常见的激活函数的功能。 目录 一、激活函数定义 二、激活函数分类 三、常见的几种激活函数 1. Sigmoid 函数 (1)公式 (2&a…

问题:创业者在组建创业团队时,在个人特征和动机方面更应该注重创业者的( ) #知识分享#微信#媒体

问题:创业者在组建创业团队时,在个人特征和动机方面更应该注重创业者的( ) 参考答案如图所示

hook函数——useState

useState useState是React中的一个Hook函数,用于在函数组件中添加状态。基本使用语法如下: const [state, setState] useState(initialState) state:表示当前状态的值setState:更新状态的函数initialState:初始状态…