diff --git a/MultisiteLanguageSwitcher.php b/MultisiteLanguageSwitcher.php index 5e992ea2f..48740743c 100644 --- a/MultisiteLanguageSwitcher.php +++ b/MultisiteLanguageSwitcher.php @@ -3,7 +3,7 @@ * Multisite Language Switcher Plugin * * Plugin Name: Multisite Language Switcher - * Version: 2.10.1 + * Version: 3.0.0 * Plugin URI: http://msls.co/ * Description: A simple but powerful plugin that will help you to manage the relations of your contents in a multilingual multisite-installation. * Author: Dennis Ploetner @@ -45,205 +45,14 @@ * @author Dennis Ploetner */ if ( ! defined( 'MSLS_PLUGIN_VERSION' ) ) { - define( 'MSLS_PLUGIN_VERSION', '2.10.1' ); + define( 'MSLS_PLUGIN_VERSION', '3.0.0' ); define( 'MSLS_PLUGIN_PATH', plugin_basename( __FILE__ ) ); define( 'MSLS_PLUGIN__FILE__', __FILE__ ); + require_once __DIR__ . '/includes/aliases.php'; require_once __DIR__ . '/includes/deprectated.php'; + require_once __DIR__ . '/includes/api.php'; - /** - * Get the output for using the links to the translations in your code - * - * @package Msls - * @param mixed $attr - * @return string - */ - function msls_get_switcher( $attr ): string { - $arr = is_array( $attr ) ? $attr : array(); - $obj = apply_filters( 'msls_get_output', null ); - - return ! is_null( $obj ) ? strval( $obj->set_tags( $arr ) ) : ''; - } - - /** - * Output the links to the translations in your template - * - * You can call this function directly like that - * - * if ( function_exists ( 'the_msls' ) ) - * the_msls(); - * - * or just use it as shortcode [sc_msls] - * - * @package Msls - * @uses get_the_msls - * - * @param string[] $arr - */ - function msls_the_switcher( array $arr = array() ): void { - // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - echo msls_get_switcher( $arr ); - } - - /** - * Gets the URL of the country flag-icon for a specific locale - * - * @param string $locale - * - * @return string - */ - function msls_get_flag_url( string $locale ): string { - return ( new \lloc\Msls\MslsOptions() )->get_flag_url( $locale ); - } - - /** - * Gets the description for a blog for a specific locale - * - * @param string $locale - * @param string $preset - * - * @return string - */ - function msls_get_blog_description( string $locale, string $preset = '' ): string { - $blog = msls_blog( $locale ); - - return $blog ? $blog->get_description() : $preset; - } - - /** - * Gets the permalink for a translation of the current post in a given language - * - * @param string $locale - * @param string $preset - * - * @return string - */ - function msls_get_permalink( string $locale, string $preset = '' ): string { - $url = null; - $blog = msls_blog( $locale ); - - if ( $blog ) { - $options = \lloc\Msls\MslsOptions::create(); - $url = $blog->get_url( $options ); - } - - return $url ?? $preset; - } - - /** - * Looks for the MslsBlog instance for a specific locale - * - * @param string $locale - * - * @return \lloc\Msls\MslsBlog|null - */ - function msls_blog( string $locale ): ?\lloc\Msls\MslsBlog { - return msls_blog_collection()->get_blog( $locale ); - } - - /** - * Gets the MslsBlogCollection instance - * - * @return \lloc\Msls\MslsBlogCollection - */ - function msls_blog_collection(): \lloc\Msls\MslsBlogCollection { - return \lloc\Msls\MslsBlogCollection::instance(); - } - - /** - * Gets the MslsOptions instance - * - * @return \lloc\Msls\MslsOptions - */ - function msls_options(): \lloc\Msls\MslsOptions { - return \lloc\Msls\MslsOptions::instance(); - } - - /** - * Gets the MslsContentTypes instance - * - * @return \lloc\Msls\MslsContentTypes - */ - function msls_content_types(): \lloc\Msls\MslsContentTypes { - return \lloc\Msls\MslsContentTypes::create(); - } - - /** - * Gets the MslsPostType instance - * - * @return \lloc\Msls\MslsPostType - */ - function msls_post_type(): \lloc\Msls\MslsPostType { - return \lloc\Msls\MslsPostType::instance(); - } - - /** - * Gets the MslsTaxonomy instance - * - * @return \lloc\Msls\MslsTaxonomy - */ - function msls_taxonomy(): \lloc\Msls\MslsTaxonomy { - return \lloc\Msls\MslsTaxonomy::instance(); - } - - /** - * Gets the MslsOutput instance - * - * @return \lloc\Msls\MslsOutput - */ - function msls_output(): \lloc\Msls\MslsOutput { - return \lloc\Msls\MslsOutput::create(); - } - - /** - * Retrieves the MslsOptionsPost instance. - * - * @param int $id - * @return \lloc\Msls\MslsOptionsPost - */ - function msls_get_post( int $id ): \lloc\Msls\MslsOptionsPost { - return new \lloc\Msls\MslsOptionsPost( $id ); - } - - /** - * Retrieves the MslsOptionsTax instance. - * - * Determines the current query based on conditional tags: - * - is_category - * - is_tag - * - is_tax - * - * @param int $id - * @return \lloc\Msls\OptionsTaxInterface - */ - function msls_get_tax( int $id ): \lloc\Msls\OptionsTaxInterface { - return \lloc\Msls\MslsOptionsTax::create( $id ); - } - - /** - * Retrieves the MslsOptionsQuery instance. - * - * Determines the current query based on conditional tags: - * - is_day - * - is_month - * - is_year - * - is_author - * - is_post_type_archive - * - * @return ?\lloc\Msls\MslsOptionsQuery - */ - function msls_get_query(): ?\lloc\Msls\MslsOptionsQuery { - return \lloc\Msls\MslsOptionsQuery::create(); - } - - /** - * Trivial void function for actions that do not return anything. - * - * @return void - */ - function msls_return_void(): void { - } - - lloc\Msls\MslsPlugin::init(); - lloc\Msls\MslsCli::init(); + lloc\Msls\Plugin::init(); + lloc\Msls\Cli\Cli::init(); } diff --git a/assets/css-flags/flags.php b/assets/css-flags/flags.php index b4afaabb9..26b6a6881 100644 --- a/assets/css-flags/flags.php +++ b/assets/css-flags/flags.php @@ -33,22 +33,21 @@ 'cy' => 'flag-icon-gb-wls', 'da_DK' => 'flag-icon-dk', 'de_AT' => 'flag-icon-at', - 'de_CH' => 'flag-icon-ch', 'de_DE' => 'flag-icon-de', 'de_DE_formal' => 'flag-icon-de', + 'de_CH' => 'flag-icon-ch', 'de_CH_informal' => 'flag-icon-ch', 'dzo' => 'flag-icon-bt', 'el' => 'flag-icon-gr', 'en_NZ' => 'flag-icon-nz', - 'en_CA' => 'flag-icon-ca', 'en_GB' => 'flag-icon-gb', - 'en_AU' => 'flag-icon-au', 'en_ZA' => 'flag-icon-za', + 'en_AU' => 'flag-icon-au', + 'en_CA' => 'flag-icon-ca', 'eo' => 'flag-icon-eu', - 'es_ES' => 'flag-icon-es', - 'es_MX' => 'flag-icon-mx', 'es_CO' => 'flag-icon-co', - 'es_CL' => 'flag-icon-cl', + 'es_ES' => 'flag-icon-es', + 'es_AR' => 'flag-icon-ar', 'es_CR' => 'flag-icon-cr', 'es_PE' => 'flag-icon-pe', 'es_VE' => 'flag-icon-ve', @@ -57,14 +56,15 @@ 'es_UY' => 'flag-icon-uy', 'es_PR' => 'flag-icon-pr', 'es_GT' => 'flag-icon-gt', - 'es_AR' => 'flag-icon-ar', + 'es_MX' => 'flag-icon-mx', + 'es_CL' => 'flag-icon-cl', 'et' => 'flag-icon-ee', 'eu' => 'flag-icon-es', 'fa_IR' => 'flag-icon-ir', 'fa_AF' => 'flag-icon-af', 'fi' => 'flag-icon-fi', - 'fr_CA' => 'flag-icon-ca', 'fr_FR' => 'flag-icon-fr', + 'fr_CA' => 'flag-icon-ca', 'fr_BE' => 'flag-icon-be', 'fur' => 'flag-icon-it', 'gd' => 'flag-icon-gb-sct', @@ -106,10 +106,10 @@ 'pa_IN' => 'flag-icon-in', 'pl_PL' => 'flag-icon-pl', 'ps' => 'flag-icon-af', - 'pt_PT_ao90' => 'flag-icon-90', 'pt_PT' => 'flag-icon-pt', - 'pt_AO' => 'flag-icon-ao', 'pt_BR' => 'flag-icon-br', + 'pt_AO' => 'flag-icon-ao', + 'pt_PT_ao90' => 'flag-icon-90', 'ro_RO' => 'flag-icon-ro', 'ru_RU' => 'flag-icon-ru', 'sah' => 'flag-icon-ru', @@ -135,8 +135,8 @@ 'uz_UZ' => 'flag-icon-uz', 'vi' => 'flag-icon-vn', 'zh_TW' => 'flag-icon-tw', - 'zh_HK' => 'flag-icon-hk', 'zh_CN' => 'flag-icon-cn', + 'zh_HK' => 'flag-icon-hk', ); /** diff --git a/assets/flags/flags.php b/assets/flags/flags.php index 2bcd6f436..ed9ffbb60 100644 --- a/assets/flags/flags.php +++ b/assets/flags/flags.php @@ -33,22 +33,21 @@ 'cy' => 'wales.png', 'da_DK' => 'dk.png', 'de_AT' => 'at.png', - 'de_CH' => 'ch.png', 'de_DE' => 'de.png', 'de_DE_formal' => 'de.png', + 'de_CH' => 'ch.png', 'de_CH_informal' => 'ch.png', 'dzo' => 'bt.png', 'el' => 'gr.png', 'en_NZ' => 'nz.png', - 'en_CA' => 'ca.png', 'en_GB' => 'gb.png', - 'en_AU' => 'au.png', 'en_ZA' => 'za.png', + 'en_AU' => 'au.png', + 'en_CA' => 'ca.png', 'eo' => 'europeanunion.png', - 'es_ES' => 'es.png', - 'es_MX' => 'mx.png', 'es_CO' => 'co.png', - 'es_CL' => 'cl.png', + 'es_ES' => 'es.png', + 'es_AR' => 'ar.png', 'es_CR' => 'cr.png', 'es_PE' => 'pe.png', 'es_VE' => 've.png', @@ -57,14 +56,15 @@ 'es_UY' => 'uy.png', 'es_PR' => 'pr.png', 'es_GT' => 'gt.png', - 'es_AR' => 'ar.png', + 'es_MX' => 'mx.png', + 'es_CL' => 'cl.png', 'et' => 'ee.png', 'eu' => 'es.png', 'fa_IR' => 'ir.png', 'fa_AF' => 'af.png', 'fi' => 'fi.png', - 'fr_CA' => 'ca.png', 'fr_FR' => 'fr.png', + 'fr_CA' => 'ca.png', 'fr_BE' => 'be.png', 'fur' => 'it.png', 'gd' => 'scotland.png', @@ -106,10 +106,10 @@ 'pa_IN' => 'in.png', 'pl_PL' => 'pl.png', 'ps' => 'af.png', - 'pt_PT_ao90' => '90.png', 'pt_PT' => 'pt.png', - 'pt_AO' => 'ao.png', 'pt_BR' => 'br.png', + 'pt_AO' => 'ao.png', + 'pt_PT_ao90' => '90.png', 'ro_RO' => 'ro.png', 'ru_RU' => 'ru.png', 'sah' => 'ru.png', @@ -135,8 +135,8 @@ 'uz_UZ' => 'uz.png', 'vi' => 'vn.png', 'zh_TW' => 'tw.png', - 'zh_HK' => 'hk.png', 'zh_CN' => 'cn.png', + 'zh_HK' => 'hk.png', ); /** diff --git a/build/translations.json b/build/translations.json index ae8afa615..28bd47ad0 100644 --- a/build/translations.json +++ b/build/translations.json @@ -1 +1 @@ -{"translations":[{"language":"af","version":"5.8-beta","updated":"2021-05-13 15:59:22","english_name":"Afrikaans","native_name":"Afrikaans","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/af.zip","iso":{"1":"af","2":"afr"},"strings":{"continue":"Gaan voort"}},{"language":"am","version":"6.0.11","updated":"2022-09-29 20:43:49","english_name":"Amharic","native_name":"\u12a0\u121b\u122d\u129b","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.0.11\/am.zip","iso":{"1":"am","2":"amh"},"strings":{"continue":"\u1240\u1325\u120d"}},{"language":"arg","version":"6.2-beta","updated":"2022-09-22 16:46:56","english_name":"Aragonese","native_name":"Aragon\u00e9s","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2-beta\/arg.zip","iso":{"1":"an","2":"arg","3":"arg"},"strings":{"continue":"Continar"}},{"language":"ar","version":"6.4.8","updated":"2024-02-13 12:49:38","english_name":"Arabic","native_name":"\u0627\u0644\u0639\u0631\u0628\u064a\u0629","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/ar.zip","iso":{"1":"ar","2":"ara"},"strings":{"continue":"\u0645\u062a\u0627\u0628\u0639\u0629"}},{"language":"ary","version":"4.8.27","updated":"2017-01-26 15:42:35","english_name":"Moroccan Arabic","native_name":"\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u063a\u0631\u0628\u064a\u0629","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.8.27\/ary.zip","iso":{"1":"ar","3":"ary"},"strings":{"continue":"\u0627\u0644\u0645\u062a\u0627\u0628\u0639\u0629"}},{"language":"as","version":"6.9.4","updated":"2026-03-29 14:19:02","english_name":"Assamese","native_name":"\u0985\u09b8\u09ae\u09c0\u09af\u09bc\u09be","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/as.zip","iso":{"1":"as","2":"asm","3":"asm"},"strings":{"continue":"Continue"}},{"language":"azb","version":"6.4.8","updated":"2024-01-19 08:58:31","english_name":"South Azerbaijani","native_name":"\u06af\u0624\u0646\u0626\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/azb.zip","iso":{"1":"az","3":"azb"},"strings":{"continue":"Continue"}},{"language":"az","version":"4.7.2","updated":"2016-11-06 00:09:27","english_name":"Azerbaijani","native_name":"Az\u0259rbaycan dili","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/az.zip","iso":{"1":"az","2":"aze"},"strings":{"continue":"Davam"}},{"language":"bel","version":"4.9.28","updated":"2024-12-26 00:37:42","english_name":"Belarusian","native_name":"\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f \u043c\u043e\u0432\u0430","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.9.28\/bel.zip","iso":{"1":"be","2":"bel"},"strings":{"continue":"\u041f\u0440\u0430\u0446\u044f\u0433\u043d\u0443\u0446\u044c"}},{"language":"bg_BG","version":"6.9.4","updated":"2026-03-02 09:00:09","english_name":"Bulgarian","native_name":"\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/bg_BG.zip","iso":{"1":"bg","2":"bul"},"strings":{"continue":"\u041d\u0430\u043f\u0440\u0435\u0434"}},{"language":"bn_BD","version":"6.9.4","updated":"2026-02-07 06:54:04","english_name":"Bengali (Bangladesh)","native_name":"\u09ac\u09be\u0982\u09b2\u09be","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/bn_BD.zip","iso":{"1":"bn"},"strings":{"continue":"\u099a\u09be\u09b2\u09bf\u09df\u09c7 \u09af\u09be\u09a8"}},{"language":"bo","version":"5.8-beta","updated":"2020-10-30 03:24:38","english_name":"Tibetan","native_name":"\u0f56\u0f7c\u0f51\u0f0b\u0f61\u0f72\u0f42","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/bo.zip","iso":{"1":"bo","2":"tib"},"strings":{"continue":"\u0f58\u0f74\u0f0b\u0f58\u0f50\u0f74\u0f51\u0f0b\u0f51\u0f74\u0f0d"}},{"language":"bs_BA","version":"6.2.9","updated":"2023-02-22 20:45:53","english_name":"Bosnian","native_name":"Bosanski","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/bs_BA.zip","iso":{"1":"bs","2":"bos"},"strings":{"continue":"Nastavi"}},{"language":"ca","version":"6.9.4","updated":"2026-05-09 07:29:07","english_name":"Catalan","native_name":"Catal\u00e0","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ca.zip","iso":{"1":"ca","2":"cat"},"strings":{"continue":"Continua"}},{"language":"ceb","version":"4.7.2","updated":"2016-03-02 17:25:51","english_name":"Cebuano","native_name":"Cebuano","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/ceb.zip","iso":{"2":"ceb","3":"ceb"},"strings":{"continue":"Padayun"}},{"language":"cs_CZ","version":"6.9.4","updated":"2026-03-28 06:23:08","english_name":"Czech","native_name":"\u010ce\u0161tina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/cs_CZ.zip","iso":{"1":"cs","2":"ces"},"strings":{"continue":"Pokra\u010dovat"}},{"language":"cy","version":"6.9.4","updated":"2026-04-06 11:54:41","english_name":"Welsh","native_name":"Cymraeg","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/cy.zip","iso":{"1":"cy","2":"cym"},"strings":{"continue":"Parhau"}},{"language":"da_DK","version":"6.9.4","updated":"2026-03-28 03:13:47","english_name":"Danish","native_name":"Dansk","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/da_DK.zip","iso":{"1":"da","2":"dan"},"strings":{"continue":"Forts\u00e6t"}},{"language":"de_AT","version":"6.9.4","updated":"2025-10-23 12:01:47","english_name":"German (Austria)","native_name":"Deutsch (\u00d6sterreich)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_AT.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_CH","version":"6.9.4","updated":"2025-11-28 08:11:27","english_name":"German (Switzerland)","native_name":"Deutsch (Schweiz)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_CH.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_DE","version":"6.9.4","updated":"2026-05-11 02:25:51","english_name":"German","native_name":"Deutsch","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_DE.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_DE_formal","version":"6.9.4","updated":"2026-05-11 02:26:14","english_name":"German (Formal)","native_name":"Deutsch (Sie)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_DE_formal.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_CH_informal","version":"6.9.4","updated":"2025-11-28 08:08:17","english_name":"German (Switzerland, Informal)","native_name":"Deutsch (Schweiz, Du)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_CH_informal.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"dsb","version":"6.2.9","updated":"2022-07-16 12:13:09","english_name":"Lower Sorbian","native_name":"Dolnoserb\u0161\u0107ina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/dsb.zip","iso":{"2":"dsb","3":"dsb"},"strings":{"continue":"Dalej"}},{"language":"dzo","version":"4.7.2","updated":"2016-06-29 08:59:03","english_name":"Dzongkha","native_name":"\u0f62\u0fab\u0f7c\u0f44\u0f0b\u0f41","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/dzo.zip","iso":{"1":"dz","2":"dzo"},"strings":{"continue":"Continue"}},{"language":"el","version":"6.9.4","updated":"2026-02-02 11:19:29","english_name":"Greek","native_name":"\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/el.zip","iso":{"1":"el","2":"ell"},"strings":{"continue":"\u03a3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1"}},{"language":"en_NZ","version":"6.9.4","updated":"2025-12-24 12:51:19","english_name":"English (New Zealand)","native_name":"English (New Zealand)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_NZ.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_CA","version":"6.9.4","updated":"2026-03-27 20:40:38","english_name":"English (Canada)","native_name":"English (Canada)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_CA.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_GB","version":"6.9.4","updated":"2026-04-17 10:35:12","english_name":"English (UK)","native_name":"English (UK)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_GB.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_AU","version":"6.9.4","updated":"2026-02-18 19:42:42","english_name":"English (Australia)","native_name":"English (Australia)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_AU.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_ZA","version":"6.9.4","updated":"2026-03-26 14:31:13","english_name":"English (South Africa)","native_name":"English (South Africa)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_ZA.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"eo","version":"6.9.4","updated":"2026-03-30 09:38:37","english_name":"Esperanto","native_name":"Esperanto","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/eo.zip","iso":{"1":"eo","2":"epo"},"strings":{"continue":"Da\u016drigi"}},{"language":"es_ES","version":"6.9.4","updated":"2026-03-28 00:00:14","english_name":"Spanish (Spain)","native_name":"Espa\u00f1ol","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_ES.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_MX","version":"6.9.4","updated":"2026-04-01 22:19:48","english_name":"Spanish (Mexico)","native_name":"Espa\u00f1ol de M\u00e9xico","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_MX.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_CO","version":"6.9.4","updated":"2026-04-15 03:25:24","english_name":"Spanish (Colombia)","native_name":"Espa\u00f1ol de Colombia","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_CO.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_CL","version":"6.9.4","updated":"2026-05-02 11:37:51","english_name":"Spanish (Chile)","native_name":"Espa\u00f1ol de Chile","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_CL.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_CR","version":"6.9","updated":"2025-10-01 22:54:47","english_name":"Spanish (Costa Rica)","native_name":"Espa\u00f1ol de Costa Rica","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9\/es_CR.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_PE","version":"6.9-RC","updated":"2024-10-16 21:04:12","english_name":"Spanish (Peru)","native_name":"Espa\u00f1ol de Per\u00fa","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/es_PE.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_VE","version":"6.4.8","updated":"2023-10-16 16:00:04","english_name":"Spanish (Venezuela)","native_name":"Espa\u00f1ol de Venezuela","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/es_VE.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_EC","version":"6.2.9","updated":"2023-04-21 13:32:10","english_name":"Spanish (Ecuador)","native_name":"Espa\u00f1ol de Ecuador","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/es_EC.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_DO","version":"5.8.13","updated":"2021-10-08 14:32:50","english_name":"Spanish (Dominican Republic)","native_name":"Espa\u00f1ol de Rep\u00fablica Dominicana","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8.13\/es_DO.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_UY","version":"5.8-beta","updated":"2021-03-31 18:33:26","english_name":"Spanish (Uruguay)","native_name":"Espa\u00f1ol de Uruguay","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/es_UY.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_PR","version":"5.4.19","updated":"2020-04-29 15:36:59","english_name":"Spanish (Puerto Rico)","native_name":"Espa\u00f1ol de Puerto Rico","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.4.19\/es_PR.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_GT","version":"5.2.23","updated":"2019-03-02 06:35:01","english_name":"Spanish (Guatemala)","native_name":"Espa\u00f1ol de Guatemala","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.2.23\/es_GT.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_AR","version":"6.9.4","updated":"2026-03-28 03:02:20","english_name":"Spanish (Argentina)","native_name":"Espa\u00f1ol de Argentina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_AR.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"et","version":"6.5.7","updated":"2024-06-06 09:50:37","english_name":"Estonian","native_name":"Eesti","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.5.7\/et.zip","iso":{"1":"et","2":"est"},"strings":{"continue":"J\u00e4tka"}},{"language":"eu","version":"6.9-RC","updated":"2025-11-05 21:53:17","english_name":"Basque","native_name":"Euskara","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/eu.zip","iso":{"1":"eu","2":"eus"},"strings":{"continue":"Jarraitu"}},{"language":"fa_IR","version":"6.9.4","updated":"2026-04-16 16:05:44","english_name":"Persian","native_name":"\u0641\u0627\u0631\u0633\u06cc","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fa_IR.zip","iso":{"1":"fa","2":"fas"},"strings":{"continue":"\u0627\u062f\u0627\u0645\u0647"}},{"language":"fa_AF","version":"6.9-RC","updated":"2025-02-14 17:29:08","english_name":"Persian (Afghanistan)","native_name":"(\u0641\u0627\u0631\u0633\u06cc (\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/fa_AF.zip","iso":{"1":"fa","2":"fas"},"strings":{"continue":"\u0627\u062f\u0627\u0645\u0647"}},{"language":"fi","version":"6.9.4","updated":"2026-02-03 18:15:59","english_name":"Finnish","native_name":"Suomi","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fi.zip","iso":{"1":"fi","2":"fin"},"strings":{"continue":"Jatka"}},{"language":"fr_CA","version":"6.9.4","updated":"2025-10-03 04:54:28","english_name":"French (Canada)","native_name":"Fran\u00e7ais du Canada","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fr_CA.zip","iso":{"1":"fr","2":"fra"},"strings":{"continue":"Continuer"}},{"language":"fr_FR","version":"6.9.4","updated":"2026-04-20 08:59:17","english_name":"French (France)","native_name":"Fran\u00e7ais","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fr_FR.zip","iso":{"1":"fr"},"strings":{"continue":"Continuer"}},{"language":"fr_BE","version":"6.5.8","updated":"2024-02-01 23:56:53","english_name":"French (Belgium)","native_name":"Fran\u00e7ais de Belgique","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.5.8\/fr_BE.zip","iso":{"1":"fr","2":"fra"},"strings":{"continue":"Continuer"}},{"language":"fur","version":"4.8.27","updated":"2025-12-20 19:08:53","english_name":"Friulian","native_name":"Friulian","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.8.27\/fur.zip","iso":{"2":"fur","3":"fur"},"strings":{"continue":"Continue"}},{"language":"fy","version":"6.2.9","updated":"2025-10-21 16:35:04","english_name":"Frisian","native_name":"Frysk","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/fy.zip","iso":{"1":"fy","2":"fry"},"strings":{"continue":"Trochgean"}},{"language":"gd","version":"4.7.2","updated":"2016-08-23 17:41:37","english_name":"Scottish Gaelic","native_name":"G\u00e0idhlig","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/gd.zip","iso":{"1":"gd","2":"gla","3":"gla"},"strings":{"continue":"Lean air adhart"}},{"language":"gl_ES","version":"6.9.4","updated":"2026-05-01 17:19:31","english_name":"Galician","native_name":"Galego","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/gl_ES.zip","iso":{"1":"gl","2":"glg"},"strings":{"continue":"Continuar"}},{"language":"gu","version":"6.9.4","updated":"2026-05-06 07:23:13","english_name":"Gujarati","native_name":"\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/gu.zip","iso":{"1":"gu","2":"guj"},"strings":{"continue":"\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb"}},{"language":"haz","version":"4.4.34","updated":"2015-12-05 00:59:09","english_name":"Hazaragi","native_name":"\u0647\u0632\u0627\u0631\u0647 \u06af\u06cc","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.4.34\/haz.zip","iso":{"3":"haz"},"strings":{"continue":"\u0627\u062f\u0627\u0645\u0647"}},{"language":"he_IL","version":"6.2.9","updated":"2024-05-04 18:39:24","english_name":"Hebrew","native_name":"\u05e2\u05b4\u05d1\u05b0\u05e8\u05b4\u05d9\u05ea","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/he_IL.zip","iso":{"1":"he"},"strings":{"continue":"\u05d4\u05de\u05e9\u05da"}},{"language":"hi_IN","version":"6.4.8","updated":"2025-02-06 05:17:11","english_name":"Hindi","native_name":"\u0939\u093f\u0928\u094d\u0926\u0940","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/hi_IN.zip","iso":{"1":"hi","2":"hin"},"strings":{"continue":"\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902"}},{"language":"hr","version":"6.9.4","updated":"2026-04-08 03:50:43","english_name":"Croatian","native_name":"Hrvatski","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/hr.zip","iso":{"1":"hr","2":"hrv"},"strings":{"continue":"Nastavi"}},{"language":"hsb","version":"6.2.9","updated":"2023-02-22 17:37:32","english_name":"Upper Sorbian","native_name":"Hornjoserb\u0161\u0107ina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/hsb.zip","iso":{"2":"hsb","3":"hsb"},"strings":{"continue":"Dale"}},{"language":"hu_HU","version":"6.9.4","updated":"2026-01-26 09:03:23","english_name":"Hungarian","native_name":"Magyar","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/hu_HU.zip","iso":{"1":"hu","2":"hun"},"strings":{"continue":"Folytat\u00e1s"}},{"language":"hy","version":"4.7.2","updated":"2016-12-03 16:21:10","english_name":"Armenian","native_name":"\u0540\u0561\u0575\u0565\u0580\u0565\u0576","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/hy.zip","iso":{"1":"hy","2":"hye"},"strings":{"continue":"\u0547\u0561\u0580\u0578\u0582\u0576\u0561\u056f\u0565\u056c"}},{"language":"id_ID","version":"6.9.4","updated":"2026-03-11 02:15:15","english_name":"Indonesian","native_name":"Bahasa Indonesia","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/id_ID.zip","iso":{"1":"id","2":"ind"},"strings":{"continue":"Lanjutkan"}},{"language":"is_IS","version":"4.9.28","updated":"2018-12-11 10:40:02","english_name":"Icelandic","native_name":"\u00cdslenska","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.9.28\/is_IS.zip","iso":{"1":"is","2":"isl"},"strings":{"continue":"\u00c1fram"}},{"language":"it_IT","version":"6.9.4","updated":"2026-04-02 17:11:28","english_name":"Italian","native_name":"Italiano","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/it_IT.zip","iso":{"1":"it","2":"ita"},"strings":{"continue":"Continua"}},{"language":"ja","version":"6.9.4","updated":"2026-04-02 15:40:00","english_name":"Japanese","native_name":"\u65e5\u672c\u8a9e","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ja.zip","iso":{"1":"ja"},"strings":{"continue":"\u6b21\u3078"}},{"language":"jv_ID","version":"4.9.28","updated":"2019-02-16 23:58:56","english_name":"Javanese","native_name":"Basa Jawa","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.9.28\/jv_ID.zip","iso":{"1":"jv","2":"jav"},"strings":{"continue":"Nerusak\u00e9"}},{"language":"ka_GE","version":"6.9.4","updated":"2026-04-01 10:56:02","english_name":"Georgian","native_name":"\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ka_GE.zip","iso":{"1":"ka","2":"kat"},"strings":{"continue":"\u10d2\u10d0\u10d2\u10e0\u10eb\u10d4\u10da\u10d4\u10d1\u10d0"}},{"language":"kab","version":"6.2.9","updated":"2023-07-05 11:40:39","english_name":"Kabyle","native_name":"Taqbaylit","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/kab.zip","iso":{"2":"kab","3":"kab"},"strings":{"continue":"Kemmel"}},{"language":"kk","version":"6.9-RC","updated":"2024-07-18 02:49:24","english_name":"Kazakh","native_name":"\u049a\u0430\u0437\u0430\u049b \u0442\u0456\u043b\u0456","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/kk.zip","iso":{"1":"kk","2":"kaz"},"strings":{"continue":"\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443"}},{"language":"km","version":"5.2.23","updated":"2019-06-10 16:18:28","english_name":"Khmer","native_name":"\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.2.23\/km.zip","iso":{"1":"km","2":"khm"},"strings":{"continue":"\u1794\u1793\u17d2\u178f"}},{"language":"kn","version":"6.9.4","updated":"2026-02-02 11:49:59","english_name":"Kannada","native_name":"\u0c95\u0ca8\u0ccd\u0ca8\u0ca1","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/kn.zip","iso":{"1":"kn","2":"kan"},"strings":{"continue":"\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cc1"}},{"language":"ko_KR","version":"6.9.4","updated":"2026-04-28 01:34:54","english_name":"Korean","native_name":"\ud55c\uad6d\uc5b4","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ko_KR.zip","iso":{"1":"ko","2":"kor"},"strings":{"continue":"\uacc4\uc18d"}},{"language":"ckb","version":"6.9.4","updated":"2026-03-24 14:14:21","english_name":"Kurdish (Sorani)","native_name":"\u0643\u0648\u0631\u062f\u06cc\u200e","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ckb.zip","iso":{"1":"ku","3":"ckb"},"strings":{"continue":"\u0628\u0647\u200c\u0631\u062f\u0647\u200c\u0648\u0627\u0645 \u0628\u0647\u200c"}},{"language":"kir","version":"6.9.4","updated":"2026-03-25 22:55:12","english_name":"Kyrgyz","native_name":"\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/kir.zip","iso":{"1":"ky","2":"kir","3":"kir"},"strings":{"continue":"\u0423\u043b\u0430\u043d\u0442\u0443\u0443"}},{"language":"lo","version":"6.9.4","updated":"2026-04-22 10:13:32","english_name":"Lao","native_name":"\u0e9e\u0eb2\u0eaa\u0eb2\u0ea5\u0eb2\u0ea7","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/lo.zip","iso":{"1":"lo","2":"lao"},"strings":{"continue":"\u0e95\u0ecd\u0ec8\u200b\u0ec4\u0e9b"}},{"language":"lt_LT","version":"6.9-RC","updated":"2025-09-27 20:51:17","english_name":"Lithuanian","native_name":"Lietuvi\u0173 kalba","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/lt_LT.zip","iso":{"1":"lt","2":"lit"},"strings":{"continue":"T\u0119sti"}},{"language":"lv","version":"6.9.4","updated":"2026-02-20 20:55:46","english_name":"Latvian","native_name":"Latvie\u0161u valoda","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/lv.zip","iso":{"1":"lv","2":"lav"},"strings":{"continue":"Turpin\u0101t"}},{"language":"mk_MK","version":"6.0.11","updated":"2022-10-01 09:23:52","english_name":"Macedonian","native_name":"\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0458\u0430\u0437\u0438\u043a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.0.11\/mk_MK.zip","iso":{"1":"mk","2":"mkd"},"strings":{"continue":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438"}},{"language":"ml_IN","version":"6.9.4","updated":"2026-03-23 15:49:12","english_name":"Malayalam","native_name":"\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ml_IN.zip","iso":{"1":"ml","2":"mal"},"strings":{"continue":"\u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15"}},{"language":"mn","version":"6.5.8","updated":"2024-06-20 17:22:06","english_name":"Mongolian","native_name":"\u041c\u043e\u043d\u0433\u043e\u043b","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.5.8\/mn.zip","iso":{"1":"mn","2":"mon"},"strings":{"continue":"Continue"}},{"language":"mr","version":"6.9.4","updated":"2026-02-25 15:07:24","english_name":"Marathi","native_name":"\u092e\u0930\u093e\u0920\u0940","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/mr.zip","iso":{"1":"mr","2":"mar"},"strings":{"continue":"\u0938\u0941\u0930\u0941 \u0920\u0947\u0935\u093e"}},{"language":"ms_MY","version":"5.5.18","updated":"2022-03-11 13:52:22","english_name":"Malay","native_name":"Bahasa Melayu","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.5.18\/ms_MY.zip","iso":{"1":"ms","2":"msa"},"strings":{"continue":"Teruskan"}},{"language":"my_MM","version":"4.2.39","updated":"2017-12-26 11:57:10","english_name":"Myanmar (Burmese)","native_name":"\u1017\u1019\u102c\u1005\u102c","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.2.39\/my_MM.zip","iso":{"1":"my","2":"mya"},"strings":{"continue":"\u1006\u1000\u103a\u101c\u1000\u103a\u101c\u102f\u1015\u103a\u1006\u1031\u102c\u1004\u103a\u1015\u102b\u104b"}},{"language":"nb_NO","version":"6.9.4","updated":"2026-03-26 04:23:29","english_name":"Norwegian (Bokm\u00e5l)","native_name":"Norsk bokm\u00e5l","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nb_NO.zip","iso":{"1":"nb","2":"nob"},"strings":{"continue":"Fortsett"}},{"language":"ne_NP","version":"6.9.4","updated":"2026-04-19 16:20:34","english_name":"Nepali","native_name":"\u0928\u0947\u092a\u093e\u0932\u0940","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ne_NP.zip","iso":{"1":"ne","2":"nep"},"strings":{"continue":"\u091c\u093e\u0930\u0940 \u0930\u093e\u0916\u094d\u0928\u0941\u0939\u094b\u0938\u094d"}},{"language":"nl_NL","version":"6.9.4","updated":"2026-03-28 07:28:56","english_name":"Dutch","native_name":"Nederlands","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nl_NL.zip","iso":{"1":"nl","2":"nld"},"strings":{"continue":"Doorgaan"}},{"language":"nl_BE","version":"6.9.4","updated":"2026-05-12 08:00:56","english_name":"Dutch (Belgium)","native_name":"Nederlands (Belgi\u00eb)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nl_BE.zip","iso":{"1":"nl","2":"nld"},"strings":{"continue":"Doorgaan"}},{"language":"nl_NL_formal","version":"6.9.4","updated":"2026-03-28 13:02:36","english_name":"Dutch (Formal)","native_name":"Nederlands (Formeel)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nl_NL_formal.zip","iso":{"1":"nl","2":"nld"},"strings":{"continue":"Doorgaan"}},{"language":"nn_NO","version":"5.8-beta","updated":"2021-03-18 10:59:16","english_name":"Norwegian (Nynorsk)","native_name":"Norsk nynorsk","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/nn_NO.zip","iso":{"1":"nn","2":"nno"},"strings":{"continue":"Hald fram"}},{"language":"oci","version":"4.8.27","updated":"2017-08-25 10:03:08","english_name":"Occitan","native_name":"Occitan","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.8.27\/oci.zip","iso":{"1":"oc","2":"oci"},"strings":{"continue":"Contunhar"}},{"language":"pa_IN","version":"4.7.2","updated":"2017-01-16 05:19:43","english_name":"Panjabi (India)","native_name":"\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/pa_IN.zip","iso":{"1":"pa","2":"pan"},"strings":{"continue":"\u0a1c\u0a3e\u0a30\u0a40 \u0a30\u0a71\u0a16\u0a4b"}},{"language":"pl_PL","version":"6.9.4","updated":"2026-05-07 05:20:47","english_name":"Polish","native_name":"Polski","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pl_PL.zip","iso":{"1":"pl","2":"pol"},"strings":{"continue":"Kontynuuj"}},{"language":"ps","version":"4.3.35","updated":"2015-12-02 21:41:29","english_name":"Pashto","native_name":"\u067e\u069a\u062a\u0648","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.3.35\/ps.zip","iso":{"1":"ps","2":"pus"},"strings":{"continue":"\u062f\u0648\u0627\u0645 \u0648\u0631\u06a9\u0693\u0647"}},{"language":"pt_PT_ao90","version":"6.9.4","updated":"2026-02-04 09:13:24","english_name":"Portuguese (Portugal, AO90)","native_name":"Portugu\u00eas (AO90)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pt_PT_ao90.zip","iso":{"1":"pt"},"strings":{"continue":"Continuar"}},{"language":"pt_PT","version":"6.9.4","updated":"2026-04-09 14:55:33","english_name":"Portuguese (Portugal)","native_name":"Portugu\u00eas","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pt_PT.zip","iso":{"1":"pt"},"strings":{"continue":"Continuar"}},{"language":"pt_AO","version":"6.4.8","updated":"2023-08-21 12:15:00","english_name":"Portuguese (Angola)","native_name":"Portugu\u00eas de Angola","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/pt_AO.zip","iso":{"1":"pt"},"strings":{"continue":"Continuar"}},{"language":"pt_BR","version":"6.9.4","updated":"2026-03-29 18:57:17","english_name":"Portuguese (Brazil)","native_name":"Portugu\u00eas do Brasil","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pt_BR.zip","iso":{"1":"pt","2":"por"},"strings":{"continue":"Continuar"}},{"language":"rhg","version":"4.7.2","updated":"2016-03-16 13:03:18","english_name":"Rohingya","native_name":"Ru\u00e1inga","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/rhg.zip","iso":{"3":"rhg"},"strings":{"continue":"Continue"}},{"language":"ro_RO","version":"6.9.4","updated":"2026-05-07 20:44:09","english_name":"Romanian","native_name":"Rom\u00e2n\u0103","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ro_RO.zip","iso":{"1":"ro","2":"ron"},"strings":{"continue":"Continu\u0103"}},{"language":"ru_RU","version":"6.9.4","updated":"2026-03-28 07:09:12","english_name":"Russian","native_name":"\u0420\u0443\u0441\u0441\u043a\u0438\u0439","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ru_RU.zip","iso":{"1":"ru","2":"rus"},"strings":{"continue":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},{"language":"sah","version":"4.7.2","updated":"2017-01-21 02:06:41","english_name":"Sakha","native_name":"\u0421\u0430\u0445\u0430\u043b\u044b\u044b","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/sah.zip","iso":{"2":"sah","3":"sah"},"strings":{"continue":"\u0421\u0430\u043b\u0495\u0430\u0430"}},{"language":"snd","version":"5.4.19","updated":"2020-07-07 01:53:37","english_name":"Sindhi","native_name":"\u0633\u0646\u068c\u064a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.4.19\/snd.zip","iso":{"1":"sd","2":"snd","3":"snd"},"strings":{"continue":"\u0627\u06b3\u062a\u064a \u0647\u0644\u0648"}},{"language":"si_LK","version":"4.7.2","updated":"2016-11-12 06:00:52","english_name":"Sinhala","native_name":"\u0dc3\u0dd2\u0d82\u0dc4\u0dbd","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/si_LK.zip","iso":{"1":"si","2":"sin"},"strings":{"continue":"\u0daf\u0dd2\u0d9c\u0da7\u0db8 \u0d9a\u0dbb\u0d9c\u0dd9\u0db1 \u0dba\u0db1\u0dca\u0db1"}},{"language":"sk_SK","version":"6.9.4","updated":"2026-02-25 08:52:18","english_name":"Slovak","native_name":"Sloven\u010dina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sk_SK.zip","iso":{"1":"sk","2":"slk"},"strings":{"continue":"Pokra\u010dova\u0165"}},{"language":"skr","version":"6.9-RC","updated":"2025-04-24 16:58:02","english_name":"Saraiki","native_name":"\u0633\u0631\u0627\u0626\u06cc\u06a9\u06cc","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/skr.zip","iso":{"3":"skr"},"strings":{"continue":"\u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u0648"}},{"language":"sl_SI","version":"6.9.4","updated":"2025-10-29 11:19:02","english_name":"Slovenian","native_name":"Sloven\u0161\u010dina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sl_SI.zip","iso":{"1":"sl","2":"slv"},"strings":{"continue":"Nadaljuj"}},{"language":"sq","version":"6.9.4","updated":"2026-02-14 20:39:21","english_name":"Albanian","native_name":"Shqip","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sq.zip","iso":{"1":"sq","2":"sqi"},"strings":{"continue":"Vazhdo"}},{"language":"sr_RS","version":"6.9.4","updated":"2025-12-03 15:37:44","english_name":"Serbian","native_name":"\u0421\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sr_RS.zip","iso":{"1":"sr","2":"srp"},"strings":{"continue":"\u041d\u0430\u0441\u0442\u0430\u0432\u0438"}},{"language":"sv_SE","version":"6.9.4","updated":"2026-03-28 08:26:35","english_name":"Swedish","native_name":"Svenska","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sv_SE.zip","iso":{"1":"sv","2":"swe"},"strings":{"continue":"Forts\u00e4tt"}},{"language":"sw","version":"6.9.4","updated":"2026-02-21 11:17:30","english_name":"Swahili","native_name":"Kiswahili","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sw.zip","iso":{"1":"sw","2":"swa"},"strings":{"continue":"Endelea"}},{"language":"szl","version":"4.7.2","updated":"2016-09-24 19:58:14","english_name":"Silesian","native_name":"\u015al\u014dnsk\u014f g\u014fdka","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/szl.zip","iso":{"3":"szl"},"strings":{"continue":"K\u014dntynuowa\u0107"}},{"language":"ta_IN","version":"4.7.2","updated":"2017-01-27 03:22:47","english_name":"Tamil","native_name":"\u0ba4\u0bae\u0bbf\u0bb4\u0bcd","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/ta_IN.zip","iso":{"1":"ta","2":"tam"},"strings":{"continue":"\u0ba4\u0bca\u0b9f\u0bb0\u0bb5\u0bc1\u0bae\u0bcd"}},{"language":"ta_LK","version":"4.2.39","updated":"2015-12-03 01:07:44","english_name":"Tamil (Sri Lanka)","native_name":"\u0ba4\u0bae\u0bbf\u0bb4\u0bcd","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.2.39\/ta_LK.zip","iso":{"1":"ta","2":"tam"},"strings":{"continue":"\u0ba4\u0bca\u0b9f\u0bb0\u0bcd\u0b95"}},{"language":"te","version":"4.7.2","updated":"2017-01-26 15:47:39","english_name":"Telugu","native_name":"\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/te.zip","iso":{"1":"te","2":"tel"},"strings":{"continue":"\u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c41"}},{"language":"th","version":"5.8.13","updated":"2022-06-08 04:30:30","english_name":"Thai","native_name":"\u0e44\u0e17\u0e22","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8.13\/th.zip","iso":{"1":"th","2":"tha"},"strings":{"continue":"\u0e15\u0e48\u0e2d\u0e44\u0e1b"}},{"language":"tl","version":"6.9.4","updated":"2026-02-26 04:01:56","english_name":"Tagalog","native_name":"Tagalog","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/tl.zip","iso":{"1":"tl","2":"tgl"},"strings":{"continue":"Magpatuloy"}},{"language":"tr_TR","version":"6.9.4","updated":"2026-03-27 23:26:16","english_name":"Turkish","native_name":"T\u00fcrk\u00e7e","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/tr_TR.zip","iso":{"1":"tr","2":"tur"},"strings":{"continue":"Devam"}},{"language":"tt_RU","version":"4.7.2","updated":"2016-11-20 20:20:50","english_name":"Tatar","native_name":"\u0422\u0430\u0442\u0430\u0440 \u0442\u0435\u043b\u0435","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/tt_RU.zip","iso":{"1":"tt","2":"tat"},"strings":{"continue":"\u0434\u04d9\u0432\u0430\u043c \u0438\u0442\u04af"}},{"language":"tah","version":"4.7.2","updated":"2016-03-06 18:39:39","english_name":"Tahitian","native_name":"Reo Tahiti","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/tah.zip","iso":{"1":"ty","2":"tah","3":"tah"},"strings":{"continue":"Continue"}},{"language":"ug_CN","version":"6.9.4","updated":"2026-01-29 23:09:01","english_name":"Uighur","native_name":"\u0626\u06c7\u064a\u063a\u06c7\u0631\u0686\u06d5","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ug_CN.zip","iso":{"1":"ug","2":"uig"},"strings":{"continue":"\u062f\u0627\u06cb\u0627\u0645\u0644\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634"}},{"language":"uk","version":"6.8","updated":"2025-04-18 21:10:00","english_name":"Ukrainian","native_name":"\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.8\/uk.zip","iso":{"1":"uk","2":"ukr"},"strings":{"continue":"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438"}},{"language":"ur","version":"5.4.19","updated":"2020-04-09 11:17:33","english_name":"Urdu","native_name":"\u0627\u0631\u062f\u0648","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.4.19\/ur.zip","iso":{"1":"ur","2":"urd"},"strings":{"continue":"\u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba"}},{"language":"uz_UZ","version":"5.8-beta","updated":"2021-02-28 12:02:22","english_name":"Uzbek","native_name":"O\u2018zbekcha","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/uz_UZ.zip","iso":{"1":"uz","2":"uzb"},"strings":{"continue":"Davom etish"}},{"language":"vi","version":"6.9.4","updated":"2026-04-05 03:31:19","english_name":"Vietnamese","native_name":"Ti\u1ebfng Vi\u1ec7t","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/vi.zip","iso":{"1":"vi","2":"vie"},"strings":{"continue":"Ti\u1ebfp t\u1ee5c"}},{"language":"yor","version":"6.9.4","updated":"2026-03-17 19:42:05","english_name":"Yoruba","native_name":"Yor\u00f9b\u00e1","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/yor.zip","iso":{"1":"yo","2":"yor","3":"yor"},"strings":{"continue":"T\u1eb9\u0300s\u00edw\u00e1j\u00fa si"}},{"language":"zh_TW","version":"6.9.4","updated":"2026-02-11 16:22:59","english_name":"Chinese (Taiwan)","native_name":"\u7e41\u9ad4\u4e2d\u6587","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/zh_TW.zip","iso":{"1":"zh","2":"zho"},"strings":{"continue":"\u7e7c\u7e8c"}},{"language":"zh_HK","version":"6.2.9","updated":"2022-07-15 15:25:03","english_name":"Chinese (Hong Kong)","native_name":"\u9999\u6e2f\u4e2d\u6587","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/zh_HK.zip","iso":{"1":"zh","2":"zho"},"strings":{"continue":"\u7e7c\u7e8c"}},{"language":"zh_CN","version":"6.9.4","updated":"2026-04-01 20:39:14","english_name":"Chinese (China)","native_name":"\u7b80\u4f53\u4e2d\u6587","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/zh_CN.zip","iso":{"1":"zh","2":"zho"},"strings":{"continue":"\u7ee7\u7eed"}}]} \ No newline at end of file +{"translations":[{"language":"af","version":"5.8-beta","updated":"2021-05-13 15:59:22","english_name":"Afrikaans","native_name":"Afrikaans","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/af.zip","iso":{"1":"af","2":"afr"},"strings":{"continue":"Gaan voort"}},{"language":"am","version":"6.0.11","updated":"2022-09-29 20:43:49","english_name":"Amharic","native_name":"\u12a0\u121b\u122d\u129b","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.0.11\/am.zip","iso":{"1":"am","2":"amh"},"strings":{"continue":"\u1240\u1325\u120d"}},{"language":"arg","version":"6.2-beta","updated":"2022-09-22 16:46:56","english_name":"Aragonese","native_name":"Aragon\u00e9s","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2-beta\/arg.zip","iso":{"1":"an","2":"arg","3":"arg"},"strings":{"continue":"Continar"}},{"language":"ar","version":"6.4.8","updated":"2024-02-13 12:49:38","english_name":"Arabic","native_name":"\u0627\u0644\u0639\u0631\u0628\u064a\u0629","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/ar.zip","iso":{"1":"ar","2":"ara"},"strings":{"continue":"\u0645\u062a\u0627\u0628\u0639\u0629"}},{"language":"ary","version":"4.8.27","updated":"2017-01-26 15:42:35","english_name":"Moroccan Arabic","native_name":"\u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0627\u0644\u0645\u063a\u0631\u0628\u064a\u0629","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.8.27\/ary.zip","iso":{"1":"ar","3":"ary"},"strings":{"continue":"\u0627\u0644\u0645\u062a\u0627\u0628\u0639\u0629"}},{"language":"as","version":"6.9.4","updated":"2026-03-29 14:19:02","english_name":"Assamese","native_name":"\u0985\u09b8\u09ae\u09c0\u09af\u09bc\u09be","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/as.zip","iso":{"1":"as","2":"asm","3":"asm"},"strings":{"continue":"Continue"}},{"language":"azb","version":"6.4.8","updated":"2024-01-19 08:58:31","english_name":"South Azerbaijani","native_name":"\u06af\u0624\u0646\u0626\u06cc \u0622\u0630\u0631\u0628\u0627\u06cc\u062c\u0627\u0646","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/azb.zip","iso":{"1":"az","3":"azb"},"strings":{"continue":"Continue"}},{"language":"az","version":"4.7.2","updated":"2016-11-06 00:09:27","english_name":"Azerbaijani","native_name":"Az\u0259rbaycan dili","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/az.zip","iso":{"1":"az","2":"aze"},"strings":{"continue":"Davam"}},{"language":"bel","version":"4.9.28","updated":"2024-12-26 00:37:42","english_name":"Belarusian","native_name":"\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f \u043c\u043e\u0432\u0430","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.9.28\/bel.zip","iso":{"1":"be","2":"bel"},"strings":{"continue":"\u041f\u0440\u0430\u0446\u044f\u0433\u043d\u0443\u0446\u044c"}},{"language":"bg_BG","version":"6.9.4","updated":"2026-03-02 09:00:09","english_name":"Bulgarian","native_name":"\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/bg_BG.zip","iso":{"1":"bg","2":"bul"},"strings":{"continue":"\u041d\u0430\u043f\u0440\u0435\u0434"}},{"language":"bn_BD","version":"6.9.4","updated":"2026-02-07 06:54:04","english_name":"Bengali (Bangladesh)","native_name":"\u09ac\u09be\u0982\u09b2\u09be","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/bn_BD.zip","iso":{"1":"bn"},"strings":{"continue":"\u099a\u09be\u09b2\u09bf\u09df\u09c7 \u09af\u09be\u09a8"}},{"language":"bo","version":"5.8-beta","updated":"2020-10-30 03:24:38","english_name":"Tibetan","native_name":"\u0f56\u0f7c\u0f51\u0f0b\u0f61\u0f72\u0f42","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/bo.zip","iso":{"1":"bo","2":"tib"},"strings":{"continue":"\u0f58\u0f74\u0f0b\u0f58\u0f50\u0f74\u0f51\u0f0b\u0f51\u0f74\u0f0d"}},{"language":"bs_BA","version":"6.2.9","updated":"2023-02-22 20:45:53","english_name":"Bosnian","native_name":"Bosanski","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/bs_BA.zip","iso":{"1":"bs","2":"bos"},"strings":{"continue":"Nastavi"}},{"language":"ca","version":"6.9.4","updated":"2026-05-09 07:29:07","english_name":"Catalan","native_name":"Catal\u00e0","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ca.zip","iso":{"1":"ca","2":"cat"},"strings":{"continue":"Continua"}},{"language":"ceb","version":"4.7.2","updated":"2016-03-02 17:25:51","english_name":"Cebuano","native_name":"Cebuano","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/ceb.zip","iso":{"2":"ceb","3":"ceb"},"strings":{"continue":"Padayun"}},{"language":"cs_CZ","version":"6.9.4","updated":"2026-03-28 06:23:08","english_name":"Czech","native_name":"\u010ce\u0161tina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/cs_CZ.zip","iso":{"1":"cs","2":"ces"},"strings":{"continue":"Pokra\u010dovat"}},{"language":"cy","version":"6.9.4","updated":"2026-04-06 11:54:41","english_name":"Welsh","native_name":"Cymraeg","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/cy.zip","iso":{"1":"cy","2":"cym"},"strings":{"continue":"Parhau"}},{"language":"da_DK","version":"6.9.4","updated":"2026-03-28 03:13:47","english_name":"Danish","native_name":"Dansk","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/da_DK.zip","iso":{"1":"da","2":"dan"},"strings":{"continue":"Forts\u00e6t"}},{"language":"de_AT","version":"6.9.4","updated":"2025-10-23 12:01:47","english_name":"German (Austria)","native_name":"Deutsch (\u00d6sterreich)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_AT.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_CH","version":"6.9.4","updated":"2025-11-28 08:11:27","english_name":"German (Switzerland)","native_name":"Deutsch (Schweiz)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_CH.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_DE","version":"6.9.4","updated":"2026-05-17 04:27:42","english_name":"German","native_name":"Deutsch","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_DE.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_DE_formal","version":"6.9.4","updated":"2026-05-17 04:26:57","english_name":"German (Formal)","native_name":"Deutsch (Sie)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_DE_formal.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"de_CH_informal","version":"6.9.4","updated":"2025-11-28 08:08:17","english_name":"German (Switzerland, Informal)","native_name":"Deutsch (Schweiz, Du)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/de_CH_informal.zip","iso":{"1":"de"},"strings":{"continue":"Weiter"}},{"language":"dsb","version":"6.2.9","updated":"2022-07-16 12:13:09","english_name":"Lower Sorbian","native_name":"Dolnoserb\u0161\u0107ina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/dsb.zip","iso":{"2":"dsb","3":"dsb"},"strings":{"continue":"Dalej"}},{"language":"dzo","version":"4.7.2","updated":"2016-06-29 08:59:03","english_name":"Dzongkha","native_name":"\u0f62\u0fab\u0f7c\u0f44\u0f0b\u0f41","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/dzo.zip","iso":{"1":"dz","2":"dzo"},"strings":{"continue":"Continue"}},{"language":"el","version":"6.9.4","updated":"2026-02-02 11:19:29","english_name":"Greek","native_name":"\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/el.zip","iso":{"1":"el","2":"ell"},"strings":{"continue":"\u03a3\u03c5\u03bd\u03ad\u03c7\u03b5\u03b9\u03b1"}},{"language":"en_NZ","version":"6.9.4","updated":"2025-12-24 12:51:19","english_name":"English (New Zealand)","native_name":"English (New Zealand)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_NZ.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_CA","version":"6.9.4","updated":"2026-03-27 20:40:38","english_name":"English (Canada)","native_name":"English (Canada)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_CA.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_GB","version":"6.9.4","updated":"2026-04-17 10:35:12","english_name":"English (UK)","native_name":"English (UK)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_GB.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_AU","version":"6.9.4","updated":"2026-02-18 19:42:42","english_name":"English (Australia)","native_name":"English (Australia)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_AU.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"en_ZA","version":"6.9.4","updated":"2026-03-26 14:31:13","english_name":"English (South Africa)","native_name":"English (South Africa)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/en_ZA.zip","iso":{"1":"en","2":"eng","3":"eng"},"strings":{"continue":"Continue"}},{"language":"eo","version":"6.9.4","updated":"2026-03-30 09:38:37","english_name":"Esperanto","native_name":"Esperanto","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/eo.zip","iso":{"1":"eo","2":"epo"},"strings":{"continue":"Da\u016drigi"}},{"language":"es_ES","version":"6.9.4","updated":"2026-03-28 00:00:14","english_name":"Spanish (Spain)","native_name":"Espa\u00f1ol","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_ES.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_MX","version":"6.9.4","updated":"2026-04-01 22:19:48","english_name":"Spanish (Mexico)","native_name":"Espa\u00f1ol de M\u00e9xico","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_MX.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_CO","version":"6.9.4","updated":"2026-04-15 03:25:24","english_name":"Spanish (Colombia)","native_name":"Espa\u00f1ol de Colombia","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_CO.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_CL","version":"6.9.4","updated":"2026-05-02 11:37:51","english_name":"Spanish (Chile)","native_name":"Espa\u00f1ol de Chile","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_CL.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_CR","version":"6.9","updated":"2025-10-01 22:54:47","english_name":"Spanish (Costa Rica)","native_name":"Espa\u00f1ol de Costa Rica","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9\/es_CR.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_PE","version":"6.9-RC","updated":"2024-10-16 21:04:12","english_name":"Spanish (Peru)","native_name":"Espa\u00f1ol de Per\u00fa","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/es_PE.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_VE","version":"6.4.8","updated":"2023-10-16 16:00:04","english_name":"Spanish (Venezuela)","native_name":"Espa\u00f1ol de Venezuela","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/es_VE.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_EC","version":"6.2.9","updated":"2023-04-21 13:32:10","english_name":"Spanish (Ecuador)","native_name":"Espa\u00f1ol de Ecuador","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/es_EC.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_DO","version":"5.8.13","updated":"2021-10-08 14:32:50","english_name":"Spanish (Dominican Republic)","native_name":"Espa\u00f1ol de Rep\u00fablica Dominicana","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8.13\/es_DO.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_UY","version":"5.8-beta","updated":"2021-03-31 18:33:26","english_name":"Spanish (Uruguay)","native_name":"Espa\u00f1ol de Uruguay","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/es_UY.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_PR","version":"5.4.19","updated":"2020-04-29 15:36:59","english_name":"Spanish (Puerto Rico)","native_name":"Espa\u00f1ol de Puerto Rico","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.4.19\/es_PR.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_GT","version":"5.2.23","updated":"2019-03-02 06:35:01","english_name":"Spanish (Guatemala)","native_name":"Espa\u00f1ol de Guatemala","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.2.23\/es_GT.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"es_AR","version":"6.9.4","updated":"2026-03-28 03:02:20","english_name":"Spanish (Argentina)","native_name":"Espa\u00f1ol de Argentina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/es_AR.zip","iso":{"1":"es","2":"spa","3":"spa"},"strings":{"continue":"Continuar"}},{"language":"et","version":"6.5.7","updated":"2024-06-06 09:50:37","english_name":"Estonian","native_name":"Eesti","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.5.7\/et.zip","iso":{"1":"et","2":"est"},"strings":{"continue":"J\u00e4tka"}},{"language":"eu","version":"6.9-RC","updated":"2025-11-05 21:53:17","english_name":"Basque","native_name":"Euskara","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/eu.zip","iso":{"1":"eu","2":"eus"},"strings":{"continue":"Jarraitu"}},{"language":"fa_IR","version":"6.9.4","updated":"2026-04-16 16:05:44","english_name":"Persian","native_name":"\u0641\u0627\u0631\u0633\u06cc","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fa_IR.zip","iso":{"1":"fa","2":"fas"},"strings":{"continue":"\u0627\u062f\u0627\u0645\u0647"}},{"language":"fa_AF","version":"6.9-RC","updated":"2025-02-14 17:29:08","english_name":"Persian (Afghanistan)","native_name":"(\u0641\u0627\u0631\u0633\u06cc (\u0627\u0641\u063a\u0627\u0646\u0633\u062a\u0627\u0646","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/fa_AF.zip","iso":{"1":"fa","2":"fas"},"strings":{"continue":"\u0627\u062f\u0627\u0645\u0647"}},{"language":"fi","version":"6.9.4","updated":"2026-02-03 18:15:59","english_name":"Finnish","native_name":"Suomi","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fi.zip","iso":{"1":"fi","2":"fin"},"strings":{"continue":"Jatka"}},{"language":"fr_CA","version":"6.9.4","updated":"2025-10-03 04:54:28","english_name":"French (Canada)","native_name":"Fran\u00e7ais du Canada","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fr_CA.zip","iso":{"1":"fr","2":"fra"},"strings":{"continue":"Continuer"}},{"language":"fr_FR","version":"6.9.4","updated":"2026-04-20 08:59:17","english_name":"French (France)","native_name":"Fran\u00e7ais","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/fr_FR.zip","iso":{"1":"fr"},"strings":{"continue":"Continuer"}},{"language":"fr_BE","version":"6.5.8","updated":"2024-02-01 23:56:53","english_name":"French (Belgium)","native_name":"Fran\u00e7ais de Belgique","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.5.8\/fr_BE.zip","iso":{"1":"fr","2":"fra"},"strings":{"continue":"Continuer"}},{"language":"fur","version":"4.8.27","updated":"2025-12-20 19:08:53","english_name":"Friulian","native_name":"Friulian","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.8.27\/fur.zip","iso":{"2":"fur","3":"fur"},"strings":{"continue":"Continue"}},{"language":"fy","version":"6.2.9","updated":"2025-10-21 16:35:04","english_name":"Frisian","native_name":"Frysk","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/fy.zip","iso":{"1":"fy","2":"fry"},"strings":{"continue":"Trochgean"}},{"language":"gd","version":"4.7.2","updated":"2016-08-23 17:41:37","english_name":"Scottish Gaelic","native_name":"G\u00e0idhlig","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/gd.zip","iso":{"1":"gd","2":"gla","3":"gla"},"strings":{"continue":"Lean air adhart"}},{"language":"gl_ES","version":"6.9.4","updated":"2026-05-01 17:19:31","english_name":"Galician","native_name":"Galego","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/gl_ES.zip","iso":{"1":"gl","2":"glg"},"strings":{"continue":"Continuar"}},{"language":"gu","version":"6.9.4","updated":"2026-05-06 07:23:13","english_name":"Gujarati","native_name":"\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/gu.zip","iso":{"1":"gu","2":"guj"},"strings":{"continue":"\u0a9a\u0abe\u0ab2\u0ac1 \u0ab0\u0abe\u0a96\u0acb"}},{"language":"haz","version":"4.4.34","updated":"2015-12-05 00:59:09","english_name":"Hazaragi","native_name":"\u0647\u0632\u0627\u0631\u0647 \u06af\u06cc","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.4.34\/haz.zip","iso":{"3":"haz"},"strings":{"continue":"\u0627\u062f\u0627\u0645\u0647"}},{"language":"he_IL","version":"6.2.9","updated":"2024-05-04 18:39:24","english_name":"Hebrew","native_name":"\u05e2\u05b4\u05d1\u05b0\u05e8\u05b4\u05d9\u05ea","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/he_IL.zip","iso":{"1":"he"},"strings":{"continue":"\u05d4\u05de\u05e9\u05da"}},{"language":"hi_IN","version":"6.4.8","updated":"2025-02-06 05:17:11","english_name":"Hindi","native_name":"\u0939\u093f\u0928\u094d\u0926\u0940","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/hi_IN.zip","iso":{"1":"hi","2":"hin"},"strings":{"continue":"\u091c\u093e\u0930\u0940 \u0930\u0916\u0947\u0902"}},{"language":"hr","version":"6.9.4","updated":"2026-04-08 03:50:43","english_name":"Croatian","native_name":"Hrvatski","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/hr.zip","iso":{"1":"hr","2":"hrv"},"strings":{"continue":"Nastavi"}},{"language":"hsb","version":"6.2.9","updated":"2023-02-22 17:37:32","english_name":"Upper Sorbian","native_name":"Hornjoserb\u0161\u0107ina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/hsb.zip","iso":{"2":"hsb","3":"hsb"},"strings":{"continue":"Dale"}},{"language":"hu_HU","version":"6.9.4","updated":"2026-01-26 09:03:23","english_name":"Hungarian","native_name":"Magyar","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/hu_HU.zip","iso":{"1":"hu","2":"hun"},"strings":{"continue":"Folytat\u00e1s"}},{"language":"hy","version":"4.7.2","updated":"2016-12-03 16:21:10","english_name":"Armenian","native_name":"\u0540\u0561\u0575\u0565\u0580\u0565\u0576","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/hy.zip","iso":{"1":"hy","2":"hye"},"strings":{"continue":"\u0547\u0561\u0580\u0578\u0582\u0576\u0561\u056f\u0565\u056c"}},{"language":"id_ID","version":"6.9.4","updated":"2026-03-11 02:15:15","english_name":"Indonesian","native_name":"Bahasa Indonesia","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/id_ID.zip","iso":{"1":"id","2":"ind"},"strings":{"continue":"Lanjutkan"}},{"language":"is_IS","version":"4.9.28","updated":"2018-12-11 10:40:02","english_name":"Icelandic","native_name":"\u00cdslenska","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.9.28\/is_IS.zip","iso":{"1":"is","2":"isl"},"strings":{"continue":"\u00c1fram"}},{"language":"it_IT","version":"6.9.4","updated":"2026-04-02 17:11:28","english_name":"Italian","native_name":"Italiano","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/it_IT.zip","iso":{"1":"it","2":"ita"},"strings":{"continue":"Continua"}},{"language":"ja","version":"6.9.4","updated":"2026-04-02 15:40:00","english_name":"Japanese","native_name":"\u65e5\u672c\u8a9e","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ja.zip","iso":{"1":"ja"},"strings":{"continue":"\u6b21\u3078"}},{"language":"jv_ID","version":"4.9.28","updated":"2019-02-16 23:58:56","english_name":"Javanese","native_name":"Basa Jawa","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.9.28\/jv_ID.zip","iso":{"1":"jv","2":"jav"},"strings":{"continue":"Nerusak\u00e9"}},{"language":"ka_GE","version":"6.9.4","updated":"2026-04-01 10:56:02","english_name":"Georgian","native_name":"\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ka_GE.zip","iso":{"1":"ka","2":"kat"},"strings":{"continue":"\u10d2\u10d0\u10d2\u10e0\u10eb\u10d4\u10da\u10d4\u10d1\u10d0"}},{"language":"kab","version":"6.2.9","updated":"2023-07-05 11:40:39","english_name":"Kabyle","native_name":"Taqbaylit","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/kab.zip","iso":{"2":"kab","3":"kab"},"strings":{"continue":"Kemmel"}},{"language":"kk","version":"6.9-RC","updated":"2024-07-18 02:49:24","english_name":"Kazakh","native_name":"\u049a\u0430\u0437\u0430\u049b \u0442\u0456\u043b\u0456","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/kk.zip","iso":{"1":"kk","2":"kaz"},"strings":{"continue":"\u0416\u0430\u043b\u0493\u0430\u0441\u0442\u044b\u0440\u0443"}},{"language":"km","version":"5.2.23","updated":"2019-06-10 16:18:28","english_name":"Khmer","native_name":"\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.2.23\/km.zip","iso":{"1":"km","2":"khm"},"strings":{"continue":"\u1794\u1793\u17d2\u178f"}},{"language":"kn","version":"6.9.4","updated":"2026-02-02 11:49:59","english_name":"Kannada","native_name":"\u0c95\u0ca8\u0ccd\u0ca8\u0ca1","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/kn.zip","iso":{"1":"kn","2":"kan"},"strings":{"continue":"\u0cae\u0cc1\u0c82\u0ca6\u0cc1\u0cb5\u0cb0\u0cbf\u0cb8\u0cc1"}},{"language":"ko_KR","version":"6.9.4","updated":"2026-04-28 01:34:54","english_name":"Korean","native_name":"\ud55c\uad6d\uc5b4","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ko_KR.zip","iso":{"1":"ko","2":"kor"},"strings":{"continue":"\uacc4\uc18d"}},{"language":"ckb","version":"6.9.4","updated":"2026-03-24 14:14:21","english_name":"Kurdish (Sorani)","native_name":"\u0643\u0648\u0631\u062f\u06cc\u200e","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ckb.zip","iso":{"1":"ku","3":"ckb"},"strings":{"continue":"\u0628\u0647\u200c\u0631\u062f\u0647\u200c\u0648\u0627\u0645 \u0628\u0647\u200c"}},{"language":"kir","version":"6.9.4","updated":"2026-03-25 22:55:12","english_name":"Kyrgyz","native_name":"\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/kir.zip","iso":{"1":"ky","2":"kir","3":"kir"},"strings":{"continue":"\u0423\u043b\u0430\u043d\u0442\u0443\u0443"}},{"language":"lo","version":"6.9.4","updated":"2026-04-22 10:13:32","english_name":"Lao","native_name":"\u0e9e\u0eb2\u0eaa\u0eb2\u0ea5\u0eb2\u0ea7","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/lo.zip","iso":{"1":"lo","2":"lao"},"strings":{"continue":"\u0e95\u0ecd\u0ec8\u200b\u0ec4\u0e9b"}},{"language":"lt_LT","version":"6.9-RC","updated":"2025-09-27 20:51:17","english_name":"Lithuanian","native_name":"Lietuvi\u0173 kalba","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/lt_LT.zip","iso":{"1":"lt","2":"lit"},"strings":{"continue":"T\u0119sti"}},{"language":"lv","version":"6.9.4","updated":"2026-02-20 20:55:46","english_name":"Latvian","native_name":"Latvie\u0161u valoda","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/lv.zip","iso":{"1":"lv","2":"lav"},"strings":{"continue":"Turpin\u0101t"}},{"language":"mk_MK","version":"6.0.11","updated":"2022-10-01 09:23:52","english_name":"Macedonian","native_name":"\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438 \u0458\u0430\u0437\u0438\u043a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.0.11\/mk_MK.zip","iso":{"1":"mk","2":"mkd"},"strings":{"continue":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438"}},{"language":"ml_IN","version":"6.9.4","updated":"2026-03-23 15:49:12","english_name":"Malayalam","native_name":"\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ml_IN.zip","iso":{"1":"ml","2":"mal"},"strings":{"continue":"\u0d24\u0d41\u0d1f\u0d30\u0d41\u0d15"}},{"language":"mn","version":"6.5.8","updated":"2024-06-20 17:22:06","english_name":"Mongolian","native_name":"\u041c\u043e\u043d\u0433\u043e\u043b","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.5.8\/mn.zip","iso":{"1":"mn","2":"mon"},"strings":{"continue":"Continue"}},{"language":"mr","version":"6.9.4","updated":"2026-02-25 15:07:24","english_name":"Marathi","native_name":"\u092e\u0930\u093e\u0920\u0940","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/mr.zip","iso":{"1":"mr","2":"mar"},"strings":{"continue":"\u0938\u0941\u0930\u0941 \u0920\u0947\u0935\u093e"}},{"language":"ms_MY","version":"5.5.18","updated":"2022-03-11 13:52:22","english_name":"Malay","native_name":"Bahasa Melayu","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.5.18\/ms_MY.zip","iso":{"1":"ms","2":"msa"},"strings":{"continue":"Teruskan"}},{"language":"my_MM","version":"4.2.39","updated":"2017-12-26 11:57:10","english_name":"Myanmar (Burmese)","native_name":"\u1017\u1019\u102c\u1005\u102c","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.2.39\/my_MM.zip","iso":{"1":"my","2":"mya"},"strings":{"continue":"\u1006\u1000\u103a\u101c\u1000\u103a\u101c\u102f\u1015\u103a\u1006\u1031\u102c\u1004\u103a\u1015\u102b\u104b"}},{"language":"nb_NO","version":"6.9.4","updated":"2026-03-26 04:23:29","english_name":"Norwegian (Bokm\u00e5l)","native_name":"Norsk bokm\u00e5l","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nb_NO.zip","iso":{"1":"nb","2":"nob"},"strings":{"continue":"Fortsett"}},{"language":"ne_NP","version":"6.9.4","updated":"2026-04-19 16:20:34","english_name":"Nepali","native_name":"\u0928\u0947\u092a\u093e\u0932\u0940","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ne_NP.zip","iso":{"1":"ne","2":"nep"},"strings":{"continue":"\u091c\u093e\u0930\u0940 \u0930\u093e\u0916\u094d\u0928\u0941\u0939\u094b\u0938\u094d"}},{"language":"nl_NL","version":"6.9.4","updated":"2026-03-28 07:28:56","english_name":"Dutch","native_name":"Nederlands","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nl_NL.zip","iso":{"1":"nl","2":"nld"},"strings":{"continue":"Doorgaan"}},{"language":"nl_BE","version":"6.9.4","updated":"2026-05-12 08:00:56","english_name":"Dutch (Belgium)","native_name":"Nederlands (Belgi\u00eb)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nl_BE.zip","iso":{"1":"nl","2":"nld"},"strings":{"continue":"Doorgaan"}},{"language":"nl_NL_formal","version":"6.9.4","updated":"2026-03-28 13:02:36","english_name":"Dutch (Formal)","native_name":"Nederlands (Formeel)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/nl_NL_formal.zip","iso":{"1":"nl","2":"nld"},"strings":{"continue":"Doorgaan"}},{"language":"nn_NO","version":"5.8-beta","updated":"2021-03-18 10:59:16","english_name":"Norwegian (Nynorsk)","native_name":"Norsk nynorsk","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/nn_NO.zip","iso":{"1":"nn","2":"nno"},"strings":{"continue":"Hald fram"}},{"language":"oci","version":"4.8.27","updated":"2017-08-25 10:03:08","english_name":"Occitan","native_name":"Occitan","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.8.27\/oci.zip","iso":{"1":"oc","2":"oci"},"strings":{"continue":"Contunhar"}},{"language":"pa_IN","version":"4.7.2","updated":"2017-01-16 05:19:43","english_name":"Panjabi (India)","native_name":"\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/pa_IN.zip","iso":{"1":"pa","2":"pan"},"strings":{"continue":"\u0a1c\u0a3e\u0a30\u0a40 \u0a30\u0a71\u0a16\u0a4b"}},{"language":"pl_PL","version":"6.9.4","updated":"2026-05-07 05:20:47","english_name":"Polish","native_name":"Polski","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pl_PL.zip","iso":{"1":"pl","2":"pol"},"strings":{"continue":"Kontynuuj"}},{"language":"ps","version":"4.3.35","updated":"2015-12-02 21:41:29","english_name":"Pashto","native_name":"\u067e\u069a\u062a\u0648","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.3.35\/ps.zip","iso":{"1":"ps","2":"pus"},"strings":{"continue":"\u062f\u0648\u0627\u0645 \u0648\u0631\u06a9\u0693\u0647"}},{"language":"pt_PT_ao90","version":"6.9.4","updated":"2026-02-04 09:13:24","english_name":"Portuguese (Portugal, AO90)","native_name":"Portugu\u00eas (AO90)","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pt_PT_ao90.zip","iso":{"1":"pt"},"strings":{"continue":"Continuar"}},{"language":"pt_PT","version":"6.9.4","updated":"2026-04-09 14:55:33","english_name":"Portuguese (Portugal)","native_name":"Portugu\u00eas","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pt_PT.zip","iso":{"1":"pt"},"strings":{"continue":"Continuar"}},{"language":"pt_AO","version":"6.4.8","updated":"2023-08-21 12:15:00","english_name":"Portuguese (Angola)","native_name":"Portugu\u00eas de Angola","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.4.8\/pt_AO.zip","iso":{"1":"pt"},"strings":{"continue":"Continuar"}},{"language":"pt_BR","version":"6.9.4","updated":"2026-03-29 18:57:17","english_name":"Portuguese (Brazil)","native_name":"Portugu\u00eas do Brasil","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/pt_BR.zip","iso":{"1":"pt","2":"por"},"strings":{"continue":"Continuar"}},{"language":"rhg","version":"4.7.2","updated":"2016-03-16 13:03:18","english_name":"Rohingya","native_name":"Ru\u00e1inga","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/rhg.zip","iso":{"3":"rhg"},"strings":{"continue":"Continue"}},{"language":"ro_RO","version":"6.9.4","updated":"2026-05-07 20:44:09","english_name":"Romanian","native_name":"Rom\u00e2n\u0103","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ro_RO.zip","iso":{"1":"ro","2":"ron"},"strings":{"continue":"Continu\u0103"}},{"language":"ru_RU","version":"6.9.4","updated":"2026-03-28 07:09:12","english_name":"Russian","native_name":"\u0420\u0443\u0441\u0441\u043a\u0438\u0439","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ru_RU.zip","iso":{"1":"ru","2":"rus"},"strings":{"continue":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c"}},{"language":"sah","version":"4.7.2","updated":"2017-01-21 02:06:41","english_name":"Sakha","native_name":"\u0421\u0430\u0445\u0430\u043b\u044b\u044b","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/sah.zip","iso":{"2":"sah","3":"sah"},"strings":{"continue":"\u0421\u0430\u043b\u0495\u0430\u0430"}},{"language":"snd","version":"5.4.19","updated":"2020-07-07 01:53:37","english_name":"Sindhi","native_name":"\u0633\u0646\u068c\u064a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.4.19\/snd.zip","iso":{"1":"sd","2":"snd","3":"snd"},"strings":{"continue":"\u0627\u06b3\u062a\u064a \u0647\u0644\u0648"}},{"language":"si_LK","version":"4.7.2","updated":"2016-11-12 06:00:52","english_name":"Sinhala","native_name":"\u0dc3\u0dd2\u0d82\u0dc4\u0dbd","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/si_LK.zip","iso":{"1":"si","2":"sin"},"strings":{"continue":"\u0daf\u0dd2\u0d9c\u0da7\u0db8 \u0d9a\u0dbb\u0d9c\u0dd9\u0db1 \u0dba\u0db1\u0dca\u0db1"}},{"language":"sk_SK","version":"6.9.4","updated":"2026-02-25 08:52:18","english_name":"Slovak","native_name":"Sloven\u010dina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sk_SK.zip","iso":{"1":"sk","2":"slk"},"strings":{"continue":"Pokra\u010dova\u0165"}},{"language":"skr","version":"6.9-RC","updated":"2025-04-24 16:58:02","english_name":"Saraiki","native_name":"\u0633\u0631\u0627\u0626\u06cc\u06a9\u06cc","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9-RC\/skr.zip","iso":{"3":"skr"},"strings":{"continue":"\u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u0648"}},{"language":"sl_SI","version":"6.9.4","updated":"2025-10-29 11:19:02","english_name":"Slovenian","native_name":"Sloven\u0161\u010dina","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sl_SI.zip","iso":{"1":"sl","2":"slv"},"strings":{"continue":"Nadaljuj"}},{"language":"sq","version":"6.9.4","updated":"2026-05-13 20:11:24","english_name":"Albanian","native_name":"Shqip","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sq.zip","iso":{"1":"sq","2":"sqi"},"strings":{"continue":"Vazhdo"}},{"language":"sr_RS","version":"6.9.4","updated":"2025-12-03 15:37:44","english_name":"Serbian","native_name":"\u0421\u0440\u043f\u0441\u043a\u0438 \u0458\u0435\u0437\u0438\u043a","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sr_RS.zip","iso":{"1":"sr","2":"srp"},"strings":{"continue":"\u041d\u0430\u0441\u0442\u0430\u0432\u0438"}},{"language":"sv_SE","version":"6.9.4","updated":"2026-03-28 08:26:35","english_name":"Swedish","native_name":"Svenska","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sv_SE.zip","iso":{"1":"sv","2":"swe"},"strings":{"continue":"Forts\u00e4tt"}},{"language":"sw","version":"6.9.4","updated":"2026-02-21 11:17:30","english_name":"Swahili","native_name":"Kiswahili","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/sw.zip","iso":{"1":"sw","2":"swa"},"strings":{"continue":"Endelea"}},{"language":"szl","version":"4.7.2","updated":"2016-09-24 19:58:14","english_name":"Silesian","native_name":"\u015al\u014dnsk\u014f g\u014fdka","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/szl.zip","iso":{"3":"szl"},"strings":{"continue":"K\u014dntynuowa\u0107"}},{"language":"ta_IN","version":"4.7.2","updated":"2017-01-27 03:22:47","english_name":"Tamil","native_name":"\u0ba4\u0bae\u0bbf\u0bb4\u0bcd","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/ta_IN.zip","iso":{"1":"ta","2":"tam"},"strings":{"continue":"\u0ba4\u0bca\u0b9f\u0bb0\u0bb5\u0bc1\u0bae\u0bcd"}},{"language":"ta_LK","version":"4.2.39","updated":"2015-12-03 01:07:44","english_name":"Tamil (Sri Lanka)","native_name":"\u0ba4\u0bae\u0bbf\u0bb4\u0bcd","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.2.39\/ta_LK.zip","iso":{"1":"ta","2":"tam"},"strings":{"continue":"\u0ba4\u0bca\u0b9f\u0bb0\u0bcd\u0b95"}},{"language":"te","version":"4.7.2","updated":"2017-01-26 15:47:39","english_name":"Telugu","native_name":"\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/te.zip","iso":{"1":"te","2":"tel"},"strings":{"continue":"\u0c15\u0c4a\u0c28\u0c38\u0c3e\u0c17\u0c3f\u0c02\u0c1a\u0c41"}},{"language":"th","version":"5.8.13","updated":"2022-06-08 04:30:30","english_name":"Thai","native_name":"\u0e44\u0e17\u0e22","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8.13\/th.zip","iso":{"1":"th","2":"tha"},"strings":{"continue":"\u0e15\u0e48\u0e2d\u0e44\u0e1b"}},{"language":"tl","version":"6.9.4","updated":"2026-02-26 04:01:56","english_name":"Tagalog","native_name":"Tagalog","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/tl.zip","iso":{"1":"tl","2":"tgl"},"strings":{"continue":"Magpatuloy"}},{"language":"tr_TR","version":"6.9.4","updated":"2026-03-27 23:26:16","english_name":"Turkish","native_name":"T\u00fcrk\u00e7e","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/tr_TR.zip","iso":{"1":"tr","2":"tur"},"strings":{"continue":"Devam"}},{"language":"tt_RU","version":"4.7.2","updated":"2016-11-20 20:20:50","english_name":"Tatar","native_name":"\u0422\u0430\u0442\u0430\u0440 \u0442\u0435\u043b\u0435","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/tt_RU.zip","iso":{"1":"tt","2":"tat"},"strings":{"continue":"\u0434\u04d9\u0432\u0430\u043c \u0438\u0442\u04af"}},{"language":"tah","version":"4.7.2","updated":"2016-03-06 18:39:39","english_name":"Tahitian","native_name":"Reo Tahiti","package":"http:\/\/downloads.wordpress.org\/translation\/core\/4.7.2\/tah.zip","iso":{"1":"ty","2":"tah","3":"tah"},"strings":{"continue":"Continue"}},{"language":"ug_CN","version":"6.9.4","updated":"2026-01-29 23:09:01","english_name":"Uighur","native_name":"\u0626\u06c7\u064a\u063a\u06c7\u0631\u0686\u06d5","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/ug_CN.zip","iso":{"1":"ug","2":"uig"},"strings":{"continue":"\u062f\u0627\u06cb\u0627\u0645\u0644\u0627\u0634\u062a\u06c7\u0631\u06c7\u0634"}},{"language":"uk","version":"6.8","updated":"2025-04-18 21:10:00","english_name":"Ukrainian","native_name":"\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.8\/uk.zip","iso":{"1":"uk","2":"ukr"},"strings":{"continue":"\u041f\u0440\u043e\u0434\u043e\u0432\u0436\u0438\u0442\u0438"}},{"language":"ur","version":"5.4.19","updated":"2020-04-09 11:17:33","english_name":"Urdu","native_name":"\u0627\u0631\u062f\u0648","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.4.19\/ur.zip","iso":{"1":"ur","2":"urd"},"strings":{"continue":"\u062c\u0627\u0631\u06cc \u0631\u06a9\u06be\u06cc\u06ba"}},{"language":"uz_UZ","version":"5.8-beta","updated":"2021-02-28 12:02:22","english_name":"Uzbek","native_name":"O\u2018zbekcha","package":"http:\/\/downloads.wordpress.org\/translation\/core\/5.8-beta\/uz_UZ.zip","iso":{"1":"uz","2":"uzb"},"strings":{"continue":"Davom etish"}},{"language":"vi","version":"6.9.4","updated":"2026-04-05 03:31:19","english_name":"Vietnamese","native_name":"Ti\u1ebfng Vi\u1ec7t","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/vi.zip","iso":{"1":"vi","2":"vie"},"strings":{"continue":"Ti\u1ebfp t\u1ee5c"}},{"language":"yor","version":"6.9.4","updated":"2026-03-17 19:42:05","english_name":"Yoruba","native_name":"Yor\u00f9b\u00e1","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/yor.zip","iso":{"1":"yo","2":"yor","3":"yor"},"strings":{"continue":"T\u1eb9\u0300s\u00edw\u00e1j\u00fa si"}},{"language":"zh_TW","version":"6.9.4","updated":"2026-02-11 16:22:59","english_name":"Chinese (Taiwan)","native_name":"\u7e41\u9ad4\u4e2d\u6587","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/zh_TW.zip","iso":{"1":"zh","2":"zho"},"strings":{"continue":"\u7e7c\u7e8c"}},{"language":"zh_HK","version":"6.2.9","updated":"2022-07-15 15:25:03","english_name":"Chinese (Hong Kong)","native_name":"\u9999\u6e2f\u4e2d\u6587","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.2.9\/zh_HK.zip","iso":{"1":"zh","2":"zho"},"strings":{"continue":"\u7e7c\u7e8c"}},{"language":"zh_CN","version":"6.9.4","updated":"2026-04-01 20:39:14","english_name":"Chinese (China)","native_name":"\u7b80\u4f53\u4e2d\u6587","package":"http:\/\/downloads.wordpress.org\/translation\/core\/6.9.4\/zh_CN.zip","iso":{"1":"zh","2":"zho"},"strings":{"continue":"\u7ee7\u7eed"}}]} \ No newline at end of file diff --git a/composer.json b/composer.json index d3d214e5c..597d933bc 100644 --- a/composer.json +++ b/composer.json @@ -39,7 +39,7 @@ "flags-svg": "php bin/flags-svg.php > assets/css-flags/flags.php", "git-release": "bin/git-release.sh", "phpcs": "phpcs -p ./*.php includes/ --standard=vendor/phpcompatibility/php-compatibility/PHPCompatibility --runtime-set testVersion 7.4-", - "phpstan": "vendor/bin/phpstan analyze --memory-limit=1G", + "phpstan": "vendor/bin/phpstan analyze --memory-limit=2G", "phpunit": "@php vendor/bin/phpunit", "phpunit:clover": "@php -d xdebug.mode=coverage vendor/bin/phpunit --coverage-clover tests/coverage.xml", "phpunit:html": "@php -d xdebug.mode=coverage vendor/bin/phpunit --coverage-html tests/coverage", diff --git a/includes/MslsAdmin.php b/includes/Admin/Admin.php similarity index 96% rename from includes/MslsAdmin.php rename to includes/Admin/Admin.php index e5b31ae3c..0bddacc1d 100644 --- a/includes/MslsAdmin.php +++ b/includes/Admin/Admin.php @@ -1,6 +1,6 @@ options->display ) ) )->render(); + echo ( new Select( 'display', Link::get_types_description(), strval( $this->options->display ) ) )->render(); } /** @@ -385,8 +388,8 @@ public function admin_display(): void { $select = new Select( 'admin_display', array( - MslsAdminIcon::TYPE_FLAG => __( 'Flag', 'multisite-language-switcher' ), - MslsAdminIcon::TYPE_LABEL => __( 'Label', 'multisite-language-switcher' ), + Icon::TYPE_FLAG => __( 'Flag', 'multisite-language-switcher' ), + Icon::TYPE_LABEL => __( 'Label', 'multisite-language-switcher' ), ), $this->options->get_icon_type() ); diff --git a/includes/MslsAdminBar.php b/includes/Admin/Bar.php similarity index 77% rename from includes/MslsAdminBar.php rename to includes/Admin/Bar.php index c0fb5fc1e..544d6379a 100644 --- a/includes/MslsAdminBar.php +++ b/includes/Admin/Bar.php @@ -1,12 +1,16 @@ icon_type = $options->get_icon_type(); $this->blog_collection = $blog_collection; } @@ -31,7 +35,7 @@ public function __construct( MslsOptions $options, MslsBlogCollection $blog_coll * @return void */ public static function init(): void { - $obj = new MslsAdminBar( msls_options(), msls_blog_collection() ); + $obj = new Bar( msls_options(), msls_blog_collection() ); if ( is_admin_bar_showing() ) { add_action( 'admin_bar_menu', array( $obj, 'update_admin_bar' ), 999 ); @@ -88,12 +92,12 @@ public function add_node( \WP_Admin_Bar $wp_admin_bar, string $node_id, string $ * * It uses a blavatar icon as prefix if $blavatar is set to true * - * @param MslsBlog|null $blog - * @param bool $blavatar + * @param Blog|null $blog + * @param bool $blavatar * * @return string|null */ - protected function get_title( ?MslsBlog $blog, bool $blavatar = false ): ?string { + protected function get_title( ?Blog $blog, bool $blavatar = false ): ?string { if ( is_null( $blog ) ) { return $blog; } diff --git a/includes/MslsCustomColumn.php b/includes/Admin/CustomColumn.php similarity index 87% rename from includes/MslsCustomColumn.php rename to includes/Admin/CustomColumn.php index 849f98b19..38aba4bb1 100644 --- a/includes/MslsCustomColumn.php +++ b/includes/Admin/CustomColumn.php @@ -1,12 +1,14 @@ get_language(); $icon_type = $this->options->get_icon_type(); - $icon = ( new MslsAdminIcon() )->set_language( $language )->set_icon_type( $icon_type ); + $icon = ( new Icon() )->set_language( $language )->set_icon_type( $icon_type ); $post_id = get_the_ID(); if ( false !== $post_id ) { @@ -78,15 +80,15 @@ public function th( array $columns ) { public function td( $column_name, $item_id ): void { if ( 'mslscol' === $column_name ) { $blogs = $this->collection->get(); - $origin_language = MslsBlogCollection::get_blog_language(); + $origin_language = Collection::get_blog_language(); if ( $blogs ) { - $mydata = MslsOptions::create( $item_id ); + $mydata = Options::create( $item_id ); foreach ( $blogs as $blog ) { switch_to_blog( $blog->userblog_id ); $language = $blog->get_language(); - $icon = MslsAdminIcon::create(); + $icon = Icon::create(); $icon->set_language( $language ); $icon->set_id( $item_id ); $icon->set_origin_language( $origin_language ); diff --git a/includes/MslsCustomColumnTaxonomy.php b/includes/Admin/CustomColumnTaxonomy.php similarity index 86% rename from includes/MslsCustomColumnTaxonomy.php rename to includes/Admin/CustomColumnTaxonomy.php index 9bae247f9..d042ff3e1 100644 --- a/includes/MslsCustomColumnTaxonomy.php +++ b/includes/Admin/CustomColumnTaxonomy.php @@ -1,18 +1,20 @@ options->is_excluded() ) { @@ -43,6 +45,6 @@ public function column_default( $deprecated, $column_name, $item_id ): void { * @param int $object_id */ public function delete( $object_id ): void { - $this->save( $object_id, MslsOptionsTax::class ); + $this->save( $object_id, Tax::class ); } } diff --git a/includes/MslsCustomFilter.php b/includes/Admin/CustomFilter.php similarity index 76% rename from includes/MslsCustomFilter.php rename to includes/Admin/CustomFilter.php index 9af745264..7d4f8141e 100644 --- a/includes/MslsCustomFilter.php +++ b/includes/Admin/CustomFilter.php @@ -1,20 +1,23 @@ userblog_id ) ] = sprintf( $format, $blog->get_description() ); } - $id = MslsRequest::get( MslsFields::FIELD_MSLS_FILTER, 0 ); + $id = Request::get( Fields::FIELD_MSLS_FILTER, 0 ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - echo ( new Select( MslsFields::FIELD_MSLS_FILTER, $options, strval( $id ) ) )->render(); + echo ( new Select( Fields::FIELD_MSLS_FILTER, $options, strval( $id ) ) )->render(); } } @@ -70,17 +73,17 @@ public function add_filter(): void { * @return bool|\WP_Query */ public function execute_filter( \WP_Query $query ) { - if ( ! MslsRequest::has_var( MslsFields::FIELD_MSLS_FILTER ) ) { + if ( ! Request::has_var( Fields::FIELD_MSLS_FILTER ) ) { return false; } - $id = MslsRequest::get_var( MslsFields::FIELD_MSLS_FILTER ); + $id = Request::get_var( Fields::FIELD_MSLS_FILTER ); $blog = $this->collection->get_object( intval( $id ) ); if ( ! $blog ) { return false; } - $sql_cache = MslsSqlCacher::create( __CLASS__, __METHOD__ ); + $sql_cache = SqlCacher::create( __CLASS__, __METHOD__ ); // Load post we need to exclude (they already have a translation) from search query. $query->query_vars['post__not_in'] = ( new TranslatedPostIdQuery( $sql_cache ) )( $blog->get_language() ); diff --git a/includes/MslsAdminIcon.php b/includes/Admin/Icon.php similarity index 78% rename from includes/MslsAdminIcon.php rename to includes/Admin/Icon.php index 4faa0cc06..4aedd3727 100644 --- a/includes/MslsAdminIcon.php +++ b/includes/Admin/Icon.php @@ -1,6 +1,6 @@ type = $type ?? ''; @@ -39,32 +71,23 @@ public function __toString(): string { return $this->get_a(); } - /** - * @return MslsAdminIcon|MslsAdminIconTaxonomy - */ - public static function create( ?string $type = null ) { + public static function create( ?string $type = null ): Icon { $obj = msls_content_types(); if ( ! $type ) { $type = $obj->get_request(); } - return $obj->is_taxonomy() ? new MslsAdminIconTaxonomy( $type ) : new MslsAdminIcon( $type ); + return $obj->is_taxonomy() ? new IconTaxonomy( $type ) : new Icon( $type ); } - /** - * Set the icon path - */ - public function set_icon_type( string $icon_type ): MslsAdminIcon { + public function set_icon_type( string $icon_type ): Icon { $this->icon_type = $icon_type; return $this; } - /** - * Set the path by type - */ - public function set_path(): MslsAdminIcon { + public function set_path(): Icon { if ( 'post' !== $this->type ) { $query_vars = array( 'post_type' => $this->type ); $this->path = add_query_arg( $query_vars, $this->path ); @@ -73,52 +96,40 @@ public function set_path(): MslsAdminIcon { return $this; } - public function set_language( string $language ): MslsAdminIcon { + public function set_language( string $language ): Icon { $this->language = $language; return $this; } - public function set_src( string $src ): MslsAdminIcon { + public function set_src( string $src ): Icon { $this->src = $src; return $this; } - public function set_href( int $id ): MslsAdminIcon { + public function set_href( int $id ): Icon { $this->href = get_edit_post_link( $id ) ?? ''; return $this; } - /** - * Sets the id of the object this icon is for - */ - public function set_id( int $id ): MslsAdminIcon { + public function set_id( int $id ): Icon { $this->id = $id; return $this; } - /** - * Sets the origin language for this icon - */ - public function set_origin_language( string $origin_language ): MslsAdminIcon { + public function set_origin_language( string $origin_language ): Icon { $this->origin_language = $origin_language; return $this; } - /** - * Get image as html-tag - */ public function get_img(): string { return sprintf( '%s', $this->language, $this->src ); } - /** - * Get link as html-tag - */ public function get_a(): string { if ( empty( $this->href ) ) { if ( $this->should_quick_create() ) { diff --git a/includes/MslsAdminIconTaxonomy.php b/includes/Admin/IconTaxonomy.php similarity index 58% rename from includes/MslsAdminIconTaxonomy.php rename to includes/Admin/IconTaxonomy.php index 0850631ec..aca8e7e50 100644 --- a/includes/MslsAdminIconTaxonomy.php +++ b/includes/Admin/IconTaxonomy.php @@ -1,14 +1,19 @@ get_post_type(); + public function set_href( int $id ): Icon { + $object_type = Taxonomy::instance()->get_post_type(); $this->href = get_edit_term_link( $id, $this->type, $object_type ) ?? ''; @@ -30,12 +35,12 @@ public function set_href( int $id ): MslsAdminIcon { /** * Set the path by type * - * @return MslsAdminIconTaxonomy + * @return IconTaxonomy */ - public function set_path(): MslsAdminIcon { + public function set_path(): Icon { $args = array( 'taxonomy' => $this->type ); - $post_type = MslsTaxonomy::instance()->get_post_type(); + $post_type = Taxonomy::instance()->get_post_type(); if ( '' !== $post_type ) { $args['post_type'] = $post_type; } diff --git a/includes/MslsMain.php b/includes/Admin/Main.php similarity index 79% rename from includes/MslsMain.php rename to includes/Admin/Main.php index 8929e3e80..6840d1112 100644 --- a/includes/MslsMain.php +++ b/includes/Admin/Main.php @@ -1,44 +1,52 @@ options = $options; $this->collection = $collection; } - public static function create(): MslsMain { + public static function create(): Main { return new static( msls_options(), msls_blog_collection() ); } @@ -108,7 +116,7 @@ public function is_autosave( $post_id ): bool { * @return boolean */ public function verify_nonce(): bool { - return MslsRequest::has_var( MslsFields::FIELD_MSLS_NONCENAME ) && wp_verify_nonce( MslsRequest::get_var( MslsFields::FIELD_MSLS_NONCENAME ), MslsPlugin::path() ); + return Request::has_var( Fields::FIELD_MSLS_NONCENAME ) && wp_verify_nonce( Request::get_var( Fields::FIELD_MSLS_NONCENAME ), Plugin::path() ); } /** @@ -119,14 +127,14 @@ public function verify_nonce(): bool { * @codeCoverageIgnore */ public function delete( $object_id ): void { - $this->save( $object_id, MslsOptionsPost::class ); + $this->save( $object_id, Post::class ); } /** * Save * - * @param int $object_id - * @param class-string $class_name + * @param int $object_id + * @param class-string $class_name * * @codeCoverageIgnore */ @@ -146,14 +154,14 @@ protected function save( $object_id, $class_name ): void { } $current_blog = $this->collection->get_current_blog(); - if ( ! $current_blog instanceof MslsBlog ) { + if ( ! $current_blog instanceof Blog ) { $this->debugger( 'BlogCollection returns false when calling has_current_blog.' ); return; } $language = $current_blog->get_language(); - $msla = new MslsLanguageArray( $this->get_input_array( $object_id ) ); + $msla = new LanguageArray( $this->get_input_array( $object_id ) ); $options = new $class_name( $object_id ); $temp = $options->get_arr(); diff --git a/includes/MslsMetaBox.php b/includes/Admin/MetaBox.php similarity index 85% rename from includes/MslsMetaBox.php rename to includes/Admin/MetaBox.php index d25d7e200..7e0807892 100644 --- a/includes/MslsMetaBox.php +++ b/includes/Admin/MetaBox.php @@ -1,15 +1,20 @@ get_post_stati( array( 'internal' => '' ) ), 'posts_per_page' => 10, ); - if ( MslsRequest::has_var( MslsFields::FIELD_POST_TYPE, INPUT_POST ) ) { + if ( Request::has_var( Fields::FIELD_POST_TYPE, INPUT_POST ) ) { $args['post_type'] = sanitize_text_field( - MslsRequest::get_var( MslsFields::FIELD_POST_TYPE, INPUT_POST ) + Request::get_var( Fields::FIELD_POST_TYPE, INPUT_POST ) ); } - if ( MslsRequest::has_var( MslsFields::FIELD_S, INPUT_POST ) ) { + if ( Request::has_var( Fields::FIELD_S, INPUT_POST ) ) { $value_s = sanitize_text_field( - MslsRequest::get_var( MslsFields::FIELD_S, INPUT_POST ) + Request::get_var( Fields::FIELD_S, INPUT_POST ) ); /** @@ -81,24 +86,24 @@ public static function suggest(): void { 'msls_meta_box_suggest_results', $json->get(), array( - 'blog_id' => MslsRequest::get_var( MslsFields::FIELD_BLOG_ID, INPUT_POST ), - 'post_type' => MslsRequest::get_var( MslsFields::FIELD_POST_TYPE, INPUT_POST ), - 's' => MslsRequest::get_var( MslsFields::FIELD_S, INPUT_POST ), - 'source_id' => MslsRequest::get_var( MslsFields::FIELD_SOURCE_ID, INPUT_POST ), + 'blog_id' => Request::get_var( Fields::FIELD_BLOG_ID, INPUT_POST ), + 'post_type' => Request::get_var( Fields::FIELD_POST_TYPE, INPUT_POST ), + 's' => Request::get_var( Fields::FIELD_S, INPUT_POST ), + 'source_id' => Request::get_var( Fields::FIELD_SOURCE_ID, INPUT_POST ), ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped - wp_die( wp_json_encode( $results ) ?: '' ); + wp_die( (string) wp_json_encode( $results ) ); } /** - * @param MslsJson $json + * @param Json $json * @param array $args * - * @return MslsJson + * @return Json */ - public static function get_suggested_fields( MslsJson $json, array $args ): MslsJson { + public static function get_suggested_fields( Json $json, array $args ): Json { /** * Overrides the query-args for the 'suggest' fields in the MetaBox * @@ -191,15 +196,15 @@ public function render_select(): void { return; } - $mydata = new MslsOptionsPost( $post->ID ); - $origin_language = MslsBlogCollection::get_blog_language(); + $mydata = new Post( $post->ID ); + $origin_language = Collection::get_blog_language(); $is_saved = 'auto-draft' !== get_post_status( $post ); $this->maybe_set_linked_post( $mydata ); $temp = $post; - wp_nonce_field( MslsPlugin::path(), 'msls_noncename' ); + wp_nonce_field( Plugin::path(), 'msls_noncename' ); $lis = ''; @@ -208,7 +213,7 @@ public function render_select(): void { $language = $blog->get_language(); $icon_type = $this->options->get_icon_type(); - $icon = MslsAdminIcon::create( $type )->set_language( $language )->set_icon_type( $icon_type ); + $icon = Icon::create( $type )->set_language( $language )->set_icon_type( $icon_type ); $linked_post_id = null; if ( $mydata->has_value( $language ) ) { @@ -335,8 +340,8 @@ public function render_input(): void { return; } - $my_data = new MslsOptionsPost( $post->ID ); - $origin_language = MslsBlogCollection::get_blog_language(); + $my_data = new Post( $post->ID ); + $origin_language = Collection::get_blog_language(); $is_saved = 'auto-draft' !== get_post_status( $post ); $this->maybe_set_linked_post( $my_data ); @@ -344,14 +349,14 @@ public function render_input(): void { $temp = $post; $items = ''; - wp_nonce_field( MslsPlugin::path(), 'msls_noncename' ); + wp_nonce_field( Plugin::path(), 'msls_noncename' ); foreach ( $blogs as $blog ) { switch_to_blog( $blog->userblog_id ); $language = $blog->get_language(); $icon_type = $this->options->get_icon_type(); - $icon = MslsAdminIcon::create()->set_language( $language )->set_icon_type( $icon_type ); + $icon = Icon::create()->set_language( $language )->set_icon_type( $icon_type ); $value = ''; $title = ''; @@ -439,7 +444,7 @@ private function get_create_new_link( string $type, string $language, int $post_ } if ( msls_options()->activate_quick_create ) { - $action_icon = ( new MslsAdminIcon( $type ) ) + $action_icon = ( new Icon( $type ) ) ->set_language( $language ) ->set_icon_type( 'action' ) ->set_id( $post_id ) @@ -448,7 +453,7 @@ private function get_create_new_link( string $type, string $language, int $post_ return $action_icon->get_a(); } - $action_icon = ( new MslsAdminIcon( $type ) ) + $action_icon = ( new Icon( $type ) ) ->set_language( $language ) ->set_icon_type( 'action' ) ->set_id( $post_id ) @@ -479,35 +484,35 @@ public function set( $post_id ): void { return; } - $post_type = MslsRequest::get_var( MslsFields::FIELD_POST_TYPE ); + $post_type = Request::get_var( Fields::FIELD_POST_TYPE ); $capability = 'page' === $post_type ? 'edit_page' : 'edit_post'; if ( ! current_user_can( $capability, $post_id ) ) { return; } - $this->save( $post_id, MslsOptionsPost::class ); + $this->save( $post_id, Post::class ); } /** * Sets the selected element in the data from the `$_GET` superglobal, if any. * - * @param MslsOptionsPost $mydata + * @param Post $mydata * - * @return MslsOptionsPost + * @return Post */ - public function maybe_set_linked_post( MslsOptionsPost $mydata ) { - if ( ! MslsRequest::isset( array( MslsFields::FIELD_MSLS_ID, MslsFields::FIELD_MSLS_LANG ) ) ) { + public function maybe_set_linked_post( Post $mydata ) { + if ( ! Request::isset( array( Fields::FIELD_MSLS_ID, Fields::FIELD_MSLS_LANG ) ) ) { return $mydata; } - $origin_lang = MslsRequest::get_var( MslsFields::FIELD_MSLS_LANG ); + $origin_lang = Request::get_var( Fields::FIELD_MSLS_LANG ); if ( isset( $mydata->{$origin_lang} ) ) { return $mydata; } - $origin_post_id = MslsRequest::get_var( MslsFields::FIELD_MSLS_ID ); + $origin_post_id = Request::get_var( Fields::FIELD_MSLS_ID ); $origin_blog_id = $this->collection->get_blog_id( $origin_lang ); if ( null === $origin_blog_id ) { diff --git a/includes/MslsPostListActions.php b/includes/Admin/PostListActions.php similarity index 89% rename from includes/MslsPostListActions.php rename to includes/Admin/PostListActions.php index aeefe2989..8c1783bca 100644 --- a/includes/MslsPostListActions.php +++ b/includes/Admin/PostListActions.php @@ -1,21 +1,23 @@ get_request(); - $url = MslsTranslationPickerPage::url( $post_type ); + $url = TranslationPickerPage::url( $post_type ); $label = __( 'Add from Translation', 'multisite-language-switcher' ); $script = sprintf( diff --git a/includes/MslsPostTagClassic.php b/includes/Admin/PostTag/Classic.php similarity index 87% rename from includes/MslsPostTagClassic.php rename to includes/Admin/PostTag/Classic.php index 74b179c25..fc767b4fc 100644 --- a/includes/MslsPostTagClassic.php +++ b/includes/Admin/PostTag/Classic.php @@ -1,15 +1,19 @@ collection->get(); if ( ! empty( $blogs ) ) { $term_id = $tag->term_id ?? 0; - $mydata = MslsOptionsTax::create( $term_id ); + $mydata = Tax::create( $term_id ); $type = msls_content_types()->get_request(); $this->maybe_set_linked_term( $mydata ); @@ -108,17 +112,17 @@ public function the_input( ?\WP_Term $tag, string $title_format, string $item_fo /** * Prints options inputs * - * @param MslsBlog $blog + * @param Blog $blog * @param string $type * @param OptionsTaxInterface $mydata * @param string $item_format */ - public function print_option( MslsBlog $blog, string $type, OptionsTaxInterface $mydata, string $item_format ): void { + public function print_option( Blog $blog, string $type, OptionsTaxInterface $mydata, string $item_format ): void { switch_to_blog( $blog->userblog_id ); $language = $blog->get_language(); $icon_type = $this->options->get_icon_type(); - $icon = MslsAdminIcon::create()->set_language( $language )->set_icon_type( $icon_type ); + $icon = Icon::create()->set_language( $language )->set_icon_type( $icon_type ); if ( $mydata->has_value( $language ) ) { $icon->set_href( (int) $mydata->$language ); diff --git a/includes/MslsPostTag.php b/includes/Admin/PostTag/PostTag.php similarity index 85% rename from includes/MslsPostTag.php rename to includes/Admin/PostTag/PostTag.php index d77d1212b..a4eb6b74a 100644 --- a/includes/MslsPostTag.php +++ b/includes/Admin/PostTag/PostTag.php @@ -1,12 +1,19 @@ sanitize_text_field( $post_type ), 'orderby' => 'name', @@ -42,9 +49,9 @@ public static function suggest(): void { 'hide_empty' => 0, ); - if ( MslsRequest::has_var( MslsFields::FIELD_S ) ) { + if ( Request::has_var( Fields::FIELD_S ) ) { $args['search'] = sanitize_text_field( - MslsRequest::get_var( MslsFields::FIELD_S ) + Request::get_var( Fields::FIELD_S ) ); } @@ -89,10 +96,10 @@ public static function suggest(): void { 'msls_post_tag_suggest_results', $json->get(), array( - 'blog_id' => MslsRequest::get_var( MslsFields::FIELD_BLOG_ID ), - 'taxonomy' => MslsRequest::get_var( MslsFields::FIELD_POST_TYPE ), - 's' => MslsRequest::get_var( MslsFields::FIELD_S ), - 'source_id' => MslsRequest::get_var( MslsFields::FIELD_SOURCE_ID ), + 'blog_id' => Request::get_var( Fields::FIELD_BLOG_ID ), + 'taxonomy' => Request::get_var( Fields::FIELD_POST_TYPE ), + 's' => Request::get_var( Fields::FIELD_S ), + 'source_id' => Request::get_var( Fields::FIELD_SOURCE_ID ), ) ); @@ -102,7 +109,7 @@ public static function suggest(): void { public static function init(): void { $options = msls_options(); $collection = msls_blog_collection(); - $class = $options->activate_autocomplete ? self::class : MslsPostTagClassic::class; + $class = $options->activate_autocomplete ? self::class : Classic::class; $obj = new $class( $options, $collection ); $taxonomy = msls_content_types()->acl_request(); @@ -190,7 +197,7 @@ public function the_input( ?\WP_Term $tag, string $title_format, string $item_fo $blogs = $this->collection->get(); if ( $blogs ) { $term_id = $tag->term_id ?? 0; - $mydata = MslsOptionsTax::create( $term_id ); + $mydata = Tax::create( $term_id ); $type = msls_content_types()->get_request(); $this->maybe_set_linked_term( $mydata ); @@ -207,7 +214,7 @@ public function the_input( ?\WP_Term $tag, string $title_format, string $item_fo $language = $blog->get_language(); $icon_type = $this->options->get_icon_type(); - $icon = MslsAdminIcon::create()->set_language( $language )->set_icon_type( $icon_type ); + $icon = Icon::create()->set_language( $language )->set_icon_type( $icon_type ); $value = ''; $title = ''; @@ -247,7 +254,7 @@ public function the_input( ?\WP_Term $tag, string $title_format, string $item_fo */ public function set( $term_id ): void { if ( msls_content_types()->acl_request() ) { - $this->save( $term_id, MslsOptionsTax::class ); + $this->save( $term_id, Tax::class ); } } @@ -259,17 +266,17 @@ public function set( $term_id ): void { * @return OptionsTaxInterface */ public function maybe_set_linked_term( OptionsTaxInterface $mydata ) { - if ( ! MslsRequest::isset( array( MslsFields::FIELD_MSLS_ID, MslsFields::FIELD_MSLS_LANG ) ) ) { + if ( ! Request::isset( array( Fields::FIELD_MSLS_ID, Fields::FIELD_MSLS_LANG ) ) ) { return $mydata; } - $origin_lang = MslsRequest::get_var( MslsFields::FIELD_MSLS_LANG ); + $origin_lang = Request::get_var( Fields::FIELD_MSLS_LANG ); if ( isset( $mydata->{$origin_lang} ) ) { return $mydata; } - $origin_term_id = MslsRequest::get_var( MslsFields::FIELD_MSLS_ID ); + $origin_term_id = Request::get_var( Fields::FIELD_MSLS_ID ); $origin_blog_id = $this->collection->get_blog_id( $origin_lang ); diff --git a/includes/MslsTranslationPickerPage.php b/includes/Admin/TranslationPicker/Page.php similarity index 88% rename from includes/MslsTranslationPickerPage.php rename to includes/Admin/TranslationPicker/Page.php index 2eb3a0cc1..5c3344dfa 100644 --- a/includes/MslsTranslationPickerPage.php +++ b/includes/Admin/TranslationPicker/Page.php @@ -1,6 +1,11 @@ get_columns(); } ); @@ -160,7 +167,7 @@ public static function reorder_submenu(): void { return; } - foreach ( MslsPostType::get() as $post_type ) { + foreach ( PostType::get() as $post_type ) { $parent = self::parent_slug( $post_type ); $slug = self::page_slug( $post_type ); @@ -207,27 +214,25 @@ public static function reorder_submenu(): void { $rebuilt[] = $our_item; } + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited -- Intentional override of global $submenu array. $submenu[ $parent ] = $rebuilt; } } - /** - * Menu slug of the parent (Posts / Pages / CPT) menu for a post type. - */ public static function parent_slug( string $post_type ): string { if ( '' === $post_type ) { return ''; } - if ( 'post' === $post_type ) { - return 'edit.php'; - } - return 'edit.php?post_type=' . $post_type; + + return 'post' === $post_type ? 'edit.php' : 'edit.php?post_type=' . $post_type; } /** * Unique page slug per post type. Needed because WordPress enforces * globally unique submenu slugs, so we can't reuse one slug under * multiple parents. + * + * @param string $post_type Post type for which to generate the page slug. */ public static function page_slug( string $post_type ): string { return self::BASE_SLUG . '-' . $post_type; @@ -250,6 +255,8 @@ public static function url( string $post_type ): string { /** * Enqueues the picker script on this page only. * + * @param int $target_blog_id The blog ID for which the picker is being rendered, used in the script's bootstrap payload. + * * @codeCoverageIgnore */ public static function enqueue( int $target_blog_id ): void { @@ -258,7 +265,7 @@ public static function enqueue( int $target_blog_id ): void { wp_enqueue_script( self::SCRIPT_HANDLE, - MslsPlugin::plugins_url( "$folder/msls-translation-picker.js" ), + Plugin::plugins_url( "$folder/msls-translation-picker.js" ), array( 'jquery', 'wp-api-fetch' ), $ver, array( 'in_footer' => true ) @@ -304,7 +311,7 @@ public static function render(): void { $post_type = substr( $page, strlen( self::BASE_SLUG ) + 1 ); } - if ( ! in_array( $post_type, MslsPostType::get(), true ) ) { + if ( ! in_array( $post_type, PostType::get(), true ) ) { $post_type = 'post'; } @@ -337,7 +344,7 @@ public static function render(): void { ); echo '
'; - if ( $target instanceof MslsBlog ) { + if ( $target instanceof Blog ) { printf( '

%1$s %2$s %3$s

', esc_html__( 'Creating drafts in:', 'multisite-language-switcher' ), @@ -361,10 +368,10 @@ public static function render(): void { } /** - * @param string $post_type - * @param int $source - * @param string $search - * @param array $blogs + * @param string $post_type + * @param int $source + * @param string $search + * @param array $blogs * * @codeCoverageIgnore */ @@ -396,10 +403,10 @@ private static function render_filter_form( string $post_type, int $source, stri * Renders a row of clickable flag-buttons — one per source blog. * Navigating between sources no longer needs a select + Apply. * - * @param string $post_type - * @param int $source - * @param string $search - * @param array $blogs + * @param string $post_type + * @param int $source + * @param string $search + * @param array $blogs * * @codeCoverageIgnore */ @@ -420,9 +427,9 @@ private static function render_source_flags( string $post_type, int $source, str $blog_id = (int) $blog->userblog_id; $is_active = ( $source === $blog_id ); - $icon = ( new MslsAdminIcon( null ) ) + $icon = ( new Icon( null ) ) ->set_language( $blog->get_language() ) - ->set_icon_type( MslsAdminIcon::TYPE_FLAG ) + ->set_icon_type( Icon::TYPE_FLAG ) ->get_icon(); $url = add_query_arg( @@ -450,6 +457,12 @@ private static function render_source_flags( string $post_type, int $source, str } /** + * Renders the list table of untranslated posts for the selected source blog. + * + * @param int $source Blog ID of the source blog. + * @param string $post_type Post type for which to list untranslated posts. + * @param string $search Search term to filter the posts by title. + * * @codeCoverageIgnore */ private static function render_list_table( int $source, string $post_type, string $search ): void { @@ -457,7 +470,7 @@ private static function render_list_table( int $source, string $post_type, strin require_once ABSPATH . 'wp-admin/includes/class-wp-list-table.php'; } - $table = new MslsTranslationPickerTable( $source, $post_type, $search ); + $table = new Table( $source, $post_type, $search ); $table->prepare_items(); // The form's submit is intercepted client-side and dispatched through diff --git a/includes/MslsTranslationPickerTable.php b/includes/Admin/TranslationPicker/Table.php similarity index 94% rename from includes/MslsTranslationPickerTable.php rename to includes/Admin/TranslationPicker/Table.php index f389315cb..ed4a9b76e 100644 --- a/includes/MslsTranslationPickerTable.php +++ b/includes/Admin/TranslationPicker/Table.php @@ -1,8 +1,10 @@ 'msls_source_post', 'plural' => 'msls_source_posts', 'ajax' => false, - 'screen' => MslsTranslationPickerPage::BASE_SLUG, + 'screen' => Page::BASE_SLUG, ) ); @@ -161,16 +163,16 @@ public function prepare_items(): void { $hidden = get_hidden_columns( $this->screen ); $this->_column_headers = array( $columns, $hidden, array() ); - $target_lang = MslsBlogCollection::get_blog_language( get_current_blog_id() ); + $target_lang = Collection::get_blog_language( get_current_blog_id() ); $current_page = $this->get_pagenum(); - $per_page = (int) $this->get_items_per_page( MslsTranslationPickerPage::PER_PAGE_OPTION, self::PER_PAGE ); + $per_page = (int) $this->get_items_per_page( Page::PER_PAGE_OPTION, self::PER_PAGE ); switch_to_blog( $this->source_blog_id ); // Cache key includes the source blog id so a non-blog-aware object // cache backend can't leak ids from one switched-to blog to another. $cache_params = array( __METHOD__, (string) $this->source_blog_id, $target_lang ); - $translated_ids = ( new TranslatedPostIdQuery( MslsSqlCacher::create( __CLASS__, $cache_params ) ) )( $target_lang ); + $translated_ids = ( new TranslatedPostIdQuery( SqlCacher::create( __CLASS__, $cache_params ) ) )( $target_lang ); $args = array( 'post_type' => $this->post_type, diff --git a/includes/MslsBlog.php b/includes/Blog/Blog.php similarity index 89% rename from includes/MslsBlog.php rename to includes/Blog/Blog.php index fd1427ce2..f918e8e82 100644 --- a/includes/MslsBlog.php +++ b/includes/Blog/Blog.php @@ -1,6 +1,9 @@ obj = $obj; - $this->language = MslsBlogCollection::get_blog_language( $this->obj->userblog_id ); + $this->language = Collection::get_blog_language( $this->obj->userblog_id ); } $this->description = (string) $description; @@ -82,7 +85,7 @@ public function get_description(): string { * @return string */ public function get_title( string $icon_type = 'flag' ): string { - $icon = ( new MslsAdminIcon( null ) )->set_language( $this->language )->set_icon_type( $icon_type ); + $icon = ( new Icon( null ) )->set_language( $this->language )->set_icon_type( $icon_type ); return sprintf( '%1$s %2$s', @@ -172,24 +175,24 @@ public static function internal_cmp( $a, $b ) { /** * Sort objects by language * - * @param MslsBlog $a - * @param MslsBlog $b + * @param Blog $a + * @param Blog $b * * @return int */ - public static function language( MslsBlog $a, MslsBlog $b ) { + public static function language( Blog $a, Blog $b ) { return self::internal_cmp( $a->get_language(), $b->get_language() ); } /** * Sort objects by description * - * @param MslsBlog $a - * @param MslsBlog $b + * @param Blog $a + * @param Blog $b * * @return int */ - public static function description( MslsBlog $a, MslsBlog $b ) { + public static function description( Blog $a, Blog $b ) { return self::internal_cmp( $a->get_description(), $b->get_description() ); } diff --git a/includes/MslsBlogCollection.php b/includes/Blog/Collection.php similarity index 85% rename from includes/MslsBlogCollection.php rename to includes/Blog/Collection.php index fbfa5ba31..19c7f6362 100644 --- a/includes/MslsBlogCollection.php +++ b/includes/Blog/Collection.php @@ -1,17 +1,22 @@ objects[ $blog->userblog_id ] = new MslsBlog( $blog, $description ); + $this->objects[ $blog->userblog_id ] = new Blog( $blog, $description ); } } - $compare = array( MslsBlog::class, $this->objects_order ); + $compare = array( Blog::class, $this->objects_order ); if ( is_callable( $compare ) ) { uasort( $this->objects, $compare ); } @@ -128,18 +133,14 @@ public static function get_configured_blog_description( int $blog_id, $descripti * The first available user of the blog will be used if there is no * refrence user configured * - * @param MslsOptions $options + * @param Options $options * * @return object[]|\stdClass[] */ - public function get_blogs_of_reference_user( MslsOptions $options ) { - $reference_user = $options->has_value( 'reference_user' ) ? - $options->reference_user : - current( $this->get_users( 'ID', 1 ) ); - - if ( ! is_int( $reference_user ) ) { - $reference_user = 0; - } + public function get_blogs_of_reference_user( Options $options ) { + $reference_user = $options->has_value( 'reference_user' ) + ? (int) $options->reference_user + : (int) current( $this->get_users( 'ID', 1 ) ); return get_blogs_of_user( $reference_user ); } @@ -149,7 +150,7 @@ public function get_blogs_of_reference_user( MslsOptions $options ) { * * @param string $language * - * @return MslsBlog|null + * @return Blog|null */ public function get_blog( $language ) { $blog = null; @@ -190,11 +191,11 @@ public function get_current_blog_id() { /** * Checks if blog is the current blog * - * @param MslsBlog $blog + * @param Blog $blog * * @return bool */ - public function is_current_blog( MslsBlog $blog ) { + public function is_current_blog( Blog $blog ) { return $blog->userblog_id === $this->get_current_blog_id(); } @@ -210,7 +211,7 @@ public function has_current_blog() { /** * Gets current blog as object * - * @return MslsBlog|null + * @return Blog|null */ public function get_current_blog() { return $this->has_current_blog() ? $this->objects[ $this->get_current_blog_id() ] : null; @@ -219,7 +220,7 @@ public function get_current_blog() { /** * Gets an array with all blog-objects * - * @return MslsBlog[] + * @return Blog[] */ public function get_objects(): array { return apply_filters( 'msls_blog_collection_get_objects', $this->objects ); @@ -230,9 +231,9 @@ public function get_objects(): array { * * @param int $blog_id * - * @return ?MslsBlog + * @return ?Blog */ - public function get_object( int $blog_id ): ?MslsBlog { + public function get_object( int $blog_id ): ?Blog { return $this->get_objects()[ $blog_id ] ?? null; } @@ -248,7 +249,7 @@ public function is_plugin_active( $blog_id ) { $this->active_plugins = get_site_option( 'active_sitewide_plugins', array() ); } - $path = MslsPlugin::path(); + $path = Plugin::path(); if ( isset( $this->active_plugins[ $path ] ) ) { return true; } @@ -261,7 +262,7 @@ public function is_plugin_active( $blog_id ) { /** * Gets only blogs where the plugin is active * - * @return MslsBlog[] + * @return Blog[] */ public function get_plugin_active_blogs() { $arr = array(); @@ -278,7 +279,7 @@ public function get_plugin_active_blogs() { /** * Gets an array of all - but not the current - blog-objects * - * @return MslsBlog[] + * @return Blog[] */ public function get() { $objects = $this->get_objects(); @@ -295,7 +296,7 @@ public function get() { * * @param bool $filter * - * @return MslsBlog[] + * @return Blog[] */ public function get_filtered( bool $filter = false ): array { return ! $filter && $this->current_blog_output ? $this->get_objects() : $this->get(); @@ -309,16 +310,16 @@ public function get_filtered( bool $filter = false ): array { * * @return array */ - public function get_users( $fields = 'all', int $number = MslsAdmin::MAX_REFERENCE_USERS ): array { + public function get_users( $fields = 'all', int $number = Admin::MAX_REFERENCE_USERS ): array { $args = array( 'blog_id' => $this->current_blog_id, 'orderby' => 'registered', 'fields' => $fields, - 'number' => $number > 0 ? $number : MslsAdmin::MAX_REFERENCE_USERS, + 'number' => $number > 0 ? $number : Admin::MAX_REFERENCE_USERS, 'count_total' => false, ); - if ( $number !== 1 ) { // Check total users only if not fetching a single user + if ( 1 !== $number ) { // Check total users only if not fetching a single user. $user_count = count_users(); if ( $user_count['total_users'] > $number ) { /* translators: %s: maximum number of users */ diff --git a/includes/MslsCli.php b/includes/Cli/Cli.php similarity index 95% rename from includes/MslsCli.php rename to includes/Cli/Cli.php index f71c1a3f9..144f3bdd7 100644 --- a/includes/MslsCli.php +++ b/includes/Cli/Cli.php @@ -1,8 +1,8 @@ get_include(); + $file_path = $this->get_include(); - $this->map = ! is_null( $filePath ) && is_readable( $filePath ) ? require $filePath : array(); + $this->map = ! is_null( $file_path ) && is_readable( $file_path ) ? require $file_path : array(); } /** diff --git a/includes/Component/Icon/IconPng.php b/includes/Component/Icon/IconPng.php index eb60e2f8f..b8afb98d0 100644 --- a/includes/Component/Icon/IconPng.php +++ b/includes/Component/Icon/IconPng.php @@ -3,7 +3,7 @@ namespace lloc\Msls\Component\Icon; use lloc\Msls\Component\Icon; -use lloc\Msls\MslsPlugin; +use lloc\Msls\Plugin; /** * Class IconPng @@ -18,7 +18,7 @@ final class IconPng extends Icon { * @return string */ protected function get_include(): string { - return MslsPlugin::plugin_dir_path( self::FLAGS_FILE ); + return Plugin::plugin_dir_path( self::FLAGS_FILE ); } /** diff --git a/includes/Component/Icon/IconSvg.php b/includes/Component/Icon/IconSvg.php index c1f019671..fd43c3675 100644 --- a/includes/Component/Icon/IconSvg.php +++ b/includes/Component/Icon/IconSvg.php @@ -3,7 +3,7 @@ namespace lloc\Msls\Component\Icon; use lloc\Msls\Component\Icon; -use lloc\Msls\MslsPlugin; +use lloc\Msls\Plugin; /** * Class IconSvg @@ -18,7 +18,7 @@ final class IconSvg extends Icon { * @return string */ protected function get_include(): string { - return MslsPlugin::plugin_dir_path( self::FLAGS_FILE ); + return Plugin::plugin_dir_path( self::FLAGS_FILE ); } /** diff --git a/includes/ContentImport/AttachmentPathFinder.php b/includes/ContentImport/AttachmentPathFinder.php index ff019c610..59846580e 100644 --- a/includes/ContentImport/AttachmentPathFinder.php +++ b/includes/ContentImport/AttachmentPathFinder.php @@ -2,9 +2,9 @@ namespace lloc\Msls\ContentImport; -use lloc\Msls\MslsRegistryInstance; +use lloc\Msls\Registry\Instance; -class AttachmentPathFinder extends MslsRegistryInstance { +class AttachmentPathFinder extends Instance { const LINKED = '_msls_linked'; diff --git a/includes/ContentImport/ContentImporter.php b/includes/ContentImport/ContentImporter.php index 94f0b73a5..dbc56e3cc 100644 --- a/includes/ContentImport/ContentImporter.php +++ b/includes/ContentImport/ContentImporter.php @@ -6,14 +6,14 @@ exit; } +use lloc\Msls\Admin\Main; +use lloc\Msls\Blog\Collection; use lloc\Msls\ContentImport\Importers\Importer; use lloc\Msls\ContentImport\Importers\Map; use lloc\Msls\ContentImport\Importers\WithRequestPostAttributes; -use lloc\Msls\MslsBlogCollection; -use lloc\Msls\MslsMain; -use lloc\Msls\MslsOptionsPost; -use lloc\Msls\MslsRegistryInstance; -use lloc\Msls\MslsRequest; +use lloc\Msls\Options\Post\Post; +use lloc\Msls\Registry\Instance; +use lloc\Msls\RestApi\Request; /** * Class ContentImporter @@ -22,7 +22,7 @@ * * @package lloc\Msls\ContentImport */ -class ContentImporter extends MslsRegistryInstance { +class ContentImporter extends Instance { use WithRequestPostAttributes; const MSLS_BEFORE_IMPORT_ACTION = 'msls_content_import_before_import'; @@ -30,9 +30,9 @@ class ContentImporter extends MslsRegistryInstance { const MSLS_AFTER_IMPORT_ACTION = 'msls_content_import_after_import'; /** - * @var MslsMain + * @var Main */ - protected MslsMain $main; + protected Main $main; /** * @var ImportLogger|null @@ -57,10 +57,10 @@ class ContentImporter extends MslsRegistryInstance { /** * ContentImporter constructor. * - * @param ?MslsMain $main + * @param ?Main $main */ - public function __construct( ?MslsMain $main = null ) { - $this->main = ! is_null( $main ) ? $main : MslsMain::create(); + public function __construct( ?Main $main = null ) { + $this->main = ! is_null( $main ) ? $main : Main::create(); } /** @@ -123,9 +123,9 @@ public function handle_import( array $data = array() ) { return $data; } - $source_lang = MslsBlogCollection::get_blog_language( $source_blog_id ); + $source_lang = Collection::get_blog_language( $source_blog_id ); $dest_blog_id = get_current_blog_id(); - $dest_lang = MslsBlogCollection::get_blog_language( get_current_blog_id() ); + $dest_lang = Collection::get_blog_language( get_current_blog_id() ); $dest_post_id = $this->get_the_blog_post_ID( $dest_blog_id ); @@ -183,11 +183,11 @@ protected function pre_flight_check() { * @return array{0: int, 1: int}|null */ public function parse_sources(): ?array { - if ( ! MslsRequest::has_var( 'msls_import' ) ) { + if ( ! Request::has_var( 'msls_import' ) ) { return null; } - $msls_import = MslsRequest::get_var( 'msls_import' ); + $msls_import = Request::get_var( 'msls_import' ); $import_data = array_values( array_filter( explode( '|', trim( $msls_import ) ), 'is_numeric' ) ); if ( count( $import_data ) !== 2 ) { @@ -213,7 +213,7 @@ protected function get_the_blog_post_ID( $blog_id ): int { return $id; } - $request = MslsRequest::get_request( array( 'post' ) ); + $request = Request::get_request( array( 'post' ) ); if ( ! empty( $request['post'] ) ) { return (int) $request['post']; } @@ -333,7 +333,7 @@ public function import_content( ImportCoordinates $import_coordinates, array $po $source_post_id = $import_coordinates->source_post_id; $dest_lang = $import_coordinates->dest_lang; $dest_post_id = $import_coordinates->dest_post_id; - $relations->should_create( MslsOptionsPost::create( $source_post_id ), $dest_lang, $dest_post_id ); + $relations->should_create( Post::create( $source_post_id ), $dest_lang, $dest_post_id ); foreach ( $importers as $key => $importer ) { if ( ! $importer instanceof Importer ) { diff --git a/includes/ContentImport/ImportCoordinates.php b/includes/ContentImport/ImportCoordinates.php index 9a18455cf..570b2081c 100644 --- a/includes/ContentImport/ImportCoordinates.php +++ b/includes/ContentImport/ImportCoordinates.php @@ -2,7 +2,7 @@ namespace lloc\Msls\ContentImport; -use lloc\Msls\MslsBlogCollection; +use lloc\Msls\Blog\Collection; class ImportCoordinates { @@ -64,10 +64,10 @@ public function validate() { return false; } - if ( MslsBlogCollection::get_blog_language( $this->source_blog_id ) !== $this->source_lang ) { + if ( Collection::get_blog_language( $this->source_blog_id ) !== $this->source_lang ) { return false; } - if ( MslsBlogCollection::get_blog_language( $this->dest_blog_id ) !== $this->dest_lang ) { + if ( Collection::get_blog_language( $this->dest_blog_id ) !== $this->dest_lang ) { return false; } diff --git a/includes/ContentImport/Importers/ImportersBaseFactory.php b/includes/ContentImport/Importers/ImportersBaseFactory.php index 885de3496..c26fec4ea 100644 --- a/includes/ContentImport/Importers/ImportersBaseFactory.php +++ b/includes/ContentImport/Importers/ImportersBaseFactory.php @@ -3,9 +3,9 @@ namespace lloc\Msls\ContentImport\Importers; use lloc\Msls\ContentImport\ImportCoordinates; -use lloc\Msls\MslsRegistryInstance; +use lloc\Msls\Registry\Instance; -abstract class ImportersBaseFactory extends MslsRegistryInstance implements ImportersFactory { +abstract class ImportersBaseFactory extends Instance implements ImportersFactory { /** * The type of this importers factory; should be overridden by child classes. diff --git a/includes/ContentImport/Importers/Map.php b/includes/ContentImport/Importers/Map.php index 2a8666390..0813ae3d0 100644 --- a/includes/ContentImport/Importers/Map.php +++ b/includes/ContentImport/Importers/Map.php @@ -3,9 +3,9 @@ namespace lloc\Msls\ContentImport\Importers; use lloc\Msls\ContentImport\ImportCoordinates; -use lloc\Msls\MslsRegistryInstance; +use lloc\Msls\Registry\Instance; -class Map extends MslsRegistryInstance { +class Map extends Instance { /** * Builds and returns an array of importers for the specified import coordinates. * diff --git a/includes/ContentImport/Importers/Terms/ShallowDuplicating.php b/includes/ContentImport/Importers/Terms/ShallowDuplicating.php index 9120f3bec..4487c1edb 100644 --- a/includes/ContentImport/Importers/Terms/ShallowDuplicating.php +++ b/includes/ContentImport/Importers/Terms/ShallowDuplicating.php @@ -4,9 +4,8 @@ use lloc\Msls\ContentImport\ImportCoordinates; use lloc\Msls\ContentImport\Importers\BaseImporter; -use lloc\Msls\MslsOptionsTax; -use lloc\Msls\MslsOptionsTaxTerm; -use lloc\Msls\OptionsTaxInterface; +use lloc\Msls\Options\Tax\OptionsTaxInterface; +use lloc\Msls\Options\Tax\Term; /** * Class ShallowDuplicating @@ -63,7 +62,7 @@ public function import( array $data ) { $source_terms_ids = wp_list_pluck( $source_terms, 'term_id' ); $msls_terms = array_combine( $source_terms_ids, - array_map( array( MslsOptionsTaxTerm::class, 'create' ), $source_terms_ids ) + array_map( array( Term::class, 'create' ), $source_terms_ids ) ); switch_to_blog( $this->import_coordinates->dest_blog_id ); diff --git a/includes/ContentImport/Importers/WithRequestPostAttributes.php b/includes/ContentImport/Importers/WithRequestPostAttributes.php index 69b41f740..d4a605f82 100644 --- a/includes/ContentImport/Importers/WithRequestPostAttributes.php +++ b/includes/ContentImport/Importers/WithRequestPostAttributes.php @@ -10,7 +10,7 @@ namespace lloc\Msls\ContentImport\Importers; -use lloc\Msls\MslsRequest; +use lloc\Msls\RestApi\Request; /** * Trait WithRequestPostAttributes @@ -28,7 +28,7 @@ trait WithRequestPostAttributes { * @return string Either the post type read from the `$_REQUEST` super-global, or the default value. */ protected function read_post_type_from_request( $preset = 'post' ) { - $request = MslsRequest::get_request( array( 'post_type' ), $preset ); + $request = Request::get_request( array( 'post_type' ), $preset ); return $request['post_type']; } diff --git a/includes/ContentImport/LogWriters/AdminNoticeLogger.php b/includes/ContentImport/LogWriters/AdminNoticeLogger.php index bbf4fa4b7..390241ec9 100644 --- a/includes/ContentImport/LogWriters/AdminNoticeLogger.php +++ b/includes/ContentImport/LogWriters/AdminNoticeLogger.php @@ -4,9 +4,9 @@ use lloc\Msls\Component\Component; use lloc\Msls\ContentImport\ImportCoordinates; -use lloc\Msls\MslsRegistryInstance; +use lloc\Msls\Registry\Instance; -class AdminNoticeLogger extends MslsRegistryInstance implements LogWriter { +class AdminNoticeLogger extends Instance implements LogWriter { /** * The transient where the last import log will be stored. diff --git a/includes/ContentImport/MetaBox.php b/includes/ContentImport/MetaBox.php index 577657d1d..3e67ef83d 100644 --- a/includes/ContentImport/MetaBox.php +++ b/includes/ContentImport/MetaBox.php @@ -2,17 +2,17 @@ namespace lloc\Msls\ContentImport; +use lloc\Msls\Blog\Collection; use lloc\Msls\Component\Component; use lloc\Msls\Component\Wrapper; use lloc\Msls\ContentImport\Importers\Map; -use lloc\Msls\MslsBlogCollection; -use lloc\Msls\MslsFields; -use lloc\Msls\MslsOptionsPost; -use lloc\Msls\MslsPlugin; -use lloc\Msls\MslsRegistryInstance; -use lloc\Msls\MslsRequest; +use lloc\Msls\Options\Post\Post; +use lloc\Msls\Plugin; +use lloc\Msls\Registry\Instance; +use lloc\Msls\Request\Fields; +use lloc\Msls\RestApi\Request; -class MetaBox extends MslsRegistryInstance { +class MetaBox extends Instance { /** * @var array @@ -28,12 +28,12 @@ public function render(): void { return; } - $mydata = new MslsOptionsPost( $post->ID ); - $languages = MslsOptionsPost::instance()->get_available_languages(); - $current = MslsBlogCollection::get_blog_language( get_current_blog_id() ); + $mydata = new Post( $post->ID ); + $languages = Post::instance()->get_available_languages(); + $current = Collection::get_blog_language( get_current_blog_id() ); $languages = array_diff_key( $languages, array( $current => $current ) ); - $input_lang = MslsRequest::get( MslsFields::FIELD_MSLS_LANG, null ); - $input_id = MslsRequest::get( MslsFields::FIELD_MSLS_ID, null ); + $input_lang = Request::get( Fields::FIELD_MSLS_LANG, null ); + $input_id = Request::get( Fields::FIELD_MSLS_ID, null ); $has_input = null !== $input_lang && null !== $input_id; $blogs = msls_blog_collection(); $available = array_filter( @@ -141,7 +141,7 @@ protected function inline_thickbox_html( $output = true, array $data = array() )