iOS 国际化(多语言)

news2024/11/15 10:48:48

一、应用程序国际化

包括app名称和各种权限的提示文字。

1.1 创建工程,再在“PROJECT”的“Info”里面,添加所需语言。在这里插入图片描述

1.2 从代码中分离出文本

创建一个 “.strings” 扩展名的文件
来本地化字符串,需要把这些字符串全部放在一个单独的文件中。它将会在包中简单地引用这些字符串,而不是在实现、使用的方法中进行硬编码。
Xcode使用带有 “.strings” 扩展名的文件来存储和检索 程序中使用的所有字符串,以及支持的每种语言。根据iOS设备当前所使用的语言,在代码中一个简单的方法调用将会查找并返回符合设备语言要求的字符串。点击右键,选择“New File…”,选择“iOS”对应的“Resource”中的“Strings File”,如图:在这里插入图片描述
点击“Next”,为文件命名为InfoPlist.strings,然后点击“save”。

1.3 添加语言

创建完“InfoPlist.strings”(命名随意~),工程目录结构文件如下,单击“InfoPlist.strings”,查看右边的属性,在Localizable栏添加语言。如图:
在这里插入图片描述
在这里插入图片描述

添加之后,效果如下:

在这里插入图片描述
这个时候就可以在对应语言的“InfoPlist.strings”文件中,添加所支持的字符串了。

中文对应的文件里添加:

"CFBundleDisplayName" = "App名字";
"NSCameraUsageDescription" = "App 需要访问您的相机来扫描二维码绑定设备";
"NSContactsUsageDescription" = "App 需要访问您的通讯录来实现通讯录备份";
"NSPhotoLibraryAddUsageDescription" = "App 需要访问您的相册来保存图片或视频";
"NSPhotoLibraryUsageDescription" = "App 需要访问您的相册来发送图片或扫描二维码";
"NSLocationWhenInUseUsageDescription" = "App 需要您允许定位以把位置保存到照片中";

英文对应的文件里添加:

"CFBundleDisplayName" = "=App Name";
"NSCameraUsageDescription" = "App needs access to your camera to scan QR code binding devices";
"NSContactsUsageDescription" = "App needs to access your address book to achieve address book backup";
"NSPhotoLibraryAddUsageDescription" = "App needs access to your photo album to save images or videos";
"NSPhotoLibraryUsageDescription" = "App needs to access your photo album to send pictures or scan QR code";
"NSLocationWhenInUseUsageDescription" = "App requires you to allow positioning to save the location to the photo";

二、内容国际化

2.1 创建一个“Localizable.strings” 文件

创建一个“Localizable.strings” 文件(点击右键,选择“New File…”,选择“iOS”对应的“Resource”中的“Strings File”)。
在这里插入图片描述
注意:Localizable.strings 是系统默认名字,不能更改。

2.2 添加内容

添加语言在Localization.strings 中,按照"key" = “value"的格式。在使用时,用NSLocalizedString(@“key”, @”")读取内容。

Localization.strings (English)文件中,添加:

"第一!绝对不意气用事!" = "The first!Absolutely not impulsive!";
"第二!绝对不漏判任何一件坏事!" = "The second!Definitely not missing any bad thing!";
"第三!绝对裁判的公正漂亮!" = "The third!Absolutely the referee just beautiful!";

Localization.strings (Chinese)文件中,添加:

"第一!绝对不意气用事!" = "第一!绝对不意气用事!";
"第二!绝对不漏判任何一件坏事!" = "第二!绝对不漏判任何一件坏事!";
"第三!绝对裁判的公正漂亮!" = "第三!绝对裁判的公正漂亮!";

如图所示:

在这里插入图片描述

在这里插入图片描述

调用:

  NSString * label_Str1 = NSLocalizedString(@"第一!绝对不意气用事!", nil);
  NSString * label_Str2 = NSLocalizedString(@"第二!绝对不漏判任何一件坏事!", nil);
  NSString * label_Str3 = NSLocalizedString(@"第三!绝对裁判的公正漂亮!", nil);
  NSString * label_Str = [NSString stringWithFormat:@"%@\n%@\n%@",label_Str1,label_Str2,label_Str3];

  UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(10, 240, self.view.frame.size.width, 120.f)];
  label.text = label_Str;
  //自动换行
  label.numberOfLines = 0;
  [self.view addSubview:label];

优化: 在pch头文件中,定义一个国际化对应的宏!

 //宏定义国际化字符
 #define NSLocalString(a)   (NSLocalizedString(a, nil))

使用:

 NSString * label_Str1 = NSLocalString(@"第一!绝对不意气用事!");

判断支持的语言、当前语言:

NSArray *languages = [NSLocale preferredLanguages];       
NSLog(@"支持的languages:%@",languages);

NSString *currentLanguage = [languages objectAtIndex:0];
NSLog(@"当前语言currentLanguage:%@",currentLanguage); //日语:ja-CN、法语:fr-CN、fr-CA

三、多语言文件编译报错

项目实现国际化功能,编译时遇到错误,read failed: Couldn’t parse property list because the input data was in an invalid format。

3.1 问题分析

数据格式错误一般会有下面几种情况:

末尾少了分号
字符使用了全角字符(中文字符)
中间少了 =
少了双引号或者引号没有成对出现
文本中出现了不必要的特殊字符
这是个小问题,主要看怎么快速查找出问题,下面给出三种方法

3.2 问题解决

3.1 肉眼检索

最简单最直接的方式,肉眼检索,找到问题改正。

这种方式一般适用于文件小,内容少的情况。

如果内容多,有十几个国家的翻译文件,这种方法显然不合适。

3.2 减半筛查

把翻译文件中的内容每次注释掉一半,再编译,如果没有报错,问题就出现另外一半。将另外一半再注释掉一半,再编译,如此重复也能快速的排查出问题所在。

3.3 借助工具 Localizable (付费)

Localizable 是 Mac 上的一款桌面工具,在商店搜索 Localizable 就可以找到,使用方式也很简单,只需要将 Localizable.strings 文件拖到对应区域就可以,然后会反馈哪一行格式有问题,对应解决就好,非常方便。

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

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

相关文章

【医学数据融合文本方向 思路整理】

Scalable and accurate deep learning for electronic health records【2018】 本论文在于介绍 Google Medical Brain 项目的目标、方法和规划。 思路: 用病情描述,预测疾病诊断,预测死亡率 用病情描述加治疗方案,预测复诊率和住院…

Elasticsearch7.8.0版本高级查询—— 查询所有文档

目录一、初始化文档数据二、查询所有文档示例一、初始化文档数据 在 Postman 中,向 ES 服务器发 POST 请求 :http://localhost:9200/user/_doc/1,请求体内容为: {"name":"张三","age":22,"sex…

Zookeeper 【下载与安装,基本使用】

目录 1. 什么是zookeeper 2. zookeeper下载与安装 3. Zookeeper 测试 1. 什么是zookeeper zookeeper实际上是yahoo开发的,用于分布式中一致性处理的框架。最初其作为研发Hadoop时的副产品。 由于分布式系统中一致性处理较为困难,其他的分布式系统没有…

SAP MTO/MTS操作步骤及月末结算

一、MTO/MTS操作步骤 【MTO核算方式】 是以销售订单触发生产的方式。 创建销售订单 VA01 运行物料需求计划 MD01 查询物料需求 MD04 计划订单转化为生产订单 MD04/CO01 生产订单成本计算以及下达 CO02 生产订单发料 MB1A 生产报工 CO11N 完成品入库 MB31 非限制库存转移到销售…

C# opencv多模板匹配实战应用例程

C# 多模板匹配例程 最近在做项目的时候为了检测某一种物品的齐套性,以及为了和写c#的软件负责人配合自己研究了一下opnencv C# 版的模板匹配,对基础的例程做了一下改进,留一份例程。 因为工作性质原因不能直接放项目的实际图片我用visio简单…

我的个人微信也迅速接入了 ChatGPT

本文主要来聊聊如何快速使用个人微信接入 ChatGPT,欢迎 xdm 尝试起来,仅供学习参考,切莫用于做不正当的事情 关于 ChatGPT 我们每个人都可以简单的使用上,不需要你有很强的技术背景,不需要你有公众号,甚至…

Chat GPT 创建APP: 开发人员要被替代了吗?

我们又要被人工智能取代了吗?GitHub Copilot 于 2021 年 10 月发布,整个开发社区都为之疯狂。有些人发表言论说我们很快就会失业,而其他人(比如我),认为虽然这个工具很有趣,但距离替代人工还很远…

【Django框架】——25 Django视图 07 状态保持Session

文章目录1.session流程图2.session语法与案例3.session配置cookie不安全,会把所有敏感数据放到浏览器保存。 session是把敏感数据存到自己的服务器中给浏览器一把钥匙就行了(是基于cookie完成的)。 Django 提供对匿名会话(session)的完全支…

Cisco Packet Tracer 8.2.x Crack

Cisco Packet Tracer 是一个网络模拟器。有了这款功能强大的软件,用户可以在模拟和安全的环境中学习所有网络主题,而无需花费很多钱。它是网络主题模拟和培训领域中最受欢迎的应用程序之一,因为它提供了这样做所需的所有功能。Packet Tricer …

Java方法(函数)

文章目录Java方法(函数)一、方法介绍二、方法的定义和调用格式1. 快速入门2. Debug查看方法的执行流程3. 方法调用内存图解4. 带参数方法的定义和调用1)定义和调用格式2)形参和实参5. 带返回值方法的定义和调用6. 方法通用定义格式三、方法常见问题四、方…

MIPI 摄像头的原理

1. 摄像头sensor 的原理 定时脉冲生成器会生成clock,用于访问image sensor 阵列中的行,预充电,并且按顺序采样像素阵列中的所有行。在一个行的预充电和采样的时间段里,像素的电荷量会随着曝光时间而逐渐减少。这就是快门结构中的曝…

擎创技术流 | ClickHouse实用工具—ckman教程(10)

一、前言 哈喽~友友们,转眼农历新年就在眼前,ckman系列也终于迎来了最后一期,非常感谢大家的喜欢,让up主有动力做完这个系列,也感谢一路走来,大家给予的反馈,让这个系列越做越好。 接下来&…

4-Spring使用

目录 1.存储Bean对象到Spring容器中 1.1.创建Bean 1.2.将Bean注册到Spring容器中 1.2.1.第一次存储Bean(可选,如果是第二次及以后,此步骤忽略) 1.2.2.添加Bean标签 2.从Spring容器中获取并使用Bean对象 2.1.创建Spring上下…

剑指 Offer 04. 二维数组中的查找 [C语言]

目录题目思路代码结果该文章只是用于记录考研复试刷题题目 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数&#xff…

[leetcode 1723] 完成所有工作的最短时间

题目 题目:https://leetcode.cn/problems/find-minimum-time-to-finish-all-jobs/description/ 该题和 [leetcode 2305] 公平分发饼干 完全相同。 解法 回溯剪枝 感觉和 [leetcode 198] 划分为k个相等的子集 有点相似,这题更像是划分为k个尽量相等的子…

easypoi 模板导入、导出合并excel单元格功能

easypoi 模板导入、导出合并单元格功能 参考: java使用poi读取跨行跨列excel springboot集成easypoi并使用其模板导出功能和遇到的坑 Easypoi Excel模板功能简要说明 easypoi 模板导出兼容合并单元格功能 ExcelUtil package com.yymt.utils;import cn.aftertu…

linux系统中利用QT实现环境传感器的数据获取方法

大家好,今天主要和大家分享一下,如何使用QT实现对三合一环境传感器的数据的获取和实现。 目录 第一:资源介绍 第二:具体代码的详细实现 第三:源文件“mainwindow.h”实现 第四:Linux应用接口获取数据 第…

大趋势:科技赋能产业

能整合传统产业资源的老板大优势! 三大趋势: 科技赋能产业链 乡村振兴 文化复兴 纯技术类企业在产业链方面不占优势 趣讲大白话:时势造英雄 ******** 消费互联网竞争太卷了 竞争向产业升级方向转移 向高质量发展导向 乡村振兴是整合分散的集…

容器虚拟化技术Docker(一)简介、安装、常见命令、数据卷、安装常规软件

容器虚拟化技术Docker(一)简介、安装、常见命令、数据卷、安装常规软件 1、Docker简介 1、简介 Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理&a…

web3:同态加密

web3相关学习一并收录至该博客:web3学习博客目录大全 目录同态加密概念同态加密具体如何定义?主流同态加密算法原理乘法同态加密算法① RSA算法一些基本的数学知识RSA的具体过程秘钥的产生加密解密验证了 RSA 算法的乘法同态性java代码简单实现python代码…