انتقل إلى المحتوى
MellowCAD

هذا القسم مكتوب بالإنجليزية فقط.

كيف…

على npm

Languages

The editor in Spanish and Arabic, right to left, the language menu, and rewording its words.

The editor speaks English, Spanish and Arabic. Its words come in two catalogs, one per package:

  • editorLocale, the editor's own words: menus, tooltips, the palettes' labels, the dialogs. From @mellowcad/editor/locales/<tag>.
  • engineLocale, the engine's: command names and aliases, prompts, keywords, the messages on the command line, and the names the engine gives (tools, snaps, colours). From @mellowcad/engine/locales/<tag>.

Each one is English when left out. Pass both, in the same language:

import { CadEditor } from "@mellowcad/editor"import { es } from "@mellowcad/editor/locales/es"import { es as engineEs } from "@mellowcad/engine/locales/es"
export const Spanish = () => (  <CadEditor editorLocale={es} engineLocale={engineEs} />)

A Spanish user types Spanish AutoCAD's commands (LINEA, L), and _LINE still reaches the global one. Arabic has no AutoCAD of its own, so its command language is the global one. Which words each part covers, and how the engine's language works, is in the engine's Languages.

The editor sets its catalog's tag as lang on its own root and leaves the page's <html> alone. engineLocale is read once, when the editor starts.

Right to left

import { CadEditor } from "@mellowcad/editor"import { ar } from "@mellowcad/editor/locales/ar"import { ar as engineAr } from "@mellowcad/engine/locales/ar"
export const Arabic = () => (  <CadEditor editorLocale={ar} engineLocale={engineAr} dir="rtl" />)

dir="rtl" mirrors the chrome: the tool palette moves to the right, the palettes to the left, the ViewCube to the top left. The drawing never mirrors, and neither does what is typed: the command line, the dynamic input and the coordinates read left to right in every language.

Loading a language

A catalog is a module of its own, and a language costs nothing until it is imported. Load the one the page needs, before rendering the editor:

import { createRoot } from "react-dom/client"import { CadEditor } from "@mellowcad/editor"import "@mellowcad/editor/styles.css"
const [{ es }, { es: engineEs }] = await Promise.all([  import("@mellowcad/editor/locales/es"),  import("@mellowcad/engine/locales/es"),])
createRoot(document.getElementById("root")!).render(  <CadEditor editorLocale={es} engineLocale={engineEs} />)

On a server, load them there and pass them as props: see Next.js.

The language menu

languages lists the page in each language you offer, under Language in the application menu. Each entry is a link:

<CadEditor  languages={[    { locale: "en", href: "/draw", name: "English", current: true },    { locale: "es", href: "/es/draw", name: "Español", current: false },  ]}/>

name is the language named in itself. Choosing one follows its href: the page decides what the new language loads. Without languages, the menu has no Language entry.

Your own words

An EditorLocale is a tag and its messages, and any message left out is English's. To reword a few of the editor's words, give a catalog with only those:

import { CadEditor, type EditorLocale } from "@mellowcad/editor"
const english: EditorLocale = {  tag: "en",  messages: { TopBar: { savedHint: "Saved to your account" } },}
export const Editor = () => <CadEditor editorLocale={english} />

Over another language, spread its messages under yours:

import type { EditorLocale } from "@mellowcad/editor"import { es } from "@mellowcad/editor/locales/es"
export const spanish: EditorLocale = {  ...es,  messages: {    ...es.messages,    TopBar: { ...es.messages.TopBar, savedHint: "Guardado en tu cuenta" },  },}

The keys are those of the English catalog, @mellowcad/editor/locales/en, which EditorLocale is typed from. A message with no arguments is a plain string; one with arguments is compiled at build time with icu-minify/compile, as the engine's are (Messages are compiled at build time). To reword the engine's words, use extendLocale from @mellowcad/engine.

Versioning

The catalog's shape is public API: EditorLocale is typed from the English catalog, and yours is written against it. Renaming, moving or removing a key, or changing a message's arguments, is a breaking change. Adding a key is not: your catalog falls back to English for it.