3

注:これは、多言語サイトのPHP date()の翻訳と重複していません。読んだよ!

申し訳ありませんが、最初にフレームワークがどのように機能するかを説明する必要があるため、問題がどこにあるかを正確に理解できます。

これが私のPhpコードの仕組みです(大まかな原則)。URLを見たい人の例を使ってみましょうhttp://myweb.com/valid.php

  • ファイル内のコードには適切なクラス定義が含まれており、1つのオブジェクトを作成して、ページを表示するvalid.php関数を呼び出します。display()
  • ファイルvalid.phpには、オブジェクトが作成されるときにホストが分析され、ホストには言語(、、 ...)があり、デフォルトの言語(見つからない場合)は英語です。http://us.myweb.com/http://cn.myweb.com/http://fr.myweb.com/
  • 次に、キャッシュされたPhpファイルをロードします。ここに翻訳があります。これはtranslation私が$t略して呼んでいるオブジェクトです
  • そしてこれからは、翻訳が必要なときはいつでも、のようなことをし$t->get('my_string')ます。

2つの言語ファイルの例を見てみましょう。

  • 2言語ファイル:cache.us.phpおよびcache.fr.php
  • あなたにはcache.us.php次のような行があります:$thanks_for_the_fish = "Thanks for the fish"
  • あなたにはcache.fr.php次のような行があります:$thanks_for_the_fish = "Merci pour le poisson"
  • 私は自分のページを作成し、適切な言語ファイルを含めてから呼び出し$t->get('thanks_for_the_fish')、それを翻訳します。

今、私の問題は日付のフォーマットにあります。短い日付形式では、問題はありません。

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

しかし、長い日付形式では、私はフランス語に取り組んでおり、次のようなものから始めました。

  • cache.fr.php$long_date_format = "%s, %d %s %d"
  • その後、すべての日:$sunday = "dimanche"$monday = "lundi"など
  • それから私の翻訳コードで:

このようなもの(コード内のコメントを注意深く読んでください、私の質問はそれにあります!):

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
    */
}

...北京語でも同じように、遅かれ早かれ必要になるので、アラビア語と言いました。私の他のすべての翻訳の問題は解決されましたが、これは!!

何か案が?

4

3 に答える 3

4

国際化タスクについては、PHP intl拡張機能を使用することを強くお勧めします。日付/時刻の書式設定、数値の書式設定、文字列の音訳など、一般的な国際化タスク用のクラスがいくつか含まれています。具体的には、IntlDateFormatterクラスは、使用可能な任意のロケールの日時をフォーマット (および解析) できます。

于 2012-07-04T18:12:33.483 に答える
0

これが私がそれをした方法です:切り替えをして各言語を別々に処理する以外に可能性はないようです:


これが私のキャッシュにあるものです:

$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

...そして私のPHPコード:

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;
}
于 2012-07-02T09:41:23.480 に答える
0

あなたのための簡単な解決策、それをチェックして ください

于 2013-09-08T19:07:11.993 に答える