Elefant supports multilingual websites through the
I18n class, which has the following capabilities:
fr-ca -> fr -> en, in browser negotiation.
To translate the Elefant UI into a new language, copy the file
fr is the language code for the language you'll be translating into. From there, you can edit the new file and add translations for each string of text.
This reads the language from the first part of the request path. For example:
/es/my/request -> es /fr-ca/my/request -> fr-ca
The request passed to the controller is then becomes
/my/request. If no matching language is present, the full request path is sent to the controller and the default language is used.
This reads the language preference from a cookie named
lang. The cookie name can be changed in the global settings via:
negotiation_method = cookie cookie_name = lang_pref
The cookie name would now be
lang_pref. If the cookie is not set, then the default language is used.
This reads the language preference from the subdomain of the site. For example:
en.example.com -> en fr-ca.example.com -> fr-ca
If the subdomain doesn't match one of the configured languages, the default language is used.
This uses the HTTP Accept-Language string that contains their browser's language preferences. It loops through their list of preferred languages and finds the best match. The nice thing about this technique is that it automatically chooses their language if available. The downside is that not everyone sets their browser correctly, and shared computers won't necessarily have it set, or worse, set incorrectly.
The files associated with translations and internationalization are in the
The language list is in the file
lang/languages.php. It is INI-formatted and each language is a block that has the following fields:
[en-us] name = English code = en charset = UTF-8 locale = us fallback = Off default = On
The locale is optional. If present, it will call
setlocale as follows:
If missing, it simply sets it as:
The fallback should be set to Off if no fallback is needed, or to the block name of the fallback language. Here is an example using a fallback:
[en] name = English code = en charset = UTF-8 fallback = Off default = On [fr] name = ""Français"" code = fr charset = UTF-8 fallback = Off default Off [fr-ca] name = ""Français (Canadienne)"" code = fr charset = UTF-8 locale = ca fallback = fr default = Off
fr-ca will fallback to
fr before defaulting to
Each translation is a PHP file with the following structure:
<?php // lang/en.php $this->lang_hash['en'] = array ( 'string one' => 'translation one', 'string two' => 'translation two' ); ?>
Any key in this list will be translated to its value by the
I18n class. Language files are loaded when that language matches the current user's preference, or is a fallback for them. If a string is present in the fallback language but not in the preferred language, it will be used instead. If no translation can be matched, the original string to be translated is returned instead.
To generate a language file for your language, use the following command on the command line:
$ ./conf/elefant build-translation fr
fr with the language code for your language. You can then open the resulting translation file to translate the strings it found from all the templates and handlers.
The I18n library also defines a function
__() (that's two underscores) to perform translations:
<?php // perform an ordinary translation echo __ ('Translate me'); // translate but pass dynamic values to be inserted via vsprintf() echo __ ('Hello %s', $name); ?>
The second form is handy for strings that need dynamic placeholders in them. You would then use the key
'Hello %s' in your translation file.
Elefant's templates provide a simple way of marking strings for translation:
These values will automatically be replaced with calls to
i18n_get('Translate me') in the rendered template.