Wednesday, June 24, 2009

Localization - values in translated strings - my solution

I thought that this could interest someone else.

If you want to be able to translate strings which contains dynamic
data such:
"Hello, my name is Julien" where "Julien" is a name, you could do
this:

sprintf(__("Hello, my name is %s",true),"Julien");

and your translation string would be "Hello, my name is %s" which is
easy to translate.
The issue with that is that it's absolutely not handy to use in views.

What I liked to have was a function where I could pass values, such
as:

__("Hello, my name is %s and I'm %d years old",true,array("Julien",
34));
expected result:
Hello, my name is Julien and I'm 34 years old.

Id order to achive this I have changed the cake/basics.php file where
the __ function is located, basic steps are:
- add a third parameter to the function __ in order to support the
array of values
- use the vsprintf to pass an array of values to the sprintf string
- evaluate if there are any value passed otherwise use the older
behaviour

Result is very simple and looks clean to me:

/**
* Returns a translated string if one is found; Otherwise, the
submitted message.
*
* @param string $singular Text to translate
* @param boolean $return Set to true to return translated string, or
false to echo
* @return mixed translated string if $return is false string will be
echoed
* @link http://book.cakephp.org/view/693/__
*/
function __($singular, $return = false,$values=array()) {
if (!$singular) {
return;
}
if (!class_exists('I18n')) {
App::import('Core', 'i18n');
}

if ($return === false) {
if (count($values)>0) echo vsprintf(I18n::translate($singular),
$values);
else echo I18n::translate($singular);
} else {
if (count($values)>0) return vsprintf(I18n::translate($singular),
$values);
else return I18n::translate($singular);
}


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "CakePHP" group.
To post to this group, send email to cake-php@googlegroups.com
To unsubscribe from this group, send email to cake-php+unsubscribe@googlegroups.com
For more options, visit this group at http://groups.google.com/group/cake-php?hl=en
-~----------~----~----~----~------~----~------~--~---

No comments: