尝试使用 jQuery 更改语言
Trying to Change Language with jQuery
我正在关注 this tutorial,其中概述了使用 jQuery 使网站多语言的简单方法。首先,我非常精通 HTML/CSS 和 PHP/MySQL,但是我才刚刚开始使用 JavaScript。
我花了一些时间在网上搜索,但找不到我的代码有问题。这是我的。
我的 HTML 代码如下所示:
<h5 class="info-text">Be notified when we launch.</h5>
根据教程,我的 XML 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<translations>
<translation id="info-text">
<english>Be notified when we launch</english>
<spanish>notificar cuando tu lanza</spanish>
</translation>
</translations>
(对不起,我的西班牙语不是很好。但这仅用于测试目的)。
我的 jQuery 脚本如下所示:
<script type="text/javascript" language="javascript">
$(function() {
var language = 'english';
$.ajax({
url: 'includes/languages.xml',
success: function(xml) {
$(xml).find('translation').each(function(){
var id = $(this).attr('id');
var text = $(this).find(language).text();
$("." + id).html(text);
});
}
});
});
</script>
我确实在 header 中包含了 jQuery 文件,如下所示:
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.2.3.min.js"></script>
不确定我做错了什么。任何帮助将非常感激。谢谢。
你的select或者是错误的$("." + id).html(text);
改成$("#" + id).html(text);
好吧,我写那个的时候一定很累。您显然是针对 class 而不是那里的 ID。很抱歉浪费了时间。
现在解决手头的问题。
让我们假设您的 标记 是(源自您的)
<h5 class="info-text">put stuff here.</h5>
<h5 class="charlie">charlie.</h5>
<h5 id="walt">walt.</h5>
而我们的 XML 是(也在您的表格中,但更多):
<?xml version="1.0" encoding="UTF-8"?>
<translations>
<translation id="info-text">
<english>Be notified when we launch</english>
<spanish>notificar cuando tu lanza</spanish>
</translation>
<translation id="walt">
<english>Be notified when we launch for walt</english>
<spanish>notificar cuando tu lanza for walt</spanish>
</translation>
<translation id="charlie">
<english>Be notified when we launch for charlie</english>
<spanish>notificar cuando tu lanza for charlie</spanish>
</translation>
</translations>
然后我们必须解决 XML 和 通过 ajax.
检索的问题
为了声明手头的任务,我们希望根据一种语言替换页面上元素的文本(参见上面的标记),这些文本与我们传入的 XML 指向的元素相匹配(来自 ajax) 通过指向页面元素的属性。
这样看来您的代码非常接近,但 ajax 中的 XML 可能有问题。它必须是 XML 而不是文本(字符串)类型,以便像您所做的那样使用 jQuery select 它。很简单,让我们的 ajax 像 XML 一样拉。 jQuery 的早期版本将 XML 作为 ajax 的默认值,但我们不要相信它并通过添加 dataType: "xml",
[=21 来强制它成为 XML =]
$(function() {
var language = 'english';
$.ajax({
url: 'includes/languages.xml',
dataType: "xml"
}).done(function(xml) {
$(xml).find('translation').each(function(){
var id = $(this).attr('id');
var text = $(this).find(language).text();
$("." + id).html(text);
});
});
});
现在应该可以具体解决您的问题了。
自定义只是因为我很感兴趣,但是一个有用的练习
这对您的使用来说可能有点矫枉过正,但仍然很有趣
注意假设 "xmlDoc" 包含来自 ajax 或其他的 xml 文档。
然而,通过一些细微的更改,我们可以针对不同类型的元素(通过 class、id 等)。
HTML 自定义:
<div id="container">
<h5 id="info-text">put stuff here.</h5>
<h5 class="charlie">charlie.</h5>
<h5 mycustom="bill">bill.</h5>
<h5 class="bill">bill.</h5>
<h5 id="walt">walt.</h5>
<h5 id="walter">walter custom.</h5>
</div>
自定义xml:
<?xml version="1.0" encoding="UTF-8"?>
<translations>
<translation id="info-text">
<english>Be notified when we launch</english>
<spanish>notificar cuando tu lanza</spanish>
</translation>
<translation id="walt" custom="[id=walter]">
<english>Be notified when we launch for walt</english>
<spanish>notificar cuando tu lanza for walt</spanish>
</translation>
<translation id="charlieidthing" class="charlie">
<english>Be notified when we launch for charlie</english>
<spanish>notificar cuando tu lanza for charlie</spanish>
</translation>
<translation customAttribute="mycustom,bill" targetclass="bill">
<english>Be notified when we launch for bill</english>
<spanish>notificar cuando tu lanza for bill</spanish>
</translation>
</translations>
这里是 自定义代码 来处理所有这些:
var language = "spanish";
function decodeSelector(encoded) {
var elem = document.createElement('textarea');
elem.innerHTML = encoded;
var decoded = elem.value;
return decoded;
}
function getSelector(attr) {
var xType = attr.localName;
var xSelect = attr.nodeValue;
// here we match the custom attributes in the markup/enhance as needed
switch (xType) {
// class either in class or targetclass attributes
case "class":
case "targetclass":
xSelect = "." + xSelect;
break;
// id in id or targetid attributes
case "id":
case "targetid":
xSelect = "#" + xSelect;
break;
// some custom attribute with a name,value content pair
// example in XML: customAttribute="mycustom,bill"
case "customAttribute":
var s = xSelect.split(",");
xSelect = "[" + s[0] + "='" + decodeSelector(s[1]) + "']";
break;
// some encoded selector (any jQuery selector)
case "custom":
xSelect = decodeSelector(xSelect);
break;
// used to ignore other attributes
default:
xSelect = "";
break;
}
return xSelect;
}
function setTarget(targetPick, languageText) {
var attrs = targetPick.attributes;
for (var j = 0; j < attrs.length; j++) {
var xSelect = getSelector(attrs[j]);
if (xSelect) {
var target = $(xSelect);
// target.css('background-color', 'pink'); you can do this also
target.text(languageText);
}
}
}
现在处理它(这在文档中已准备就绪,但 应该在您的 ajax 中完成 ):
$(function() {
$(xmlDoc).find('translation').each(function() {
var targetTranslation = $(this).find(language);
var text = targetTranslation.text();
setTarget(this, text);
});
});
这是自定义的 fiddle(注意我使用了 XML 字符串并解析了它)
https://jsfiddle.net/MarkSchultheiss/z8qbsku4/
我正在关注 this tutorial,其中概述了使用 jQuery 使网站多语言的简单方法。首先,我非常精通 HTML/CSS 和 PHP/MySQL,但是我才刚刚开始使用 JavaScript。
我花了一些时间在网上搜索,但找不到我的代码有问题。这是我的。
我的 HTML 代码如下所示:
<h5 class="info-text">Be notified when we launch.</h5>
根据教程,我的 XML 看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<translations>
<translation id="info-text">
<english>Be notified when we launch</english>
<spanish>notificar cuando tu lanza</spanish>
</translation>
</translations>
(对不起,我的西班牙语不是很好。但这仅用于测试目的)。
我的 jQuery 脚本如下所示:
<script type="text/javascript" language="javascript">
$(function() {
var language = 'english';
$.ajax({
url: 'includes/languages.xml',
success: function(xml) {
$(xml).find('translation').each(function(){
var id = $(this).attr('id');
var text = $(this).find(language).text();
$("." + id).html(text);
});
}
});
});
</script>
我确实在 header 中包含了 jQuery 文件,如下所示:
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-2.2.3.min.js"></script>
不确定我做错了什么。任何帮助将非常感激。谢谢。
你的select或者是错误的$("." + id).html(text);
改成$("#" + id).html(text);
好吧,我写那个的时候一定很累。您显然是针对 class 而不是那里的 ID。很抱歉浪费了时间。
现在解决手头的问题。
让我们假设您的 标记 是(源自您的)
<h5 class="info-text">put stuff here.</h5>
<h5 class="charlie">charlie.</h5>
<h5 id="walt">walt.</h5>
而我们的 XML 是(也在您的表格中,但更多):
<?xml version="1.0" encoding="UTF-8"?>
<translations>
<translation id="info-text">
<english>Be notified when we launch</english>
<spanish>notificar cuando tu lanza</spanish>
</translation>
<translation id="walt">
<english>Be notified when we launch for walt</english>
<spanish>notificar cuando tu lanza for walt</spanish>
</translation>
<translation id="charlie">
<english>Be notified when we launch for charlie</english>
<spanish>notificar cuando tu lanza for charlie</spanish>
</translation>
</translations>
然后我们必须解决 XML 和 通过 ajax.
检索的问题为了声明手头的任务,我们希望根据一种语言替换页面上元素的文本(参见上面的标记),这些文本与我们传入的 XML 指向的元素相匹配(来自 ajax) 通过指向页面元素的属性。
这样看来您的代码非常接近,但 ajax 中的 XML 可能有问题。它必须是 XML 而不是文本(字符串)类型,以便像您所做的那样使用 jQuery select 它。很简单,让我们的 ajax 像 XML 一样拉。 jQuery 的早期版本将 XML 作为 ajax 的默认值,但我们不要相信它并通过添加 dataType: "xml",
[=21 来强制它成为 XML =]
$(function() {
var language = 'english';
$.ajax({
url: 'includes/languages.xml',
dataType: "xml"
}).done(function(xml) {
$(xml).find('translation').each(function(){
var id = $(this).attr('id');
var text = $(this).find(language).text();
$("." + id).html(text);
});
});
});
现在应该可以具体解决您的问题了。
自定义只是因为我很感兴趣,但是一个有用的练习
这对您的使用来说可能有点矫枉过正,但仍然很有趣
注意假设 "xmlDoc" 包含来自 ajax 或其他的 xml 文档。
然而,通过一些细微的更改,我们可以针对不同类型的元素(通过 class、id 等)。
HTML 自定义:
<div id="container">
<h5 id="info-text">put stuff here.</h5>
<h5 class="charlie">charlie.</h5>
<h5 mycustom="bill">bill.</h5>
<h5 class="bill">bill.</h5>
<h5 id="walt">walt.</h5>
<h5 id="walter">walter custom.</h5>
</div>
自定义xml:
<?xml version="1.0" encoding="UTF-8"?>
<translations>
<translation id="info-text">
<english>Be notified when we launch</english>
<spanish>notificar cuando tu lanza</spanish>
</translation>
<translation id="walt" custom="[id=walter]">
<english>Be notified when we launch for walt</english>
<spanish>notificar cuando tu lanza for walt</spanish>
</translation>
<translation id="charlieidthing" class="charlie">
<english>Be notified when we launch for charlie</english>
<spanish>notificar cuando tu lanza for charlie</spanish>
</translation>
<translation customAttribute="mycustom,bill" targetclass="bill">
<english>Be notified when we launch for bill</english>
<spanish>notificar cuando tu lanza for bill</spanish>
</translation>
</translations>
这里是 自定义代码 来处理所有这些:
var language = "spanish";
function decodeSelector(encoded) {
var elem = document.createElement('textarea');
elem.innerHTML = encoded;
var decoded = elem.value;
return decoded;
}
function getSelector(attr) {
var xType = attr.localName;
var xSelect = attr.nodeValue;
// here we match the custom attributes in the markup/enhance as needed
switch (xType) {
// class either in class or targetclass attributes
case "class":
case "targetclass":
xSelect = "." + xSelect;
break;
// id in id or targetid attributes
case "id":
case "targetid":
xSelect = "#" + xSelect;
break;
// some custom attribute with a name,value content pair
// example in XML: customAttribute="mycustom,bill"
case "customAttribute":
var s = xSelect.split(",");
xSelect = "[" + s[0] + "='" + decodeSelector(s[1]) + "']";
break;
// some encoded selector (any jQuery selector)
case "custom":
xSelect = decodeSelector(xSelect);
break;
// used to ignore other attributes
default:
xSelect = "";
break;
}
return xSelect;
}
function setTarget(targetPick, languageText) {
var attrs = targetPick.attributes;
for (var j = 0; j < attrs.length; j++) {
var xSelect = getSelector(attrs[j]);
if (xSelect) {
var target = $(xSelect);
// target.css('background-color', 'pink'); you can do this also
target.text(languageText);
}
}
}
现在处理它(这在文档中已准备就绪,但 应该在您的 ajax 中完成 ):
$(function() {
$(xmlDoc).find('translation').each(function() {
var targetTranslation = $(this).find(language);
var text = targetTranslation.text();
setTarget(this, text);
});
});
这是自定义的 fiddle(注意我使用了 XML 字符串并解析了它) https://jsfiddle.net/MarkSchultheiss/z8qbsku4/