Lit-translate 显示代码或密钥而不是翻译

Lit-translate shows code or key instead of translation

我正在尝试使用 lit-translate 将我的“Elmish”打字稿网站翻译成不同的语言。我使用 webpack 和 dotnet。

在我的 index.ts 中,我注册了翻译配置:

registerTranslateConfig({
    lookup: (key, config) => config.strings != null ? config.strings[key] : key,
    empty: key => key,
    loader: lang => {
          return new Promise((resolve, reject) => {
            resolve({"title": "Der Titel"});
          })}   
    });

use("en");

(加载程序是硬编码的,因为获取本地化文件也不起作用,但现在这并不重要)。

在 html 中,我使用 get("title")translate("title") 来获取翻译。 我不是翻译,而是阅读 [title] 或 (part) => { partCache.set(part, cb); updatePart(part, cb); }

如果我将 translate() 的结果分配给一个变量,我在对象中得到以下结果:

TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them
    at Function.r (<anonymous>:1:83)
    at Module../src/index.ts (http://localhost:8080/app.bundle.js:9800:10)
    at __webpack_require__ (http://localhost:8080/app.bundle.js:12476:33)
    at http://localhost:8080/app.bundle.js:13494:11
    at http://localhost:8080/app.bundle.js:13497:12

我已经试过禁用 webpack 严格模式。

完整的 class 如下所示:

export class App extends Application<Model, Message, {}> {
  @property({type: Boolean})
  hasLoadedStrings = false;

    init(): [Model, Cmd] {
    const initModel: Model = {
      openPage: [{title: "Home"}, home]
    }

    return [initModel, Cmd.none]
  }

  constructor() {
    super();
    this.hasLoadedStrings = false;
  }

  shouldUpdate (changedProperties: Map<string | number | symbol, unknown>) {
    return this.hasLoadedStrings && super.shouldUpdate(changedProperties);
  }

  async connectedCallback () {
    super.connectedCallback();
 
    await use("en");
    this.hasLoadedStrings = true;
  }

}

customElements.define('my-element', App);

我通过编写自己的小翻译库解决了这个问题。 如果您按照文档中的建议使用 lit-translate 包,则会出现错误,因此请随意使用我的解决方案:

translate.ts:

const de_config = 
{
  "Category": {
    "Home": "Start",
  },
  "Home": {
    "Welcome back,": "Willkommen zurück,"
};

export function translate(key: string) {

    const keyParts = key.split(".");
    const keyCategory = keyParts.shift();
    const keyWord = keyParts.join('.');

    let translationIndexes = typedKeys(de_config);

    for(let translationIndex of translationIndexes)
    {
      if(translationIndex == keyCategory) {
        let translationKeys = typedKeys(de_config[translationIndex]);
        
        for(let translationKey of translationKeys) {
            if(translationKey == keyWord) {
              return de_config[translationIndex][translationKey];         
          }
        }
      }
    }
    return key;  
  }

function typedKeys<T>(o: T): (keyof T)[] {
    return Object.keys(o) as (keyof T)[];
  }

访问翻译:

import { translate } from './translate';
translate("Category.Home");

也可以将翻译对象存储在不同的文件中,编写动态更改语言的函数等...