Contenido Mehrsprachigkeit

Fragen zur Installation von CONTENIDO 4.9? Probleme bei der Konfiguration? Hinweise oder Fragen zur Entwicklung des Systemes oder zur Sicherheit?
Antworten
emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Contenido Mehrsprachigkeit

Beitrag von emergence » Sa 17. Jun 2006, 12:54

ich hab mich jetzt ein wenig mit thema beschäftigt und hab mir ein system ausgedacht, mit dem es möglich ist im backend sprachen ohne weitere änderungen am core hinzuzufügen...

das system ist relativ simple umsetzbar...

um in weiterer folge sprachen verfügbar zu machen reicht es im contenido/locale/ einen entsprechenden sprachordner anzulegen der die contenido.po und contenido.mo enthält
und im contenido/xml/
eine entsprechende xml datei hinterlegen...

der rest wird von contenido dann automatisch erledigt... (zumindestens hab ich das vor..)

zusätzlich hab ich ein kleines script geschrieben das in weiterer folge es wesentlich vereinfachen wird die contenido.po datei auf den aktuellsten stand zu halten (+ automatische entfernung der ganzen comments in dem file)
aufgrund des scripts wäre es möglich wenn sich zusätzliche übersetzer finden auf einen schlag französisch, italienisch anzubieten...
(ein paar sachen müssen halt nachübersetzt werden)
es existiert zwar auch ein niederländisches übersetzungsfile, aber da sind relativ viele sachen nachzuholen...

die änderungen werden in insgesamt 4 dateien vorgenommen

contenido/main.loginform.php (änderung der sprachanzeige)
contenido/includes/functions.i18n.php (änderung um alle encodings zur verfügung zu haben)
contenido/includes/config.misc.php, config.xml.php (entfernung der sprachabhängigen teile)
contenido/includes/startup.php (initialisierung der backendsprachen)

die einzelnen änderungen kommen nach und nach wenn ich halt zeit dazu finde...

falls jemand interesse daran hat mitzuhelfen und das ganze auch noch zu testen, wäre natürlich in weiter folge allen gedient...
Zuletzt geändert von emergence am Sa 17. Jun 2006, 13:37, insgesamt 3-mal geändert.
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 17. Jun 2006, 12:57

ich fang mal mit dem einfachsten änderungen an... (das ganze wird erst funktionieren wenn alle änderungen eingebaut wurden...)

functions.i18n.php

folgende funktion ersetzt die bestehende

Code: Alles auswählen

/**
 * i18nGetAvailableLanguages()
 *
 * Returns the available_languages array to prevent globals.
 *
 * @return array All available languages
 */
function i18nGetAvailableLanguages ()
{
	/* Array notes:
       First field: Language
	   Second field: Country
       Third field: ISO-Encoding
       Fourth field: Browser accept mapping
       Fifth field: SPAW language
    */
    $available_languages = array(
    	'ar_AA' => array('Arabic','Arabic Countries', 'ISO8859-6', 'ar','en'),
    	'be_BY' => array('Byelorussian', 'Belarus', 'ISO8859-5', 'be', 'en'),
    	'bg_BG' => array('Bulgarian','Bulgaria', 'ISO8859-5', 'bg', 'en'),
    	'cs_CZ' => array('Czech', 'Czech Republic', 'ISO8859-2', 'cs', 'cz'),
    	'da_DK' => array('Danish', 'Denmark', 'ISO8859-1', 'da', 'dk'),
    	'de_CH' => array('German', 'Switzerland', 'ISO8859-1', 'de-ch', 'de'),
    	'de_DE' => array('German', 'Germany', 'ISO8859-1', 'de', 'de'),
    	'el_GR' => array('Greek', 'Greece', 'ISO8859-7', 'el', 'en'),
    	'en_GB' => array('English', 'Great Britain', 'ISO8859-1', 'en-gb', 'en'),
    	'en_US' => array('English', 'United States', 'ISO8859-1', 'en', 'en'),
    	'es_ES' => array('Spanish', 'Spain', 'ISO8859-1', 'es', 'es'),
    	'fi_FI' => array('Finnish', 'Finland', 'ISO8859-1', 'fi', 'en'),
    	'fr_BE' => array('French', 'Belgium', 'ISO8859-1', 'fr-be', 'fr'),
    	'fr_CA' => array('French', 'Canada', 'ISO8859-1', 'fr-ca', 'fr'),
    	'fr_FR' => array('French', 'France', 'ISO8859-1', 'fr', 'fr'),
    	'fr_CH' => array('French', 'Switzerland', 'ISO8859-1', 'fr-ch', 'fr'),
    	'hr_HR' => array('Croatian', 'Croatia', 'ISO8859-2', 'hr', 'en'),
    	'hu_HU' => array('Hungarian', 'Hungary', 'ISO8859-2', 'hu', 'hu'),
    	'is_IS' => array('Icelandic', 'Iceland', 'ISO8859-1', 'is', 'en'),
    	'it_IT' => array('Italian', 'Italy', 'ISO8859-1', 'it', 'it'),
    	'iw_IL' => array('Hebrew', 'Israel', 'ISO8859-8', 'he', 'he'),
    	'nl_BE' => array('Dutch', 'Belgium', 'ISO8859-1', 'nl-be', 'nl'),
        'nl_NL' => array('Dutch', 'Netherlands', 'ISO8859-1', 'nl', 'nl'),
    	'no_NO' => array('Norwegian', 'Norway', 'ISO8859-1', 'no', 'en'),
    	'pl_PL' => array('Polish', 'Poland', 'ISO8859-2', 'pl', 'en'),
    	'pt_BR' => array('Brazillian', 'Brazil', 'ISO8859-1', 'pt-br', 'br'),
    	'pt_PT' => array('Portuguese', 'Portugal', 'ISO8859-1', 'pt', 'en'),
    	'ro_RO' => array('Romanian', 'Romania', 'ISO8859-2', 'ro', 'en'),
    	'ru_RU' => array('Russian', 'Russia', 'ISO8859-5', 'ru', 'ru'),
    	'sh_SP' => array('Serbian Latin', 'Yugoslavia', 'ISO8859-2', 'sr', 'en'),
    	'sl_SI' => array('Slovene', 'Slovenia', 'ISO8859-2', 'sl', 'en'),
    	'sk_SK' => array('Slovak', 'Slovakia', 'ISO8859-2', 'sk', 'en'),
    	'sq_AL' => array('Albanian', 'Albania', 'ISO8859-1', 'sq', 'en'),
    	'sr_SP' => array('Serbian Cyrillic', 'Yugoslavia', 'ISO8859-5', 'sr-cy', 'en'),
    	'sv_SE' => array('Swedish', 'Sweden', 'ISO8859-1', 'sv', 'se'),
    	'tr_TR' => array('Turkisch', 'Turkey', 'ISO8859-9', 'tr', 'tr')
    	);

	return ($available_languages);
}
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 17. Jun 2006, 13:01

contenido/main.loginform.php

Code: Alles auswählen

						<?php
						
						$langs = i18nStripAcceptLanguages($_SERVER['HTTP_ACCEPT_LANGUAGE']);
						
						foreach ($langs as $value)
						{
							$encoding = i18nMatchBrowserAccept($value);
							if ($encoding !== false)
							{
								break;
							}
						}
						
						$available_languages = i18nGetAvailableLanguages();
						
						
						foreach ($available_languages as $code => $entry)
						{
							if (in_array($code, $cfg["login_languages"]))
							{
    							list($language, $country, $codeset,$acceptTag) = $entry;
    							if ($code == $encoding)
    							{
    								$selected = 'SELECTED="SELECTED"';
    							} else {
    								$selected = '';
    							}
    							
    							echo '<option value="'.$code.'"'.$selected.'>'.$language.' ('.$country.')</option>';
							}
						}

						?>
wird ersetzt durch

Code: Alles auswählen

						<?php

						cInclude ("includes", 'functions.i18n.php');

						$langs = i18nStripAcceptLanguages($_SERVER['HTTP_ACCEPT_LANGUAGE']);

						foreach ($langs as $value)
						{
							$encoding = i18nMatchBrowserAccept($value);
							if ($encoding !== false)
							{
								break;
							}
						}

						$available_languages = i18nGetAvailableLanguages();

						foreach ($available_languages as $code => $entry)
						{

                            if (isset($cfg["login_languages"])) {
							   if (in_array($code, $cfg["login_languages"]))
							   {
									list($language, $country, $codeset,$acceptTag) = $entry;
									if ($code == $encoding)
									{
										$selected = ' selected="selected"';
									} else {
										$selected = '';
									}

									echo '<option value="'.$code.'"'.$selected.'>'.$language.' ('.$country.')</option>';
							   }

                            } else {

								list($language, $country, $codeset,$acceptTag) = $entry;
								if ($code == $encoding)
								{
									$selected = ' selected="selected"';
								} else {
									$selected = '';
								}

								echo '<option value="'.$code.'"'.$selected.'>'.$language.' ('.$country.')</option>';
							}
						}

						?>
*** make your own tools (wishlist :: thx)

mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf » Sa 17. Jun 2006, 13:04

hallo emergence

italienisch wurde ja schon mal angefangen aber leider bin ich nicht über einen ersten draft der po datei gekommen. das ganze war auf basis der 4.6.4 siehe auch hier

ich hatte auf anraten von herrB das ganze dann an timo gesendet, der rest findet sich im thread contenido parla l'Italiano.

nach wie vor bin ich gerne bereit zu helfen, auch wenn es ein italienisches/französiches/englisches board gäbe.
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 17. Jun 2006, 13:11

hmm...

config.xml.php wird in weiterer folge nicht mehr benötigt... das erledigt die startup.php dann mit...

config.misc.php

Code: Alles auswählen

/* Available login languages
 * ----------------------------------
 */
$cfg["login_languages"] = array("de_DE", "en_US", "nl_NL");
entfernen...

wird in die startup.php verlagert...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 17. Jun 2006, 13:14

damit man mit obrigen änderungen noch ein lauffähiges system hat
wird noch folgendes gemacht

contenido/includes/startup.php

Code: Alles auswählen

include_once( dirname(__FILE__) . "/config.xml.php");
wird ersetzt durch

Code: Alles auswählen

/* Generate arrays for available login languages
 * ---------------------------------------------
 * Author: Martin Horwath
 */

global $cfg;

$handle = opendir($cfg['path']['contenido'] . $cfg['path']['locale'] );

while ($locale = readdir($handle))
{
	if (is_dir($cfg['path']['contenido'] . $cfg['path']['locale'] . $locale ) && $locale != ".." && $locale != "." )
	{
		if (file_exists($cfg['path']['contenido'] . $cfg['path']['locale'] . $locale . DIRECTORY_SEPARATOR . "LC_MESSAGES" . DIRECTORY_SEPARATOR . "contenido.po") &&
			file_exists($cfg['path']['contenido'] . $cfg['path']['locale'] . $locale . DIRECTORY_SEPARATOR . "LC_MESSAGES" . DIRECTORY_SEPARATOR . "contenido.mo") &&
			file_exists($cfg['path']['contenido'] . $cfg['path']['xml'] . "lang_".$locale.".xml") ) {

			$cfg["login_languages"][] = $locale;
			$cfg["lang"][$locale] = "lang_".$locale.".xml";
		}

	}
}

fertig, das ist die ganze hexerei...
Zuletzt geändert von emergence am So 18. Jun 2006, 13:45, insgesamt 2-mal geändert.
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 17. Jun 2006, 13:34

dann bitte mal testen... die routine ist an sich sehr schnell geschrieben gewesen...
es ist somit durchaus möglich das nicht alles ordnungsgemäß berücksicht wurde...

momentan ist es so das eine sprache dann angezeigt wird wenn
folgendes gegeben ist:

contenido/locale/de_DE/LC_MESSAGES/contenido.po
contenido/locale/de_DE/LC_MESSAGES/contenido.mo
contenido/xml/lang_de_DE.xml

möglich backendsprachen sind in i18nGetAvailableLanguages definiert...
*** make your own tools (wishlist :: thx)

mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf » Sa 17. Jun 2006, 14:27

kk wenn ich dich recht verstehe, dann ...

4.6.8.5 von rezeptionist installieren
änderungen an den coredateien wie oben von dir ausgeführt vornehmen
für italienisch folgende dateien hinzufügen

contenido/locale/it_IT/LC_MESSAGES/contenido.po
contenido/locale/it_IT/LC_MESSAGES/contenido.mo
contenido/xml/lang_it_IT.xml

und dann schauen ob das backend läuft :?
korrekt?

könntest du die dateien in ein kleines zip packen und bereitstellen, a) sind diese ja bei dir local schon fertig, spart arbeit b) minimiert fehler auch wenn es nur copy paste ist ;)
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams

mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf » Sa 17. Jun 2006, 15:01

erster test:

http://condemo.funjumping.de/con_tut_2/contenido/

admin
italiano

funktioniert zunächst mit den po/mo/xml dateien aus meiner alten übersetzung.

wer des italienischen mächtig ist darf gerne fehler in der übersetzung melden, dann korrigiere ich diese und stelle die po mo und xml dateien gerne zur verfügung

hier der aktuelle italienische stand der momentan online ist und wie gesagt auf 4.6.4 basiert (die version online ist wie bereits erwähnt 4.6.8.5 ex rezeptionist)

po mo und xml dateien

emergence, was ist mit den message po/mo dateien?
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Sa 17. Jun 2006, 20:29

contenido/locale/it_IT/LC_MESSAGES/contenido.po
contenido/locale/it_IT/LC_MESSAGES/contenido.mo
contenido/xml/lang_it_IT.xml

und dann schauen ob das backend läuft
korrekt?
ja korrekt...
könntest du die dateien in ein kleines zip packen und bereitstellen
also bevor es nicht getestet wurde, bringt das an sich wenig...
wenn es sich bewährt kann man das sowieso in einen offiziellen release mit aufnehmen...
... was ist mit den message po/mo dateien?
ähm wie ? worauf zielt diese frage genau ab ? ich weiss jetzt nicht was du meinst...
*** make your own tools (wishlist :: thx)

mvf
Beiträge: 1758
Registriert: Mo 1. Aug 2005, 00:35
Wohnort: in der schönen Hallertau, mitten im Hopfen
Kontaktdaten:

Beitrag von mvf » Sa 17. Jun 2006, 21:51

emergence hat geschrieben:also bevor es nicht getestet wurde, bringt das an sich wenig...
wenn es sich bewährt kann man das sowieso in einen offiziellen release mit aufnehmen...
;) war auch mehr aus faulheit, siehst ja habs es schnell eingesetzt undläuft zunächst mal ohne probleme :D
emergence hat geschrieben:
... was ist mit den message po/mo dateien?
ähm wie ? worauf zielt diese frage genau ab ? ich weiss jetzt nicht was du meinst...
fürher (4.6.2) gab es noch eine message.po und.mo datei :?

sehe grade in der offiziellen 4.6.8 gibt es überall contenido.mo und po dateien nur im it_IT folder liegen message dateien ??? nameing error?
Grüsse, Guido

"A common mistake that people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools."
Mostly Harmless - Douglas Adams

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » So 18. Jun 2006, 09:10

mvf hat geschrieben:sehe grade in der offiziellen 4.6.8 gibt es überall contenido.mo und po dateien nur im it_IT folder liegen message dateien ??? nameing error?
also wären sie wichtig, hätte ich sie berücksichtigt...
*** make your own tools (wishlist :: thx)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » So 18. Jun 2006, 14:21

so hier ein script zum abgleichen der po dateien...
beschreibung ist an sich im file enthalten (fehlende strings werden rot markiert)
gibt man bei target den selben namen ein werden alle kommentare aus dem po file eliminiert...

eine .mo datei kann man ganz einfach erzeugen in dem man sich poedit hier runterläd... -> http://www.poedit.org/
die .po die auf dem bildschirm ausgegeben wird, als datei speichern
mit poedit öffnet nochmals speichert -> fertig...
eine .mo datei müsste dann automatisch erzeugt werden...

für die menüführung als grundlage einfach die xml/lang_en_US.xml
verwenden...

happy translating...

Code: Alles auswählen

<?php
// update po files for contenido
// author: martin horwath * dayside.net

// creates a new po file which highlights missing strings...
// also shows which strings do not exist any more...
// output on screen

// requires:
// php >= 4.3.0
//

//
// create a folder with this file
// copy orginal contenido.po file in this folder
// copy translation file to same folder
// correct filenames below
//


// configuration

$orginal = "contenido.po"; // should be taken from locale/de_DE/LC_MESSAGES/contenido.po
$target = "italian.po"; // base file if available * otherwise use false

// action starts here
echo "<pre>";

$po_edit = file_get_contents($orginal); // take base origin strings from this file

preg_match_all('/msgid "(.*)"\s*msgstr "(.*)"\s?/i', $po_edit, $po_array);

$Oneeded_strings = $po_array[1];
$Otrans_strings = $po_array[2];

$header = "";

//print_r($needed_strings);

if ($target) {

   $po_edit = file_get_contents($target); // take base translation strings from this file

   $po_edit = preg_replace('/msgid ""\s*msgstr ""\s/i', '', $po_edit); // remove complete empty elements
   $po_edit = preg_replace('/^#.+/m', '', $po_edit); // remove comments empty elements

   $header = trim(substr( $po_edit, 0, strpos($po_edit, "msgid") ) )."\n\n";

   preg_match_all('/msgid "(.*)"\s*msgstr "(.*)"\s?/i', $po_edit, $po_array);

   $Tneeded_strings = $po_array[1];
   $Ttrans_strings = $po_array[2];

} else {
   $Tneeded_strings = Array();
   $Ttrans_strings = Array();
}

//print_r($Ttrans_strings);

echo $header;

$missing = 0;
foreach ($Oneeded_strings as $key => $value) {

   $result = "";

   if (is_numeric($akey = array_search($value, $Tneeded_strings))) {
       $result = $Ttrans_strings[$akey];
       unset($Tneeded_strings[$akey],$Ttrans_strings[$akey]);
   } else {
       //echo "'".$value."'<br>";
       $missing++;
   }

   $string = 'msgid "'.$value.'"'."\n".'msgstr "'.$result.'"'."\n\n";

   if ($result == "") {
      echo "<div style='color:red'>";
      echo htmlspecialchars($string);
      echo "</div>";
   } else {
      echo htmlspecialchars($string);
   }
}


// show missing strings

echo "\n\n************* CUT HERE ***************\n\n";

echo "Missing:".$missing."<br>";

if (count($Ttrans_strings) > 0) {

   echo "Available but not used:".count($Ttrans_strings)."<br>";

   $po_array = Array();
   $po_array[1] = $Tneeded_strings;
   $po_array[2] = $Ttrans_strings;

   echo "Available in $target but not used (might be useful)<br>";
   print_r($po_array);

}

// end of file

?>
*** make your own tools (wishlist :: thx)

MichFress
Beiträge: 750
Registriert: Mo 5. Jan 2004, 22:32
Wohnort: Bochum
Kontaktdaten:

Beitrag von MichFress » Mo 19. Jun 2006, 16:36

juhu - funktioniert bei mir fast fehlerfrei..

und zwar hakt es bei der Kodierung der .xml-Datei bei mir:
Die Sonderzeichen werden nicht richtig angezeigt, egal, ob als "ś" oder als "&#347;".
Die Sonderzeichen in der Form von "&#347;" sind in den po-Dateien wiederum kein Problem...
"Es wird keine Handlung geben, keine Geschichte mit ihrer Versprechung auf einen Anfang und ihrer Hoffnung auf ein Ende." (Andrzej Stasiuk)

emergence
Beiträge: 10645
Registriert: Mo 28. Jul 2003, 12:49
Wohnort: Austria
Kontaktdaten:

Beitrag von emergence » Mo 19. Jun 2006, 19:38

@MichFress
könnte ja ein bug sein bei der xml interpretation...
stell doch bitte die po, mo und xml dateien zur verfügung, damit man das verifizieren kann...
und ein kleines beispiel wo es exakt zu problemen kommt...
eingesetzte contenido version usw...
*** make your own tools (wishlist :: thx)

Antworten