Implemented auto-language selection (feature #1107) based on HTTP_ACCEPT_LANGUAGE headers.

This commit is contained in:
Patrick Brueckner
2012-07-03 15:24:17 +01:00
committed by madmuffin
parent a2c49c3071
commit bb315b783f
3 changed files with 106 additions and 22 deletions

View File

@@ -797,9 +797,10 @@ CREATE TABLE `panel_diskspace_admins` (
DROP TABLE IF EXISTS `panel_languages`;
CREATE TABLE `panel_languages` (
`id` int(11) unsigned NOT NULL auto_increment,
`language` varchar(30) NOT NULL default '',
`file` varchar(255) NOT NULL default '',
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`language` varchar(30) NOT NULL DEFAULT '',
`iso` char(3) NOT NULL DEFAULT 'foo',
`file` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM ;
@@ -807,23 +808,24 @@ CREATE TABLE `panel_languages` (
# Dumping data for table `panel_languages`
#
INSERT INTO `panel_languages` VALUES (1, 'Deutsch', 'lng/german.lng.php');
INSERT INTO `panel_languages` VALUES (2, 'English', 'lng/english.lng.php');
INSERT INTO `panel_languages` VALUES (3, 'Français', 'lng/french.lng.php');
INSERT INTO `panel_languages` VALUES (4, 'Chinese', 'lng/zh-cn.lng.php');
INSERT INTO `panel_languages` VALUES (5, 'Catalan', 'lng/catalan.lng.php');
INSERT INTO `panel_languages` VALUES (6, 'Español', 'lng/spanish.lng.php');
INSERT INTO `panel_languages` VALUES (7, 'Português', 'lng/portugues.lng.php');
INSERT INTO `panel_languages` VALUES (8, 'Russian', 'lng/russian.lng.php');
INSERT INTO `panel_languages` VALUES (9, 'Danish', 'lng/danish.lng.php');
INSERT INTO `panel_languages` VALUES (10, 'Italian', 'lng/italian.lng.php');
INSERT INTO `panel_languages` VALUES (11, 'Bulgarian', 'lng/bulgarian.lng.php');
INSERT INTO `panel_languages` VALUES (12, 'Slovak', 'lng/slovak.lng.php');
INSERT INTO `panel_languages` VALUES (13, 'Dutch', 'lng/dutch.lng.php');
INSERT INTO `panel_languages` VALUES (14, 'Hungarian', 'lng/hungarian.lng.php');
INSERT INTO `panel_languages` VALUES (15, 'Swedish', 'lng/swedish.lng.php');
INSERT INTO `panel_languages` VALUES (16, 'Czech', 'lng/czech.lng.php');
INSERT INTO `panel_languages` VALUES (17, 'Polski', 'lng/polish.lng.php');
INSERT INTO `panel_languages` (`id`, `language`, `iso`, `file`) VALUES
(1, 'Deutsch', 'de', 'lng/german.lng.php'),
(2, 'English', 'en', 'lng/english.lng.php'),
(3, 'Français', 'fr', 'lng/french.lng.php'),
(4, 'Chinese', 'zh', 'lng/zh-cn.lng.php'),
(5, 'Catalan', 'ca', 'lng/catalan.lng.php'),
(6, 'Español', 'es', 'lng/spanish.lng.php'),
(7, 'Português', 'pt', 'lng/portugues.lng.php'),
(8, 'Russian', 'ru', 'lng/russian.lng.php'),
(9, 'Danish', 'da', 'lng/danish.lng.php'),
(10, 'Italian', 'it', 'lng/italian.lng.php'),
(11, 'Bulgarian', 'bg', 'lng/bulgarian.lng.php'),
(12, 'Slovak', 'sk', 'lng/slovak.lng.php'),
(13, 'Dutch', 'nl', 'lng/dutch.lng.php'),
(14, 'Hungarian', 'hu', 'lng/hungarian.lng.php'),
(15, 'Swedish', 'sv', 'lng/swedish.lng.php'),
(16, 'Czech', 'cz', 'lng/czech.lng.php'),
(17, 'Polski', 'pl', 'lng/polish.lng.php');
# --------------------------------------------------------

View File

@@ -1832,6 +1832,70 @@ if(isFroxlorVersion('0.9.27')) {
if ($db->num_rows($handle) < 1) {
$db->query("INSERT INTO `panel_settings` (`settinggroup`, `varname`, `value`) VALUES ('phpfpm', 'aliasconfigdir', '/var/www/php-fpm/');");
}
// Insert ISO-Codes into database. Default value is foo, which is not a valid language code.
$db->query("ALTER TABLE `panel_languages` ADD `iso` CHAR( 3 ) NOT NULL DEFAULT 'foo' AFTER `language`");
$handle = $db->query("SELECT `language` FROM `panel_languages` WHERE `iso`='foo'");
$langauges = $db->fetch_array($handle);
foreach($languages as $language){
switch ($language) {
case "Deutsch":
$db->query("UPDATE `panel_languages` SET `iso`='de' WHERE `language` = 'Deutsch'");
break;
case "English":
$db->query("UPDATE `panel_languages` SET `iso`='en' WHERE `language` = 'English'");
break;
case "Fran&ccedil;ais":
$db->query("UPDATE `panel_languages` SET `iso`='fr' WHERE `language` = 'Fran&ccedil;ais'");
break;
case "Chinese":
$db->query("UPDATE `panel_languages` SET `iso`='zh' WHERE `language` = 'Chinese'");
break;
case "Catalan":
$db->query("UPDATE `panel_languages` SET `iso`='ca' WHERE `language` = 'Catalan'");
break;
case "Espa&ntilde;ol":
$db->query("UPDATE `panel_languages` SET `iso`='es' WHERE `language` = 'Espa&ntilde;ol'");
break;
case "Portugu&ecirc;s":
$db->query("UPDATE `panel_languages` SET `iso`='pt' WHERE `language` = 'Portugu&ecirc;s'");
break;
case "Danish":
$db->query("UPDATE `panel_languages` SET `iso`='da' WHERE `language` = 'Danish'");
break;
case "Italian":
$db->query("UPDATE `panel_languages` SET `iso`='it' WHERE `language` = 'Italian'");
break;
case "Bulgarian":
$db->query("UPDATE `panel_languages` SET `iso`='bg' WHERE `language` = 'Bulgarian'");
break;
case "Slovak":
$db->query("UPDATE `panel_languages` SET `iso`='sk' WHERE `language` = 'Slovak'");
break;
case "Dutch":
$db->query("UPDATE `panel_languages` SET `iso`='nl' WHERE `language` = 'Dutch'");
break;
case "Russian":
$db->query("UPDATE `panel_languages` SET `iso`='ru' WHERE `language` = 'Russian'");
break;
case "Hungarian":
$db->query("UPDATE `panel_languages` SET `iso`='hu' WHERE `language` = 'Hungarian'");
break;
case "Swedish":
$db->query("UPDATE `panel_languages` SET `iso`='sv' WHERE `language` = 'Swedish'");
break;
case "Czech":
$db->query("UPDATE `panel_languages` SET `iso`='cz' WHERE `language` = 'Czech'");
break;
case "Polski":
$db->query("UPDATE `panel_languages` SET `iso`='pl' WHERE `language` = 'Polski'");
break;
default:
showUpdateStep("Sorry, but I don't know the ISO-639 language code for ".$language.". Please update the entry in `panel_languages` manually.\n");
}
}
updateToVersion('0.9.28-svn1');
}

View File

@@ -266,6 +266,7 @@ else
$langs = array();
$languages = array();
$iso = array();
// query the whole table
$query = 'SELECT * FROM `' . TABLE_PANEL_LANGUAGE . '` ';
@@ -275,6 +276,7 @@ $result = $db->query($query);
while($row = $db->fetch_array($result))
{
$langs[$row['language']][] = $row;
$iso[$row['iso']] = $row['language'];
}
// buildup $languages for the login screen
@@ -291,7 +293,7 @@ if (isset($userinfo['language']) && isset($languages[$userinfo['language']]))
else
{
if(!isset($userinfo['def_language'])
|| !isset($languages[$userinfo['def_language']]))
|| !isset($languages[$userinfo['def_language']]))// this will always evaluat true, since it is the above statement inverted. @todo remove
{
if(isset($_GET['language'])
&& isset($languages[$_GET['language']]))
@@ -300,7 +302,22 @@ else
}
else
{
$language = $settings['panel']['standardlanguage'];
$accept_langs = explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);
for($i = 0; $i<count($accept_langs); $i++) {
# this only works for most common languages. some (uncommon) languages have a 3 letter iso-code.
# to be able to use these also, we would have to depend on the intl extension for php (using Locale::lookup or similar)
# as long as froxlor does not support any of these languages, we can leave it like that.
if(isset($iso[substr($accept_langs[$i],0,2)])) {
$language=$iso[substr($accept_langs[$i],0,2)];
break;
}
}
unset($iso);
// if HTTP_ACCEPT_LANGUAGES has no valid langs, use default (very unlikely)
if(!strlen($language)>0) {
$language = $settings['panel']['standardlanguage'];
}
}
}
else
@@ -309,6 +326,7 @@ else
}
}
// include every english language file we can get
foreach($langs['English'] as $key => $value)
{