HTML页面多语言切换

部门有个Web UI产品,里面有项功能是语言切换。之前同事的做法是把每个页面都做另做一份,语言切换时改变URL即可。简单的页面还好,如果遇到更多语言和复杂页面难免会增加维护难度。后来另一个同事用jQuery+AJAX+json+cookie的方式加以改进,我学习了一下代码,做了个自己的版本。

首先,页面不需要复制多个语言版本了,我们为每个需要翻译的文本标签加上一个自定义的lang属性,如<div lang>login</div>、<input type=”button” value=”apply” lang>,不用为它赋值。一个HTML页面示例如下:
<!doctype html>
<head>
<meta charset="utf-8">
<title>translation test</title>
<script src="js/jquery.js"></script>
<script src="js/script.js"></script>
</head>

<body>
	<div>
		<a href="#" id="enBtn">English</a>
		<a href="#" id="zhBtn">简体中文</a>
	</div>
	<div><a lang>click here:</a></div>
	<div><input type="button" value="apply" lang id="applyBtn"></div>
</body>

</html>

假如要实现英文和中文两种版本,可以在网页文件的同级目录下分别添加一个en.json和zh.json文件:

en.json

{
	"click here:" : "Please click here:",
	"apply" : "Apply!",
	"a translation test!" : "A Translation test!!"
}
zh.json

{
	"click here:" : "点击这里",
	"apply" : "应用",
	"a translation test!" : "翻译示例!"
}

接着,为这个页面添加以下js脚本:

var dict = {};

$(function() {
	registerWords();
	setLanguage("en");
	
	$("#enBtn").bind("click", function() {
		setLanguage("en");
	});
	
	$("#zhBtn").bind("click", function() {
		setLanguage("zh");
	});
	
	$("#applyBtn").bind("click", function() {
		alert(__tr("a translation test!"));
	});
});

function setLanguage(lang) {
	setCookie("lang=" + lang + "; path=/;");
	translate();
}

function getCookieVal(name) {
	var items = document.cookie.split(";");
	for (var i in items) {
		var cookie = $.trim(items[i]);
		var eqIdx = cookie.indexOf("=");
		var key = cookie.substring(0, eqIdx);
		if (name == $.trim(key)) {
			return $.trim(cookie.substring(eqIdx+1));
		}
	}
	return null;
}

function setCookie(cookie) {
	document.cookie = cookie;
}

function translate() {
	loadDict();
	
	$("[lang]").each(function() {
		switch (this.tagName.toLowerCase()) {
			case "input":
				$(this).val( __tr($(this).attr("lang")) );
				break;
			default:
				$(this).text( __tr($(this).attr("lang")) );
		}
	});
}

function __tr(src) {
	return (dict[src] || src);
}

function loadDict() {
	var lang = (getCookieVal("lang") || "en");

	$.ajax({
		async: false,
		type: "GET",
		url: lang + ".json",
		success: function(msg) {
			dict = eval("(" + msg + ")");
		}
	});
}

function registerWords() {
	$("[lang]").each(function() {
		switch (this.tagName.toLowerCase()) {
			case "input":
				$(this).attr("lang", $(this).val());
				break;
			default:
				$(this).attr("lang", $(this).text());
		}
	});
}

可以看到,js代码中的语言翻译用__tr()解决。若要动态切换语言,调用setLanguage()方法。

注意,页面加载完成后首先要统计翻译词条registerWords(),它会把每个待翻译标签里的文本记录到lang属性中,这个方法调用一次即可。

如果学过Qt,就会知道里面的语言包机制:每个词条可以指定一个context,这个单词一直被人蹩脚地翻译成“上下文”,我觉得这里解释为“名空间”更好,为解决一个单词或句子在不同地方产生不同翻译的问题。我还没有做到这一点,考虑到这种情况比较少见,并可加以避免,就偷个懒啦。

这就是我实现的思路,当然改进的地方还有不少,比如cookie的读写,语言包和页面文件的如何对应等等。在HTML上我只是个新手,就当抛块引玉了。
  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现语言切换可以通过以下步骤: 1. 在 HTML 中定义不同语言的文本内容,并为每个语言设置一个唯一的标识符。 2. 在 JavaScript 中编写代码来检测用户选择的语言,并根据其选择动态加载对应的语言文件。 3. 对于每种语言,可以创建不同的 CSS 文件,以便在用户切换到该语言时加载正确的样式。 4. 在 JavaScript 中编写代码来动态更改页面元素的语言和样式。 以下是一个简单的示例: HTML: ``` <div id="text">Hello World!</div> <button onclick="switchLanguage('en')">English</button> <button onclick="switchLanguage('fr')">French</button> ``` JavaScript: ``` function switchLanguage(lang) { // 根据语言代码动态加载对应的语言文件 var script = document.createElement('script'); script.src = lang + '.js'; document.head.appendChild(script); // 根据语言代码动态加载对应的 CSS 文件 var link = document.createElement('link'); link.href = lang + '.css'; link.rel = 'stylesheet'; document.head.appendChild(link); // 动态更改页面元素的语言和样式 var text = document.getElementById('text'); if (lang == 'en') { text.textContent = 'Hello World!'; text.className = 'english'; } else if (lang == 'fr') { text.textContent = 'Bonjour le monde!'; text.className = 'french'; } } ``` CSS: ``` .english { color: blue; } .french { color: red; } ``` 在这个示例中,我们通过调用 `switchLanguage` 函数来切换页面语言。该函数会动态加载对应的语言文件和 CSS 文件,并根据语言代码更改页面元素的语言和样式。在这个示例中,我们只使用了两种语言(英语和法语),但你可以根据需要添加更多的语言

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值