diff --git a/index.js b/index.js index 1aa59f0..4c76282 100644 --- a/index.js +++ b/index.js @@ -219,12 +219,11 @@ function translate(options, contents, copied, filePath) { token = tail.substr(0, length); key = token.substr(options.delimiter.prefix.length); } - var next = contents.indexOf(options.delimiter.prefix, i + length + 1); for (var lang in processed) { processed[lang] += contents.substring(copied, i); - if (dictionaries[lang][key]) { + if (dictionaries[lang][key] !== undefined) { processed[lang] += dictionaries[lang][key]; } else if(options.warn) { gutil.log('Missing translation of language', lang, 'for key', key, 'in file', filePath); diff --git a/package.json b/package.json index 931755c..b961395 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gulp-international", - "version": "1.0.2", + "version": "1.0.3", "description": "A gulp plugin that creates multi language versions of your source files", "license": "Apache-2.0", "homepage": "http://github.com/mallocator/gulp-international", diff --git a/readme.md b/readme.md index 4c3a3de..56331fe 100644 --- a/readme.md +++ b/readme.md @@ -259,6 +259,49 @@ token3=translation3 +## Tips and Tricks + +### Dynamic scripts based on language + +Sometimes you have dynamic scripts that you generate where you want to react differently based on the language that is being used. For +example let's say that you have a javascript file and need the language to be available from a variable. Simply set up the plugin to run +before the script is being executed on the script itself and include a line such as ```var lang = 'R.lang'```. All you have to do to +make this working is have a key in your definition with the name "lang". + + +### Placeholder formatting + +Again if you replace the string that is already there it is east to integrate with existing formatting functions. Run the plugin before +the script is being executed and you can make use of formatters such as sprintf, util.format, console.log and others. Since it's common +to use gulp for browser projects here's a simple formatting function you can make use of (taken from +[StackOverflow](http://stackoverflow.com/questions/1038746/equivalent-of-string-format-in-jquery): + +``` +/** + * Add formating function to string objects. + * @returns {string} + */ +String.prototype.format = function () { + var args = arguments; + return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) { + if (m == "{{") { return "{"; } + if (m == "}}") { return "}"; } + return args[n]; + }); +}; +``` + +With a function like this you can create smarter translations such as: + +``` +token1={0} is {1}, isn't it? + +"R.token1".format('JS', 'awesome'); + +=> "JS is awesome, isn't it?" +``` + + ## Feature Ideas for the future Maybe I'll implement these one day, maybe not. diff --git a/test/index.test.js b/test/index.test.js index 5f6f690..5f5394b 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -201,6 +201,23 @@ describe('gulp-international', () => { }); + it('should not ignore translation values that are empty', done => { + var content = '

R.emptyToken

'; + var options = { + locales: 'test/locales', + whitelist: 'en_US' + }; + gently.expect(gutil, 'log', 1, function() { + expect.fail("Token shouldn't have been logged as missing"); + }); + helper(options, content , files => { + expect(files[0].contents.toString('utf8')).to.equal('

'); + try { gutil.log() } catch(e) {/* ignore gently cleanup */} + done(); + }); + }); + + it('should throw an error if no dictionaries have been found', done => { var options = { locales: 'test/notlocales', diff --git a/test/locales/en_US.json b/test/locales/en_US.json index 9d4dab8..0f00533 100644 --- a/test/locales/en_US.json +++ b/test/locales/en_US.json @@ -5,5 +5,6 @@ "subsection2": { "token3": "content3" } - } + }, + "emptyToken": "" } diff --git a/test/locales/lorem.ipsum b/test/locales/lorem.ipsum index f055d86..64c09b6 100644 --- a/test/locales/lorem.ipsum +++ b/test/locales/lorem.ipsum @@ -1,6 +1,6 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae convallis nunc. Curabitur consequat eros eget sodales feugiat. Donec et orci convallis, viverra arcu sed, mollis eros. In suscipit turpis erat, id pharetra dui mollis nec. Cum sociis natoque penatibus et R.token1 magnis dis parturient montes, nascetur ridiculus mus. Nam sollicitudin, dui euismod vestibulum porttitor, eros elit laoreet nibh, ut auctor leo massa ut tortor. Vestibulum eget viverra justo. Sed aliquet libero sit amet sem tristique, quis egestas lorem dictum. Integer enim leo, volutpat at erat non, molestie lobortis nibh. Nunc vestibulum iaculis eros, vel sodales diam iaculis sed. Fusce lacinia ac elit in cursus. Suspendisse potenti. R.token1 Donec porta, felis id volutpat ullamcorper, urna urna laoreet ligula, in pulvinar est diam et metus. R.token1 Donec tristique commodo est, vitae viverra urna. Pellentesque mauris mi, pellentesque vel pharetra ut, sodales ornare ex. R.token1 Donec blandit in orci vel gravida. Suspendisse risus nisi, scelerisque a sem sed, ullamcorper porta ligula. Morbi leo nunc, placerat eu ultrices sit amet, egestas sit amet ligula. Pellentesque sed odio neque. Etiam in maximus erat, porttitor luctus dui. Sed blandit ultrices sodales. Quisque dui urna, commodo non nibh at, consequat fringilla purus. Vestibulum sollicitudin mollis varius. R.token1 Vestibulum efficitur commodo nulla in ullamcorper. Donec R.token1 eu bibendum sem. Pellentesque pretium nunc in orci suscipit aliquam. Pellentesque accumsan justo sit amet lobortis convallis. -Morbi luctus eros nec R.token1 lectus dictum, a ullamcorper dui ultricies. Nulla faucibus velit in ex euismod blandit. Quisque id ipsum semper, dictum sem ut, eleifend justo. Pellentesque vel interdum ipsum. Suspendisse placerat lorem erat, interdum luctus purus consectetur nec. R.token1 Suspendisse ultrices felis lobortis nibh volutpat dictum. Quisque aliquam facilisis finibus. Class aptent taciti sociosqu R.token1 ad litora torquent per conubia nostra R.token1, per inceptos himenaeos. Aliquam diam magna, consequat sed interdum ac, pellentesque R.token1 id odio R.token1. +Morbi luctus eros nec R.token1 lectus dictum, a ullamcorper dui ultricies. Nulla faucibus velit in ex euismod blandit. Quisque id ipsum semper, dictum sem ut, eleifend justo. Pellentesque vel interdum ipsum. Suspendisse placerat lorem erat, interdum luctus purus consectetur nec. R.token1 Suspendisse ultrices felis lobortis nibh volutpat dictum. Quisque aliquam facilisis finibus. Class aptent taciti sociosqu R.token1 ad litora torquent per conubia nostra R.token1, per inceptos himenaeos. Aliquam diam magna, consequat sed interdum ac, pellentesque R.token1 id R.token1 odio. Duis tincidunt R.token1 odio in efficitur auctor. R.token1 Proin vitae aliquet risus. In tristique eu diam nec cursus. Etiam venenatis ligula sed ipsum tincidunt ornare. Nulla tincidunt lorem at malesuada efficitur. Donec ac ex quis justo commodo scelerisque eget in metus. Donec eleifend efficitur turpis eget convallis. Aenean ultrices lorem in condimentum maximus. In pellentesque purus felis, eu fermentum nisi vehicula dapibus. Ut egestas lectus enim. Quisque consequat turpis risus, vestibulum efficitur erat dictum et. Fusce placerat commodo risus. R.token1 Maecenas sodales consequat ante, lobortis sodales nunc accumsan non. Nullam dictum facilisis libero, vel tincidunt enim. Pellentesque eleifend pretium nisi. Cras sollicitudin neque sem. Donec at nulla neque. Mauris et felis pharetra, malesuada neque sit amet, egestas enim. R.token1 Aliquam vehicula ante et urna rhoncus, R.token1 lacinia viverra sapien aliquam. Aliquam rutrum quam sed feugiat aliquam. In R.token1 varius dictum libero. Curabitur ultrices dui dolor, non tincidunt tortor pulvinar molestie. In et lorem id sapien elementum molestie ut vel turpis. R.token1 Ut vel porttitor massa. Curabitur dictum leo id accumsan porttitor. Vivamus odio odio, R.token1 sollicitudin aliquam diam et, congue maximus velit. R.token1 Donec tempus, justo non rutrum condimentum, arcu tortor faucibus augue, in lobortis ex nisi id sapien. Duis in massa eget justo feugiat vehicula et sit amet dui. Donec tristique viverra diam sit amet faucibus. R.token1 Praesent vitae viverra turpis. Aenean gravida libero porta, maximus ante id, vestibulum elit. Curabitur lobortis, diam vel vulputate auctor, lorem velit porta odio, eget scelerisque augue ex in augue. Duis rhoncus urna dictum, interdum justo vel, rhoncus neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent ac magna lorem. Nam viverra tristique risus vitae ultricies. Integer eu nisi a augue consectetur sodales. Nulla congue elit cursus enim venenatis aliquet. @@ -120,7 +120,7 @@ Cras feugiat arcu lectus. Nam pretium justo ac purus imperdiet laoreet. Maecenas Ut nec nunc velit. R.token1 Proin gravida nec nibh at semper. Duis cursus, nibh non suscipit fringilla, leo enim consectetur purus, nec facilisis tellus diam et enim. Donec id ipsum in dui porttitor condimentum id non est. Quisque et euismod mi. Fusce nec blandit orci, vel imperdiet nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean at tortor molestie, scelerisque nunc vel, sagittis massa. Curabitur dapibus laoreet vulputate. Ut quis orci ut lacus posuere venenatis quis ac nisl. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac cras amet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae convallis nunc. Curabitur consequat eros eget sodales feugiat. Donec et orci convallis, viverra arcu sed, mollis eros. In suscipit turpis erat, id pharetra dui mollis nec. Cum sociis natoque penatibus et R.token1 magnis dis parturient montes, nascetur ridiculus mus. Nam sollicitudin, dui euismod vestibulum porttitor, eros elit laoreet nibh, ut auctor leo massa ut tortor. Vestibulum eget viverra justo. Sed aliquet libero sit amet sem tristique, quis egestas lorem dictum. Integer enim leo, volutpat at erat non, molestie lobortis nibh. Nunc vestibulum iaculis eros, vel sodales diam iaculis sed. Fusce lacinia ac elit in cursus. Suspendisse potenti. R.token1 Donec porta, felis id volutpat ullamcorper, urna urna laoreet ligula, in pulvinar est diam et metus. R.token1 Donec tristique commodo est, vitae viverra urna. Pellentesque mauris mi, pellentesque vel pharetra ut, sodales ornare ex. R.token1 Donec blandit in orci vel gravida. Suspendisse risus nisi, scelerisque a sem sed, ullamcorper porta ligula. Morbi leo nunc, placerat eu ultrices sit amet, egestas sit amet ligula. Pellentesque sed odio neque. Etiam in maximus erat, porttitor luctus dui. Sed blandit ultrices sodales. Quisque dui urna, commodo non nibh at, consequat fringilla purus. Vestibulum sollicitudin mollis varius. R.token1 Vestibulum efficitur commodo nulla in ullamcorper. Donec R.token1 eu bibendum sem. Pellentesque pretium nunc in orci suscipit aliquam. Pellentesque accumsan justo sit amet lobortis convallis. -Morbi luctus eros nec R.token1 lectus dictum, a ullamcorper dui ultricies. Nulla faucibus velit in ex euismod blandit. Quisque id ipsum semper, dictum sem ut, eleifend justo. Pellentesque vel interdum ipsum. Suspendisse placerat lorem erat, interdum luctus purus consectetur nec. R.token1 Suspendisse ultrices felis lobortis nibh volutpat dictum. Quisque aliquam facilisis finibus. Class aptent taciti sociosqu R.token1 ad litora torquent per conubia nostra R.token1, per inceptos himenaeos. Aliquam diam magna, consequat sed interdum ac, pellentesque R.token1 id odio R.token1. +Morbi luctus eros nec R.token1 lectus dictum, a ullamcorper dui ultricies. Nulla faucibus velit in ex euismod blandit. Quisque id ipsum semper, dictum sem ut, eleifend justo. Pellentesque vel interdum ipsum. Suspendisse placerat lorem erat, interdum luctus purus consectetur nec. R.token1 Suspendisse ultrices felis lobortis nibh volutpat dictum. Quisque aliquam facilisis finibus. Class aptent taciti sociosqu R.token1 ad litora torquent per conubia nostra R.token1, per inceptos himenaeos. Aliquam diam magna, consequat sed interdum ac, pellentesque R.token1 id R.token1 odio. Duis tincidunt R.token1 odio in efficitur auctor. R.token1 Proin vitae aliquet risus. In tristique eu diam nec cursus. Etiam venenatis ligula sed ipsum tincidunt ornare. Nulla tincidunt lorem at malesuada efficitur. Donec ac ex quis justo commodo scelerisque eget in metus. Donec eleifend efficitur turpis eget convallis. Aenean ultrices lorem in condimentum maximus. In pellentesque purus felis, eu fermentum nisi vehicula dapibus. Ut egestas lectus enim. Quisque consequat turpis risus, vestibulum efficitur erat dictum et. Fusce placerat commodo risus. R.token1 Maecenas sodales consequat ante, lobortis sodales nunc accumsan non. Nullam dictum facilisis libero, vel tincidunt enim. Pellentesque eleifend pretium nisi. Cras sollicitudin neque sem. Donec at nulla neque. Mauris et felis pharetra, malesuada neque sit amet, egestas enim. R.token1 Aliquam vehicula ante et urna rhoncus, R.token1 lacinia viverra sapien aliquam. Aliquam rutrum quam sed feugiat aliquam. In R.token1 varius dictum libero. Curabitur ultrices dui dolor, non tincidunt tortor pulvinar molestie. In et lorem id sapien elementum molestie ut vel turpis. R.token1 Ut vel porttitor massa. Curabitur dictum leo id accumsan porttitor. Vivamus odio odio, R.token1 sollicitudin aliquam diam et, congue maximus velit. R.token1 Donec tempus, justo non rutrum condimentum, arcu tortor faucibus augue, in lobortis ex nisi id sapien. Duis in massa eget justo feugiat vehicula et sit amet dui. Donec tristique viverra diam sit amet faucibus. R.token1 Praesent vitae viverra turpis. Aenean gravida libero porta, maximus ante id, vestibulum elit. Curabitur lobortis, diam vel vulputate auctor, lorem velit porta odio, eget scelerisque augue ex in augue. Duis rhoncus urna dictum, interdum justo vel, rhoncus neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent ac magna lorem. Nam viverra tristique risus vitae ultricies. Integer eu nisi a augue consectetur sodales. Nulla congue elit cursus enim venenatis aliquet. @@ -240,7 +240,7 @@ Cras feugiat arcu lectus. Nam pretium justo ac purus imperdiet laoreet. Maecenas Ut nec nunc velit. R.token1 Proin gravida nec nibh at semper. Duis cursus, nibh non suscipit fringilla, leo enim consectetur purus, nec facilisis tellus diam et enim. Donec id ipsum in dui porttitor condimentum id non est. Quisque et euismod mi. Fusce nec blandit orci, vel imperdiet nibh. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean at tortor molestie, scelerisque nunc vel, sagittis massa. Curabitur dapibus laoreet vulputate. Ut quis orci ut lacus posuere venenatis quis ac nisl. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac cras amet. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vitae convallis nunc. Curabitur consequat eros eget sodales feugiat. Donec et orci convallis, viverra arcu sed, mollis eros. In suscipit turpis erat, id pharetra dui mollis nec. Cum sociis natoque penatibus et R.token1 magnis dis parturient montes, nascetur ridiculus mus. Nam sollicitudin, dui euismod vestibulum porttitor, eros elit laoreet nibh, ut auctor leo massa ut tortor. Vestibulum eget viverra justo. Sed aliquet libero sit amet sem tristique, quis egestas lorem dictum. Integer enim leo, volutpat at erat non, molestie lobortis nibh. Nunc vestibulum iaculis eros, vel sodales diam iaculis sed. Fusce lacinia ac elit in cursus. Suspendisse potenti. R.token1 Donec porta, felis id volutpat ullamcorper, urna urna laoreet ligula, in pulvinar est diam et metus. R.token1 Donec tristique commodo est, vitae viverra urna. Pellentesque mauris mi, pellentesque vel pharetra ut, sodales ornare ex. R.token1 Donec blandit in orci vel gravida. Suspendisse risus nisi, scelerisque a sem sed, ullamcorper porta ligula. Morbi leo nunc, placerat eu ultrices sit amet, egestas sit amet ligula. Pellentesque sed odio neque. Etiam in maximus erat, porttitor luctus dui. Sed blandit ultrices sodales. Quisque dui urna, commodo non nibh at, consequat fringilla purus. Vestibulum sollicitudin mollis varius. R.token1 Vestibulum efficitur commodo nulla in ullamcorper. Donec R.token1 eu bibendum sem. Pellentesque pretium nunc in orci suscipit aliquam. Pellentesque accumsan justo sit amet lobortis convallis. -Morbi luctus eros nec R.token1 lectus dictum, a ullamcorper dui ultricies. Nulla faucibus velit in ex euismod blandit. Quisque id ipsum semper, dictum sem ut, eleifend justo. Pellentesque vel interdum ipsum. Suspendisse placerat lorem erat, interdum luctus purus consectetur nec. R.token1 Suspendisse ultrices felis lobortis nibh volutpat dictum. Quisque aliquam facilisis finibus. Class aptent taciti sociosqu R.token1 ad litora torquent per conubia nostra R.token1, per inceptos himenaeos. Aliquam diam magna, consequat sed interdum ac, pellentesque R.token1 id odio R.token1. +Morbi luctus eros nec R.token1 lectus dictum, a ullamcorper dui ultricies. Nulla faucibus velit in ex euismod blandit. Quisque id ipsum semper, dictum sem ut, eleifend justo. Pellentesque vel interdum ipsum. Suspendisse placerat lorem erat, interdum luctus purus consectetur nec. R.token1 Suspendisse ultrices felis lobortis nibh volutpat dictum. Quisque aliquam facilisis finibus. Class aptent taciti sociosqu R.token1 ad litora torquent per conubia nostra R.token1, per inceptos himenaeos. Aliquam diam magna, consequat sed interdum ac, pellentesque R.token1 id R.token1 odio. Duis tincidunt R.token1 odio in efficitur auctor. R.token1 Proin vitae aliquet risus. In tristique eu diam nec cursus. Etiam venenatis ligula sed ipsum tincidunt ornare. Nulla tincidunt lorem at malesuada efficitur. Donec ac ex quis justo commodo scelerisque eget in metus. Donec eleifend efficitur turpis eget convallis. Aenean ultrices lorem in condimentum maximus. In pellentesque purus felis, eu fermentum nisi vehicula dapibus. Ut egestas lectus enim. Quisque consequat turpis risus, vestibulum efficitur erat dictum et. Fusce placerat commodo risus. R.token1 Maecenas sodales consequat ante, lobortis sodales nunc accumsan non. Nullam dictum facilisis libero, vel tincidunt enim. Pellentesque eleifend pretium nisi. Cras sollicitudin neque sem. Donec at nulla neque. Mauris et felis pharetra, malesuada neque sit amet, egestas enim. R.token1 Aliquam vehicula ante et urna rhoncus, R.token1 lacinia viverra sapien aliquam. Aliquam rutrum quam sed feugiat aliquam. In R.token1 varius dictum libero. Curabitur ultrices dui dolor, non tincidunt tortor pulvinar molestie. In et lorem id sapien elementum molestie ut vel turpis. R.token1 Ut vel porttitor massa. Curabitur dictum leo id accumsan porttitor. Vivamus odio odio, R.token1 sollicitudin aliquam diam et, congue maximus velit. R.token1 Donec tempus, justo non rutrum condimentum, arcu tortor faucibus augue, in lobortis ex nisi id sapien. Duis in massa eget justo feugiat vehicula et sit amet dui. Donec tristique viverra diam sit amet faucibus. R.token1 Praesent vitae viverra turpis. Aenean gravida libero porta, maximus ante id, vestibulum elit. Curabitur lobortis, diam vel vulputate auctor, lorem velit porta odio, eget scelerisque augue ex in augue. Duis rhoncus urna dictum, interdum justo vel, rhoncus neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent ac magna lorem. Nam viverra tristique risus vitae ultricies. Integer eu nisi a augue consectetur sodales. Nulla congue elit cursus enim venenatis aliquet.