Javascript Jquery-创建通用语言文件以声明任何插件的默认值
和大多数人一样,我在我的网站上使用了很多jquery插件。从Twitter引导到jQueryUIDatePicker等等 但是我需要我的网站是多语言的,所以我创建了一个名为english.js的通用语言文件,在该文件中我想声明一些插件的默认值以及其他语言变量 问题是所有这些插件都有不同的结构来声明默认值。我已经看到几个问题了(,,,…)。但它们并不清楚 结构1Javascript Jquery-创建通用语言文件以声明任何插件的默认值,javascript,jquery,internationalization,Javascript,Jquery,Internationalization,和大多数人一样,我在我的网站上使用了很多jquery插件。从Twitter引导到jQueryUIDatePicker等等 但是我需要我的网站是多语言的,所以我创建了一个名为english.js的通用语言文件,在该文件中我想声明一些插件的默认值以及其他语言变量 问题是所有这些插件都有不同的结构来声明默认值。我已经看到几个问题了(,,,…)。但它们并不清楚 结构1 $.fn.ajaxStatus = function (params) { var settings = $.extend(
$.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 options = {
lang: "np" //your default language
};
var en = {
defaultLoadingText: "Loading...",
defaultSavingText: "Saving...",
defaultDoneText: "Done",
defaultRedirectText: "Redirecting...",
defaultErrorText: "Oops! Our bad, something wrong.";
moreText: "Read more",
lessText: "hide"
};
(function($){
$.fn.pluginName = function (options) {
/**
* Here I'm extending an empty object to include the options
* passed to the plugin, with the default options.
*/
var opts = $.extend({}, $.fn.pluginName.defaults, options);
// body of plugin here
});
// default values for plugin
$.fn.pluginName.defaults = {
defaultLoadingText :"Loading...",
defaultSavingText :"Saving...",
defaultDoneText :"Done",
defaultRedirectText:"Redirecting...",
defaultErrorText :"Oops! Our bad, something wrong."
};
})(jQuery);
像这样设置语言对象
var lang = {
"en": {
"var1" : "This is variable one"
},
"np": {
"var1": "यो एउटा भेरियबल हो ।" //Different text based on language initials
}
};
然后您可以简单地创建一个函数来读取如下值
function showVar1() {
alert(lang[options.lang].var1);
}
它不是基于插件的。我可以在一个对象中看到它,如下所示:
var options = {
lang: "np" //your default language
};
var en = {
defaultLoadingText: "Loading...",
defaultSavingText: "Saving...",
defaultDoneText: "Done",
defaultRedirectText: "Redirecting...",
defaultErrorText: "Oops! Our bad, something wrong.";
moreText: "Read more",
lessText: "hide"
};
(function($){
$.fn.pluginName = function (options) {
/**
* Here I'm extending an empty object to include the options
* passed to the plugin, with the default options.
*/
var opts = $.extend({}, $.fn.pluginName.defaults, options);
// body of plugin here
});
// default values for plugin
$.fn.pluginName.defaults = {
defaultLoadingText :"Loading...",
defaultSavingText :"Saving...",
defaultDoneText :"Done",
defaultRedirectText:"Redirecting...",
defaultErrorText :"Oops! Our bad, something wrong."
};
})(jQuery);
假设插件之间的选项名称没有重叠,您可以使用以下选项启动插件:
$('').ajaxStatus(en);
$('').shrinker(en);
大多数插件接受options对象并忽略额外的属性。如果您想将其他一些选项传递给特定插件,只需使用$.extend()
:
如果您真的想将插件选项分开,只需创建另一个级别:
var en = {
ajaxStatus: {
defaultLoadingText: "Loading...",
defaultSavingText: "Saving...",
defaultDoneText: "Done",
defaultRedirectText: "Redirecting...",
defaultErrorText: "Oops! Our bad, something wrong.";
},
shrinker: {
moreText: "Read more",
lessText: "hide"
}
};
然后:
最后,通过将不同语言存储在一个多层对象中,您可以更轻松地获得不同的语言:
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.
};
及
我必须承认我自己没有使用过这样的东西,因为我通常以资源文件的形式获取语言文件。在这种情况下,我将通过服务器端逻辑输出一组键/值对,并手动设置适当的插件属性
在ASP.NET MVC中:
<script>
var Resources = {};
@foreach (var kvp in ViewBag.Resources) {
Resources['@kvp.Key'] = "@kvp.Value";
}
</script>
var资源={};
@foreach(ViewBag.Resources中的var kvp){
资源['@kvp.Key']=“@kvp.Value”;
}
这将输出一个不同的集合,具体取决于我所在的页面。我认为我的方式与结构1非常相似。我认为可以像你建议的那样覆盖插件默认值 我会像这样构建我的插件:
var options = {
lang: "np" //your default language
};
var en = {
defaultLoadingText: "Loading...",
defaultSavingText: "Saving...",
defaultDoneText: "Done",
defaultRedirectText: "Redirecting...",
defaultErrorText: "Oops! Our bad, something wrong.";
moreText: "Read more",
lessText: "hide"
};
(function($){
$.fn.pluginName = function (options) {
/**
* Here I'm extending an empty object to include the options
* passed to the plugin, with the default options.
*/
var opts = $.extend({}, $.fn.pluginName.defaults, options);
// body of plugin here
});
// default values for plugin
$.fn.pluginName.defaults = {
defaultLoadingText :"Loading...",
defaultSavingText :"Saving...",
defaultDoneText :"Done",
defaultRedirectText:"Redirecting...",
defaultErrorText :"Oops! Our bad, something wrong."
};
})(jQuery);
然后在english.js
中,您可以重新定义$.fn.plugin.defaults
对象:
if ($.fn.pluginName) {
// override the default values in the specified language
$.fn.pluginName.defaults = {
defaultLoadingText :"Loading...",
defaultSavingText :"Saving...",
defaultDoneText :"Done",
defaultRedirectText:"Redirecting...",
defaultErrorText :"Oops! Our bad, something wrong."
};
}
这将覆盖插件的默认设置。如果这有道理的话。你真的不应该使用eval。特别是对于这样一件简单的事情:
alert(lang[options.lang].var1)代码>评估有点冒险。必须有一种更干净的方法来做这件事。有什么想法吗?谢谢。@lrsjng,我想这会更容易理解。哈哈。我更新了我的答案。@denislexic,如果你不信任来源,评估是有风险的。如果源头是你,你不需要考虑风险。但是,我更新了答案,没有使用eval