summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/common.php5
-rw-r--r--lib/language.php66
-rw-r--r--lib/util.php49
3 files changed, 118 insertions, 2 deletions
diff --git a/lib/common.php b/lib/common.php
index 518171249..04242432c 100644
--- a/lib/common.php
+++ b/lib/common.php
@@ -36,6 +36,8 @@ require_once('PEAR.php');
require_once('DB/DataObject.php');
require_once('DB/DataObject/Cast.php'); # for dates
+require_once(INSTALLDIR.'/lib/language.php');
+
// default configuration, overwritten in config.php
$config =
@@ -46,6 +48,9 @@ $config =
'path' => '/',
'logfile' => NULL,
'fancy' => false,
+ 'locale_path' => './locale',
+ 'language' => 'en_US',
+ 'languages' => get_all_languages(),
'email' =>
array_key_exists('SERVER_ADMIN', $_SERVER) ? $_SERVER['SERVER_ADMIN'] : NULL,
'broughtby' => NULL,
diff --git a/lib/language.php b/lib/language.php
new file mode 100644
index 000000000..c3532d744
--- /dev/null
+++ b/lib/language.php
@@ -0,0 +1,66 @@
+<?php
+/*
+ * Laconica - a distributed open-source microblogging tool
+ * Copyright (C) 2008, Controlez-Vous, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 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 Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+if (!defined('LACONICA')) { exit(1); }
+
+
+
+function client_prefered_language($httplang) {
+ $client_langs = array();
+ $all_languages = get_all_languages();
+
+ preg_match_all('"(((\S\S)-?(\S\S)?)(;q=([0-9.]+))?)\s*(,\s*|$)"',strtolower($httplang),$httplang);
+ for ($i = 0; $i < count($httplang); $i++) {
+ if(!empty($httplang[2][$i])) {
+ #if no q default to 1.0
+ $client_langs[$httplang[2][$i]] = ($httplang[6][$i]? (float) $httplang[6][$i] : 1.0);
+ }
+ if(!empty($httplang[3][$i]) && empty($client_langs[$httplang[3][$i]])) {
+ #if a catchall default 0.01 lower
+ $client_langs[$httplang[3][$i]] = ($httplang[6][$i]? (float) $httplang[6][$i]-0.01 : 0.99);
+ }
+ }
+ #sort in decending q
+ arsort($client_langs);
+
+ foreach ($client_langs as $lang => $q) {
+ if (isset($all_languages[$lang])) {
+ return($all_languages[$lang]['lang']);
+ }
+ }
+ return FALSE;
+}
+
+function get_nice_language_list() {
+ $nice_lang = array();
+ $all_languages = get_all_languages();
+ foreach ($all_languages as $lang) {
+ $nice_lang = $nice_lang + array($lang['lang'] => $lang['name']);
+ }
+ return $nice_lang;
+}
+
+function get_all_languages() {
+ $all_languages = array('en-us' => array('q' => 1, 'lang' => 'en_US', 'name' => 'English (US)', 'direction' => 'ltr'),
+ 'en-nz' => array('q' => 1, 'lang' => 'en_NZ', 'name' => 'English (NZ)', 'direction' => 'ltr'),
+ 'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English', 'direction' => 'ltr'),
+ 'fr-fr' => array('q' => 1, 'lang' => 'fr_FR', 'name' => 'French', 'direction' => 'ltr'),
+ );
+ return $all_languages;
+}
diff --git a/lib/util.php b/lib/util.php
index 6d409f943..af31a9bd4 100644
--- a/lib/util.php
+++ b/lib/util.php
@@ -137,6 +137,10 @@ function common_show_header($pagetitle, $callable=NULL, $data=NULL, $headercall=
global $config, $xw;
$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ? $_SERVER['HTTP_ACCEPT'] : NULL;
+ $language = common_language();
+ setlocale(LC_ALL, $language);
+ bindtextdomain("laconica", $config['site']['locale_path']);
+ textdomain("laconica");
# XXX: allow content negotiation for RDF, RSS, or XRDS
@@ -157,8 +161,8 @@ function common_show_header($pagetitle, $callable=NULL, $data=NULL, $headercall=
# FIXME: correct language for interface
common_element_start('html', array('xmlns' => 'http://www.w3.org/1999/xhtml',
- 'xml:lang' => 'en',
- 'lang' => 'en'));
+ 'xml:lang' => $language,
+ 'lang' => $language));
common_element_start('head');
common_element('title', NULL,
@@ -363,6 +367,26 @@ function common_checkbox($id, $label, $checked=false, $instructions=NULL, $value
common_element_end('p');
}
+function common_dropdown($id, $label, $content, $instructions=NULL, $blank_select=FALSE, $selected=NULL) {
+ common_element_start('p');
+ common_element('label', array('for' => $id), $label);
+ common_element_start('select', array('id' => $id, 'name' => $id));
+ if ($blank_select) {
+ common_element('option', array('value' => $value));
+ }
+ foreach ($content as $value => $option) {
+ if ($value == $selected) {
+ common_element('option', array('value' => $value, 'selected' => $value), $option);
+ } else {
+ common_element('option', array('value' => $value), $option);
+ }
+ }
+ common_element_end('select');
+ if ($instructions) {
+ common_element('span', 'input_instructions', $instructions);
+ }
+ common_element_end('p');
+}
function common_hidden($id, $value) {
common_element('input', array('name' => $id,
'type' => 'hidden',
@@ -409,6 +433,27 @@ function common_textarea($id, $label, $content=NULL, $instructions=NULL) {
common_element_end('p');
}
+function common_language() {
+ $httplang = isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) ? $_SERVER['HTTP_ACCEPT_LANGUAGE'] : NULL;
+ $language = array();
+ $user_language = FALSE;
+
+ if (common_logged_in()) {
+ $user = common_current_user();
+ $user_language = $user->language;
+ }
+
+ if ($user_language) {
+ return $user_language;
+ } else if (!empty($httplang)) {
+ $language = client_prefered_language($httplang);
+ if ($language) {
+ return $language;
+ }
+ } else {
+ return $config['site']['language'];
+ }
+}
# salted, hashed passwords are stored in the DB
function common_munge_password($password, $id) {