PluginProbe
Polylang / trunk
Polylang vtrunk
3.8.10 3.8.9 3.8.8 3.8.7 3.8.6 3.8.5 3.8.4 3.8.3 2.7 2.7.0.1 2.7.1 2.7.2 2.7.3 2.7.4 2.8 2.8.1 2.8.2 2.8.3 2.8.4 2.9 2.9.1 2.9.2 3.0 3.0.1 3.0.2 All 234 releases
← All changes | src/Model/Languages.php +48 -34 3.8.3 → trunk View file →
@@ -4,14 +4,14 @@
4 4 */
5 5
6 6 namespace WP_Syntex\Polylang\Model;
7 7
8 +use WP_Term;
9 +use WP_Error;
8 10 use PLL_Cache;
9 11 use PLL_Language;
10 12 use PLL_Language_Factory;
11 13 use PLL_Translatable_Objects;
12 -use WP_Error;
13 -use WP_Term;
14 14 use WP_Syntex\Polylang\Options\Options;
15 15
16 16 defined( 'ABSPATH' ) || exit;
17 17
@@ -34,9 +34,9 @@
34 34 * Polylang's options.
35 35 *
36 36 * @var Options
37 37 */
38 - private $options;
38 + private Options $options;
39 39
40 40 /**
41 41 * Translatable objects registry.
42 42 *
@@ -41,16 +41,18 @@
41 41 * Translatable objects registry.
42 42 *
43 43 * @var PLL_Translatable_Objects
44 44 */
45 - private $translatable_objects;
45 + private PLL_Translatable_Objects $translatable_objects;
46 46
47 47 /**
48 48 * Internal non persistent cache object.
49 49 *
50 - * @var PLL_Cache<mixed>
50 + * @var PLL_Cache
51 + *
52 + * @phpstan-var PLL_Cache<mixed>
51 53 */
52 - private $cache;
54 + private PLL_Cache $cache;
53 55
54 56 /**
55 57 * Flag set to true during the language objects creation.
56 58 *
@@ -55,9 +57,9 @@
55 57 * Flag set to true during the language objects creation.
56 58 *
57 59 * @var bool
58 60 */
59 - private $is_creating_list = false;
61 + private bool $is_creating_list = false;
60 62
61 63 /**
62 64 * Tells if {@see WP_Syntex\Polylang\Model\Languages::get_list()} can be used.
63 65 *
@@ -62,9 +64,9 @@
62 64 * Tells if {@see WP_Syntex\Polylang\Model\Languages::get_list()} can be used.
63 65 *
64 66 * @var bool
65 67 */
66 - private $languages_ready = false;
68 + private bool $languages_ready = false;
67 69
68 70 /**
69 71 * List of automatic language proxies.
70 72 *
@@ -71,9 +73,9 @@
71 73 * @var Languages_Proxy_Interface[]
72 74 *
73 75 * @phpstan-var array<non-falsy-string, Languages_Proxy_Interface>
74 76 */
75 - private $automatic_proxies = array();
77 + private array $automatic_proxies = array();
76 78
77 79 /**
78 80 * List of language proxies.
79 81 *
@@ -80,9 +82,9 @@
80 82 * @var Languages_Proxy_Interface[]
81 83 *
82 84 * @phpstan-var array<non-falsy-string, Languages_Proxy_Interface>
83 85 */
84 - private $proxies = array();
86 + private array $proxies = array();
85 87
86 88 /**
87 89 * Constructor.
88 90 *
@@ -110,11 +112,11 @@
110 112 * @param mixed $value `term_id`, `term_taxonomy_id`, `slug`, `locale`, or `w3c` of the queried language.
111 113 * `term_id` and `term_taxonomy_id` can be fetched for any language taxonomy.
112 114 * /!\ For the `term_taxonomy_id`, prefix the ID by `tt:` (ex: `"tt:{$tt_id}"`),
113 115 * this is to prevent confusion between `term_id` and `term_taxonomy_id`.
114 - * @return PLL_Language|false Language object, false if no language found.
116 + * @return \PLL_Language|false Language object, false if no language found.
115 117 *
116 - * @phpstan-param PLL_Language|WP_Term|int|string $value
118 + * @phpstan-param \PLL_Language|\WP_Term|int|string $value
117 119 */
118 120 public function get( $value ) {
119 121 if ( $value instanceof PLL_Language ) {
120 122 return $value;
@@ -140,9 +142,9 @@
140 142 $this->cache->set( 'language:' . $lang->locale, $lang );
141 143 $this->cache->set( 'language:' . $lang->w3c, $lang );
142 144 }
143 145
144 - /** @var PLL_Language|false */
146 + /** @var \PLL_Language|false */
145 147 return $this->cache->get( 'language:' . $value );
146 148 }
147 149
148 150 /**
@@ -165,9 +167,9 @@
165 167 * @type string $flag Optional. Country code, {@see src/settings/flags.php}.
166 168 * @type string $flag_code Optional. Country code, {@see src/settings/flags.php}. Will be converted to flag.
167 169 * @type bool $no_default_cat Optional. If set, no default category will be created for this language. Default is false.
168 170 * }
169 - * @return PLL_Language|WP_Error The object language on success, a `WP_Error` otherwise.
171 + * @return \PLL_Language|\WP_Error The object language on success, a `WP_Error` otherwise.
170 172 *
171 173 * @phpstan-param array{
172 174 * name?: string,
173 175 * slug?: string,
@@ -296,9 +298,9 @@
296 298 * @type int $term_group Optional. Language order when displayed.
297 299 * @type string $flag Optional, country code, {@see src/settings/flags.php}.
298 300 * @type string $flag_code Optional. Country code, {@see src/settings/flags.php}. Will be converted to flag.
299 301 * }
300 - * @return PLL_Language|WP_Error The updated object language on success, a `WP_Error` otherwise.
302 + * @return \PLL_Language|\WP_Error The updated object language on success, a `WP_Error` otherwise.
301 303 *
302 304 * @phpstan-param array{
303 305 * lang_id: int|numeric-string,
304 306 * name?: string,
@@ -452,9 +454,9 @@
452 454 * @type int $term_group Language order when displayed.
453 455 * @type string $no_default_cat Optional, if set, no default category has been created for this language.
454 456 * @type string $flag Optional, country code, @see src/settings/flags.php.
455 457 * }
456 - * @param PLL_Language $lang Previous value of the language being edited.
458 + * @param \PLL_Language $lang Previous value of the language being edited.
457 459 */
458 460 do_action( 'pll_update_language', $args, $lang );
459 461
460 462 return $updated_language;
@@ -660,9 +662,9 @@
660 662 * @since 1.8
661 663 * @since 3.4 Deprecated. If you used this hook to filter URLs, you may hook `'site_url'` instead.
662 664 * @deprecated
663 665 *
664 - * @param PLL_Language[] $languages The list of language objects.
666 + * @param \PLL_Language[] $languages The list of language objects.
665 667 */
666 668 $languages = apply_filters_deprecated( 'pll_after_languages_cache', array( $languages ), '3.4' );
667 669
668 670 foreach ( $this->automatic_proxies as $proxy ) {
@@ -719,9 +721,9 @@
719 721 *
720 722 * @since 3.4
721 723 * @since 3.7 Moved from `PLL_Model::get_default_language()` to `WP_Syntex\Polylang\Model\Languages::get_default()`.
722 724 *
723 - * @return PLL_Language|false Default language object, `false` if no language found.
725 + * @return \PLL_Language|false Default language object, `false` if no language found.
724 726 */
725 727 public function get_default() {
726 728 if ( ! empty( $this->options['default_lang'] ) ) {
727 729 return $this->get( $this->options['default_lang'] );
@@ -879,10 +881,10 @@
879 881 * Applies arguments that change the type of the elements of the given list of languages.
880 882 *
881 883 * @since 3.8
882 884 *
883 - * @param PLL_Language[] $languages The list of language objects.
884 - * @param array $args {
885 + * @param \PLL_Language[] $languages The list of language objects.
886 + * @param array $args {
885 887 * @type string $fields Optional. Returns only that field if set; {@see PLL_Language} for a list of fields.
886 888 * }
887 889 * @return array List of `PLL_Language` objects or `PLL_Language` object properties.
888 890 */
@@ -928,8 +930,20 @@
928 930 return new Languages_Proxies( $this, $this->proxies, $key );
929 931 }
930 932
931 933 /**
934 + * Checks if a given value matches the locale format.
935 + *
936 + * @since 3.8.5
937 + *
938 + * @param string $value The value to check.
939 + * @return bool
940 + */
941 + public static function is_locale( $value ): bool {
942 + return is_string( $value ) && (bool) preg_match( '#' . self::LOCALE_PATTERN . '#', $value );
943 + }
944 +
945 + /**
932 946 * Builds the language metas into an array and serializes it, to be stored in the term description.
933 947 *
934 948 * @since 3.4
935 949 * @since 3.7 Moved from `PLL_Admin_Model::build_language_metas()` to `WP_Syntex\Polylang\Model\Languages::build_metas()`.
@@ -1010,9 +1024,9 @@
1010 1024 $add_data = apply_filters( 'pll_language_metas', array(), $args, $new_data, $old_data );
1011 1025 // Don't allow to overwrite `$locale`, `$rtl`, and `$flag_code`.
1012 1026 $new_data = array_merge( $old_data, $add_data, $new_data );
1013 1027
1014 - /** @var non-empty-string $serialized maybe_serialize() cannot return anything else than a string when fed by an array. */
1028 + /** @phpstan-var non-empty-string $serialized maybe_serialize() cannot return anything else than a string when fed by an array. */
1015 1029 $serialized = maybe_serialize( $new_data );
1016 1030 return $serialized;
1017 1031 }
1018 1032
@@ -1036,9 +1050,9 @@
1036 1050 protected function validate_lang( $args, ?PLL_Language $lang = null ): WP_Error {
1037 1051 $errors = new WP_Error();
1038 1052
1039 1053 // Validate locale with the same pattern as WP 4.3. See #28303.
1040 - if ( empty( $args['locale'] ) || ! preg_match( '#' . self::LOCALE_PATTERN . '#', $args['locale'], $matches ) ) {
1054 + if ( empty( $args['locale'] ) || ! self::is_locale( $args['locale'] ) ) {
1041 1055 $errors->add( 'pll_invalid_locale', __( 'Enter a valid WordPress locale', 'polylang' ) );
1042 1056 }
1043 1057
1044 1058 // Validate slug characters.
@@ -1059,9 +1073,9 @@
1059 1073 $errors->add( 'pll_invalid_name', __( 'The language must have a name', 'polylang' ) );
1060 1074 }
1061 1075
1062 1076 // Validate flag.
1063 - if ( ! empty( $args['flag'] ) && ! is_readable( POLYLANG_DIR . '/flags/' . $args['flag'] . '.png' ) ) {
1077 + if ( ! empty( $args['flag'] ) && ! is_readable( POLYLANG_ROOT_DIR . '/vendor/wpsyntex/flags/' . $args['flag'] . '.svg' ) ) {
1064 1078 $flag = PLL_Language::get_flag_information( $args['flag'] );
1065 1079
1066 1080 if ( ! empty( $flag['url'] ) ) {
1067 1081 $response = function_exists( 'vip_safe_wp_remote_get' ) ? vip_safe_wp_remote_get( sanitize_url( $flag['url'] ) ) : wp_remote_get( sanitize_url( $flag['url'] ) );
@@ -1121,9 +1135,9 @@
1121 1135 * @type string[] $sync List of synchronized translations with lang codes as array keys and array values.
1122 1136 * }
1123 1137 * @param string $old_slug The old language slug.
1124 1138 * @param string $new_slug The new language slug.
1125 - * @param WP_Term $term The term containing the post or term translation group.
1139 + * @param \WP_Term $term The term containing the post or term translation group.
1126 1140 */
1127 1141 $tr = apply_filters( 'update_translation_group', $tr, $old_slug, $new_slug, $term );
1128 1142
1129 1143 if ( ! empty( $tr[ $old_slug ] ) ) {
@@ -1287,11 +1301,11 @@
1287 1301 *
1288 1302 * @since 3.4
1289 1303 * @since 3.7 Moved from `PLL_Model::get_languages_from_taxonomies()` to `WP_Syntex\Polylang\Model\Languages::get_from_taxonomies()`.
1290 1304 *
1291 - * @return PLL_Language[] An array of `PLL_Language` objects, array keys are the type.
1305 + * @return \PLL_Language[] An array of `PLL_Language` objects, array keys are the type.
1292 1306 *
1293 - * @phpstan-return list<PLL_Language>
1307 + * @phpstan-return list<\PLL_Language>
1294 1308 */
1295 1309 protected function get_from_taxonomies(): array {
1296 1310 $terms_by_slug = array();
1297 1311
@@ -1301,13 +1315,13 @@
1301 1315 $terms_by_slug[ $key ][ $term->taxonomy ] = $term;
1302 1316 }
1303 1317
1304 1318 /**
1305 - * @var (
1319 + * @phpstan-var (
1306 1320 * array{
1307 1321 * string: array{
1308 - * language: WP_Term,
1309 - * }&array<non-empty-string, WP_Term>
1322 + * language: \WP_Term,
1323 + * }&array<non-empty-string, \WP_Term>
1310 1324 * }
1311 1325 * ) $terms_by_slug
1312 1326 */
1313 1327 $languages = array_filter(
@@ -1324,16 +1338,16 @@
1324 1338 * @since 1.7.5
1325 1339 * @since 3.4 Deprecated.
1326 1340 * @deprecated
1327 1341 *
1328 - * @param PLL_Language[] $languages The list of language objects.
1329 - * @param Language $model `Language` object.
1342 + * @param \PLL_Language[] $languages The list of language objects.
1343 + * @param \Languages $model `Languages` object.
1330 1344 */
1331 1345 $languages = apply_filters_deprecated( 'pll_languages_list', array( $languages, $this ), '3.4', 'pll_additional_language_data' );
1332 1346
1333 1347 if ( ! $this->are_ready() ) {
1334 1348 // Do not cache an incomplete list.
1335 - /** @var list<PLL_Language> $languages */
1349 + /** @phpstan-var list<\PLL_Language> $languages */
1336 1350 return $languages;
1337 1351 }
1338 1352
1339 1353 /*
@@ -1350,9 +1364,9 @@
1350 1364 );
1351 1365
1352 1366 set_transient( self::TRANSIENT_NAME, $languages_data );
1353 1367
1354 - /** @var list<PLL_Language> $languages */
1368 + /** @phpstan-var list<\PLL_Language> $languages */
1355 1369 return $languages;
1356 1370 }
1357 1371
1358 1372 /**
@@ -1362,9 +1376,9 @@
1362 1376 *
1363 1377 * @since 3.2.3
1364 1378 * @since 3.7 Moved from `PLL_Model::get_language_terms()` to `WP_Syntex\Polylang\Model\Languages::get_terms()`.
1365 1379 *
1366 - * @return WP_Term[]
1380 + * @return \WP_Term[]
1367 1381 */
1368 1382 protected function get_terms(): array {
1369 1383 $terms = get_terms(
1370 1384 array(