javascript - Jquery - 创建一个通用语言文件来声明任何插件的默认值

标签 javascript jquery internationalization

像大多数人一样,我在我的网站上使用了一堆 jquery 插件。从 Twitter bootstrap 到 jquery ui datepicker 等等。

但我需要我的网站是多语言的,所以我创建了一个名为 english.js 的通用语言文件,在该文件中我想声明一些来自插件的默认值以及其他语言变量.

问题是所有这些插件都有不同的结构来声明默认值。我已经看到了几个问题( jquery - setting plugin defaults?Globally defining jQuery plugin parametersjQuery plugin defaults ,...)。但他们并不清楚。

结构 1

$.fn.ajaxStatus = function (params)
{
    var settings = $.extend(
            {
                defaultLoadingText :"Loading...",
                defaultSavingText  :"Saving...",
                defaultDoneText    :"Done",
                defaultRedirectText:"Redirecting...",
                defaultErrorText   :"Oops! Our bad, something wrong.";
            },$.fn.ajaxStatus.defaults,
            params),
});

结构 2

   jQuery.fn.extend({
        shrinker:function (options) {
            var opts = $.extend({
                "moreText":"Read more", 
                "lessText":"hide",
            }, $.fn.shrinker.defaults, options);
   });

问题

在不修改插件的情况下,是否可以为每次使用插件时使用的功能分配一些默认值? 如何在外部文件中定义语言默认值?

现在,我的语言文件中有这个,但感觉不对,你是这样做的吗?

if ($.fn.ajaxStatus !== undefined) {
    $.fn.ajaxStatus.defaults =
    {
        defaultLoadingText :"Loading2...",
        defaultSavingText  :"Saving2...",
        defaultDoneText    :"Done2",
        defaultRedirectText:"Redirecting2...",
        defaultErrorText   :"Oops! Our bad, something wrong"
    };
}

在此先感谢您的帮助。

最佳答案

我可以看到在一个对象中这样做,就像这样:

var en = {
    defaultLoadingText: "Loading...",
    defaultSavingText: "Saving...",
    defaultDoneText: "Done",
    defaultRedirectText: "Redirecting...",
    defaultErrorText: "Oops! Our bad, something wrong.";
    moreText: "Read more", 
    lessText: "hide"
};

假设插件之间的选项名称没有重叠,您可以使用以下方式启动您的插件:

$('').ajaxStatus(en);
$('').shrinker(en);

大多数插件接受一个选项对象并忽略额外的属性。如果您有一些其他选项要传递给特定插件,您只需使用 $.extend():

$('').ajaxStatus($.extend({}, { success: function () {} }, en));

如果您真的想将插件选项分开,只需创建另一个级别:

var en = {
    ajaxStatus: {
        defaultLoadingText: "Loading...",
        defaultSavingText: "Saving...",
        defaultDoneText: "Done",
        defaultRedirectText: "Redirecting...",
        defaultErrorText: "Oops! Our bad, something wrong.";
    },
    shrinker: {
        moreText: "Read more", 
        lessText: "hide"
    }
};

然后:

$('').ajaxStatus(en.ajaxStatus);
$('').shrinker(en.shrinker);

最后,您可以想象一下,通过将它们全部存储在一个多层对象中来更容易地获得不同的语言:

var localizedOptions = {
    'en-US': {
        ajaxStatus: {
            defaultLoadingText: "Loading...",
            defaultSavingText: "Saving...",
            defaultDoneText: "Done",
            defaultRedirectText: "Redirecting...",
            defaultErrorText: "Oops! Our bad, something wrong.";
        },
        shrinker: {
            moreText: "Read more", 
            lessText: "hide"
        }
    },
    'es-ES': {
        ajaxStatus: {
            defaultLoadingText: "Cargar...",
            defaultSavingText: "Guardar...",
            defaultDoneText: "Terminado",
            defaultRedirectText: "Redirigir...",
            defaultErrorText: "¡Ay! Nuestra algo malo, malo.";
        },
        shrinker: {
            moreText: "Leer más", 
            lessText: "esconder"
        }
    } // ... etc.
};

$('').ajaxStatus(localizedOptions[navigator.language || navigator.userLanguage].ajaxStatus);

我必须承认我自己没有使用过这样的东西,因为我通常以资源文件的形式获取语言文件。在这种情况下,我将仅通过服务器端逻辑输出单个键/值对集合并手动设置适当的插件属性。

在 ASP.NET MVC 中:

<script>
var Resources = {};
@foreach (var kvp in ViewBag.Resources) {
Resources['@kvp.Key'] = "@kvp.Value";
}
</script>

这将输出不同的集合,具体取决于我所在的页面。

关于javascript - Jquery - 创建一个通用语言文件来声明任何插件的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12907730/

相关文章:

javascript - 这个函数与按钮循环的原因是什么?

javascript - 从 Play 获取带有参数的 url

javascript - SignalR 自定义重定向方法

ios - 以编程方式更改应用程序语言

jquery - 在 i18n 化的 Rails 3.2 应用程序中用 timeago jQuery 插件替换 time_ago_in_words

javascript - react ,图像未上传,获取文件名未定义错误

javascript - 在 JavaScript 中使对象在 Canvas 上移动

javascript - 使用动态文本和输入进行字符串翻译

javascript - Momentjs utc() 在本地 (Mac) 和服务器 (Ubuntu) 上的工作方式不同

javascript - AngularJS 中的 `element` 和 `iElement` 有区别吗?