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
- Add the missing key to I18N_MAP with translations for each supported language.
- Fix typos in the data-i18n attribute or the i18n() call argument so it matches an existing key.
- Add a build-time/lint check that every data-i18n value exists in I18N_MAP.
- 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
- Keep data-i18n keys in sync with I18N_MAP; lint/CI-check every key referenced in markup.
- Centralize key constants instead of hand-typed strings.
- Add unit tests iterating all DOM data-i18n values against I18N_MAP.
- Review console warnings in dev builds to catch missing keys early.
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
- i18n: No such language "${lang}" in langDict ${langDict}
- Unknown trigger: ${trigger}
- throw new Error(resp)
AI-assisted analysis of jeessy2/ddns-go@5874c2e666 (2026-09-03).
Data as JSON: /api/errors/e6f668378463ebe4.
Report an issue: GitHub.