Search code examples
internationalizationexpressionengine

Expression Engine i18n


Does Expression Engine have a built-in solution for i18n (internationalization)?

I have to build a multi-language site, and would like to know the best approaches in EE for doing so.


Solution

  • There are many ways you can create a multilingual or country-specific site in ExpressionEngine to deliver content specific to each language/country.

    The two most popular solutions are summarized from the following ExpressionEngine Wiki articles:

    MultiLingual Websites in ExpressionEngine

    The basic idea is to present your content in different languages using a combination of URL Segments, custom fields and a bit of PHP.

    Advantages

    • Single entry manages multiple languages
    • Simple URL structure

    As an example, say you have a 3-language site: English (en), Spanish (es) and German (de).

    For every piece of content in your site, you'd create a custom field with the language identifier as a postfix (or prefix, whatever you prefer) to the fields.

    Your custom field names might look like this:

    custom_field_en
    custom_field_es
    custom_field_de
    

    To switch between languages, simply add a corresponding URL segment (/en, /es or /de) that matches the language:

    example.com/template_group/template/en
    example.com/template_group/template/es
    example.com/template_group/template/de
    

    The main advantage of this approach is that it keeps all versions of your content inside a single entry, making updates and edits easy and consistent.


    MultiLingual Websites in ExpressionEngine, Alternative

    The alternative approach idea is to create sub-directories for each country, and use ExpressionEngine's path.php Global Variables to hold the country code and/or language as a variable.

    Advantages

    • No PHP needed
    • No need to keep track of which segment holds the language variable
    • Elegant URL structure

    Using the same 3-languages as an example from the first method, you would create a new directory in the root of your EE install and name it after the country code of the language you want to add:

    Your folder structure might look like this:

    + /de
    + /en
    + /es
    index.php
    + /images
    + /system
    + /themes
    

    To allow this method work, place a copy of the main index.php inside each of the language directories. You would then modify each file by assigning variables corresponding to each language's directory:

    $assign_to_config['site_index'] = 'http://www.example.com/en/';
    $assign_to_config['global_vars'] = array(
        "country_code" => "en",
        "language" => "english"
    );
    

    The URLs built will use whatever language/country designation you choose:

    example.com/es-MX/template_group/template/
    example.com/MX/template_group/template/
    

    The main advantage of the alternative approach is using Global Variables, leveraging the fact they are are parsed very early, and can be used almost anywhere in templates.

    See: ExpressionEngine's Parse Order (PDF, 33 KB)


    Other Solutions

    Embracing the philosophy of ExpressionEngine, the flexibility you're given as a designer/developer allows you to tailor a custom solution that suits your unique needs.

    If either of these approaches don't quite meet your needs, you can eaily craft your own method or take a hybrid approach.

    With this in mind, a good starting point would be to look into the Multilingual Add-Ons at Devot-ee that may aide in your development.