From 0e77b21127c77c154ba53069449c8af5d3b36b6f Mon Sep 17 00:00:00 2001 From: wxzhang Date: Mon, 11 Apr 2022 21:48:17 +0800 Subject: [PATCH] add docs --- .github/workflows/deploy-docs.yml | 44 + docs/.vuepress/config.ts | 29 + docs/.vuepress/navbar/en.ts | 7 + docs/.vuepress/navbar/index.ts | 2 + docs/.vuepress/navbar/zh.ts | 23 + docs/.vuepress/public/favicon.ico | Bin 0 -> 67646 bytes docs/.vuepress/public/images/arch.png | Bin 0 -> 27785 bytes docs/.vuepress/public/logo.png | Bin 0 -> 94186 bytes docs/.vuepress/public/logo.svg | 1 + docs/.vuepress/sidebar/en.ts | 16 + docs/.vuepress/sidebar/index.ts | 2 + docs/.vuepress/sidebar/zh.ts | 60 + docs/.vuepress/styles/index.scss | 5 + docs/.vuepress/styles/palette.scss | 1 + docs/.vuepress/themeConfig.ts | 84 + docs/en/guide/disable.md | 42 + docs/en/guide/encrypt.md | 15 + docs/en/guide/install.md | 40 + docs/en/guide/markdown.md | 341 + docs/en/guide/page.md | 66 + docs/en/guide/readme.md | 82 + docs/readme.md | 60 + docs/zh/contribute/readme.md | 73 + docs/zh/guide/advanced/autoimport.md | 25 + docs/zh/guide/advanced/autotranslate.md | 9 + docs/zh/guide/advanced/customformatter.md | 197 + docs/zh/guide/advanced/langpack.md | 22 + docs/zh/guide/advanced/multi-libs.md | 14 + docs/zh/guide/advanced/runtime.md | 37 + docs/zh/guide/advanced/textMap.md | 45 + docs/zh/guide/intro/get-started.md | 223 + docs/zh/guide/intro/history.md | 3 + docs/zh/guide/intro/install.md | 43 + docs/zh/guide/intro/question.md | 3 + docs/zh/guide/intro/readme.md | 38 + docs/zh/guide/tools/babel.md | 73 + docs/zh/guide/tools/cli.md | 251 + docs/zh/guide/tools/vite.md | 97 + docs/zh/guide/tools/vue.md | 92 + docs/zh/guide/use/change-langeuage.md | 32 + docs/zh/guide/use/currency.md | 5 + docs/zh/guide/use/datetime.md | 19 + docs/zh/guide/use/interpolation.md | 84 + docs/zh/guide/use/namespace.md | 47 + docs/zh/guide/use/plural.md | 112 + docs/zh/guide/use/react.md | 1 + docs/zh/guide/use/t.md | 39 + docs/zh/guide/use/vue.md | 57 + docs/zh/home.md | 61 + docs/zh/reference/formatters.md | 3 + docs/zh/reference/i18nscope.md | 33 + docs/zh/reference/lang-code.md | 3 + docs/zh/reference/readme.md | 8 + docs/zh/reference/voerkaI18n.md | 26 + packages/cli/languages/runtime.js | 4 - packages/cli/package.json | 4 +- packages/runtime/dist/index.cjs | 2 + packages/runtime/dist/index.cjs.map | 1 + packages/runtime/dist/index.esm.js | 2 + packages/runtime/dist/index.esm.js.map | 1 + packages/runtime/dist/runtime.cjs | 938 +++ packages/runtime/dist/runtime.mjs | 936 +++ packages/runtime/index.js | 2 +- packages/runtime/package.json | 4 +- readme.md | 1617 +--- yarn.lock | 8281 +++++++++++++++++++++ 66 files changed, 12864 insertions(+), 1623 deletions(-) create mode 100644 .github/workflows/deploy-docs.yml create mode 100644 docs/.vuepress/config.ts create mode 100644 docs/.vuepress/navbar/en.ts create mode 100644 docs/.vuepress/navbar/index.ts create mode 100644 docs/.vuepress/navbar/zh.ts create mode 100644 docs/.vuepress/public/favicon.ico create mode 100644 docs/.vuepress/public/images/arch.png create mode 100644 docs/.vuepress/public/logo.png create mode 100644 docs/.vuepress/public/logo.svg create mode 100644 docs/.vuepress/sidebar/en.ts create mode 100644 docs/.vuepress/sidebar/index.ts create mode 100644 docs/.vuepress/sidebar/zh.ts create mode 100644 docs/.vuepress/styles/index.scss create mode 100644 docs/.vuepress/styles/palette.scss create mode 100644 docs/.vuepress/themeConfig.ts create mode 100644 docs/en/guide/disable.md create mode 100644 docs/en/guide/encrypt.md create mode 100644 docs/en/guide/install.md create mode 100644 docs/en/guide/markdown.md create mode 100644 docs/en/guide/page.md create mode 100644 docs/en/guide/readme.md create mode 100644 docs/readme.md create mode 100644 docs/zh/contribute/readme.md create mode 100644 docs/zh/guide/advanced/autoimport.md create mode 100644 docs/zh/guide/advanced/autotranslate.md create mode 100644 docs/zh/guide/advanced/customformatter.md create mode 100644 docs/zh/guide/advanced/langpack.md create mode 100644 docs/zh/guide/advanced/multi-libs.md create mode 100644 docs/zh/guide/advanced/runtime.md create mode 100644 docs/zh/guide/advanced/textMap.md create mode 100644 docs/zh/guide/intro/get-started.md create mode 100644 docs/zh/guide/intro/history.md create mode 100644 docs/zh/guide/intro/install.md create mode 100644 docs/zh/guide/intro/question.md create mode 100644 docs/zh/guide/intro/readme.md create mode 100644 docs/zh/guide/tools/babel.md create mode 100644 docs/zh/guide/tools/cli.md create mode 100644 docs/zh/guide/tools/vite.md create mode 100644 docs/zh/guide/tools/vue.md create mode 100644 docs/zh/guide/use/change-langeuage.md create mode 100644 docs/zh/guide/use/currency.md create mode 100644 docs/zh/guide/use/datetime.md create mode 100644 docs/zh/guide/use/interpolation.md create mode 100644 docs/zh/guide/use/namespace.md create mode 100644 docs/zh/guide/use/plural.md create mode 100644 docs/zh/guide/use/react.md create mode 100644 docs/zh/guide/use/t.md create mode 100644 docs/zh/guide/use/vue.md create mode 100644 docs/zh/home.md create mode 100644 docs/zh/reference/formatters.md create mode 100644 docs/zh/reference/i18nscope.md create mode 100644 docs/zh/reference/lang-code.md create mode 100644 docs/zh/reference/readme.md create mode 100644 docs/zh/reference/voerkaI18n.md create mode 100644 packages/runtime/dist/index.cjs create mode 100644 packages/runtime/dist/index.cjs.map create mode 100644 packages/runtime/dist/index.esm.js create mode 100644 packages/runtime/dist/index.esm.js.map create mode 100644 packages/runtime/dist/runtime.cjs create mode 100644 packages/runtime/dist/runtime.mjs create mode 100644 yarn.lock diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml new file mode 100644 index 0000000..b45c6e3 --- /dev/null +++ b/.github/workflows/deploy-docs.yml @@ -0,0 +1,44 @@ + +name: 部署文档 + +on: + push: + branches: + # 确保这是你正在使用的分支名称 + - master + +jobs: + deploy-gh-pages: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + with: + fetch-depth: 0 + # 如果你文档需要 Git 子模块,取消注释下一行 + # submodules: true + + - uses: actions/cache@v3 + id: node-modules + with: + path: node_modules/ + key: ${{ runner.os }}-node-modules-${{ hashFiles('yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node-modules- + + - name: 安装依赖 + if: steps.node-modules.outputs.cache-hit != 'true' + run: yarn install --frozen-lockfile + + - name: 构建文档 + env: + NODE_OPTIONS: --max_old_space_size=4096 + run: yarn run docs:build + + - name: 部署文档 + uses: JamesIves/github-pages-deploy-action@v4 + with: + # 这是文档部署到的分支名称 + branch: gh-pages + folder: docs/.vuepress/dist + diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts new file mode 100644 index 0000000..1f070cc --- /dev/null +++ b/docs/.vuepress/config.ts @@ -0,0 +1,29 @@ +import { defineHopeConfig } from "vuepress-theme-hope"; +import themeConfig from "./themeConfig"; + +export default defineHopeConfig({ + base: "/voerka-i18n/", + head: [ + [ + "link", + { + rel: "stylesheet", + href: "//at.alicdn.com/t/font_2410206_mfj6e1vbwo.css", + }, + ], + ], + locales: { + "/": { + lang: "zh-CN", + title: "VoerkaI18n", + description: "适用于Nodejs/Vue/React的国际化解决方案", + }, + "/en/": { + lang: "en-US", + title: "VoerkaI18n", + description: "适用于Nodejs/Vue/React的国际化解决方案", + } + }, + + themeConfig, +}); diff --git a/docs/.vuepress/navbar/en.ts b/docs/.vuepress/navbar/en.ts new file mode 100644 index 0000000..be1a716 --- /dev/null +++ b/docs/.vuepress/navbar/en.ts @@ -0,0 +1,7 @@ +import { defineNavbarConfig } from "vuepress-theme-hope"; + +export const en = defineNavbarConfig([ + "/en/", + "/home", + { text: "Guide", icon: "creative", link: "/guide/" } +]); diff --git a/docs/.vuepress/navbar/index.ts b/docs/.vuepress/navbar/index.ts new file mode 100644 index 0000000..67e2901 --- /dev/null +++ b/docs/.vuepress/navbar/index.ts @@ -0,0 +1,2 @@ +export * from "./en"; +export * from "./zh"; diff --git a/docs/.vuepress/navbar/zh.ts b/docs/.vuepress/navbar/zh.ts new file mode 100644 index 0000000..92bdf5a --- /dev/null +++ b/docs/.vuepress/navbar/zh.ts @@ -0,0 +1,23 @@ +import { defineNavbarConfig } from "vuepress-theme-hope"; + +export const zh = defineNavbarConfig([ + { + text: "主页", + icon: "home", + link: "/" + }, + { + text: "指南", + link: "/zh/guide/intro" + }, + { + text: "参考", + link: "/zh/reference", + }, + { + text: "贡献源码", + link: "/zh/contribute", + } +]); + + diff --git a/docs/.vuepress/public/favicon.ico b/docs/.vuepress/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..b411f79ddd958612bceaae08e4fb10ad15340db2 GIT binary patch literal 67646 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 XM033m#ZyCteO>KizdX}A^ZWk+*}K?S literal 0 HcmV?d00001 diff --git a/docs/.vuepress/public/logo.svg b/docs/.vuepress/public/logo.svg new file mode 100644 index 0000000..23301fd --- /dev/null +++ b/docs/.vuepress/public/logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/.vuepress/sidebar/en.ts b/docs/.vuepress/sidebar/en.ts new file mode 100644 index 0000000..6439dba --- /dev/null +++ b/docs/.vuepress/sidebar/en.ts @@ -0,0 +1,16 @@ +import { defineSidebarConfig } from "vuepress-theme-hope"; + +export const en = defineSidebarConfig({ + "/en/": [ + "", + "home", + "slide", + { + icon: "creative", + text: "Guide", + prefix: "guide/", + link: "guide/", + children: "structure", + } + ], +}); diff --git a/docs/.vuepress/sidebar/index.ts b/docs/.vuepress/sidebar/index.ts new file mode 100644 index 0000000..67e2901 --- /dev/null +++ b/docs/.vuepress/sidebar/index.ts @@ -0,0 +1,2 @@ +export * from "./en"; +export * from "./zh"; diff --git a/docs/.vuepress/sidebar/zh.ts b/docs/.vuepress/sidebar/zh.ts new file mode 100644 index 0000000..b39d3cf --- /dev/null +++ b/docs/.vuepress/sidebar/zh.ts @@ -0,0 +1,60 @@ +import { defineSidebarConfig } from "vuepress-theme-hope"; + +export const zh = defineSidebarConfig({ + "/zh/guide/": [ + { + text:"开始", + prefix:"intro/", + children:[ + "", + "install.md", + "get-started.md", + ] + }, + { + text:"指南", + link:false, + prefix:"use/", + children:[ + "t", + "interpolation", + "datetime", + "plural", + "currency", + "namespace", + "change-langeuage", + "vue", + "react" + ] + }, + { + text:"高级特性", + prefix:"advanced/", + children:[ + "runtime", + "textMap", + "multi-libs", + "autoimport", + "customformatter", + "langpack", + "autotranslate" + ] + }, + { + text:"工具", + prefix:"tools/", + children:[ + "cli", + "babel", + "vue", + "vite", + ] + } + ], + "/zh/reference": [ + "i18nscope", + "voerkai18n", + "formatters", + "lang-code" + ] +}); diff --git a/docs/.vuepress/styles/index.scss b/docs/.vuepress/styles/index.scss new file mode 100644 index 0000000..8cdf641 --- /dev/null +++ b/docs/.vuepress/styles/index.scss @@ -0,0 +1,5 @@ + + +.sidebar-group > p.sidebar-heading > span.title { + font-weight: bold; +} \ No newline at end of file diff --git a/docs/.vuepress/styles/palette.scss b/docs/.vuepress/styles/palette.scss new file mode 100644 index 0000000..0519ecb --- /dev/null +++ b/docs/.vuepress/styles/palette.scss @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/.vuepress/themeConfig.ts b/docs/.vuepress/themeConfig.ts new file mode 100644 index 0000000..799ad72 --- /dev/null +++ b/docs/.vuepress/themeConfig.ts @@ -0,0 +1,84 @@ +import { defineThemeConfig } from "vuepress-theme-hope"; +import * as navbar from "./navbar"; +import * as sidebar from "./sidebar"; + +export default defineThemeConfig({ + hostname: "https://vuepress-theme-hope-v2-demo.mrhope.site", + author: { + name: "wxzhang", + url: "https://mrhope.site", + }, + + iconPrefix: "iconfont icon-", + + logo: "/logo.svg", + + home:"/zh/home", + repo: "vuepress-theme-hope/vuepress-theme-hope", + + docsDir: "docs", + breadcrumb :false, + + pageInfo: ["Author", "Original", "Date", "Category", "Tag", "ReadingTime"], + + locales: { + /** + * Chinese locale config + */ + "/": { + // navbar + navbar: navbar.zh, + + // sidebar + sidebar: sidebar.zh, + + //footer: "默认页脚", + + displayFooter: true + }, + "/en/": { + // navbar + navbar: navbar.en, + + // sidebar + sidebar: sidebar.en, + + footer: "Default footer", + displayFooter: true, + } + }, + plugins: { + // If you don't need comment feature, you can remove following option + // The following config is for demo ONLY, if you need comment feature, please generate and use your own config, see comment plugin documentation for details. + // To avoid disturbing the theme developer and consuming his resources, please DO NOT use the following config directly in your production environment!!!!! + // comment: { + // /** + // * Using giscus + // */ + // type: "giscus", + // repo: "vuepress-theme-hope/giscus-discussions", + // repoId: "R_kgDOG_Pt2A", + // category: "Announcements", + // categoryId: "DIC_kwDOG_Pt2M4COD69", + + // /** + // * Using twikoo + // */ + // // type: "twikoo", + // // envId: "https://twikoo.ccknbc.vercel.app", + + // /** + // * Using Waline + // */ + // // type: "waline", + // // serverURL: "https://vuepress-theme-hope-comment.vercel.app", + // }, + + mdEnhance: { + enableAll: true, + presentation: { + plugins: ["highlight", "math", "search", "notes", "zoom"], + }, + }, + }, +}); diff --git a/docs/en/guide/disable.md b/docs/en/guide/disable.md new file mode 100644 index 0000000..53857bf --- /dev/null +++ b/docs/en/guide/disable.md @@ -0,0 +1,42 @@ +--- +index: 3 +title: Component disabled +icon: config +category: + - Guide +tag: + - disable + +navbar: false +sidebar: false + +breadcrumb: false +pageInfo: false +contributors: false +editLink: false +lastUpdated: false +prev: false +next: false +comment: false +footer: false + +backtotop: false +--- + +You can disable some functions on the page by setting the Frontmatter of the page. + + + +These should be disabled on this page: + +- Navbar +- Sidebar +- Breadcrumb +- Page information +- Contributors +- Edit link +- Update time +- Prev/Next link +- Comment +- Footer +- Back to top button diff --git a/docs/en/guide/encrypt.md b/docs/en/guide/encrypt.md new file mode 100644 index 0000000..695bfed --- /dev/null +++ b/docs/en/guide/encrypt.md @@ -0,0 +1,15 @@ +--- +icon: lock +category: + - Guide +tag: + - encryption +--- + +# Encryption article + +The actual article content. + +Paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text paragraph 1 text. + +Paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text paragraph 2 text. diff --git a/docs/en/guide/install.md b/docs/en/guide/install.md new file mode 100644 index 0000000..7d16a2d --- /dev/null +++ b/docs/en/guide/install.md @@ -0,0 +1,40 @@ + +# 安装 + +`VoerkaI18n`国际化框架是一个开源多包工程,主要由以下几个包组成: + +- **@voerkai18/cli** + + 包含文本提取/编译等命令行工具,一般应该安装到全局。 + + ```javascript + npm install --g @voerkai18/cli + yarn global add @voerkai18/cli + pnpm add -g @voerkai18/cli + ``` + +- **@voerkai18/runtime** + + **可选的**,运行时,`@voerkai18/cli`的依赖。大部分情况下不需要手动安装,一般仅在开发库项目时采用独立的运行时依赖。 + + ```javascript + npm install --save @voerkai18/runtime + yarn add @voerkai18/runtime + pnpm add @voerkai18/runtime + ``` + +- **@voerkai18/formatters** + + **可选的**,一些额外的格式化器,可以按需进行安装到`dependencies`中,用来扩展翻译时对插值变量的额外处理。 + +- **@voerkai18/babel** + + 可选的`babel`插件,用来实现自动导入翻译函数和翻译文本映射自动替换。 + +- **@voerkai18/vue** + + 可选的`vue`插件,用来为Vue应用提供语言动态切换功能。 + +- **@voerkai18/vite** + + 可选的`vite`插件,用来为`vite`应用提供自动导入翻译函数和翻译文本映射自动替换。 diff --git a/docs/en/guide/markdown.md b/docs/en/guide/markdown.md new file mode 100644 index 0000000..03780d1 --- /dev/null +++ b/docs/en/guide/markdown.md @@ -0,0 +1,341 @@ +--- +index: 2 +icon: markdown +title: Markdown Enhance +category: + - Guide +tag: + - markdown +--- + +Every document page in VuePress is rendered by Markdown. + +You need to build your document or blog page by creating and writing Markdown in the corresponding path. + + + +## Markdown introduction + +If you are a new learner and don’t know how to write Markdown, please read [Markdown Intro](https://vuepress-theme-hope.github.io/v2/basic/markdown/README.html) and [Markdown Demo](https://vuepress-theme-hope.github.io/v2/basic/markdown/demo.html). + +::: info Frontmatter + +Frontmatter is a important concept in VuePress. If you don’t know it, you need to read [Frontmatter Introduction](https://vuepress-theme-hope.github.io/v2/basic/vuepress/page.html#front-matter). + +::: + +## VuePress Enhancement + +To enrich document writing, VuePress has extended Markdown syntax. + +For these extensions, please read [Markdown extensions in VuePress](https://vuepress-theme-hope.github.io/v2/basic/vuepress/markdown.html). + +## Theme Enhancement + +### Enable all + +You can set `themeconfig.plugins.htmlEnhance.enableAll` to enable all features of the [md-enhance](https://vuepress-theme-hope.github.io/v2/md-enhance/) plugin. + +```js {3-5} +module.exports = { + themeConfig: { + plugins: { + mdEnhance: { + enableAll: true, + }, + }, + }, +}; +``` + +## New Feature + +### Custom Container + +::: v-pre + +Safely use {{ variable }} in markdown. + +::: + +::: info Custom Title + +A custom information container with `code`, [link](#markdown). + +```js +const a = 1; +``` + +::: + +::: tip Custom Title + +A custom tip container + +::: + +::: warning Custom Title + +A custom warning container + +::: + +::: danger Custom Title + +A custom danger container + +::: + +::: details Custom Title + +A custom details container + +::: + +:::: details Code + +```md +::: v-pre + +Safely use {{ variable }} in markdown. + +::: + +::: info Custom Title + +A custom information container + +::: + +::: tip Custom Title + +A custom tip container + +::: + +::: warning Custom Title + +A custom warning container + +::: + +::: danger Custom Title + +A custom danger container + +::: + +::: details Custom Title + +A custom details container + +::: +``` + +:::: + +### CodeGroup + +:::: code-group + +::: code-group-item yarn + +```bash +yarn add -D vuepress-theme-hope +``` + +::: + +::: code-group-item npm:active + +```bash +npm i -D vuepress-theme-hope +``` + +::: + +:::: + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/code-group.html) + +### Superscript and Subscript + +19^th^ H~2~O + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/sup-sub.html) + +### Align + +::: center + +I am center + +::: + +::: right + +I am right align + +::: + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/align.html) + +### Footnote + +This text has footnote[^first]. + +[^first]: This is footnote content + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/footnote.html) + +### Mark + +You can mark ==important words== . + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/mark.html) + +### Tasklist + +- [x] Plan A +- [ ] Plan B + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/tasklist.html) + +### Chart + +::: chart A Scatter Chart + +```json +{ + "type": "scatter", + "data": { + "datasets": [ + { + "label": "Scatter Dataset", + "data": [ + { "x": -10, "y": 0 }, + { "x": 0, "y": 10 }, + { "x": 10, "y": 5 }, + { "x": 0.5, "y": 5.5 } + ], + "backgroundColor": "rgb(255, 99, 132)" + } + ] + }, + "options": { + "scales": { + "x": { + "type": "linear", + "position": "bottom" + } + } + } +} +``` + +::: + +- [View Detail](<[chart.md](https://vuepress-theme-hope.github.io/v2/guide/markdown/chart.html)>) + +### Flowchart + +```flow +cond=>condition: Process? +process=>operation: Process +e=>end: End + +cond(yes)->process->e +cond(no)->e +``` + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/flowchart.html) + +### Mermaid + +```mermaid +flowchart TB + c1-->a2 + subgraph one + a1-->a2 + end + subgraph two + b1-->b2 + end + subgraph three + c1-->c2 + end + one --> two + three --> two + two --> c2 +``` + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/mermaid.html) + +### Tex + +$$ +\frac {\partial^r} {\partial \omega^r} \left(\frac {y^{\omega}} {\omega}\right) += \left(\frac {y^{\omega}} {\omega}\right) \left\{(\log y)^r + \sum_{i=1}^r \frac {(-1)^i r \cdots (r-i+1) (\log y)^{r-i}} {\omega^i} \right\} +$$ + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/tex.html) + +### Code Demo + +::: demo A normal demo + +```html +

VuePress Theme Hope

+

Is very powerful!

+``` + +```js +document.querySelector("#very").addEventListener("click", () => { + alert("Very powerful!"); +}); +``` + +```css +span { + color: red; +} +``` + +::: + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/demo.html) + +### Presentation + +@slidestart + +## Slide 1 + +A paragraph with some text and a [link](https://mrhope.site) + +--- + +## Slide 2 + +- Item 1 +- Item 2 + +--- + +## Slide 3.1 + +```js +const a = 1; +``` + +-- + +## Slide 3.2 + +$$ +J(\theta_0,\theta_1) = \sum_{i=0} +$$ + +@slideend + +- [View Detail](https://vuepress-theme-hope.github.io/v2/guide/markdown/presentation.html) diff --git a/docs/en/guide/page.md b/docs/en/guide/page.md new file mode 100644 index 0000000..90b4ae2 --- /dev/null +++ b/docs/en/guide/page.md @@ -0,0 +1,66 @@ +--- +# This control sidebar index +index: 1 +# This is the icon of the page +icon: page +# This is the title of the article +title: page config +# Set author +author: Ms.Hope +# Set writing time +date: 2020-01-01 +# A page can have multiple categories +category: + - Guide +# A page can have multiple tags +tag: + - Page config + - Guide +# this page is sticky in article list +sticky: true +# this page will appear in aricle channel in home page +star: true +# You can customize the footer +footer: Footer content for test +--- + +Content before `more` comment is regarded as page excerpt. + + + +## Page information + +You can set page information in Markdown’s Frontmatter. + +- The author is set to Ms.Hope. + +- The writing time should be January 1, 2020 + +- Category is "Guide" + +- Tags are "Page Config" and "Guide" + +## Page content + +You are free to write your Markdown here. + +::: tip + +- Please use the relative link `./` for pictures in the Markdown folder. + +- For pictures in `.vuepress/public` folder, please use absolute link `/` for reference + +::: + +The theme contains a custom badge: + +> A dark blue badge text badge at the end of line. + +## Page structure + +This page should contain: + +- Back to top button +- Route navigation +- Comments +- Footer diff --git a/docs/en/guide/readme.md b/docs/en/guide/readme.md new file mode 100644 index 0000000..988f87c --- /dev/null +++ b/docs/en/guide/readme.md @@ -0,0 +1,82 @@ +--- +headerDepth: 3 +--- + +# 前言 + +基于`javascript`的国际化方案很多,比较有名的有`fbt`、`i18next`、`react-i18next`、`vue-i18n`、`react-intl`等等,每一种解决方案均有大量的用户。为什么还要再造一个轮子?好吧,再造轮子的理由不外乎不满足于现有方案,总想着现有方案的种种不足之处,然后就撸起袖子想造一个轮子,也不想想自己什么水平。 + +哪么到底是对现有解决方案有什么不满?最主要有三点: + +- 大部份均为要翻译的文本信息指定一个`key`,然后在源码文件中使用形如`$t("message.login")`之类的方式,然后在翻译时将之转换成最终的文本信息。此方式最大的问题是,在源码中必须人为地指定每一个`key`,在中文语境中,想为每一句中文均配套想一句符合语义的`英文key`是比较麻烦的,也很不直观不符合直觉。我希望在源文件中就直接使用中文,如`t("中华人民共和国万岁")`,然后国际化框架应该能自动处理后续的一系列麻烦。 + +- 要能够比较友好地支持多库多包`monorepo`场景下的国际化协作,当主程序切换语言时,其他包或库也可以自动切换,并且在开发上每个包或库均可以独立地进行开发,集成到主程序时能无缝集成。这点在现有方案上没有找到比较理想的解决方案。 + +- 大部份国际化框架均将中文视为二等公民,大部份情况下您应该采用英文作为第一语言,虽然这不是太大的问题,但是既然要再造一个轮子,为什么不将中文提升到一等公民呢。 + + + + 基于此就开始造出`VoerkaI18n`这个**全新的国际化多语言解决方案**,主要特性包括: + +# 主要特性 + +- 全面工程化解决方案,提供初始化、提取文本、自动翻译、编译等工具链支持。 + +- 符合直觉,不需要手动定义文本`Key`映射。 + +- 强大的插值变量`格式化器`机制,可以扩展出强大的多语言特性。 + +- 支持`babel`插件自动导入`t`翻译函数。 + +- 支持`nodejs`、浏览器(`vue`/`react`)前端环境。 + +- 采用`工具链`与`运行时`分开设计,发布时只需要集成很小的运行时。 + +- 高度可扩展的`复数`、`货币`、`数字`等常用的多语言处理机制。 + +- 翻译过程内,提取文本可以自动进行同步,并保留已翻译的内容。 + +- 可以随时添加支持的语言 + +- 支持调用在线自动翻译对提取文本进行翻译。 + + +# 安装 + +`VoerkaI18n`国际化框架是一个开源多包工程,主要由以下几个包组成: + +- **@voerkai18/cli** + + 包含文本提取/编译等命令行工具,一般应该安装到全局。 + + ```javascript + npm install --g @voerkai18/cli + yarn global add @voerkai18/cli + pnpm add -g @voerkai18/cli + ``` + +- **@voerkai18/runtime** + + **可选的**,运行时,`@voerkai18/cli`的依赖。大部分情况下不需要手动安装,一般仅在开发库项目时采用独立的运行时依赖。 + + ```javascript + npm install --save @voerkai18/runtime + yarn add @voerkai18/runtime + pnpm add @voerkai18/runtime + ``` + +- **@voerkai18/formatters** + + **可选的**,一些额外的格式化器,可以按需进行安装到`dependencies`中,用来扩展翻译时对插值变量的额外处理。 + +- **@voerkai18/babel** + + 可选的`babel`插件,用来实现自动导入翻译函数和翻译文本映射自动替换。 + +- **@voerkai18/vue** + + 可选的`vue`插件,用来为Vue应用提供语言动态切换功能。 + +- **@voerkai18/vite** + + 可选的`vite`插件,用来为`vite`应用提供自动导入翻译函数和翻译文本映射自动替换。 diff --git a/docs/readme.md b/docs/readme.md new file mode 100644 index 0000000..8e3ae11 --- /dev/null +++ b/docs/readme.md @@ -0,0 +1,60 @@ +--- +home: true +icon: home +title: 主页 +heroImage: /logo.svg +heroText: VoerkaI18n +tagline: 适用于Nodejs/Vue/React的国际化解决方案 +actions: + - text: 快速入门 + link: /zh/guide/intro/get-started + + - text: 源码 + link: https://gitee.com/zhangfisher/voerka-i18n + type: secondary + +features: + - title: 工程化支持 + icon: markdown + details: 从文本提取/自动翻译/编译/动态切换的全流程工程化支持,适用于大型项目 + link: + + - title: 集成自动翻译 + icon: slides + details: 调用在线翻译服务API支持对提取的文本进行自动翻译,大幅度提高工程效率 + link: + + - title: 符合直觉 + icon: layout + details: 在源码中直接使用符合直觉的翻译形式,不需要绞尽脑汁想种种key + link: + + - title: 自动提取文本 + icon: comment + details: 提供扫描提取工具对源码文件中需要翻译的文本进行提取 + link: + + - title: 适用性 + icon: info + details: 支持任意Javascript应用,包括Nodejs/Vue/React/ReactNative等。 + link: + + - title: 多库协作 + icon: blog + details: 支持monorepo工程下多库进行语言切换的联动机制 + link: + + - title: 自动扩展工具 + icon: palette + details: 提供Vue/React/Babel等扩展插件,简化各种应用下 + link: + + - title: 扩展特性 + icon: contrast + details: 强大的插值变量机制,能扩展支持复数、日期、货币等灵活强大的多语言机制 + link: + + +footer: MIT Licensed | Copyright © 2022-present wxzhang +--- + \ No newline at end of file diff --git a/docs/zh/contribute/readme.md b/docs/zh/contribute/readme.md new file mode 100644 index 0000000..12ec3d6 --- /dev/null +++ b/docs/zh/contribute/readme.md @@ -0,0 +1,73 @@ +--- +sidebar: heading +--- + +# 源码贡献 + +`voerkai18n`是开源项目,欢迎大家贡献源码。 + +## 获取源码 + +`voerkai18n`在Github和[Gitee](https://gitee.com/zhangfisher/voerka-i18n)上面开源。 + +### 拉取源码 + +```shell +git clone https://gitee.com/zhangfisher/voerka-i18n +``` + +### 安装依赖 + +`voerkai18n`是一个`monorepo`多包工程,使用`pnpm`作为包管理器。所以首先需要安装`pnpm`。 + +```javascript +> npm install -g pnpm +``` + +然后再使用`pnpm install` + +## 源码结构 + +```javascript +voerkai18n + packages + autopublish // 自动发布工具,仅用于开发阶段 + babel // @voerkai18n/babel插件 + cli // @voerkai18n/cli命令行工具 + formatters // @voerkai18n/formatters通用的格式化器 + react // @voerkai18n/react + runtime // @voerkai18n/runtime + utils // @voerkai18n/utils工具库 + vite // @voerkai18n/vite插件 + vue // @voerkai18n/vue插件 + apps // 测试应用 + test // 单元测试用例 + docs // 文档网站Vuepress + readme.md +``` + +## 工作原理 + +![](/images/arch.png) + +## 开发格式化器 + + + +## 单元测试 + + + +## 文档 + + + + +## 发布 + + + + + + + diff --git a/docs/zh/guide/advanced/autoimport.md b/docs/zh/guide/advanced/autoimport.md new file mode 100644 index 0000000..c0d3252 --- /dev/null +++ b/docs/zh/guide/advanced/autoimport.md @@ -0,0 +1,25 @@ +# 自动导入翻译函数 + +使用`voerkai18 compile`后,要进行翻译时需要从`./languages`导入`t`翻译函数。 + +```javascript +import { t } from "./languages" +``` + +由于默认情况下,`voerkai18 compile`命令会在当前工程的`/languages`文件夹下,这样我们为了导入`t`翻译函数不得不使用各种相对引用,这即容易出错,又不美观,如下: + +```javascript +import { t } from "./languages" +import { t } from "../languages" +import { t } from "../../languages" +import { t } from "../../../languages" +``` + +作为国际化解决方案,一般工程的大部份源码中均会使用到翻译函数,这种使用体验比较差。 + +为此,我们提供了一个几个插件可以来自动完成翻译函数的自动引入,包括: + +- `babel`插件 +- `vite`插件 + +关于插件如何使用请参阅文档。 \ No newline at end of file diff --git a/docs/zh/guide/advanced/autotranslate.md b/docs/zh/guide/advanced/autotranslate.md new file mode 100644 index 0000000..447c580 --- /dev/null +++ b/docs/zh/guide/advanced/autotranslate.md @@ -0,0 +1,9 @@ +# 自动翻译 + +传统的国际化解决方案均是需要手工进行翻译的,`voerkai18n`解决方案支持调用在线翻译服务进行自动翻译。 + +- 内置的`voerkai18n translate`命令能调用在线翻译服务完成对提取的文本的自动翻译。 + +- 目前支持访问百度在线API进行自动翻译。百度提供了免费的在线API,虽然只支持`QPS=1`,即每秒调用一次。但是`voerkai18n translate`命令会对要翻译的文本进行合并后再调用,因此大部分情况下,均足够使用了。 + +`voerkai18n translate`命令的使用请参阅扩展文档。 diff --git a/docs/zh/guide/advanced/customformatter.md b/docs/zh/guide/advanced/customformatter.md new file mode 100644 index 0000000..b3be29b --- /dev/null +++ b/docs/zh/guide/advanced/customformatter.md @@ -0,0 +1,197 @@ +# 自定义格式化器 + + +当我们使用`voerkai18n compile`编译后,会生成`languages/formatters.js`文件,可以在该文件中自定义您自己的格式化器。 + +`formatters.js`文件内容如下: + +```javascript +module.exports = { + // 在所有语言下生效的格式化器 + "*":{ + //[格式化名称]:(value)=>{...}, + //[格式化名称]:(value,arg)=>{...}, + }, + // 在所有语言下只作用于特定数据类型的格式化器 + $types:{ + // [数据类型名称]:(value)=>{...}, + // [数据类型名称]:(value)=>{...}, + }, + zh:{ + $types:{ + // 所有类型的默认格式化器 + "*":{ + }, + Date:{}, + Number:{}, + Boolean:{ }, + String:{}, + Array:{ + + }, + Object:{ + + } + }, + [格式化名称]:(value)=>{.....}, + //..... + }, + en:{ + $types:{ + // [数据类型名称]:(value)=>{...}, + }, + [格式化名称]:(value)=>{.....}, + //.....更多的格式化器..... + } +} +``` + +## 格式化器函数 + +**每一个格式化器就是一个普通的同步函数**,不支持异步函数,格式化器函数可以支持无参数或有参数。 + +- 无参数的格式化器:`(value)=>{....返回格式化的结果...}`。 + +- 带参数的格式化器:`(value,arg1,...)=>{....返回格式化的结果...}`,其中`value`是上一个格式化器的输出结果。 + +## 类型格式化器 + +可以为每一种数据类型指定一个默认的格式化器,支持对`String`、`Date`、`Error`、`Object`、`Array`、`Boolean`、`Number`等数据类型的格式化。 + +当插值变量传入时,如果有定义了对应的的类型格式化器,会默认调用该格式化器对数据进行转换。 + +比如我们定义对`Boolean`类型格式化器, + +```javascript +//formatters.js + +module.exports = { + // 在所有语言下只作用于特定数据类型的格式化器 + $types:{ + Boolean:(value)=> value ? "ON" : "OFF" + } +} +t("灯状态:{status}",true) // === 灯状态:ON +t("灯状态:{status}",false) // === 灯状态:OFF +``` + +在上例中,如果我们想在不同的语言环境下,翻译为不同的显示文本,则可以为不同的语言指定类型格式化器 + +```javascript +//formatters.js +module.exports = { + zh:{ + $types:{ + Boolean:(value)=> value ? "开" : "关" + } + }, + en:{ + $types:{ + Boolean:(value)=> value ? "ON" : "OFF" + } + } +} +// 当切换到中文时 +t("灯状态:{status}",true) // === 灯状态:开 +t("灯状态:{status}",false) // === 灯状态:关 +// 当切换到英文时 +t("灯状态:{status}",true) // === 灯状态:ON +t("灯状态:{status}",false) // === 灯状态:OFF +``` + +**说明:** + +- 完整的类型格式化器定义形式 + + ```javascript + module.exports = { + "*":{ + $types:{...} + }, + zh:{ + $types:{...} + }, + en:{ + $types:{....} + } + } + ``` + + 在匹配应用格式化时会先在当前语言的`$types`中查找匹配的格式化器,如果找不到再上`*.$types`中查找。 + +- `*.$types`代表当所有语言中均没有定义时才匹配的类型格式化。 + +- 类型格式化器是**默认执行的,不需要指定名称**。 + +- 当前作用域的格式化器优先于全局的格式化器。 + +## 通用的格式化器 + +类型格式化器只针对特定数据类型,并且会默认调用。而通用的格式化器需要使用`|`管道符进行显式调用。 + +同样的,通用的格式化器定义在`languages/formatters.js`中。 + +```javascript +module.exports = { + "*":{ + $types:{...}, + [格式化名称]:(value)=>{.....}, + }, + zh:{ + $types:{...}, + [格式化名称]:(value)=>{.....}, + }, + en:{ + $types:{....}, + [格式化名称]:(value)=>{.....}, + [格式化名称]:(value,arg)=>{.....}, + } +} +``` + +每一个格式化器均需要指定一个名称,在进行插值替换时会优先依据当前语言来匹配查找格式化器,如果找不到,再到键名为`*`中查找。 + +```javascript +module.exports = { + "*":{ + uppercase:(value)=>value + }, + zh:{ + uppercase:(value)=>["一","二","三","四","五","六","七","八","九","十"][value-1] + }, + en:{ + uppercase:(value)=>["One","Two","Three","Four","Five","Six","seven","eight","nine","ten"][value-1] + }, + jp:{ + + } +} +// 当切换到中文时 +t("{value | uppercase}",1) // == 一 +t("{value | uppercase}",2) // == 二 +t("{value | uppercase}",3) // == 三 +// 当切换到英文时 +t("{value | uppercase}",1) // == One +t("{value | uppercase}",2) // == Two +t("{value | uppercase}",3) // == Three +// 当切换到日文时,由于在该语言下没有定义uppercase格式式,因此到*中查找 +t("{value | uppercase}",1) // == 1 +t("{value | uppercase}",2) // == 2 +t("{value | uppercase}",3) // == 3 +``` + +## 作用域格式化器 + +定义在`languages/formatters.js`里面的格式化器仅在当前工程生效,也就是仅在当前作用域生效。一般由应用开发者自行扩展。 + +## 全局格式化器 + +定义在`@voerkai18n/runtime`里面的格式化器则全局有效,在所有场合均可以使用,但是其优先级低于作用域内的同名格式化器。 + +目前内置的全局格式化器请参阅API参考 + +## 扩展格式化器 + +除了可以在当前项目`languages/formatters.js`自定义格式化器和`@voerkai18n/runtime`里面的全局格式化器外,单列了`@voerkai18n/formatters`项目用来包含了更多的格式化器。 + +作为开源项目,欢迎大家提交贡献更多的格式化器。 diff --git a/docs/zh/guide/advanced/langpack.md b/docs/zh/guide/advanced/langpack.md new file mode 100644 index 0000000..473613e --- /dev/null +++ b/docs/zh/guide/advanced/langpack.md @@ -0,0 +1,22 @@ +# 语言包 + +当使用`webpack`、`rollup`、`esbuild`进行项目打包时,默认语言包采用静态加载,会被打包进行源码中,而其他语言则采用异步打包方式。在`languages/index.js`中。 + +```javascript +const defaultMessages = require("./zh.js") +const activeMessages = defaultMessages + +// 语言作用域 +const scope = new i18nScope({ + default: defaultMessages, // 默认语言包 + messages : activeMessages, // 当前语言包 + .... + // 以下为每一种语言生成一个异步打包语句 + loaders:{ + "en" : ()=>import("./en.js") + "de" : ()=>import("./de.js") + "jp" : ()=>import("./jp.js") + }) +``` + +利用异步打包机制,从而避免将多个语言静态打包到源码包。 \ No newline at end of file diff --git a/docs/zh/guide/advanced/multi-libs.md b/docs/zh/guide/advanced/multi-libs.md new file mode 100644 index 0000000..8dbb7ae --- /dev/null +++ b/docs/zh/guide/advanced/multi-libs.md @@ -0,0 +1,14 @@ +# 多库联动 + +`voerkai18n `支持多个库国际化的联动和协作,即**当主程序切换语言时,所有引用依赖库也会跟随主程序进行语言切换**,整个切换过程对所有库开发都是透明的。 + +![结构图](/images/arch.png) + +当我们在开发一个应用或者库并`import "./languages"`时,在`langauges/index.js`进行了如下处理: + +- 创建一个`i18nScope`作用域实例 +- 检测当前应用环境下是否具有全局单例`VoerkaI18n` + - 如果存在`VoerkaI18n`全局单例,则会将当前`i18nScope`实例注册到`VoerkaI18n.scopes`中 + - 如果不存在`VoerkaI18n`全局单例,则使用当前`i18nScope`实例的参数来创建一个`VoerkaI18n`全局单例。 +- 在每个应用与库中均可以使用`import { t } from ".langauges`导入本工程的`t`翻译函数,该`t`翻译函数被绑定当前`i18nScope`作用域实例,因此翻译时就只会使用到本工程的文本。这样就割离了不同工程和库之间的翻译。 +- 由于所有引用的`i18nScope`均注册到了全局单例`VoerkaI18n`,当切换语言时,`VoerkaI18n`会刷新切换所有注册的`i18nScope`,这样就实现了各个`i18nScope`即独立,又可以联动语言切换。 diff --git a/docs/zh/guide/advanced/runtime.md b/docs/zh/guide/advanced/runtime.md new file mode 100644 index 0000000..a0fb5b4 --- /dev/null +++ b/docs/zh/guide/advanced/runtime.md @@ -0,0 +1,37 @@ +# 运行时 + +`@voerkai18n/runtime`是`voerkai18n`的运行时依赖,支持两种依赖方式。 + +## 源码依赖 + + 默认情况下,运行`voerkai18n compile`时会在`languages`文件下生成运行时文件`runtime.js`,该文件被`languages/index.js`引入,里面是核心运行时`ES6`源代码(`@voerkai18n/runtime`源码),也就是在您的工程中是直接引入的运行时代码,因此就不需要额外安装`@voerkai18n/runtime`了。 + + 此时,`@voerkai18n/runtime`源码就成为您工程是一部分。 + +## 库依赖 + + 当运行`voerkai18n compile --no-inline-runtime`时,就不会生成运行时文件`runtime.js`,而是采用`import "@voerkai18n/runtime`的方式导入运行时,此时会自动/手动安装`@voerkai18n/runtime`到运行依赖中。 + + +## 如何选择 + +**那么应该选择`源码依赖`还是`库依赖`呢?** + +问题的重点在于,在`monorepo`工程或者`开发库`时,`源码依赖`会导致存在重复的运行时源码。而采用`库依赖`,则不存在此问题。因此: + +- 普通应用采用`源码依赖`方式,运行`voerkai18n compile `来编译语言包。 +- `monorepo`工程或者`开发库`采用`库依赖`,`voerkai18n compile --no-inline-runtime`来编译语言包。 + + + +## 注意 + +- `@voerkai18n/runtime`发布了`commonjs`和`esm`两个经过`babel/rollup`转码后的`ES5`版本。 + +- 每次运行`voerkai18n compile`时均会重新生成`runtime.js`源码文件,为了确保最新的运行时,请及时更新`@voerkai18n/cli` + +- 当升级了`@voerkai18n/runtime`后,需要重新运行`voerkai18n compile`以重新生成`runtime.js`文件。 + + + + diff --git a/docs/zh/guide/advanced/textMap.md b/docs/zh/guide/advanced/textMap.md new file mode 100644 index 0000000..6ae4e49 --- /dev/null +++ b/docs/zh/guide/advanced/textMap.md @@ -0,0 +1,45 @@ +# 文本映射 + +虽然`VoerkaI18n`推荐采用`t("中华人民共和国万岁")`形式的符合直觉的翻译形式,而不是采用`t("xxxx.xxx")`这样不符合直觉的形式,但是为什么大部份的国际化方案均采用`t("xxxx.xxx")`形式? + +在我们的方案中,t("中华人民共和国万岁")形式相当于采用原始文本进行查表,语言名形式如下: + +```javascript +// en.js +{ + "中华人民共和国":"the people's Republic of China" +} +// jp.js +{ + "中华人民共和国":"中華人民共和国" +} +``` + +很显然,直接使用文本内容作为`key`,虽然符合直觉,但是会造成大量的冗余信息。因此,`voerkai18n compile`会将之编译成如下: + +```javascript +//idMap.js +{ + "1":"中华人民共和国万岁" +} +// en.js +{ + "1":"Long live the people's Republic of China" +} +// jp.js +{ + "2":"中華人民共和国" +} +``` + +如此,就消除了在`en.js`、`jp.js`文件中的冗余。但是在源代码文件中还存在`t("中华人民共和国万岁")`,整个运行环境中存在两份副本,一份在源代码文件中,一份在`idMap.js`中。 + +为了进一步减少重复内容,因此,我们需要将源代码文件中的`t("中华人民共和国万岁")`更改为`t("1")`,这样就能确保无重复冗余。但是,很显然,我们不可能手动来更改源代码文件,这就需要由`voerkai18n`提供的一个编译区插件来做这一件事了。 + +以`babel-plugin-voerkai18n`插件为例,该插件同时还完成一份任务,就是自动读取`voerkai18n compile`生成的`idMap.js`文件,然后将`t("中华人民共和国万岁")`自动更改为`t("1")`,这样就完全消除了重复冗余信息。 + +所以,在最终形成的代码中,实际上每一个t函数均是`t("1")`、`t("2")`、`t("3")`、`...`、`t("n")`的形式,最终代码还是采用了用`key`来进行转换,只不过这个过程是自动完成的而已。 + +**注意:** + +- 如果没有启用`babel-plugin-voerkai18n`或`vite`等编译区插件,还是可以正常工作,但是会有一份默认语言的冗余信息存在。 \ No newline at end of file diff --git a/docs/zh/guide/intro/get-started.md b/docs/zh/guide/intro/get-started.md new file mode 100644 index 0000000..7796c7a --- /dev/null +++ b/docs/zh/guide/intro/get-started.md @@ -0,0 +1,223 @@ +--- +title: 快速入门 +--- + + +# 快速入门 + + +本节以标准的`Nodejs`应用程序为例,简要介绍`VoerkaI18n`国际化框架的基本使用。其他`vue`或`react`应用的使用也基本相同。 + +```shell +myapp + |--package.json + |--index.js +``` + +在本项目的所有支持的源码文件中均可以使用`t`函数对要翻译的文本进行包装,简单而粗暴。 + +```javascript +// index.js +console.log(t("中华人民共和国万岁")) +console.log(t("中华人民共和国成立于{}",1949)) +``` + +`t`翻译函数是从`myapp/languages/index.js`文件导出的翻译函数,但是现在`myapp/languages`还不存在,后续会使用工具自动生成。`voerkai18n`后续会使用正则表达式对提取要翻译的文本。 + +## 第一步:安装命令行工具 + +```shell +> npm install -g @voerkai18n/cli +> yarn global add @voerkai18n/cli +>pnpm add -g @voerkai18/cli +``` + +## 第二步:初始化工程 + +在工程目录中运行`voerkai18n init`命令进行初始化。 + +```javascript +> voerkai18n init +``` + +上述命令会在当前工程目录下创建`languages/settings.json`文件。如果您的源代码在`src`子文件夹中,则会创建在`src/languages/settings.json` + +`settings.json`内容如下: + +```json +{ + "languages": [ + { + "name": "zh", + "title": "zh" + }, + { + "name": "en", + "title": "en" + } + ], + "defaultLanguage": "zh", + "activeLanguage": "zh", + "namespaces": {} +} +``` + +上述命令代表了: + +- 本项目拟支持`中文`和`英文`两种语言。 +- 默认语言是`中文`(即在源代码中直接使用中文) +- 激活语言是`中文` + +**注意:** + +- `voerkai18n init`是可选的,`voerkai18n extract`也可以实现相同的功能。 +- 一般情况下,您可以手工修改`settings.json`,如定义名称空间。 + +## 第三步:提取文本 + +接下来我们使用`voerkai18n extract`命令来自动扫描工程源码文件中的需要的翻译的文本信息。 + +```shell +myapp>voerkai18n extract +``` + +执行`voerkai18n extract`命令后,就会在`myapp/languages`通过生成`translates/default.json`、`settings.json`等相关文件。 + +- **translates/default.json** : 该文件就是需要进行翻译的文本信息。 + +- **settings.json**: 语言环境的基本配置信息,可以进行修改。 + +最后文件结构如下: + +```shell +myapp + |-- languages + |-- settings.json // 语言配置文件 + |-- translates // 此文件夹是所有需要翻译的内容 + |-- default.json // 默认名称空间内容 + |-- package.json + |-- index.js + +``` + +**如果略过第一步中的`voerkai18n init`,也可以使用以下命令来为创建和更新`settinbgs.json`** + +```javascript +myapp>voerkai18n extract -D -lngs zh en de jp -d zh -a zh +``` + +以上命令代表: + +- 扫描当前文件夹下所有源码文件,默认是`js`、`jsx`、`html`、`vue`文件类型。 +- 计划支持`zh`、`en`、`de`、`jp`四种语言 +- 默认语言是中文。(指在源码文件中我们直接使用中文即可) +- 激活语言是中文(即默认切换到中文) +- `-D`代表显示扫描调试信息 + +## 第四步:翻译文本 + +接下来就可以分别对`language/translates`文件夹下的所有`JSON`文件进行翻译了。每个`JSON`文件大概如下: + +```json +{ + "中华人民共和国万岁":{ + "en":"<在此编写对应的英文翻译内容>", + "de":"<在此编写对应的德文翻译内容>" + "jp":"<在此编写对应的日文翻译内容>", + "$files":["index.js"] // 记录了该信息是从哪几个文件中提取的 + }, + "中华人民共和国成立于{}":{ + "en":"<在此编写对应的英文翻译内容>", + "de":"<在此编写对应的德文翻译内容>" + "jp":"<在此编写对应的日文翻译内容>", + "$files":["index.js"] + } +} +``` + +我们只需要修改该文件翻译对应的语言即可。 + +**重点:如果翻译期间对源文件进行了修改,则只需要重新执行一下`voerkai18n extract`命令,该命令会进行以下操作:** + +- 如果文本内容在源代码中已经删除了,则会自动从翻译清单中删除。 +- 如果文本内容在源代码中已修改了,则会视为新增加的内容。 +- 如果文本内容已经翻译了一部份了,则会保留已翻译的内容。 + +因此,反复执行`voerkai18n extract`命令是安全的,不会导致进行了一半的翻译内容丢失,可以放心执行。 + +大部分国际化解决方案至此就需要交给人工进行翻译了,但是`voerkai18n`除了手动翻译外,通过`voerkai18n translate`命令来实现**调用在线翻译服务**进行自动翻译。 + +```javascript +>voerkai18n translate --provider baidu --appkey <在百度翻译上申请的密钥> --appid <在百度翻译上申请的appid> +``` + + 在项目文件夹下执行上面的语句,将会自动调用百度的在线翻译API进行翻译,以现在的翻译水平而言,您只需要进行少量的微调即可。关于`voerkai18n translate`命令的使用请查阅后续介绍。 + +## 第五步:编译语言包 + +当我们完成`myapp/languages/translates`下的所有`JSON语言文件`的翻译后(如果配置了名称空间后,每一个名称空间会对应生成一个文件,详见后续`名称空间`介绍),接下来需要对翻译后的文件进行编译。 + +```shell +myapp> voerkai18n compile +``` + +`compile`命令根据`myapp/languages/translates/*.json`和`myapp/languages/settings.json`文件编译生成以下文件: + +```javascript + |-- languages + |-- settings.json // 语言配置文件 + |-- idMap.js // 文本信息id映射表 + |-- runtime.js // 运行时源码 + |-- index.js // 包含该应用作用域下的翻译函数等 + |-- zh.js // 语言包 + |-- en.js + |-- jp.js + |-- de.js + |-- translates // 此文件夹包含了所有需要翻译的内容 + |-- default.json + |-- package.json + |-- index.js + +``` + +## 第六步:导入翻译函数 + +第一步中我们在源文件中直接使用了`t`翻译函数包装要翻译的文本信息,该`t`翻译函数就是在编译环节自动生成并声明在`myapp/languages/index.js`中的。 + +```javascript +import { t } from "./languages" +``` + +因此,我们需要在需要进行翻译时导入该函数即可。 + +但是如果源码文件很多,重次重复导入`t`函数也是比较麻烦的,所以我们也提供了一个`babel/vite`等插件来自动导入`t`函数。 + +## 第六步:切换语言 + +当需要切换语言时,可以通过调用`change`方法来切换语言。 + +```javascript +import { i18nScope } from "./languages" + +// 切换到英文 +await i18nScope.change("en") +// VoerkaI18n是一个全局单例,可以直接访问 +await VoerkaI18n.change("en") +``` + +`i18nScope.change`与`VoerkaI18n.change`两者是等价的。 + +一般可能也需要在语言切换后进行界面更新渲染,可以订阅事件来响应语言切换。 + +```javascript +import { i18nScope } from "./languages" + +// 切换到英文 +i18nScope.on((newLanguage)=>{ + ... +}) +// +VoerkaI18n.on((newLanguage)=>{ + ... +}) +``` diff --git a/docs/zh/guide/intro/history.md b/docs/zh/guide/intro/history.md new file mode 100644 index 0000000..29ff8e2 --- /dev/null +++ b/docs/zh/guide/intro/history.md @@ -0,0 +1,3 @@ +--- +title: 版本历史 +--- \ No newline at end of file diff --git a/docs/zh/guide/intro/install.md b/docs/zh/guide/intro/install.md new file mode 100644 index 0000000..e1df446 --- /dev/null +++ b/docs/zh/guide/intro/install.md @@ -0,0 +1,43 @@ +--- +title: 安装 +--- + +# 安装 + +`VoerkaI18n`国际化框架是一个开源多包工程,主要由以下几个包组成: + +## **@voerkai18/cli** + +包含文本提取/编译等命令行工具,一般应该安装到全局。 + +```javascript +npm install --g @voerkai18/cli +yarn global add @voerkai18/cli +pnpm add -g @voerkai18/cli +``` + +## **@voerkai18/runtime** + +**可选的**,运行时,`@voerkai18/cli`的依赖。大部分情况下不需要手动安装,一般仅在开发库项目时采用独立的运行时依赖。 + +```javascript +npm install --save @voerkai18/runtime +yarn add @voerkai18/runtime +pnpm add @voerkai18/runtime +``` + +## **@voerkai18/formatters** + +**可选的**,一些额外的格式化器,可以按需进行安装到`dependencies`中,用来扩展翻译时对插值变量的额外处理。 + +## **@voerkai18/babel** + +可选的`babel`插件,用来实现自动导入翻译函数和翻译文本映射自动替换。 + +## **@voerkai18/vue** + +可选的`vue`插件,用来为Vue应用提供语言动态切换功能。 + +## **@voerkai18/vite** + +可选的`vite`插件,用来为`vite`应用提供自动导入翻译函数和翻译文本映射自动替换。 diff --git a/docs/zh/guide/intro/question.md b/docs/zh/guide/intro/question.md new file mode 100644 index 0000000..4737654 --- /dev/null +++ b/docs/zh/guide/intro/question.md @@ -0,0 +1,3 @@ +--- +title: 常见问题 +--- \ No newline at end of file diff --git a/docs/zh/guide/intro/readme.md b/docs/zh/guide/intro/readme.md new file mode 100644 index 0000000..fb98e2b --- /dev/null +++ b/docs/zh/guide/intro/readme.md @@ -0,0 +1,38 @@ +# 概述 + +基于`javascript`的国际化方案很多,比较有名的有`fbt`、`i18next`、`react-i18next`、`vue-i18n`、`react-intl`等等,每一种解决方案均有大量的用户。为什么还要再造一个轮子?好吧,再造轮子的理由不外乎不满足于现有方案,总想着现有方案的种种不足之处,然后就撸起袖子想造一个轮子,也不想想自己什么水平。 + +哪么到底是对现有解决方案有什么不满?最主要有三点: + +- 大部份均为要翻译的文本信息指定一个`key`,然后在源码文件中使用形如`$t("message.login")`之类的方式,然后在翻译时将之转换成最终的文本信息。此方式最大的问题是,在源码中必须人为地指定每一个`key`,在中文语境中,想为每一句中文均配套想一句符合语义的`英文key`是比较麻烦的,也很不直观不符合直觉。我希望在源文件中就直接使用中文,如`t("中华人民共和国万岁")`,然后国际化框架应该能自动处理后续的一系列麻烦。 + +- 要能够比较友好地支持多库多包`monorepo`场景下的国际化协作,当主程序切换语言时,其他包或库也可以自动切换,并且在开发上每个包或库均可以独立地进行开发,集成到主程序时能无缝集成。这点在现有方案上没有找到比较理想的解决方案。 + +- 大部份国际化框架均将中文视为二等公民,大部份情况下您应该采用英文作为第一语言,虽然这不是太大的问题,但是既然要再造一个轮子,为什么不将中文提升到一等公民呢。 + + + + 基于此就开始造出`VoerkaI18n`这个**全新的国际化多语言解决方案**,主要特性包括: + + + +- 全面工程化解决方案,提供初始化、提取文本、自动翻译、编译等工具链支持。 + +- 符合直觉,不需要手动定义文本`Key`映射。 + +- 强大的插值变量`格式化器`机制,可以扩展出强大的多语言特性。 + +- 支持`babel`插件自动导入`t`翻译函数。 + +- 支持`nodejs`、浏览器(`vue`/`react`)前端环境。 + +- 采用`工具链`与`运行时`分开设计,发布时只需要集成很小的运行时。 + +- 高度可扩展的`复数`、`货币`、`数字`等常用的多语言处理机制。 + +- 翻译过程内,提取文本可以自动进行同步,并保留已翻译的内容。 + +- 可以随时添加支持的语言 + +- 支持调用在线自动翻译对提取文本进行翻译。 + diff --git a/docs/zh/guide/tools/babel.md b/docs/zh/guide/tools/babel.md new file mode 100644 index 0000000..5780af9 --- /dev/null +++ b/docs/zh/guide/tools/babel.md @@ -0,0 +1,73 @@ +# Babel插件 + +全局安装`@voerkai18n/babel`插件用来进行自动导入`t`函数和自动文本映射。 + +## 安装 + +```javascript +> npm install -g @voerkai18n/babel +> yarn global add @voerkai18n/babel +> pnpm add -g @voerkai18n/babel +``` + +## 启用插件 + +使用方法如下: + +- 在`babel.config.js`中配置插件 + +```javascript +const i18nPlugin = require("@voerkai18n/babel") +module.expors = { + plugins: [ + [ + i18nPlugin, + { + // 可选,指定语言文件存放的目录,即保存编译后的语言文件的文件夹 + // 可以指定相对路径,也可以指定绝对路径 + // location:"", + autoImport:"#/languages" + } + ] + ] +} +``` + +这样,当在进行`babel`转码时,就会自动在`js`源码文件中导入`t`翻译函数。 + +## 插件参数 + +插件支持以下参数: + +- **location** + + 配置`langauges`文件夹位置,默认会使用当前文件夹下的`languages`文件。 + + 因此,如果你的`babel.config.js`在项目根文件夹,而`languages`文件夹位于`src/languages`,则可以将`location="src/languages"`,这样插件会自动从该文件夹读取需要的数据。 + +- **autoImport** + + 用来配置导入的路径。比如 `autoImport="#/languages" `,则当在babel转码时,如果插件检测到t函数的存在并没有导入,就会自动在该源码中自动导入`import { t } from "#/languages"` + + 配置`autoImport`时需要注意的是,为了提供一致的导入路径,视所使用的打包工具或转码插件,如`webpack`、`rollup`等。比如使用`babel-plugin-module-resolver` + + ```javascript + module.expors = { + plugins: [ + [ + "module-resolver", + { + root:"./", + alias:{ + "languages":"./src/languages" + } + } + ] + ] + } + ``` + + 这样配置`autoImport="languages"`,则自动导入`import { t } from "languages"`。 + + 如`webpack`、`rollup`等打包工具也有类似的插件可以实现别名等转换,其目的就是让`@voerkai18n/babel`插件能自动导入固定路径,而不是各种复杂的相对路径。 + \ No newline at end of file diff --git a/docs/zh/guide/tools/cli.md b/docs/zh/guide/tools/cli.md new file mode 100644 index 0000000..f13f139 --- /dev/null +++ b/docs/zh/guide/tools/cli.md @@ -0,0 +1,251 @@ +# 命令行工具 + +`@voerkai18n/cli`命令行工具用来实现工程初始化、扫描提取文本、自动翻译和编译语言等功能。 + +::: info +建议将`@voerkai18n/cli`命令行工具安装在全局 +::: + +## 安装 + +全局安装`@voerkai18n/cli`工具。 + +```javascript +> npm install -g @voerkai18n/cli +> yarn global add @voerkai18n/cli +> pnpm add -g @voerkai18n/cli +``` + +然后就可以执行: + +```javascript +> voerkai18n init +> voerkai18n extract +> voerkai18n compile +``` + +如果没有全局安装,则需要: + +```javascript +> yarn voerkai18n init +> yarn voerkai18n extract +> yarn voerkai18n compile +--- +> pnpm voerkai18n init +> pnpm voerkai18n extract +> pnpm voerkai18n compile +``` + +## 初始化 - init + +用于在指定项目创建`voerkai18n`国际化配置文件。 + +```shell +> voerkai18n init --help +初始化项目国际化配置 +Arguments: + location 工程项目所在目录 +Options: + -D, --debug 输出调试信息 + -r, --reset 重新生成当前项目的语言配置 + -lngs, --languages 支持的语言列表 (default: ["zh","en"]) + -d, --defaultLanguage 默认语言 + -a, --activeLanguage 激活语言 + -h, --help display help for command +``` + +**使用方法如下:** + +首先需要在工程文件下运行`voerkai18n init`命令对当前工程进行初始化。 + +```javascript +//- `lngs`参数用来指定拟支持的语言名称列表 +> voerkai18n init . -lngs zh en jp de -d zh +``` + +运行`voerkai18n init`命令后,会在当前工程中创建相应配置文件。 + +```javascript +myapp + |-- languages + |-- settings.json // 语言配置文件 + |-- package.json + |-- index.js +``` + +`settings.json`文件很简单,主要是用来配置要支持的语言等基本信息。 + +```javascript +module.exports = { + // 拟支持的语言列表 + "languages": [ + { + "name": "zh", + "title": "中文" + }, + { + "name": "en", + "title": "英文" + } + ], + // 默认语言,即准备在源码中写的语言,一般我们可以直接使用中文 + "defaultLanguage": "zh", + // 激活语言,即默认要启用的语言,一般等于defaultLanguage + "activeLanguage": "zh", + // 翻译名称空间定义,详见后续介绍。 + "namespaces": {} +} +``` + +**说明:** + +- 您也可以手动自行创建`languages/settings.json`文件。这样就不需运行`voerkai18n init`命令了。 + +- 如果你的源码放在`src`文件夹,则`init`命令会自动在在`src`文件夹下创建`languages`文件夹。 + +- `voerkai18n init`是可选的,直接使用`extract`时也会自动创建相应的文件。 + +- `-m`参数用来指定生成的`settings.json`的模块类型: + - 当`-m=auto`时,会自动读取前工程`package.json`中的`type`字段 + - 当`-m=esm`时,会生成`ESM`模块类型的`settings.json`。 + - 当`-m=cjs`时,会生成`commonjs`模块类型的`settings.json`。 + +- `location`参数是可选的,如果没有指定则采用当前目录。 + + 如果你想将`languages`安装在`src/languages`下,则可以指定`voerkai18n init ./src` + +## 提取文本 - extract + +扫描提取当前项目中的所有源码,提取出所有需要翻译的文本内容并保存在到`<工程源码目录>/languages/translates/*.json`。 + +```shell +> voerkai18n extract --help +扫描并提取所有待翻译的字符串到文件夹中 + +Arguments: + location 工程项目所在目录 (default: "./") + +Options: + -D, --debug 输出调试信息 + -lngs, --languages 支持的语言 + -d, --defaultLanguage 默认语言 + -a, --activeLanguage 激活语言 + -ns, --namespaces 翻译名称空间 + -e, --exclude 排除要扫描的文件夹,多个用逗号分隔 + -u, --updateMode 本次提取内容与已存在内容的数据合并策略,默认取值sync=同步,overwrite=覆盖,merge=合并 + -f, --filetypes 要扫描的文件类型 + -h, --help display help for command +``` + +**说明:** + +- 启用`-d`参数时会输出提取过程,显示从哪些文件提取了几条信息。 +- 如果已手动创建或通过`init`命令创建了`languages/settings.json`文件,则可以不指定`-ns`,`-lngs`,`-d`,`-a`参数。`extract`会优先使用`languages/settings.json`文件中的参数来进行提取。 +- `-u`参数用来指定如何将提取的文本与现存的文件进行合并。因为在国际化流程中,我们经常面临源代码变更时需要更新翻译的问题。支持三种合并策略。 + - **sync**:同步(默认值),两者自动合并,并且会删除在源码文件中不存在的文本。如果某个翻译已经翻译了一半也会保留。此值适用于大部情况,推荐。 + - **overwrite**:覆盖现存的翻译内容。这会导致已经进行了一半的翻译数据丢失,**慎用**。 + - **merge**:合并,与sync的差别在于不会删除源码中已不存在的文本。 +- `-e`参数用来排除扫描的文件夹,多个用逗号分隔。内部采用`gulp.src`来进行文件提取,请参数。如 `-e !libs,core/**/*`。默认会自动排除`node_modules`文件夹 +- `-f`参数用来指定要扫描的文件类型,默认`js,jsx,ts,tsx,vue,html` +- `extract`是基于正则表达式方式进行匹配的,而不是像`i18n-next`采用基于`AST`解析。 + +>**重点:** +> +>默认情况下,`voerkai18n extract`可以安全地反复多次执行,不会导致已经翻译一半的内容丢失。 +> +>如果想添加新的语言支持,也`voerkai18n extract`也可以如预期的正常工作。 + +## 自动翻译 - translate + +在工程文件夹下执行`voerkai18n translate`命令,该命令会读取`languages/settings.json`配置文件,并调用在线翻译服务(如百度在线翻译)对提取的文本(`languages/translates/*.json`)进行自动翻译。 + +```shell +Usage: voerkai18n translate [options] [location] + +调用在线翻译服务商的API翻译译指定项目的语言包,如使用百度云翻译服务 + +Arguments: + location 工程项目所在目录 + +Options: + -p, --provider 在线翻译服务提供者名称或翻译脚本文件 (default: "baidu") + -m, --max-package-size 将多个文本合并提交的最大包字节数 (default: 3000) + --appkey [key] API密钥 + --appid [id] API ID + --no-backup 备份原始文件 + --mode 翻译模式,取值auto=仅翻译未翻译的,full=全部翻译 + -q, --qps 翻译速度限制,即每秒可调用的API次数 (default: 1) + -h, --help 显示帮助 +``` + +- 内置支持调用百度的在线翻译服务,您需要百度的网站上(http://api.fanyi.baidu.com/)申请开通服务,开通后可以得到`appid`和`appkey`(密钥)。 + +- `--provider`用来指定在线翻译服务提供者,内置支持的是百度在线翻译。也可以传入一个js脚本,如下: + + ```javascript + // youdao.js + module.exports = async function(options){ + let { appkey,appid } = options + return { + translate:async (texts,from,to){ + // texts是一个Array + // from,to代表要从哪一种语言翻译到何种语言 + ..... + // 在此对texts内容调用在线翻译API + // 翻译结果应该返回与texts对应的数组 + // 如果出错则应该throw new Error() + return [...] + } + } + } + ``` + +- `qps`用来指定调用在线翻译API的速度,默认是1,代表每秒调用一次;此参数的引入是考虑到有些翻译平台的免费API有QPS限制。比如百度在线翻译免费版本限制`QPS`就是1,即每秒只能调用一次。如果您购买了服务,则可以将`QPS`调高。 + +- 默认情况下,每次运行时均会备份原始的翻译文件至`languages/translates/backup`,`--no-backup`可以禁止备份。 + +- 默认情况下,`voerkai18n translate`会在每次运行时跳过已经翻译过的内容,这样可以保留翻译成果。此特性在您对自动翻译的内容进行修改后,再多次运行`voerkai18n translate`命令时均能保留翻译内容,不会导致您修改调整过的内容丢失。`--mode full`参数可以完全覆盖翻译,请慎用。 + +- 为了提高在线翻译的速度,`voerkai18n translate`并不是一条文本调用一次API,而是将多条文本合并起来进行调用,但是单次调用也是有数据包大小的限制的,`--max-package-size`参数用来指定数据包的最大值。比如百度建议,为保证翻译质量,请将单次请求长度控制在 6000 bytes以内(汉字约为输入参数 2000 个)。 + +- 需要注意的是,自动翻译虽然准确性还不错,真实场景还是需要进行手工调整的,特别是自动翻译一般不能识别插值变量。 + +## 编译 - compile + +编译当前工程的语言包,编译结果输出在.`/langauges`文件夹。 + +```shell +Usage: voerkai18n compile [options] [location] + +编译指定项目的语言包 + +Arguments: + location 工程项目所在目录 (default: "./") + +Options: + -D, --debug 输出调试信息 + -m, --moduleType [types] 输出模块类型,取值auto,esm,cjs (default: "esm") + --no-inline-runtime 不嵌入运行时源码 + -h, --help display help for command +``` + +`voerkai18n compile`执行后会在`langauges`文件夹下输出: + +```javascript +myapp + |--- langauges + |-- index.js // 当前作用域的源码 + |-- idMap.js // 翻译文本与id的映射文件 + |-- formatters.js // 自定义格式化器 + |-- zh.js // 中文语言包 + |-- en.js // 英文语言包 + |-- xx.js // 其他语言包 + |-- ... +``` + +**说明:** + +- 在当前工程目录下,一般不需要指定参数就可以反复多次进行编译。 +- 您每次修改了源码并`extract`后,均应该再次运行`compile`命令。 +- 如果您修改了`formatters.js`,执行`compile`命令不会重新生成和修改该文件。 +- `--no-inline-runtime `参数用来指示如何引用运行时。默认会将运行时代码生成保存在`languages/runtime.js`,应用以源码形式引用。当启用`--no-inline-runtime `参数时会采用`require("@voerkai18n/runtime")`的方式。 \ No newline at end of file diff --git a/docs/zh/guide/tools/vite.md b/docs/zh/guide/tools/vite.md new file mode 100644 index 0000000..6124f28 --- /dev/null +++ b/docs/zh/guide/tools/vite.md @@ -0,0 +1,97 @@ +# Vite插件 + +`@voerkai18n/babel`插件在`vite`应用中不能正常使用,需要使用`@voerkai18n/vite`插件来完成类似的功能,包括自动文本映射和自动导入`t`函数。 + +## 安装 + +`@voerkai18n/vite`只需要作为开发依赖安装即可。 + +```javascript +npm install --save-dev @voerkai18n/vite +yarn add -D @voerkai18n/vite +pnpm add -D @voerkai18n/vite +``` + +## 启用插件 + +接下来在`vite.config.js`中配置启用`@voerkai18n/vite`插件。 + +```javascript +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import Inspect from 'vite-plugin-inspect'// 可选的 +import Voerkai18nPlugin from "@voerkai18n/vite" +export default defineConfig({ + plugins: [ + Inspect(), // 可选的 + Voerkai18nPlugin({debug:true}), + vue() + ] +}) + +``` + +- ` vite-plugin-inspect`是开发`vite`插件时的调试插件,启用后就可以通过`localhost:3000/__inspect/ `查看Vue源码文件经过插件处理前后的内容,一般是Vite插件开发者使用。上例中安装后,就可以查看`Voerkai18nPlugin`对`Vue`文件干了什么事,可以加深理解,**正常使用不需要安装**。 + +## 插件功能 + +`@voerkai18n/vite`插件配置启用后,`vite`在进行`dev`或`build`时,就会在``自动注入`import { t } from "languages" `,同时会扫描源代码文件(包括`vue`,`js`等),根据`idMap.js`文件里面的文本映射表,将`t('"xxxx")`转换成`t("")`的形式。 + +不同于`@voerkai18n/babel`插件,`@voerkai18n/vite`插件不需要配置`location`和`autoImport`参数,能正确地处理导入`languages`路径。 + +## 插件参数 + +`vite`插件支持以下参数: + +```javascript +import Voerkai18nPlugin from "@voerkai18n/vite" +export default defineConfig({ + plugins: [ + Inspect(), // 可选的 + Voerkai18nPlugin({ + location: "./", // 可选的,指定当前工程目录 + autoImport: true, // 是否自动导入t函数 + debug:false, // 是否输出调试信息,当=true时,在控制台输出转换匹配的文件清单 + patterns:[ + "!(?/src/languages`文件夹下。 + +- `autoImport`:可选的,默认`true`,用来配置是否自动导入`t`函数。当vue文件没有指定导入时才会自动导入,并且根据当前vue文件的路径处理好导入位置。 + +- `debug`:可选的,开启后会在控制台输出一些调试信息,对一般用户没有用。 + +- `patterns`:可选的,一些正则表达式匹配规则,用来过滤匹配哪一些文件需要进行扫描和处理。默认的规则: + + ```javascript + const patterns={ + "!(? +import {reactive } from 'vue' +export default { + inject: ['i18n'], // 注入i18n实例,该实例由@voerkai18n/vue插件提供 + .... +} + +``` + +声明`inject: ['i18n']`后在当前组件实例中就可以访问`this.i18n`,该实例是一个经过`reactive`封闭的响应式对象,其内容是: + +```javascript +this.i18n = { + activeLanguage, // 当前激活语言,可以通过直接赋值来切换语言 + defaultLanguage, // 默认语言名称 + languages // 支持的语言列表=[{name,title},...] +} +``` + +## 应用示例 + +注入`i18n`实例后就可以在此基础上实现`激活语言`、`默认语言`、`切换语言`等功能。 + +```vue + +