【问题标题】:Translating PHP date() for Multilingual Site为多语言网站翻译 PHP date()
【发布时间】:2011-02-12 02:05:04
【问题描述】:

我正在尝试创建 PHP 内部 date() 函数的条件转换。是否有可能以某种方式重新定义内部变量 - 例如- date('M')、date('y') 等,以便在此测试的基础上将不同的字符串输入 PHP 函数的其余部分:

if (ICL_LANGUAGE_CODE == 'fr') { }

以下是我用于日期模块的代码的工作示例。由于$date 定义了包含在此定义中的许多变量,因此重要的是首先有条件地重新定义PHP 的date() 中的变量,以避免必须在每个键中重新定义变量100 次或更多次。

if($start <= $end):
    if($start == $end):
        //Month Day, Year
        $date =  date('F', $start).' '.date('j',$start).', '.date('Y', $start);
    else:
        if($start_year == $end_year):
            if($start_month == $end_month):

                //Month Day - Day, Year
                $date = date('F', $start).' '.date('j',$start).' - '.date('j', $end).', '.date('Y', $start);
            else:
                //Month Day - Month Day, Year
                $date =  date('F', $start).' '.date('j',$start).' - '.date('F', $end).' '.date('j', $end).', '.date('Y', $start);
            endif;
        else:
            //Month Day, Year - Month Day, Year
            $date =  date('F', $start).' '.date('j',$start).', '.date('Y', $start).' - '.date('F', $end).' '.date('j', $end).', '.date('Y', $end);
        endif;
    endif;
endif;

【问题讨论】:

    标签: php date datetime


    【解决方案1】:

    当您需要根据区域设置操作日期/时间戳时,您应该使用strftime

    switch ($lang) {
        case 'en':
            setlocale(LC_TIME, 'en_CA.UTF-8');
            echo strftime("%B %e, %G");
            break;
        case 'fr':
            setlocale(LC_TIME, 'fr_CA.UTF-8');
            echo strftime("%e %B %G");
            break;
    }
    

    结果:

    February 11, 2011  // en
    11 février 2011    // fr
    

    当然,您需要在系统上安装语言环境。每个例子在 Ubuntu 中:

    bash-4.1$ sudo locale-gen fr_CA.UTF-8
    

    【讨论】:

    • 这是 IMO 的最佳答案。当您尝试将 date() 用于除数值以外的任何内容时,使用它就会失败。
    • 太棒了...谢谢。用于回答问题和有关如何安装新语言环境的详细信息
    • 根据语言环境,你怎么知道 %e %B %G 的顺序
    【解决方案2】:
        $date =  date('F', $start).' '.date('j',$start).', '.date('Y', $start);
    

    这是一种相当痛苦的方式。 date() 中的格式字符串不必是单个字符。这条线可以简化为

    $date = date('F j Y');
    

    鉴于此,你可以有一个简单的

    switch($whats_my_locale) {
        case 'FR':
           $format = 'date format characters for a french date';
           break
        case 'EN' :
           $format = 'format chars for english date'
           break
        case etc....
        default:
           $format = 'default date format string here';
    }
    
    $local_date_string = date($format, $start);
    

    你走了。

    【讨论】:

    • 这看起来很棒,我的问题是 - 在$format = 'date format characters... fr'; 的上下文中,这些变量(例如'm'、'd'、'M')等如何重新定义为法语?
    • 我很抱歉太密集了! :(
    • date() 手册页 (php.net/date) 说使用 setlocale()strftime() 用于非英语日期。但是相同的格式字符串规则基本上适用于那里 - 它不必是单个字符,它可以是格式化字符的字符串。
    【解决方案3】:

    我确定你有,但你考虑过只使用数值吗?

    此外,如果您确实使用它们,请记住美国有月/日,与英国和其他国家相反。

    【讨论】:

    • 这是一个想法。我绝对希望避免这种情况,但它确实逃脱了我......我将其视为备用计划。谢谢。
    • 是的,有一个完整的日期会更好,但用户肯定更喜欢功能性的数字。哎呀,你甚至可以只使用一个随机的 JavaScript 日期。
    【解决方案4】:

    可以通过定义或开关轻松完成。

    定义 (PHP 7)

    <?php
    // With Define
    $untranslated_date = $date('D');
    translate_date($untranslated_date);
    							
    function translate_date($untranslated_date)
    {
      define('translated_days', array(
    	'Mon' => 'Ma',
    	'Tue' => 'Di',
    	'Wed' => 'Wo',
    	'Thu' => 'Do',
    	'Fri' => 'Vr',
    	'Sat' => 'Za',
    	'Sun' => 'Zo')
    	);
    	
    	echo translated_days[$untranslated_date];
    }

    SWITCH(或 if 语句)

    // With a switch (or if)
    $untranslated_date = $date('D');
    translate_date($untranslated_date);
    
    function translate_date($untranslated_date)
    {
    switch ($untranslated_date)
    {
    	case "Mon":
    	$translated_date = "Ma";
    	break;
    		
        case "Tue":
    	$translated_date = "Di";
    	break;
    		
    	case "Wed":
    	$translated_date = "Wo";
    	break;
    		
    	case "Thu":
    	$translated_date = "Do";
    	break;
    		
    	case "Fri":
    	$translated_date = "Vr";
    	break;
    		
    	case "Sat":
    	$translated_date = "Za";
    	break;
    		
    	case "Sun":
    	$translated_date = "Zo";
    	break;
    }
    	
    echo $translated_date;
    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2014-05-10
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多