Vizel API / core/src / createVizelLocale
Function: createVizelLocale()
ts
function createVizelLocale(partial): VizelLocale;Defined in: packages/core/src/i18n/utils.ts:50
Create a complete locale by deep-merging partial translations with the default English locale. Supports overriding individual strings at any nesting depth.
Parameters
| Parameter | Type | Description |
|---|---|---|
partial | { blockMenu?: { copy?: string; cut?: string; delete?: string; duplicate?: string; label?: string; turnInto?: string; }; bubbleMenu?: { ariaLabel?: string; bold?: string; code?: string; italic?: string; link?: string; strikethrough?: string; subscript?: string; superscript?: string; underline?: string; }; codeBlock?: { copied?: string; copyCode?: string; hideLineNumbers?: string; languagePlaceholder?: string; showLineNumbers?: string; }; colorPicker?: { apply?: string; applyAriaLabel?: string; hexPlaceholder?: string; highlight?: string; highlightPalette?: string; recent?: string; textColor?: string; textColorPalette?: string; }; commands?: { block?: { demote?: { description?: string; title?: string; }; duplicate?: { description?: string; title?: string; }; mergePrevious?: { description?: string; title?: string; }; moveDown?: { description?: string; title?: string; }; moveUp?: { description?: string; title?: string; }; promote?: { description?: string; title?: string; }; split?: { description?: string; title?: string; }; }; }; dragHandle?: { ariaLabel?: string; }; findReplace?: { caseSensitive?: string; closeAriaLabel?: string; closeTitle?: string; findNextAriaLabel?: string; findNextTitle?: string; findPlaceholder?: string; findPreviousAriaLabel?: string; findPreviousTitle?: string; findTextAriaLabel?: string; label?: string; noResults?: string; replaceAllAriaLabel?: string; replaceAllTitle?: string; replaceAriaLabel?: string; replacePlaceholder?: string; replaceTextAriaLabel?: string; replaceTitle?: string; }; linkEditor?: { apply?: string; applyAriaLabel?: string; embedAsRichContent?: string; openInNewTab?: string; removeLink?: string; removeLinkAriaLabel?: string; urlPlaceholder?: string; visit?: string; visitTitle?: string; }; mentionMenu?: { ariaLabel?: string; noResults?: string; }; nodeSelector?: { blockTypes?: string; changeBlockType?: string; currentBlockType?: string; }; nodeTypes?: { bulletList?: string; code?: string; heading1?: string; heading2?: string; heading3?: string; heading4?: string; heading5?: string; heading6?: string; numberedList?: string; quote?: string; taskList?: string; text?: string; }; outline?: { ariaLabel?: string; }; relativeTime?: { daysAgo?: string; hoursAgo?: string; justNow?: string; minutesAgo?: string; secondsAgo?: string; }; saveIndicator?: { error?: string; saved?: string; saving?: string; unsaved?: string; }; slashMenu?: { enterEmbedUrl?: string; enterImageUrl?: string; enterUrl?: string; groups?: { [key: string]: string | undefined; advanced?: string; blocks?: string; lists?: string; media?: string; navigation?: string; text?: string; }; items?: { bulletList?: { description?: string; title?: string; }; callout?: { description?: string; title?: string; }; codeBlock?: { description?: string; title?: string; }; details?: { description?: string; title?: string; }; divider?: { description?: string; title?: string; }; embed?: { description?: string; title?: string; }; graphvizDiagram?: { description?: string; title?: string; }; heading1?: { description?: string; title?: string; }; heading2?: { description?: string; title?: string; }; heading3?: { description?: string; title?: string; }; heading4?: { description?: string; title?: string; }; heading5?: { description?: string; title?: string; }; heading6?: { description?: string; title?: string; }; image?: { description?: string; title?: string; }; inlineMath?: { description?: string; title?: string; }; mathEquation?: { description?: string; title?: string; }; mermaidDiagram?: { description?: string; title?: string; }; numberedList?: { description?: string; title?: string; }; quote?: { description?: string; title?: string; }; table?: { description?: string; title?: string; }; tableOfContents?: { description?: string; title?: string; }; taskList?: { description?: string; title?: string; }; uploadImage?: { description?: string; title?: string; }; }; noResults?: string; }; toolbar?: { ariaLabel?: string; bold?: string; bulletList?: string; code?: string; codeBlock?: string; heading1?: string; heading2?: string; heading3?: string; horizontalRule?: string; italic?: string; moreActions?: string; numberedList?: string; quote?: string; redo?: string; strikethrough?: string; taskList?: string; underline?: string; undo?: string; }; } | - |
partial.blockMenu? | { copy?: string; cut?: string; delete?: string; duplicate?: string; label?: string; turnInto?: string; } | Block context menu |
partial.blockMenu.copy? | string | - |
partial.blockMenu.cut? | string | - |
partial.blockMenu.delete? | string | - |
partial.blockMenu.duplicate? | string | - |
partial.blockMenu.label? | string | Menu aria-label |
partial.blockMenu.turnInto? | string | - |
partial.bubbleMenu? | { ariaLabel?: string; bold?: string; code?: string; italic?: string; link?: string; strikethrough?: string; subscript?: string; superscript?: string; underline?: string; } | Bubble menu labels |
partial.bubbleMenu.ariaLabel? | string | Aria label for the bubble menu container |
partial.bubbleMenu.bold? | string | Tooltip for bold button |
partial.bubbleMenu.code? | string | Tooltip for code button |
partial.bubbleMenu.italic? | string | Tooltip for italic button |
partial.bubbleMenu.link? | string | Tooltip for link button |
partial.bubbleMenu.strikethrough? | string | Tooltip for strikethrough button |
partial.bubbleMenu.subscript? | string | Tooltip for subscript button |
partial.bubbleMenu.superscript? | string | Tooltip for superscript button |
partial.bubbleMenu.underline? | string | Tooltip for underline button |
partial.codeBlock? | { copied?: string; copyCode?: string; hideLineNumbers?: string; languagePlaceholder?: string; showLineNumbers?: string; } | Code block UI |
partial.codeBlock.copied? | string | - |
partial.codeBlock.copyCode? | string | - |
partial.codeBlock.hideLineNumbers? | string | - |
partial.codeBlock.languagePlaceholder? | string | - |
partial.codeBlock.showLineNumbers? | string | - |
partial.colorPicker? | { apply?: string; applyAriaLabel?: string; hexPlaceholder?: string; highlight?: string; highlightPalette?: string; recent?: string; textColor?: string; textColorPalette?: string; } | Color picker labels used in bubble menu and standalone color picker |
partial.colorPicker.apply? | string | Apply button title |
partial.colorPicker.applyAriaLabel? | string | Apply button aria label |
partial.colorPicker.hexPlaceholder? | string | Hex input placeholder |
partial.colorPicker.highlight? | string | Title for highlight button |
partial.colorPicker.highlightPalette? | string | Aria label for highlight palette |
partial.colorPicker.recent? | string | "Recent" colors section label |
partial.colorPicker.textColor? | string | Title for text color button |
partial.colorPicker.textColorPalette? | string | Aria label for text color palette |
partial.commands? | { block?: { demote?: { description?: string; title?: string; }; duplicate?: { description?: string; title?: string; }; mergePrevious?: { description?: string; title?: string; }; moveDown?: { description?: string; title?: string; }; moveUp?: { description?: string; title?: string; }; promote?: { description?: string; title?: string; }; split?: { description?: string; title?: string; }; }; } | Strings for the block operation VizelCommand registry. Each entry carries a title (used by the block menu and slash menu) and a description (used by the slash menu's secondary line). |
partial.commands.block? | { demote?: { description?: string; title?: string; }; duplicate?: { description?: string; title?: string; }; mergePrevious?: { description?: string; title?: string; }; moveDown?: { description?: string; title?: string; }; moveUp?: { description?: string; title?: string; }; promote?: { description?: string; title?: string; }; split?: { description?: string; title?: string; }; } | - |
partial.commands.block.demote? | { description?: string; title?: string; } | - |
partial.commands.block.demote.description? | string | - |
partial.commands.block.demote.title? | string | - |
partial.commands.block.duplicate? | { description?: string; title?: string; } | - |
partial.commands.block.duplicate.description? | string | - |
partial.commands.block.duplicate.title? | string | - |
partial.commands.block.mergePrevious? | { description?: string; title?: string; } | - |
partial.commands.block.mergePrevious.description? | string | - |
partial.commands.block.mergePrevious.title? | string | - |
partial.commands.block.moveDown? | { description?: string; title?: string; } | - |
partial.commands.block.moveDown.description? | string | - |
partial.commands.block.moveDown.title? | string | - |
partial.commands.block.moveUp? | { description?: string; title?: string; } | - |
partial.commands.block.moveUp.description? | string | - |
partial.commands.block.moveUp.title? | string | - |
partial.commands.block.promote? | { description?: string; title?: string; } | - |
partial.commands.block.promote.description? | string | - |
partial.commands.block.promote.title? | string | - |
partial.commands.block.split? | { description?: string; title?: string; } | - |
partial.commands.block.split.description? | string | - |
partial.commands.block.split.title? | string | - |
partial.dragHandle? | { ariaLabel?: string; } | Drag handle |
partial.dragHandle.ariaLabel? | string | - |
partial.findReplace? | { caseSensitive?: string; closeAriaLabel?: string; closeTitle?: string; findNextAriaLabel?: string; findNextTitle?: string; findPlaceholder?: string; findPreviousAriaLabel?: string; findPreviousTitle?: string; findTextAriaLabel?: string; label?: string; noResults?: string; replaceAllAriaLabel?: string; replaceAllTitle?: string; replaceAriaLabel?: string; replacePlaceholder?: string; replaceTextAriaLabel?: string; replaceTitle?: string; } | Find and replace panel |
partial.findReplace.caseSensitive? | string | - |
partial.findReplace.closeAriaLabel? | string | - |
partial.findReplace.closeTitle? | string | - |
partial.findReplace.findNextAriaLabel? | string | - |
partial.findReplace.findNextTitle? | string | - |
partial.findReplace.findPlaceholder? | string | - |
partial.findReplace.findPreviousAriaLabel? | string | - |
partial.findReplace.findPreviousTitle? | string | - |
partial.findReplace.findTextAriaLabel? | string | - |
partial.findReplace.label? | string | Panel aria-label |
partial.findReplace.noResults? | string | - |
partial.findReplace.replaceAllAriaLabel? | string | - |
partial.findReplace.replaceAllTitle? | string | - |
partial.findReplace.replaceAriaLabel? | string | - |
partial.findReplace.replacePlaceholder? | string | - |
partial.findReplace.replaceTextAriaLabel? | string | - |
partial.findReplace.replaceTitle? | string | - |
partial.linkEditor? | { apply?: string; applyAriaLabel?: string; embedAsRichContent?: string; openInNewTab?: string; removeLink?: string; removeLinkAriaLabel?: string; urlPlaceholder?: string; visit?: string; visitTitle?: string; } | Link editor popup labels |
partial.linkEditor.apply? | string | Apply link button title |
partial.linkEditor.applyAriaLabel? | string | Apply link button aria label |
partial.linkEditor.embedAsRichContent? | string | Embed toggle label |
partial.linkEditor.openInNewTab? | string | Open in new tab label |
partial.linkEditor.removeLink? | string | Remove link button title |
partial.linkEditor.removeLinkAriaLabel? | string | Remove link button aria label |
partial.linkEditor.urlPlaceholder? | string | URL input placeholder |
partial.linkEditor.visit? | string | Visit link label |
partial.linkEditor.visitTitle? | string | Visit link tooltip |
partial.mentionMenu? | { ariaLabel?: string; noResults?: string; } | Mention autocomplete menu |
partial.mentionMenu.ariaLabel? | string | Menu container aria-label |
partial.mentionMenu.noResults? | string | Message shown when no mention candidates match the query |
partial.nodeSelector? | { blockTypes?: string; changeBlockType?: string; currentBlockType?: string; } | Node selector (block type dropdown) |
partial.nodeSelector.blockTypes? | string | Dropdown aria-label |
partial.nodeSelector.changeBlockType? | string | Trigger button title |
partial.nodeSelector.currentBlockType? | string | Template for trigger aria-label. Use {type} for the current type name. |
partial.nodeTypes? | { bulletList?: string; code?: string; heading1?: string; heading2?: string; heading3?: string; heading4?: string; heading5?: string; heading6?: string; numberedList?: string; quote?: string; taskList?: string; text?: string; } | Node type selector labels |
partial.nodeTypes.bulletList? | string | - |
partial.nodeTypes.code? | string | - |
partial.nodeTypes.heading1? | string | - |
partial.nodeTypes.heading2? | string | - |
partial.nodeTypes.heading3? | string | - |
partial.nodeTypes.heading4? | string | - |
partial.nodeTypes.heading5? | string | - |
partial.nodeTypes.heading6? | string | - |
partial.nodeTypes.numberedList? | string | - |
partial.nodeTypes.quote? | string | - |
partial.nodeTypes.taskList? | string | - |
partial.nodeTypes.text? | string | - |
partial.outline? | { ariaLabel?: string; } | Outline (document heading navigation) |
partial.outline.ariaLabel? | string | Aria label for the outline tree container |
partial.relativeTime? | { daysAgo?: string; hoursAgo?: string; justNow?: string; minutesAgo?: string; secondsAgo?: string; } | Relative time strings. Use {n} as placeholder for the numeric value. |
partial.relativeTime.daysAgo? | string | e.g. "{n}d ago" |
partial.relativeTime.hoursAgo? | string | e.g. "{n}h ago" |
partial.relativeTime.justNow? | string | - |
partial.relativeTime.minutesAgo? | string | e.g. "{n}m ago" |
partial.relativeTime.secondsAgo? | string | e.g. "{n}s ago" |
partial.saveIndicator? | { error?: string; saved?: string; saving?: string; unsaved?: string; } | Save indicator |
partial.saveIndicator.error? | string | - |
partial.saveIndicator.saved? | string | - |
partial.saveIndicator.saving? | string | - |
partial.saveIndicator.unsaved? | string | - |
partial.slashMenu? | { enterEmbedUrl?: string; enterImageUrl?: string; enterUrl?: string; groups?: { [key: string]: string | undefined; advanced?: string; blocks?: string; lists?: string; media?: string; navigation?: string; text?: string; }; items?: { bulletList?: { description?: string; title?: string; }; callout?: { description?: string; title?: string; }; codeBlock?: { description?: string; title?: string; }; details?: { description?: string; title?: string; }; divider?: { description?: string; title?: string; }; embed?: { description?: string; title?: string; }; graphvizDiagram?: { description?: string; title?: string; }; heading1?: { description?: string; title?: string; }; heading2?: { description?: string; title?: string; }; heading3?: { description?: string; title?: string; }; heading4?: { description?: string; title?: string; }; heading5?: { description?: string; title?: string; }; heading6?: { description?: string; title?: string; }; image?: { description?: string; title?: string; }; inlineMath?: { description?: string; title?: string; }; mathEquation?: { description?: string; title?: string; }; mermaidDiagram?: { description?: string; title?: string; }; numberedList?: { description?: string; title?: string; }; quote?: { description?: string; title?: string; }; table?: { description?: string; title?: string; }; tableOfContents?: { description?: string; title?: string; }; taskList?: { description?: string; title?: string; }; uploadImage?: { description?: string; title?: string; }; }; noResults?: string; } | Slash command menu |
partial.slashMenu.enterEmbedUrl? | string | Prompt for embed URL input |
partial.slashMenu.enterImageUrl? | string | Prompt for image URL input |
partial.slashMenu.enterUrl? | string | Prompt for generic URL input |
partial.slashMenu.groups? | { [key: string]: string | undefined; advanced?: string; blocks?: string; lists?: string; media?: string; navigation?: string; text?: string; } | Group labels. The six built-in groups are required so the bundled commands always have a label. Additional string keys are accepted to label user-defined groups. |
partial.slashMenu.groups.advanced? | string | - |
partial.slashMenu.groups.blocks? | string | - |
partial.slashMenu.groups.lists? | string | - |
partial.slashMenu.groups.media? | string | - |
partial.slashMenu.groups.navigation? | string | - |
partial.slashMenu.groups.text? | string | - |
partial.slashMenu.items? | { bulletList?: { description?: string; title?: string; }; callout?: { description?: string; title?: string; }; codeBlock?: { description?: string; title?: string; }; details?: { description?: string; title?: string; }; divider?: { description?: string; title?: string; }; embed?: { description?: string; title?: string; }; graphvizDiagram?: { description?: string; title?: string; }; heading1?: { description?: string; title?: string; }; heading2?: { description?: string; title?: string; }; heading3?: { description?: string; title?: string; }; heading4?: { description?: string; title?: string; }; heading5?: { description?: string; title?: string; }; heading6?: { description?: string; title?: string; }; image?: { description?: string; title?: string; }; inlineMath?: { description?: string; title?: string; }; mathEquation?: { description?: string; title?: string; }; mermaidDiagram?: { description?: string; title?: string; }; numberedList?: { description?: string; title?: string; }; quote?: { description?: string; title?: string; }; table?: { description?: string; title?: string; }; tableOfContents?: { description?: string; title?: string; }; taskList?: { description?: string; title?: string; }; uploadImage?: { description?: string; title?: string; }; } | Item titles and descriptions |
partial.slashMenu.items.bulletList? | { description?: string; title?: string; } | - |
partial.slashMenu.items.bulletList.description? | string | - |
partial.slashMenu.items.bulletList.title? | string | - |
partial.slashMenu.items.callout? | { description?: string; title?: string; } | - |
partial.slashMenu.items.callout.description? | string | - |
partial.slashMenu.items.callout.title? | string | - |
partial.slashMenu.items.codeBlock? | { description?: string; title?: string; } | - |
partial.slashMenu.items.codeBlock.description? | string | - |
partial.slashMenu.items.codeBlock.title? | string | - |
partial.slashMenu.items.details? | { description?: string; title?: string; } | - |
partial.slashMenu.items.details.description? | string | - |
partial.slashMenu.items.details.title? | string | - |
partial.slashMenu.items.divider? | { description?: string; title?: string; } | - |
partial.slashMenu.items.divider.description? | string | - |
partial.slashMenu.items.divider.title? | string | - |
partial.slashMenu.items.embed? | { description?: string; title?: string; } | - |
partial.slashMenu.items.embed.description? | string | - |
partial.slashMenu.items.embed.title? | string | - |
partial.slashMenu.items.graphvizDiagram? | { description?: string; title?: string; } | - |
partial.slashMenu.items.graphvizDiagram.description? | string | - |
partial.slashMenu.items.graphvizDiagram.title? | string | - |
partial.slashMenu.items.heading1? | { description?: string; title?: string; } | - |
partial.slashMenu.items.heading1.description? | string | - |
partial.slashMenu.items.heading1.title? | string | - |
partial.slashMenu.items.heading2? | { description?: string; title?: string; } | - |
partial.slashMenu.items.heading2.description? | string | - |
partial.slashMenu.items.heading2.title? | string | - |
partial.slashMenu.items.heading3? | { description?: string; title?: string; } | - |
partial.slashMenu.items.heading3.description? | string | - |
partial.slashMenu.items.heading3.title? | string | - |
partial.slashMenu.items.heading4? | { description?: string; title?: string; } | - |
partial.slashMenu.items.heading4.description? | string | - |
partial.slashMenu.items.heading4.title? | string | - |
partial.slashMenu.items.heading5? | { description?: string; title?: string; } | - |
partial.slashMenu.items.heading5.description? | string | - |
partial.slashMenu.items.heading5.title? | string | - |
partial.slashMenu.items.heading6? | { description?: string; title?: string; } | - |
partial.slashMenu.items.heading6.description? | string | - |
partial.slashMenu.items.heading6.title? | string | - |
partial.slashMenu.items.image? | { description?: string; title?: string; } | - |
partial.slashMenu.items.image.description? | string | - |
partial.slashMenu.items.image.title? | string | - |
partial.slashMenu.items.inlineMath? | { description?: string; title?: string; } | - |
partial.slashMenu.items.inlineMath.description? | string | - |
partial.slashMenu.items.inlineMath.title? | string | - |
partial.slashMenu.items.mathEquation? | { description?: string; title?: string; } | - |
partial.slashMenu.items.mathEquation.description? | string | - |
partial.slashMenu.items.mathEquation.title? | string | - |
partial.slashMenu.items.mermaidDiagram? | { description?: string; title?: string; } | - |
partial.slashMenu.items.mermaidDiagram.description? | string | - |
partial.slashMenu.items.mermaidDiagram.title? | string | - |
partial.slashMenu.items.numberedList? | { description?: string; title?: string; } | - |
partial.slashMenu.items.numberedList.description? | string | - |
partial.slashMenu.items.numberedList.title? | string | - |
partial.slashMenu.items.quote? | { description?: string; title?: string; } | - |
partial.slashMenu.items.quote.description? | string | - |
partial.slashMenu.items.quote.title? | string | - |
partial.slashMenu.items.table? | { description?: string; title?: string; } | - |
partial.slashMenu.items.table.description? | string | - |
partial.slashMenu.items.table.title? | string | - |
partial.slashMenu.items.tableOfContents? | { description?: string; title?: string; } | - |
partial.slashMenu.items.tableOfContents.description? | string | - |
partial.slashMenu.items.tableOfContents.title? | string | - |
partial.slashMenu.items.taskList? | { description?: string; title?: string; } | - |
partial.slashMenu.items.taskList.description? | string | - |
partial.slashMenu.items.taskList.title? | string | - |
partial.slashMenu.items.uploadImage? | { description?: string; title?: string; } | - |
partial.slashMenu.items.uploadImage.description? | string | - |
partial.slashMenu.items.uploadImage.title? | string | - |
partial.slashMenu.noResults? | string | No results message |
partial.toolbar? | { ariaLabel?: string; bold?: string; bulletList?: string; code?: string; codeBlock?: string; heading1?: string; heading2?: string; heading3?: string; horizontalRule?: string; italic?: string; moreActions?: string; numberedList?: string; quote?: string; redo?: string; strikethrough?: string; taskList?: string; underline?: string; undo?: string; } | Toolbar button labels |
partial.toolbar.ariaLabel? | string | Aria label for the toolbar container |
partial.toolbar.bold? | string | - |
partial.toolbar.bulletList? | string | - |
partial.toolbar.code? | string | - |
partial.toolbar.codeBlock? | string | - |
partial.toolbar.heading1? | string | - |
partial.toolbar.heading2? | string | - |
partial.toolbar.heading3? | string | - |
partial.toolbar.horizontalRule? | string | - |
partial.toolbar.italic? | string | - |
partial.toolbar.moreActions? | string | - |
partial.toolbar.numberedList? | string | - |
partial.toolbar.quote? | string | - |
partial.toolbar.redo? | string | - |
partial.toolbar.strikethrough? | string | - |
partial.toolbar.taskList? | string | - |
partial.toolbar.underline? | string | - |
partial.toolbar.undo? | string | - |
Returns
Example
typescript
const jaLocale = createVizelLocale({
toolbar: { undo: "元に戻す", redo: "やり直し" },
slashMenu: { groups: { text: "テキスト" } }, // override only one group name
});