senselogic-lingo
Version:
Text localization and processing.
361 lines (277 loc) • 15.5 kB
JavaScript
// -- IMPORTS
import
{
defineColorTag,
defineDualTag,
defineLineTag,
defineTag,
getBrowserLanguageCode,
getFormattedArrayText,
getFormattedCountryName,
getFormattedCurrencyName,
getFormattedDateText,
getFormattedNumberText,
getFormattedLanguageName,
getFormattedTimeText,
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 : getFormattedNumberText' );
setLanguageCode( 'en' );
checkResult( getFormattedNumberText( 1234567.89 ), '1,234,567.89' );
checkResult( getFormattedNumberText( 1234567.89, 'currency', 'USD' ), '$1,234,567.89' );
checkResult( getFormattedNumberText( 1234567.89, 'percent' ), '123,456,789%' );
setLanguageCode( 'fr' );
checkResult( getFormattedNumberText( 1234567.89 ), '1 234 567,89' );
checkResult( getFormattedNumberText( 1234567.89, 'currency', 'EUR' ), '1 234 567,89 €' );
checkResult( getFormattedNumberText( 0.89, 'percent' ), '89 %' );
console.log( 'Testing : getFormattedDateText' );
let date = new Date( '2024-08-08' );
setLanguageCode( 'en' );
checkResult( getFormattedDateText( date, undefined, 'GMT' ), '8/8/2024' );
checkResult( getFormattedDateText( date, undefined, 'UTC' ), '8/8/2024' );
checkResult( getFormattedDateText( date, 'full', 'GMT' ), 'Thursday, August 8, 2024' );
checkResult( getFormattedDateText( date, 'full', 'UTC' ), 'Thursday, August 8, 2024' );
checkResult( getFormattedDateText( date, undefined, 'GMT', 'numeric', 'long', 'numeric', 'long' ), 'Thursday, August 8, 2024' );
checkResult( getFormattedDateText( date, undefined, 'UTC', 'numeric', 'long', 'numeric', 'long' ), 'Thursday, August 8, 2024' );
setLanguageCode( 'fr' );
checkResult( getFormattedDateText( date, undefined, 'GMT' ), '08/08/2024' );
checkResult( getFormattedDateText( date, undefined, 'UTC' ), '08/08/2024' );
checkResult( getFormattedDateText( date, 'full', 'GMT' ), 'jeudi 8 août 2024' );
checkResult( getFormattedDateText( date, 'full', 'UTC' ), 'jeudi 8 août 2024' );
checkResult( getFormattedDateText( date, undefined, 'GMT', 'numeric', 'long', 'numeric', 'long' ), 'jeudi 8 août 2024' );
checkResult( getFormattedDateText( date, undefined, 'UTC', 'numeric', 'long', 'numeric', 'long' ), 'jeudi 8 août 2024' );
console.log( 'Testing : getFormattedTimeText' );
let time = new Date( '2024-08-08T14:30:00Z' );
setLanguageCode( 'en' );
checkResult( getFormattedTimeText( time, 'short', 'GMT' ), '2:30 PM' );
checkResult( getFormattedTimeText( time, 'short', 'UTC' ), '2:30 PM' );
checkResult( getFormattedTimeText( time, 'medium', 'GMT' ), '2:30:00 PM' );
checkResult( getFormattedTimeText( time, 'medium', 'UTC' ), '2:30:00 PM' );
checkResult( getFormattedTimeText( time, 'long', 'GMT' ), '2:30:00 PM UTC' );
checkResult( getFormattedTimeText( time, 'long', 'UTC' ), '2:30:00 PM UTC' );
checkResult( getFormattedTimeText( time, 'full', 'GMT' ), '2:30:00 PM Coordinated Universal Time' );
checkResult( getFormattedTimeText( time, 'full', 'UTC' ), '2:30:00 PM Coordinated Universal Time' );
checkResult( getFormattedTimeText( time, undefined, 'UTC', '2-digit', '2-digit', '2-digit' ), '02:30:00 PM' );
setLanguageCode( 'fr' );
checkResult( getFormattedTimeText( time, 'short', 'GMT' ), '14:30' );
checkResult( getFormattedTimeText( time, 'short', 'UTC' ), '14:30' );
checkResult( getFormattedTimeText( time, 'medium', 'GMT' ), '14:30:00' );
checkResult( getFormattedTimeText( time, 'medium', 'UTC' ), '14:30:00' );
checkResult( getFormattedTimeText( time, 'long', 'GMT' ), '14:30:00 UTC' );
checkResult( getFormattedTimeText( time, 'long', 'UTC' ), '14:30:00 UTC' );
checkResult( getFormattedTimeText( time, 'full', 'GMT' ), '14:30:00 temps universel coordonné' );
checkResult( getFormattedTimeText( time, 'full', 'UTC' ), '14:30:00 temps universel coordonné' );
checkResult( getFormattedTimeText( time, undefined, 'GMT', '2-digit', '2-digit', '2-digit' ), '14:30:00' );
checkResult( getFormattedTimeText( time, undefined, 'UTC', '2-digit', '2-digit', '2-digit' ), '14:30:00' );
console.log( 'Testing : getFormattedCountryName' );
setLanguageCode( 'en' );
checkResult( getFormattedCountryName( 'US' ), 'United States' );
checkResult( getFormattedCountryName( 'FR' ), 'France' );
setLanguageCode( 'fr' );
checkResult( getFormattedCountryName( 'US' ), 'États-Unis' );
checkResult( getFormattedCountryName( 'FR' ), 'France' );
console.log( 'Testing : getFormattedLanguageName' );
setLanguageCode( 'en' );
checkResult( getFormattedLanguageName( 'en' ), 'English' );
checkResult( getFormattedLanguageName( 'fr' ), 'French' );
setLanguageCode( 'fr' );
checkResult( getFormattedLanguageName( 'en' ), 'anglais' );
checkResult( getFormattedLanguageName( 'fr' ), 'français' );
console.log( 'Testing : getFormattedCurrencyName' );
setLanguageCode( 'en' );
checkResult( getFormattedCurrencyName( 'USD' ), 'US Dollar' );
checkResult( getFormattedCurrencyName( 'EUR' ), 'Euro' );
setLanguageCode( 'fr' );
checkResult( getFormattedCurrencyName( 'USD' ), 'dollar des États-Unis' );
checkResult( getFormattedCurrencyName( 'EUR' ), 'euro' );
console.log( 'Testing : getFormattedArrayText' );
let array = [ 'apple', 'banana', 'cherry' ];
setLanguageCode( 'en' );
checkResult( getFormattedArrayText( array ), 'apple, banana, and cherry' );
checkResult( getFormattedArrayText( array, 'narrow' ), 'apple, banana, cherry' );
checkResult( getFormattedArrayText( array, 'long', 'disjunction' ), 'apple, banana, or cherry' );
setLanguageCode( 'fr' );
checkResult( getFormattedArrayText( array ), 'apple, banana et cherry' );
checkResult( getFormattedArrayText( array, 'narrow' ), 'apple, banana, cherry' );
checkResult( getFormattedArrayText( array, 'long', 'disjunction' ), 'apple, banana ou cherry' );
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();