javascript中的多语言错误消息

时间:2011-05-20 14:53:43

标签: javascript json internationalization

我们正在创建我们的在线商店的国际版本,我的任务是解开所有javascript错误消息,因此它们以该网站上的相关语言显示。

我显然想做的是为所有网站保留相同的javascript集,但只是加载来自德语/法语/意大利语文本文件的一组错误消息。我认为这可能与单独的json文件有关,这些文件只包含一组纯文本错误消息。

有人能为这个问题提出最简单,最具扩展性的解决方案吗?感谢。

3 个答案:

答案 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的适当变体,而不是使其“无缝”