JavaScript Internationalization: The Missing Pieces

Back in 2016, work started on building a proper JavaScript internationalization API and the tooling to support it throughout WordPress core and WordPress.org. Many ideas and patches were being discussed. A summary of that can be found in this blog post. With Gutenberg on the rise, JavaScript I18N is more urgent than ever. WordPress needs a robust solution for that, and some things have already been built. Let’s have a look at where we currently stand.

Status Quo

Right now, Gutenberg is using a custom built JS I18N library that is similar to the one originally proposed in 2016 as part of #20491. It lies on top of a library called Jed which bring Gettext functionality to JavaScript. This means developers can use the same __() function as in PHP and therefore don’t have to learn anything new. WordPress can take it from there.

Unfortunately, WordPress doesn’t yet support JS I18N library. Gutenberg (or any other plugin that uses said library, really) has to jump through quite some hoops to actually localize their JavaScript:

  1. Scan JavaScript files to extract internationalization functions and create a POT file using tools like babel-plugin-makepotPoedit or xgettext-js.
  2. Use that POT file to write the exact same internationalization functions in a “fake” PHP file that can be scanned by the WordPress.org translation platform. This will result in PO and MO files containing all of your plugin’s translations.
  3. Figure out a way to load these translations and make them available to your JavaScript using wp_add_inline_script(). Ideally you’d only load the ones needed by that specific script as you don’t want to print thousands of strings in that inline JS when you only need a few of them.

An example of that process can be found in my demo Gutenberg I18N Block plugin.

At this point you might want to go back to good old wp_localize_script() and simply keep using that for internationalization purposes. I don’t blame you.

However, this complicated process is only needed because the work on JavaScript internationalization is far from done yet. Gutenberg made it quite obvious where things need to be improved.

What’s Missing

Scanning JavaScript files for internationalization functions

First and foremost, the WordPress.org translation platform needs to be able to scan JavaScript files for internationalization functions in addition to just the PHP files. However, that’s not as straightforward as it sounds.

The platform uses a script called makepot.php to scan PHP files all across the WordPress.org ecosystem, i.e. core, meta, and all default themes. In addition to regular Gettext function calls it also scans plugin and theme file headers. Being included in many other libraries, makepot is a widely used tool. Most recently, its functionality was ported to a WP-CLI command to make string extraction easier to use.

On the other side we have babel-plugin-makepot, a tool written in JavaScript to scan JavaScript files. With the ECMAScript standard evolving so quickly, it is natural to write such a tool in the same language. However, it’s not a requirement, as this pull request for said WP-CLI command demonstrates. This opens some questions:

Can we simply use that Babel plugin on WordPress.org? What happens to makepot.php? What are the implications for all the developers out there not hosting their projects on WordPress.org? Not everyone uses the Babel transpiler, and certainly not everyone wants to use two separate tools just to extract some internationalization functions.

Loading only specific set of translations

All translations for a plugin or theme are stored in one single PO / MO file per locale. Loading these translations is a slow process.  We’ve made some improvements in that regard over the years, for example by introducing just-in-time loading of translations in WordPress 4.6.

However, if you only need a handful of translations for a single script in your plugin, it does not make sense to load the entire MO file which can be dozens of kilobytes in size. There’s currently no way to load only a specific set of translations in WordPress. This is something that came up in Gutenberg before, see issue 6015.

Binary MO files don’t make sense in a JavaScript context anyway. Lucky for us, GlotPress—the software that powers translate.wordpress.org—has been able to export translations in a Jed-compatible JSON format since 2016. We just need to use that to export a JSON file for all strings extracted from JavaScript files

So in theory the WordPress.org translation platform could export PO and MO files as usual for strings extracted from PHP files, and a JSON file for all strings coming from JavaScript files. This would be already a huge improvement. But can we take this even further?

Option A

Use a different text domain per JavaScript module. Export a JSON file per text domain. This is appealing, but has to be ruled out quickly: the text domain is not known to GlotPress and is not stored in the database or anything.

Option B

GlotPress doesn’t know about the text domain, but it does know a string’s source file. What if it would export one JSON file per source file it has scanned? This way WordPress has full control over the translations and one could specify which JSON files need to be loaded for a specific module.

The big drawback here: a single module might consist of dozens of source files. Having one JSON file for each of those is not going to scale well.

The built JavaScript file can’t be scanned either, because tools like UglifyJS rename functions and strip out comments.

Option C

Don’t do anything fancy. Sticking with a JSON file already guarantees that a plugin doesn’t unnecessarily load all the translations needed just in PHP. So the file size is definitely smaller. Still, this file alone can be very large for an application like Gutenberg.

Option D

Keep one single JSON file for all translations, but use some PHP code to only ever pass the strings to a module / script handle that it actually needs. However, there’s probably no real benefit in doing so.

Easily load translations

Up until WordPress 4.6, developers needed to use load_plugin_textdomain or load_theme_textdomain() to make sure translations are properly loaded. Now, you only need to use the various translation functions and the rest just works. The only requirement is that your translation files reside in wp-content/languages. This is usually the case when your project is hosted on WordPress.org.

We should aim for a similar experience for JavaScript translations as well. While just-in-time loading of translation files via HTTP isn’t really possible due to the asynchronous nature of JavaScript, WordPress should still make it as easy as possible.

Imagine having a plugin foo-plugin and you’re enqueuing your JavaScript like this:

wp_enqueue_script( 'foo-script', plugins_url( '/foo-script.js' , __FILE__ ) );

Ideally, all you’d need to do to translate it is calling a function like load_js_textdomain( 'foo-plugin' ).  WordPress would then do all the heavy lifting.

However, other options might exist, and this solution would need to be tested in the wild with bigger projects like Gutenberg.

Discussion

Bringing a JavaScript I18N API to WordPress will have a huge impact. We need to make sure we end up with a solid plan that works for as many plugins and themes as possible.

Ideally, we hold a separate JS I18N meeting with all the teams primarily involved: #core-i18n, #core-js, #core-editor, #meta-i18n and #cli. Everyone is welcome to attend though 🎉

I suggest the following date for such a meeting: Tuesday, May 8 15:00 UTC. Of course I’m open for other suggestions. The Slack channel would be #core-i18n.

At this meeting we can discuss the missing pieces outlined in this post and the overall next steps for JavaScript I18N in WordPress.

If you have any questions or concerns about this post or the overall topic, please leave a comment below.

+make.wordpress.org/polyglots

Dev Chat Summary: August 23rd (4.9 week 4)

This post summarizes the dev chat meeting from August 23rd (agendaSlack archive).

Review 4.9-early tickets

  • Items in Trac all seem to need owners, especially since they were all tagged 4.8-early as well
  • Should also include work on CodeMirror which needs more testing and contributions
    • Can currently be downloaded from the latest tagged release
    • Feedback is best on GitHub Issues for now, until the plugin is merged
    • Will work to get it into the w.org repo for easier installation
  • #39693 could use a review from another committer

Gutenberg testing

  • Gutenberg just released v0.9.0 and if you haven’t tested in a while this would be a good release to get into testing and provide feedback
  • Development is progressing and feedback is really important
  • Two tests are described in the handbook, you can also give your feedback via the plugin forum

Future support for ancient versions of WordPress

  • Discussion started previously in #core
  • @jorbin: is it time for us to stop backporting so far? Does anyone object? If not, Does anyone have ideas for how to go about it, or suggestions for me to put together a proposal on it?
  • @joemcgill: I would like to see a published proposal outlining reasons, usage data, and any tradeoffs/considerations and leave a bit of time for feedback before definitely doing this.
  • W.org Stats shows 3.7 is about 0.4%
  • @mikeschroder: We chatted about this at the summit, and about enabling protections for upgrades for major versions like we do for minor ones.
  • @ocean90: We should start with 3.7.z to 3.8.z. Note that this is already a huge step because 3.8 includes the new admin design.
  • @jorbin: I will work on the proposal. I’ll ping some of the committers and other active contributors who have contributed to this conversation to review it before publishing.

General announcements

#4-9, #dev-chat, #summary

Welcome back the latest issue of Week in Core, covering changes [40857-40877]. Here are the highlights:

  • 21 commits
  • 25 contributors
  • 43 tickets created
  • 3 tickets reopened
  • 46 tickets closed

Ticket numbers based on trac timeline for the period above. The following is a summary of commits, organized by component.

Code Changes

Administration

  • Dashboard: Better titles for the Recent Drafts widget. [40877] #37595

Build/Test Tools

  • Fix PHP 5.2 compatibility for grandchild methods which expect exceptions to be raised. [40876] #39822
  • Fixed support of PHPUnit_Framework_TestCase as the base class. [40873] #39822

Bundled Theme

Help/About

I18N

  • Improve translator comments for strings in the community events widget. [40866] #40865

Media

  • Fix an issue selecting media when clicking item edges. [40874] #40578

Misc

Networks and Sites

TinyMCE

  • Force urlencoding of commas in URLs added by plugins to prevent warnings about missing stylesheets. [40862] #40893

Thanks to @bridgetwillard, @adamsilverstein, @afercia, @azaozz, @bhargavbhandari90, @circlecube, @dimadin, @flixos90, @francina, @iandunn, @iseulde, @jenblogs4u, @johnbillion, @johnroper100, @melchoyce, @michelleweber, @obenland, @ocean90, @psiico, @rcutmore, @soniakash, @sudar, @swissspidy, @voldemortensen, and @zachwtx for their contributions!

#week-in-core

Dev Chat Summary: June 7th (4.8 week 6)

This post summarizes the dev chat meeting from June 7th (agendaSlack archive).

4.8 timing recap and Pre-Final Release & Dry Run checklist items

  • Beta 1 went out on Friday, May 12th; Beta 2 went out on Monday, May 22nd
  • RC1 went out on Thursday, May 25th; RC2 went out on Thursday, June 1st
  • 4.8 is scheduled for June 1, 2017 at 9am EDT
  • Events widget looks ready
  • Credits API to be updated by @ocean90 tomorrow morning
  • About page update for responsive, CDN-hosted images coming from @melchoyce
  • Announcement post draft is ready to go; @jorbin & @ocean90 to help provide contributor & language count as input
  • Announcement email being drafted by @matt
  • Codex page to be updated by @jbpaul17
  • Agreed to remove “partial back to IE8” from Browser support page in Design handbook
  • tinymce/plugins/wpembed to be added to $_old_files by @ocean90
  • No new default theme, so $_new_bundled_files is fine
  • Updates to default themes and submission to repo to be done by @davidakennedy, committed by @ocean90
  • Hosts email to be drafted by @jbpaul17, email to be reviewed & sent by @jorbin
  • Systems to be covered by @vnsavage
  • grunt prerelease check for tests & standards to be run by @jorbin

4.8 Bug Scrub

  • Reviewing four tickets in Defects Awaiting Review, reported against trunk section from Report 40
  • #40929: relates to improved translator docs, punting to next minor release (4.8.1)
  • #40932: moved to Future Release
  • #40927: not a regression, moved to Future Release
  • #40906: marked as a dupe of #40685, not a blocker for 4.8

Other News

  • Customize: looking for a new contributor to work on the HTML/Code widget, a good-first-bug, please chat in #core-customize if you’re interested
  • Editor: working to get the plugin in the plugin repo so that more people can review it and provide feedback. Goal is this week.
  • Devchat coordination: will be covered in upcoming devchat

#4-8, #core, #dev-chat, #summary

Week in Core, May 24th – 30th 2017

Welcome back the latest issue of Week in Core, covering changes [40827-40856]. Here are the highlights:

  • 30 commits
  • 27 contributors
  • 40 tickets created
  • 7 tickets reopened
  • 26 tickets closed

Ticket numbers based on trac timeline for the period above. The following is a summary of commits, organized by component.

Code Changes

Build/Test Tools

  • Add a missing class to the PHPUnit 6 back compat. [40854] #39822
  • Remove mentions of HHVM from the test infrastructure on Travis for the 4.0 branch. [40833] #40548

Bundled Theme

Emoji

Help/About

  • About: Introduce design and add link to Media Widgets API dev note. [40849] #40721
  • About: Further polish for Under The Hood. [40841] #40721
  • About: Further polish for feature descriptions. [40838] #40721

Media

Misc

Plugins

REST API

  • In the admin area, ensure the REST API endpoint URL is forced to https when necessary. [40843] #36451

TinyMCE

Widgets

  • Normalize YouTube and Vimeo URLs in video shortcode (primarily for Video widget) to work around ME.js 2.22 bug. [40847] #32417, #39994, #40866
  • Ensure that audio and video files appear in media library browser upon upload. [40836] #32417, #39994, #39995, #40803
  • Supply missing descriptions for instance schema fields in media widgets. [40835] #32417
  • Prevent multiple items from being selectable when first populating a media widget. [40827] #32417

Thanks to @apmarshall @obenland, @hedgefield, @reportermike, @ryelle, @rclations, @westonruter, @adamsilverstein, @apmarshall, @azaozz, @bridgetwillard, @celloexpressions, @iandunn, @jnylen0, @johnbillion, @juhise, @karmatosed, @leemon, @matveb, @melchoyce, @mikeschroder, @mohanjith, @obenland, @ocean90, @pento, @peterwilsoncc, @peterwilsoncc, @Soean, @timmydcrawford, @voldemortensen, and @westonruter for their contributions!

#week-in-core

Week in Core, May 17th – 23th 2017

Welcome back the latest issue of Week in Core, covering changes [40771-40826]. Here are the highlights:

  • 56 commits
  • 75 contributors
  • 70 tickets created
  • 7 tickets reopened
  • 71 tickets closed

Ticket numbers based on trac timeline for the period above. The following is a summary of commits, organized by component.

Code Changes

Accessibility

Administration

  • Fix some HTML validation errors. [40823] #37004
  • Update the docs for wp_check_browser_version(). [40822] #40839
  • Dashboard: Change the cache key for dashboard RSS widget; remove the unnecessary database upgrade routine. [40803] #40702
  • Dashboard: Append the current locale to dashboard RSS widget cache key in wp_dashboard_rss_control(), for consistency with the changes to wp_dashboard_cached_rss_widget() in [33183] and [33192]. [40802] #32804, #40702
  • Dashboard: Don’t trigger an Events search when the search field is empty. [40799] #40816
  • Dashboard: Improve the Events widget spinner position after [40789]. [40794] #40735
  • Dashboard: Improve the handling of locations determined by geolocating the IP address and by entering a city name. Fix couple of edge cases, and some names. [40790] #40702
  • Dashboard: [40789] #40735
  • Dashboard: Combine methods to retreive IP [40781] #40702
  • Use consistent spacing for form elements in the Discussion Settings screen. [40779] #31594
  • Dashboard: Document request proxy for events. [40777] #40702
  • Dashboard: Properly localize data for events [40776] #40702
  • Dashboard: Always pass the IP when getting events [40774] #40702
  • Upgrade: Use correct commit no. to trigger upgrade [40773] #40702

Build/Test Tools

  • Remove mentions of HHVM from the test infrastructure on Travis for the 4.6 branch. [40818] #40548

Bundled Theme

  • Twenty Seventeen: Remove uneccessary return statement [40795] #40516

Customize

  • Docs: Improve phpdoc for WP_Customize_Manager, WP_Customize_Control, WP_Customize_Setting, and WP_Customize_Selective_Refresh. [40804] #39671
  • Docs: Add missing @since tags and phpdoc descriptions to the Custom_Image_Header class. [40788] #21785, #40231
  • Run a partial’s fallback behavior (full refresh) when selective refresh fails due to a script error. [40771] #27355, #40658

Help/About

I18N

  • Dashboard: Use get_user_locale() for the news feed cache key. [40793] #40417

Login and Registration

  • Add some margin to notices on the login screen so multiple notices remain separated. [40778] #39971

Media

Misc

  • Themes: Skip tests if ReflectionMethod::setAccessible is unavailable [40826] #
  • Post-4.8 Beta 2 bump. [40820] #
  • WordPress 4.8 Beta 2 ([40807] again) [40819] #
  • Revert [40807] unbumping from 4.8 Beta 2 back to Beta 1 due to aborted release. [40808] #
  • WordPress 4.8 Beta 2 [40807] #
  • Updates for 4.6. Merge of and to the 4.6 branch.

Quick/Bulk Edit

REST API

  • Fix changing parameters with set_param() for some requests. [40815] #40344
  • Avoid sending blank Last-Modified headers with authenticated requests. [40805] #40444
  • Do not set X-WP-Deprecated* headers as often. [40782] #40787

Themes

TinyMCE

  • Fix selecting the link node after creating a link by pasting an URL. [40801] #40818
  • Editor: When stripping paragraph tags, and there is a <br> at the beginning or the end, merge them and keep the paragraph, not the <br>. [40787] #37066
  • Fix pasting while an image with caption is selected. The image and the caption should be replaced with the pasted content. [40786] #40809
  • Provide styles for link and code boundaries. [40783] #40767

Users

  • Multisite: Handle both role change selections in site-users.php. [40780] #40113

Widgets

  • Further refine WP JS coding style in media widgets code. [40821] #32417
  • Remove core embedding support for WMV and WMA files since MediaElement.js has discontinued supporting them. [40813] #39994, #39995, #40819
  • Clarify some context information for translators. [40812] #32417, #39993, #39994, #39995
  • Remove unused JS variable to fix JSHint error introduced in [40640]. [40811] #39994
  • Introduce isHostedVideo method on VideoWidgetControl to allow plugins to extend for recognizing services beyond YouTube and Vimeo. [40810] #39994, #40808
  • Revert [40251] pending more accessible solution for showing default widget titles rather than using placeholders. [40806] #39909
  • Ensure title field for media widget will update with sanitized value after change event in addition to input event. [40785] #32417, #40805
  • Use “Add Audio” for button in Audio widget instead of generic “Add File”. [40784] #39995, #40797
  • Media: Trim whitespace in URLs provided for external embeds. [40772] #40771

Thanks to @4nickpick, @abhishekfdd, @adamsilverstein, @adamsoucie, @afercia, @arena, @arshidkv12, @azaozz, @BharatKambariya, @bradyvercher, @bridgetwillard, @coffee2code, @coreymckrill, @darshan02, @dd32, @desrosj, @emirpprime, @gma992, @iandunn, @iandunn, @iseulde, @Italian polyglots team, @iv3rson76, @jenblogs4u, @jeremyfelt, @jjcomack, @jnylen0, @joedolson, @joemcgill, @joen, @johnbillion, @juhise, @ketuchetan, @kraftbj, @leewillis77, @LiamMcArthur, @matveb, @melchoyce, @michalzuber, @michelleweber, @mihai2u, @MikeLittle, @mikeschroder, @mp518, @mrahmadawais, @netwe, @nitin, @kevadiya, @nobremarcos, @obenland, @ocean90, @odysseygate, @pento, @postpostmodern, @rellect, @rensw90, @rianrietveld, @riddhiehta02, @rmccue, @ryelle, @sagarjadhav, @sagarprajapati, @Samantha Miller., @sami.keijonen, @SergeyBiryukov, @sloisel, @sstoqnov, @stubgo, @swissspidy, @tejas5989, @timmydcrawford, @TimothyBlynJacobs, @topher1kenobe, @truongwp, @westonruter, and @zinigor for their contributions!

#week-in-core

Week in Core, May 3rd – 9th 2017

Welcome back the latest issue of Week in Core, covering changes [40569-40597]. Here are the highlights:

  • 29 commits
  • 42 contributors
  • 64 tickets created
  • 8 tickets reopened
  • 52 tickets closed

Ticket numbers based on trac timeline for the period above. The following is a summary of commits, organized by component.

Code Changes

Administration

  • Restore missing spinner when installing a new language. [40579] #40478
  • Remove unit and prefixed version from a CSS declaration. [40576] #35358
  • Accessibility: Improve the color contrast ratio of the dismiss notice buttons. [40570] #39970

Cron API

Editor

  • Add wp.editor.remove() for editors that were dynamically instantiated from JS. [40588] #35760
  • Accessibility: Make the Get Shortlink button be a real button. [40578] #26504, #40448

Embeds

  • Add screencast.com to oEmbed provider whitelist. [40574] #38367

Emoji

Media

  • Optionally return attachment id from media_sideload_image(). [40597] #19629
  • Accessibility: Improve the suggested image size text in the media views. [40573] #38932

Networks and Sites

  • Multisite: Fix filter hooks for the updating network count functions. [40596] #40703
  • Multisite: Add $network_id parameter to wp_maybe_update_network_user_counts(). [40591], [40593] #40385, #38699
  • Multisite: Add missing documentation for new $network_id parameter of wp_maybe_update_network_site_counts(). [40592] #40384
  • Multisite: Add $network_id parameter to wp_is_large_network(). [40590] #40489
  • Multisite: Introduce minimum_site_name_length filter. [40589] #39676

REST API

  • WP_REST_Request::remove_header() should canonicalize header names. [40577] #40347
  • Improve strings added after 4.7 string freeze. [40571] #39178

Themes

  • Fix missing search field in the Theme Install screen after [40572]. [40586] #34881
  • Accessibility: Wrap the installed themes search field within a form element. [40572] #34881

TinyMCE

  • Improve adding of custom UI to the MCE Factory. [40587] #40690
  • Fix linting errors in tinymce-obsolete.js. [40585] #40690
  • Remove the pre-4.6.0 tests. Move regression testing for obsolete tags and attributes to the default QUnit tests. [40584] #40690
  • Update to 4.6.0. Has many new features and bug [40583] #40690

Users

  • Multisite: Check only valid looking emails against banned domain list. [40595] #39915
  • Multisite: Validate email before checking against banned domains. [40594] #39915
  • Correct a permission check when showing the User item in the + New admin toolbar menu. [40581] #39252
  • Clear the user settings cookies when clearing auth cookies. [40580] #32567

Widgets

Thanks to @adamsilverstein, @afercia, @alexkingorg, @aryamaaru, @azaozz, @Cheffheid, @chris_dev, @cristianozanca, @danielbachhuber, @desrosj, @dl, @dotancohen, @DrewAPicture, @ENDif Media, @flixos90, @georgestephanis, @iseulde, @jeremyfelt, @joehoyle, @johnbillion, @kawauso, @kraftbj, @MatheusFD, @mattheu, @mikeschroder, @MrGregWaugh, @nacin, @ocean90, @pento, @PranaliPatel, @Presskopp, @SergeyBiryukov, @shane, @slbmeh, @soulseekah, @stormrockwell, @swissspidy, @takayukister, @tfrommen, @TimothyBlynJacobs, @trepmal, and @whyisjake for their contributions!

Week in Core, April 19th – April 25th 2017

Welcome back the latest issue of Week in Core, covering changes [40476-40556]. Here are the highlights:

  • 81 commits
  • 29 contributors
  • 90 tickets created
  • 11 tickets reopened
  • 48 tickets closed

Ticket numbers based on trac timeline for the period above. The following is a summary of commits, organized by component.

Code Changes

Administration

Build/Test Tools

  • Feeds: Remove an incorrect usage of sizeof() in a helper class used during unit testing of XML element handling. [40555] #40109
  • Add Composer files to the cache on Travis. [40554] #40539
  • Backport various recent changes to the 4.7 branch. [40547] #40539, #39822, #40548
  • Remove HHVM from the test infrastructure on Travis. [40546] #40548
  • Remove more unnecessary test skipping when erroneous situations occur. [40544] #40533
  • Introduce skipWithoutMultisite() and skipWithMultisite() methods into the test suite. [40543] #40531
  • More tweaks to the deprecated calls assertion. This needs to be triggered when there are unexpected deprecated calls or wrongdoings too. [40542] #40538
  • Only perform an assertion for deprecated calls and wrongdoings if any are expected. [40541] #40538
  • Move the setExpectedException() method into the WP_Ajax_UnitTestCase class to avoid a fatal error when PHPUnit 3.6 is in use. [40539] #39822
  • Add support for PHPUnit 6+. [40536] #39822
  • Ensure that WP_UnitTestCase::expectedDeprecated() performs an assertion to avoid risky test notices. [40535] #40538
  • Be strict about tests that do not test anything. [40534] #40538
  • Remove unnecessary checks and skips that should instead cause failures if they ever fail. [40533] #40533
  • Convert more test skipping into hard failures. These dependencies should all be present when testing. [40532] #40533
  • Correct an incorrect ms- group name. [40530] #40531
  • Add some locale debugging to the Travis config so we can determine which locales are available to test with. [40528] #40533, #19861
  • Enable verbose mode in PHPUnit so we can see which tests are being skipped, and now that the number of skipped tests has been lowered. [40527] #40533, #40531
  • Don’t trigger a skipped test when the built version of wp-embed.min.js isn’t present. [40526] #34698, #40533
  • Replace test skipping with actual assertions when dealing with the DISALLOW_UNFILTERED_HTML, DISALLOW_FILE_MODS, and DISALLOW_FILE_EDIT constants. [40525] #40533
  • Remove more skipped tests that should actually be failures if their conditions aren’t satisfied. [40524] #40533
  • Remove ancient UT ticket handling. [40523] #40533
  • Add some more tests to the ms-required and ms-excluded groups. [40522] #40531
  • Introduce ms-required and ms-excluded groups for tests. [40520] #40531
  • Don’t skip tests when php.net or dev.mysql.com are unreachable. [40519] #40533
  • Avoid skipping canonical tests that are connected to open Trac tickets. [40518] #30284, #40534
  • Canonical: Don’t skip tests if the test data is invalid. [40517] #40533

Customize

Database

Editor

  • TinyMCE: Fix cursor position after updating a wpview node. Fix hiding the inline toolbar on editor blur. [40482] #40480
  • Define $suffix before using it in _WP_Editors::print_tinymce_scripts(). [40477] #40479, #35760
  • Provide API for the editor to be dynamically instantiated via JS. First run. [40476] #35760

General

  • Accessibility: Make Safari 10 + VoiceOver announce repeated, identical, wp.a11y.speak() messages. [40479] #36853

Help/About

  • Fix typo in help text on Reading Settings screen. [40540] #40530

Menus

Networks and Sites

  • Multisite: Add $network_id parameter to wp_update_network_counts(). [40486] #40386, #38699
  • Multisite: Add $network_id parameter to wp_update_network_user_counts(). [40485] #40349, #38699
  • Multisite: Add $network_id parameter to wp_update_network_site_counts(). [40484] #37528, #38699
  • Multisite: After [37918] add support for retrieving custom site properties set by the site_details filter. [40478] #40458

Posts, Post Types

  • Correct the fallback value for the label_count argument of register_post_status(). [40516] #38686

Query

Taxonomy

  • Restore support for taxonomy ‘args’ override when querying object terms. [40514] #40496
  • Docs: Improve @param and @return entries for wp_get_post_categories(), wp_get_post_tags(), and wp_get_post_terms(). [40483] #40481

TinyMCE

Widgets

Thanks to @csloisel, @afercia, @Arena94, @azaozz, @bhargavbhandari90, @boonebgorges, @celloexpressions, @danielbachhuber, @darthaud, @dd32, @flixos90, @gitlost, @imath, @iseulde, @johnbillion, @johnjamesjacoby, @littler.chicken, @miyauchi, @ocean90, @peterwilsoncc, @philipjohn, @PieWP, @raisonon, @SergeyBiryukov, @swissspidy, @theMikeD, @timmydcrawford, @westonruter, and @xrm for their contributions!

#week-in-core

Week in Core, March 22nd – 28th, 2017

Welcome back the latest issue of Week in Core, covering changes [40307-40347]. Here are the highlights:

  • 41 commits
  • 27 contributors
  • 76 tickets created
  • 14 tickets reopened
  • 65 tickets closed

Ticket numbers based on trac timeline for the period above. The following is a summary of commits, organized by component.

Code Changes

Administration

  • List Tables: After [38703], [38706], and [40118], adjust the jQuery selector to make the selection of a range of checkboxes work again. [40327] #40056
  • Docs: Add description for $mode global in WP_MS_Sites_List_Table and WP_MS_Users_List_Table. [40310] #40208
  • Docs: Add description for $mode global in WP_Media_List_Table and WP_Posts_List_Table. [40309] #40208
  • Docs: Add missing @global entry for list table view mode in WP_Screen::render_view_mode(). [40308] #40208
  • Docs: Add missing @global entry for list table view mode in wp_ajax_inline_save(). [40307] #40208

Bundled Theme

  • Twenty Seventeen: Declare jQuery as a dependency for navigation.js. [40315] #40224
  • Twenty Seventeen: Use esc_attr_e() for translatable strings in HTML attributes. [40311] #40216

Cache API

Customize

Database

  • Tests: Use utf8mb4 max index length when creating keys. [40339] #35958

Formatting

  • Docs: Correct default value in @param entry for the $num_words parameter of wp_trim_words filter. [40322] #40248

Login and Registration

  • Avoid a potentially incorrect value for the cookie hash on multisite installations that don’t have a value in the siteurl network option. [40320-40321] #34084, #39497

Networks and Sites

  • Multisite: Respect $_wp_suspend_cache_invalidation when clearing network and site caches. [40346] #40028
  • Multisite: Allow falsy properties to be cached in site-details. [40344] #40247
  • Tests: Clarify zero path segment tests for get_network_by_path(). [40342] #37217
  • Multisite: Add lang_id support to WP_Site_Query. [40340] #40196
  • Multisite: After [40305], rename clean_site_details_cache() method as it’s not really private. [40333] #40063
  • Multisite: Add further unit tests for get_blog_details(). [40317] #40228, #40180

Posts, Post Types

  • Add missing REST API properties to WP_Post_Type class. [40329] #39986

REST API

  • Tests: Consolidate logic used to skip API fixture generation. [40341] #40041
  • Confirm the parent post object of an attachment exists in WP_REST_Posts_Controller::check_read_permission(). [40337] #39881
  • Add gmt_offset and timezone_string to the base /wp-json response. [40336] #39854
  • Use get_gmt_from_date() when preparing a draft post for response. [40324-40325] #40136

Taxonomy

  • Add missing REST API properties to WP_Taxonomy class. [40328] #39987

Themes

  • Fix incorrect annotation for __clear_multi_author_cache() function. [40334] #40063, #40262
  • Add filter for excluding directories from being scanned for template files. [40326] #38292

Users

  • Don’t push the current user’s role to the top of the list in wp_dropdown_roles(). [40323] #40162

Thanks to @afercia, @aussieguy123, @bor, @bor0, @caseypatrickdriscoll, @chesio, @clarinetlord, @danielbachhuber, @dd32, @dlh, @flixos90, @GhostToast, @jeremyfelt, @johnbillion, @johnjamesjacoby, @lukasbesch, @michelleweber, @nerrad, @ocean90, @priyankabehera155, @rachelbaker., @redrambles, @sagarkbhatt, @SergeyBiryukov, @swissspidy, and @westonruter for their contributions!

#week-in-core

Week in Core, March 8th – 14th, 2017

Welcome back the latest issue of Week in Core, covering changes [40239-40291]. Here are the highlights:

  • 53 commits
  • 22 contributors
  • 101 tickets created
  • 12 tickets reopened
  • 48 tickets closed

Ticket numbers based on trac timeline for the period above. The following is a summary of commits, organized by component.

Code Changes

Administration

Build/Test Tools

  • Tests: Use https URLs for wordpress.com assets in Tests_HTTP_Functions and Tests_Image_Functions. [40289] #31091
  • Update .travis.yml to include latest improvements from trunk. [40288] #35105, #40100, #30755, #36291, #36490
  • Switch to Node 0.12.18 when testing the 4.2 branch. [40285] #35105
  • Allow Travis CI to cache the node_modules directory. [40280-40281] #36291, #36490
  • Build/Test tools: Get Travis builds working on HHVM again. [40274] #40100
  • Build/Test tools: Don’t install PHPUnit on the travis:js builds. Saves a couple of minutes of build time. [40273] #40100
  • Build/Test tools: Switch to Node 4.7.2 when testing the 4.5 branch. [40266] #35105
  • Build/Test tools: Don’t override the wp_set_auth_cookie() and wp_clear_auth_cookie() functions. [40265] #39367
  • Docs: Remove the duplicate hook documentation for the newly introduced send_auth_cookies filter. [40264] #39367
  • On Travis CI install and use the node version which is specified in package.json. [40258] #35105
  • Build/Test tools: Account for PHP 5.2 when using Composer to install PHPUnit. [40257] #39822, #40086
  • Build/Test tools: Explicitly use PHPUnit 5.7 for the PHP 7 builds on Travis. [40255] #39822, #40086
  • Build/Test tools: Remove the unnecessary clone of the twentysixteen repo. [40253] #31550, #40066
  • Build/Test tools: Revert [40239] due to unrelated changes. [40240] #39486

Bundled Theme

  • Twenty Seventeen: Correct grammar in ‘Page Layout’ control description. [40270] #40107

Canonical

Date/Time

  • Docs: Correct @return type for calendar_week_mod(). [40254] #40077

Media

  • Improve wording of the AYS warning when permanently deleting uploads, tags, posts. [40283] #39712

Misc

  • Build/Test tools: Don’t attempt to report PHP’s extensions when running HHVM jobs on Travis. It doesn’t work. [40267] #
  • Build/test tools: Add some more debugging to Travis and bring the format of the Xdebug fix inline with branches. [40259] #
  • Updates for 4.6. Merge of and to the 4.6 branch.

Query

  • Tests: Use assertSame() for WP_Query ‘orderby’ tests. [40278] #38034

REST API

Taxonomy

  • Fix the formatting of $taxonomies parameter of 'wp_get_object_terms' filter. [40290] #40154
  • Don’t run ‘get_terms’ filter when querying for terms within get_term_by(). [40275] #21760

Themes

  • Docs: Correct the description for wp.updates.deleteTheme. [40279] #40110

Widgets

  • Customize: Show title input placeholders for widgets that have default titles when rendered. [40251] #39909

Thanks to @afercia, @azaozz, @boonebgorges, @bor0, @dingo_bastard, @dlh, @dllh, @gma992, @ig_communitysites, @jnylen0, @johnbillion, @joostdevalk, @jorbi, @lancewillett, @laurelfulford, @MattyRob, @netwe, @netweb, @ocean90, @SergeyBiryukov, @westonruter, and @zoonini for their contributions!