Skip to content
This repository has been archived by the owner on Jun 26, 2020. It is now read-only.

Commit

Permalink
Merge pull request #205 from ckeditor/t/ckeditor5/624
Browse files Browse the repository at this point in the history
Other: Aligned code to the new Translation Service (ckeditor/ckeditor5#624).
  • Loading branch information
szymonkups authored Nov 27, 2017
2 parents 848a818 + 0716dfc commit a51767a
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 6 deletions.
36 changes: 31 additions & 5 deletions src/translation-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
* For licensing, see LICENSE.md.
*/

/* globals window */

/**
* @module utils/translation-service
*/
Expand All @@ -18,6 +20,12 @@ let dictionaries = {};
* 'Cancel [context: reject]': 'Anuluj'
* } );
*
* That function is accessible globally via `window.CKEDITOR_TRANSLATIONS.add()`. So it's possible to add translation from
* the other script, just after that one.
*
* <script src="./path/to/ckeditor.js"></script>
* <script src="./path/to/translations/en.js"></script>
*
* @param {String} lang Target language.
* @param {Object.<String, String>} translations Translations which will be added to the dictionary.
*/
Expand All @@ -34,24 +42,33 @@ export function add( lang, translations ) {
* When no translation is defined in the dictionary or the dictionary doesn't exist this function returns
* the original string without the `'[context: ]'` (happens in development and single-language modes).
*
* In a single-language mode (when values passed to `t()` were replaced with target languange strings) the dictionary
* In a single-language mode (when values passed to `t()` were replaced with target language strings) the dictionary
* is left empty, so this function will return the original strings always.
*
* translate( 'pl', 'Cancel [context: reject]' );
*
* @param {String} lang Target language.
* @param {String} translationKey String which is going to be translated.
* @param {String} translationKey String that will be translated.
* @returns {String} Translated sentence.
*/
export function translate( lang, translationKey ) {
if ( !hasTranslation( lang, translationKey ) ) {
const numberOfLanguages = getNumberOfLanguages();

if ( numberOfLanguages === 1 ) {
// Override the language to the only supported one.
// This can't be done in the `Locale` class, because the translations comes after the `Locale` class initialization.
lang = Object.keys( dictionaries )[ 0 ];
}

if ( numberOfLanguages === 0 || !hasTranslation( lang, translationKey ) ) {
return translationKey.replace( / \[context: [^\]]+\]$/, '' );
}

return dictionaries[ lang ][ translationKey ];
// In case of missing translations we still need to cut off the `[context: ]` parts.
return dictionaries[ lang ][ translationKey ].replace( / \[context: [^\]]+\]$/, '' );
}

// Checks whether the dictionary exists and translaiton in that dictionary exists.
// Checks whether the dictionary exists and translation in that dictionary exists.
function hasTranslation( lang, translationKey ) {
return (
( lang in dictionaries ) &&
Expand All @@ -67,3 +84,12 @@ function hasTranslation( lang, translationKey ) {
export function _clear() {
dictionaries = {};
}

function getNumberOfLanguages() {
return Object.keys( dictionaries ).length;
}

// Export globally add function to enable adding later translations.
// See https://github.com/ckeditor/ckeditor5/issues/624
window.CKEDITOR_TRANSLATIONS = window.CKEDITOR_TRANSLATIONS || {};
window.CKEDITOR_TRANSLATIONS.add = add;
20 changes: 19 additions & 1 deletion tests/translation-service.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@
* For licensing, see LICENSE.md.
*/

/* globals window */

import { translate, add, _clear } from '../src/translation-service';

describe( 'translation-service', () => {
beforeEach( () => {
afterEach( () => {
_clear();
} );

Expand Down Expand Up @@ -45,6 +47,17 @@ describe( 'translation-service', () => {
expect( translation ).to.be.equal( 'Bold' );
} );

it( 'should use provided language if only one is provided', () => {
add( 'pl', {
'OK': 'OK',
'Cancel [context: reject]': 'Anuluj'
} );

const translation = translate( 'de', 'Cancel [context: reject]' );

expect( translation ).to.be.equal( 'Anuluj' );
} );

it( 'should be able to merge translations', () => {
add( 'pl', {
'OK': 'OK',
Expand All @@ -62,4 +75,9 @@ describe( 'translation-service', () => {
expect( translationPL ).to.be.equal( 'Anuluj' );
expect( translationEN ).to.be.equal( 'Cancel' );
} );

it( 'should expose `add` function globally', () => {
expect( window.CKEDITOR_TRANSLATIONS ).to.be.an( 'object' );
expect( window.CKEDITOR_TRANSLATIONS.add ).to.be.a( 'function' );
} );
} );

0 comments on commit a51767a

Please sign in to comment.