Version Description
- New: Keyboard navigation improvements.
- New: Tooltips now show the available keyboard shortcuts.
- New: Missing translations are now downloaded even when no changes were made.
- New: A warning is shown when some of the preferred languages aren't installed.
- New: Settings form is now hidden when JavaScript is disabled.
- Fixed: Improved setting the current locale.
- Fixed: CSS is no longer enqueued on the front end.
Download this release
Release Info
Developer | swissspidy |
Plugin | Preferred Languages |
Version | 1.4.0 |
Comparing to | |
See all releases |
Code changes from version 1.3.0 to 1.4.0
- CHANGELOG.md +10 -0
- css/preferred-languages-rtl.css +1 -1
- css/preferred-languages.css +1 -1
- inc/class-preferred-languages-textdomain-registry.php +1 -1
- inc/default-filters.php +5 -1
- inc/functions.php +145 -40
- js/preferred-languages.js +37 -41
- js/preferred-languages.min.js +1 -1
- preferred-languages.php +1 -1
- readme.txt +15 -1
CHANGELOG.md
CHANGED
@@ -1,5 +1,15 @@
|
|
1 |
# Changelog
|
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3 |
## 1.3.0
|
4 |
|
5 |
* New: Users can now choose English (United States) again as a preferred locale.
|
1 |
# Changelog
|
2 |
|
3 |
+
## 1.4.0
|
4 |
+
|
5 |
+
* New: Keyboard navigation improvements.
|
6 |
+
* New: Tooltips now show the available keyboard shortcuts.
|
7 |
+
* New: Missing translations are now downloaded even when no changes were made.
|
8 |
+
* New: A warning is shown when some of the preferred languages aren't installed.
|
9 |
+
* New: Settings form is now hidden when JavaScript is disabled.
|
10 |
+
* Fixed: Improved setting the current locale.
|
11 |
+
* Fixed: CSS is no longer enqueued on the front end.
|
12 |
+
|
13 |
## 1.3.0
|
14 |
|
15 |
* New: Users can now choose English (United States) again as a preferred locale.
|
css/preferred-languages-rtl.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.active-locales{margin:1em 0}.active-locales-list,.inactive-locales-list{width:25em;margin:0 0 1em 1em;clear:both;float:right}.active-locales-controls{clear:both}.active-locales-controls .button,.active-locales-controls ul{margin:0}@media screen and (min-width:510px){.active-locales-controls{clear:none}}.active-locales-list{height:98px;overflow-y:scroll;margin-top:0;background:#fff;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);border:1px solid #ddd;color:#32373c;box-sizing:border-box}.active-locales-list.empty-list{background:hsla(0,0%,100%,.5);border-color:hsla(0,0%,87%,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.active-locales-list li{box-sizing:border-box;width:100%;height:28px;line-height:28px;margin:0;padding:0 8px 0 0;cursor:pointer}.active-locales-list li:hover{background:rgba(0,0,0,.07)}.active-locales-list li[aria-selected=true]{background:rgba(0,0,0,.15)}#active-locales-empty-message{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;position:relative;text-align:center;width:25em;height:98px;margin-bottom:-98px;box-sizing:border-box;color:rgba(51,51,51,.5)}#active-locales-empty-message.hidden{display:none}.inactive-locales{clear:both}.inactive-locales select{width:100%}
|
1 |
+
.active-locales{margin:1em 0}.active-locales-list,.inactive-locales-list{width:25em;margin:0 0 1em 1em;clear:both;float:right}.active-locales-controls{clear:both}.active-locales-controls .button,.active-locales-controls ul{margin:0}@media screen and (min-width:510px){.active-locales-controls{clear:none}}.active-locales-list{height:98px;overflow-y:scroll;margin-top:0;background:#fff;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);border:1px solid #ddd;color:#32373c;box-sizing:border-box}.active-locales-list.empty-list{background:hsla(0,0%,100%,.5);border-color:hsla(0,0%,87%,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.active-locales-list li{box-sizing:border-box;width:100%;height:28px;line-height:28px;margin:0;padding:0 8px 0 0;cursor:pointer}.active-locales-list li:hover{background:rgba(0,0,0,.07)}.active-locales-list li[aria-selected=true]{background:rgba(0,0,0,.15)}#active-locales-empty-message{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;position:relative;text-align:center;width:25em;height:98px;margin-bottom:-98px;box-sizing:border-box;color:rgba(51,51,51,.5)}#active-locales-empty-message.hidden{display:none}.inactive-locales{clear:both}.inactive-locales select{width:100%}.preferred-languages .notice{display:inline-block}.no-js #preferred-languages-label,.no-js .preferred-languages,.no-js .user-preferred-languages-wrap{display:none}@-webkit-keyframes tooltip-appear{0%{opacity:0}to{opacity:1}}@keyframes tooltip-appear{0%{opacity:0}to{opacity:1}}.tooltipped{position:relative}.tooltipped:active:after,.tooltipped:active:before,.tooltipped:focus:after,.tooltipped:focus:before,.tooltipped:hover:after,.tooltipped:hover:before{opacity:1;display:inline-block;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:.4s;animation-delay:.4s}.tooltipped:before{z-index:1000001;width:0;height:0;color:#191e23;content:"";border:6px solid transparent;top:-7px;left:50%;bottom:auto;margin-left:-6px;border-top-color:#191e23}.tooltipped:after,.tooltipped:before{position:absolute;display:none;pointer-events:none;opacity:0}.tooltipped:after{z-index:1000000;padding:.5em .75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;-webkit-font-smoothing:subpixel-antialiased;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;content:attr(data-tooltip);background:#191e23;border-radius:3px;left:auto;right:50%;margin-right:-16px;bottom:100%;margin-bottom:6px}
|
css/preferred-languages.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.active-locales{margin:1em 0}.active-locales-list,.inactive-locales-list{width:25em;margin:0 1em 1em 0;clear:both;float:left}.active-locales-controls{clear:both}.active-locales-controls .button,.active-locales-controls ul{margin:0}@media screen and (min-width:510px){.active-locales-controls{clear:none}}.active-locales-list{height:98px;overflow-y:scroll;margin-top:0;background:#fff;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);border:1px solid #ddd;color:#32373c;box-sizing:border-box}.active-locales-list.empty-list{background:hsla(0,0%,100%,.5);border-color:hsla(0,0%,87%,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.active-locales-list li{box-sizing:border-box;width:100%;height:28px;line-height:28px;margin:0;padding:0 0 0 8px;cursor:pointer}.active-locales-list li:hover{background:rgba(0,0,0,.07)}.active-locales-list li[aria-selected=true]{background:rgba(0,0,0,.15)}#active-locales-empty-message{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;position:relative;text-align:center;width:25em;height:98px;margin-bottom:-98px;box-sizing:border-box;color:rgba(51,51,51,.5)}#active-locales-empty-message.hidden{display:none}.inactive-locales{clear:both}.inactive-locales select{width:100%}
|
1 |
+
.active-locales{margin:1em 0}.active-locales-list,.inactive-locales-list{width:25em;margin:0 1em 1em 0;clear:both;float:left}.active-locales-controls{clear:both}.active-locales-controls .button,.active-locales-controls ul{margin:0}@media screen and (min-width:510px){.active-locales-controls{clear:none}}.active-locales-list{height:98px;overflow-y:scroll;margin-top:0;background:#fff;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);border:1px solid #ddd;color:#32373c;box-sizing:border-box}.active-locales-list.empty-list{background:hsla(0,0%,100%,.5);border-color:hsla(0,0%,87%,.75);box-shadow:inset 0 1px 2px rgba(0,0,0,.04);display:-webkit-box;display:flex;-webkit-box-align:center;align-items:center}.active-locales-list li{box-sizing:border-box;width:100%;height:28px;line-height:28px;margin:0;padding:0 0 0 8px;cursor:pointer}.active-locales-list li:hover{background:rgba(0,0,0,.07)}.active-locales-list li[aria-selected=true]{background:rgba(0,0,0,.15)}#active-locales-empty-message{display:-webkit-box;display:flex;-webkit-box-pack:center;justify-content:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column;position:relative;text-align:center;width:25em;height:98px;margin-bottom:-98px;box-sizing:border-box;color:rgba(51,51,51,.5)}#active-locales-empty-message.hidden{display:none}.inactive-locales{clear:both}.inactive-locales select{width:100%}.preferred-languages .notice{display:inline-block}.no-js #preferred-languages-label,.no-js .preferred-languages,.no-js .user-preferred-languages-wrap{display:none}@-webkit-keyframes tooltip-appear{0%{opacity:0}to{opacity:1}}@keyframes tooltip-appear{0%{opacity:0}to{opacity:1}}.tooltipped{position:relative}.tooltipped:active:after,.tooltipped:active:before,.tooltipped:focus:after,.tooltipped:focus:before,.tooltipped:hover:after,.tooltipped:hover:before{opacity:1;display:inline-block;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:.1s;animation-duration:.1s;-webkit-animation-fill-mode:backwards;animation-fill-mode:backwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:.4s;animation-delay:.4s}.tooltipped:before{z-index:1000001;width:0;height:0;color:#191e23;content:"";border:6px solid transparent;top:-7px;right:50%;bottom:auto;margin-right:-6px;border-top-color:#191e23}.tooltipped:after,.tooltipped:before{position:absolute;display:none;pointer-events:none;opacity:0}.tooltipped:after{z-index:1000000;padding:.5em .75em;font:normal normal 11px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;-webkit-font-smoothing:subpixel-antialiased;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;content:attr(data-tooltip);background:#191e23;border-radius:3px;right:auto;left:50%;margin-left:-16px;bottom:100%;margin-bottom:6px}
|
inc/class-preferred-languages-textdomain-registry.php
CHANGED
@@ -1,6 +1,6 @@
|
|
1 |
<?php
|
2 |
/**
|
3 |
-
* Locale API:
|
4 |
*
|
5 |
* @package WordPress
|
6 |
* @subpackage i18n
|
1 |
<?php
|
2 |
/**
|
3 |
+
* Locale API: Preferred_Languages_Textdomain_Registry class
|
4 |
*
|
5 |
* @package WordPress
|
6 |
* @subpackage i18n
|
inc/default-filters.php
CHANGED
@@ -13,14 +13,18 @@ add_action( 'init', 'preferred_languages_register_setting' );
|
|
13 |
add_action( 'init', 'preferred_languages_register_meta' );
|
14 |
add_action( 'init', 'preferred_languages_register_scripts' );
|
15 |
|
|
|
|
|
16 |
add_action( 'admin_init', 'preferred_languages_settings_field' );
|
17 |
|
18 |
add_action( 'personal_options', 'preferred_languages_personal_options' );
|
19 |
add_action( 'personal_options_update', 'preferred_languages_update_user_option' );
|
20 |
add_action( 'edit_user_profile_update', 'preferred_languages_update_user_option' );
|
21 |
|
|
|
22 |
add_filter( 'update_option_preferred_languages', 'preferred_languages_update_option', 10, 2 );
|
|
|
23 |
add_filter( 'update_user_meta', 'preferred_languages_update_user_meta', 10, 4 );
|
24 |
add_filter( 'get_user_metadata', 'preferred_languages_filter_user_locale', 10, 3 );
|
25 |
-
add_filter( 'locale', 'preferred_languages_filter_locale' );
|
26 |
add_filter( 'load_textdomain_mofile', 'preferred_languages_load_textdomain_mofile', 10 );
|
13 |
add_action( 'init', 'preferred_languages_register_meta' );
|
14 |
add_action( 'init', 'preferred_languages_register_scripts' );
|
15 |
|
16 |
+
add_action( 'admin_enqueue_scripts', 'preferred_languages_enqueue_scripts' );
|
17 |
+
|
18 |
add_action( 'admin_init', 'preferred_languages_settings_field' );
|
19 |
|
20 |
add_action( 'personal_options', 'preferred_languages_personal_options' );
|
21 |
add_action( 'personal_options_update', 'preferred_languages_update_user_option' );
|
22 |
add_action( 'edit_user_profile_update', 'preferred_languages_update_user_option' );
|
23 |
|
24 |
+
add_filter( 'pre_update_option', 'preferred_languages_pre_update_option', 10, 3 );
|
25 |
add_filter( 'update_option_preferred_languages', 'preferred_languages_update_option', 10, 2 );
|
26 |
+
add_filter( 'update_user_metadata', 'preferred_languages_pre_update_user_meta', 10, 5 );
|
27 |
add_filter( 'update_user_meta', 'preferred_languages_update_user_meta', 10, 4 );
|
28 |
add_filter( 'get_user_metadata', 'preferred_languages_filter_user_locale', 10, 3 );
|
29 |
+
add_filter( 'locale', 'preferred_languages_filter_locale', 5 ); // Before WP_Locale_Switcher.
|
30 |
add_filter( 'load_textdomain_mofile', 'preferred_languages_load_textdomain_mofile', 10 );
|
inc/functions.php
CHANGED
@@ -86,7 +86,7 @@ function preferred_languages_get_user_list( $user_id = 0 ) {
|
|
86 |
*
|
87 |
* @since 1.3.0
|
88 |
*
|
89 |
-
* @return array
|
90 |
*/
|
91 |
function preferred_languages_get_site_list() {
|
92 |
$preferred_languages = get_option( 'preferred_languages', '' );
|
@@ -118,6 +118,35 @@ function preferred_languages_get_list() {
|
|
118 |
return preferred_languages_get_site_list();
|
119 |
}
|
120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
/**
|
122 |
* Downloads language pack when updating user meta.
|
123 |
*
|
@@ -148,6 +177,27 @@ function preferred_languages_update_user_meta( $meta_id, $object_id, $meta_key,
|
|
148 |
load_default_textdomain( reset( $preferred_languages_list ) );
|
149 |
}
|
150 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
151 |
/**
|
152 |
* Downloads language packs upon updating the site option.
|
153 |
*
|
@@ -225,7 +275,7 @@ function preferred_languages_sanitize_list( $preferred_languages ) {
|
|
225 |
* @return string
|
226 |
*/
|
227 |
function preferred_languages_filter_locale( $locale ) {
|
228 |
-
$preferred_languages =
|
229 |
|
230 |
if ( empty( $preferred_languages ) ) {
|
231 |
return $locale;
|
@@ -309,7 +359,7 @@ function preferred_languages_register_scripts() {
|
|
309 |
'jquery-ui-sortable',
|
310 |
'wp-a11y',
|
311 |
),
|
312 |
-
'
|
313 |
true
|
314 |
);
|
315 |
|
@@ -326,15 +376,24 @@ function preferred_languages_register_scripts() {
|
|
326 |
)
|
327 |
);
|
328 |
|
329 |
-
|
330 |
-
|
331 |
-
wp_enqueue_style(
|
332 |
'preferred-languages',
|
333 |
-
plugin_dir_url( dirname( __FILE__ ) ) . 'css/preferred-languages
|
334 |
array(),
|
335 |
-
'
|
336 |
'screen'
|
337 |
);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
338 |
}
|
339 |
|
340 |
/**
|
@@ -439,11 +498,23 @@ function preferred_languages_display_form( $args = array() ) {
|
|
439 |
}
|
440 |
}
|
441 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
442 |
?>
|
443 |
<div class="preferred-languages">
|
444 |
<input type="hidden" name="preferred_languages" value="<?php echo esc_attr( implode( ',', $args['selected'] ) ); ?>"/>
|
445 |
<p><?php _e( 'Choose languages for displaying WordPress in, in order of preference.', 'preferred-languages' ); ?></p>
|
446 |
-
<div class="active-locales">
|
447 |
<?php
|
448 |
/* translators: %s: English (United States) */
|
449 |
$screen_reader_text = sprintf( __( 'No languages selected. Falling back to %s.', 'preferred-languages' ), 'English (United States)' );
|
@@ -486,52 +557,87 @@ function preferred_languages_display_form( $args = array() ) {
|
|
486 |
<li>
|
487 |
<button
|
488 |
aria-keyshortcuts="Alt+ArrowUp"
|
|
|
489 |
aria-disabled="false"
|
|
|
490 |
type="button"
|
491 |
-
class="button locales-move-up">
|
492 |
<?php _e( 'Move Up', 'preferred-languages' ); ?>
|
493 |
</button>
|
494 |
</li>
|
495 |
<li>
|
496 |
<button
|
497 |
aria-keyshortcuts="Alt+ArrowDown"
|
|
|
498 |
aria-disabled="false"
|
|
|
499 |
type="button"
|
500 |
-
class="button locales-move-down">
|
501 |
<?php _e( 'Move Down', 'preferred-languages' ); ?>
|
502 |
</button>
|
503 |
</li>
|
504 |
<li>
|
505 |
<button
|
506 |
aria-keyshortcuts="Alt+Delete"
|
|
|
507 |
aria-disabled="false"
|
|
|
508 |
type="button"
|
509 |
-
class="button locales-remove">
|
510 |
<?php _e( 'Remove', 'preferred-languages' ); ?>
|
511 |
</button>
|
512 |
</li>
|
513 |
</ul>
|
514 |
</div>
|
515 |
</div>
|
516 |
-
|
517 |
-
|
518 |
-
|
519 |
-
|
520 |
-
|
521 |
-
|
522 |
-
|
523 |
-
|
524 |
-
|
525 |
-
|
526 |
-
|
527 |
-
|
528 |
-
)
|
529 |
-
|
530 |
-
|
531 |
-
|
532 |
-
|
533 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
534 |
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
535 |
</div>
|
536 |
<?php
|
537 |
}
|
@@ -542,9 +648,9 @@ function preferred_languages_display_form( $args = array() ) {
|
|
542 |
* @since 1.1.0
|
543 |
*/
|
544 |
function preferred_languages_init_registry() {
|
545 |
-
global $
|
546 |
|
547 |
-
$
|
548 |
}
|
549 |
|
550 |
/**
|
@@ -566,20 +672,20 @@ function preferred_languages_filter_gettext( $translation, $text, $domain ) {
|
|
566 |
$translations = get_translations_for_domain( $domain );
|
567 |
|
568 |
if ( $translations instanceof NOOP_Translations ) {
|
569 |
-
/* @var Preferred_Languages_Textdomain_Registry $
|
570 |
-
global $
|
571 |
|
572 |
-
if ( ! $
|
573 |
preferred_languages_init_registry();
|
574 |
}
|
575 |
|
576 |
-
$path = $
|
577 |
|
578 |
if ( ! $path ) {
|
579 |
-
$
|
580 |
}
|
581 |
|
582 |
-
$path = $
|
583 |
|
584 |
if ( ! $path ) {
|
585 |
return $translation;
|
@@ -592,8 +698,7 @@ function preferred_languages_filter_gettext( $translation, $text, $domain ) {
|
|
592 |
|
593 |
if ( load_textdomain( $domain, $mofile ) ) {
|
594 |
$translations = get_translations_for_domain( $domain );
|
595 |
-
|
596 |
-
$translation = $translations->translate( $text );
|
597 |
|
598 |
break;
|
599 |
}
|
86 |
*
|
87 |
* @since 1.3.0
|
88 |
*
|
89 |
+
* @return array Preferred languages.
|
90 |
*/
|
91 |
function preferred_languages_get_site_list() {
|
92 |
$preferred_languages = get_option( 'preferred_languages', '' );
|
118 |
return preferred_languages_get_site_list();
|
119 |
}
|
120 |
|
121 |
+
/**
|
122 |
+
* Downloads language packs when saving user meta without any changes.
|
123 |
+
*
|
124 |
+
* Makes sure the translations are downloaded when it didn't work the first time around.
|
125 |
+
*
|
126 |
+
* @since 1.4.0
|
127 |
+
*
|
128 |
+
* @param null|bool $check Whether to allow updating metadata for the given type.
|
129 |
+
* @param int $user_id User ID.
|
130 |
+
* @param string $meta_key Meta key.
|
131 |
+
* @param mixed $value Meta value.
|
132 |
+
* @param mixed $old_value The previous meta value.
|
133 |
+
* @return mixed
|
134 |
+
*/
|
135 |
+
function preferred_languages_pre_update_user_meta( $check, $user_id, $meta_key, $value, $old_value ) {
|
136 |
+
if ( 'preferred_languages' === $meta_key ) {
|
137 |
+
if ( empty( $old_value ) ) {
|
138 |
+
$old_value = get_user_meta( $user_id, $meta_key, true );
|
139 |
+
}
|
140 |
+
|
141 |
+
if ( $value === $old_value ) {
|
142 |
+
$locales = array_filter( explode( ',', $value ) );
|
143 |
+
preferred_languages_download_language_packs( $locales );
|
144 |
+
}
|
145 |
+
}
|
146 |
+
|
147 |
+
return $check;
|
148 |
+
}
|
149 |
+
|
150 |
/**
|
151 |
* Downloads language pack when updating user meta.
|
152 |
*
|
177 |
load_default_textdomain( reset( $preferred_languages_list ) );
|
178 |
}
|
179 |
|
180 |
+
/**
|
181 |
+
* Downloads language packs when saving the site option without any changes.
|
182 |
+
*
|
183 |
+
* Makes sure the translations are downloaded when it didn't work the first time around.
|
184 |
+
*
|
185 |
+
* @since 1.4.0
|
186 |
+
*
|
187 |
+
* @param mixed $value The new, unserialized option value.
|
188 |
+
* @param string $option Name of the option.
|
189 |
+
* @param mixed $old_value The old option value.
|
190 |
+
* @return mixed
|
191 |
+
*/
|
192 |
+
function preferred_languages_pre_update_option( $value, $option, $old_value ) {
|
193 |
+
if ( 'preferred_languages' === $option && $value === $old_value ) {
|
194 |
+
$locales = array_filter( explode( ',', $value ) );
|
195 |
+
preferred_languages_download_language_packs( $locales );
|
196 |
+
}
|
197 |
+
|
198 |
+
return $value;
|
199 |
+
}
|
200 |
+
|
201 |
/**
|
202 |
* Downloads language packs upon updating the site option.
|
203 |
*
|
275 |
* @return string
|
276 |
*/
|
277 |
function preferred_languages_filter_locale( $locale ) {
|
278 |
+
$preferred_languages = preferred_languages_get_site_list();
|
279 |
|
280 |
if ( empty( $preferred_languages ) ) {
|
281 |
return $locale;
|
359 |
'jquery-ui-sortable',
|
360 |
'wp-a11y',
|
361 |
),
|
362 |
+
'20180727',
|
363 |
true
|
364 |
);
|
365 |
|
376 |
)
|
377 |
);
|
378 |
|
379 |
+
wp_register_style(
|
|
|
|
|
380 |
'preferred-languages',
|
381 |
+
plugin_dir_url( dirname( __FILE__ ) ) . 'css/preferred-languages.css',
|
382 |
array(),
|
383 |
+
'20180727',
|
384 |
'screen'
|
385 |
);
|
386 |
+
|
387 |
+
wp_styles()->add_data( 'preferred-languages', 'rtl', true );
|
388 |
+
}
|
389 |
+
|
390 |
+
/**
|
391 |
+
* Enqueues the stylesheet in the admin.
|
392 |
+
*
|
393 |
+
* @since 1.4.0
|
394 |
+
*/
|
395 |
+
function preferred_languages_enqueue_scripts() {
|
396 |
+
wp_enqueue_style( 'preferred-languages' );
|
397 |
}
|
398 |
|
399 |
/**
|
498 |
}
|
499 |
}
|
500 |
|
501 |
+
/* translators: accessibility text */
|
502 |
+
$label_up = __( 'Move up (Alt+Up)', 'preferred-languages' );
|
503 |
+
|
504 |
+
/* translators: accessibility text */
|
505 |
+
$label_down = __( 'Move down (Alt+Down)', 'preferred-languages' );
|
506 |
+
|
507 |
+
/* translators: accessibility text */
|
508 |
+
$label_remove = __( 'Remove from list (Alt+Delete)', 'preferred-languages' );
|
509 |
+
|
510 |
+
/* translators: accessibility text */
|
511 |
+
$label_add = __( 'Add to list (Alt+A)', 'preferred-languages' );
|
512 |
+
|
513 |
?>
|
514 |
<div class="preferred-languages">
|
515 |
<input type="hidden" name="preferred_languages" value="<?php echo esc_attr( implode( ',', $args['selected'] ) ); ?>"/>
|
516 |
<p><?php _e( 'Choose languages for displaying WordPress in, in order of preference.', 'preferred-languages' ); ?></p>
|
517 |
+
<div class="active-locales wp-clearfix">
|
518 |
<?php
|
519 |
/* translators: %s: English (United States) */
|
520 |
$screen_reader_text = sprintf( __( 'No languages selected. Falling back to %s.', 'preferred-languages' ), 'English (United States)' );
|
557 |
<li>
|
558 |
<button
|
559 |
aria-keyshortcuts="Alt+ArrowUp"
|
560 |
+
aria-label="<?php esc_attr( $label_up ); ?>"
|
561 |
aria-disabled="false"
|
562 |
+
data-tooltip="Alt+Up"
|
563 |
type="button"
|
564 |
+
class="button locales-move-up tooltipped">
|
565 |
<?php _e( 'Move Up', 'preferred-languages' ); ?>
|
566 |
</button>
|
567 |
</li>
|
568 |
<li>
|
569 |
<button
|
570 |
aria-keyshortcuts="Alt+ArrowDown"
|
571 |
+
aria-label="<?php esc_attr( $label_down ); ?>"
|
572 |
aria-disabled="false"
|
573 |
+
data-tooltip="Alt+Down"
|
574 |
type="button"
|
575 |
+
class="button locales-move-down tooltipped">
|
576 |
<?php _e( 'Move Down', 'preferred-languages' ); ?>
|
577 |
</button>
|
578 |
</li>
|
579 |
<li>
|
580 |
<button
|
581 |
aria-keyshortcuts="Alt+Delete"
|
582 |
+
aria-label="<?php esc_attr( $label_remove ); ?>"
|
583 |
aria-disabled="false"
|
584 |
+
data-tooltip="Alt+Delete"
|
585 |
type="button"
|
586 |
+
class="button locales-remove tooltipped">
|
587 |
<?php _e( 'Remove', 'preferred-languages' ); ?>
|
588 |
</button>
|
589 |
</li>
|
590 |
</ul>
|
591 |
</div>
|
592 |
</div>
|
593 |
+
<div class="inactive-locales wp-clearfix">
|
594 |
+
<label class="screen-reader-text" for="preferred-languages-inactive-locales"><?php _e( 'Inactive Locales', 'preferred-languages' ); ?></label>
|
595 |
+
<div class="inactive-locales-list" data-show-en_US="<?php echo $args['show_option_en_US'] ? 'true' : 'false'; ?>">
|
596 |
+
<?php
|
597 |
+
wp_dropdown_languages(
|
598 |
+
array(
|
599 |
+
'id' => 'preferred-languages-inactive-locales',
|
600 |
+
'name' => 'preferred-languages-inactive-locales',
|
601 |
+
'languages' => $languages,
|
602 |
+
'translations' => $translations,
|
603 |
+
'show_available_translations' => $args['show_available_translations'],
|
604 |
+
)
|
605 |
+
);
|
606 |
+
?>
|
607 |
+
</div>
|
608 |
+
<div class="inactive-locales-controls">
|
609 |
+
<button
|
610 |
+
aria-keyshortcuts="Alt+A"
|
611 |
+
aria-label="<?php esc_attr( $label_add ); ?>"
|
612 |
+
aria-disabled="false"
|
613 |
+
data-tooltip="Alt+A"
|
614 |
+
type="button"
|
615 |
+
class="button locales-add tooltipped"
|
616 |
+
>
|
617 |
+
<?php _e( 'Add', 'preferred-languages' ); ?>
|
618 |
+
</button>
|
619 |
+
</div>
|
620 |
</div>
|
621 |
+
<?php
|
622 |
+
if ( current_user_can( 'install_languages' ) ) {
|
623 |
+
foreach ( $preferred_languages as $language ) {
|
624 |
+
if ( 'en_US' === $language['language'] ) {
|
625 |
+
continue;
|
626 |
+
}
|
627 |
+
|
628 |
+
if ( ! in_array( $language['language'], get_available_languages(), true ) ) {
|
629 |
+
?>
|
630 |
+
<div class="notice notice-warning inline">
|
631 |
+
<p>
|
632 |
+
<?php _e( 'Some of the languages are not installed. Re-save changes to download translations.', 'preferred-languages' ); ?>
|
633 |
+
</p>
|
634 |
+
</div>
|
635 |
+
<?php
|
636 |
+
break;
|
637 |
+
}
|
638 |
+
}
|
639 |
+
}
|
640 |
+
?>
|
641 |
</div>
|
642 |
<?php
|
643 |
}
|
648 |
* @since 1.1.0
|
649 |
*/
|
650 |
function preferred_languages_init_registry() {
|
651 |
+
global $preferred_languages_textdomain_registry;
|
652 |
|
653 |
+
$preferred_languages_textdomain_registry = new Preferred_Languages_Textdomain_Registry();
|
654 |
}
|
655 |
|
656 |
/**
|
672 |
$translations = get_translations_for_domain( $domain );
|
673 |
|
674 |
if ( $translations instanceof NOOP_Translations ) {
|
675 |
+
/* @var Preferred_Languages_Textdomain_Registry $preferred_languages_textdomain_registry */
|
676 |
+
global $preferred_languages_textdomain_registry;
|
677 |
|
678 |
+
if ( ! $preferred_languages_textdomain_registry instanceof Preferred_Languages_Textdomain_Registry ) {
|
679 |
preferred_languages_init_registry();
|
680 |
}
|
681 |
|
682 |
+
$path = $preferred_languages_textdomain_registry->get( $domain );
|
683 |
|
684 |
if ( ! $path ) {
|
685 |
+
$preferred_languages_textdomain_registry->get_translation_from_lang_dir( $domain );
|
686 |
}
|
687 |
|
688 |
+
$path = $preferred_languages_textdomain_registry->get( $domain );
|
689 |
|
690 |
if ( ! $path ) {
|
691 |
return $translation;
|
698 |
|
699 |
if ( load_textdomain( $domain, $mofile ) ) {
|
700 |
$translations = get_translations_for_domain( $domain );
|
701 |
+
$translation = $translations->translate( $text );
|
|
|
702 |
|
703 |
break;
|
704 |
}
|
js/preferred-languages.js
CHANGED
@@ -1,14 +1,19 @@
|
|
1 |
'use strict';
|
2 |
|
3 |
(function (wp, settings, $) {
|
|
|
4 |
var $activeLocales = $('.active-locales-list');
|
5 |
var $activeLocalesControls = $('.active-locales-controls');
|
6 |
var $emptyMessage = $('#active-locales-empty-message');
|
7 |
var $inactiveLocalesWrap = $('.inactive-locales-list');
|
8 |
var $inactiveLocales = $inactiveLocalesWrap.find('select');
|
9 |
var $inactiveLocalesControls = $('.inactive-locales-controls');
|
10 |
-
var $selectedLocale = $activeLocales.find('li[aria-selected="true"]');
|
11 |
var $inputField = $('input[name="preferred_languages"]');
|
|
|
|
|
|
|
|
|
|
|
12 |
|
13 |
/**
|
14 |
* Changes the move button states.
|
@@ -20,9 +25,9 @@
|
|
20 |
function changeButtonState(activeLocale) {
|
21 |
var activeLocalesList = $activeLocales.find('.active-locale');
|
22 |
|
23 |
-
$activeLocalesControls.find('.locales-move-up').attr('disabled', $activeLocales.hasClass('empty-list') || activeLocalesList.first().is(activeLocale)
|
24 |
-
$activeLocalesControls.find('.locales-move-down').attr('disabled', $activeLocales.hasClass('empty-list') || activeLocalesList.last().is(activeLocale)
|
25 |
-
$activeLocalesControls.find('.locales-remove').attr('disabled', $activeLocales.hasClass('empty-list')
|
26 |
$inactiveLocalesControls.find('.locales-add').attr('disabled', 'disabled' === $inactiveLocales.attr('disabled'));
|
27 |
}
|
28 |
|
@@ -39,17 +44,10 @@
|
|
39 |
|
40 |
// It's already the current locale, so nothing to do here.
|
41 |
if ('true' === selected) {
|
42 |
-
$locale.attr('aria-selected', false);
|
43 |
-
$selectedLocale = [];
|
44 |
-
|
45 |
-
changeButtonState($locale);
|
46 |
-
|
47 |
return;
|
48 |
}
|
49 |
|
50 |
-
|
51 |
-
$selectedLocale.attr('aria-selected', false);
|
52 |
-
}
|
53 |
|
54 |
$locale.attr('aria-selected', newState);
|
55 |
|
@@ -270,39 +268,37 @@
|
|
270 |
});
|
271 |
|
272 |
// Active locales keyboard shortcuts.
|
273 |
-
$
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
|
279 |
-
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
|
284 |
-
|
285 |
-
|
286 |
-
|
287 |
-
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
makeLocaleInactive();
|
300 |
-
e.preventDefault();
|
301 |
}
|
302 |
});
|
303 |
|
304 |
// Inactive Locales keyboard shortcuts.
|
305 |
-
$
|
306 |
|
307 |
// Letter "A".
|
308 |
if (65 === e.which) {
|
1 |
'use strict';
|
2 |
|
3 |
(function (wp, settings, $) {
|
4 |
+
var $document = $(document);
|
5 |
var $activeLocales = $('.active-locales-list');
|
6 |
var $activeLocalesControls = $('.active-locales-controls');
|
7 |
var $emptyMessage = $('#active-locales-empty-message');
|
8 |
var $inactiveLocalesWrap = $('.inactive-locales-list');
|
9 |
var $inactiveLocales = $inactiveLocalesWrap.find('select');
|
10 |
var $inactiveLocalesControls = $('.inactive-locales-controls');
|
|
|
11 |
var $inputField = $('input[name="preferred_languages"]');
|
12 |
+
var $selectedLocale = $activeLocales.find('li[aria-selected="true"]');
|
13 |
+
|
14 |
+
var KEY_UP = 38;
|
15 |
+
var KEY_DOWN = 40;
|
16 |
+
var KEY_BACKSPACE = 8;
|
17 |
|
18 |
/**
|
19 |
* Changes the move button states.
|
25 |
function changeButtonState(activeLocale) {
|
26 |
var activeLocalesList = $activeLocales.find('.active-locale');
|
27 |
|
28 |
+
$activeLocalesControls.find('.locales-move-up').attr('disabled', $activeLocales.hasClass('empty-list') || activeLocalesList.first().is(activeLocale));
|
29 |
+
$activeLocalesControls.find('.locales-move-down').attr('disabled', $activeLocales.hasClass('empty-list') || activeLocalesList.last().is(activeLocale));
|
30 |
+
$activeLocalesControls.find('.locales-remove').attr('disabled', $activeLocales.hasClass('empty-list'));
|
31 |
$inactiveLocalesControls.find('.locales-add').attr('disabled', 'disabled' === $inactiveLocales.attr('disabled'));
|
32 |
}
|
33 |
|
44 |
|
45 |
// It's already the current locale, so nothing to do here.
|
46 |
if ('true' === selected) {
|
|
|
|
|
|
|
|
|
|
|
47 |
return;
|
48 |
}
|
49 |
|
50 |
+
$selectedLocale.attr('aria-selected', false);
|
|
|
|
|
51 |
|
52 |
$locale.attr('aria-selected', newState);
|
53 |
|
268 |
});
|
269 |
|
270 |
// Active locales keyboard shortcuts.
|
271 |
+
$document.on('keydown', $activeLocales, function (e) {
|
272 |
+
switch (e.which) {
|
273 |
+
case KEY_UP:
|
274 |
+
if (e.altKey) {
|
275 |
+
moveLocaleUp();
|
276 |
+
} else {
|
277 |
+
$selectedLocale.prev().length && toggleLocale($selectedLocale.prev());
|
278 |
+
}
|
279 |
+
|
280 |
+
e.preventDefault();
|
281 |
+
break;
|
282 |
+
|
283 |
+
case KEY_DOWN:
|
284 |
+
if (e.altKey) {
|
285 |
+
moveLocaleDown();
|
286 |
+
} else {
|
287 |
+
$selectedLocale.next().length && toggleLocale($selectedLocale.next());
|
288 |
+
}
|
289 |
+
|
290 |
+
e.preventDefault();
|
291 |
+
break;
|
292 |
+
|
293 |
+
case KEY_BACKSPACE:
|
294 |
+
makeLocaleInactive();
|
295 |
+
e.preventDefault();
|
296 |
+
break;
|
|
|
|
|
297 |
}
|
298 |
});
|
299 |
|
300 |
// Inactive Locales keyboard shortcuts.
|
301 |
+
$document.on('keydown', $inactiveLocales, function (e) {
|
302 |
|
303 |
// Letter "A".
|
304 |
if (65 === e.which) {
|
js/preferred-languages.min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
"use strict";(function(wp,settings,$){var $activeLocales=$(".active-locales-list");var $activeLocalesControls=$(".active-locales-controls");var $emptyMessage=$("#active-locales-empty-message");var $inactiveLocalesWrap=$(".inactive-locales-list");var $inactiveLocales=$inactiveLocalesWrap.find("select");var $inactiveLocalesControls=$(".inactive-locales-controls");var $
|
1 |
+
"use strict";(function(wp,settings,$){var $document=$(document);var $activeLocales=$(".active-locales-list");var $activeLocalesControls=$(".active-locales-controls");var $emptyMessage=$("#active-locales-empty-message");var $inactiveLocalesWrap=$(".inactive-locales-list");var $inactiveLocales=$inactiveLocalesWrap.find("select");var $inactiveLocalesControls=$(".inactive-locales-controls");var $inputField=$('input[name="preferred_languages"]');var $selectedLocale=$activeLocales.find('li[aria-selected="true"]');var KEY_UP=38;var KEY_DOWN=40;var KEY_BACKSPACE=8;function changeButtonState(activeLocale){var activeLocalesList=$activeLocales.find(".active-locale");$activeLocalesControls.find(".locales-move-up").attr("disabled",$activeLocales.hasClass("empty-list")||activeLocalesList.first().is(activeLocale));$activeLocalesControls.find(".locales-move-down").attr("disabled",$activeLocales.hasClass("empty-list")||activeLocalesList.last().is(activeLocale));$activeLocalesControls.find(".locales-remove").attr("disabled",$activeLocales.hasClass("empty-list"));$inactiveLocalesControls.find(".locales-add").attr("disabled","disabled"===$inactiveLocales.attr("disabled"))}function toggleLocale($locale){var selected=$locale.attr("aria-selected");var newState="true"!==selected;if("true"===selected){return}$selectedLocale.attr("aria-selected",false);$locale.attr("aria-selected",newState);if(true===newState){$selectedLocale=$locale;$activeLocales.attr("aria-activedescendant",$selectedLocale.attr("id"))}changeButtonState($locale)}function updateHiddenInput(){var locales=[];$activeLocales.children(".active-locale").each(function(index,el){locales.push($(el).attr("id"))});$inputField.val(locales.join(","))}function moveLocaleUp(){$selectedLocale.insertBefore($selectedLocale.prev());updateHiddenInput();changeButtonState($selectedLocale);wp.a11y.speak(settings.l10n.movedUp)}function moveLocaleDown(){$selectedLocale.insertAfter($selectedLocale.next());updateHiddenInput();changeButtonState($selectedLocale);wp.a11y.speak(settings.l10n.movedDown)}function toggleEmptyListMessage(){if($activeLocales.hasClass("empty-list")){$activeLocales.removeClass("empty-list");$emptyMessage.addClass("hidden")}else{$activeLocales.addClass("empty-list");$activeLocales.attr("aria-activedescendant","");$emptyMessage.removeClass("hidden");wp.a11y.speak($emptyMessage.data("a11y-message"))}}function makeLocaleInactive(){var locale=$selectedLocale.attr("id");var $successor=void 0;$successor=$selectedLocale.prevAll(":first");if(0===$successor.length){$successor=$selectedLocale.nextAll(":first")}$selectedLocale.remove();if($successor.length){toggleLocale($successor)}else{toggleEmptyListMessage()}$inactiveLocales.find('option[value="'+locale+'"]').removeClass("hidden");$inactiveLocales.attr("disabled",false);updateHiddenInput();changeButtonState($selectedLocale);wp.a11y.speak(settings.l10n.localeRemoved)}function makeLocaleActive(option){var locale=option.val()||"en_US";var $newLocale=$("<li/>",{text:option.text(),role:"option","aria-selected":false,id:locale,class:"active-locale"});var $successor=void 0;option.removeAttr("selected").addClass("hidden");$successor=option.prevAll(":not(.hidden):first");if(!$successor.length){$successor=option.nextAll(":not(.hidden):first")}if(!$successor.length){$successor=$inactiveLocales.find("option:not(.hidden):first")}if(!$successor.length){$inactiveLocales.attr("disabled",true)}$successor.attr("selected",true);$inactiveLocalesControls.val($successor.val());if($activeLocales.find("#"+locale).length){return}if($activeLocales.hasClass("empty-list")){toggleEmptyListMessage()}$activeLocales.append($newLocale);toggleLocale($newLocale);$activeLocales.animate({scrollTop:$newLocale.offset().top-$activeLocales.offset().top+$activeLocales.scrollTop()});updateHiddenInput();wp.a11y.speak(settings.l10n.localeAdded)}$(".user-language-wrap").remove();$("#WPLANG").parent().parent().remove();$inactiveLocalesWrap.filter('[data-show-en_US="false"]').find('[lang="en"][value=""]').remove();changeButtonState($selectedLocale);if($inputField.val().length){$.each($inputField.val().split(","),function(index,value){value="en_US"===value?"":value;var $option=$inactiveLocales.find('[value="'+value+'"]');$option.removeAttr("selected").addClass("hidden")});var $firstInactiveLocale=$inactiveLocales.find("option:not(.hidden):first");$firstInactiveLocale.attr("selected",true);$inactiveLocalesControls.val($firstInactiveLocale.val())}$activeLocales.sortable({axis:"y",cursor:"move",items:":not(#active-locales-list-empty-message)"});$document.on("keydown",$activeLocales,function(e){switch(e.which){case KEY_UP:if(e.altKey){moveLocaleUp()}else{$selectedLocale.prev().length&&toggleLocale($selectedLocale.prev())}e.preventDefault();break;case KEY_DOWN:if(e.altKey){moveLocaleDown()}else{$selectedLocale.next().length&&toggleLocale($selectedLocale.next())}e.preventDefault();break;case KEY_BACKSPACE:makeLocaleInactive();e.preventDefault();break}});$document.on("keydown",$inactiveLocales,function(e){if(65===e.which){if(e.altKey){makeLocaleActive($inactiveLocales.find("option:selected"))}e.preventDefault()}});$inactiveLocalesControls.find(".locales-add").on("click",function(){makeLocaleActive($inactiveLocales.find("option:selected"))});$activeLocales.on("click",".active-locale",function(e){toggleLocale($(e.currentTarget))});$activeLocalesControls.find(".locales-move-up").on("click",moveLocaleUp);$activeLocalesControls.find(".locales-move-down").on("click",moveLocaleDown);$activeLocalesControls.find(".locales-remove").on("click",makeLocaleInactive)})(wp,preferredLanguages,jQuery);
|
preferred-languages.php
CHANGED
@@ -3,7 +3,7 @@
|
|
3 |
* Plugin Name: Preferred Languages
|
4 |
* Plugin URI: https://github.com/swissspidy/preferred-languages/
|
5 |
* Description: Choose languages for displaying WordPress in, in order of preference.
|
6 |
-
* Version: 1.
|
7 |
* Author: Pascal Birchler
|
8 |
* Author URI: https://pascalbirchler.com
|
9 |
* License: GPL-2.0+
|
3 |
* Plugin Name: Preferred Languages
|
4 |
* Plugin URI: https://github.com/swissspidy/preferred-languages/
|
5 |
* Description: Choose languages for displaying WordPress in, in order of preference.
|
6 |
+
* Version: 1.4.0
|
7 |
* Author: Pascal Birchler
|
8 |
* Author URI: https://pascalbirchler.com
|
9 |
* License: GPL-2.0+
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Tags: internationalization, i18n, localization, l10n, language, locale, translat
|
|
4 |
Requires at least: 4.9
|
5 |
Tested up to: 4.9
|
6 |
Requires PHP: 5.2
|
7 |
-
Stable tag: 1.
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
@@ -31,6 +31,16 @@ If you want to get involved, check out [open issues](https://github.com/swissspi
|
|
31 |
|
32 |
== Changelog ==
|
33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
= 1.3.0 =
|
35 |
|
36 |
* New: Users can now choose English (United States) again as a preferred locale.
|
@@ -59,6 +69,10 @@ If you want to get involved, check out [open issues](https://github.com/swissspi
|
|
59 |
|
60 |
== Upgrade Notice ==
|
61 |
|
|
|
|
|
|
|
|
|
62 |
= 1.3.0 =
|
63 |
|
64 |
Users can now install new languages from their user profile. Also, English (US) can be chosen as a preferred user language.
|
4 |
Requires at least: 4.9
|
5 |
Tested up to: 4.9
|
6 |
Requires PHP: 5.2
|
7 |
+
Stable tag: 1.4.0
|
8 |
License: GPLv2 or later
|
9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
10 |
|
31 |
|
32 |
== Changelog ==
|
33 |
|
34 |
+
= 1.4.0 =
|
35 |
+
|
36 |
+
* New: Keyboard navigation improvements.
|
37 |
+
* New: Tooltips now show the available keyboard shortcuts.
|
38 |
+
* New: Missing translations are now downloaded even when no changes were made.
|
39 |
+
* New: A warning is shown when some of the preferred languages aren't installed.
|
40 |
+
* New: Settings form is now hidden when JavaScript is disabled.
|
41 |
+
* Fixed: Improved setting the current locale.
|
42 |
+
* Fixed: CSS is no longer enqueued on the front end.
|
43 |
+
|
44 |
= 1.3.0 =
|
45 |
|
46 |
* New: Users can now choose English (United States) again as a preferred locale.
|
69 |
|
70 |
== Upgrade Notice ==
|
71 |
|
72 |
+
= 1.4.0 =
|
73 |
+
|
74 |
+
This release contains improvements regarding translation downloads upon saving.
|
75 |
+
|
76 |
= 1.3.0 =
|
77 |
|
78 |
Users can now install new languages from their user profile. Also, English (US) can be chosen as a preferred user language.
|