/** * Globalize Runtime v1.7.0 * * https://github.com/globalizejs/globalize * * Copyright OpenJS Foundation and other contributors * Released under the MIT license * https://jquery.org/license * * Date: 2021-08-02T11:53Z */ /*! * Globalize Runtime v1.7.0 2021-08-02T11:53Z Released under the MIT license * http://git.io/TrdQbw */ (function( root, factory ) { "use strict"; // UMD returnExports if ( typeof define === "function" && define.amd ) { // AMD define( factory ); } else if ( typeof exports === "object" ) { // Node, CommonJS module.exports = factory(); } else { // Globalize root.Globalize = factory(); } }( this, function() { /** * A toString method that outputs meaningful values for objects or arrays and * still performs as fast as a plain string in case variable is string, or as * fast as `"" + number` in case variable is a number. * Ref: http://jsperf.com/my-stringify */ var toString = function( variable ) { return typeof variable === "string" ? variable : ( typeof variable === "number" ? "" + variable : JSON.stringify( variable ) ); }; /** * formatMessage( message, data ) * * @message [String] A message with optional {vars} to be replaced. * * @data [Array or JSON] Object with replacing-variables content. * * Return the formatted message. For example: * * - formatMessage( "{0} second", [ 1 ] ); // 1 second * * - formatMessage( "{0}/{1}", ["m", "s"] ); // m/s * * - formatMessage( "{name} <{email}>", { * name: "Foo", * email: "bar@baz.qux" * }); // Foo */ var formatMessage = function( message, data ) { // Replace {attribute}'s message = message.replace( /{[0-9a-zA-Z-_. ]+}/g, function( name ) { name = name.replace( /^{([^}]*)}$/, "$1" ); return toString( data[ name ] ); }); return message; }; var objectExtend = function() { var destination = arguments[ 0 ], sources = [].slice.call( arguments, 1 ); sources.forEach(function( source ) { var prop; for ( prop in source ) { destination[ prop ] = source[ prop ]; } }); return destination; }; var createError = function( code, message, attributes ) { var error; message = code + ( message ? ": " + formatMessage( message, attributes ) : "" ); error = new Error( message ); error.code = code; objectExtend( error, attributes ); return error; }; /** * Pushes part to parts array, concat two consecutive parts of the same type. */ var partsPush = function( parts, type, value ) { // Concat two consecutive parts of same type if ( parts.length && parts[ parts.length - 1 ].type === type ) { parts[ parts.length - 1 ].value += value; return; } parts.push( { type: type, value: value } ); }; /** * formatMessage( message, data ) * * @message [String] A message with optional {vars} to be replaced. * * @data [Array or JSON] Object with replacing-variables content. * * Return the formatted message. For example: * * - formatMessage( "{0} second", [ 1 ] ); * > [{type: "variable", value: "1", name: "0"}, {type: "literal", value: " second"}] * * - formatMessage( "{0}/{1}", ["m", "s"] ); * > [ * { type: "variable", value: "m", name: "0" }, * { type: "literal", value: " /" }, * { type: "variable", value: "s", name: "1" } * ] */ var formatMessageToParts = function( message, data ) { var lastOffset = 0, parts = []; // Create parts. message.replace( /{[0-9a-zA-Z-_. ]+}/g, function( nameIncludingBrackets, offset ) { var name = nameIncludingBrackets.slice( 1, -1 ); partsPush( parts, "literal", message.slice( lastOffset, offset )); partsPush( parts, "variable", data[ name ] ); parts[ parts.length - 1 ].name = name; lastOffset += offset + nameIncludingBrackets.length; }); // Skip empty ones such as `{ type: 'literal', value: '' }`. return parts.filter(function( part ) { return part.value !== ""; }); }; /** * Returns joined parts values. */ var partsJoin = function( parts ) { return parts.map( function( part ) { return part.value; }).join( "" ); }; var runtimeStringify = function( args ) { return JSON.stringify( args, function( _key, value ) { if ( value && value.runtimeKey ) { return value.runtimeKey; } return value; } ); }; // Based on http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery var stringHash = function( str ) { return [].reduce.call( str, function( hash, i ) { var chr = i.charCodeAt( 0 ); hash = ( ( hash << 5 ) - hash ) + chr; return hash | 0; }, 0 ); }; var runtimeKey = function( fnName, locale, args, argsStr ) { var hash; argsStr = argsStr || runtimeStringify( args ); hash = stringHash( fnName + locale + argsStr ); return hash > 0 ? "a" + hash : "b" + Math.abs( hash ); }; var validate = function( code, message, check, attributes ) { if ( !check ) { throw createError( code, message, attributes ); } }; var validateParameterPresence = function( value, name ) { validate( "E_MISSING_PARAMETER", "Missing required parameter `{name}`.", value !== undefined, { name: name }); }; var validateParameterType = function( value, name, check, expected ) { validate( "E_INVALID_PAR_TYPE", "Invalid `{name}` parameter ({value}). {expected} expected.", check, { expected: expected, name: name, value: value } ); }; var validateParameterTypeString = function( value, name ) { validateParameterType( value, name, value === undefined || typeof value === "string", "a string" ); }; // ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions?redirectlocale=en-US&redirectslug=JavaScript%2FGuide%2FRegular_Expressions var regexpEscape = function( string ) { return string.replace( /([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1" ); }; var stringPad = function( str, count, right ) { var length; if ( typeof str !== "string" ) { str = String( str ); } for ( length = str.length; length < count; length += 1 ) { str = ( right ? ( str + "0" ) : ( "0" + str ) ); } return str; }; function Globalize( locale ) { if ( !( this instanceof Globalize ) ) { return new Globalize( locale ); } validateParameterPresence( locale, "locale" ); validateParameterTypeString( locale, "locale" ); this._locale = locale; } Globalize.locale = function( locale ) { validateParameterTypeString( locale, "locale" ); if ( arguments.length ) { this._locale = locale; } return this._locale; }; Globalize._createError = createError; Globalize._formatMessage = formatMessage; Globalize._formatMessageToParts = formatMessageToParts; Globalize._partsJoin = partsJoin; Globalize._partsPush = partsPush; Globalize._regexpEscape = regexpEscape; Globalize._runtimeKey = runtimeKey; Globalize._stringPad = stringPad; Globalize._validateParameterPresence = validateParameterPresence; Globalize._validateParameterTypeString = validateParameterTypeString; Globalize._validateParameterType = validateParameterType; return Globalize; }));