Drupal 8 Multilingual Initiative

The Drupal 8 Multilingual Initiative (D8MI) is aimed at making language support more advanced and widespread both in built-in core functionality and by providing (better) APIs for contributed modules to build in language support themselves. The main problems attacked are (a) insufficient and inconsistent base APIs for language (b) missing language support on some entity types and configuration (c) missing automation for interface translation. The overall architecture plan looks like the following:

D8MI overview
High level architecture overview for Drupal 8 language support

Interface translationContent language and translationConfig language and translationbase language functionality

We don't start from scratch of course, so we need to consider what is there in Drupal 7 and where do we want to get from there to Drupal 8 by keeping user data intact and gradually migrating user settings and data to the new system as we go. The Drupal 7 functionality is somewhat chaotic and spans many core modules (yellow), contrib modules (orange) and even Drupal distributions (blue):

D8MI Drupal 7 overview
Drupal 7 feature and module mapping

Localized DrupalLocaleContent translationEntity translationTranslation overviewTtileInternationalizationAdmin language

The Drupal 8 plan is to cover this functionality need introducing most features from the above mentioned modules in core well distributed in an easy to understand fashion. Breaking down to modules, language.module would provide base language handling and negotiation. Modules themselves would do language assignment for nodes, comments, etc. Then the interface translation code itself will keep on as its own service for all modules to rely on:

D8MI Drupal 8 overview
Drupal 8 feature and module mapping

Interface translationContent language and translationConfiguration language/translationBase language features

More details of this breakdown are documented on the subpages and on the issues themselves. Further resources about the initiative:

Legend:
Critical issue
Major issue
Current top priority

Currently in the works for Drupal 8

See all these issues also at http://drupal.org/project/issues/search/drupal?issue_tags=D8MI. This view of issues is automatically cached and might be out of date up to two hours at times.

To doTo reviewTo be committed
#258785: Provide more flexible settings for language on content types
feature requestnormalneeds worklanguage-contentsprint
#532512: Plural string storage is broken, editing UI is missing
bug reportnormalneeds worklanguage-uisprint
Assigned to andypost
#1439692: Rename field language properties to langcode
tasknormalneeds worklangcodelanguage-contentsprinttranslatable fields
Assigned to clemens.tolboom
#1444966: Add langcode property in taxonomy schema
feature requestnormalneeds worklangcodelanguage-contentNeeds testssprint
Assigned to csg
#1444992: Add langcode property in file schema
feature requestnormalneeds worklangcodelanguage-contentMedia Initiativesprint
#1445004: Implement custom/community string bit on translations
tasknormalneeds worklanguage-uilocalization updatesprint
Assigned to roderik
#1260640: Improve field language API DX
taskcriticalneeds workAPI additionlanguage-contentmontrealneeds backport to D7tfdxtranslatable fields
#1188394: Make title behave as a field (again)
feature requestmajoractiveEntity systemlanguage-contenttranslatable fields
#1232120: Improve documentation of field multiple language system
taskmajoractiveIssue summary initiativelanguage-contentneeds backport to D7tfdxtranslatable fields
#293318: Make Aggregator feeds into entities
feature requestnormalneeds worklanguage-content
#322995: Provide a distinct administration user interface language option
feature requestnormalactivelanguage-basenegotiationUsability
#355820: Improve query filter UI on admin/content
tasknormalneeds worklanguage-contentmontreal
#430886: Make blocks entities
feature requestnormalneeds workAPI clean-upConfiguration systemEntity systemlanguage-contentUsability
Assigned to indytechcook
#540228: Implement a UTF8-safe wordwrap()
bug reportnormalneeds worklanguage-baseneeds backport to D6needs backport to D7Needs tests
#568986: Dynamically update standard language list from localization server
tasknormalneeds worklanguage-baselocalized installUsability
#851362: Add hash column to {locales_source} to query faster locale strings
tasknormalneeds worklanguage-uineeds backport to D7upgrade path
#916388: Convert menu links and menus into entities
tasknormalactiveEntity systemlanguage-contenttokenxmlsitemap
Assigned to Dave Reid
#1068840: core/includes/standard.inc contains inaccurate country data
bug reportnormalneeds workneeds backport to D7
Assigned to TR
#1156576: Language negotiation is undocumented
bug reportnormalactivedocumentationlanguage-baseneeds backport to D7negotiation
#1164682: Switch Language Links Need Language Identifier
bug reportnormalneeds workaccessibilitylanguage-basewcag2
#1188388: Move translatable fields UI into core
feature requestnormalactiveEntity systemlanguage-contenttranslatable fields
#1220964: Number field prefix/suffix get t()'ed through format_plural()
bug reportnormalneeds worklanguage-contentlanguage-uineeds backport to D7
#1222194: Rename global $language to $language_interface
tasknormalneeds workAPI clean-uplanguage-basenegotiation
#1261212: Static cache for language_list() is not cleared in _locale_rebuild_js()
bug reportnormalneeds worklanguage-uineeds backport to D7
#1263478: Identify pieces of Drupal that could be replaced by Symfony code
tasknormalactivelanguage-basenegotiationsymfonyWSCCI
#1267520: Improve date and time localization user experience
feature requestnormalactivelanguage-config
#1272862: Clean up default language handling
tasknormalactiveAPI clean-uplanguage-base
#1279624: Add translation information to content listing admin page
feature requestnormalactivelanguage-contentmontrealUsability
#1280996: New language_select element type for form API
tasknormalneeds workDXlanguage-basemontreal
Assigned to tarmstrong
#1294946: Language detection based on session doesn't work with URL aliases
bug reportnormalneeds worklanguage-baseNeeds backport to 7.xnegotiation
Assigned to good_man
#1277776: Add field/property get/set to entities with language support
tasknormalDXEntity systemlanguage-contentmontrealsprint
Assigned to fago
#1439680: Rename $user language property to langcode
tasknormallangcodelanguage-contentsprint
Assigned to kalman.hosszu
#1439686: Rename $node language property to langcode
tasknormallangcodelanguage-contentsprint
Assigned to tstoeckler
#1270608: File-based configuration API
feature requestmajorConfiguration systemlanguage-config
#1074672: Allow language select to be rearranged inside node form
feature requestnormallanguage-contentNeeds backport to 7.xsprint
Assigned to claudiu.cristea
#1272840: Add upgrade path for language domains and validation
tasknormallanguage-baseNeeds testsnegotiationsprintUsability
Assigned to pp
Legend:
Critical issue
Major issue
Current top priority

Other related issues

See all these issues also at http://drupal.org/project/issues/search/drupal?issue_tags=D8MI. This view of issues is automatically cached and might be out of date up to two hours at times.

BackportPostponedClosed
#655048: Plural formula information blanked when importing a poorly-formed .po file
7.x-devbug reportnormalpostponedlanguage-uiNeeds backport to 6.xNeeds backport to 7.xNeeds testssprint
Assigned to Gábor Hojtsy
#673020: Tests for adding the Content-Language HTTP header to the generated page
7.x-devbug reportnormalneeds worklanguage-baseneeds backport to D7sprint
#1189834: Convert book-export-html.tpl.php to HTML5
7.x-devtasknormalfixedhtml5sprint
Assigned to cosmicdreams
#1221276: locale_get_plural() only works for a single language within a request and does not work for English
7.x-devbug reportmajorpatch (to be ported)language-uineeds backport to D7sprint
#1250800: Language domain should work regardless of ports or protocols
7.x-devbug reportcriticalneeds worklanguage-baseneeds backport to D7negotiationsprint
#1164852: Inconsistencies in field language handling
7.x-devbug reportcriticalclosed (fixed)language-contentneeds backport to D7Needs change notificationNeeds testsRelease blockertranslatable fields
#488496: Implement missing msgctx context in JS translation for feature parity with t()
7.x-devtaskmajorclosed (fixed)language-uimsgctxneeds backport to D7
#381994: Machine-name fields are always in Latin characters, and should therefore always be LTR
6.x-devbug reportnormalpatch (to be ported)language-baseneeds backport to D6needs backport to D7
#404116: Provide default choices on poll translations
7.x-devbug reportminorlanguage-contentneeds backport to D6needs backport to D7Novice
Assigned to c31ck
#1020842: Error messages when importing translated strings fails are not helpful at all
7.x-devbug reportnormalneeds worklanguage-uineeds backport to D7
#1191614: Make t() formatter available as its own function
7.x-devfeature requestnormalclosed (fixed)API additionlanguage-ui
#1219236: Locale module includes 1350+ lines of unneeded code on all page loads
7.x-devtasknormalAPI changelocale-splitneeds backport to D7
#1260752: Fix _locale_languages_common_controls maxlength to conform schema
7.x-devbug reportnormalfixedlanguage-baseneeds backport to D7
#1281932: Convert Drupal.t and Drupal.formatPlural regular expressions to extended form.
7.x-devtasknormalclosed (fixed)language-uineeds backport to D7
#1314384: Remember the provider that selected the language for later use
7.x-devfeature requestnormalAPI additionlanguage-baseneeds backport to D7needs testnegotiation
#1189822: Convert maintenance-page.tpl.php to HTML5
tasknormalpostponedhtml5sprint
Assigned to rupl
#361597: CRUD API for locale source and locale target strings
taskmajorpostponedi18n sprintlanguage-uimontreal
Assigned to loganfsmyth
#1213510: A modern t()
feature requestnormalpostponedAPI changelanguage-uiNeeds benchmarks
Assigned to sun
#1218650: Separate language and locale. Proper languages for content translation.
feature requestnormalpostponed (maintainer needs more info)language-base
#1260918: Convert language globals to contexts
tasknormalpostponedlanguage-basemontrealnegotiationWSCCI
Assigned to plach
#1269832: Use Symfony / context code to retrieve HTTP language preferences
tasknormalpostponedlanguage-basenegotiationsymfony
#1368410: When viewing a node in another language as interface language, comment form should have correct language
bug reportnormalpostponed (maintainer needs more info)accessibilitylanguage-content
#1431292: Migrate date format configuration to CMI
tasknormalpostponedConfiguration systemlanguage-config
#1336170: Add locale module to upgrade tests
taskcriticalclosed (fixed)D8 upgrade pathlanguage-baselanguage-ui
Assigned to rvilar
#540294: Move node language settings from Locale to Node module
taskmajorfixedFramework Initiativelanguage-content
#1184944: Make entities classed objects, introduce CRUD support
taskmajorfixedDX (Developer Experience)Entity systemlanguage-content
#1188430: Rip out textgroup support from locale module
taskmajorclosed (fixed)Issue summary initiativelanguage-configlanguage-ui
#1215716: Introduce locale_language_save()
taskmajorclosed (fixed)API changeAPI clean-uplanguage-base
#1301040: Move language listing functionality from locale.module to a new language.module
taskmajorclosed (fixed)API clean-uplanguage-base
Assigned to Gábor Hojtsy
#1357918: Missing update for language_default in language langcode update
bug reportmajorfixedAPI clean-uplangcodelanguage-base
#221712: locale_language_from_browser() doesn't parse language tags correctly, has a broken logic
bug reportnormalclosed (fixed)language-baseneeds backport to D7negotiation
#533924: Allow different language types to be enabled separately
feature requestnormalclosed (duplicate)i18n sprintlanguage-basetranslatable fields
#555842: Remove Language Selection page when there is only one language present
feature requestnormalclosed (duplicate)language-baseUsability
#1018602: Move entity system to a module
tasknormalclosed (fixed)API clean-upConfiguration systemFramework InitiativeIssue summary initiativelanguage-content
#1164926: Nodes need to have languages specified separately for accessibility
bug reportnormalclosed (fixed)accessibilityhtml5I10nlanguage-contentwcag
#1190454: Abtract translation set concept to work with entities in general
feature requestnormalclosed (won't fix)language-content
#1216094: We call too many things 'language', clean that up
tasknormalclosed (fixed)API clean-uplangcodelanguage-baseterminology
#1219196: Move negotiation settings out to their own include file
tasknormalclosed (works as designed)language-baselocale-splitnegotiation
#1222072: Split translation editing functionality out of locale.admin.inc and locale.inc
tasknormalclosed (fixed)Framework InitiativeIssue summary initiativelanguage-uilocale-split
#1223502: Update for ripping out textgroup support in Drupal locale module
tasknormalclosed (duplicate)D8 upgrade pathlanguage-configlanguage-ui
#1231402: Drupal does not use ISO language codes, iso.inc is misleading
tasknormalclosed (fixed)API clean-upFramework Initiativehtml5language-baseUsability
#1232116: Language type constants are missing proper documentation
bug reportnormalclosed (duplicate)language-baseneeds backport to D7negotiation
#1234848: language_list() doc is missing return value
bug reportnormalclosed (fixed)language-baseneeds backport to D7
#1236680: Move path language settings from Locale to Path module
tasknormalclosed (fixed)Framework Initiativelocale-splitmontreal
#1260510: Introduce a language_load($langcode)
tasknormalclosed (fixed)language-base
#1260520: Apply language_save and language_load to the locale management UI
tasknormalclosed (duplicate)language-baselanguage-ui
Assigned to svendecabooter
#1260528: Introduce API to delete languages
tasknormalclosed (fixed)language-base
Assigned to tarmstrong
#1260716: Improve language onboarding user experience
tasknormalclosed (fixed)API changelangcodelanguage-basemontrealUsability
Assigned to Gábor Hojtsy
#1260860: Rework language list admin user interface
tasknormalclosed (fixed)language-basemontrealUsability
#1261034: Can we add hook_locale_alter ?
support requestnormalclosed (works as designed)language-ui
#1265700: Little modernization of language_default()
tasknormalclosed (fixed)API clean-uplanguage-base
#1266318: Make English a first class language
feature requestnormalclosed (fixed)language-basemontrealUsability
#1279652: Add search feature on the node listing admin page
feature requestnormalclosed (duplicate)core searchlanguage-contentmontrealUsability
#1280524: Simplify/clarify language negotiation configuration workflow
tasknormalclosed (duplicate)language-basemontrealnegotiationUsability
#1280530: Decouple domain/path negotiation setup from language configuration
tasknormalclosed (fixed)language-basemontrealnegotiationUsability
Assigned to loganfsmyth
#1280550: Make default language easier to grok and configure in language negotiation
tasknormalclosed (fixed)language-basemontrealnegotiationUsability
#1280600: Rename languages table to language
tasknormalclosed (duplicate)language-basemontreal
Assigned to lambic
#1293304: Break up locale.module, but how?
tasknormalfixedFramework InitiativeIncreases learning curvelanguage-base
#1296566: Improve usability of add language screen
tasknormalclosed (fixed)language-baseUsability
#1301148: Stop pretending we have configuration translation for languages
tasknormalclosed (fixed)API clean-uplanguage-baselanguage-configUsability
#1330922: Drupal 8 HTML 5 page template should use lang not xml:lang
bug reportnormalclosed (fixed)html5language-base
#1357912: Convert path language code schema to langcode
tasknormalclosed (fixed)API clean-upDrupalWTFlangcode
Assigned to Gábor Hojtsy
#1387586: Rename drupal_multilingual() to language_multilingual()
tasknormalclosed (fixed)API changeAPI clean-uplanguage-baseNovice
#1387608: Unify language_list() and locale_language_list()
tasknormalclosed (fixed)API clean-uplanguage-base
#1410096: Convert comment language code schema to langcode
tasknormalfixedlangcodelanguage-content
Assigned to Gábor Hojtsy
#1410114: Rename $user language property to something else
tasknormalclosed (won't fix)langcodelanguage-content
#1415764: Untangle comment module and locale module
tasknormalclosed (fixed)language-content
#1426954: Remove locale backward compatibility layer in installer
tasknormalclosed (fixed)langcodelanguage-base

Thanks to #

AdrianB Alan D. Albert Volkman Alex UA Amitaibu Andrew Schulman Andreyy Anselm Heaton Antton Aron Novak BarisW BenK Berdir Bodo Maass Bojhan Boobaa CKoch Charles Belov Countzero Crell Cyberwolf Damien Tournoud DamienMcKenna Dave Reid David Lesieur David Strauss David_Rothstein DjebbZ Dmitriy.trt Dries Désiré EclipseGc Everett Zufelt Fannon Fleshgrinder Frando Freso Gabriel Radic Garrett Albright Gerhard Killesreiter GiorgosK Hanno HnLn IceCreamYou2 Ignacio Sánchez Jacine Jeff Burnz Jelle_S JonMcL Jose Reyero JuliaKM KarenS Kristen Pol Lars Toomre LarsKramer LittleViking Michelle Mirabuck NancyDru OnkelTem Pasqualle Plascual Pol Ranko Rob Loach Roberto Gerola Ryan Weal Sborsody SeanBannister SebCorbin Seldaek Shellingfox Stefan Nagtegaal Sutharsan TR Thomas_Zahreddin Tor Arne Thune Vapes Xano Zoltán Balogh adamdicarlo akahn akejoha alberto56 alduya alex_b alexanderpas amateescu anavarre andypost animelion arianek aspilicious attiks babasse05 balagan beberlei beejeebus bensemmel bfroehle bjaspan bojanz boombatower brianV bsherwood c31ck c960657 caktux careernerd casey catch cburschka cha0s chrispomeroy chx ckng clashar claudiu.cristea clemens.tolboom colan cosmicdreams cpelham csg cweagans cwgordon7 danillonunes dcmistry dddave delmarr dereine desbeers dimduj dixon_ dmitrig01 donquixote dpearceMN drewish drifter dropcube droplet drubage dtarc dvinegla e2thex effulgentsia eggonbeagle elcuco elfur emarchak eojthebrave ericduran ezra-g fabsor fago fastangel fgm fietserwin franskuipers franz fubhy fwalch gaspaio gbentley geerlingguy giorgio79 good_man grendzy gumanist guygg hairqles hansfn hass hefox heyrocker hinikato hswong3i idflood iliphil indytechcook infowonders intuited izmeez j.somers jamiehollern jamienotweet janusman jenlampton jherencia jhodgdon jmesam joachim johnv jonaswouters joris.verschueren jrglasgow jwilson3 kaakuu kalman.hosszu keith.smith kevee kika killes@www.drop.org klausi klonos kompressaur ksenzee kwinters lambic larowlan lelizondo lilou litwol loganfsmyth lonelyrobot lslinnet lsmith77 marcingy marcushenningsen marcvangend markus_petrux martin_q matason mattyoung mermenggc mfb mgifford mikeryan mikewink mikey_p mikl mirocow mjreich mlncn moshe weitzman mr.baileys mrsinguyen mustafau naught101 nbz neclimdul nedjo neochief nevets nicholosophy nielsvm nkschaefer no_commit_credit noahb omar omercioglu oriol_e9g pfrenssen pillarsdotnet pkiraly plach podarok pounard pp pwolanin q0rban quazardous rasskull redndahead reglogge renat rfay rlmumford rocket_nova roderik rooby rupl rvilar rwt scor sethiele seutje shuklasp silverdog silverwing sourcesoft sreynen steinmb stella stevepurkiss sun sun.core svendecabooter swentel sylvain_a tarmstrong te-brian thamas thePanz theunraveler thomastorfs tim.plunkett timmillwood timofey tkoleary tobiasb toemaz tomsm tstoeckler tsvenson valokettu voxpelli walkah weakqueen99 webchick willvincent wmostrey wojtha xecstasyx xjm xmacinfo yched yhager yoroy z.stolar zilverdistel zirvap zkday zroger

Based on participation in D8MI issues (font size) using a quasi-logarithmic scale and on recent activity (boldness). Excludes the initiative lead, Gábor Hojtsy.