diff --git a/metadata.schema.json b/metadata.schema.json index fa06693..8566a45 100644 --- a/metadata.schema.json +++ b/metadata.schema.json @@ -5,7 +5,7 @@ "language": { "type": "string", "description": "The language of the documentation.", - "enum": ["ja-JP", "en-US"] + "enum": ["ja-JP", "en-US", "zh-Hans"] }, "version": { "type": "string", diff --git a/src/metadata.ts b/src/metadata.ts index e634d8b..c4f33c3 100644 --- a/src/metadata.ts +++ b/src/metadata.ts @@ -4,7 +4,7 @@ import path from "node:path"; const METADATA_FILE = path.resolve(process.cwd(), "./public/metadata.json"); type Metadata = { - language: "ja-JP" | "en-US"; + language: "ja-JP" | "en-US" | "zh-Hans"; version: string; typstOfficialUrl: string; typstOfficialDocsUrl: `http://${string}/` | `https://${string}/`; diff --git a/src/translation/index.tsx b/src/translation/index.tsx index 77b9bd8..4607b1e 100644 --- a/src/translation/index.tsx +++ b/src/translation/index.tsx @@ -9,6 +9,10 @@ import { Translation as JaJPTranslation, translation as jaJPTranslation, } from "./ja-JP"; +import { + Translation as ZhHansTranslation, + translation as zhHansTranslation, +} from "./zh-Hans"; /** * Translation dictionary for UI attributes and aria labels. @@ -107,10 +111,12 @@ export type TranslationComponent = FC; // Switch translation language. const { Translation, translation } = (() => { switch (language) { - case "ja-JP": - return { Translation: JaJPTranslation, translation: jaJPTranslation }; case "en-US": return { Translation: EnUSTranslation, translation: enUSTranslation }; + case "ja-JP": + return { Translation: JaJPTranslation, translation: jaJPTranslation }; + case "zh-Hans": + return { Translation: ZhHansTranslation, translation: zhHansTranslation }; default: throw new Error(`Unsupported language: ${language}`); } diff --git a/src/translation/zh-Hans.tsx b/src/translation/zh-Hans.tsx new file mode 100644 index 0000000..c038f98 --- /dev/null +++ b/src/translation/zh-Hans.tsx @@ -0,0 +1,203 @@ +import { Fragment } from "hono/jsx/jsx-runtime"; +import type { TooltipProps } from "../components/ui/Tooltip"; +import { + discordServerUrl, + githubOrganizationUrl, + githubRepositoryUrl, + typstOfficialDocsUrl, + version, +} from "../metadata"; +import type { TranslationComponent, TranslationObject } from "./"; + +export const translation: TranslationObject = { + htmlLang: () => "zh-Hans", + documentationTitle: () => "Typst中文文档", + close: () => "关闭", + closeMenu: () => "关闭菜单", + closeSearch: () => "关闭搜索", + openMenu: () => "打开菜单", + openSearch: () => "打开搜索", + showInformation: (props: { name: string }) => `具体解释${props.name}`, + tooltipKind: (props: { kind: TooltipProps["kind"] }) => { + const map: Record = { + element: "元素函数", + contextual: "上下文相关", + constructor: "构造函数", + definitions: "定义", + parameters: "参数", + variadic: "变长参数", + settable: "可用set规则", + positional: "位置参数", + required: "必需参数", + }; + return map[props.kind]; + }, +} as const; + +export const Translation: TranslationComponent = (props) => { + switch (props.translationKey) { + // Function tooltips + case "elementFunction": + return 元素; + case "elementFunctionDescription": + return ( + + 元素函数可用setshow规则自定义样式。 + + ); + case "contextFunction": + return 上下文相关函数; + case "contextFunctionDescription": + return 上下文相关函数只能在确定上下文之后使用。; + + // Section tooltips + case "constructor": + return 构造函数; + case "constructorDescription": + return ( + 若某类型提供构造函数,可调用它生成该类型的新实例。 + ); + case "definitionsOf": + return ( + + {props.name}的定义 + + ); + case "definitions": + return 定义; + case "definitionsDescription": + return ( + + 这些函数和类型带有附属定义。要访问这种定义,请先写上函数或类型的名称,再加上定义的名称,并用句点在中间分隔。 + + ); + case "parameters": + return 参数; + case "parametersDescription": + return 参数是传给函数的输入,写在函数名后的括号中。; + + // Parameter tooltips + case "variadic": + return 变长参数; + case "variadicDescription": + return 变长参数可以传入多次。; + case "settable": + return 可用set规则; + case "settableDescription": + return ( + + 可用set规则设置参数,更改后续调用时的默认值。 + + ); + case "positional": + return 位置参数; + case "positionalDescription": + return 位置参数按顺序传入,不带参数名。; + case "required": + return 必需参数; + case "requiredDescription": + return 必需参数在调用函数时必须传入。; + + // Other texts in documentation + case "tutorial": + return 教程; + case "tutorialDescription": + return 逐步学习如何使用Typst。; + case "reference": + return 参考手册; + case "referenceDescription": + return ( + Typst语法、概念、类型、函数等方面的详细参考手册。 + ); + case "defaultValue": + return 默认值:; + case "stringValues": + return 可填写的值; + case "showExample": + return 展开例子; + + // Translation statuses + case "untranslated": + return 未翻译; + case "untranslatedMessage": + return 本页尚未翻译,以下展示原文。; + case "communityContent": + return 中文版特色内容; + case "contentAddedByCommunity": + return 本页不属于官方文档,由中文社区独立增加。; + case "partiallyTranslated": + return 部分翻译; + case "partiallyTranslatedMessage": + return 本页仅部分翻译,会残余一些原文。; + case "translated": + return 已翻译; + case "translatedMessage": + return 本页已翻译为中文。; + + // Header, sidebar, and footer + case "document": + return 文档; + case "langVersion": + return 简体中文版; + case "translationRate": + return 翻译率; + case "search": + return 搜索; + case "typstOfficialWebsite": + return Typst官方网站; + case "typstOfficialDocs": + return Typst官方文档; + case "openOfficialDocs": + return 转到官方文档(英文); + case "tableOfContents": + return 目录; + case "footer": + return ( + + Translated by{" "} + Typst Chinese Community + + ); + case "previousPage": + return 上一页; + case "nextPage": + return 下一页; + + // Site notice + case "siteNoticeBannerTitle": + return 注意 / Info; + case "siteNoticeBannerDescription": + return ( + + 本站经 Typst GmbH 许可,提供{" "} + Typst v{version} 官方文档的翻译,由 + 中文社区维护。建议与 + 官方文档 + 一同阅读,因为可能存在错译、漏译或过时信息。如有意改进翻译内容或网站本身,可在 + GitHub上提出 Issue、发起 Pull + Requests。此外,也欢迎加入 + + 「Typst 非官方中文交流群」(QQ 793548390) + + 。 +
+ This site provides a Chinese translation of the{" "} + Typst v{version} documentation{" "} + maintained by the “ + Typst Chinese Community” with + permission from Typst GmbH. We recommend using this alongside the{" "} + official documentation. We welcome + contributions through Issues and Pull Requests on{" "} + our GitHub repository for both + translation improvements and website enhancements. Feel free to join{" "} + + our QQ chat group “Typst 非官方中文交流群” (793548390) + + . +
+ ); + + default: + return null; + } +};