jQuery 验证器没有格式化消息

jQuery Validator no formatting messages

我已经使用我一直使用的方法翻译了我想要的消息。消息正常,问题是号码不见了。

我的消息翻译代码:

$.extend(jQuery.validator.messages, {
            required: 'Este campo es requerido.',
            maxlength: $.validator.format("Favor de ingresar no mas de {0} caracteres."),
            max: $.validator.format("Favor de ingresar un valor menos de o igual a {0}."),
        });

这是输出:

它验证得很好,如果我将值降低到 100 以下它会接受它们。所以这意味着现有的规则没有问题,但消息没有被格式化。

更新

jquery.validate.js 的第 217 行,我放置了一个 console.log 的替换方法:

$.validator.format = function( source, params ) {
    if ( arguments.length === 1 ) {
        return function() {
            var args = $.makeArray( arguments );
            args.unshift( source );
            return $.validator.format.apply( this, args );
        };
    }
    if ( arguments.length > 2 && params.constructor !== Array  ) {
        params = $.makeArray( arguments ).slice( 1 );
    }
    if ( params.constructor !== Array ) {
        params = [ params ];
    }
    $.each( params, function( i, n ) {
        console.log(source.replace( new RegExp( "\{" + i + "\}", "g" ), function() {
            return n;
        }));
        source = source.replace( new RegExp( "\{" + i + "\}", "g" ), function() {
            return n;
        });
    });
    return source;
};

不幸的是,即使记录替换方法,它仍然带有数字 0。所以它没有得到验证器丢失的实际数据:

我最初在 post 中没有想到的是我正在使用 smarty 模板。并非所有 Javascript 我都包裹在 {literal} 标签中。所以它将消息数组中的 {0} 翻译为一个聪明的变量。所以在 jquery.validate.js 的第 232 行,它实际上并没有替换任何东西,因为缺少 {} 括号。

因此,通过使用 {literal} 标记将我的替换代码包装在 tpl 文件中,它解决了整个问题。

新代码:

        {literal}
        $.extend(jQuery.validator.messages, {
            required: 'Este campo es requerido.',
            maxlength: $.validator.format("Favor de ingresar no mas de {0} caracteres."),
            max: $.validator.format("Favor de ingresar un valor menos de o igual a {0}."),
        });
        {/literal}