Ghost是一个基于节点的行业领先的开源出版平台。创作者(Ali Abdaal,Scatchy,Desk),出版商(杠杆,大西洋,浏览器)和公司(Unplash,Duckduckgo,Openai,Mozilla)使用我们的平台来发布,分享,分享和发展其内容的业务。<<<<<<<<<<<<<<<<<<<<<< /p>
因为我们的用户是全局的,更好的翻译支持(I18N)已成为我们最要求的功能。 Hacktoberfest似乎是向开发社区寻求帮助的帮助的绝佳机会。
虽然开发人员过去曾为翻译各个组件做出了贡献,但我们认为需要使用单个解决方案来解决I18N。因此,我们制定了一个概述该解决方案要求的计划。
i18n Milestone 2: Framework and build tools #15502
此问题代表了我们I18N项目中的一个里程碑。完整的项目记录了on the Ghost forum。
预期结构
- monorepo中的一个新的
ghost/locales
文件夹包含名称json文件,例如locales/es/common.json
,/ocales/es/portal.json
,locales/es/email.json
- 对于node.js/email-templates,我们做一个:
- (首选)正确的路径是根据环境从配置加载的
- 鬼魂/地区被复制到鬼魂/核心
- 然后为React:
- 使用代码拆分为每个受支持的语言环境生成单个版本的门户。
目标:
- []将i18next的基本片段放在适当的位置并根据the tech spec进行配置
- []实施预期结构(见上文)
- []弄清楚我们是否需要切换到门户中的Vitejs以实现所需的构建(可能需要Ghost Team的帮助)
- []在电子邮件和门户网站中有1个插值字符串
- []用于提取字符串和生成文件的工具
tasks:
- []将门户移至Monorepo(幽灵团队即将完成)
- []门户的构建工具的演示/尖峰 - 我认为这是最难的部分,因此我们应该先做
- []网站文件如何将其拉入node.js的示例/电子邮件模板
- [] I18Next接线的演示/尖峰,因此门户中有一个插值字符串,电子邮件模板中有一个
- []工具的演示/尖峰,可以抓住2个插值字符串,例如
yarn translate es
将创建/locales/es/portal.js
和/locales/es/email.js
每个包含一个字符串。
我希望找到对不同部分进行初始SPIKE实现的人 - 然后我们可以更清楚地找出任务。
参与和hacktoberfest的注释:
我们不会合并尚不匹配规格的半烘烤尖峰或接线 - 因此,如果您只是想尽快通过Hacktoberfest,这不是您的问题! (虽然有很多小错误!)
但是,如果您将Hacktoberfest用作寻找一个很酷且有意义的项目的工具,那么这应该是您的街道:)
我们将尽最大努力确保那些积极贡献该项目的人在Hacktoberfest结束时得到合并并适当地标记的人,
问题
目前,只有我们的主题层可以使用定制的I18N框架(我们不想构建)可以翻译。但是,我们的本地会员资格(门户网站),电子邮件,评论和搜索系统无法翻译。
由于这些系统只有一组需要翻译成每种语言的字符串,因此将这些翻译成为Ghost Core的一部分是很有意义的(即,内置在产品本身中)。
解决方案
我们希望能够根据用户在常规设置中定义的语言提供翻译的电子邮件和小部件(会员,评论,搜索)。从技术上讲,解决方案归结为回答两个关键问题:
- 翻译的字符串从何而来?
- 替换字符串如何插值?
(1)的答案是一些描述的JSON文件。我们不想在像Transifex这样的第三方工具中管理翻译,但是我们希望将所有JSON文件保存在GitHub中。需要加载字符串并将其传递到所需的所有位置。
(2)的答案是{{t}}
的助手,在React和电子邮件模板中都需要存在。我们希望将现有模式保留在使用默认字符串作为密钥的主题中。这意味着,当更改默认字符串时,需要以所有语言进行重新翻译,这是可取的,因为更改通常比化妆品更重要。
我们还需要一种方法来收集所有默认字符串并将其编译成新的JSON文件,准备翻译。
对于电子邮件模板,插值是动态的,在发送时完成的动态是有意义的,因为这是服务器端系统。对于我们的React小部件,我们想为每次翻译创建一个自定义构建,因此可以加载特定于语言的脚本,例如portal-es.min.js
。
通过确保所有可翻译成分和翻译本身在幽灵Monorepo中生活在一起,将使I18N的几个方面变得更加容易。这是该过程的第一部分,已经完成了ð
技术计划
我们的基本要求是:
- 加载一组翻译 +(也许)一组自定义字符串到React Widgets
- 将一组翻译加载到电子邮件的幽灵核心
- 未来:管理的负载翻译
- 用于车把和React的插值工具
- 能够将默认字符串用作键
- 能够生成带有所有可用键的新语言文件
- 不必加载所有翻译,例如,所有门户网站翻译成注释
- 在Github中有一个位置,在该位置定义了
- 理想情况下:为每个JS小部件生成一个每个区域的构建,例如
portal-es.min.js
最后的要求是最困难的,因为我们需要找出我们的React项目的构建步骤……但这应该是一次性的。
i18next 4框架似乎支持我们的每个要求,包括fallback-based keys,namespacing,以及为extracting translation strings提供工具。它的插件也可扩展,并具有用于管理翻译过程的工具的链接,因此我们可以拥有一个yarn check-translations
命令来查看未翻译的内容。
预期结构:
- monorepo中的一个新的
ghost/locales
文件夹,其中包含名称json文件,例如,locales/es/common.json
,locales/es/portal.json
âlocales/es/email.json
- 对于node.js/email-templates,我们做一个:
- (首选)正确的路径是根据环境从配置加载的
-
ghost/locales
被复制到ghost/core
- 然后为React:
- 使用代码拆分来生成门户的单个版本,评论并搜索每个受支持的语言环境。
以下是使用i18next与webpack一起使用代码拆分来创建一个构建步骤的some details,但这并不是我们想要的。我们目前正在研究改用构建工具的Vite,这可能最终是另外的先决条件。
里程碑
这个项目具有先决条件,相当复杂,并且具有许多不同的阶段,不同的社区成员可能希望参与其中。因此,我们将项目分解为里程碑,并将此线程保持最新状态。
里程碑1:monorepo
- 需要将门户合并到monorepo 中
- 评论和搜索将在以后进行,但是没有它们的项目可以继续。
谁:这个里程碑已由幽灵团队完成。
里程碑2:框架和构建工具
- 从上述实施预期结构
- 将i18next的基本部分放在原地
- 弄清楚我们是否需要切换到门户中的Vite(可能需要Ghost Team的帮助)
- 在电子邮件和门户中有一个插值字符串
- 用于提取字符串和生成文件的工具
谁:寻找感兴趣的贡献者,幽灵团队将在需要时提供帮助和/或开始。
里程碑3:插值字符串
- 使用
{{t}}
的助手和默认值,现有的美国英语字符串作为密钥。 - 注释-UI和SodoSearch现在也应该在Monorepo中,因此这些字符串也可以插值。
谁:寻找感兴趣的贡献者
里程碑4:翻译
- 应完善用于将字符串提取到新的语言环境文件中的工具
- 将所有字符串翻译成其他语言。
谁:寻找感兴趣的贡献者
在GitHub上查看此问题以获取更多信息:
i18n Milestone 2: Framework and build tools #15502
此问题代表了我们I18N项目中的一个里程碑。完整的项目记录了on the Ghost forum。
预期结构
- monorepo中的一个新的
ghost/locales
文件夹包含名称json文件,例如locales/es/common.json
,/ocales/es/portal.json
,locales/es/email.json
- 对于node.js/email-templates,我们做一个:
- (首选)正确的路径是根据环境从配置加载的
- 鬼魂/地区被复制到鬼魂/核心
- 然后为React:
- 使用代码拆分为每个受支持的语言环境生成单个版本的门户。
目标:
- []将i18next的基本片段放在适当的位置并根据the tech spec进行配置
- []实施预期结构(见上文)
- []弄清楚我们是否需要切换到门户中的Vitejs以实现所需的构建(可能需要Ghost Team的帮助)
- []在电子邮件和门户网站中有1个插值字符串
- []用于提取字符串和生成文件的工具
tasks:
- []将门户移至Monorepo(幽灵团队即将完成)
- []门户的构建工具的演示/尖峰 - 我认为这是最难的部分,因此我们应该先做
- []网站文件如何将其拉入node.js的示例/电子邮件模板
- [] I18Next接线的演示/尖峰,因此门户中有一个插值字符串,电子邮件模板中有一个
- []工具的演示/尖峰,可以抓住2个插值字符串,例如
yarn translate es
将创建/locales/es/portal.js
和/locales/es/email.js
每个包含一个字符串。
我希望找到对不同部分进行初始SPIKE实现的人 - 然后我们可以更清楚地找出任务。
参与和hacktoberfest的注释:
我们不会合并尚不匹配规格的半烘烤尖峰或接线 - 因此,如果您只是想尽快通过Hacktoberfest,这不是您的问题! (虽然有很多小错误!)
但是,如果您将Hacktoberfest用作寻找一个很酷且有意义的项目的工具,那么这应该是您的街道:)
我们将尽最大努力确保那些积极贡献该项目的人在Hacktoberfest结束时得到合并并适当地标记的人,
在our Forum中查找更多信息
如果您有兴趣帮助该项目2-4的里程碑,我们很乐意在下面的评论中收到您的来信。