Upgrade to Pro — share decks privately, control downloads, hide ads and more …

WordPress Translations Demystified

WordPress Translations Demystified

An explanation of what makes WordPress for half of its user base available in their native language.

B36a3a08aab5941a1c6c144be272e413?s=128

Dominik Schilling

May 13, 2017
Tweet

More Decks by Dominik Schilling

Other Decks in Programming

Transcript

  1. WordPress Translations Demystified

  2. Or: A random guy tries to explain what makes WordPress

    for half of its user base available in their native language. Dominik Schilling WordPress Core Developer @ocean90
  3. None
  4. None
  5. wordpress.zip

  6. None
  7. None
  8. None
  9. None
  10. None
  11. Dashboard

  12. $title = __( 'Dashboard' ); wp-admin/index.php:31 gettext Functions

  13. MakePOT https://i18n.trac.wordpress.org/log/pot

  14. #: wp-admin/index.php:31 msgid "Dashboard" msgstr "" Portable Object Template (POT)

  15. #: wp-includes/admin-bar.php:743 msgid "%s comment awaiting moderation" msgid_plural "%s comments

    awaiting moderation" msgstr[0] "" msgstr[1] "" Portable Object Template (POT)
  16. MakePOT • CLI tool for PHP to create POT files

    for • WordPress Core • Plugins • Themes • WordPress.org projects • Open source: https://github.com/ocean90/wp-i18n-tools/blob/master/makepot.php • Similar to Poedit but supports additional header fields for plugins and themes
  17. How can we translate the POT file?

  18. GlotPress https://glotpress.blog/

  19. GlotPress • Lets you set up your own collaborative, web-based

    software translation tool • Previously powered by the deprecated BackPress library • Since January 18, 2016 a WordPress Plugin • https://wordpress.org/plugins/glotpress/ • Developed on GitHub: https://github.com/GlotPress/GlotPress-WP • > 35 Contributors, led by Greg Ross and Dominik Schilling
  20. translate.wordpress.org

  21. translate.wordpress.org

  22. Import of POT files • Importer runs on a cron

    job every hour • Wrapper for GlotPress’ default CLI importer • Slack notification in #polyglots channel
  23. translate.wordpress.org

  24. Language Packs es_ES.mo es_ES.po admin-es_ES.mo admin-es_ES.po admin-network-es_ES.mo admin-network-es_ES.po continents-cities-es_ES.mo continents-cities-es_ES.po

    • Export of translations in a ZIP file • Updated every 12-24 hours
  25. .po - Portable Object # Translation of WordPress - 4.7.x

    in Spanish (Spain) # This file is distributed under the same license as the WordPress - 4.7.x package. msgid "" msgstr "" "PO-Revision-Date: 2017-03-15 12:53:17+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Generator: GlotPress/2.4.0-alpha\n" "Language: es\n" "Project-Id-Version: WordPress - 4.7.x\n" #: wp-includes/admin-bar.php:354 wp-includes/admin-bar.php:449 #: wp-includes/admin-bar.php:516 wp-includes/deprecated.php:2792 #: wp-includes/deprecated.php:2794 msgid "Dashboard" msgstr "Escritorio"
  26. .mo - Machine Object de12 0495 0000 0000 0200 0000

    1c00 0000 2c00 0000 0500 0000 3c00 0000 0000 0000 5000 0000 0900 0000 5100 0000 4001 0000 5b00 0000 1000 0000 9c01 0000 0100 0000 0000 0000 0000 0000 0000 0000 0200 0000 0044 6173 6862 6f61 7264 0050 4f2d 5265 7669 7369 6f6e 2d44 6174 653a 2032 3031 362d 3039 2d32 3120 3130 3a31 393a 3130 2b30 3030 300a 4d49 4d45 2d56 6572 7369 6f6e 3a20 312e 300a 436f 6e74 656e 742d 5479 7065 3a20 7465 7874 2f70 6c61 696e 3b20 6368 6172 7365 743d 5554 462d 380a 436f 6e74 656e 742d 5472 616e 7366 6572 2d45 6e63 6f64 696e 673a 2038 6269 740a 506c 7572 616c 2d46 6f72 6d73 3a20 6e70 6c75 7261 6c73 3d36 3b20 706c 7572 616c 3d6e 3d3d 3020 3f20 3020 3a20 6e3d 3d31 203f 2031 203a 206e 3d3d 3220 3f20 3220 3a20 6e25 3130 303e 3d33 2026 2620 6e25 3130 303c 3d31 3020 3f20 3320 3a20 6e25 3130 303e 3d31 3120 2626 206e 2531 3030 3c3d 3939 203f 2034 203a 2035 3b0a 582d 4765 6e65 7261 746f 723a 2047 6c6f 7450 7265 7373 2f32 2e31 2e30 2d61 6c70 6861 0a50 726f 6a65 6374 2d49 642d 5665 7273 696f 6e3a 2034 2e36 2e78 0a00 d8a7 d984 d8b1 d8a6 d98a d8b3 d98a d8a9 00
  27. WordPress Translation API

  28. None
  29. None
  30. WordPress ❤ Language Packs • Translations are stored in wp-content/languages

    • Translations are auto-updated • Translations are installed on-the-fly when switching your site language • Translations are installed asynchronously during other updates • One more reason why auto-updates should not be disabled (and why you should too)
  31. load_default_textdomain() https://developer.wordpress.org/reference/functions/ load_default_textdomain/ Core Translation API

  32. $title = __( 'Dashboard' ); wp-admin/index.php:31 gettext Functions

  33. Are language packs for plugins and themes a thing?

  34. YES. And they work more or less the same as

    core’s.
  35. Requirements • The plugin/theme uses a proper text domain registration

    • Text domain must be the same as the plugin/theme slug • Special case for WordPress 4.6+
  36. Reminder # WordPress < 4.6 my-plugin.php * Text Domain: my-plugin

    * Domain Path: /languages load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' ); # WordPress => 4.6 readme.txt: Requires at least: 4.6
  37. Requirements • The plugin/theme uses a proper text domain registration

    • Text domain must be the same as the plugin/theme slug • Exception for WordPress 4.6+ • The plugin/theme is hosted in the official WordPress directory • Nothing more. • Checkout our handbook for detailed information:
 https://make.wordpress.org/meta/handbook/documentation/translations/
  38. Good to know • Follow the #meta-language-packs channel on Slack

    • Language packs are updated 30 minutes after a change • Languages packs are generated if a project is 95% or more translated
  39. Good to know • Check the status by visiting the

    Language Packs page of your project on translate.wordpress.org
  40. None
  41. Cron Jobs wp_schedule_single_event() https://developer.wordpress.org/reference/functions/ wp_schedule_single_event/

  42. Cron Jobs wp_schedule_single_event() + Cavalcade

  43. Cavalcade https://github.com/humanmade/Cavalcade

  44. Cavalcade - Features • Guaranteed Running • Designed for Multisite

    • Horizontally Scalable • Parallel Processing • Status Monitoring
  45. Cavalcade - Setup • WordPress Plugin: • https://github.com/humanmade/Cavalcade • define(

    'DISABLE_WP_CRON', true ); • WP-CLI commands • wp cavalcade jobs • wp cavalcade log • wp cavalcade run <id> • Runner • https://github.com/humanmade/Cavalcade-Runner
  46. Who doesn’t like stats?

  47. 169 locales

  48. 1 861 editors

  49. 23 054 translators

  50. 69 722 projects

  51. 0 5000000 10000000 15000000 20000000 25000000 30000000 2010 2011 2012

    2013 2014 2015 2016 2017 605681 708589 901790 1233869 1692593 21674064 9863482 1576381 Import of plugins and themes
  52. 37 780 263 current translations

  53. 51 370 language packs

  54. 1 649 153 683 downloads of language packs

  55. The Future

  56. GlotPress • x+1: Locale glossaries, JavaScript Localization ✅ • x+2

    (now): Notes/Comments/Reject with feedback, Notifications • x+3: REST API • x+4: Theme/Templates/Design • x+5: Translation Memory
  57. Language Packs • Faster updates for core, just like for

    plugins/themes • Reduce the number of complex packages • my_MM, ja , far_IR, hu_HU, sr_RS, zh_CN • Make automatic release builds more … automatic • Move readme.html to translate.wordpress.org • No SVN
  58. Core • Performance Improvements • JavaScript Localization

  59. Thanks! Dominik Schilling @ocean90 WordPress Core Developer WordPress Developer @wearerequired