Contenido Mehrsprachigkeit
Contenido Mehrsprachigkeit
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...
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)
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
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)
contenido/main.loginform.php
wird ersetzt durch
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>';
}
}
?>
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)
-
- Beiträge: 1758
- Registriert: Mo 1. Aug 2005, 00:35
- Wohnort: in der schönen Hallertau, mitten im Hopfen
- Kontaktdaten:
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.
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
"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
hmm...
config.xml.php wird in weiterer folge nicht mehr benötigt... das erledigt die startup.php dann mit...
config.misc.php
entfernen...
wird in die startup.php verlagert...
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");
wird in die startup.php verlagert...
*** make your own tools (wishlist :: thx)
damit man mit obrigen änderungen noch ein lauffähiges system hat
wird noch folgendes gemacht
contenido/includes/startup.php
wird ersetzt durch
fertig, das ist die ganze hexerei...
wird noch folgendes gemacht
contenido/includes/startup.php
Code: Alles auswählen
include_once( dirname(__FILE__) . "/config.xml.php");
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";
}
}
}
Zuletzt geändert von emergence am So 18. Jun 2006, 13:45, insgesamt 2-mal geändert.
*** make your own tools (wishlist :: thx)
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...
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)
-
- Beiträge: 1758
- Registriert: Mo 1. Aug 2005, 00:35
- Wohnort: in der schönen Hallertau, mitten im Hopfen
- Kontaktdaten:
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
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
"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
-
- Beiträge: 1758
- Registriert: Mo 1. Aug 2005, 00:35
- Wohnort: in der schönen Hallertau, mitten im Hopfen
- Kontaktdaten:
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?
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
"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
ja korrekt...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?
also bevor es nicht getestet wurde, bringt das an sich wenig...könntest du die dateien in ein kleines zip packen und bereitstellen
wenn es sich bewährt kann man das sowieso in einen offiziellen release mit aufnehmen...
ähm wie ? worauf zielt diese frage genau ab ? ich weiss jetzt nicht was du meinst...... was ist mit den message po/mo dateien?
*** make your own tools (wishlist :: thx)
-
- Beiträge: 1758
- Registriert: Mo 1. Aug 2005, 00:35
- Wohnort: in der schönen Hallertau, mitten im Hopfen
- Kontaktdaten:
war auch mehr aus faulheit, siehst ja habs es schnell eingesetzt undläuft zunächst mal ohne problemeemergence 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...
fürher (4.6.2) gab es noch eine message.po und.mo dateiemergence hat geschrieben:ähm wie ? worauf zielt diese frage genau ab ? ich weiss jetzt nicht was du meinst...... was ist mit den message po/mo dateien?
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
"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
also wären sie wichtig, hätte ich sie berücksichtigt...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?
*** make your own tools (wishlist :: thx)
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...
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)
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 "ś".
Die Sonderzeichen in der Form von "ś" sind in den po-Dateien wiederum kein Problem...
und zwar hakt es bei der Kodierung der .xml-Datei bei mir:
Die Sonderzeichen werden nicht richtig angezeigt, egal, ob als "ś" oder als "ś".
Die Sonderzeichen in der Form von "ś" 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)
@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...
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)