Skip to content

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

ParameterTypeDescription
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?stringMenu 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?stringAria label for the bubble menu container
partial.bubbleMenu.bold?stringTooltip for bold button
partial.bubbleMenu.code?stringTooltip for code button
partial.bubbleMenu.italic?stringTooltip for italic button
partial.bubbleMenu.link?stringTooltip for link button
partial.bubbleMenu.strikethrough?stringTooltip for strikethrough button
partial.bubbleMenu.subscript?stringTooltip for subscript button
partial.bubbleMenu.superscript?stringTooltip for superscript button
partial.bubbleMenu.underline?stringTooltip 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?stringApply button title
partial.colorPicker.applyAriaLabel?stringApply button aria label
partial.colorPicker.hexPlaceholder?stringHex input placeholder
partial.colorPicker.highlight?stringTitle for highlight button
partial.colorPicker.highlightPalette?stringAria label for highlight palette
partial.colorPicker.recent?string"Recent" colors section label
partial.colorPicker.textColor?stringTitle for text color button
partial.colorPicker.textColorPalette?stringAria 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?stringPanel 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?stringApply link button title
partial.linkEditor.applyAriaLabel?stringApply link button aria label
partial.linkEditor.embedAsRichContent?stringEmbed toggle label
partial.linkEditor.openInNewTab?stringOpen in new tab label
partial.linkEditor.removeLink?stringRemove link button title
partial.linkEditor.removeLinkAriaLabel?stringRemove link button aria label
partial.linkEditor.urlPlaceholder?stringURL input placeholder
partial.linkEditor.visit?stringVisit link label
partial.linkEditor.visitTitle?stringVisit link tooltip
partial.mentionMenu?{ ariaLabel?: string; noResults?: string; }Mention autocomplete menu
partial.mentionMenu.ariaLabel?stringMenu container aria-label
partial.mentionMenu.noResults?stringMessage shown when no mention candidates match the query
partial.nodeSelector?{ blockTypes?: string; changeBlockType?: string; currentBlockType?: string; }Node selector (block type dropdown)
partial.nodeSelector.blockTypes?stringDropdown aria-label
partial.nodeSelector.changeBlockType?stringTrigger button title
partial.nodeSelector.currentBlockType?stringTemplate 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?stringAria 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?stringe.g. "{n}d ago"
partial.relativeTime.hoursAgo?stringe.g. "{n}h ago"
partial.relativeTime.justNow?string-
partial.relativeTime.minutesAgo?stringe.g. "{n}m ago"
partial.relativeTime.secondsAgo?stringe.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?stringPrompt for embed URL input
partial.slashMenu.enterImageUrl?stringPrompt for image URL input
partial.slashMenu.enterUrl?stringPrompt 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?stringNo 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?stringAria 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

VizelLocale

Example

typescript
const jaLocale = createVizelLocale({
  toolbar: { undo: "元に戻す", redo: "やり直し" },
  slashMenu: { groups: { text: "テキスト" } }, // override only one group name
});

Released under the MIT License.