Moodle supports localization out of the box. Your own plugins should provide at least an English language file, for example /mod/yourmod/lang/en/yourmod.php.

WARNING: After adding or changing language strings, don't forget to:

  • Purge the cache
  • Restart Apache (if you're using php caching)

Strings And Translations

Output String in Arbitrary Language

To output a translation string in an arbitrary language (instead of the current default language), you can use the string_manager class' get_string function. This is not a static function, however, so you need an instance first. Here's a oneliner to call the function properly:

echo get_string_manager()->get_string('invitation', 'yourmod', $data_object, $arbitrary_language_code);

If you don't have any data to replace variables like {$a→firstname}, simply call the same function with NULL as the 3rd argument.

The language string in $arbitrary_language_code should consist of a two character code (e.g. nl or en). Moodle uses these codes in mdl_course.lang and mdl_user.lang.

Output Formatted Date in Current Locale

echo userdate($currentcourse->startdate, get_string('strftimedate', 'langconfig'));

Output Dates in Arbitrary Locale

In addition to selecting a specific language, sometimes you also need to switch to the 'locale' of the user. For instance, you may want to output the date in the proper format, with the correct strings for the names of the months and days of the week.

$old_locale = setlocale(LC_ALL, 0);
setlocale(LC_ALL,  get_string_manager()->get_string("locale", "langconfig", NULL, $arbitrary_language_code) );
echo userdate($start_date, get_string_manager()->get_string("strftimedaydate", "langconfig", NULL, $arbitrary_language_code));
setlocale(LC_ALL, $old_locale);

This code will switch to the locale of the string retrieved from the moodledata/lang/{$arbitrary_language_code}/langconfig.php file (for the key locale). Then, a date is properly formatted and printed. And finally, we switch back to the original locale setting.

Please note that this will only work if your server actually supports the locale you're switching to (but that is a Moodle requirement anyway). To install a new locale under Ubuntu:

    sudo locale-gen nl_NL
    sudo locale-gen nl_NL.UTF-8
    sudo update-locale

Correct Database Settings for UTF-8

Moodle uses UTF-8 character encoding. Make sure that your database is configured to use UTF-8 everywhere.

mysql> show variables like '%character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

mysql> show variables like '%collat%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.01 sec)

If you're not seeing utf8, edit your /etc/mysql/my.cnf file.

[client]
## This only works in the [client] section:
default-character-set=utf8

[mysqld]
character-set-server = utf8

Save Language Files in UTF-8 Encoding

If you've got language files (e.g. mod/rainmaker/lang/fr/rainmaker.php), make sure they're in UTF-8 character encoding. In vim, use :bomb and :set fileencoding=utf-8 (and then save the file).


Personal Tools