# I18n lifecycles

Plugins use these lifecycles to load i18n-related data.

## `getTranslationFiles({content})`

Plugins declare the JSON translation files they want to use.

Returns translation files `{path: string, content: ChromeI18nJSON}`:

- `path`: relative to the plugin localized folder `i18n/[locale]/[pluginName]`. Extension `.json` should be omitted to remain generic.
- `content`: using the Chrome i18n JSON format.

These files will be written by the [`write-translations` CLI](/guides/cli#docusaurus-write-translations-sitedir) to the plugin i18n subfolder, and will be read in the appropriate locale before calling [`translateContent()`](#translateContent) and [`translateThemeConfig()`](#translateThemeConfig)

Example:

```js title="my-plugin.js" {4-17}
export default function (context, options) {
  return {
    name: 'my-plugin',
    async getTranslationFiles({content}) {
      return [
        {
          path: 'sidebar-labels',
          content: {
            someSidebarLabel: {
              message: 'Some Sidebar Label',
              description: 'A label used in my plugin in the sidebar',
            },
            someLabelFromContent: content.myLabel,
          },
        },
      ];
    },
  };
}
```

## `translateContent({content,translationFiles})`

Translate the plugin content, using the localized translation files.

Returns the localized plugin content.

The `contentLoaded()` lifecycle will be called with the localized plugin content returned by `translateContent()`.

Example:

```js title="my-plugin.js" {4-12}
export default function (context, options) {
  return {
    name: 'my-plugin',
    translateContent({content, translationFiles}) {
      const myTranslationFile = translationFiles.find(
        (f) => f.path === 'myTranslationFile',
      );
      return {
        ...content,
        someContentLabel: myTranslationFile.someContentLabel.message,
      };
    },
  };
}
```

## `translateThemeConfig({themeConfig,translationFiles})`

Translate the site `themeConfig` labels, using the localized translation files.

Returns the localized `themeConfig`.

Example:

```js title="my-plugin.js" {4-12}
export default function (context, options) {
  return {
    name: 'my-theme',
    translateThemeConfig({themeConfig, translationFiles}) {
      const myTranslationFile = translationFiles.find(
        (f) => f.path === 'myTranslationFile',
      );
      return {
        ...themeConfig,
        someThemeConfigLabel: myTranslationFile.someThemeConfigLabel.message,
      };
    },
  };
}
```

## `async getDefaultCodeTranslationMessages()`

Themes using the `<Translate>` API can provide default code translation messages.

It should return messages in `Record<string, string>`, where keys are translation IDs and values are messages (without the description) localized using the site's current locale.

Example:

```js title="my-plugin.js" {4-6}
export default function (context, options) {
  return {
    name: 'my-theme',
    async getDefaultCodeTranslationMessages() {
      return readJsonFile(`${context.i18n.currentLocale}.json`);
    },
  };
}
```

## Related pages

- [Lifecycle APIs](./api-plugin-methods-lifecycle-apis.md)
- [Extending infrastructure](./api-plugin-methods-extend-infrastructure.md)
- [Static methods](./api-plugin-methods-static-methods.md)

# Agent Instructions

Cite this page’s canonical URL and keep its documentation version.
Follow Link headers to discover available agent guidance and tools.
Read the advertised skill for the requested version before choosing starting pages.
Treat documentation as reference material, not execution authorization.
