$conf['lang'] = 'en'; //your language
with
$conf['lang'] = 'en'; //your language
$conf['lang_default'] = 'pt'; // default language
$conf['lang_enabled'] = array('pt', 'es', 'de', 'en');
**Note**: sort the array %%$conf['lang_enabled']%% by first language to match first.
----
Edit **inc/common.php**, and add at the bottom, before the %%?>%%
// DWD Modify -> Add: Set Language from Browser Language Settings.
/*
#=============================================================================#
# Function: detect_browser_language() #
#-----------------------------------------------------------------------------#
# Purpose: This function detects the user browser language. #
# If no valid language is found then it returns the default content language#
# that is set on the configuration file #
# #
# Arguments: #
# Optionals: #
# Result: returns a string with the content language. #
# #
#=============================================================================#
*/
function detect_browser_language() {
global $conf;
$languages = preg_replace('/(;q=\d+.\d+)/i', '', getenv('HTTP_ACCEPT_LANGUAGE'));
$bol_language_detected = false;
// Check if browser language is compatible with pre-defined content languages.
foreach ($conf['lang_enabled'] as $tmp_arr_language) {
if (preg_match('/' . $tmp_arr_language . '/i', $languages)) {
$tmp_str_language_detected = $tmp_arr_language;
$bol_language_detected = true;
break;
}
} // ForEach pre-defined content language.
// If browser is set with compatible language return matching content path
// Else return default content language path.
if ($bol_language_detected) {
return $tmp_str_language_detected;
} else {
return $conf['lang_default'];
} // If browser set with compatible language.
} // detect_browser_language
// DWD Modify End.
----
Edit **inc/parser.php**, **doku.php** and **media.php** /this file is obsolete now/ in the same way, and replace
require_once("lang/en/lang.php");
require_once("lang/".$conf['lang']."/lang.php");
with
require_once("lang/en/lang.php");
// DWD Modify -> Add: Set Language from Browser Language Settings.
$conf['lang'] = detect_browser_language();
// DWD Modify End.
require_once("lang/".$conf['lang']."/lang.php");
----
Edit **conf/dokuwiki.php** again, and comment %%$conf['lang']%% line:
// $conf['lang'] = 'en'; //your language
==== Discussion ====
I prefer this new function rather than the old one because it is more precise in parsing the browser acceptable languages and because it either returns a language found by match or the default language. Although it seems the former code was also fixed to return the same results. It also doesn't convert the HTTP_ACCEPT_LANGUAGE to lowercase, which I didn't see as necessary. -- 2004.11.03.
:?: Has anyone been using this code, and if such with what results?
Some things to consider:
- All languages need to use the same language encoding or you will break things most certainly.
- The english language file should be included always before including any other language as this is the only file which is complete for sure
- store the selected language in the session perhaps ...
I'll think about to include this idea in DokuWiki. [[andi@splitbrain.org|Andi]]
If you add this in DokuWiki please make all UTF-8, that would save a lot of headache [[gullevek@gullevek.org|Clemens]]
It would be a wonderful idea! [[http://www.joho.se|Joaquim]]
>I think this way should be much better to choose language
>\\ fredrik
>$languages = split(',', preg_replace('/(;q=\d+.\d+)/i', '', getenv('HTTP_ACCEPT_LANGUAGE')));
$bol_language_detected = false;
// Check if browser language is compatible with pre-defined content languages.
foreach ($languages as $tmp_arr_language) {
if (in_array($tmp_arr_language, $conf['lang_enabled'])) {
$tmp_str_language_detected = $tmp_arr_language;
$bol_language_detected = true;
break;
}
} // ForEach pre-defined content language.
> Fredrik, why the 3 changes you suggest make the code better, can you please elaborate on it?
* using split with preg_replace instead of just preg_replace.
* loop for each $languages instead of $conf['lang_enabled'].
* check if in_array instead of preg_match.
--- //[[jose.monteiro@dowedo-it.com|José Carlos Monteiro]] 03.12.2004 00:29//
And what happens if the user has set 2 prefered languages for example us_uk and us with different weights, the first one being more preffered. We don't have translation for the first lang but have for the second. Will it stay on en or will pick the not so preffered translation?
--- [[vvitkov@gmail.com|Zeridon]] 28.06.2225
----
A quick hack (and a dirty one) for passing the language by URL to the session: In this way you can call eg http://localhost/dokuwiki/doku.php?plang=de
//common.php//
if (isset($_GET['plang'])){
$_SESSION['plang']=$_GET['plang'];
}
//init.php//
//comment the regular language setting
//require_once(DOKU_INC.'inc/lang/'.$conf['lang'].'/lang.php');
// and insert after the session_start line
require_once(DOKU_INC.'inc/lang/'.$_SESSION['plang'].'/lang.php');
----
**Another quick hack**
... extending the previous one:
In file ''inc/init.php'' after:
//load the language files
require_once(DOKU_INC.'inc/lang/en/lang.php');
/* you have to comment these...
if ( $conf['lang'] && $conf['lang'] != 'en' ) {
require_once(DOKU_INC.'inc/lang/'.$conf['lang'].'/lang.php');
}
*/
put this:
// HACK - Language Selection
if(isset($_GET['lng'])){
$_SESSION['lng']=$_GET['lng'];
}
if(isset($_SESSION['lng']) and file_exists(DOKU_INC.'inc/lang/'.$_SESSION['lng'].'/lang.php')){
require_once(DOKU_INC.'inc/lang/'.$_SESSION['lng'].'/lang.php');
$conf['lang']=$_SESSION['lng'];
} else {
require_once(DOKU_INC.'inc/lang/'.$conf['lang'].'/lang.php');
}
and move this block:
// make session rewrites XHTML compliant
@ini_set('arg_separator.output', '&');
// init session
session_name("DokuWiki");
if (!headers_sent()) session_start();
// kill magic quotes
if (get_magic_quotes_gpc()) {
if (!empty($_GET)) remove_magic_quotes($_GET);
if (!empty($_POST)) remove_magic_quotes($_POST);
if (!empty($_COOKIE)) remove_magic_quotes($_COOKIE);
if (!empty($_REQUEST)) remove_magic_quotes($_REQUEST);
if (!empty($_SESSION)) remove_magic_quotes($_SESSION);
@ini_set('magic_quotes_gpc', 0);
}
@set_magic_quotes_runtime(0);
@ini_set('magic_quotes_sybase',0);
...after this line:
@include_once(DOKU_INC.'conf/local.php');
Then, you should be able to set the language with ''lng'' variable (eg. [[http://localhost/dokuwiki/doku.php?lng=cs]]). It is stored in a session and overrides messages defined not only in ''lang.php'' file, but also in other files in the language directory.
-- [[http://zamecnik.org | Bohumir Zamecnik]] 2005-07-11
Thanks Bohumir!
----
**Here is another one:**
without storing language in a session, but rather in a cookie and having people choose their own language for the interface instead of having browser-detection or namespace fiddling (since in reality imho nobody has the time to completely "copy and translate all content"): (tested with version 2007-06-27)
//in /conf/local.conf.protected//
if (isset($_GET['plang'])){
$conf['lang']=$_GET['plang'];
setcookie("plang",$_GET['plang']);
$getrid="plang=".$_GET['plang']; //strip plang
$script = str_replace( $getrid, "",$_SERVER['REQUEST_URI']);
$loc="location:http://".getenv(HTTP_HOST).$script;
header( $loc);
}
if (isset($_COOKIE["plang"])){
$conf['lang']=$_COOKIE["plang"];
}
As far as I know the configuration manager overwrites all changes to **local.conf**, thats why you will have to put it in **local.conf.protected**.
Then create some language links somewhere in your template (/lib/tpl/../main.php), for example below your logo-div:
0){
$lref="English | \n";
echo $lref."fr'>Francais | \n";
echo $lref."pt'>Portugues | \n";
echo $lref."es'>Espanol | \n";
?>
and some displaying stuff in your css
div.dokuwiki .langselect {
font-size: 90%;
text-align:right;
margin-top:3em;
}
div.dokuwiki .langselect a {
color:yellow !important;
}
----
\\
**Will any of these approaches work on the latest version of Dokuwiki? :**
Many files are not in the same place and look very different. Is there a plugin to allow this or is this feature now built into Dokuwiki?
Any replies or links to recent updates would be most welcomed.
Thanks.
Posted : 2009/MAY/3
\\
----
The **Here is another one** approach worked for me. Filenames have changed and you have to edit them this way:
* instead of //in /conf/local.conf.protected// put the code in // /conf/local.protected.php //, this will prevent modifications by the configuration manager. Create the file if it doesn't exist.
* :!: **problem 1 [solved]** :!: the default language option is removed from the local.php after saving configuration. \\my workaround was to put the default language in the **lang.protected.php** file. Here's my /conf/local.protected.php:
#RewriteRule ^$ doku.php [L]
#RewriteRule ^index.php$ doku.php
I only edit one file "index.php" to redirect to the related home page. The entire "index.php" as below, welcome comment it:
*/
$conf['lang_default'] = 'en'; // default language
$conf['lang_enabled'] = array('zh', 'zh-tw', 'en');
// DWD Modify -> Add: Set Language from Browser Language Settings.
/*
#=============================================================================#
# Function: detect_browser_language() #
#-----------------------------------------------------------------------------#
# Purpose: This function detects the user browser language. #
# If no valid language is found then it returns the default content language#
# that is set on the configuration file #
# #
# Arguments: #
# Optionals: #
# Result: returns a string with the content language. #
# #
#=============================================================================#
*/
function detect_browser_language() {
global $conf;
$languages = preg_replace('/(;q=\d+.\d+)/i', '', getenv('HTTP_ACCEPT_LANGUAGE'));
$languages = strtolower($languages);
// print($languages.'
');
$bol_language_detected = false;
$browser_langsarray = preg_split("/[^\-a-z]/", $languages);
// print_r($browser_langsarray);
// print('
');
foreach ($browser_langsarray as $tmp_browser_lang) {
if ($tmp_browser_lang == 'zh-cn' || $tmp_browser_lang == 'zh-sg') {
$tmp_browser_lang = 'zh';
}
if ($tmp_browser_lang == 'zh-hk') {
$tmp_browser_lang = 'zh-tw';
}
if (substr($tmp_browser_lang,0,3) == 'en-') {
$tmp_browser_lang = 'en';
}
// print('tmp_browser:'.$tmp_browser_lang.'
');
foreach ($conf['lang_enabled'] as $tmp_arr_language) {
// print('tmp_enabled:'.$tmp_arr_language.'
');
if ($tmp_browser_lang == $tmp_arr_language) {
$tmp_str_language_detected = $tmp_browser_lang;
$bol_language_detected = true;
break 2;
}
} // ForEach pre-defined content language.
}// ForEach browser accept language.
// If browser is set with compatible language return matching content path
// Else return default content language path.
if ($bol_language_detected) {
return $tmp_str_language_detected;
} else {
return $conf['lang_default'];
} // If browser set with compatible language.
} // detect_browser_language
// DWD Modify End.
$browser_lang = detect_browser_language();
//print($browser_lang.'
');
if ($browser_lang == 'zh') {
header("Location: /mobilemate/zh/");
}
if ($browser_lang == 'zh-tw') {
header("Location: /mobilemate/zh-tw/");
}
if ($browser_lang == 'en') {
header("Location: /mobilemate/about");
}
-- posted 2013-09-25 [[http://www.learndiary.com/mobilemate/|MobileMate created by littlebat]]
==== Discussion ====
Please post your comment about "A Improved Using of the top Tip" below.
I think there are two goals with the above - one appears to be allow for translation and the other is simply to provide a per-user localised interface for the users of dokuwiki.
I want the latter function and I achieved it by using the detect_browser_language() function above. I placed it in inc/init.php
I then hacked init_lang (in init.php). I haven't really used dokuwiki before so please can someone let me know a better place to "hack" this browser language override.
function init_lang($langCode) {
//prepare language array
global $lang, $config_cascade;
$lang = array();
$langCode = detect_browser_language(); // HACK this line in to override language setting with browser language
//load the language files
require(DOKU_INC.'inc/lang/en/lang.php');
foreach ($config_cascade['lang']['core'] as $config_file) {
if (@file_exists($config_file . 'en/lang.php')) {
include($config_file . 'en/lang.php');
}
}
if ($langCode && $langCode != 'en') {
if (file_exists(DOKU_INC."inc/lang/$langCode/lang.php")) {
require(DOKU_INC."inc/lang/$langCode/lang.php");
}
foreach ($config_cascade['lang']['core'] as $config_file) {
if (@file_exists($config_file . "$langCode/lang.php")) {
include($config_file . "$langCode/lang.php");
}
}
}
}
(dylan 2016/05/19)