public inbox for [email protected]
help / color / mirror / Atom feed[PATCH] Language selection based on browser preference, use UTF-8, care about direction, etc
3+ messages / 3 participants
[nested] [flat]
* [PATCH] Language selection based on browser preference, use UTF-8, care about direction, etc
@ 2004-11-15 07:59 Omar Kilani <[email protected]>
0 siblings, 1 reply; 3+ messages in thread
From: Omar Kilani @ 2004-11-15 07:59 UTC (permalink / raw)
To: pgsql-www
Hello,
Attached patch:
* Picks a language based on the actual browser preference.
* Makes all pages default to UTF-8.
* Adds language direction support.
* Makes pages tell the browser what language they're in.
* Fixes language_map.
* Adds a couple of extra handy language functions.
It's in place at our pgweb, but diffed against gborg. Set your browser
to 'de' (Tools -> Options -> General -> Languages, add 'German [de]' and
move it up to the top) and you'll see a german news item at the top (I
google translated it) of the homepage. Go to About/Advantages and you
should see the german version of the page from advocacy. Right-clicking
on the page and clicking 'Properties' should say "Text Language: German."
Clicking the Arabic or Hebrew on the bottom should switch the page
direction.
Omar
Index: system/handler.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/handler.php,v
retrieving revision 1.4
diff -u -r1.4 handler.php
--- system/handler.php 21 Apr 2004 14:50:44 -0000 1.4
+++ system/handler.php 15 Nov 2004 07:48:53 -0000
@@ -15,7 +15,7 @@
if (!empty($_GET['lang'])) {
$language = addslashes($_GET['lang']);
} else {
- $language = $_SETTINGS['defaultlanguage'];
+ $language = language_from_accept_language($_SETTINGS['defaultlanguage']);
}
if (!empty($_GET['page'])) {
@@ -26,11 +26,17 @@
$_LANGUAGE = language_set($language);
+$language_direction = language_direction($language);
+
// Prepare the template
$tpl =& new HTML_Template_Sigma('../template', '/tmp');
$tpl->setCallbackFunction('lang', 'gettext', true);
$tpl->loadTemplateFile('common.html', true, true);
$tpl->setGlobalVariable('current_page', $page);
+$tpl->setGlobalVariable('current_lang', $language);
+$tpl->setGlobalVariable('current_lang_dir', $language_direction);
+
+header("Content-Language: $language");
if (preg_match('!^docs/([^/]*)/([a-z]*)/([^/]*)$!', $page, $docsAry)) {
require './docs.php';
@@ -50,4 +56,4 @@
));
$tpl->show();
-?>
\ No newline at end of file
+?>
Index: system/global/functions.language.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/global/functions.language.php,v
retrieving revision 1.3
diff -u -r1.3 functions.language.php
--- system/global/functions.language.php 16 Mar 2004 22:53:48 -0000 1.3
+++ system/global/functions.language.php 15 Nov 2004 07:48:53 -0000
@@ -37,15 +37,16 @@
* Checks whether the given language exists
*
* @param string Language name, from the name of the requested page
+ * @param bool Only check the root language?
* @return bool
*/
-function language_valid($lang)
+function language_valid($lang, $at_root = true)
{
global $_LANGUAGES, $_LANGUAGE_ALIASES;
if (isset($_LANGUAGES[$lang])) {
return true;
- } elseif (strpos($lang, '-')) {
+ } elseif ($at_root == true && strpos($lang, '-')) {
$parts = explode('-', $lang);
if (isset($_LANGUAGES[$parts[0]])) {
return true;
@@ -68,7 +69,7 @@
return $_LANGUAGE_ALIASES[$lang];
}
if (false !== strpos($lang, '-')) {
- $parts = explode('-', $parts);
+ $parts = explode('-', $lang);
if (isset($_LANGUAGES[$lang])) {
return $parts[0] . '_' . strtoupper($parts[1]);
}
@@ -82,4 +83,51 @@
}
return $lang;
}
+
+/**
+ * Return the root of the language, e.g. the root of en-us is en
+ *
+ * @param string Language name
+ * @return string Root of language name
+ */
+function language_root($lang) {
+ $parts = explode('-', $lang);
+ return $parts[0];
+}
+
+
+/**
+ * Return the first valid language from HTTP_ACCEPT_LANGUAGE, else current_lang
+ *
+ * @param string Language name, the current language
+ * @return string Language name, either a matched ACCEPT_LANGUAGE or current_lang
+ */
+function language_from_accept_language($current_lang) {
+ if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+ $accepts_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+ foreach ($accepts_langs as $accepts_lang) {
+ $accepts_lang = explode(';', $accepts_lang);
+ $accepts_lang = $accepts_lang[0];
+ if (language_valid($accepts_lang, false)) {
+ return $accepts_lang;
+ }
+ }
+ }
+ return $current_lang;
+}
+
+/**
+ * Return the direction (ltr, rtl) of the language, else default to ltr
+ *
+ * @param string Language name
+ * @return string Language direction
+ */
+function language_direction($lang) {
+ $direction = $GLOBALS['_LANGUAGE_DIRECTION'][language_root($lang)];
+ if (empty($direction)) {
+ return 'ltr';
+ }
+ return $direction;
+}
+
?>
Index: system/global/languages.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/global/languages.php,v
retrieving revision 1.3
diff -u -r1.3 languages.php
--- system/global/languages.php 8 Mar 2004 10:24:23 -0000 1.3
+++ system/global/languages.php 15 Nov 2004 07:48:53 -0000
@@ -8,7 +8,7 @@
$GLOBALS['_LANGUAGES'] = array(
'en' => 'English',
// "de" => "Deutsch",
- 'ru' => 'Русский'
+ 'ru' => 'Русский'
);
// Aliases for languages with different browser and gettext codes
@@ -17,4 +17,10 @@
'en' => 'en_US',
'ru' => 'ru_RU'
);
-?>
\ No newline at end of file
+
+// Language directions
+$GLOBALS['_LANGUAGE_DIRECTION'] = array(
+ 'en' => 'ltr',
+ 'ru' => 'ltr'
+};
+?>
Index: template/common.html
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/template/common.html,v
retrieving revision 1.7
diff -u -r1.7 common.html
--- template/common.html 13 Nov 2004 05:59:03 -0000 1.7
+++ template/common.html 15 Nov 2004 07:48:53 -0000
@@ -1,7 +1,8 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
-<html xmlns="http://www.w3.org/1999/xhtml"; lang="en" xml:lang="en">
+<html xmlns="http://www.w3.org/1999/xhtml"; lang="{current_lang}" xml:lang="{current_lang}" dir="{current_lang_dir}">
<head>
<title>PostgreSQL<!-- BEGIN page_title_more -->: {page_title}<!-- END page_title_more --></title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="/layout/css/new.css" />
<link rel="alternate" type="application/rss+xml" title="PostgreSQL news" href="/news.rss" />
<link rel="alternate" type="application/rss+xml" title="PostgreSQL events" href="/events.rss" />
Attachments:
[text/plain] pgweb-language.patch (5.8K, 2-pgweb-language.patch)
download | inline diff:
Index: system/handler.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/handler.php,v
retrieving revision 1.4
diff -u -r1.4 handler.php
--- system/handler.php 21 Apr 2004 14:50:44 -0000 1.4
+++ system/handler.php 15 Nov 2004 07:48:53 -0000
@@ -15,7 +15,7 @@
if (!empty($_GET['lang'])) {
$language = addslashes($_GET['lang']);
} else {
- $language = $_SETTINGS['defaultlanguage'];
+ $language = language_from_accept_language($_SETTINGS['defaultlanguage']);
}
if (!empty($_GET['page'])) {
@@ -26,11 +26,17 @@
$_LANGUAGE = language_set($language);
+$language_direction = language_direction($language);
+
// Prepare the template
$tpl =& new HTML_Template_Sigma('../template', '/tmp');
$tpl->setCallbackFunction('lang', 'gettext', true);
$tpl->loadTemplateFile('common.html', true, true);
$tpl->setGlobalVariable('current_page', $page);
+$tpl->setGlobalVariable('current_lang', $language);
+$tpl->setGlobalVariable('current_lang_dir', $language_direction);
+
+header("Content-Language: $language");
if (preg_match('!^docs/([^/]*)/([a-z]*)/([^/]*)$!', $page, $docsAry)) {
require './docs.php';
@@ -50,4 +56,4 @@
));
$tpl->show();
-?>
\ No newline at end of file
+?>
Index: system/global/functions.language.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/global/functions.language.php,v
retrieving revision 1.3
diff -u -r1.3 functions.language.php
--- system/global/functions.language.php 16 Mar 2004 22:53:48 -0000 1.3
+++ system/global/functions.language.php 15 Nov 2004 07:48:53 -0000
@@ -37,15 +37,16 @@
* Checks whether the given language exists
*
* @param string Language name, from the name of the requested page
+ * @param bool Only check the root language?
* @return bool
*/
-function language_valid($lang)
+function language_valid($lang, $at_root = true)
{
global $_LANGUAGES, $_LANGUAGE_ALIASES;
if (isset($_LANGUAGES[$lang])) {
return true;
- } elseif (strpos($lang, '-')) {
+ } elseif ($at_root == true && strpos($lang, '-')) {
$parts = explode('-', $lang);
if (isset($_LANGUAGES[$parts[0]])) {
return true;
@@ -68,7 +69,7 @@
return $_LANGUAGE_ALIASES[$lang];
}
if (false !== strpos($lang, '-')) {
- $parts = explode('-', $parts);
+ $parts = explode('-', $lang);
if (isset($_LANGUAGES[$lang])) {
return $parts[0] . '_' . strtoupper($parts[1]);
}
@@ -82,4 +83,51 @@
}
return $lang;
}
+
+/**
+ * Return the root of the language, e.g. the root of en-us is en
+ *
+ * @param string Language name
+ * @return string Root of language name
+ */
+function language_root($lang) {
+ $parts = explode('-', $lang);
+ return $parts[0];
+}
+
+
+/**
+ * Return the first valid language from HTTP_ACCEPT_LANGUAGE, else current_lang
+ *
+ * @param string Language name, the current language
+ * @return string Language name, either a matched ACCEPT_LANGUAGE or current_lang
+ */
+function language_from_accept_language($current_lang) {
+ if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
+ $accepts_langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
+ foreach ($accepts_langs as $accepts_lang) {
+ $accepts_lang = explode(';', $accepts_lang);
+ $accepts_lang = $accepts_lang[0];
+ if (language_valid($accepts_lang, false)) {
+ return $accepts_lang;
+ }
+ }
+ }
+ return $current_lang;
+}
+
+/**
+ * Return the direction (ltr, rtl) of the language, else default to ltr
+ *
+ * @param string Language name
+ * @return string Language direction
+ */
+function language_direction($lang) {
+ $direction = $GLOBALS['_LANGUAGE_DIRECTION'][language_root($lang)];
+ if (empty($direction)) {
+ return 'ltr';
+ }
+ return $direction;
+}
+
?>
Index: system/global/languages.php
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/system/global/languages.php,v
retrieving revision 1.3
diff -u -r1.3 languages.php
--- system/global/languages.php 8 Mar 2004 10:24:23 -0000 1.3
+++ system/global/languages.php 15 Nov 2004 07:48:53 -0000
@@ -8,7 +8,7 @@
$GLOBALS['_LANGUAGES'] = array(
'en' => 'English',
// "de" => "Deutsch",
- 'ru' => 'Русский'
+ 'ru' => 'Русский'
);
// Aliases for languages with different browser and gettext codes
@@ -17,4 +17,10 @@
'en' => 'en_US',
'ru' => 'ru_RU'
);
-?>
\ No newline at end of file
+
+// Language directions
+$GLOBALS['_LANGUAGE_DIRECTION'] = array(
+ 'en' => 'ltr',
+ 'ru' => 'ltr'
+};
+?>
Index: template/common.html
===================================================================
RCS file: /usr/local/cvsroot/pgweb/portal/template/common.html,v
retrieving revision 1.7
diff -u -r1.7 common.html
--- template/common.html 13 Nov 2004 05:59:03 -0000 1.7
+++ template/common.html 15 Nov 2004 07:48:53 -0000
@@ -1,7 +1,8 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{current_lang}" xml:lang="{current_lang}" dir="{current_lang_dir}">
<head>
<title>PostgreSQL<!-- BEGIN page_title_more -->: {page_title}<!-- END page_title_more --></title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="/layout/css/new.css" />
<link rel="alternate" type="application/rss+xml" title="PostgreSQL news" href="/news.rss" />
<link rel="alternate" type="application/rss+xml" title="PostgreSQL events" href="/events.rss" />
^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: [PATCH] Language selection based on browser preference, use UTF-8, care about direction, etc
@ 2004-11-15 22:24 Dave Page <[email protected]>
0 siblings, 0 replies; 3+ messages in thread
From: Dave Page @ 2004-11-15 22:24 UTC (permalink / raw)
To: Omar Kilani <[email protected]>; pgsql-www
Thanks Omar, patch applied!
Regards, Dave
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Omar Kilani
> Sent: 15 November 2004 08:00
> To: [email protected]
> Subject: [pgsql-www] [PATCH] Language selection based on
> browser preference, use UTF-8, care about direction, etc
>
> Hello,
>
> Attached patch:
>
> * Picks a language based on the actual browser preference.
> * Makes all pages default to UTF-8.
> * Adds language direction support.
> * Makes pages tell the browser what language they're in.
> * Fixes language_map.
> * Adds a couple of extra handy language functions.
>
> It's in place at our pgweb, but diffed against gborg. Set
> your browser to 'de' (Tools -> Options -> General ->
> Languages, add 'German [de]' and move it up to the top) and
> you'll see a german news item at the top (I google translated
> it) of the homepage. Go to About/Advantages and you should
> see the german version of the page from advocacy.
> Right-clicking on the page and clicking 'Properties' should
> say "Text Language: German."
>
> Clicking the Arabic or Hebrew on the bottom should switch the
> page direction.
>
> Omar
>
^ permalink raw reply [nested|flat] 3+ messages in thread
* Re: [PATCH] Language selection based on browser preference,
@ 2004-11-17 10:01 Alexey Borzov <[email protected]>
parent: Omar Kilani <[email protected]>
0 siblings, 0 replies; 3+ messages in thread
From: Alexey Borzov @ 2004-11-17 10:01 UTC (permalink / raw)
To: Omar Kilani <[email protected]>; +Cc: pgsql-www
Hi,
Omar Kilani wrote:
> Attached patch:
>
> * Picks a language based on the actual browser preference.
> * Makes all pages default to UTF-8.
> * Adds language direction support.
> * Makes pages tell the browser what language they're in.
> * Fixes language_map.
> * Adds a couple of extra handy language functions.
I have some questions regarding the patch:
1) What's the purpose of adding the encoding to the HTML? It's already
defined in .htaccess and having it in HTML may lead to some problems.
2) All files are expected to be in UTF-8, so is there a reason to encode
Cyrillic letters in HTML entitites?
3) The language_from_accept_language() function does not seem to handle
quality values for preferred languages, as described f.e. here:
http://httpd.apache.org/docs/content-negotiation.html
^ permalink raw reply [nested|flat] 3+ messages in thread
end of thread, other threads:[~2004-11-17 10:01 UTC | newest]
Thread overview: 3+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2004-11-15 07:59 [PATCH] Language selection based on browser preference, use UTF-8, care about direction, etc Omar Kilani <[email protected]>
2004-11-17 10:01 ` Re: [PATCH] Language selection based on browser preference, Alexey Borzov <[email protected]>
2004-11-15 22:24 Re: [PATCH] Language selection based on browser preference, use UTF-8, care about direction, etc Dave Page <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox