]> granicus.if.org Git - php/commitdiff
Fixed bug #66289 Locale::lookup incorrectly returns en or en_US if locale is empty
authorAnatol Belski <ab@php.net>
Sat, 9 Apr 2016 16:22:57 +0000 (18:22 +0200)
committerAnatol Belski <ab@php.net>
Sat, 9 Apr 2016 16:24:42 +0000 (18:24 +0200)
ext/intl/locale/locale_methods.c
ext/intl/tests/locale_bug66289.phpt [new file with mode: 0644]

index c47f28320155672400f7c25f2439b9fb344a5c75..3471ba405392efb95a16f6eb693d6cfe2164145a 100644 (file)
@@ -1548,7 +1548,11 @@ PHP_FUNCTION(locale_lookup)
        }
 
        if(loc_range_len == 0) {
-               loc_range = intl_locale_get_default();
+               if(fallback_loc_str) {
+                       loc_range = ZSTR_VAL(fallback_loc_str);
+               } else {
+                       loc_range = intl_locale_get_default();
+               }
        }
 
        hash_arr = Z_ARRVAL_P(arr);
diff --git a/ext/intl/tests/locale_bug66289.phpt b/ext/intl/tests/locale_bug66289.phpt
new file mode 100644 (file)
index 0000000..6afd821
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Bug #66289 Locale::lookup incorrectly returns en or en_US if locale is empty
+--SKIPIF--
+<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
+--FILE--
+<?php
+
+ini_set("intl.default_locale", "en-US");
+$availableLocales = array('fr_FR', 'de', 'es_ES', 'es_419', 'en_US');
+var_dump(locale_lookup($availableLocales, false, true, 'fr_FR'));
+var_dump(locale_lookup($availableLocales, false, true, null));
+
+$availableLocales = array('fr_FR', 'de', 'es_ES', 'es_419');
+var_dump(locale_lookup($availableLocales, false, true, 'fr_FR'));
+
+ini_set("intl.default_locale", "de-DE");
+$availableLocales = array(Locale::getDefault());
+var_dump(locale_lookup($availableLocales, false, true));
+
+?>
+==DONE==
+--EXPECT--
+string(5) "fr_fr"
+string(5) "en_us"
+string(5) "fr_fr"
+string(5) "de_de"
+==DONE==