Building Multilingual Websites in Drupal 7 Robin Puga Language embodies the intellectual wealth of the people who use it. ~ Kenneth Hale
Jan 15, 2015
Building Multilingual Websitesin Drupal 7
Robin Puga
Language embodies the intellectual wealth of the people who use it. ~ Kenneth Hale
Overview
● Covering the basics
● Multilingual websites in Drupal 7
● Working with translators
● What’s happening in Drupal 8
http://affinitybridge.com
Basics
● Gettext is an internationalization (i18n) system used for writing multilingual programs
● Drupal Code $str = t("My name is @name.\n", array('@name' => $user->name));
● fr.po file #: src/name.module:36 msgid "My name is @name.\n" msgstr "Je m'appelle @name.\n"
http://affinitybridge.com
Blasts in the past - Drupal 5 & 6
http://affinitybridge.comhttp://s.coop/d6convertlang
Drupal 7
● Definitive Guide by Gábor Hojtsyhttp://hojtsy.hu/multilingual-drupal7Read it!
● Books Drupal 7 Multilingual SitesBy Kristen Pol
http://affinitybridge.com
Drupal 7
● University of Ottawa Calendarhttp://uocal.uottawa.ca English / French
● Participediahttp://Participedia.net English then German
http://affinitybridge.com
Modules for Drupal 7
● Locale module in core
● Internationalization or i18n module
● Localization Update module
● Entity Translation module
http://affinitybridge.com
Setup for Multiple Languages
● Add languages
● Import the .po files
● Configure detection and selection
● Configure your site content types
http://affinitybridge.com
Node level translations
● Now using Entity Translation module
● Setting up the content type
● Synchronizing fields
● Translating content using translate tab
●http://affinitybridge.com
Entity translations
● Allows translations for entities in Drupal
● User accounts fields
● Comments
● Any entities
http://affinitybridge.com
Field level translations
● One node with translatable fields
● Use case: Products in Commerce
http://affinitybridge.com
Other Modules for Drupal 7
● Variable module
● Translation Table module
● Potx module
● Localization Client module
● Translation Helpers modulehttp://affinitybridge.com
Translating your site
● Menus● Same page hierarchy - translate menu links● Different page hierarchy options:
● One menu per language, or
● Add menu links in different languages
● Blocks ● Now translatable. Works great for static blocks
http://affinitybridge.com
Translating your site
● Taxonomy terms● Localize - one term with translated title
● Translate - different terms per language
● Views● Filter content by user language● Translate view titles via Translation Interface
http://affinitybridge.com
Translation Interface
● Overview● Translation Table● Translate - find strings & translate them● Import - import .po files● Strings - refresh translation strings● Update - grabs po files and updates strings● Export - export po files from db strings● Extract - export po files from code files
http://affinitybridge.com
Potential Pitfalls
● Indexing in Solr● Index language fields and filter views by language
fields.
● Adding new language to existing site● Synchronized fields created in English that have
translations added later can cause problems.
●
●http://affinitybridge.com
Code Example
Grab this install profile for En/Fr with tools:
https://github.com/robinpuga/multilang
drush make --working-copy
--translations=fr stub.make ../multilang_site
http://affinitybridge.com
● Translation workflows offline ○ Working with .po files○ Can be difficult to understand string context
■ “Home” = house or homepage
● Translation workflows online○ Localization Client ○ Access to Translation Tools○ Identifying content that needs translation
Working with Translators
http://affinitybridge.com
Basics
● Gettext is an internationalization (i18n) system used for writing multilingual programs
● Drupal Code $str = t("My name is @name.\n", array('@name' => $user->name));
● fr.po file #: src/name.module:36 msgid "My name is @name.\n" msgstr "Je m'appelle @name.\n"
http://affinitybridge.com
.Po files beyond the basics
● Translation Contexts $str = t("Home", array(), array('context' => 'Navigation');
● Plural strings // These strings are run through the t() function. $str = format_plural($count, ‘1 comment‘, ‘@count comments’);
● fr.po file for plurals #: src/name.module:36msgid "1 comment"msgid_plural "@count comments"msgstr[0] "1 commentaire"msgstr[1] "@count commentaires"
http://affinitybridge.com
What’s happening in Drupal 8
● Much more in core
● Much of i18n functionality rolled into core
● Better language detection and config
● Name transliteration for machine names
http://affinitybridge.com
Where to find more info & support
● Follow Gábor - http://hojtsy.hu/
● https://localize.drupal.org/news
● https://groups.drupal.org/internationalization
● #drupal-i18n (i18n = internationalization)
● #drupal-l10n (l10n = localization)
http://affinitybridge.com
Questions?