From 8fbb3f52bbc6336d06289604f42de7fd260550f5 Mon Sep 17 00:00:00 2001 From: wxzhang Date: Fri, 5 Aug 2022 16:53:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8A=A8=E6=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E8=AF=AD=E7=A7=8D=E5=92=8C=E8=AF=AD=E8=A8=80=E5=8C=85?= =?UTF-8?q?=E8=A1=A5=E4=B8=81=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/.vuepress/config.ts | 3 +- .../public/images/VoerkaI18n群二维码.png | Bin 0 -> 14893 bytes docs/.vuepress/sidebar/zh.ts | 8 +- docs/readme.md | 40 ++- docs/zh/guide/advanced/langedit.md | 16 + docs/zh/guide/advanced/lngpatch.md | 6 + docs/zh/guide/advanced/remoteLoad.md | 246 ++++++++++++++++ docs/zh/guide/intro/get-started.md | 28 ++ docs/zh/guide/intro/history.md | 10 +- docs/zh/guide/intro/readme.md | 4 +- docs/zh/guide/intro/support.md | 4 + docs/zh/guide/intro/versions.md | 11 + docs/zh/home.md | 37 ++- docs/zh/reference/lang-code.md | 34 ++- .../vueapp/public/languages/vueapp/de.json | 8 + .../vueapp/public/languages/vueapp/en.json | 3 + .../vueapp/public/languages/vueapp/zh.json | 4 + packages/apps/vueapp/src/App.vue | 3 + packages/apps/vueapp/src/languages/cn.js | 8 - packages/apps/vueapp/src/languages/index.js | 10 +- .../apps/vueapp/src/languages/settings.json | 8 +- packages/apps/vueapp/src/main.js | 6 + packages/autopublish/index.js | 22 +- packages/babel/package.json | 6 +- packages/cli/languages/runtime.js | 143 +++++++-- packages/cli/package.json | 6 +- packages/demo/apps/app/languages/cn.js | 27 -- packages/demo/apps/app/languages/en.js | 27 -- .../demo/apps/app/languages/formatters.js | 105 ------- packages/demo/apps/app/languages/idMap.js | 27 -- packages/demo/apps/app/languages/index.js | 57 ---- packages/demo/apps/app/languages/package.json | 3 - packages/demo/apps/app/languages/settings.js | 15 - .../app/languages/translates/default.json | 278 ------------------ packages/demo/apps/lib1/languages/idMap.js | 7 - packages/demo/apps/lib2/languages/idMap.js | 7 - packages/formatters/package.json | 4 +- packages/react/package.json | 2 +- packages/runtime/dist/index.cjs | 2 +- packages/runtime/dist/index.cjs.map | 2 +- packages/runtime/dist/index.esm.js | 2 +- packages/runtime/dist/index.esm.js.map | 2 +- packages/runtime/dist/runtime.cjs | 143 +++++++-- packages/runtime/dist/runtime.mjs | 143 +++++++-- packages/runtime/index.js | 35 ++- packages/runtime/package.json | 6 +- packages/runtime/scope.js | 104 ++++++- packages/utils/index.js | 2 +- packages/utils/package.json | 6 +- packages/vite/package.json | 6 +- packages/vue/package.json | 2 +- 51 files changed, 996 insertions(+), 692 deletions(-) create mode 100644 docs/.vuepress/public/images/VoerkaI18n群二维码.png create mode 100644 docs/zh/guide/advanced/langedit.md create mode 100644 docs/zh/guide/advanced/lngpatch.md create mode 100644 docs/zh/guide/advanced/remoteLoad.md create mode 100644 docs/zh/guide/intro/support.md create mode 100644 docs/zh/guide/intro/versions.md create mode 100644 packages/apps/vueapp/public/languages/vueapp/de.json create mode 100644 packages/apps/vueapp/public/languages/vueapp/en.json create mode 100644 packages/apps/vueapp/public/languages/vueapp/zh.json delete mode 100644 packages/apps/vueapp/src/languages/cn.js delete mode 100644 packages/demo/apps/app/languages/cn.js delete mode 100644 packages/demo/apps/app/languages/en.js delete mode 100644 packages/demo/apps/app/languages/formatters.js delete mode 100644 packages/demo/apps/app/languages/idMap.js delete mode 100644 packages/demo/apps/app/languages/index.js delete mode 100644 packages/demo/apps/app/languages/package.json delete mode 100644 packages/demo/apps/app/languages/settings.js delete mode 100644 packages/demo/apps/app/languages/translates/default.json delete mode 100644 packages/demo/apps/lib1/languages/idMap.js delete mode 100644 packages/demo/apps/lib2/languages/idMap.js diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index c9d2e59..0710d35 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -9,7 +9,7 @@ export default defineUserConfig({ locales : { "/" : { lang : "zh-CN", - title : "中文" + title : "VoerkaI18n" }, "/en/" : { lang : "en-US", @@ -22,6 +22,7 @@ export default defineUserConfig({ name : "wxzhang", url : "https://gitee.com/zhangfisher/voerka-i18n", }, + iconAssets : "iconfont", iconPrefix : "iconfont icon-", logo : "/logo.svg", home : "/zh/home", diff --git a/docs/.vuepress/public/images/VoerkaI18n群二维码.png b/docs/.vuepress/public/images/VoerkaI18n群二维码.png new file mode 100644 index 0000000000000000000000000000000000000000..891c72534d6d32bc0fa5365e67178c9cef6c41cb GIT binary patch literal 14893 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 literal 0 HcmV?d00001 diff --git a/docs/.vuepress/sidebar/zh.ts b/docs/.vuepress/sidebar/zh.ts index 35963a5..1b99622 100644 --- a/docs/.vuepress/sidebar/zh.ts +++ b/docs/.vuepress/sidebar/zh.ts @@ -8,6 +8,9 @@ export const zh = { "", "install.md", "get-started.md", + "versions.md", + "support.md", + "history.md" ] }, { @@ -37,7 +40,10 @@ export const zh = { "customformatter", "langpack", "autotranslate", - "framework" + "framework", + "remoteLoad", + "lngpatch", + "langedit" ] }, { diff --git a/docs/readme.md b/docs/readme.md index d52df11..5723bdf 100644 --- a/docs/readme.md +++ b/docs/readme.md @@ -6,13 +6,12 @@ heroImage: /logo.svg heroText: VoerkaI18n tagline: 适用于Nodejs/Vue/React的国际化解决方案 actions: + - text: 安装 + link: /zh/guide/intro/install + type: primary - text: 快速入门 link: /zh/guide/intro/get-started - - text: 源码 - link: https://gitee.com/zhangfisher/voerka-i18n - type: secondary - features: - title: 工程化支持 icon: markdown @@ -20,7 +19,7 @@ features: link: - title: 集成自动翻译 - icon: slides + icon: tab details: 调用在线翻译服务API支持对提取的文本进行自动翻译,大幅度提高工程效率 link: @@ -44,16 +43,37 @@ features: details: 支持monorepo工程下多库进行语言切换的联动机制 link: - - title: 自动扩展工具 + - title: 工具链 icon: palette - details: 提供Vue/React/Babel等扩展插件,简化各种应用下 + details: 提供Vue/React/Babel等扩展插件,简化各种应用开发 link: - - title: 扩展特性 + - title: 插值变量 icon: contrast - details: 强大的插值变量机制,能扩展支持复数、日期、货币等灵活强大的多语言机制 + details: 强大的插值变量机制,能扩展支持复数、日期、货币等灵活强大的多语言特性 link: -footer: MIT Licensed | Copyright © 2022-present wxzhang + - title: 语言补丁 + icon: palette + details: 在应用上线后发现错误时可以在线修复 + link: + + - title: 动态增加语种 + icon: blog + details: 可以在应用上线后动态增加语种支持 + link: + + - title: 扩展在线编辑 + icon: info + details: 很容易扩展支持在线语言包编辑 + link: + + - title: 复数支持 + icon: contrast + details: 灵活而强大的复数机制 + link: + + +footer: MIT Licensed | Copyright © 2022-present wxzhang --- \ No newline at end of file diff --git a/docs/zh/guide/advanced/langedit.md b/docs/zh/guide/advanced/langedit.md new file mode 100644 index 0000000..8672f97 --- /dev/null +++ b/docs/zh/guide/advanced/langedit.md @@ -0,0 +1,16 @@ +# 在线编辑语言包 + +利用**动态加载语言包**的机制,开发者可以非常容易就开发出`让用户自行编辑界面语言`的功能。 + +请详细阅读[`远程加载语言包`](./remoteLoad)的实现过程,其基本思路如下: +- 后端采用数据库来保存语言包,每一个语言包可以用一个表或多个表存储。 +- 编写对应的编辑语言包的Web API,实现通过API修改语言包功能 +- 前端代码重写语言包加载器函数,将原来的读取静态语言包的方式,修改为采用API读取 +- 前端增加编辑语言包的界面 + + + + + + + diff --git a/docs/zh/guide/advanced/lngpatch.md b/docs/zh/guide/advanced/lngpatch.md new file mode 100644 index 0000000..50edd43 --- /dev/null +++ b/docs/zh/guide/advanced/lngpatch.md @@ -0,0 +1,6 @@ +# 语言包补丁 + +在实际应用中,我们经常会在应用上线后,发现应用中的语言翻译错误,此时就可以利用`voerkai18n`的语言包补丁特性来解决此问题。 +利用`voerkai18n`的语言包补丁特性,您就可以随时修复翻译错误,而不需要重新打包应用。 + +启用语言包补丁功能需要注册默认的语言包加载器,使用方法详见`动态加载语言包`介绍。 diff --git a/docs/zh/guide/advanced/remoteLoad.md b/docs/zh/guide/advanced/remoteLoad.md new file mode 100644 index 0000000..1f816de --- /dev/null +++ b/docs/zh/guide/advanced/remoteLoad.md @@ -0,0 +1,246 @@ +# 远程加载语言包 + +## 前言 +`voerkai18n`默认将要翻译的文本内容经编译后保存在当`languages`文件夹下,当打包应用时会与工程一起进行打包进工程源码中。这会带来以下问题: +- 翻译语言包是源码工程的一部分,当要翻译的语种较多时,会增加源码包大小。 +- 如果产品上线后发现翻译问题,则需要重新进行整个工程的打包 +- 上线后要增加一种语言,同样需要再次进行走一次打包流程 + +`voerkai18n`针对这些问题,支持了远程加载语言包的功能,可以支持线上`动态增加支持的语言`,`在线翻译补丁`等特性。 + + +## 使用方法 + +### 准备 + +为说明如何从远程加载语言包,我们将假设以下的应用: +应用`chat`,依赖于`user`、`manager`、`log`等三个库,均使用了`voerkiai18n`作为多语言解决方案 +当执行完`voerkai18n compile`后,项目结构大概如下: +```javascript +chat + |-- languages + | |-- index.js + | |-- idMap.js + | |-- runtime.js + | |-- settings.json + | |-- cn.js + | |-- en.js + | |-- translates + | |-- default.json + |-- index.js + |-- package.json //name=chat + +``` +打开`languages/index.js`,大概如下: +```javascript +// .... +const scope = new i18nScope({ + id: "chat", // 当前作用域的id,自动取当前工程的package.json的name + loaders:{ + "en" : ()=>import("./en.js") + }, + //..... +}) +/// .... +``` +- 可以看到在`languages/index.js`中创建了一个以当前工程`package.json`的`name`为`id`的`i18nScope`实例,然后注册到全局`VoerkaI18n`实例中。 +- 为`en`语言创建了一个异步加载器,用来异步加载`en`语言包。 +- 当打包`chat`应用时,`cn.js`、`en.js`等语言包均作为源码的一部分打包,差别在于非默认语言`en.js`单独作为一个`chunk`打包以便能异步加载。 + +下面假设,当应用上线后,客户要求增加`de`语言,但是我们的源码包中并没有包含`de`语言,利用`voerkiai18n`语言加载器功能,可以比较方便地实现动态增加支持语言的功能。 + +### 第一步:注册默认的语言加载器 + + `voerkiai18n`是采用语言加载器来加载语言包的,默认语言包以静态方法打包到源码中,而非默认语言则采用异步加载方式进行加载。 +当注册了一个默认的语言包加载器后,如果切换到一个未注册的语言时,会调用默认的语言包加载器来获取语言包。 +利用此特性就可以实现随时动态为应用增加语言支持的特性。 + +首先需要在应用中导入`i18nScope`实例,然后注册一个默认的语言加载器。 + +```javascript + +// 从当前工程导入`scope`实例 +import { i18nScope } from "./languages" + +// 注册默认的语言加载器 +i18nScope.registerDefaultLoader(async (language,scope)=>{ + // language: 要切换到此语言 + // scope: 语言作用域实例 + // 在此向服务器发起请求,请返回翻译后的其他语言文本 + return {.....} +}) +``` + +### 第二步:编写语言包加载器 + +然后,我们就可以在此向服务器发起异步请求来读取语言包文件。 + +```javascript + +// 从当前工程导入`scope`实例 +import { i18nScope } from "./languages" + +i18nScope.registerDefaultLoader(async (language,scope)=>{ + return await (await fetch(`/languages/${scope.id}/${language}.json`)).json() +}) +``` + +语言加载器函数需要返回JSON格式的语言包,大概如下: +```json +{ + "1":"xxxxx", + "2":"xxxxx", + "3":"xxxxx", + //.... +} +``` + +**重点:为什么要向服务器传递`scope.id`参数?** +在多包环境下,按照多包/库开发的规范,每一个库或包均具有一个**唯一的id**,默认会使用`package.json`中的`name`字段。 + **例如**: +- 应用`A`,依赖于包/库`X`、`Y`、`Z`,并且`A/X/Y/Z`均使用了`voerkiai18n`作为多语言解决方案 +- 当应用启动时,`A/X/Y/Z`均会创建一个`i18nScope`实例,其`id`分别是`A/X/Y/Z`,然后这些`i18nScope`实例会注册到全局的`VoerkaI18n`实例中(详见多库联动介绍)。 +- 假如应用`A`配置支持`zh`、`cn`两种语言,当应用要切换到`de`语言时,那么不仅是`A`应用本身需要切换到`de`语言,所依赖的库也需要切换到`de`语言。但是库`X`、`Y`、`Z`本身可能支持`de`语言,也可以不支持。如果不支持,则同样需要向服务器请求该库的翻译语言。因此,在向服务器请求时就需要带上`scope.id`。 + + +### 第三步:将语言包文件保存在服务器 + +在上一步中,我们通过`fetch(/languages/${scope.id}/${language}.json)`来传递读取语言包(您可以使用任意您喜欢的方式),这意味着我们需要在web服务器上根据此URL来组织语言包,以便可以下载到语言包。比如可以使用如下: +```javascript +webroot + |-- languages + + |-- de.json + + |-- de.json + + |-- de.json + + |-- de.json +``` + +`VoerkaI18n`将编写**如何语言加载器**和**如何在服务器上组织语言包**交由开发者自行决定,您完全可以根据自己的喜好来决定如何加载。 + + +### 第四步:生成语言包文件 + +在本例中,我们要增加`de`语言,这就需要在服务器上生成一个对应的`de`语言包文件。 +方法很简单,打开`languages/cn.js`文件,该文件大概如下: +```javascript +module.exports = { + "1": "支持的语言", + "2": "默认语言", + "3": "激活语言", + "4": "名称空间s", + .... +} +``` +复制一份修改和更名为`de.json`,内容大概概如下: +```javascript +{ + "1": "支持的语言", + "2": "默认语言", + "3": "激活语言", + "4": "名称空间s", + .... +} +``` +然后将`de.json`复制到`languages/chat/de.json`即可。 +同样地,我们也需要对`user`、`manager`、`log`等三个库的语言文件如法泡制,生成语言包文件`languages/user/de.json`,`languages/manager/de.json`,`languages/log/de.json`,这样这三个库也能实现支持`de`语言。 + +### 第五步:编写语言包补丁 + +至此,我们已经实现了可以为应用动态添加语言支持的功能。但是默认语言加载器只是针对的未知的语言起作用,而对内置的语言是不起作用的。也就是说上例中的内置语言`cn`和`en`不能通过此方法来加载。 + +在实际应用中,我们经常会在应用上线的,发现应用中的某此语言翻译错误,此时就可以利用`voerkai18n`的语言包补丁特性来解决此问题。 +利用`voerkai18n`的语言包补丁特性,您就可以随时修复翻译错误,而不需要重新打包应用。 + +`voerkai18n`的语言包补丁特性的工作机制同样也是利用了默认语言加载器来加载语言包补丁。其工作原理很简单,如下: +- 按上例中的方式注册默认语言加载器 +- 当i18nScope注册到全局VoerkaI18n时,会调用默认的语言加载器,从服务器加载语言包,然后合并到本地语言包中,这样就很轻松地实现了动态言包的特性。 + +在本例中,我们假设chat应用的中文语言发现翻译错误,需要一个语言包补丁来修复,方法如下: +```javascript +webroot + |-- languages + + |-- cn.json + +``` +按上例说明的方式,在服务器上编辑一个`cn.json`文件,保存到`languages/char/cn.json`,里面内容只需要包括出错的内容即可。 + +```javascript +{ + "4": "名称空间" +} +``` +然后,当应用切换到指定`cn`语言时,就会下载该语言包合并到源码中的语言包,从而实现为语言包打补丁的功能,修复翻译错误。此功能简单而实用,强烈推荐。 + +### 小结 + + - 当注册了一个默认的语言加载器后,当切换到未配置过的语言时,会调用默认的文本加载器来从服务器加载语言文本。 + - 对于已配置的语言,会在注册时从服务器加载进行合并,从而实现为语言包打补丁的功能。 + - 您需要自己在服务器上组织存放配套的语言包文件,然后编写通过`fetch/axios`等从服务器加载 + + +## 指南 + +### 语言包加载器 + +语言加载器是一个普通`异步函数`或者`返回Promise`的函数,可以用来从远程加载语言包文件。 + +语言加载器时会传入两个参数: +| 参数 | 说明 | +| --- | --- | +| language | 要切换的此语言| +| scope |语言作用域实例,其中`scope.id`值默认等于`package.json`中的`name`字段。详见[参考](../../reference/i18nscope)。 | + +- 典型的语言加载器非常简单,如下: +```javascript +import { i18nScope } from "./languages" +i18nScope.registerDefaultLoader(async (language,scope)=>{ + return await (await fetch(`/languages/${scope.id}/${language}.json`)).json() +}) +``` +- 为什么要应用自己编写语言加载器,而不是提供约定开箱即用? + 主要原因是编写语言加载器很简单,但是如何组织在服务器上的保存,想让应用开发者自行决定。比如,开发者完全可以将语言包保存在数据库中等。 另外考虑安全、兼容性等原因,因此`voerkai18n`就将此交由开发者自行编写。 + + +### 编写语言切换界面 + + 当编写语言切换界面时,对未注册的语言是无法枚举出来的,需要应用自行处理逻辑。例如在Vue应用中 + +```javascript +
+ +
+``` + +还是以本例来说明,上面的Vue应用是无法枚举出来`de`语言的,这就需要应用自己处理,比如: + +```html + +``` +通过编写合适的语言切换界面,您可以在后期随时在线增加语种支持。 + +### 关于语言包补丁 +语言包补丁仅对在`settings.json`配置的语言起作用,而动态增加的语种因为其语言包本身就保存在服务器,因此就不存在补丁的问题。 +语言包补丁会在加载时自动合并到源码中的语言包,并且会自动在本地`localStorage`中缓存。 + diff --git a/docs/zh/guide/intro/get-started.md b/docs/zh/guide/intro/get-started.md index 7796c7a..87b07eb 100644 --- a/docs/zh/guide/intro/get-started.md +++ b/docs/zh/guide/intro/get-started.md @@ -221,3 +221,31 @@ VoerkaI18n.on((newLanguage)=>{ ... }) ``` + +## 第七步:语言包补丁 + +一般情况下,多语言的工程化过程就结束了,`voerkai18n`在多语言实践考虑得更加人性化。有没有经常发现这样的情况,当项目上线后,才发现: +- 翻译有误 +- 客户对某些用语有个人喜好,要求你更改。 +- 临时要增加支持一种语言 + +一般碰到这种情况,只好重新打包构建工程,重新发布,整个过程繁琐而麻烦。 +现在`voerkai18n`针对此问题提供了完美的解决方案,可以通过服务器来为应用打语言包补丁和增加语言支持,而不需要重新打包应用和修改应用。 +方法如下: + +1. 注册一个默认的语言包加载器函数,用来从服务器加载语言包文件 +```javascript +import { i18nScope } from "./languages" + +i18nScope.registerDefaultLoader(async (language,scope)=>{ + return await (await fetch(`/languages/${scope.id}/${language}.json`)).json() +}) +``` + +2. 将语言包补丁文件保存在服务器上指定的位置`/languages/<应用名称>/<语言名称>.json`即可。 +3. 当应用启动后会自动从服务器上加载语言补丁包,从而实现动为语言包打补丁的功能。也可以实现动态增加临时支持一种语言的功能 + +更完整的说明详见[`动态加载语言包`](../advanced/remoteLoad.md)和[`语言包补丁`](../advanced/lngpatch.md)功能介绍。 + + + \ No newline at end of file diff --git a/docs/zh/guide/intro/history.md b/docs/zh/guide/intro/history.md index 29ff8e2..78fc32c 100644 --- a/docs/zh/guide/intro/history.md +++ b/docs/zh/guide/intro/history.md @@ -1,3 +1,9 @@ --- -title: 版本历史 ---- \ No newline at end of file +title: 更新历史 +--- +# 更新历史 + +## 2022/8/5 + +- 增加语言包补丁功能,可以在应用上线后动态更新修复翻译错误 +- 增加动态加载语言包机制,可以在应用上线后动态添加语言支持 \ No newline at end of file diff --git a/docs/zh/guide/intro/readme.md b/docs/zh/guide/intro/readme.md index fb98e2b..41d2da7 100644 --- a/docs/zh/guide/intro/readme.md +++ b/docs/zh/guide/intro/readme.md @@ -2,7 +2,7 @@ 基于`javascript`的国际化方案很多,比较有名的有`fbt`、`i18next`、`react-i18next`、`vue-i18n`、`react-intl`等等,每一种解决方案均有大量的用户。为什么还要再造一个轮子?好吧,再造轮子的理由不外乎不满足于现有方案,总想着现有方案的种种不足之处,然后就撸起袖子想造一个轮子,也不想想自己什么水平。 -哪么到底是对现有解决方案有什么不满?最主要有三点: +那么到底是对现有解决方案有什么不满?最主要有三点: - 大部份均为要翻译的文本信息指定一个`key`,然后在源码文件中使用形如`$t("message.login")`之类的方式,然后在翻译时将之转换成最终的文本信息。此方式最大的问题是,在源码中必须人为地指定每一个`key`,在中文语境中,想为每一句中文均配套想一句符合语义的`英文key`是比较麻烦的,也很不直观不符合直觉。我希望在源文件中就直接使用中文,如`t("中华人民共和国万岁")`,然后国际化框架应该能自动处理后续的一系列麻烦。 @@ -32,7 +32,7 @@ - 翻译过程内,提取文本可以自动进行同步,并保留已翻译的内容。 -- 可以随时添加支持的语言 +- 支持远程加载语言包,并且可以在线打语言补丁包 - 支持调用在线自动翻译对提取文本进行翻译。 diff --git a/docs/zh/guide/intro/support.md b/docs/zh/guide/intro/support.md new file mode 100644 index 0000000..c097721 --- /dev/null +++ b/docs/zh/guide/intro/support.md @@ -0,0 +1,4 @@ +# 获取支持 + +- 通过Gitgee或Github提交[issues](https://github.com/zhangfisher/voerka-i18n/issues) +- 国内用户可以加[QQ群](https://qm.qq.com/cgi-bin/qm/qr?k=jKyZR9KupT9Ith5ZsulB-i04OaJDkCwe&jump_from=webapi). diff --git a/docs/zh/guide/intro/versions.md b/docs/zh/guide/intro/versions.md new file mode 100644 index 0000000..d361f7d --- /dev/null +++ b/docs/zh/guide/intro/versions.md @@ -0,0 +1,11 @@ +# 版本信息 +| 包| 版本号| 最后更新|说明| +| --- | :---:| --- |---| +|**@voerkai18n/utils**|1.0.12|08/05|公共工具库 +|**@voerkai18n/runtime**|1.0.27|08/05|核心运行时 +|**@voerkai18n/formatters**|1.0.6|04/15|格式化器,提供对要翻译文本的转换功能 +|**@voerkai18n/react**|1.0.4|04/16|React支持,提供语言切换等功能 +|**@voerkai18n/cli**|1.0.32|08/05|命令行工具,用来初始化/提取/编译/自动翻译等工具链 +|**@voerkai18n/babel**|1.0.23|08/05|Babel插件,实现自动导入t函数和自动文本映射 +|**@voerkai18n/vite**|1.0.12|08/05|Vite插件,提供自动插入翻译函数和文本映射等功能 +|**@voerkai18n/vue**|1.0.5|04/15|Vue3插件,提供自动插件翻译函数和语言切换功能 \ No newline at end of file diff --git a/docs/zh/home.md b/docs/zh/home.md index 2e80b1d..594fb33 100644 --- a/docs/zh/home.md +++ b/docs/zh/home.md @@ -9,18 +9,18 @@ actions: - text: 快速入门 link: /guide/intro/get-started - - text: 源码 - link: / + - text: 安装 + link: /guide/intro/install type: secondary features: - - title: 工程化支持 + - title: 工程化支持1 icon: markdown details: 从文本提取/自动翻译/编译/动态切换的全流程工程化支持,适用于大型项目 link: - title: 集成自动翻译 - icon: slides + icon: tab details: 调用在线翻译服务API支持对提取的文本进行自动翻译,大幅度提高工程效率 link: @@ -44,18 +44,39 @@ features: details: 支持monorepo工程下多库进行语言切换的联动机制 link: - - title: 自动扩展工具 + - title: 工具链 icon: palette - details: 提供Vue/React/Babel等扩展插件,简化各种应用下 + details: 提供Vue/React/Babel等扩展插件,简化各种应用开发 link: - - title: 扩展特性 + - title: 插值变量 icon: contrast - details: 强大的插值变量机制,能扩展支持复数、日期、货币等灵活强大的多语言机制 + details: 强大的插值变量机制,能扩展支持复数、日期、货币等灵活强大的多语言特性 link: + - title: 语言补丁 + icon: info + details: 在应用上线后发现错误时可以在线修复 + link: + + - title: 动态语种 + icon: blog + details: 可以在应用上线上动态增加语种支持 + link: + + - title: 扩展在线编辑 + icon: palette + details: 很容易扩展支持在线语言包编辑 + link: + + - title: 复数支持 + icon: contrast + details: 灵活而强大的复数机制 + link: + copyright: true footer: MIT Licensed | Copyright © 2022-present wxzhang + --- \ No newline at end of file diff --git a/docs/zh/reference/lang-code.md b/docs/zh/reference/lang-code.md index d280e98..81daa95 100644 --- a/docs/zh/reference/lang-code.md +++ b/docs/zh/reference/lang-code.md @@ -1,3 +1,35 @@ # 语言代码 -请参阅[这里](https://fanyi-api.baidu.com/doc/21) \ No newline at end of file +常见的语言代码如下: + +| 名称 | 代码 | +|---|:---:| +|中文| zh | +|繁体中文| cht | +|英语 |en| +|日语 |jp| +|韩语 |kor | +|法语 |fra | +|西班牙语| spa| +|泰语 |th | +|阿拉伯语| ara | +|俄语| ru| +|葡萄牙语 |pt | +|德语 |de | +|意大利语| it| +|希腊语 |el | +|荷兰语 |nl | +|波兰语 |pl| +|保加利亚语 |bul | +|爱沙尼亚语 |est | +|丹麦语 |dan| +|芬兰语 |fin | +|捷克语 |cs | +|罗马尼亚语 |rom| +|斯洛文尼亚语| slo | +|瑞典语 |swe | +|匈牙利语 |hu| +|越南语 |vie | + + +更完整的请参阅[这里](https://fanyi-api.baidu.com/doc/21) \ No newline at end of file diff --git a/packages/apps/vueapp/public/languages/vueapp/de.json b/packages/apps/vueapp/public/languages/vueapp/de.json new file mode 100644 index 0000000..2775ea9 --- /dev/null +++ b/packages/apps/vueapp/public/languages/vueapp/de.json @@ -0,0 +1,8 @@ +{ + "1": "DE: Hello world!", + "2": "DE: 中华人民共和国", + "3": "DE: 迎接中华民族的伟大复兴", + "4": "DE: 成立于{}年", + "5": "DE: 首都:北京", + "6": "DE: VoerkaI18n多语言解决方案 " +} \ No newline at end of file diff --git a/packages/apps/vueapp/public/languages/vueapp/en.json b/packages/apps/vueapp/public/languages/vueapp/en.json new file mode 100644 index 0000000..9c0e97e --- /dev/null +++ b/packages/apps/vueapp/public/languages/vueapp/en.json @@ -0,0 +1,3 @@ +{ + "2": "The People's Republic of China!!!" +} \ No newline at end of file diff --git a/packages/apps/vueapp/public/languages/vueapp/zh.json b/packages/apps/vueapp/public/languages/vueapp/zh.json new file mode 100644 index 0000000..4b1e1f1 --- /dev/null +++ b/packages/apps/vueapp/public/languages/vueapp/zh.json @@ -0,0 +1,4 @@ +{ + "3": "全世界迎接中华民族的伟大复兴!" + +} \ No newline at end of file diff --git a/packages/apps/vueapp/src/App.vue b/packages/apps/vueapp/src/App.vue index 5398fc3..7be96b7 100644 --- a/packages/apps/vueapp/src/App.vue +++ b/packages/apps/vueapp/src/App.vue @@ -46,8 +46,11 @@ export default {
默认语言:{{ i18n.defaultLanguage }}
当前语言:{{ i18n.activeLanguage.value }}
+ + +