2014-11-20 38 views
3

我在寫一個支持多種語言的PHP應用程序。將en_US轉換爲en-US

當在PHP中設置語言環境時,我需要根據setlocale documentation提供一個在我認爲是RFC 1766/ISO 639中定義的值。

setlocale(LC_ALL, 'en_US'); 
var_dump(setlocale(LC_MESSAGES, '0')); 
// string(5) "en_US" 

當使用這種語言環境來描述HTML 屬性,因爲它沒有格式化爲RFC 5646驗證失敗。該語言的RFC 5646值實際上是en-US(注意使用連字符而不是下劃線)。

在下面的輸出使用PHP的的setlocale功能這個值,如上,結果:

string(1) "C" 

我不知道爲什麼它返回℃的價值,但我相信這是因爲提供的語言環境格式不正確。C是原始服務器默認值,即described as ASCII(感謝@Cheery的參考)。

所以,我想知道我該怎麼做。我可以,切實,使用PHP的str_replace函數功能輸出屬性之前切換-_,像這樣:

<?php setlocale('en_US'); ?> 
<!doctype html> 
<html lang="<?= str_replace('_', '-', setlocale(LC_MESSAGES, '0')); ?>"> 
... 

但是,我擔心可能有兩種語言之間的其他差異規範可能會在路上產生意想不到的問題。如果是這樣,是否有翻譯PHP中已有的語言代碼或可以使用的翻譯類的首選方法?

獎金的問題,爲什麼我的服務器默認值爲C的區域設置?

+1

「C」是系統的語言環境之一。例如,https://help.ubuntu.com/community/Locale。 'C#後退,ASCII編碼,與POSIX相同 ' – Cheery 2014-11-20 20:02:40

回答

-1

您可以使用「setlocale」來設置本地語言代碼。

You can find here it's documentation as well as this and other examples

例如當他們嘗試不同的可能區域名稱爲德國:

<?php 
/* Set locale to Dutch */ 
setlocale(LC_ALL, 'nld_nld'); 

/* Output: vrijdag 22 december 1978 */ 
echo strftime("%A %d %B %Y", mktime(0, 0, 0, 12, 22, 1978)); 

/* try different possible locale names for german as of PHP 4.3.0 */ 
$loc_de = setlocale(LC_ALL, '[email protected]', 'de_DE', 'deu_deu'); 
echo "Preferred locale for german on this system is '$loc_de'"; 
?> 
+1

謝謝。我知道我可以使用PHP的* setlocale *設置語言環境。我遇到的問題是在HTML * lang *屬性中使用它,因爲它使用了不同的格式。我想知道是否有人知道格式之間的差異,以知道簡單的字符串替換('_'到' - ')是否足夠。 – Quantastical 2014-11-26 16:33:43

1

你必須記住,SETLOCAL接受多種類型的「語言環境」之類的名字和混合的東西,對於名稱示例(來自php文檔):

$loc_de = setlocale(LC_ALL, '[email protected]', 'de_DE', 'de', 'ge'); 

您有'de_DE @ euro'這不是有效的HTML lang代碼。

首先,在嘗試轉換它之前,您需要確保格式爲lang_region

+1

好點@PhoneixS。我沒有注意到其他格式不會映射到HTML規範。我應該維護一個不同支持類型的字典並根據需要引用它們。感謝您的回覆! – Quantastical 2017-11-04 22:39:45