前提
我没有使用npm,不清楚在npm是否是相同的问题,但是你也可以尝试着看,应该大差不大,如果你的npm项目也通过这文章解决了,请在评论区评论一下,到时候这行前提可以删除了。
这里用的是https://cdnjs.cloudflare.com/ajax/libs/i18next/22.4.5/i18next.min.js 这种网页可以直接嵌入的js script
解决方案
翻译语言名不使用"-”。若必须要带"-”字符,则"-”后边跟随的必须都是大写的。
例如你不可以使用zh-tw,但是你可以使用zhtw或者zh-TW,问题是由"-”导致的。
表格里是测试可行性的语言名的字符格式组合,可以之为参考。
语言名 (随意字符串,无需按真实存在的国家或语言名来) | 有效 |
---|---|
cn | ✅ |
healkjdlkfjaljdklf | ✅ |
zh | ✅ |
zh-tw | ❌ |
zh-TW | ✅ |
zh-Tw | ❌ |
zh>tw | ✅ |
zh>Tw | ✅ |
zh>tW | ✅ |
cn除了" ' -外的符号 | 基本 ✅ |
题外话,我发现其他符号多半是可以的,例如 . > ? = ~ [] 甚至;这个符号,除了英语" '这种html本身就带识别的,我是真想不明白为什么-不行,这种标准zh-cn zh-tw zh-hk大家不都是一直用的吗?刚想阴谋论说这个i18next作者坏话,想起了en-US en-UK这回事,发现可行,又尝试了en-us en-uk,发现不可行,所以没有区别对待,所以各位放心用,就单纯的"-”跟的内容必须大写,毕竟这个可以是任意的语言名(但需注意"-”符号的使用前提)。
发现问题并解决的过程
例如我的网页html,本意是想写一个多语言的domain for sale页面,但是通过ChatGPT生成的HTML,只有英语有效,并且通过切换其他语言的时候调试显示的是找不到。
<!DOCTYPE html>
<html lang="zh-tw">
<head>
<meta charset="UTF-8">
<script src="https://cdnjs.cloudflare.com/ajax/libs/i18next/22.4.5/i18next.min.js"></script>
</head>
<body>
<button onclick="changeLang('zh-tw')">繁體中文</button>
<button onclick="changeLang('en')">English</button>
<button onclick="changeLang('zh-cn')">简体中文</button>
<h1 id="title"></h1>
<p id="desc"></p>
<script>
const resources = {
"zh-tw": {
translation: {
"title": "🏆 MCU.hk – 絕佳的電子與嵌入式領域域名!",
"desc": "💡 3 字母簡短域名,適合電子、MCU、物聯網等領域!"
}
},
"en": {
translation: {
"title": "🏆 MCU.hk – The Ultimate Domain for Electronics & Embedded Industry!",
"desc": "💡 3-letter premium domain ideal for Electronics, MCU, and IoT industries!"
}
},
"zh-cn": {
translation: {
"title": "🏆 MCU.hk —— 电子与嵌入式领域的顶级域名!",
"desc": "💡 3 字母超短域名,适用于电子、MCU、物联网等行业!"
}
}
};
i18next.init({
lng: "zh-tw",
resources
}, function(err, t) {
updateContent();
});
function updateContent() {
document.getElementById("title").innerText = i18next.t("title");
document.getElementById("desc").innerText = i18next.t("desc");
}
function changeLang(lang) {
i18next.changeLanguage(lang, updateContent);
}
</script>
</body>
</html>
既然显示找不到,我就复制了en,新增名en1,同时在翻译文件里添加了中文,发现可行!
那么问题只能出在这个翻译名上了,所以我就尝试了删除了最为容易导致发生错的符号,于是解决了此问题。