[edit by Dimmy] Nieuwe get_language er in gehangen [maandag 11 mei] [/edit]
[edit by Dimmy] Code tags aangemaakt en fout er uit gehaald [/edit]
MODx Multilanguage (voor 1 op 1 vertalingen)
Ten eerste; mijn excuses voor de slechte nederlands, maar het is mijn eerste taal niet.
STAP 1. Maak de volgende snippets aan:
autoset_language
<?php
$language_to_set = $language_to_set ? $language_to_set : $modx->config['default_language'];
setcookie('language', $language_to_set, time()+360000, '/');
$referrer = str_replace('&', '&', $_SERVER["HTTP_REFERER"]);
header("Location: ". $referrer);
?>
get_language
<?php
$striptags = '0';
if(isset($_GET['lang'])){$current_language = $_GET['lang'];}
else{
$current_language = $_COOKIE['language'] ? $_COOKIE['language'] : $modx->config['default_language'];}
setlocale(LC_ALL, $current_language.'_'.strtoupper($current_language));
if (array_key_exists('force_language', $_REQUEST) && $_REQUEST['force_language'])
{
$current_language = $_REQUEST['force_language'];
}
$property = isset($property) ? $property : 'pagetitle';
if ($property == 'language_code')
{
echo $current_language;
}
else
{
$doc_id = isset($doc_id) ? $doc_id : $modx->documentIdentifier;
$document = $modx->getDocument($doc_id);
$vars = $modx->getTemplateVarOutput('*',$doc_id);
if(triptags !='0'){
$return = strip_tags($vars[$property.'0'.$current_language]);
}else{
$return = $vars[$property.'0'.$current_language];
}
if (!$return)
{
if (is_array($document) && array_key_exists($property, $document))
{
if(triptags !='0'){
$return = strip_tags($document[$property]);
}else{
$return = $document[$property];
}
}
}
if(isset($limit)){
$return = substr($return,0,$limit);
}
return $return;
}
?>
get_parent_language
<?php
$doc = $modx->getDocument($modx->documentIdentifier);
echo $modx->runSnippet('get_language', array('property' => 'longtitle', 'doc_id' => $doc['parent']));
?>
get_ultimate_parent_language
<?php
$doc_id = $modx->runSnippet('UltimateParent', array());
echo $modx->runSnippet('get_language', array('property' => 'longtitle', 'doc_id' => $doc_id));
?>
language_handler
<?php
$modx->runSnippet('autoset_language', array('language_to_set' => $_REQUEST['new_language']));
?>
language_selected
<?php
$current_language = $_COOKIE['language'] ? $_COOKIE['language'] : $modx->config['default_language'];
$language = $language ? $language : $modx->config['default_language'];
if($current_language == $language)
{
echo 'selected';
}
?>
set_language
<?php
$language_to_set = $_REQUEST['language_to_set'] ? $_REQUEST['language_to_set'] : '';
setlocale(LC_ALL, $current_language.'_'.strtoupper($current_language));
$current_language = $_COOKIE["language"] ? $_COOKIE["language"] : $modx->config['default_language'];
if (!$language_to_set)
{
$languages = '';
$res = $modx->db->query("SELECT * FROM modx_language WHERE active='yes' ORDER BY local_name ASC");
while ($row = $modx->db->getRow($res))
{
$row['checked'] = $row['code'] == $current_language ? 'checked' : '';
$languages .= $modx->parseChunk('language_row',$row);
}
echo $modx->parseChunk('language_form_'.$current_language, array('languages' => $languages, 'action' => $modx->makeURL($modx->documentIdentifier)));
}
else
{
setcookie('language', $language_to_set, time()+360000);
header("Location: ".$modx->makeURL($modx->documentIdentifier));
}
?>
translate
<?php
$phrase = $phrase ? $phrase : '';
if ($phrase)
{
include_once($modx->config['base_path']."assets/snippets/language/translations.php");
echo translate($phrase);
}
?>
De inhoud van
assets/snippets/language/translations.php is:
<?php
function translate($str_label, $force_language ='')
{
global $modx;
$str_return = '';
$current_language = $_COOKIE['language'] ? $_COOKIE['language'] : $modx->config['default_language'];
$current_language = $force_language ? $force_language : $current_language;
if (array_key_exists('force_language', $_REQUEST) && $_REQUEST['force_language'])
{
$current_language = $_REQUEST['force_language'];
}
$translations = array();
include($modx->config['base_path']."assets/snippets/language/translation_table_{$modx->config['default_language']}.php");
include($modx->config['base_path']."assets/snippets/language/translation_table_{$current_language}.php");
$str_return = array_key_exists($str_label,$translations) ? $translations[$str_label] : '';
return(trim($str_return));
}
?>
STAP 2: Taal wijzig pagina.
Maak een pagina aan met de alias ’languages’ en als content [[language_handler]]
Deze pagina zal de cookie schrijven voor de gekozen taal. Je mag de alias veranderen, maar in deze voorbeeld zal ik ’languages’ gebruiken.
Om de taal te veranderen moet je zo een link of twee (of meer) maken in je template:
<a href="languages.html?new_language=nl" class="[[language_selected? &language=`nl`]]">NL</a>
<a href="languages.html?new_language=en" class="[[language_selected? &language=`en`]]">EN</a>
(languages.html mag ook de ID zijn van je pagina waar je [[language_handler]] heb in gezet dus href="[~5~]?new_language=nl" waar 5 id van die pagina is in dit voorbeeld)
[opmerking van dim] Ik denk dat we hier beter een plugin voor kunnen gebruiken dat is beter voor Google, ik ga ff kijken hoe dat gaat. [/opmerking] (eerste poging voor deze plugin:
http://modxcms.com/forums/index.php/topic,34042.msg207028.html#msg207028)
STAP 3a: Language Tabel
CREATE TABLE IF NOT EXISTS `modx_language` (
`id` int(11) NOT NULL auto_increment,
`code` varchar(2) NOT NULL default '',
`name` varchar(50) NOT NULL default '',
`local_name` varchar(50) NOT NULL default '',
`active` enum('no','yes') NOT NULL default 'no',
PRIMARY KEY (`id`)
);
INSERT INTO `modx_language` (`id`, `code`, `name`, `local_name`, `active`) VALUES
(1, 'en', 'English', 'English', 'yes'),
(2, 'nl', 'Dutch', 'Nederlands', 'yes');
STAP 3b: Default taal config setting:
Voeg de volgende regels toe:
<tr>
<td nowrap class="warning"><?php echo $_lang["dl_title"]?></td>
<td>
<select name="default_language">
<?php
$query = "SELECT * FROM {$table_prefix}language WHERE active='yes' ORDER BY local_name ASC";
$res = $modx->db->query($query);
while ($row = $modx->db->getRow($res))
{
$selected = $row['code'] == $default_language ? 'selected' : '';
echo "<option value='{$row['code']}' {$selected}>{$row['local_name']}</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td colspan="2">
</td>
</tr>
in
/manager/actions/mutate_settings.dynamic.php voor de regel
<?php if(!isset($use_browser)) $use_browser=1; ?>
STAP 4:
Voeg de volgende regel toe:
$_lang['dl_title'] = "Default Language";
in de bestand
/manager/includes/lang/english.inc.php
(vergeet niet een vertaalde versie te maken voor de nl taal bestand).
(Met stap 3 en 4 heb je nu de mogelijkheid om de default taal te zetten in de manager > tools > configuration > Interface and Features)
STAP 5:
Maak template variables voor elke extra taal voor standard pagina properties (o.a. content pagetitle, longtitle, menutitle) met als suffix ’_nl’ voor nederlands, etc).
bijvoorbeeld
pagetitle_nl
longtitle_nl
menutitle_nl
content_nl
Verbind die TVs met alle veeltalig templates.
In de templates moet je een snippet roepen voor de taal specifiek properties:
[[get_language? &property=`pagetitle`]]
in plaats van:
[*pagetitle*]
STAP 6: De wayfinder
In
/assets/snippets/wayfinder/wayfinder.inc.php vervang de regels tussen
//Render the row output
en:
//Update counter for last check
met:
$docInfo['title'] = $modx->runSnippet("get_language", array('doc_id' => $docInfo['id'], 'property' => 'menutitle'));
if (!$docInfo['title'])
{
$docInfo['title'] = $modx->runSnippet("get_language", array('doc_id' => $docInfo['id']));
}
$docInfo['linktext'] = $docInfo['title'];
$subMenuOutput .= $this->renderRow($docInfo,$numChildren);
STAP 7: De cache
In de bestand
/manager/include/document.parser.class.inc.php moet de volgende gebeuren:
in function checkCache, is de eerste regel:
$cacheFile= "assets/cache/docid_" . $id . ".pageCache.php";
Dit moet vergangen worden met:
$current_language = $_COOKIE['language'] ? $_COOKIE['language'] : $this->config['default_language'];
$cacheFile= "assets/cache/docid_" . $id . ".".$current_language.".pageCache.php";
Dit maakt het checken van de cache veeltalig.
Dan, in function postProcess, moet de volgende lijn:
if ($fp= @ fopen($basepath . "/docid_" . $this->documentIdentifier . ".pageCache.php", "w")) {
vervangen worden met:
$current_language = $_COOKIE['language'] ? $_COOKIE['language'] : $this->config['default_language'];
if ($fp= @ fopen($basepath . "/docid_" . $this->documentIdentifier . ".".$current_language.".pageCache.php", "w")) {
En dan kan MODx veeltalig cache bestanden schrijven.
EXTRA Info:
In een template zijn er altijd statische stukken tekst. Deze tekstjes kunnen vervangen worden met de translate snippet.
Dus, in plaats van:
Forename
Schrijf je:
[[translate? &phrase=`forename`]]
Dan moet je in assets/snippets/language translation tables maken, bijvoorbeeld translation_table_en.php en translation_table_nl.php voor Engels en Nederlands.
De inhoud van die bestanden zou als volgt moeten worden:
<?php
$translations['forename'] = "Forename";
?>
waar the key van de array de phrase parameter van de snippet is, en de value de vertaling.
Dat was het, denk ik. Succes ermee, en als er nog wat is, dan hoor ik het graag.
Ditto oplossing (en andere snippets die id nodig hebben)
http://modxcms.com/forums/index.php/topic,34042.msg197737.html#msg197737