jeessy2/ddns-go · warning

i18n: No translation for key "${key}"

Error message

i18n: No translation for key "${key}"

What it means

The i18n function in static/i18n.js looks up I18N_MAP[keyOrLangDict] when given a string key; if no dictionary is registered for that key (langDict falsy), it logs this console.warn and returns the key unchanged. convertDom relies on it, so an unknown data-i18n key leaves raw key text in the DOM.

Source

Thrown at static/i18n.js:292

  }
  for (const l of langs) {
    if (l.split('-')[0] === langValue.split('-')[0]) {
      return l;
    }
  }
  return 'en';
}

const i18n = (keyOrLangDict) => {
  let key = keyOrLangDict;
  let langDict = keyOrLangDict;
  if (typeof keyOrLangDict === 'string') {
    langDict = I18N_MAP[keyOrLangDict];
  } else {
    key = null;
  }
  if (!langDict) {
    console.warn(`i18n: No translation for key "${key}"`);
    return key;
  }
  const lang = getLocalLang(Object.keys(langDict));
  if (lang in langDict) {
    return langDict[lang];
  }
  console.warn(`i18n: No such language "${lang}" in langDict ${langDict}`);
  return key;
}

const convertDom = (dom = document) => {
  dom.querySelectorAll('[data-i18n]').forEach(el => {
    const key = el.dataset.i18n;
    el.textContent = i18n(key);
  });
  dom.querySelectorAll('[data-i18n-html]').forEach(el => {
    const key = el.dataset.i18nHtml;
    el.innerHTML = i18n(key);

View on GitHub (pinned to 5874c2e666)

Solutions

  1. Add the missing key to I18N_MAP with translations for each supported language.
  2. Fix typos in the data-i18n attribute or the i18n() call argument so it matches an existing key.
  3. Add a build-time/lint check that every data-i18n value exists in I18N_MAP.
  4. If intentional fallback is desired, keep the key-return behavior but route through a silent fallback for optional keys.

Example fix

// before
<span data-i18n="setting_title"></span>
// after — ensure the key exists
I18N_MAP.setting_title = { en: 'Settings', zh: '设置' };
<span data-i18n="setting_title"></span>
Defensive patterns

Strategy: validation

Validate before calling

// guard before translating
function hasTranslation(key) {
  return typeof key === 'string' && Object.prototype.hasOwnProperty.call(I18N_MAP, key);
}
const text = hasTranslation(key) ? i18n(key) : key;

Type guard

function isKnownI18nKey(key) {
  return typeof key === 'string' && Object.prototype.hasOwnProperty.call(I18N_MAP, key);
}

Prevention

When it happens

Trigger: Calling i18n('someKey') (or an element with data-i18n="someKey" processed by convertDom) where I18N_MAP has no entry for someKey.

Common situations: Typo in a data-i18n attribute; new UI key added before adding its translation entry to I18N_MAP; key renamed in one language file but not registered in the map; dynamic keys built from strings that don't exist.

Related errors


AI-assisted analysis of jeessy2/ddns-go@5874c2e666 (2026-09-03). Data as JSON: /api/errors/e6f668378463ebe4. Report an issue: GitHub.