Tool to organize translations in JSON files [closed] Tool to organize translations in JSON files [closed] json json

Tool to organize translations in JSON files [closed]


I have not tried it (yet) but this might work: https://github.com/jcbvm/i18n-editor

Written in Java, so will (most probably) work on a Mac.


I needed the same thing myself and so I just wrote it like this:

I had 2 dropdowns with existing languages, from language 1 to language 2 was the idea.

on select both language I read the json files into arrays and displayed it with an ng-repeat using two way bindings so when the content of an input field changed, the array got updated instantly.

The apply method then uploaded the filename and the array towards a php file which wrote it to the document.

eng.json:

{  "ALBUM":{    "TITEL":"album",    "LAAD_MEER":"Load more",    "ALBUMS":"Back to albums"  },  "INFO":{    "TITEL":"information",    "HOTELS":"Hotels",    "SPORTHAL":"Sportscenter",    "INTHISHOTEL":"In this facility"  }}

my html:

<section ng-if="toSelected"         class="bg-g-r bg-u-1 card flyin"         ng-repeat="section in fromContents"         id="{{'trans'+section.TITEL}}"         class="translatorSection">    <p class="paddedText bg-u-1 blueElement">{{section.TITEL}}</p>    <div class="textContainer bg-u-1"         ng-repeat="line in section">        <p style="color:grey">{{line}}</p>        <textarea class="bg-u-1" ng-model="toContents[getKeys(toContents,$parent.$index)][getKeys(section,$index)]"                style="padding: 8px;border-radius: 10px"                ></textarea>    </div></section>

my controller:

//Bound to the dropdowns in my case$scope.fromSelected = null; //language from wich to start$scope.toSelected = null; //language i wish to extend$scope.fromContents = null;$scope.toContents = null;$scope.$watch('fromSelected', function (abbr) {    if(abbr) {        jsonFactory.getLanguageContents(abbr).then(function (data) {            $scope.fromContents = data.data;        });    }});$scope.$watch('toSelected', function (abbr) {    if(abbr) {        jsonFactory.getLanguageContents(abbr).then(function(data){            $scope.toContents = data.data;        });    }});$scope.getKeys = function (array,index){    return Object.keys(array)[index];};$scope.getToValueByKey = function (key){    return $scope.toContents[key];};$scope.apply = function (){                jsonFactory.UploadLanguage($scope.toSelected,$scope.toContents)        .then(function(data){            alert('update succesfull, please reload')        });};

Jsonfactory:

    function getLanguageContents(lang) {        var deferred = $q.defer(),            httpPromise = $http.get('languages/'+lang+'.json');        httpPromise.then(function (response) {            deferred.resolve(response);        }, function (error) {            console.error(error);        });        return deferred.promise;    }       function UploadLanguage(lang,content){            return $q(function(resolve,reject){                var xmlhttp,                    params = 'lang='+lang+'&content='+JSON.stringify(content);                if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari                    xmlhttp = new XMLHttpRequest();                }                else { // code for IE6, IE5                    xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');                }                xmlhttp.open('POST', 'http://localhost:63342/website/app/php/translator.php', true);                xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');                xmlhttp.onreadystatechange = function() {                    if (xmlhttp.readyState === 4 && xmlhttp.status === 200) {                        var data = xmlhttp.responseText;                        resolve(data);                    }else if (xmlhttp.readyState === 4){                        reject('not found');                    }                };                xmlhttp.send(params);            });        }

Read you folder with json files in javascript into some arrays, For each array just create an ng-repeat using input fields so you see the key and all you translations with it, when you made changes create a button that sends you array and the language filename to this php script:(i only accept one language at the time)

<?php  header("Access-Control-Allow-Origin: *");  $taal = $_POST["lang"];  $content = $_POST["content"];  $myfile = fopen("../languages/".$taal.".json", "w");  fwrite($myfile, $content);  fclose($myfile);  echo $taal;  echo $content;?>

It was actually very easy to create, I wanted to add it to my site, so everyone could help translating but it never got there.

I cant give all the code, but i thik this should get you started.

Result in webpage


Take a look at angular-translate: https://github.com/angular-translate/angular-translate

for all DIY folks:

You can find localized files for angular: here

These files will help you with the build-in angular filters: date, currency and number. Amazing... so far.

Now you want to use your own texts, than all you need is the power of angular.js dependency injection. Create a new file like: "myTexts_en_us.js" and use $provide.value like this:

$provide.value("myTexts", {firstText : "This is my localized text"});

For details: http://jsfiddle.net/4tRBY/24/

For real-world-use, you should add a filter: http://jsfiddle.net/4tRBY/41/

Tips:

  • Make sure to insert your new localization-file into your html by hand, JS or Server. (Server is the best choice here!)
  • if you include one of the angular-local files, you do not need to set it up in your app module. (you will have $locale automatically - see the fiddle)
  • add an id key to your $provide-value - and set the value to a language code you are using in your file - this will be come in handy for testing.