senselogic-lingo
Version:
Text localization and processing.
366 lines (285 loc) • 16.6 kB
JavaScript
// -- IMPORTS
import
{
defineColorTag,
defineDualTag,
defineLineTag,
defineTag,
getBrowserLanguageCode,
getTranslatedCountryName,
getTranslatedCurrencyName,
getTranslatedDate,
getTranslatedNumber,
getTranslatedLanguageName,
getTranslatedTime,
getLocalizedText,
getProcessedMultilineText,
getProcessedText,
setDefaultLanguageCode,
setCountryCode,
setLanguageCode,
setLanguageSeparator
}
from './index.js';
// -- FUNCTIONS
function checkResult(
value,
expectedValue
)
{
console.log( 'Value :', JSON.stringify( value ) );
console.log( 'Expected value :', JSON.stringify( expectedValue ) );
if ( value !== expectedValue )
{
throw new Error( 'Invalid value : ' + JSON.stringify( value ) );
}
}
// ~~
function runTests(
)
{
console.log( 'Testing : getTranslatedNumber' );
setLanguageCode( 'en' );
checkResult( getTranslatedNumber( 12 ), '12' );
checkResult( getTranslatedNumber( 12, { minimumIntegerDigitCount: 3 } ), '012' );
checkResult( getTranslatedNumber( 12, { minimumFractionalDigitCount: 3 } ), '12.000' );
checkResult( getTranslatedNumber( 12.89 ), '12.89' );
checkResult( getTranslatedNumber( 12.89, { minimumFractionalDigitCount: 3 } ), '12.890' );
checkResult( getTranslatedNumber( 12.89, { maximumFractionalDigitCount: 0 } ), '13' );
checkResult( getTranslatedNumber( 1234567.89 ), '1234567.89' );
checkResult( getTranslatedNumber( 1234567.89, { usesGrouping: true } ), '1,234,567.89' );
checkResult( getTranslatedNumber( 1234567.89, { minimumFractionalDigitCount: 3 } ), '1234567.890' );
checkResult( getTranslatedNumber( 1234567.89, { usesGrouping: true, minimumFractionalDigitCount: 3 } ), '1,234,567.890' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'USD' } ), '$1234567.89' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'USD', usesGrouping: true } ), '$1,234,567.89' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'USD', usesGrouping: true, minimumFractionalDigitCount: 3 } ), '$1,234,567.890' );
setLanguageCode( 'fr' );
checkResult( getTranslatedNumber( 12 ), '12' );
checkResult( getTranslatedNumber( 12, { minimumIntegerDigitCount: 3 } ), '012' );
checkResult( getTranslatedNumber( 12, { minimumFractionalDigitCount: 3 } ), '12,000' );
checkResult( getTranslatedNumber( 12.89 ), '12,89' );
checkResult( getTranslatedNumber( 12.89, { minimumFractionalDigitCount: 3 } ), '12,890' );
checkResult( getTranslatedNumber( 12.89, { maximumFractionalDigitCount: 0 } ), '13' );
checkResult( getTranslatedNumber( 1234567.89 ), '1234567,89' );
checkResult( getTranslatedNumber( 1234567.89, { usesGrouping: true } ), '1 234 567,89' );
checkResult( getTranslatedNumber( 1234567.89, { minimumFractionalDigitCount: 3 } ), '1234567,890' );
checkResult( getTranslatedNumber( 1234567.89, { usesGrouping: true, minimumFractionalDigitCount: 3 } ), '1 234 567,890' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'EUR' } ), '1234567,89 €' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'EUR', usesGrouping: true } ), '1 234 567,89 €' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'EUR', usesGrouping: true, minimumFractionalDigitCount: 3 } ), '1 234 567,890 €' );
setLanguageCode( 'pt' );
checkResult( getTranslatedNumber( 12 ), '12' );
checkResult( getTranslatedNumber( 12, { minimumIntegerDigitCount: 3 } ), '012' );
checkResult( getTranslatedNumber( 12, { minimumFractionalDigitCount: 3 } ), '12,000' );
checkResult( getTranslatedNumber( 12.89 ), '12,89' );
checkResult( getTranslatedNumber( 12.89, { minimumFractionalDigitCount: 3 } ), '12,890' );
checkResult( getTranslatedNumber( 12.89, { maximumFractionalDigitCount: 0 } ), '13' );
checkResult( getTranslatedNumber( 1234567.89 ), '1234567,89' );
checkResult( getTranslatedNumber( 1234567.89, { usesGrouping: true } ), '1.234.567,89' );
checkResult( getTranslatedNumber( 1234567.89, { minimumFractionalDigitCount: 3 } ), '1234567,890' );
checkResult( getTranslatedNumber( 1234567.89, { usesGrouping: true, minimumFractionalDigitCount: 3 } ), '1.234.567,890' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'BRL' } ), 'R\$ 1234567,89' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'BRL', usesGrouping: true } ), 'R\$ 1.234.567,89' );
checkResult( getTranslatedNumber( 1234567.89, { currency: 'BRL', usesGrouping: true, minimumFractionalDigitCount: 3 } ), 'R\$ 1.234.567,890' );
console.log( 'Testing : getTranslatedDate' );
let date = new Date( '2024-08-02' );
setLanguageCode( 'en' );
checkResult( getTranslatedDate( date ), '8/2/2024' );
checkResult( getTranslatedDate( date, { timeZone: 'UTC' } ), '8/2/2024' );
checkResult( getTranslatedDate( date, { yearPattern: 'y', monthPattern: 'MM', dayPattern: 'dd' } ), '08/02/2024' );
checkResult( getTranslatedDate( date, { yearPattern: 'y', monthPattern: 'MM', dayPattern: 'dd', timeZone: 'UTC' } ), '08/02/2024' );
setLanguageCode( 'fr' );
checkResult( getTranslatedDate( date ), '02/08/2024' );
checkResult( getTranslatedDate( date, { timeZone: 'UTC' } ), '02/08/2024' );
checkResult( getTranslatedDate( date, { yearPattern: 'y', monthPattern: 'MM', dayPattern: 'dd' } ), '02/08/2024' );
checkResult( getTranslatedDate( date, { yearPattern: 'y', monthPattern: 'MM', dayPattern: 'dd', timeZone: 'UTC' } ), '02/08/2024' );
console.log( 'Testing : getTranslatedTime' );
let time = new Date( '2024-08-02T07:05:00Z' );
setLanguageCode( 'en' );
checkResult( getTranslatedTime( time ), '07:05:00' );
checkResult( getTranslatedTime( time, { timeZone: 'UTC' } ), '07:05:00' );
checkResult( getTranslatedTime( time, { hourPattern: 'HH', minutePattern: 'mm', secondPattern: 'ss' } ), '07:05:00' );
checkResult( getTranslatedTime( time, { hourPattern: 'HH', minutePattern: 'mm', secondPattern: 'ss', timeZone: 'UTC' } ), '07:05:00' );
setLanguageCode( 'fr' );
checkResult( getTranslatedTime( time ), '07:05:00' );
checkResult( getTranslatedTime( time, { timeZone: 'UTC' } ), '07:05:00' );
checkResult( getTranslatedTime( time, { hourPattern: 'HH', minutePattern: 'mm', secondPattern: 'ss' } ), '07:05:00' );
checkResult( getTranslatedTime( time, { hourPattern: 'HH', minutePattern: 'mm', secondPattern: 'ss', timeZone: 'UTC' } ), '07:05:00' );
console.log( 'Testing : getTranslatedCountryName' );
setLanguageCode( 'en' );
checkResult( getTranslatedCountryName( 'US' ), 'United States' );
checkResult( getTranslatedCountryName( 'FR' ), 'France' );
setLanguageCode( 'fr' );
checkResult( getTranslatedCountryName( 'US' ), 'États-Unis' );
checkResult( getTranslatedCountryName( 'FR' ), 'France' );
console.log( 'Testing : getTranslatedLanguageName' );
setLanguageCode( 'en' );
checkResult( getTranslatedLanguageName( 'en' ), 'English' );
checkResult( getTranslatedLanguageName( 'fr' ), 'French' );
setLanguageCode( 'fr' );
checkResult( getTranslatedLanguageName( 'en' ), 'anglais' );
checkResult( getTranslatedLanguageName( 'fr' ), 'français' );
console.log( 'Testing : getTranslatedCurrencyName' );
setLanguageCode( 'en' );
checkResult( getTranslatedCurrencyName( 'USD' ), 'US Dollar' );
checkResult( getTranslatedCurrencyName( 'EUR' ), 'Euro' );
setLanguageCode( 'fr' );
checkResult( getTranslatedCurrencyName( 'USD' ), 'dollar des États-Unis' );
checkResult( getTranslatedCurrencyName( 'EUR' ), 'euro' );
console.log( 'Testing : getBrowserLanguageCode' );
let browserLanguageText = 'fr-FR,de;q=0.8,en-US;q=0.5,en-GB;q=0.3,es;q=0.2,pt-BR;q=0.1,ru;q=0.1,ja;q=0.1,it;q=0.1,nl-NL;q=0.1';
let browserLanguageCode = getBrowserLanguageCode( browserLanguageText, [ 'en', 'fr', 'de' ], '-' );
checkResult( browserLanguageCode, 'fr' );
browserLanguageCode = getBrowserLanguageCode( browserLanguageText, [ 'de', 'fr' ], '-' );
checkResult( browserLanguageCode, 'fr' );
browserLanguageCode = getBrowserLanguageCode( browserLanguageText, [ 'da' ] );
checkResult( browserLanguageCode, '' );
console.log( 'Testing : getLocalizedText' );
setLanguageSeparator( '¨' );
setDefaultLanguageCode( 'en' );
let multilingualText = 'trunk¨en-UK,en--OC:boot¨fr:coffre¨pt:mala¨pt-BR:porta-malas';
setLanguageCode( 'en' );
setCountryCode( 'US' );
let localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'trunk' );
setLanguageCode( 'en' );
setCountryCode( 'UK' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'boot' );
setLanguageCode( 'en' );
setCountryCode( 'AU' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'boot' );
setLanguageCode( 'fr' );
setCountryCode( 'FR' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'coffre' );
setLanguageCode( 'pt' );
setCountryCode( 'PT' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'mala' );
setLanguageCode( 'pt' );
setCountryCode( 'BR' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'porta-malas' );
multilingualText = 'US¨en-UK,en-AU:UKAU¨fr:FR¨fr-BE,fr-CA:BECA¨pt:PT¨pt-BR:BR';
setLanguageCode( 'en' );
setCountryCode( 'US' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'US' );
setLanguageCode( 'en' );
setCountryCode( 'UK' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'UKAU' );
setLanguageCode( 'en' );
setCountryCode( 'AU' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'UKAU' );
setLanguageCode( 'en' );
setCountryCode( 'CA' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'US' );
setLanguageCode( 'fr' );
setCountryCode( 'FR' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'FR' );
setLanguageCode( 'fr' );
setCountryCode( 'BE' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'BECA' );
setLanguageCode( 'fr' );
setCountryCode( 'CA' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'BECA' );
setLanguageCode( 'fr' );
setCountryCode( 'CH' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'FR' );
setLanguageCode( 'de' );
setCountryCode( 'CH' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'US' );
setLanguageCode( 'en' );
setCountryCode( 'FR' );
localizedText = getLocalizedText( multilingualText );
checkResult( localizedText, 'US' );
multilingualText = '{count} bathrooms¨en?count=1:{count} bathroom¨fr:{count} salles de bain¨fr?count<2:{count} salle de bain';
setLanguageCode( 'en' );
setCountryCode( 'US' );
localizedText = getLocalizedText( multilingualText, { count: 0 } );
checkResult( localizedText, '0 bathrooms' );
localizedText = getLocalizedText( multilingualText, { count: 1 } );
checkResult( localizedText, '1 bathroom' );
localizedText = getLocalizedText( multilingualText, { count: 2 } );
checkResult( localizedText, '2 bathrooms' );
setLanguageCode( 'fr' );
setCountryCode( 'FR' );
localizedText = getLocalizedText( multilingualText, { count: 0 } );
checkResult( localizedText, '0 salle de bain' );
localizedText = getLocalizedText( multilingualText, { count: 1 } );
checkResult( localizedText, '1 salle de bain' );
localizedText = getLocalizedText( multilingualText, { count: 2 } );
checkResult( localizedText, '2 salles de bain' );
multilingualText = '¨en?count=0,count>=2:{count} bathrooms¨en?count=1:{count} bathroom¨fr:{count} salles de bain¨fr?count=0,count=1:{count} salle de bain';
setLanguageCode( 'en' );
setCountryCode( 'US' );
localizedText = getLocalizedText( multilingualText, { count: 0 } );
checkResult( localizedText, '0 bathrooms' );
localizedText = getLocalizedText( multilingualText, { count: 1 } );
checkResult( localizedText, '1 bathroom' );
localizedText = getLocalizedText( multilingualText, { count: 2 } );
checkResult( localizedText, '2 bathrooms' );
setLanguageCode( 'fr' );
setCountryCode( 'FR' );
localizedText = getLocalizedText( multilingualText, { count: 0 } );
checkResult( localizedText, '0 salle de bain' );
localizedText = getLocalizedText( multilingualText, { count: 1 } );
checkResult( localizedText, '1 salle de bain' );
localizedText = getLocalizedText( multilingualText, { count: 2 } );
checkResult( localizedText, '2 salles de bain' );
console.log( 'Testing : getProcessedText' );
defineLineTag( '! ', '<div class="paragraph title-1">', '</div>' );
defineLineTag( '!! ', '<div class="paragraph title-2">', '</div>' );
defineLineTag( '!!! ', '<div class="paragraph title-3">', '</div>' );
defineLineTag( '!!!! ', '<div class="paragraph title-4">', '</div>' );
defineLineTag( '- ', '<div class="paragraph dash-1">', '</div>' );
defineLineTag( ' - ', '<div class="paragraph dash-2">', '</div>' );
defineLineTag( ' - ', '<div class="paragraph dash-3">', '</div>' );
defineLineTag( ' - ', '<div class="paragraph dash-4">', '</div>' );
defineLineTag( '* ', '<div class="paragraph bullet-1">', '</div>' );
defineLineTag( ' * ', '<div class="paragraph bullet-2">', '</div>' );
defineLineTag( ' * ', '<div class="paragraph bullet-3">', '</div>' );
defineLineTag( ' * ', '<div class="paragraph bullet-4">', '</div>' );
defineLineTag( '# ', '<div class="paragraph numbered-bullet-1"><div>', '</div><div>', '</div></div>' );
defineLineTag( ' # ', '<div class="paragraph numbered-bullet-2"><div>', '</div><div>', '</div></div>' );
defineLineTag( ' # ', '<div class="paragraph numbered-bullet-3"><div>', '</div><div>', '</div></div>' );
defineLineTag( ' # ', '<div class="paragraph numbered-bullet-4"><div>', '</div><div>', '</div></div>' );
defineLineTag( '', '<div class="paragraph">', '</div>' );
defineDualTag( '**', '<b>', '</b>' );
defineDualTag( '%%', '<i>', '</i>' );
defineDualTag( '__', '<u>', '</u>' );
defineDualTag( ',,', '<sub>', '</sub>' );
defineDualTag( '^^', '<sup>', '</sup>' );
defineTag( '~', ' ' );
defineTag( '¦', '<wbr/>' );
defineTag( '§', '<br/>' );
defineTag( '¶', '<br class="linebreak"/>' );
defineTag( '((', '<a class="link" href="' );
defineTag( ')(', '" target="_blank">' );
defineTag( '))', '</a>' );
defineTag( '¬', '' );
defineColorTag( 'red' );
defineColorTag( 'green', '#0F0' );
let processedText = getProcessedText( '**bold** %%italics%% __underlined__ ~¦§¶ ((https://dailykitten.com)(Daily Kitten))' );
console.log( processedText );
checkResult( processedText, '<b>bold</b> <i>italics</i> <u>underlined</u> <wbr/><br/><br class="linebreak"/> <a class="link" href="https://dailykitten.com" target="_blank">Daily Kitten</a>' );
processedText = getProcessedMultilineText( '! **bold**\n!! %%italics%%\n__underlined__' );
console.log( processedText );
checkResult( processedText, '<div class="paragraph title-1"><b>bold</b></div>\n<div class="paragraph title-2"><i>italics</i></div>\n<div class="paragraph"><u>underlined</u></div>' );
processedText = getProcessedMultilineText( '- dash\n - dash\n* bullet\n * bullet\n# 1. numbered bullet\n # a. numbered bullet' );
console.log( processedText );
checkResult( processedText, '<div class="paragraph dash-1">dash</div>\n<div class="paragraph dash-2">dash</div>\n<div class="paragraph bullet-1">bullet</div>\n<div class="paragraph bullet-2">bullet</div>\n<div class="paragraph numbered-bullet-1"><div>1.</div><div>numbered bullet</div></div>\n<div class="paragraph numbered-bullet-2"><div>a.</div><div>numbered bullet</div></div>' );
console.log( 'All tests passed!' );
}
// -- STATEMENTS
runTests();