<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[38705] trunk: I18N: Introduce a user-specific language setting.</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta" style="font-size: 105%">
<dt style="float: left; width: 6em; font-weight: bold">Revision</dt> <dd><a style="font-weight: bold" href="https://core.trac.wordpress.org/changeset/38705">38705</a><script type="application/ld+json">{"@context":"http://schema.org","@type":"EmailMessage","description":"Review this Commit","action":{"@type":"ViewAction","url":"https://core.trac.wordpress.org/changeset/38705","name":"Review Commit"}}</script></dd>
<dt style="float: left; width: 6em; font-weight: bold">Author</dt> <dd>swissspidy</dd>
<dt style="float: left; width: 6em; font-weight: bold">Date</dt> <dd>2016-10-03 07:03:41 +0000 (Mon, 03 Oct 2016)</dd>
</dl>

<pre style='padding-left: 1em; margin: 2em 0; border-left: 2px solid #ccc; line-height: 1.25; font-size: 105%; font-family: sans-serif'>I18N: Introduce a user-specific language setting.

By enabling the user to select their preferred locale when editing the profile, we allow for greater personalization of the WordPress admin and therefore a better user experience.

The back end will be displayed in the user's individual locale while the locale used on the front end equals the one set for the whole site. If the user didn't specify a locale, the site's locale will be used as a fallback. The new `locale` property of the `WP_User` class can be used to retrieve the user's locale setting.

Props ocean90, ipm-frommen, swissspidy.
Fixes <a href="https://core.trac.wordpress.org/ticket/29783">#29783</a>.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunksrcwpadminadminheaderphp">trunk/src/wp-admin/admin-header.php</a></li>
<li><a href="#trunksrcwpadminincludesclasswpplugininstalllisttablephp">trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php</a></li>
<li><a href="#trunksrcwpadminincludesclasswppressthisphp">trunk/src/wp-admin/includes/class-wp-press-this.php</a></li>
<li><a href="#trunksrcwpadminincludescreditsphp">trunk/src/wp-admin/includes/credits.php</a></li>
<li><a href="#trunksrcwpadminincludesdashboardphp">trunk/src/wp-admin/includes/dashboard.php</a></li>
<li><a href="#trunksrcwpadminincludesimportphp">trunk/src/wp-admin/includes/import.php</a></li>
<li><a href="#trunksrcwpadminincludesplugininstallphp">trunk/src/wp-admin/includes/plugin-install.php</a></li>
<li><a href="#trunksrcwpadminincludestemplatephp">trunk/src/wp-admin/includes/template.php</a></li>
<li><a href="#trunksrcwpadminincludesthemephp">trunk/src/wp-admin/includes/theme.php</a></li>
<li><a href="#trunksrcwpadminincludesuserphp">trunk/src/wp-admin/includes/user.php</a></li>
<li><a href="#trunksrcwpadminoptionsphp">trunk/src/wp-admin/options.php</a></li>
<li><a href="#trunksrcwpadminplugineditorphp">trunk/src/wp-admin/plugin-editor.php</a></li>
<li><a href="#trunksrcwpadminthemeeditorphp">trunk/src/wp-admin/theme-editor.php</a></li>
<li><a href="#trunksrcwpadminusereditphp">trunk/src/wp-admin/user-edit.php</a></li>
<li><a href="#trunksrcwpincludesclasswpeditorphp">trunk/src/wp-includes/class-wp-editor.php</a></li>
<li><a href="#trunksrcwpincludesclasswpthemephp">trunk/src/wp-includes/class-wp-theme.php</a></li>
<li><a href="#trunksrcwpincludesclasswpuserphp">trunk/src/wp-includes/class-wp-user.php</a></li>
<li><a href="#trunksrcwpincludesl10nphp">trunk/src/wp-includes/l10n.php</a></li>
<li><a href="#trunksrcwpincludesuserphp">trunk/src/wp-includes/user.php</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunktestsphpunittestsl10ngetUserLocalephp">trunk/tests/phpunit/tests/l10n/getUserLocale.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunksrcwpadminadminheaderphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/admin-header.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/admin-header.php       2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/admin-header.php 2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -156,7 +156,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> $admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', floatval( get_bloginfo( 'version' ) ) );
</span><span class="cx" style="display: block; padding: 0 10px"> $admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', get_bloginfo( 'version' ) ) );
</span><span class="cx" style="display: block; padding: 0 10px"> $admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> if ( wp_is_mobile() )
</span><span class="cx" style="display: block; padding: 0 10px">        $admin_body_class .= ' mobile';
</span></span></pre></div>
<a id="trunksrcwpadminincludesclasswpplugininstalllisttablephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php        2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/class-wp-plugin-install-list-table.php  2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -134,7 +134,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                'active_installs' => true
</span><span class="cx" style="display: block; padding: 0 10px">                        ),
</span><span class="cx" style="display: block; padding: 0 10px">                        // Send the locale and installed plugin slugs to the API so it can provide context-sensitive results.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'locale' => get_locale(),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'locale' => get_user_locale(),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'installed_plugins' => $this->get_installed_plugin_slugs(),
</span><span class="cx" style="display: block; padding: 0 10px">                );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpadminincludesclasswppressthisphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/class-wp-press-this.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/class-wp-press-this.php       2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/class-wp-press-this.php 2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1312,7 +1312,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        $admin_body_class .= ' branch-' . str_replace( array( '.', ',' ), '-', floatval( $wp_version ) );
</span><span class="cx" style="display: block; padding: 0 10px">        $admin_body_class .= ' version-' . str_replace( '.', '-', preg_replace( '/^([.0-9]+).*/', '$1', $wp_version ) );
</span><span class="cx" style="display: block; padding: 0 10px">        $admin_body_class .= ' admin-color-' . sanitize_html_class( get_user_option( 'admin_color' ), 'fresh' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /** This filter is documented in wp-admin/admin-header.php */
</span><span class="cx" style="display: block; padding: 0 10px">        $admin_body_classes = apply_filters( 'admin_body_class', '' );
</span></span></pre></div>
<a id="trunksrcwpadminincludescreditsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/credits.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/credits.php   2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/credits.php     2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -16,7 +16,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_credits() {
</span><span class="cx" style="display: block; padding: 0 10px">        $wp_version = get_bloginfo( 'version' );
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $locale = get_locale();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $locale = get_user_locale();
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $results = get_site_transient( 'wordpress_credits_' . $locale );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpadminincludesdashboardphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/dashboard.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/dashboard.php 2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/dashboard.php   2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1353,7 +1353,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $notice .= "<p class='browser-update-nag{$browser_nag_class}'>{$msg}</p>";
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                $browsehappy = 'http://browsehappy.com/';
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $locale = get_locale();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $locale = get_user_locale();
</ins><span class="cx" style="display: block; padding: 0 10px">                 if ( 'en_US' !== $locale )
</span><span class="cx" style="display: block; padding: 0 10px">                        $browsehappy = add_query_arg( 'locale', $locale, $browsehappy );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpadminincludesimportphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/import.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/import.php    2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/import.php      2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -125,13 +125,13 @@
</span><span class="cx" style="display: block; padding: 0 10px"> function wp_get_popular_importers() {
</span><span class="cx" style="display: block; padding: 0 10px">        include( ABSPATH . WPINC . '/version.php' ); // include an unmodified $wp_version
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $locale = get_locale();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $locale = get_user_locale();
</ins><span class="cx" style="display: block; padding: 0 10px">         $cache_key = 'popular_importers_' . md5( $locale . $wp_version );
</span><span class="cx" style="display: block; padding: 0 10px">        $popular_importers = get_site_transient( $cache_key );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! $popular_importers ) {
</span><span class="cx" style="display: block; padding: 0 10px">                $url = add_query_arg( array(
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        'locale'  => get_locale(),
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 'locale'  => get_user_locale(),
</ins><span class="cx" style="display: block; padding: 0 10px">                         'version' => $wp_version,
</span><span class="cx" style="display: block; padding: 0 10px">                ), 'http://api.wordpress.org/core/importers/1.1/' );
</span><span class="cx" style="display: block; padding: 0 10px">                $options = array( 'user-agent' => 'WordPress/' . $wp_version . '; ' . home_url() );
</span></span></pre></div>
<a id="trunksrcwpadminincludesplugininstallphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/plugin-install.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/plugin-install.php    2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/plugin-install.php      2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -109,7 +109,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! isset( $args->locale ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $args->locale = get_locale();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $args->locale = get_user_locale();
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre></div>
<a id="trunksrcwpadminincludestemplatephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/template.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/template.php  2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/template.php    2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1622,7 +1622,7 @@
</span><span class="cx" style="display: block; padding: 0 10px"> /** This action is documented in wp-admin/admin-header.php */
</span><span class="cx" style="display: block; padding: 0 10px"> do_action( 'admin_head' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+$admin_body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> if ( is_rtl() )
</span><span class="cx" style="display: block; padding: 0 10px">        $admin_body_class .= ' rtl';
</span></span></pre></div>
<a id="trunksrcwpadminincludesthemephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/theme.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/theme.php     2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/theme.php       2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -412,7 +412,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( ! isset( $args->locale ) ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $args->locale = get_locale();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $args->locale = get_user_locale();
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre></div>
<a id="trunksrcwpadminincludesuserphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/includes/user.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/includes/user.php      2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/includes/user.php        2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -94,6 +94,16 @@
</span><span class="cx" style="display: block; padding: 0 10px">                $user->rich_editing = isset( $_POST['rich_editing'] ) && 'false' == $_POST['rich_editing'] ? 'false' : 'true';
</span><span class="cx" style="display: block; padding: 0 10px">                $user->admin_color = isset( $_POST['admin_color'] ) ? sanitize_text_field( $_POST['admin_color'] ) : 'fresh';
</span><span class="cx" style="display: block; padding: 0 10px">                $user->show_admin_bar_front = isset( $_POST['admin_bar_front'] ) ? 'true' : 'false';
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                $user->locale = '';
+
+               if ( isset( $_POST['locale'] ) ) {
+                       $locale = sanitize_text_field( $_POST['locale'] );
+                       if ( ! in_array( $locale, get_available_languages(), true ) ) {
+                               $locale = '';
+                       }
+
+                       $user->locale = ( '' === $locale ) ? 'en_US' : $locale;
+               }
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $user->comment_shortcuts = isset( $_POST['comment_shortcuts'] ) && 'true' == $_POST['comment_shortcuts'] ? 'true' : '';
</span></span></pre></div>
<a id="trunksrcwpadminoptionsphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/options.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/options.php    2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/options.php      2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -209,19 +209,23 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        $value = null;
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( isset( $_POST[ $option ] ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $value = $_POST[ $option ];
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                if ( ! is_array( $value ) )
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         if ( ! is_array( $value ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                                         $value = trim( $value );
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                                }
</ins><span class="cx" style="display: block; padding: 0 10px">                                 $value = wp_unslash( $value );
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px">                        update_option( $option, $value );
</span><span class="cx" style="display: block; padding: 0 10px">                }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                // Switch translation in case WPLANG was changed.
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $language = get_option( 'WPLANG' );
-               if ( $language ) {
-                       load_default_textdomain( $language );
-               } else {
-                       unload_textdomain( 'default' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $language      = get_option( 'WPLANG' );
+               $user_language = get_user_locale();
+               if ( $language === $user_language ) {
+                       if ( $language ) {
+                               load_default_textdomain( $language );
+                       } else {
+                               unload_textdomain( 'default' );
+                       }
</ins><span class="cx" style="display: block; padding: 0 10px">                 }
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpadminplugineditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/plugin-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/plugin-editor.php      2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/plugin-editor.php        2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -260,7 +260,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                <input type="hidden" name="scrollto" id="scrollto" value="<?php echo $scrollto; ?>" />
</span><span class="cx" style="display: block; padding: 0 10px">                </div>
</span><span class="cx" style="display: block; padding: 0 10px">                <?php if ( !empty( $docs_select ) ) : ?>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <div id="documentation" class="hide-if-no-js"><label for="docs-list"><?php _e('Documentation:') ?></label> <?php echo $docs_select ?> <input type="button" class="button" value="<?php esc_attr_e( 'Look Up' ) ?> " onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_locale() ) ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ) ?>&amp;redirect=true'); }" /></div>
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         <div id="documentation" class="hide-if-no-js"><label for="docs-list"><?php _e('Documentation:') ?></label> <?php echo $docs_select ?> <input type="button" class="button" value="<?php esc_attr_e( 'Look Up' ) ?> " onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_user_locale() ) ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ) ?>&amp;redirect=true'); }" /></div>
</ins><span class="cx" style="display: block; padding: 0 10px">                 <?php endif; ?>
</span><span class="cx" style="display: block; padding: 0 10px"> <?php if ( is_writeable($real_file) ) : ?>
</span><span class="cx" style="display: block; padding: 0 10px">        <?php if ( in_array( $file, (array) get_option( 'active_plugins', array() ) ) ) { ?>
</span></span></pre></div>
<a id="trunksrcwpadminthemeeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/theme-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/theme-editor.php       2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/theme-editor.php 2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -263,7 +263,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                <div id="documentation" class="hide-if-no-js">
</span><span class="cx" style="display: block; padding: 0 10px">                <label for="docs-list"><?php _e('Documentation:') ?></label>
</span><span class="cx" style="display: block; padding: 0 10px">                <?php echo $docs_select; ?>
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                <input type="button" class="button" value="<?php esc_attr_e( 'Look Up' ); ?>" onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_locale() ) ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ) ?>&amp;redirect=true'); }" />
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         <input type="button" class="button" value="<?php esc_attr_e( 'Look Up' ); ?>" onclick="if ( '' != jQuery('#docs-list').val() ) { window.open( 'https://api.wordpress.org/core/handbook/1.0/?function=' + escape( jQuery( '#docs-list' ).val() ) + '&amp;locale=<?php echo urlencode( get_user_locale() ) ?>&amp;version=<?php echo urlencode( get_bloginfo( 'version' ) ) ?>&amp;redirect=true'); }" />
</ins><span class="cx" style="display: block; padding: 0 10px">                 </div>
</span><span class="cx" style="display: block; padding: 0 10px">        <?php endif; ?>
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunksrcwpadminusereditphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-admin/user-edit.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-admin/user-edit.php  2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-admin/user-edit.php    2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -269,7 +269,39 @@
</span><span class="cx" style="display: block; padding: 0 10px"> </fieldset>
</span><span class="cx" style="display: block; padding: 0 10px"> </td>
</span><span class="cx" style="display: block; padding: 0 10px"> </tr>
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+
</ins><span class="cx" style="display: block; padding: 0 10px"> <?php
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+$languages = get_available_languages();
+if ( $languages ) : ?>
+<tr class="user-language-wrap">
+       <th scope="row">
+               <label for="site_language"><?php _e( 'Site Language' ); ?></label>
+       </th>
+       <td>
+               <?php
+               $user_locale = get_user_option( 'locale', $profileuser->ID );
+
+               if ( 'en_US' === $user_locale ) { // en_US
+                       $user_locale = false;
+               } elseif ( ! in_array( $user_locale, $languages, true ) ) {
+                       $user_locale = get_locale();
+               }
+
+               wp_dropdown_languages( array(
+                       'name'                        => 'locale',
+                       'id'                          => 'locale',
+                       'selected'                    => $user_locale,
+                       'languages'                   => $languages,
+                       'show_available_translations' => false
+               ) );
+               ?>
+       </td>
+</tr>
+<?php
+endif;
+?>
+
+<?php
</ins><span class="cx" style="display: block; padding: 0 10px"> /**
</span><span class="cx" style="display: block; padding: 0 10px">  * Fires at the end of the 'Personal Options' settings table on the user editing screen.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpeditorphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-editor.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-editor.php 2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-includes/class-wp-editor.php   2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -351,7 +351,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( empty( self::$first_init ) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                self::$baseurl = includes_url( 'js/tinymce' );
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                                $mce_locale = get_locale();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                         $mce_locale = get_user_locale();
</ins><span class="cx" style="display: block; padding: 0 10px">                                 self::$mce_locale = $mce_locale = empty( $mce_locale ) ? 'en' : strtolower( substr( $mce_locale, 0, 2 ) ); // ISO 639-1
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                                /** This filter is documented in wp-admin/includes/media.php */
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -672,7 +672,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">                                }
</span><span class="cx" style="display: block; padding: 0 10px">                        }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                        $body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_locale() ) ) );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+                 $body_class .= ' locale-' . sanitize_html_class( strtolower( str_replace( '_', '-', get_user_locale() ) ) );
</ins><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">                        if ( !empty($set['tinymce']['body_class']) ) {
</span><span class="cx" style="display: block; padding: 0 10px">                                $body_class .= ' ' . $set['tinymce']['body_class'];
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpthemephp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-theme.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-theme.php  2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-includes/class-wp-theme.php    2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1395,7 +1395,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">         * @param array $themes Array of themes to sort, passed by reference.
</span><span class="cx" style="display: block; padding: 0 10px">         */
</span><span class="cx" style="display: block; padding: 0 10px">        public static function sort_by_name( &$themes ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                if ( 0 === strpos( get_locale(), 'en_' ) ) {
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         if ( 0 === strpos( get_user_locale(), 'en_' ) ) {
</ins><span class="cx" style="display: block; padding: 0 10px">                         uasort( $themes, array( 'WP_Theme', '_name_sort' ) );
</span><span class="cx" style="display: block; padding: 0 10px">                } else {
</span><span class="cx" style="display: block; padding: 0 10px">                        uasort( $themes, array( 'WP_Theme', '_name_sort_i18n' ) );
</span></span></pre></div>
<a id="trunksrcwpincludesclasswpuserphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/class-wp-user.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/class-wp-user.php   2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-includes/class-wp-user.php     2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -31,6 +31,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @property string $display_name
</span><span class="cx" style="display: block; padding: 0 10px">  * @property string $spam
</span><span class="cx" style="display: block; padding: 0 10px">  * @property string $deleted
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @property string $locale
</ins><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> class WP_User {
</span><span class="cx" style="display: block; padding: 0 10px">        /**
</span></span></pre></div>
<a id="trunksrcwpincludesl10nphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/l10n.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/l10n.php    2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-includes/l10n.php      2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -76,6 +76,23 @@
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px"> /**
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * Retrieves the locale of the current user.
+ *
+ * If the user has a locale set to a non-empty string then it will be
+ * returned. Otherwise it returns the locale of get_locale().
+ *
+ * @since 4.7.0
+ *
+ * @return string The locale of the current user.
+ */
+function get_user_locale() {
+       $user = wp_get_current_user();
+
+       $locale = $user->locale;
+       return ( '' === $locale ) ? get_locale() : $locale;
+}
+
+/**
</ins><span class="cx" style="display: block; padding: 0 10px">  * Retrieve the translation of $text.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * If there is no translation, or the text domain isn't loaded, the original text is returned.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -633,7 +650,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function load_default_textdomain( $locale = null ) {
</span><span class="cx" style="display: block; padding: 0 10px">        if ( null === $locale ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-                $locale = get_locale();
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+         $locale = is_admin() ? get_user_locale() : get_locale();
</ins><span class="cx" style="display: block; padding: 0 10px">         }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        // Unload previously loaded strings so we can switch translations.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1148,4 +1165,4 @@
</span><span class="cx" style="display: block; padding: 0 10px">                return false;
</span><span class="cx" style="display: block; padding: 0 10px">        }
</span><span class="cx" style="display: block; padding: 0 10px">        return $wp_locale->is_rtl();
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-}
</del><span class="cx" style="display: block; padding: 0 10px">\ No newline at end of file
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+}
</ins></span></pre></div>
<a id="trunksrcwpincludesuserphp"></a>
<div class="modfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Modified: trunk/src/wp-includes/user.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/src/wp-includes/user.php    2016-10-03 06:41:37 UTC (rev 38704)
+++ trunk/src/wp-includes/user.php      2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1358,6 +1358,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 2.0.0
</span><span class="cx" style="display: block; padding: 0 10px">  * @since 3.6.0 The `aim`, `jabber`, and `yim` fields were removed as default user contact
</span><span class="cx" style="display: block; padding: 0 10px">  *              methods for new installs. See wp_get_user_contact_methods().
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ * @since 4.7.0 The user's locale can be passed to `$userdata`.
</ins><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="cx" style="display: block; padding: 0 10px">  * @global wpdb $wpdb WordPress database abstraction object.
</span><span class="cx" style="display: block; padding: 0 10px">  *
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1392,6 +1393,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  *     @type string|bool $show_admin_bar_front Whether to display the Admin Bar for the user on the
</span><span class="cx" style="display: block; padding: 0 10px">  *                                             site's front end. Default true.
</span><span class="cx" style="display: block; padding: 0 10px">  *     @type string      $role                 User's role.
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ *     @type string      $locale               User's locale. Default empty.
</ins><span class="cx" style="display: block; padding: 0 10px">  * }
</span><span class="cx" style="display: block; padding: 0 10px">  * @return int|WP_Error The newly created user's ID or a WP_Error object if the user could not
</span><span class="cx" style="display: block; padding: 0 10px">  *                      be created.
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1606,6 +1608,8 @@
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        $meta['show_admin_bar_front'] = empty( $userdata['show_admin_bar_front'] ) ? 'true' : $userdata['show_admin_bar_front'];
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+        $meta['locale'] = isset( $userdata['locale'] ) ? $userdata['locale'] : '';
+
</ins><span class="cx" style="display: block; padding: 0 10px">         $user_nicename_check = $wpdb->get_var( $wpdb->prepare("SELECT ID FROM $wpdb->users WHERE user_nicename = %s AND user_login != %s LIMIT 1" , $user_nicename, $user_login));
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span><span class="cx" style="display: block; padding: 0 10px">        if ( $user_nicename_check ) {
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -1965,7 +1969,7 @@
</span><span class="cx" style="display: block; padding: 0 10px">  * @return array List of user keys to be populated in wp_update_user().
</span><span class="cx" style="display: block; padding: 0 10px">  */
</span><span class="cx" style="display: block; padding: 0 10px"> function _get_additional_user_keys( $user ) {
</span><del style="background-color: #fdd; text-decoration:none; display:block; padding: 0 10px">-        $keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front' );
</del><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+ $keys = array( 'first_name', 'last_name', 'nickname', 'description', 'rich_editing', 'comment_shortcuts', 'admin_color', 'use_ssl', 'show_admin_bar_front', 'locale' );
</ins><span class="cx" style="display: block; padding: 0 10px">         return array_merge( $keys, array_keys( wp_get_user_contact_methods( $user ) ) );
</span><span class="cx" style="display: block; padding: 0 10px"> }
</span><span class="cx" style="display: block; padding: 0 10px"> 
</span></span></pre></div>
<a id="trunktestsphpunittestsl10ngetUserLocalephp"></a>
<div class="addfile"><h4 style="background-color: #eee; color: inherit; margin: 1em 0; padding: 1.3em; font-size: 115%">Added: trunk/tests/phpunit/tests/l10n/getUserLocale.php</h4>
<pre class="diff"><span>
<span class="info" style="display: block; padding: 0 10px; color: #888">--- trunk/tests/phpunit/tests/l10n/getUserLocale.php                          (rev 0)
+++ trunk/tests/phpunit/tests/l10n/getUserLocale.php    2016-10-03 07:03:41 UTC (rev 38705)
</span><span class="lines" style="display: block; padding: 0 10px; color: #888">@@ -0,0 +1,78 @@
</span><ins style="background-color: #dfd; text-decoration:none; display:block; padding: 0 10px">+<?php
+
+/**
+ * @group l10n
+ * @group i18n
+ */
+class Tests_Get_User_Locale extends WP_UnitTestCase {
+       protected $user_id;
+
+       public function setUp() {
+               parent::setUp();
+
+               $this->user_id = $this->factory()->user->create( array(
+                       'role'   => 'administrator',
+                       'locale' => 'de_DE',
+               ) );
+
+               wp_set_current_user( $this->user_id );
+       }
+
+       public function tearDown() {
+               delete_user_meta( $this->user_id, 'locale' );
+               set_current_screen( 'front' );
+
+               parent::tearDown();
+       }
+
+       public function test_user_locale_property() {
+               set_current_screen( 'dashboard' );
+               $this->assertSame( 'de_DE', get_user_locale() );
+               $this->assertSame( get_user_by( 'id', $this->user_id )->locale, get_user_locale() );
+       }
+
+       public function test_update_user_locale() {
+               set_current_screen( 'dashboard' );
+               update_user_meta( $this->user_id, 'locale', 'fr_FR' );
+               $this->assertSame( 'fr_FR', get_user_locale() );
+       }
+
+       public function test_returns_site_locale_if_empty() {
+               set_current_screen( 'dashboard' );
+               update_user_meta( $this->user_id, 'locale', '' );
+               $this->assertSame( get_locale(), get_user_locale() );
+       }
+
+       public function test_returns_correct_user_locale() {
+               set_current_screen( 'dashboard' );
+               $this->assertSame( 'de_DE', get_user_locale() );
+       }
+
+       public function test_returns_correct_user_locale_on_frontend() {
+               $this->assertSame( 'de_DE', get_user_locale() );
+       }
+
+       public function test_site_locale_is_not_affected() {
+               set_current_screen( 'dashboard' );
+               $this->assertSame( 'en_US', get_locale() );
+       }
+
+       public function test_site_locale_is_not_affected_on_frontend() {
+               $this->assertSame( 'en_US', get_locale() );
+       }
+
+       public function test_user_locale_is_same_across_network() {
+               if ( ! is_multisite() ) {
+                       $this->markTestSkipped( __METHOD__ . ' requires multisite' );
+               }
+
+               $user_locale = get_user_locale();
+
+               switch_to_blog( self::factory()->blog->create() );
+               $user_locale_2 = get_user_locale();
+               restore_current_blog();
+
+               $this->assertSame( 'de_DE', $user_locale );
+               $this->assertSame( $user_locale, $user_locale_2 );
+       }
+}
</ins></span></pre>
</div>
</div>

</body>
</html>