3 Stimmen

Php mehrsprachiges Datum: howto?

Anmerkung: Dies ist kein Duplikat von PHP date() für eine mehrsprachige Website übersetzen . Ich habe es gelesen!

Es tut mir leid, ich muss erst einmal erklären, wie mein Rahmen funktioniert, damit Sie verstehen können, wo genau mein Problem liegt:

Hier ist, wie mein Php-Code funktioniert (grobe Grundsätze). Nehmen wir als Beispiel jemanden, der die URL sehen möchte http://myweb.com/valid.php :

  • in der Datei valid.php der Code enthält die richtige Klassendefinition, dann erstellen Sie ein Objekt und rufen die Funktion display() die die Seite anzeigt.
  • in der Datei valid.php Wenn das Objekt erstellt wird, analysiert es den Host, und im Host befindet sich die Sprache ( http://us.myweb.com/ , http://cn.myweb.com/ , http://fr.myweb.com/ ...) und die Standardsprache (falls keine gefunden wurde) ist Englisch
  • dann lade ich eine zwischengespeicherte Php-Datei, in der die Übersetzungen enthalten sind. Dies ist eine translation Objekt, das ich aufrufe $t kurzum
  • und von nun an, wann immer ich eine Übersetzung brauche, mache ich einfach Dinge wie $t->get('my_string') .

Nehmen wir ein Beispiel mit 2 Sprachdateien:

  • 2 Sprachdateien: cache.us.php y cache.fr.php
  • in cache.us.php haben Sie eine Zeile wie diese: $thanks_for_the_fish = "Thanks for the fish" .
  • in cache.fr.php haben Sie eine Zeile wie diese: $thanks_for_the_fish = "Merci pour le poisson" .
  • Ich baue meine Seite auf, füge die richtige Sprachdatei ein und rufe dann $t->get('thanks_for_the_fish') und es wird übersetzt.

Jetzt habe ich ein Problem mit der Datumsformatierung. Mit dem kurzen Datumsformat ist das kein Problem:

  • in cache.us.php : $short_date_format = "m/d/Y, H:i" .
  • in cache.fr.php : $short_date_format = "d/m/Y à H:i" .

Aber mit lang Datumsformat, ich arbeite gerade an der französischen Sprache und habe mit etwas wie:

  • in cache.fr.php : $long_date_format = "%s, %d %s %d" .
  • dann alle Tage: $sunday = "dimanche" , $monday = "lundi" und so weiter
  • dann in meinem Übersetzungscode:

Etwa so (lesen Sie aufmerksam den Kommentar im Code, meine Frage steht darin!)

static private $_TabStrDaysOfWeek = array(
    0 => 'sunday',
    1 => 'monday',
    ...,
    6 => 'saturday'
);
public function translateDate($date_time)
{
    $long_day = $this->tr->get(
        $this->_TabStrDaysOfWeek[ $date_time->format('w') ]
    );
    /*

    here's where I'm stuck:
    what could be the code to be able to display:
    - english:
      Monday, 1st September 2006
      Tuesday, 2nd September 2006
      Wednesday, 3rd September 2006
      Thursday, 4th September 2006

    - french:
      Lundi, 1 septembre 2006
      Mardi, 2 septembre 2006
      Mercredi, 3 septembre 2006
      Jeudi, 4 septembre 2006

    - arabian!!:
      1 - Don't know
      2 - Don't know
      3 - Don't know
      4 - Don't know
    */
}

... Und ich habe Arabisch gesagt, weil ich es früher oder später brauchen werde, dasselbe gilt für Mandarin-Chinesisch. Alle meine anderen Übersetzungsprobleme sind gelöst, nur dieses nicht!!

Irgendeine Idee?

4voto

Jakub Lédl Punkte 1805

Für Internationalisierungsaufgaben empfehle ich dringend die Verwendung des PHP intl Erweiterung. Sie enthält mehrere Klassen für allgemeine Internationalisierungsaufgaben wie Datums-/Zeitformatierung, Zahlenformatierung, String-Transliteration und mehr. Insbesondere die IntlDateFormatter Klasse ist in der Lage, eine Datetime für jedes verfügbare Gebietsschema zu formatieren (und zu analysieren).

0voto

Olivier Pons Punkte 14714

So habe ich es gemacht: Es scheint keine andere Möglichkeit zu geben, als einen Wechsel vorzunehmen und jede Sprache separat zu behandeln:


Das ist der Inhalt meines Caches:

$this->jour_dimanche = dimanche
$this->jour_lundi = lundi
$this->jour_mardi = mardi
$this->jour_mercredi = mercredi
$this->jour_jeudi = jeudi
$this->jour_vendredi = vendredi
$this->jour_samedi = samedi

$this->mois_janvier = janvier
$this->mois_fevrier = février
$this->mois_mars = mars
$this->mois_avril = avril
$this->mois_mai = mai
$this->mois_juin = juin
$this->mois_juillet = juillet
$this->mois_aout = août
$this->mois_septembre = septembre
$this->mois_octobre = octobre
$this->mois_novembre = novembre
$this->mois_decembre = décembre

// long date format = 'day, (month number) (month) (year)'
// '%s, %d %s %d' => 'Mardi, 2 juillet 2012'
$this->date_format_long = %\s, j %\s Y à H:i

...und mein Php-Code:

public function translateDate($date_time, $first_upcase=true)
{   
    switch ($this->_trad->getLang()) {
        /* TODO: all other languages */
        case 'us':
        case 'ar':
        case 'es':
        case 'cn':
            throw new Exception("not handled yet");
            break;

        default:
            /* default = french */
            $day = $this->_trad->get(
                self::$_TabStrDaysOfWeek[ $date_time->format('w') ]
            );  
            $month = $this->_trad->get(
                self::$_TabStrMonths[ $date_time->format('j') ]
            );  
            $ret = sprintf(
                $date_time->format(
                    $this->_trad->get('date_format_long')
                ),  
                $day,
                $month
            );  
            if ($first_upcase) {
                $ret = ucfirst($ret);
            }   
            break;
    }   
    return $ret;
}

0voto

Eine einfache Lösung für Sie, schauen Sie sich das an, vielleicht hilft es Ihnen https://github.com/LeonardoCaitano/MyDateTime

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X