views:

269

answers:

4

While developing AJAX program, I met the design decision to make string I18N in JavaScript.code. Some string is only used by JavaScript. For example.

$('#submit').click(function() {
    $(#target).html('Please wait while submitting...').load(someURI);
}

I'd like to I18N the string 'Please wait while submitting...'. I'm not sure what's the best way to do it. Currently, I just have the string I18N-ed in server and rendered into a javascript variable in page (I'm using PHP/wordpress).

<script>strSubmit = <?php  _e('Please wait while submitting...'); ?></script>

Then, in javascript, I just use the varialble

$('#submit').click(function() {
    $(#target).html(strSubmit).load(someURI);
}

This works, but it looks messy. Is there any better way to achieve this?

A: 

You could generate the text into the original script itself.

$('#submit').click(function() {
    $(#target).html('<?php  _e('Please wait while submitting...'); ?>').load(someURI);
}
Zed
+1  A: 

you can also automate this by using a php "preprocessor" for javascript

<script src="script.php?file=blah.js">

where script.php is something like

 function _repl($x) { return '"' . _e($x[1]) . '"'; }

 $js = file_get_contents($_GET['file']);
 $js = preg_replace_callback('~_e\("(.+?)"\)~', '_repl', $js);
 echo $js;

this will transparently replace _e(something) in javascript code with actual strings

stereofrog
Are you suggesting to generate a HTTP request for every string that requires localization?
Fedyashev Nikita
no, the whole js file is preprocessed just once on the server side
stereofrog
A: 

you could create sort of REST application, where you would fill the elements of javascript strings on document load from a service:

$(function(){
   var handleResponse = function.....; // fill your string elements from response
   var lang = "fr"; // language of localized document

   $.ajax(
       type: "GET",
       url: "/i18n.php?lang=" + lang + "&names=someName+someName1+someName2",
       success: handleResponse
   ); 
});
Juraj Blahunka
+4  A: 

You should use JSON to convert the server side l10n strings to a JSON object :

// In the <head> tag :
<script type="text/javascript" src="locales.php"></script>

and this in locales.php :

var l10n = <?php echo json_encode($l10n); ?>;

where $l10n is an array which contains all the locales, like this :

$l10n = array(
  'Please wait while submitting...' => 'Veuillez patienter durant le traitement...',
  'bah' => 'bih'
);

You can now use these strings like this in JS :

function $T(s){
  return l10n[s] || s;
}

alert($T('Please wait while submitting...'));
Fabien Ménager
Yep. This is very similar to how we do it too :)
kangax
In this approach, all I18N strings are downloaded even only few are used.
Morgan Cheng
Yes, but the files is cached by the browser, so it is downloaded only once.
Fabien Ménager
Fabien, thanks a lot for this simple yet powerful solution! :)
Fedyashev Nikita