summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2008-07-23 01:15:33 +0000
committerStanislav Malyshev <stas@php.net>2008-07-23 01:15:33 +0000
commit775502f7e9e2bf2058ceebd77d0869a68ba15312 (patch)
treeaaf100e4178fa321b0d8d0b52e15991e6200c20d
parent432b57b2ae87d2d724a02301550d46527a7b99ad (diff)
downloadphp-git-775502f7e9e2bf2058ceebd77d0869a68ba15312.tar.gz
add acceptFromHttp
-rwxr-xr-xext/intl/locale/locale_class.c1
-rwxr-xr-xext/intl/locale/locale_methods.c140
-rwxr-xr-xext/intl/locale/locale_methods.h1
-rwxr-xr-xext/intl/php_intl.c1
-rwxr-xr-xext/intl/tests/ut_common.inc3
5 files changed, 86 insertions, 60 deletions
diff --git a/ext/intl/locale/locale_class.c b/ext/intl/locale/locale_class.c
index 329ce739dc..6b9ba90ff1 100755
--- a/ext/intl/locale/locale_class.c
+++ b/ext/intl/locale/locale_class.c
@@ -89,6 +89,7 @@ function_entry Locale_class_functions[] = {
ZEND_FENTRY( filterMatches, ZEND_FN( locale_filter_matches ), locale_3_args, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC )
ZEND_FENTRY( lookup, ZEND_FN( locale_lookup ), locale_4_args, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC )
ZEND_FENTRY( canonicalize, ZEND_FN( locale_canonicalize ), locale_1_arg , ZEND_ACC_PUBLIC|ZEND_ACC_STATIC )
+ ZEND_FENTRY( acceptFromHttp, ZEND_FN( locale_accept_from_http ), locale_1_arg , ZEND_ACC_PUBLIC|ZEND_ACC_STATIC )
{ NULL, NULL, NULL }
};
/* }}} */
diff --git a/ext/intl/locale/locale_methods.c b/ext/intl/locale/locale_methods.c
index 1f6ca4d182..fc34f14a78 100755
--- a/ext/intl/locale/locale_methods.c
+++ b/ext/intl/locale/locale_methods.c
@@ -21,12 +21,14 @@
#include <unicode/ustring.h>
#include <unicode/udata.h>
#include <unicode/putil.h>
+#include <unicode/ures.h>
#include "php_intl.h"
#include "locale.h"
#include "locale_class.h"
#include "locale_methods.h"
#include "intl_convert.h"
+#include "intl_data.h"
#include <zend_API.h>
#include <zend.h>
@@ -424,12 +426,10 @@ static void get_icu_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAMETERS)
}
/* }}} */
-/* {{{
- * proto public static string Locale::getScript($locale)
+/* {{{ proto static string Locale::getScript($locale)
* gets the script for the $locale
}}} */
-/* {{{
- * proto public static string locale_get_script($locale)
+/* {{{ proto static string locale_get_script($locale)
* gets the script for the $locale
*/
PHP_FUNCTION( locale_get_script )
@@ -438,12 +438,10 @@ PHP_FUNCTION( locale_get_script )
}
/* }}} */
-/* {{{
- * proto public static string Locale::getRegion($locale)
+/* {{{ proto static string Locale::getRegion($locale)
* gets the region for the $locale
}}} */
-/* {{{
- * proto public static string locale_get_region($locale)
+/* {{{ proto static string locale_get_region($locale)
* gets the region for the $locale
*/
PHP_FUNCTION( locale_get_region )
@@ -452,12 +450,10 @@ PHP_FUNCTION( locale_get_region )
}
/* }}} */
-/* {{{
- * proto public static string Locale::getPrimaryLanguage($locale)
+/* {{{ proto static string Locale::getPrimaryLanguage($locale)
* gets the primary language for the $locale
}}} */
-/* {{{
- * proto public static string locale_get_primary_language($locale)
+/* {{{ proto static string locale_get_primary_language($locale)
* gets the primary language for the $locale
*/
PHP_FUNCTION(locale_get_primary_language )
@@ -607,12 +603,10 @@ static void get_icu_disp_value_src_php( char* tag_name, INTERNAL_FUNCTION_PARAME
}
/* }}} */
-/* {{{
-* public static string Locale::getDisplayName($locale, $in_locale = null)
+/* {{{ proto static string Locale::getDisplayName($locale[, $in_locale = null])
* gets the name for the $locale in $in_locale or default_locale
}}} */
-/* {{{
-* public static string get_display_name($locale, $in_locale = null)
+/* {{{ proto static string get_display_name($locale[, $in_locale = null])
* gets the name for the $locale in $in_locale or default_locale
*/
PHP_FUNCTION(locale_get_display_name)
@@ -621,12 +615,10 @@ PHP_FUNCTION(locale_get_display_name)
}
/* }}} */
-/* {{{
-* public static string Locale::getDisplayLanguage($locale, $in_locale = null)
+/* {{{ proto static string Locale::getDisplayLanguage($locale[, $in_locale = null])
* gets the language for the $locale in $in_locale or default_locale
}}} */
-/* {{{
-* public static string get_display_language($locale, $in_locale = null)
+/* {{{ proto static string get_display_language($locale[, $in_locale = null])
* gets the language for the $locale in $in_locale or default_locale
*/
PHP_FUNCTION(locale_get_display_language)
@@ -635,12 +627,10 @@ PHP_FUNCTION(locale_get_display_language)
}
/* }}} */
-/* {{{
-* public static string Locale::getDisplayScript($locale, $in_locale = null)
+/* {{{ proto static string Locale::getDisplayScript($locale, $in_locale = null)
* gets the script for the $locale in $in_locale or default_locale
}}} */
-/* {{{
-* public static string get_display_script($locale, $in_locale = null)
+/* {{{ proto static string get_display_script($locale, $in_locale = null)
* gets the script for the $locale in $in_locale or default_locale
*/
PHP_FUNCTION(locale_get_display_script)
@@ -649,12 +639,10 @@ PHP_FUNCTION(locale_get_display_script)
}
/* }}} */
-/* {{{
-* public static string Locale::getDisplayRegion($locale, $in_locale = null)
+/* {{{ proto static string Locale::getDisplayRegion($locale, $in_locale = null)
* gets the region for the $locale in $in_locale or default_locale
}}} */
-/* {{{
-* public static string get_display_region($locale, $in_locale = null)
+/* {{{ proto static string get_display_region($locale, $in_locale = null)
* gets the region for the $locale in $in_locale or default_locale
*/
PHP_FUNCTION(locale_get_display_region)
@@ -664,11 +652,11 @@ PHP_FUNCTION(locale_get_display_region)
/* }}} */
/* {{{
-* public static string Locale::getDisplayVariant($locale, $in_locale = null)
+* proto static string Locale::getDisplayVariant($locale, $in_locale = null)
* gets the variant for the $locale in $in_locale or default_locale
}}} */
/* {{{
-* public static string get_display_variant($locale, $in_locale = null)
+* proto static string get_display_variant($locale, $in_locale = null)
* gets the variant for the $locale in $in_locale or default_locale
*/
PHP_FUNCTION(locale_get_display_variant)
@@ -677,17 +665,14 @@ PHP_FUNCTION(locale_get_display_variant)
}
/* }}} */
- /* {{{
- * proto static string[] getKeywords(string $locale) {
- * return an associative array containing keyword-value
- * pairs for this locale. The keys are keys to the array (doh!)
- * }}}*/
- /* {{{
- * proto static string[] locale_get_keywords(string $locale) {
- * return an associative array containing keyword-value
- * pairs for this locale. The keys are keys to the array (doh!)
- */
-
+ /* {{{ proto static array getKeywords(string $locale) {
+ * return an associative array containing keyword-value
+ * pairs for this locale. The keys are keys to the array (doh!)
+ * }}}*/
+ /* {{{ proto static array locale_get_keywords(string $locale) {
+ * return an associative array containing keyword-value
+ * pairs for this locale. The keys are keys to the array (doh!)
+ */
PHP_FUNCTION( locale_get_keywords )
{
UEnumeration* e = NULL;
@@ -761,12 +746,10 @@ PHP_FUNCTION( locale_get_keywords )
}
/* }}} */
- /* {{{
- * proto static string Locale::canonicalize($locale)
+ /* {{{ proto static string Locale::canonicalize($locale)
* @return string the canonicalized locale
* }}} */
- /* {{{
- * proto static string locale_canonicalize(Locale $loc, string $locale)
+ /* {{{ proto static string locale_canonicalize(Locale $loc, string $locale)
* @param string $locale The locale string to canonicalize
*/
PHP_FUNCTION(locale_canonicalize)
@@ -970,12 +953,10 @@ static int handleAppendResult( int result,char* loc_name TSRMLS_DC)
}
/* }}} */
-/* {{{
-* proto static string Locale::composeLocale($array)
+/* {{{ proto static string Locale::composeLocale($array)
* Creates a locale by combining the parts of locale-ID passed
* }}} */
-/* {{{
-* proto static string compose_locale($array)
+/* {{{ proto static string compose_locale($array)
* Creates a locale by combining the parts of locale-ID passed
* }}} */
PHP_FUNCTION(locale_compose)
@@ -1174,13 +1155,12 @@ static int add_array_entry(char* loc_name, zval* hash_arr, char* key_name TSRMLS
}
return cur_result;
}
+/* }}} */
-/* {{{
-* proto static array Locale::parseLocale($locale)
+/* {{{ proto static array Locale::parseLocale($locale)
* parses a locale-id into an array the different parts of it
}}} */
-/* {{{
-* proto static array parse_locale($locale)
+/* {{{ proto static array parse_locale($locale)
* parses a locale-id into an array the different parts of it
*/
PHP_FUNCTION(locale_parse)
@@ -1317,8 +1297,12 @@ static int strToMatch(char* str ,char *retstr)
}
/* }}} */
-/*{{{
-* code used by locale_filter_maatches
+/* {{{ proto static boolean Locale::filterMatches(string $langtag, string $locale)
+* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm
+*/
+/* }}} */
+/* {{{ proto boolean locale_filter_matches(string $langtag, string $locale)
+* Checks if a $langtag filter matches with $locale according to RFC 4647's basic filtering algorithm
*/
PHP_FUNCTION(locale_filter_matches)
{
@@ -1483,6 +1467,7 @@ PHP_FUNCTION(locale_filter_matches)
}
}
+/* }}} */
static void array_cleanup( char* arr[] , int arr_size)
{
@@ -1656,13 +1641,12 @@ static char* lookup_loc_range(char* loc_range, HashTable* hash_arr , int isCanon
}
/* }}} */
-/* {{{
-* public static function lookup(array $langtag, $locale, $default = null)
+/* {{{ proto string Locale::lookup(array $langtag, $locale[, $default = null])
* Searchs the items in $langtag for the best match to the language
* range
*/
-/* {{{
-* public static function lookup(array $langtag, $locale, $default = null)
+/* }}} */
+/* {{{ proto string locale_lookup(array $langtag, $locale[, $default = null])
* Searchs the items in $langtag for the best match to the language
* range
*/
@@ -1718,8 +1702,44 @@ PHP_FUNCTION(locale_lookup)
RETVAL_STRINGL( result, strlen(result), 0);
}
+/* }}} */
-
+/* {{{ proto string Locale::acceptFromHttp(string $http_accept)
+* Tries to find out best available locale based on HTTP “Accept-Language” header
+*/
+/* }}} */
+/* {{{ proto string locale_accept_from_http(string $http_accept)
+* Tries to find out best available locale based on HTTP “Accept-Language” header
+*/
+PHP_FUNCTION(locale_accept_from_http)
+{
+ UEnumeration *available;
+ char *http_accept = NULL;
+ int http_accept_len;
+ UErrorCode status = 0;
+ int len;
+ char resultLocale[INTL_MAX_LOCALE_LEN+1];
+ UAcceptResult outResult;
+
+ if(zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "s", &http_accept, &http_accept_len) == FAILURE)
+ {
+ intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
+ "locale_accept_from_http: unable to parse input parameters", 0 TSRMLS_CC );
+ RETURN_NULL();
+ }
+
+ available = ures_openAvailableLocales(NULL, &status);
+ INTL_CHECK_STATUS(status, "locale_accept_from_http: failed to retrieve locale list");
+ len = uloc_acceptLanguageFromHTTP(resultLocale, INTL_MAX_LOCALE_LEN,
+ &outResult, http_accept, available, &status);
+ uenum_close(available);
+ INTL_CHECK_STATUS(status, "locale_accept_from_http: failed to find acceptable locale");
+ if(outResult == ULOC_ACCEPT_FAILED) {
+ RETURN_FALSE;
+ }
+ RETURN_STRINGL(resultLocale, len, 1);
+}
+/* }}} */
/*
* Local variables:
diff --git a/ext/intl/locale/locale_methods.h b/ext/intl/locale/locale_methods.h
index 0b2db50f6c..3fc959b59f 100755
--- a/ext/intl/locale/locale_methods.h
+++ b/ext/intl/locale/locale_methods.h
@@ -43,5 +43,6 @@ PHP_FUNCTION( locale_parse);
PHP_FUNCTION( locale_filter_matches);
PHP_FUNCTION( locale_lookup);
PHP_FUNCTION( locale_canonicalize);
+PHP_FUNCTION( locale_accept_from_http);
#endif // LOCALE_METHODS_H
diff --git a/ext/intl/php_intl.c b/ext/intl/php_intl.c
index 645d0361d4..696000a540 100755
--- a/ext/intl/php_intl.c
+++ b/ext/intl/php_intl.c
@@ -278,6 +278,7 @@ zend_function_entry intl_functions[] = {
PHP_FE( locale_filter_matches, locale_3_args )
PHP_FE( locale_canonicalize, locale_1_arg )
PHP_FE( locale_lookup, locale_4_args )
+ PHP_FE( locale_accept_from_http, locale_1_arg )
// MessageFormatter functions
PHP_FE( msgfmt_create, NULL )
diff --git a/ext/intl/tests/ut_common.inc b/ext/intl/tests/ut_common.inc
index 5b5d2e407a..4f2036123d 100755
--- a/ext/intl/tests/ut_common.inc
+++ b/ext/intl/tests/ut_common.inc
@@ -280,6 +280,9 @@ function ut_loc_locale_lookup( $lang_tag_arr,$loc_range,$isCanonical,$default_lo
{
return $GLOBALS['oo-mode'] ? Locale::lookup( $lang_tag_arr,$loc_range,$isCanonical,$default_loc ) : locale_lookup( $lang_tag_arr,$loc_range,$isCanonical,$default_loc );
}
+function ut_loc_accept_http($http) {
+ return $GLOBALS['oo-mode'] ? Locale::acceptFromHttp($http):locale_accept_from_http($http);
+}
/* MessageFormatter functions */
function ut_msgfmt_create( $locale, $pattern)
{