summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Staudacher <andy.st@gmail.com>2009-09-05 18:55:44 -0700
committerAndy Staudacher <andy.st@gmail.com>2009-09-05 18:55:44 -0700
commitb3d0cb5a4c88c42e29e67f3b3eb4e91151802164 (patch)
tree38069e0075a300ec0c912015cefab55591391380
parentb01596c0f08f00e5fc2d1019b3905fe5fd76a223 (diff)
Bugfixes for locales::locale_from_http_request(), and adding tests.
(And the tests should illustrate that kohana 2.4's API doesn't quite fit our purpose of simply getting the best match between the accepted (client) and the installed (g3) locales.)
-rw-r--r--modules/gallery/helpers/locales.php10
-rw-r--r--modules/gallery/tests/Locales_Helper_Test.php86
2 files changed, 93 insertions, 3 deletions
diff --git a/modules/gallery/helpers/locales.php b/modules/gallery/helpers/locales.php
index 04fa8954..16dda2d7 100644
--- a/modules/gallery/helpers/locales.php
+++ b/modules/gallery/helpers/locales.php
@@ -56,6 +56,9 @@ class locales_Core {
: array_merge($locales, array($default));
module::set_var("gallery", "installed_locales", join("|", $locales));
+
+ // Clear the cache
+ self::$locales = null;
}
// @todo Might want to add a localizable language name as well.
@@ -167,7 +170,7 @@ class locales_Core {
}
// Compare and score requested locales with installed ones
- $matched_locales = array();
+ $scored_locales = array();
foreach ($locale_preferences as $requested_value) {
$scored_locale_match = self::_locale_match_score($requested_value);
if ($scored_locale_match) {
@@ -175,7 +178,7 @@ class locales_Core {
}
}
- usort($matched_locales, array("locales", "_compare_locale_by_qvalue"));
+ usort($scored_locales, array("locales", "_compare_locale_by_qvalue"));
$best_match = array_shift($scored_locales);
if ($best_match) {
@@ -202,7 +205,8 @@ class locales_Core {
return $requested_locale_and_qvalue;
}
list ($language) = explode("_", $requested_locale . "_");
- if (isset(self::$language_subtag_to_locale[$language])) {
+ if (isset(self::$language_subtag_to_locale[$language]) &&
+ isset($installed[self::$language_subtag_to_locale[$language]])) {
return array(self::$language_subtag_to_locale[$language], $qvalue * 0.66);
}
return null;
diff --git a/modules/gallery/tests/Locales_Helper_Test.php b/modules/gallery/tests/Locales_Helper_Test.php
new file mode 100644
index 00000000..85b8e206
--- /dev/null
+++ b/modules/gallery/tests/Locales_Helper_Test.php
@@ -0,0 +1,86 @@
+<?php defined("SYSPATH") or die("No direct script access.");
+/**
+ * Gallery - a web based photo album viewer and editor
+ * Copyright (C) 2000-2009 Bharat Mediratta
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or (at
+ * your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+class Locales_Helper_Test extends Unit_Test_Case {
+ static $installed_locales;
+ static $default_locale;
+
+ public function setup() {
+ self::$installed_locales = locales::installed();
+ self::$default_locale = module::get_var("gallery", "default_locale");
+ locales::update_installed(array_keys(locales::available()));
+ module::set_var("gallery", "default_locale", "no_NO");
+ }
+
+ public function teardown() {
+ locales::update_installed(array_keys(self::$installed_locales));
+ module::set_var("gallery", "default_locale", self::$default_locale);
+ }
+
+ public function locale_from_http_request_test() {
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = "de-de";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal("de_DE", $locale);
+ }
+
+ public function locale_from_http_request_fallback_test() {
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = "de";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal("de_DE", $locale);
+ }
+
+ public function locale_from_http_request_by_qvalue_test() {
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = "de-de;q=0.8,fr-fr;q=0.9";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal("fr_FR", $locale);
+ }
+
+ public function locale_from_http_request_default_qvalue_test() {
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = "de-de;q=0.8,it-it,fr-fr;q=0.9";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal("it_IT", $locale);
+ }
+
+ public function locale_from_http_request_lang_fallback_qvalue_adjustment_test() {
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = ",fr-fr;q=0.4,de-ch;q=0.8";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal("de_DE", $locale);
+ }
+
+ public function locale_from_http_request_best_match_vs_installed_test() {
+ locales::update_installed(array("no_NO", "pt_PT", "ja_JP"));
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = "en,en-us,ja_JP;q=0.7,no-fr;q=0.9";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal("ja_JP", $locale);
+ }
+
+ public function locale_from_http_request_best_match_vs_installed_2_test() {
+ locales::update_installed(array("no_NO", "pt_PT", "ja_JP"));
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = "en,en-us,ja_JP;q=0.5,no-fr;q=0.9";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal("no_NO", $locale);
+ }
+
+ public function locale_from_http_request_no_match_vs_installed_test() {
+ locales::update_installed(array("no_NO", "pt_PT", "ja_JP"));
+ $_SERVER["HTTP_ACCEPT_LANGUAGE"] = "en,en-us,de";
+ $locale = locales::locale_from_http_request();
+ $this->assert_equal(null, $locale);
+ }
+} \ No newline at end of file