i18n 实践及过程FAQ
目录
- 1 💁♀️ i18n Key 推荐命名方式
- 1.1.1 🔡 使用4个元素进行key名定义
- 1.1.2 词条内容需要注意
- 1.1.3 🌰 Key 名称例子
- 1.1.4 🗂 归集有可能重复使用的词条
- 1.1.5 🌟 目前已定义的前缀
- 1.1.6 词条内容大小写的处理
- 1.2 📝产品设计师如何参与i18n
- 2 全员i18n!
- 2.1 🧑💻 iOS / Android 开发过程如何参与i18n
- 2.1.1 iOS i18n 同步脚本
- 2.1.1.1 1.安装 Lokalise cli工具
- 2.1.1.2 2.安装 SwiftGen
- 2.1.1.3 3.在工程目录下,执行脚本
- 2.1.1 iOS i18n 同步脚本
- 2.1 🧑💻 iOS / Android 开发过程如何参与i18n
- 3 🤔 FAQ及实践统一
- 3.1 Key命名补充
- 3.1.1 是否可以在词条KeyName的内容部分使用缩写?
- 3.1.2 内容有变量怎么办?
- 3.1.3 有些语言的复数形式比较复杂怎么办?
- 3.1.4 内容的英文单词是全小写或者全大写怎么办?
- 3.1.5 页面出现了散落的短句怎么给Key命名?
- 3.1.6 标题有多行怎么办?
- 3.2 产品文案需要注意
- 3.2.1 删除非必要的描述信息
- 3.2.2 弹窗标题直接说重点
- 3.2.3 英文标题介词放心省略
- 3.2.4 英文提示不用客气
- 3.2.5 克制使用 "成功…" 的提示文案
- 3.2.6 统一使用您作为第二人称
- 3.2.7 文案大小写的注意
- 3.3 图片素材i18n
- 3.1 Key命名补充
一起推进产品的i18n,打造国际化的一流产品。
这个文档大家都可以编辑补充,有问题请dm @PatrickChoo
💁♀️ i18n Key 推荐命名方式
根据过往实践 i18n 经验,推荐按照以下方式进行i18n Key命名:
🔡 使用4个元素进行key名定义
顺序 | 元素 | 解释 | 例子 |
---|---|---|---|
1 | 控件 | 该词条位于的模块的名称 |
|
2 | 位置 (*可选的二级归集,少用) | 该词条位于页面的位置 |
|
3 | 词条内容 | 该词条本身的含义 |
|
4 | 属性(可选) | 要求以及属性 |
|
模块/流程 后方 使用 __
双下划线 进行分隔 元素内的词组使用 _
单下划线 进行分隔
将4个元素进行组合,获得Key名称。 模块 / 流程__位置(可选)__词条内容_属性(可选)
词条内容需要注意
词条内容应尽量使用文字中的内容,因为这样无论key和代码上都比较直观。
如果标题和描述属于同一个信息块面,词条内容元素可写作:title__whats_recovery_phrase
title__whats_recovery_phrase_desc
如果信息块面没有标题,需要将内容写到 key 名上,可使用模块名 wallet__
进行归纳:title__enter_12_18_24_words_recovery_phrase
模糊的词条key名称会导致重复引用率低,或是创建时容易发生key name冲突,代码上无法清晰反应词条内容,例如:
独立的长文字:请勿导入OneKey硬件钱包助记词
🙅 不好:title__attention
(这样以后可能变成了 attention1
, attention2
, attention3
)
👌 推荐:title__dont_import_onekey_hardware_wallet_recovery_phrase
词条内容编写时可以使用 DeepL,让它协助你快速将中文内容转成英文
请看以下 Key 名称例子。
🌰 Key 名称例子
Key | 词条内容 | 命名解释 |
---|---|---|
| 版本 | 全局使用的词汇 使用 |
| 创建 | 按钮文字 使用 |
| 创建账户 | 标题 |
| 选择以下方式 | 标题下的描述 |
| 发现 | 底部导航的发现Tab |
| 热门 | “发现” 里 “DApp列表” 的 “热门” tab,为了几个并列的词列在一起,加入了二级自定义归集 |
| 关于「隐私权政策」的段落1 |
|
🗂 归集有可能重复使用的词条
使用约定的前缀归集可能重复使用的词条,避免i18n Key散落,提高Key重复使用率。
⚠️ 在归集前缀后方直接加词条内容,例如:
🙅 不好:action__home_cancel
👌 推荐:action__cancel
(其他地方也可共用这个Key)
🌟 目前已定义的前缀
我们定义了以下的前缀,如非必要请不要添加新的前缀。
前缀 | 归集内容 | 例子 |
---|---|---|
| App全局词 |
|
| 按钮及动作 |
|
| 表单内容 |
|
| 提示信息 |
|
| Alert / Action Sheet / Dialog |
|
| 页面标题 |
|
| 内容材料 |
|
| 语言 |
|
| 币种 |
|
| API 输出的提示 |
|
词条内容大小写的处理
一般短语的内容,我们使用单词首字母大写的方式进行处理,例如 Recovery Phrase。
如果短语内容需要全小写,或者全大写的场景,则在Key的后方加入:_lowercase
全小写_uppercase
全大写
📝产品设计师如何参与i18n
在产品设计定稿后,产品设计师需要在 Lokalise 进行词条录入,提供 i18n Keys 表格给开发。 开发过程中发生Key,需要同步给开发。
全员i18n!
🧑💻 iOS / Android 开发过程如何参与i18n
iOS i18n 同步脚本
脚本调用 Lokalise CLI 工具,将词条下载到项目目录下。
1.安装 Lokalise cli工具
brew tap lokalise/cli-2
brew install lokalise2
2.安装 SwiftGen
brew install swiftgen
3.在工程目录下,执行脚本
./i18n_update.sh
在同步过后,就可以在项目中调入Key了。
由于XCode处理i18n词条,不如Android Studio那样优雅,达到自动提示的效果需要生成枚举。./i18n_update.sh
脚本中已经包含了生成枚举的动作,使用 Localizable.
即可看到自动提示。
🤔 FAQ及实践统一
Key命名补充
是否可以在词条KeyName的内容部分使用缩写?
🙅
form__set_your_pwd
虽然这样建立 key 少打几个字,但是我们还是应该在词条key名上写上概括内容的完整单词,方便在代码中进行检索,如果内容不统一,比如出现pwd
和password
还有pw
,代码中搜索相关内容可能会有需要搜索多次的麻烦。
👌form__set_your_password
内容有变量怎么办?
例如:"2 个人在线"
dapp__int_people_online
使用Lokalise的 Universal Placeholders 通用占位符 会自动将位置留出,开发时传入变量,即可置入对应的位置。下载翻译文件时会对不同平台进行变量格式处理。 [%s], [%1$s], [%s:name] – String [%i], [%1$i], [%i:name] – Integer [%f], [%.2f], [%1$.2f], [%.2f:name] – FloatKey Name中使用
str
int
float
占位类型例子Key 名称翻译内容字符串ETH节点、BTC节点、DOT节点
wallet__str_nodes
英文:[%s] Nodes
中文:[%s] 节点
其中
[%s] 是字符串变量
[%6$s] 限制6位字符的字符串(比较少用)
[%s:coin] 在某些支持变量名的平台上,将显示变量的名称coin
,不支持的就不显示整数22 个人在线dapp__int_people_online
英文:[%i] People Online
中文:[%i] 人在线
其中
[%i] 是整数变量
[%2$i] 限制2位数字的整数浮点数价格 0.00238 BTCwallet__price_float_str英文:Price [%f.5f] [%s]
中文:价格 [%.5f] [%s]
第一变量传入价格浮点数类型,第二变量传入字符串 BTC一般来说
str
类型是比较常使用的,即使是遇到带数字的场景。具体需要类型可询问开发。例如 在 转账页面 的处理 慢、适中、快选项卡底部的预估时间
Key Name英文内容中文内容
form__about_str_min
About [%s] min约 [%s] 分钟当无数据时传入 "-",有数据的时候传入数据字符串“fast.time”(分钟时间的数字),即显示出对应的效果: 无数据:约 - 分钟 有数据:约 30 分钟 ⚠️ 注意 Key名照常写就可以,不要在Key名内增加placeholder
🙅form__about_[%s]_min
👌form__about_str_min
Placeholder 和相邻内容之间的空格处理
form__about_str_min
的英语翻译內容:
🙅 About[%s]min (效果: About20min)
👌 About [%s] min (效果: About 20 min)请注意内容区域不要省略
[
]
中括号,不然无法自动转换成对应平台的格式。
有些语言的复数形式比较复杂怎么办?
某些语言例如俄罗斯语,在不同的数量的时候会有不同的复数形式。 点击词条Key Name打开Key设置,选择高级 - PLURAL 功能,将自动列出不同语言需要的复数形式的填空。
内容的英文单词是全小写或者全大写怎么办?
后方加入
_uppercase
全大写_lowercase
全小写 👌form__security_uppercase
页面出现了散落的短句怎么给Key命名?
使用内容
content__
前缀前缀进行内容归纳 👌content__you_have_created_these_wallet_accounts_before_select_accounts_that_you_want_to_restore
标题有多行怎么办?
使用
_multiline
属性词,用于title__
下发生多行内容的情况。
title__
的开头的词条默认单行,但为了文字排版,标题词条有时候需要包含换行,此时写上_multiline
属性词在结尾,提示此词语是属于包含换行的词条。 好处:在代码中能清晰获知此词条会发生换行区分出有换行和没有换行的词条
例: 原词条:有 OneKey,安全和好用当然可以兼得。 这个句子在大标题处发生换行后,力量感变少了,所以我修改了大熊的文案。
👌
title__security_and_ease_of_use_multiline
安全、易用 二者兼得 界面出现大标题时,可以放心使用换行来增加排版的美观程度。(iOS有很多很好的例子)
产品文案需要注意
删除非必要的描述信息
对用户使用没有帮助的、冗余重复描述的内容,应直接删除。 需要从 UI 源头把关,克制无用信息的产生。
弹窗标题直接说重点
好的弹窗标题应该能让人扫视即可获得概要信息,不应用作多余修饰,尽量不要只写 “提示”、“警告”。
Title - Request / What’s happening - 标题直接写请求,不要害怕使用长句 Desc - Why / Solution - 为什么以及解决方式
Outlook for iOS 例: 标题:Allow “Outlook” to use your location? 描述:This will help you book conference rooms, find nearby places, show travel times, and display weather info. 动作: * Allow Once * Allow While Using App * Don’t Allow
英文标题介词放心省略
当你想写 Set the Password,标题可以直接写 Set Password。短小精悍。 描述字里的句子则完整地写出:Set your password. 按钮 Add a New Device
👌 Add New Device
按钮 Activate the Device
👌 Activate Device
英文提示不用客气
不加 Please 更符合英语直接了当的使用习惯,太多 Please 变得不直观。 例:两次输入密码不一致,请重新输入。
🙅 The two passwords are different. Please re-enter them.
👌 Passwords did not match. Try again.
克制使用 "成功…" 的提示文案
尽量使用 “已…” 替代 “成功”。功能正常运作是常态,不需要特别庆祝。
例:
msg__added_to_your_favorites
🙅 成功加入您的收藏夹!Successfully added to your favorites!
👌 已加入您的收藏夹 Added to your favorites
统一使用您
作为第二人称
关于App内使用“你”还是“您”,我记得在刚刚入行实习时候鹅厂内部BBS里面还有过专门的讨论,鹅厂以年轻化的产品为主,崇尚平等沟通的文化,所以在产品设计中大范围地使用
你
作为产品文案中的第二人称。 而 OneKey 作为资产管理的产品,给用户多一些被服务的感受是可以的,毕竟礼多人不怪。 所以我们统一用您
作为第二人称代称吧!
文案大小写的注意
品牌词,例如:
OneKey (O大写,K大写)
OneKey Touch
OneKey Mini
OneKey Pro
术语词,例如:
KeyStore (参考Google)
DApp
Backup 是名词,Back Up 是动作
图片素材i18n
i18n 除了文本词条,图片素材也需要考虑国际化。
比如首页的快速上手教程入口图,如果必须做成图片,那就需要输出多个国家语言的图片资源。
所以比较推荐使用代码绘制图片素材中的文字,图片素材预留文字位置。