We launched new forums in March 2019—join us there. In a hurry for help with your website? Get Help Now!
    • 10473
    • 44 Posts
    [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

      • 25586
      • 105 Posts
      Mooi mooi, ziet er goed uit.

      Moet zo naar school dus dan heb ik mooi de tijd om het te proberen.

      Bedankt voor het vele werk!
        • 25586
        • 105 Posts
        Hoe zorg ik er dat er een taal opgeroept wordt? Dat is het enige wat ontbreekt wink
          • 10473
          • 44 Posts
          Oeps sorry. Ik mis altijd iets wink

          Je had een pagina gemaakt in Stap 2 met de alias languages. Om de taal te veranderen moet je zo een link of twee (of meer) maken:

          <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>

          De languages.html pagina schrijft een cookie met de nieuw taal, en stuurt je meteen terug naar de referer.

          De snippet ’language_selected’ echoes ’selected’ als de huidige taal het zelfde is als de language parameter.


            • 25586
            • 105 Posts
            Ahh, mooi.. Het werkt perfect volgens mij smiley Nog 1 punt.

                 <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>


            Zodra ik dit implementeer in de code van de manager (stap 3) dan laad de pagina niet meer. Opzich geen probleem want ik kan de taal nog instellen in de snippet zelf. Maar het zou toch handig zijn voor de gebruiker zelf smiley

            Mooi script, werkt perfect! Er komt nog 1 vraagje in me op. Als de pagina geindexeerd wordt in google, dan wordt dat zeker alleen in de standaard taal gelezen? Klopt dit?

            Bedankt voor dit simpele script smiley
              • 10473
              • 44 Posts
              Domme fout van mij. De regel:

              $selected = $row[’code’] == $default_language ? ’selected’ : ;

              moet

              $selected = $row[’code’] == $default_language ? ’selected’ : ’’;

              worden. Ik was de laatste ’’ vergeten voor de ;

              Sorry.
                • 25483
                • 741 Posts
                Is het niet makkelijker om alle snippets zoveel mogelijk in 1 snippet te verwerken? En dat je dan via de snippet aanroep aangeeft welk gedeelte uitgevoerd moet worden? Nu moet er nogal veel aangemaakt worden in modx wat natuurlijk meer tijd kost dan 1 snippet erin zetten. En zoals we allemaal weten, tijd = geld smiley

                Verder ziet het er goed uit, ik heb het net ingebouwd en het ziet er goed uit. Dalijk even ManagerManager inbouwen zodat ik de specifieke talen in een aparte tab kan zetten.
                  with regards,

                  Ronald Lokers
                  'Front-end developer' @ h2o Media

                  • 10473
                  • 44 Posts
                  Dat had gekund, maar deze oplossing is langzaam geëvolueerd, en dus niet optimaal in zijn schoonheid.
                    • 25483
                    • 741 Posts
                    garethwi, de code werkt perfect, alleen heb ik een probleem om het werkend te krijgen met Ditto. Weet jij hoe ik het werkend kan krijgen met Ditto?

                    //edit
                    Even verder gekeken en ik zie dat je het id mee kan geven, dus op deze manier kan je het in Ditto zetten:
                    [[get_language? &property=`content` &doc_id=`[+id+]`]]
                      with regards,

                      Ronald Lokers
                      'Front-end developer' @ h2o Media

                      • 25586
                      • 105 Posts
                      Quote from: MediaGuy at Jan 28, 2009, 09:25 AM

                      garethwi, de code werkt perfect, alleen heb ik een probleem om het werkend te krijgen met Ditto. Weet jij hoe ik het werkend kan krijgen met Ditto?

                      Hmmm.. Ik heb geen last met ditto, alles werkte gelijk. Heb je de tv’s aangemaakt en toegewezen aan de templates? Bij mij werkte het gewoon op die manier. Dan moet je de tekst invullen voor andere talen. En met ManagerManager heb ik 2 tabs aangemaakt, eng en nl. Werkt als een trein smiley