Skip to content
| Marketplace
Sign in
Visual Studio Code>Programming Languages>AL Translation CenterNew to Visual Studio Code? Get it now.
AL Translation Center

AL Translation Center

Preview

Daniel

|
3,794 installs
| (5) | Free
Extension for manage translations and develop faster with AL Language Projects.
Installation
Launch VS Code Quick Open (Ctrl+P), paste the following command, and press enter.
Copied to clipboard
More Info

AL Translation Center

Version Downloads Installs

Translate your Business Central AL extensions where you write them: put each translation in the Comment property of the label, caption or tooltip, and AL Translation Center generates the XLIFF files, checks them while you type, and packages or publishes the app with them.

CustomerLbl: Label 'Customer %1', Comment = '%1 = Customer No., ESP="Cliente %1", DEU="Debitor %1"';

The idea comes from the AL Language Tools extension (thanks ClipDynamics!).

Contents

  • Requirements
  • Getting started
  • Writing translations in Comment properties
  • Commands
  • Working in the editor
  • Standard Business Central translations
  • Find the origin of a text
  • Coverage, CSV and AI
  • Import translations from XLIFF (beta)
  • AI agents (MCP)
  • Settings
  • Snippets
  • Known issues

Requirements

  • The AL Language extension for Microsoft Dynamics 365 Business Central.
  • Visual Studio Code 1.99 or higher (1.101 or higher for the AI agent tools).

Getting started

  1. Add the TranslationFile feature to app.json (or turn on enableAutoFillTranslationFile to let the extension add it):
    "features": [ "TranslationFile" ]
    
  2. Write the translations in the Comment property of your texts (see the next section).
  3. Build the project (AL: Package): the compiler writes Translations/<app>.g.xlf with your texts and comments.
  4. Run ATC: Generate Xliff translations from source: one XLIFF file per language is written in Translations.

Or do it all at once with ATC: Package with translation / ATC: Publish with translation, which build, translate and build again so the package already contains the translations.

The same steps are in VS Code's Welcome page (Help › Welcome, walkthrough Translate your AL app).

Writing translations in Comment properties

Each translation is a LANG="text" segment, separated by commas. LANG is the 3-letter Business Central language code:

Caption = 'Posting Date', Comment = 'ESP="Fecha registro", DEU="Buchungsdatum", FRA="Date comptabilisation"';
  • Placeholder descriptions (%1 = Customer No.) and free text can stay in the same Comment: only LANG="..." segments are translations.
  • Quotes: write a " inside a translation doubled (ESP="Pulse ""Aceptar"""), and an apostrophe as AL does ('').
  • Verbatim comments (Comment = @'...', runtime 15+) can span several lines.
  • Namespaces work the same, also with the TranslationsWithNamespaces feature in app.json (runtime 18+), which puts the namespace in the translation ids.
  • Locked texts (Locked = true) are never translated.
  • Commas inside a translation are fine: ESP="Nuevo, abierto".

The usual Business Central codes already go to their XLIFF language (ESP → es-ES, DEU → de-DE...): hover a Comment to see where each translation goes, and a code that isn't mapped is reported, with a quick fix to map it. With the customLanguageMapping setting you can add languages or change the XLIFF language of a code:

Custom language mapping

A code can also generate several languages, separated with | (e.g. "ESP": "es-ES|es-MX"):

One code, several languages

Commands

All commands are in the Command Palette under the ATC category.

Translate and package

Command What it does
Generate Xliff translations from source Writes the XLIFF file of each language from the Comment properties of the last build. If a Comment has a blocking issue, nothing is written and the issues are listed in the Problems panel.
Validate Translations The same checks, without writing anything.
Package with translation Builds, translates and builds again, so the .app contains the translations.
Publish with translation Same, and publishes the app (with or without debugging, see publishWithTranslationDefaultValue).

Review and complete

Command What it does
Show translation coverage Coverage per language and object, and the pending texts; choose one to open its line.
Fill missing translations from identical texts Proposes the translation already used for the same text in the project or in Business Central, for review.
Preview translations in the editor... Shows next to each caption, tooltip and label its translation in the chosen language, or that it has none. Run it again and choose Off to hide it.
Suggest missing translations with AI (current file) Asks a language model of VS Code (e.g. GitHub Copilot) for the missing translations of the file, for review.
Export translations to CSV (for translators) / Import translations from CSV A file for a translator or Excel, and back into the Comment properties.

Find and import

Command What it does
Find the origin of a text Which app, object and element declare a text seen in Business Central.
Search the Business Central terminology How Business Central translates a term, to insert it in a Comment or copy it.
Import translations from XLIFF into AL... Writes the translations of XLIFF files into the Comment properties.

Several are also in the context menus of .al, .xlf and app.json files and folders. When a command fails, Show Output has the details.

Working in the editor

These features only look at the .al files open in the editor, after a short pause in typing, so editing stays fast.

  • Live validation (liveValidation): every Comment is checked as you type, with the same rules as Translate and Validate: malformed translations, unknown or repeated languages, missing required languages, placeholders and option lists, MaxLength, spaces and ending punctuation, and the same text translated differently in the project (see Translation analysis).
  • Quick fixes (Ctrl+.):
    • add a missing language, close or add quotes, remove whitespace from a code, map an unknown code in customLanguageMapping;
    • use the translation the project (or Business Central) uses, or accept both when the difference is intended ("Open" as a verb and as an adjective: saved in acceptedTranslations);
    • turn the analyzer of an issue, or the whole translation analysis, off in the project.
  • Completion: inside a Comment, the project's language codes not used yet (start typing another code to see them all); inside a value (DEU="), the translations already used for that text, in the project and in Business Central.
  • Hover: each translation of a Comment, the language it generates and the MaxLength, beside Business Central's translation of the same text when its apps have one.

The translation memory, the coverage and the preview come from the XLIFF files of the last build: build the project to refresh them. Translations written by hand in an XLIFF count too, unless another tool marked them as pending (state="needs-translation" or "new").

Standard Business Central translations

The .app packages in your package cache (.alpackages, or the folders of al.packageCachePath) contain Microsoft's own translations — the Base Application in the language of your environment, the System Application in about 50 languages — and those of any other dependency. AL Translation Center uses them as a second translation memory (useStandardTranslations, on by default):

  • completion and Fill missing translations propose the standard translation (e.g. Nº cliente for "Customer No."), after your project's own;
  • hovering a Comment shows them beside your translations, with ✓ when yours is one of them;
  • ATC: Search the Business Central terminology finds a term in English or translated (e.g. "posting date" or "registro") and inserts or copies its translation;
  • the AI suggestions and the MCP coverage tool get them as reference;
  • with standardTerminologySeverity set to info or warning, a translation Business Central never uses for that text is flagged (e.g. "Posting Date" as "Fecha de contabilización" instead of "Fecha registro"), with a quick fix.

Each package is read only once, in the background, so editing stays fast; downloading new symbols refreshes it.

The packages downloaded from an environment hold only symbols, without translations: then there's no standard terminology, and the commands that use it say so. Copy the full apps (with their translations) to the package cache to have it.

Find the origin of a text

Is that button standard, or does it come from a customization? Run ATC: Find the origin of a text and type the text as you see it in Business Central, in any language:

You type You get
Registrar y enviar Base Application (Microsoft) — Page Sales Order › Action PostAndSend › Caption, and the other pages with that action
Customer 10000 has 5 entries. Your project's EntriesMsg (Customer %1 has %2 entries.)
  • It searches your project (also Comment translations not generated yet) and every app of the package cache (the latest version of each); texts with placeholders and parts of a text also match.
  • Pick a result to open its source: an app that is also a project of the workspace opens its own .al file; for another app your project depends on, it opens like any dependency, with go to definition; otherwise read-only, and the extension tells you what's missing in app.json or the symbols.
  • Apps that ship no source open from their symbols (declarations and captions, without code). To search another extension, copy its .app to the package cache.
  • The packages downloaded from an environment hold only symbols, without translations: in them only the English captions and tooltips are found. To search in other languages, use the full apps (with their translations).

Coverage, CSV and AI

  • Coverage: the status bar shows the least translated language of the current project (showCoverageInStatusBar); click it to open the coverage panel: a bar per language, a table of objects by language colored by how much is translated, and the pending texts of the language or object you choose. Above each object of an .al file, its coverage per language (showCoverageCodeLens); click it for its pending texts. Translate and Validate also end with the coverage.
  • CSV for translators:
    • Export: every text (or only the pending ones) with its object, source, MaxLength, the placeholders to keep and one column per language you choose (also a new one), with a suggestion column for the empty cells. Ready for Excel.
    • Import: writes the new or changed cells into the Comment properties, after checking them (placeholders, length, format, a sentence left in English); you choose whether to write all or only the correct ones.
  • AI suggestions: the texts of the current file and their existing translations are sent to the model you choose; the suggestions are listed for review, and those with different placeholders, over MaxLength or equal to the translation of another language are flagged and not preselected.

Import translations from XLIFF (beta)

The reverse workflow brings translated XLIFF values back into the Comment properties — useful when the translations were made in another tool:

ATC: Import translations from XLIFF into AL... asks what to import:

Choice What it does
This AL file (when an .al file is active) Imports every XLIFF of the project into that .al file.
Every AL file of the project (when an .xlf file is active) Imports that XLIFF into every .al file of its project.
Every AL file of the workspace Imports all the XLIFF files, each project from its own.

They're also in the context menu of .al and .xlf files and project folders.

  • Each XLIFF language goes to its usual Comment code (es-ES → ESP...); translationCleanerLanguageMapping (e.g. {"es-ES": "ESM"}) changes it.
  • translationCleanerMethod: when the Comment already has that language, keep it (add), replace it (replace) or ask (ask).
  • Ambiguous matches are skipped and reported. Save or commit your changes first: files are modified.

AI agents (MCP)

The extension registers an MCP server, so an AI agent such as GitHub Copilot Chat (agent mode) can work on the translations for you:

Tool What it does
al_translation_center_list_projects AL projects of the workspace.
al_translation_center_get_coverage Coverage per language, and the pending texts by pages, with their MaxLength, current Comment and standard translation; also for a language the project doesn't have yet (every text pending).
al_translation_center_set_label_translation Writes translations into the Comment of a text, or of up to 100 at once, by their XLIFF id.
al_translation_center_validate The issues by pages, the blocking ones first, with their file:line, and how many of each kind. Read-only.
al_translation_center_translate Generates the XLIFF files; on failure, the first issues with their file:line, and how many of each kind.
al_translation_center_package / _publish Package or publish with translations (the active project only).
al_translation_center_find_text_origin Which app, object and element declare a Business Central text.
al_translation_center_search_standard_terms How Business Central translates some terms, to keep its terminology.
al_translation_center_read_translation_file Reads a generated XLIFF file.
al_translation_center_get_config / _get_output Settings of a project; recent output of the extension.

You can ask things like "translate everything that is missing in German and fix the issues" or "where does the Post and Send button come from?". Projects are restricted to the open workspace.

Settings

All settings are under alTranslationCenter.general (except alTranslationCenter.acceptedTranslations) and can be set per project. In the Settings editor they are grouped as below.

Translation files

Setting Default Description
enableAutoFillTranslationFile false Add TranslationFile to app.json when missing.
customLanguageMapping {} Adds languages or changes the XLIFF language of a code.
throwErrorIfCommentLanguageNotMapped Skip all What to do with codes that aren't mapped.
checkForWhitespacesInLanguageAbbreviations true Reports ESP ="...".
regexForComment \D\D\D=(?:") Pattern a translation must not match.
updateXliffTranslationFilesIfExists false Merge into existing XLIFF files (keeps translations made by hand) instead of rewriting them.
translationFileNaming auto Name of each language file: auto follows the project's files, <app>.<language>.xlf when it has none; .g.xlf or .xlf always that one, renaming the files to it on the next Translate (.g.xlf is often excluded by a *.g.xlf in .gitignore). Replaces useOldNamingForTranslations, still followed while this one isn't set.
publishWithTranslationDefaultValue Ask Debugging mode of Publish with translation.

Translation analysis

Each analyzer's level is disabled, info (blue, for what's worth a look rather than a fix), warning or error (stops Translate until the Comment is fixed).

Setting Default Description
enableTranslationAnalysis true Runs the analyzers below, like al.enableCodeAnalysis.
requiredLanguages / requiredLanguagesSeverity [] / warning Languages every Comment must have.
placeholderMismatchSeverity warning Placeholders dropped or added.
optionCountMismatchSeverity warning An option list (OptionCaption) translated with another number of options.
maxLengthExceededSeverity warning Translations longer than MaxLength.
formatMismatchSeverity info Leading/trailing spaces and ending punctuation.
inconsistentTranslationSeverity info The same text translated differently in the project (where it doesn't follow the most used translation, or everywhere on a tie).
standardTerminologySeverity disabled Translations Business Central never uses for that text (while editing; needs useStandardTranslations).
acceptedTranslations {} Translations of a text that are all correct, never reported as inconsistent with each other: { "Open": { "ESP": ["Abrir", "Abierto"] } }. Added by the quick fix.

With enableTranslationAnalysis off, only the errors of the Comment itself (quotes, unmapped or repeated languages...) are reported.

Editor and translation memory

Setting Default Description
liveValidation true Check the open .al files while typing.
showCoverageInStatusBar true Coverage in the status bar.
showCoverageCodeLens true Coverage above each object of an .al file.
coverageView default panel (as a list if VS Code can't load it), list, or default: the extension's choice, now the panel.
useStandardTranslations true Use the translations of the .app packages (completion, filling, and the comparison of standardTerminologySeverity).

Import from XLIFF (beta)

Setting Default Description
translationCleanerLanguageMapping / translationCleanerMethod {} / add Which XLIFF language goes to which Comment code (the usual codes when empty), and how existing translations are treated.

Snippets

Snippet Inserts
tcaptionWithTranslation, ttoolTipWithTranslation, tlabelWithTranslation, toptionCaptionWithTranslation A caption, tooltip, label or option caption with its Comment
tactionWithTranslation, tprofileWithTranslation, tprofileDescriptionWithTranslation An action or profile with translated captions
taboutTitleWithTranslation, taboutTextWithTranslation, tadditionalSearchTermsWithTranslation Teaching tips and search terms
tcommentWithTranslation A Comment with translations
tlockedTrue, tlockedLabel, tlockedCaption Texts that must not be translated

For snippets in your own languages, use AL Translation Snippets Download AL Translation Snippets.

Known issues

  • Package with translation and Publish with translation need AL Language v4.0.182565 or higher.
  • Report issues at https://github.com/DanielNT/ALTranslationCenter/issues.
  • Contact us
  • Jobs
  • Privacy
  • Manage cookies
  • Terms of use
  • Trademarks
  • Your Privacy Choices
  • Consumer Health Privacy
© 2026 Microsoft