Как перевести ключ внутри другого перевода в ngx-translate - PullRequest
0 голосов
/ 20 марта 2020

У меня есть файл перевода JSON, и я хочу перевести другой перевод внутри значения другого перевода.

{
    "COMPANY_NAME": "Apple",
    "WELCOME_TEXT": "{{ COMPANY_NAME }} welcomes you to California!"
}

Я не вижу, как это сделать, используя ngx-translate in Angular 9, кто-нибудь может дать мне указатель?

1 Ответ

0 голосов
/ 20 марта 2020

Мне удалось добиться этого путем реализации пользовательского TranslateCompiler следующим образом:

Мой app.module.ts:

// ...
imports: [
  TranslateModule.forRoot({
    compiler: { provide: TranslateCompiler, useClass: CustomTranslationCompiler }
  })
]
/// ...

Мой CustomTranslationCompiler.ts:

import { TranslateCompiler } from '@ngx-translate/core';

export class CustomTranslationCompiler implements TranslateCompiler {
  /**
   * This function is needed to implement the interface, but doesn't
   * actually seem to be used anywhere
   *
   * @param value The translation value
   * @param lang The current language
   */
  public compile(value: string, lang: string): string | Function {
    return value;
  }

  /**
   * Look at every translation and pre-translate any nested translation keys within them
   *
   * @param translations All of the translations for the app to be compiled
   * @param lang The current language
   */
  public compileTranslations(translations: any, lang: string): any {
    for (const key in translations) {
      if (translations.hasOwnProperty(key)) {
        translations[key] = this.translateNestedTranslation(translations[key], translations);
      }
    }

    return translations;
  }

  /**
   * Use a regex to search for and replace translations inside translations
   * with their translated value
   *
   * @param value The translation value
   * @param translations All of the translations for the app
   */
  private translateNestedTranslation(value: string, translations: Object): string {
    const searchRegex  = /{{\s([A-Z_:]*)\s?}}/g;
    const replaceRegex = /({{\s?[A-Z_:]*\s?}})/g;

    const matches = searchRegex.exec(value);
    if (matches && matches.length > 0) {
      const searchKey = matches[1];

      if (translations.hasOwnProperty(searchKey)) {
        // Replace the full translate syntax with the translated value
        value = value.replace(replaceRegex, translations[searchKey]);
      } else {
        // If we can't find the value, display only the missing key instead of the full translate syntax
        value = value.replace(replaceRegex, searchKey);
        console.error(`Error: Unable to find translation '${searchKey}'!`)
      }
    }

    return value;
  }
}

Некоторые примечания:

  • При таком подходе любые параметры перевода, определенные в значениях перевода, должны быть в нижнем регистре, чтобы не совпадать с регулярным выражением поиска
  • Регулярные выражения поиска и замены различны
  • Я не уверен, почему метод compile() никогда не вызывается. Мои переводы поступают как объект, так что, может быть, поэтому ...
...