我们正在创建我们的在线商店的国际版本,我的任务是解开所有javascript错误消息,因此它们以该网站上的相关语言显示。
我显然想做的是为所有网站保留相同的javascript集,但只是加载来自德语/法语/意大利语文本文件的一组错误消息。我认为这可能与单独的json文件有关,这些文件只包含一组纯文本错误消息。
有人能为这个问题提出最简单,最具扩展性的解决方案吗?感谢。
答案 0 :(得分:7)
您拥有的一个选项是创建Javascript语言文件,并在Javascript文件之前包含正确的文件。在服务器端,所选语言是已知的,因此可以轻松地包含正确的文件。在语言文件中,您可以定义可在代码中使用的变量。
类似的东西:
<script type="text/javascript" src="lang_en.js" />
<script type="text/javascript" src="yourjavascript.js" />
lang_en.js
可以是lang_de.js
或服务器决定的任何内容。
在语言文件中你有类似的东西(简化的,全局的东西,只是想表明这个想法):
var lang = {
ARE_YOU_SURE : 'Are you sure?',
...
};
在您的主要Javascript文件中,您可以执行以下操作:
alert(lang.ARE_YOU_SURE);
答案 1 :(得分:1)
我有点解决了我如何检索消息并传入我自己的变量的问题。这是我构建的一个简单测试页面的代码:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script type="text/javascript" src="http://media.topshop.com/javascript/wearwiths/lib/jquery/jquery.js"></script>
<script type="text/javascript" src="brand.js"></script>
<script type="text/javascript">
var msg, xVal = 2, yVal = 8, prodName = "Blue Skirt", msg_type = "information", lang = "eng";
$.ajax({
url: lang + '_messages.js',
dataType: 'script',
scriptCharset: 'utf-8',
success: function() {
console.log("The " + lang + " language file was loaded.");
msg = messages || {};
}
});
function translate(message, details) {
if(message.indexOf("{currency}") != -1) {
message = message.replace("{currency}", Arcadia.Brand.currency);
console.log(typeof Arcadia.Brand.currency);
}
if(message.indexOf("{val}") == -1) {
return message;
} else {
for (var i = 0; i < details.length; i++) {
message = message.replace("{val}", details[i]);
}
return message;
}
}
$(document).ready(function() {
var listItem, listIndex;
$('#item_list li a').click(function() {
listItem = $(this).parent();
listIndex = $('ul#item_list li').index(listItem);
toString(listIndex);
switch (msg_type) {
case "information":
$("p#error").text(translate(msg.information["mes_" + listIndex], [xVal, "14"]));
console.log(translate(msg.information["mes_" + listIndex], [xVal, "14"]));
break;
case "product_or_bundle":
$("p#error").text(translate(msg.product_or_bundle["mes_" + listIndex], [xVal, "14"]));
console.log(translate(msg.product_or_bundle["mes_" + listIndex], [xVal, "14"]));
break;
case "error":
$("p#error").text(translate(msg.error["mes_" + listIndex], [xVal, "14"]));
console.log(translate(msg.error["mes_" + listIndex], [xVal, "14"]));
break;
case "code":
$("p#error").text(translate(msg.code["mes_" + listIndex], [xVal, "14"]));
console.log(translate(msg.code["mes_" + listIndex], [xVal, "14"]));
break;
}
return false;
});
$('ul#message_select li a').click(function() {
msg_type = $(this).attr('href');
msg_type = msg_type.replace('#', "");
});
$('select#lang').change(function () {
lang = $(this).val();
$.ajax({
url: lang + '_messages.js',
contentType: "application/x-www-form-urlencoded; charset=utf-8",
dataType: 'script',
success: function() {
console.log("The " + lang + " language file was loaded.");
msg = messages || {};
}
});
});
});
</script>
<style type="text/css">
p {
background: green;
color: #fff;
}
p span {
background: darkblue;
}
em {
font-weight: bold;
font-style: normal;
color: yellow;
}
</style>
</head>
<body>
<h1>V7 site messaging test</h1>
<h2>Select message language</h2>
<form>
<select id="lang">
<option value="eng" title="Switch the language to English">English</option>
<option value="fra" title="Switch the language to French">French</option>
<option value="ger" title="Switch the language to German">German</option>
</select>
</form>
<h2>Select message type</h2>
<ul id="message_select">
<li><a href="#information" title="Information">Information</a></li>
<li><a href="#product_or_bundle" title="Product or Bundle">Product or Bundle</a></li>
<li><a href="#error" title="Error">Error</a></li>
<li><a href="#code" title="Code">Code</a></li>
</ul>
<h3>Message</h3>
<ul id="item_list">
<li><a href="#" title="list item 1">list item 1</a></li>
<li><a href="#">list item 2</a></li>
<li><a href="#">list item 3</a></li>
<li><a href="#">list item 4</a></li>
<li><a href="#">list item 5</a></li>
<li><a href="#">list item 6</a></li>
<li><a href="#">list item 7</a></li>
<li><a href="#">list item 8</a></li>
<li><a href="#">list item 9</a></li>
<li><a href="#">list item 10</a></li>
<li><a href="#">list item 11</a></li>
<li><a href="#">list item 12</a></li>
<li><a href="#">list item 13</a></li>
<li><a href="#">list item 14</a></li>
<li><a href="#">list item 15</a></li>
<li><a href="#">list item 16</a></li>
<li><a href="#">list item 17</a></li>
<li><a href="#">list item 18</a></li>
<li><a href="#">list item 19</a></li>
<li><a href="#">list item 20</a></li>
<li><a href="#">list item 21</a></li>
<li><a href="#">list item 22</a></li>
</ul>
<p id="error">Error Message will appear here</p>
</body>
</html>
我现在面临的问题是,法语和德语的外国语言字符都是胡说八道。这与字符集有关,但我在html和ajax调用中将字符集设置为utf-8,使用utf-8字符集指定js消息文件。任何想法如何克服这个?
为了完整起见,这里是英文版laguage消息,文件为eng_messages.js:
var messages = {
"information": {
"mes_0": "this link will open in a new browser window",
"mes_1": "This link will open in a new browser window",
"mes_2": "Rollover image from left to right to rotate",
"mes_3": "Loading tweets...",
"mes_4": "Latest Tweets",
"mes_5": "Click to view photo {val}",
"mes_6": "Click to view 360",
"mes_7": "Click to view video",
"mes_8": "Click to view photo",
"mes_9": "out of stock",
"mes_10": "low stock",
"mes_11": "click on a size below",
"mes_12": "Sorry, this item is out of stock.",
"mes_13": "Select Size: ",
"mes_14": "Please wait",
"mes_15": "Continue shopping",
"mes_16": "{val} item(s) added to bag",
"mes_17": "Size {val}",
"mes_18": "{val} item(s) in your bag Subtotal: {currency}{val}",
"mes_19": "s",
"mes_20": "item",
"mes_21": "You need to select a size before you can add this item to your bag."
},
"product_or_bundle": {
"mes_0": "Rollover image to zoom.",
"mes_1": "View large image",
"mes_2": "Photo {val} of prod name",
"mes_3": "Scroll up",
"mes_4": "Scroll down",
"mes_5": "View details of {val}",
"mes_6": "Remove this item",
"mes_7": "Remove",
"mes_8": "Scroll left",
"mes_9": "Scroll right",
"mes_10": "Check Availability In Store:",
"mes_11": "Outfit added to bag",
"mes_12": "Click to view full details of this item"
},
"error": {
"mes_0": "Sorry, an error occurred when trying to add your item. Please try again.",
"mes_1": "Sorry, an error occurred when trying to add your items. Please try again.",
"mes_2": "You need to select a size for each item before you can add the outfit to your bag."
},
"code": {
"mes_0": "[View your bag] [Go to checkout] continue shopping button",
"mes_1": "[View your bag] [Go to checkout]"
}
}
以下是名为ger_messages.js的文件中的德语消息:
var messages = {
"information": {
"mes_0": "Dieser Link wird in einem neuen Fenster öffnen",
"mes_1": "Dieser Link wird in einem neuen Browser-Fenster geöffnet",
"mes_2": "Rollover-Bild von links nach rechts zu drehen",
"mes_3": "Loading tweets...",
"mes_4": "Aktuelle Tweets",
"mes_5": "Klicken Sie auf ein Foto, Blick {val}",
"mes_6": "Klicken Sie auf 360 Ansicht",
"mes_7": "Klicken Sie, um Video anzusehen",
"mes_8": "Klicken Sie auf ein Foto, Blick",
"mes_9": "ausverkauft",
"mes_10": "Wenige Exemplare auf Lager",
"mes_11": "Klicken Sie auf eine Größe unterhalb",
"mes_12": "Leider ist der Artikel nicht auf Lager.",
"mes_13": "Wählen Sie Größe:",
"mes_14": "Bitte warten",
"mes_15": "Einkauf fortsetzen",
"mes_16": "{val} Artikel hinzugefügt Tasche",
"mes_17": "Größe {val}",
"mes_18": "{val} Artikel hinzugefügt Tasche Zwischensumme: £{val}",
"mes_19": "s",
"mes_20": "artikel",
"mes_21": "Sie müssen eine Größe auswählen, bevor Sie diesen Artikel in Ihre Tasche hinzufügen können."
},
"product_or_bundle": {
"mes_0": "Rollover-Bild zu vergrößern.",
"mes_1": "Bild vergrößern",
"mes_2": "Foto {val} von {val}",
"mes_3": "Blättern Sie nach oben",
"mes_4": "Blättern Sie nach unten",
"mes_5": "Detailansicht der {val}",
"mes_6": "Diesen Artikel entfernen",
"mes_7": "Entfernen",
"mes_8": "Blättern Sie nach links",
"mes_9": "Blättern Sie nach rechts",
"mes_10": "Überprüfen Sie die Verfügbarkeit im Shop:",
"mes_11": "Outfit hinzugefügt Tasche",
"mes_12": "Hier klicken vollständigen Details zu diesem Element anzuzeigen"
},
"error": {
"mes_0": "Leider trat ein Fehler beim Versuch, Ihren Artikel hinzuzufügen. Bitte versuchen Sie es erneut.",
"mes_1": "Leider trat ein Fehler beim Versuch, Ihre Elemente hinzuzufügen. Bitte versuchen Sie es erneut.",
"mes_2": "Sie müssen eine Größe für jeden Artikel, bevor Sie das Outfit, Ihre Tasche hinzufügen möchten."
},
"code": {
"mes_0": "[Sehen Sie Ihre Tasche] [Zur Kasse]-Taste weiter einkaufen",
"mes_1": "[Sehen Sie Ihre Tasche] [Zur Kasse]"
}
}
答案 2 :(得分:-1)
在纯JS中,你只能使用navigator.language
上的粗分支
我建议配置httpd以提供基于Accept-Language
的适当变体,而不是使其“无缝”