2012-06-06 42 views
43

Chức năng setlocale() không đặt ngôn ngữ mong muốn (tiếng Đức).PHP setlocale không có hiệu lực


Mục tiêu là nhập tên tháng.

Đây là mã thử nghiệm của tôi với các thử nghiệm cho đến nay:

<?php 

date_default_timezone_set('Europe/Berlin'); 
setlocale(LC_ALL, 'de_DE.utf8'); 
// Or 
setlocale(LC_ALL, '[email protected]'); 
// Or 
setlocale(LC_ALL, 'de_DE'); 
// Or 
setlocale(LC_ALL, 'de'); 
// Or 
setlocale(LC_ALL, 'ge'); 


echo strftime('%B'); 

Output:

Tháng sáu

thay vì

Juni

Mọi đề xuất?

  • Tôi không có quyền truy cập ssh hoặc vỏ khác.
  • Tập lệnh đang chạy trên máy chủ Linux.
+0

Vì vậy, bạn đã thử các phiên bản khác của ngôn ngữ Đức, ví dụ: 'setlocale (LC_ALL, 'de_DE @ euro', 'de_DE', 'de', 'ge');'? –

+0

Bạn nên kiểm tra xem ngôn ngữ có thay đổi thành công hay không bằng cách kiểm tra giá trị trả về của 'setLocale' – velop

Trả lời

8

Giải pháp này có thể giúp đỡ nếu bạn không có quyền truy cập vỏ đến máy chủ.

Nếu bạn có quyền truy cập shell, thì Benjamin Seiller's answer là tốt nhất!

Vì tôi không có bất kỳ khả năng nào khác (trình bao), tôi đã tìm thấy giải pháp chỉ với PHP bằng cách sử dụng IntlDateFormatter class.

<?php 

// Example vars 
$month = '6'; // 1-12 
$year = '2014'; // four digit year 

$fmt = new IntlDateFormatter('de_DE', 
    IntlDateFormatter::FULL, 
    IntlDateFormatter::FULL, 
    'Europe/Berlin', 
    IntlDateFormatter::GREGORIAN); 

$lastMonth = mktime(0, 0, 0, $month -1, 1, $year); 

$showLastMonth = $fmt->format($lastMonth); 
echo $showLastMonth; 
65

Có khả năng là miền địa phương của Đức không được cài đặt trên máy chủ của bạn khi chạy tập lệnh - bạn có truy cập trình bao lên máy chủ không? Sau đó thử

locale -a 

để xem ngôn ngữ nào được cài đặt. Cũng có một cái nhìn ở đây Is it feasible to rely on setlocale, and rely on locales being installed?

+1

Thx cho câu trả lời nhanh, không có khả năng tôi không truy cập shell hav. liên kết của bạn đã giúp tôi: –

+1

Xin lỗi và vui mừng khi biết điều đó. Bạn có nhớ đánh dấu câu trả lời của tôi là "trả lời" không? :) –

+2

Nếu bạn không có quyền truy cập shell, bạn cũng có thể thử trong PHP: 'server ('locale -a');' để tìm tên của các ngôn ngữ được cài đặt trên máy chủ của bạn. –

3

Hãy thử này:

date_default_timezone_set('Europe/Berlin'); 
$loc=setlocale(LC_ALL, '[email protected]', 'de_DE', 'deu_deu'); 
echo strftime('%B'); 
22

Mã của bạn là chính xác. Bạn có thể chỉ cần cài đặt gói ngôn ngữ chính xác trên máy chủ mà bạn đang chạy tập lệnh.

Trong nhà ga nếu ngôn ngữ bạn muốn sử dụng không được liệt kê khi chạy lệnh sudo locale -a, sau đó bạn sẽ phải cài đặt nó bằng cách chạy lệnh sau:

sudo /usr/share/locales/install-language-pack de_DE 

(sudo đây là không bắt buộc nếu bạn người dùng có quyền root)

Sau đó, nếu bạn kiểm tra lại bằng sudo locale -a bạn sẽ thấy .

Nếu bạn muốn cài đặt gói ngôn ngữ tiếng Pháp chạy

sudo /usr/share/locales/install-language-pack fr_FR 

Sau đó, bạn sẽ được phép thiết lập ngôn ngữ của bạn để những trong PHP bằng cách sử dụng setlocale(...) chính xác như bạn đã làm nó.


Lưu ý: Nếu bạn đang ở trong một dự án utf8 không bạn sẽ cần phải tạo ra các định dạng khác từ gói cài đặt. Dưới đây là cách thức tiến hành trên ubuntu (công việc này trên debian cũng):

chỉnh sửa /var/lib/locales/supported.d/cs và thêm những dòng sau

fr_FR.iso88591 ISO-8859-1 
    fr_CA.iso88591 ISI-8859-1 

và chạy

sudo dpkg-reconfigure locales 

Sau đó, bằng cách chạy lại sudo locale -a bạn sẽ thấy cả hai fr_FR.iso88591fr_CA.iso88591 trong danh sách và bạn có thể sử dụng nó trong php bằng cách gọi setlocale(LC_ALL, 'fr_FR.iso88591');

+1

Sau 'install-language-pack fr_FR' tôi cần sử dụng giải pháp @ sephoy08:' setlocale (LC_ALL, 'fr_FR @ euro', 'fr_FR', 'fra_fra'); 'và nó hoạt động tốt. cảm ơn – Meloman

5

PHP manual page for 'setlocale' sais:

Lưu ý: Giá trị trả về của setlocale() phụ thuộc vào hệ thống PHP đang chạy. Nó trả về chính xác những gì hệ thống setlocale trả về hàm.

Nếu bạn có quyền truy cập root (debian) đây là giải pháp:

chỉnh sửa

/etc/locale.gen 

Bạn có thể thêm/xóa mà locale bạn cần sử dụng. Sau khi lưu tệp chạy:

locale-gen 

và bạn sẽ ổn. Trên máy chủ của tôi, tôi phải khởi động lại Apache để xem các thay đổi.

7

Đối với những người đến đây tìm kiếm ngày() không bản địa hoá tháng và tuần tên:

== Chú ý thanh toán ==

ngày() chỉ có thể trả về tên tháng/ngày bằng tiếng Anh và sẽ không thể cung cấp bản dịch cho các ngôn ngữ khác lứa tuổi.

+0

cuối cùng đã tìm thấy những gì tôi đến đây để tìm. Cảm ơn ... đã thử tất cả các sugestions và không có hiệu lực: (Đó là một chút khó chịu rằng ngày là theo cách này –

-1

Nhờ Rico Neitzel cho gợi ý. Thay vì cố gắng định dạng ngày tháng php, hãy sử dụng strftime. Để xem 3 chữ cái đầu tiên của tên tháng trong ngôn ngữ của bạn (Ví dụ: Dez thay vì tháng 12 từ Dezembro và không phải tháng 12), hãy làm theo hướng dẫn cài đặt ngôn ngữ địa phương ở trên, và sau đó:

date date: 'd M Y ') // không thể thay đổi từ tiếng Anh

setlocale(LC_ALL, "pt_BR"); // Portuguese, replace with your locale 
echo strftime('%e %b %G'); 
result: "4 Dez 2016" 

/** 
* datelo funcion (date with locale) 
* Credits: Sergio Abreu 
* http://sites.sitesbr.net 
* NOTE: Depend on availability of the locale in server. 
* 
*/ 

function datelo($str, $locale='en_US', $time=null){ 

    if($time === null){ $time = time(); } 

    if (preg_match("/[DlFM]/", $str)){ 

    setlocale(LC_ALL, $locale); 

    $dict = array('d'=>'%d', 'D'=>'%a', 'j'=>'%e', 'l'=>'%A', 'N'=>'%u', 'w'=>'%w', 'F'=>'%B', 
     'm'=>'%m', 'M'=>'%b', 'Y'=>'%G', 'g'=>'%l', 'G'=>'%k', 'h'=>'%I', 'H'=>'%H', 'i'=>'%M', 
     's'=>'%S', 'S'=>'', 'z'=>'%j', 'n'=>'%m', ' '=>' ', '-'=>'-', '/'=>'/', ':'=>':', ','=>','); 

    $chars = preg_split("//", $str); 
    $nstr = ''; 

    foreach ($chars as $c){ 
     if ($c){ //skip empties 
      $nc = $dict[$c]; 
      if($c === 'n'){ // Fixes the extra zero 
      $nc = preg_replace("/^0+/", '', strftime($nc)); 
      } 
      elseif($c === 'z'){ // Fixes the extra zero and decrease 1 
      $nc = preg_replace("/^0+/", '', strftime($nc)); // 023 turns 23 
      $nc = intval($nc) - 1; 
      }   
      $nstr .= $nc; 
     } 
    } 
    return strftime($nstr);  

    }else{ // not localized 
    return date($str, $time); 
} 
} 
-1

Nếu bạn đang ở trên một máy Red Hat bạn có thể chạy:

localedef -v -c -i de_DE -f UTF-8 de_DE.UTF-8 

Sau đó khởi động lại y máy chủ Apache của chúng tôi

Các vấn đề liên quan