PHP Conference Japan 2024

setlocale

(PHP 4, PHP 5, PHP 7, PHP 8)

setlocale設定地區資訊

說明

setlocale(int $category, string $locales, string ...$rest): string|false

替代簽章(不支援具名參數)

setlocale(int $category, array $locale_array): string|false

設定地區資訊。

警告

地區資訊是依據每個行程(process)而非每個執行緒(thread)來維護的。如果您在多執行緒伺服器 API 上運行 PHP,您可能會在腳本運行時遇到地區設定突然改變的情況,即使腳本本身從未呼叫 setlocale() 函式。這是因為同一行程中其他執行緒同時運行的其他腳本使用 setlocale() 更改了整個行程的地區設定。在 Windows 上,從 PHP 7.0.5 開始,地區資訊是依據每個執行緒維護的。

參數

category

category 是一個命名常數,指定受地區設定影響的函式類別。

locales

如果 locales 是空字串 "",則地區名稱將從與上述類別名稱相同的環境變數值或從 "LANG" 設定。

如果 locales"0",則地區設定不受影響,只會返回目前的設定。

如果 locales 後面接著其他參數,則會嘗試將每個參數設定為新的地區設定,直到成功為止。如果一個地區設定在不同系統上以不同名稱 known,或者要為可能不可用的地區設定提供後備方案,這會很有用。

rest

選擇性字串參數,嘗試作為地區設定,直到成功為止。

locale_array

會嘗試將每個陣列元素設定為新的地區設定,直到成功為止。如果一個地區設定在不同系統上以不同名稱 known,或者要為可能不可用的地區設定提供後備方案,這會很有用。

備註:

在 Windows 上,setlocale(LC_ALL, '') 會從系統的地區/語言設定(可透過控制台存取)設定地區名稱。

回傳值

返回新的目前地區設定,如果您的平台上未實作地區功能、指定的地區設定不存在或類別名稱無效,則返回 false

無效的類別名稱也會導致警告訊息。類別/地區設定名稱可以在 » RFC 1766» ISO 639 中找到。不同的系統具有不同的地區設定命名方案。

備註:

setlocale() 的回傳值取決於執行 PHP 的系統。它會完全返回系統 setlocale 函數所返回的值。

範例

範例 #1 setlocale() 範例

<?php
/* 設定語系為荷蘭文 */
setlocale(LC_ALL, 'nl_NL');

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

/* 嘗試不同的德文語系名稱 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'de', 'ge');
echo
"此系統上偏好的德文語系為 '$loc_de'";
?>

範例 #2 setlocale() Windows 系統範例

<?php
/* 設定語系為荷蘭文 */
setlocale(LC_ALL, 'nld_nld');

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

/* 嘗試不同的德文語系名稱 */
$loc_de = setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
echo
"此系統上偏好的德文語系為 '$loc_de'";
?>

注意事項

提示

Windows 使用者可以在 Microsoft 的 MSDN 網站上找到關於 地區設定 字串的有用資訊。支援的語言字串可以在 » 語言字串文件 中找到,支援的國家/地區字串可以在 » 國家/地區字串文件 中找到。

新增註記

使用者貢獻的註記 34 則註記

175
r dot nospam dot velseboer at quicknet dot nospam dot nl
22 年前
使用 LC_ALL 設定時要小心,因為它可能會引入一些不必要的轉換。例如,我使用了

setlocale (LC_ALL, "Dutch");

在我的頁面上取得荷蘭語的星期幾。從那一刻起(幾個小時後我才發現),我從 MYSQL 取得的浮點數值被解釋為整數,因為荷蘭語地區設定需要在小數點前使用逗號 (,) 而不是點 (.)。我嘗試了 printf、number_format、floatval…… 都無濟於事。1.50 總是被印成 1.00 :(

當我將地區設定設為

setlocale (LC_TIME, "Dutch");

我的星期幾現在正常了,我的浮點數值也是。

我希望我能藉此省去一些人自己找出這個問題的麻煩。

Rob
53
russ at eatmymonkeydust dot com
12 年前
如果您正在尋找 getlocale() 函式,只需將 0(零)作為第二個參數傳遞給 setlocale() 即可。

但請注意,如果您使用類別 LC_ALL 且某些地區設定不同,則會返回一個包含所有地區設定的字串

<?php
echo setlocale(LC_ALL, 0);

// LC_CTYPE=en_US.UTF-8;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;LC_NAME=C;
// LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

echo setlocale(LC_CTYPE, 0);

// en_US.UTF-8

setlocale(LC_ALL, "en_US.UTF-8");
echo
setlocale(LC_ALL, 0);

// en_US.UTF-8

?>

如果您要儲存和重設地區設定,您可以執行以下操作

<?php

$originalLocales
= explode(";", setlocale(LC_ALL, 0));
setlocale(LC_ALL, "nb_NO.utf8");

// 執行某些操作

foreach ($originalLocales as $localeSetting) {
if (
strpos($localeSetting, "=") !== false) {
list (
$category, $locale) = explode("=", $localeSetting);
}
else {
$category = LC_ALL;
$locale = $localeSetting;
}
setlocale($category, $locale);
}

?>

以上程式碼在此處 (Ubuntu Linux) 可以運作,但由於 setlocale() 函式只是包裝了等效的系統呼叫,因此結果可能會因系統而異。
12
epistomai at gmail dot com
5 年前
setlocale(LC_MONETARY, 'en_US') 已無法運作(至少在 PHP 7.3.8 版本中)。

我改用 'en_US.UTF-8'
16
Shashakhmetov Talgat
9 年前
//修正 Windows 上俄文語系編碼
$locale = setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');

function strftime_fix($format, $locale, $timestamp = time()){
// 修正 Windows 上的 %e
if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') {
$format = preg_replace('#(?<!%)((?:%%)*)%e#', '\1%#d', $format);
}
// 轉換
$date_str = strftime($format, $timestamp);
if (stripos($locale, "1251") !== false) {
return iconv("windows-1251","utf-8", $date_str);
} elseif (stripos($locale, "1252") !== false) {
return iconv("windows-1252","utf-8", $date_str);
} else {
return $date_str;
}
}
18
Kari Sderholm aka Haprog
15 年前
我花了一些時間才弄清楚如何在裝有 Apache2 和 PHP5 的 Ubuntu 伺服器上正確設定芬蘭語系。

一開始 "locale -a" 的輸出如下
C
en_US.utf8
POSIX

我必須使用以下指令安裝芬蘭語系套件
"sudo apt-get install language-pack-fi-base"

現在 "locale -a" 的輸出如下
C
en_US.utf8
fi_FI.utf8
POSIX

安裝正確的語系套件後,您需要做的最後一件事是使用 "sudo apache2ctl restart" 重啟 Apache。然後在重啟 Apache 後,就可以在 PHP5 中使用 "fi_FI.utf8" 語系。

要在 PHP 中設定芬蘭時區和語系,請使用
<?php
date_default_timezone_set
('Europe/Helsinki');
setlocale(LC_ALL, array('fi_FI.UTF-8','fi_FI@euro','fi_FI','finnish'));
?>
14
brice/axice/be
15 年前
請注意語法。
- UTF8 沒有 dash ('-')
- locale.codeset 而不是 locale-codeset。

這是新手常犯的愚蠢錯誤,但在開始使用 gettext 時值得了解。

<?php
$codeset
= "UTF8"; // 警告!不是 UTF-8 (有 dash '-')

// 為了 Windows 相容性(例如 xampp):這 3 行在 Linux 系統中無用

putenv('LANG='.$lang.'.'.$codeset);
putenv('LANGUAGE='.$lang.'.'.$codeset);
bind_textdomain_codeset('mydomain', $codeset);

// 設定語系
bindtextdomain('mydomain', ABSPATH.'/locale/');
setlocale(LC_ALL, $lang.'.'.$codeset);
textdomain('mydomain');
?>

其中 locale 的目錄結構為(例如)
locale/fr_FR/LC_MESSAGES/mydomain.mo
locale/en_US/LC_MESSAGES/mydomain.mo

而 ABSPATH 是 locale 資料夾的絕對路徑

進一步說明,在 Linux 系統下,似乎需要使用 'locale-gen' 在作業系統層級建立語系。
1
lingureanumanuel at yahoo dot com
2 年前
對於 Windows

setlocale(LC_ALL, 'Greenlandic_Greenland.1252');
將會回傳 false

要使其運作,請使用
setlocale(LC_ALL, 'Kalaallisut_Greenland.1252');
9
pigmeu at pigmeu dot net
20 年前
!!警告!!

「locale」始終取決於伺服器設定。

例如:
當嘗試在某些伺服器上使用「pt_BR」時,您將永遠獲得 false。即使使用其他語言也是如此。

語系字串需要伺服器支援。有時一種語言會有不同的字元集,例如「pt_BR.utf-8」和「pt_BR.iso-8859-1」,但不支援_標準_的「pt_BR」。

這個問題也發生在 Windows 平台上。在這裡,您需要呼叫「portuguese」或「spanish」或「german」或...

也許嘗試成功呼叫 setlocale() 函式的唯一方法是
setlocale(LC_ALL, "pt_BR", "pt_BR.iso-8859-1", "pt_BR.utf-8", "portuguese", ...);

但在進行日期轉換或數字格式化等功能時,千萬不要相信這個設定。確保操作正確的最佳方法是使用預設的 "en_US" 或 "en_UK",不要呼叫 setlocale() 函式。或者,透過一些測試確保你的伺服器支援你想使用的語言。

請記住:使用預設的語系設定也是與其他應用程式(例如資料庫或 RPC 伺服器)進行「溝通」的最佳方式。

[]s

Pigmeu
2
stepdate at gmail dot com
6 年前
如果你已經安裝了語系設定,但仍然無法正常運作,請檢查拼寫:所有關於德文的註釋都建議使用 "setlocale(LC_TIME, "de_DE.utf8") ",但正確的寫法應該是 "setlocale(LC_TIME, "de_DE.UTF-8")",也就是 UTF-8 而不是 utf8。
8
jose dot nobile at gmail dot com
9 年前
給抱怨 setlocale 的 Windows 使用者:

setlocale 函式的語系參數採用以下格式:
setlocale( LC_ALL, "<語言>_<國家/地區>.<字碼頁>" );

簡而言之,如果你想使用例如 es_CO.UTF-8,在 Windows 中必須寫成 Spanish_Colombia.1252

字碼頁 1252 是 ISO-8859-1 (windows-1252 ANSI Latin 1;西歐語系 (Windows))

Windows 使用與 Unix 不同的語言代碼,例如,es_CO 會變成 es-CO 或 Spanish_Colombia,而且它也不支援 UTF-8 字元集,如其網站所示:https://msdn.microsoft.com/en-us/library/x99tb11d(v=vs.140.aspx

「可用的語系名稱、語言、國家/地區代碼和字碼頁集合包含 Windows NLS API 支援的所有字碼頁,但不包括每個字元需要兩個以上位元組的字碼頁,例如 UTF-7 和 UTF-8。如果你提供 UTF-7 或 UTF-8 的字碼頁值,setlocale 將會失敗,並返回 NULL。」

請查看更新後的語言和字碼頁網站

https://msdn.microsoft.com/en-us/library/39cwe7zf(v=vs.140.aspx
以及
https://msdn.microsoft.com/en-us//goglobal/bb895996

如果連結失效,以下為複製貼上的內容

南非荷蘭文
阿爾巴尼亞文
阿拉伯文_沙烏地阿拉伯
阿拉伯文_伊拉克
阿拉伯文_埃及
阿拉伯文_利比亞
阿拉伯文_阿爾及利亞
阿拉伯文_摩洛哥
阿拉伯文_突尼西亞
阿拉伯文_阿曼
阿拉伯文_葉門
阿拉伯文_敘利亞
阿拉伯文_約旦
阿拉伯文_黎巴嫩
阿拉伯文_科威特
阿拉伯文_阿拉伯聯合大公國
阿拉伯文_巴林
阿拉伯文_卡達
亞美尼亞文
亞塞拜然文_拉丁
亞塞拜然文_西里爾
巴斯克文
白俄羅斯文
孟加拉文_印度
波士尼亞文_拉丁
保加利亞文
加泰隆尼亞文
中文_台灣
中文_中國
中文_香港
中文_新加坡
中文_澳門
克羅埃西亞文
克羅埃西亞文_波士尼亞與赫塞哥維納
捷克文
丹麥文
迪維希文
荷蘭文_標準
荷蘭文_比利時
英文_美國
英文_英國
英文_澳洲
英文_加拿大
英文_紐西蘭
英文_愛爾蘭
英文_南非
英文_牙買加
英文_加勒比海
英文_貝里斯
英文_千里達
英文_辛巴威
英文_菲律賓
愛沙尼亞文
法羅文
波斯文
芬蘭文
法文_標準
法文_比利時
法文_加拿大
法文_瑞士
法文_盧森堡
法文_摩納哥
喬治亞文
加利西亞文
德語(標準)
德語(瑞士)
德語(奧地利)
德語(盧森堡)
德語(列支敦士登)
希臘語
古吉拉特語
希伯來語
印地語
匈牙利語
冰島語
印尼語
義大利語(標準)
義大利語(瑞士)
日文
坎那達語
哈薩克語
孔卡尼語
韓語
吉爾吉斯語
拉脫維亞語
立陶宛語
馬其頓語
馬來語(馬來西亞)
馬來語(汶萊)
馬拉雅拉姆語
馬爾他語
毛利語
馬拉地語
蒙古語
挪威語(書面挪威語)
挪威語(新挪威語)
波蘭語
葡萄牙語(巴西)
葡萄牙語(標準)
旁遮普語
蓋丘亞語(玻利維亞)
蓋丘亞語(厄瓜多)
蓋丘亞語(秘魯)
羅馬尼亞語
俄文
薩米語(伊納里薩米語)
薩米語(呂勒薩米語,挪威)
薩米語(呂勒薩米語,瑞典)
薩米語(北薩米語,芬蘭)
薩米語(北薩米語,挪威)
薩米語(北薩米語,瑞典)
薩米語(斯科爾特薩米語)
薩米語(南薩米語,挪威)
薩米語(南薩米語,瑞典)
梵語
塞爾維亞語(拉丁字母)
塞爾維亞語(拉丁字母,波士尼亞與赫塞哥維納)
塞爾維亞語(西里爾字母)
塞爾維亞語(西里爾字母,波士尼亞與赫塞哥維納)
斯洛伐克語
斯洛維尼亞語
西班牙語(傳統排序)
西班牙語(墨西哥)
西班牙語(現代排序)
西班牙語(瓜地馬拉)
西班牙語(哥斯大黎加)
西班牙語(巴拿馬)
西班牙語(多明尼加)
西班牙語(委內瑞拉)
西班牙語(哥倫比亞)
西班牙語(秘魯)
西班牙語(阿根廷)
西班牙語(厄瓜多)
西班牙語(智利)
西班牙語(烏拉圭)
西班牙語(巴拉圭)
西班牙語(玻利維亞)
西班牙語(薩爾瓦多)
西班牙語(宏都拉斯)
西班牙語(尼加拉瓜)
西班牙語(波多黎各)
斯瓦希里語
瑞典語
瑞典語(芬蘭)
敘利亞語
坦米爾語
韃靼語
泰盧固語
泰語
茨瓦納語
烏克蘭文
土耳其文
烏克蘭文
烏爾都語
烏茲別克語(拉丁字母)
烏茲別克語(西里爾字母)
越南語
威爾斯語
科薩語
祖魯語

程式碼頁識別碼

https://msdn.microsoft.com/en-us/library/windows/desktop/dd317756(v=vs.85).aspx
3
tomas dot hampl at gmail dot com
13 年前
在 Linux 上,setlocale() 的作用取決於已安裝的地區設定。要查看 PHP 可用的地區設定,請在終端機執行以下指令

「locale -a」

提供的清單是伺服器上所有可供 PHP 使用的地區設定。要新增新的地區設定,請執行

locale-gen <地區設定名稱>(這可能需要 sudo / root 權限),例如要新增捷克地區設定,請執行以下指令

「sudo locale-gen cs_CZ.utf8」

然後您可以使用這個地區設定宣告

setlocale(LC_ALL, 'cs_CZ.utf8');
5
匿名
18 年前
bruno dot cenou at revues dot org 底下的範例顯示了這種可能性,但我想要清楚說明:您可以將字元集資訊新增到 setlocale。

範例

在我的 utf-8 編碼頁面中,我想插入目前月份的名稱,也就是三月,德語為「März」 - 附有變音符號。如果您使用

setlocale(LC_TIME, 'de_DE');
echo strftime("%B");

這將返回「M&auml;rz」,但在 utf-8 頁面上,這個 HTML 實體看起來會像這樣:「M?rz」。這不是我想要的。

但如果您使用

setlocale(LC_TIME, 'de_DE.UTF8'); // 注意字元集資訊!
echo strftime("%B");

這將返回「M√§rz」,在 utf-8 上看起來應該像這樣:「März」。
2
bryn AT lunarvis DOT com
16 年前
發布這個資訊是希望它可能對其他人有用,因為我在任何地方都找不到太多資訊。如果您想使用威爾斯語地區設定,並且已安裝適當的語言支援,請將「cym」(Cymraeg 的縮寫形式)傳遞給 setlocale

<?php
setlocale
(LC_TIME, 'cym');
$welsh= gmstrftime("%A, %B %Y - %H:%M",time());
echo
$welsh;
?>

以上程式碼適用於 Windows 系統,如果安裝了必要的支援,也應該適用於 Unix 系統。

致敬,

Bryn.
3
data dot ocean dot italia at gmail dot com
11 年前
相反地,在 IIS 上使用 PHP 時,我必須使用以下程式碼來設定義大利語...

<?php setlocale(LC_ALL, 'Italian_Italy.1250'); ?>
2
RobQuist
11 年前
補充 russ 的說明,關於取得/備份語系設定
我在單元測試中使用這個方法。我想要測試一些基於語系設定的功能,並在測試完成後重置語系設定。

然而,出現了一些錯誤;
* setlocale 不再接受字串作為參數。您需要使用常數。
* 一些常數已經不存在。

以下是一段更新後的程式碼

<?php
$originalLocales
= explode(";", setlocale(LC_ALL, 0));
setlocale(LC_ALL, 'nl_NL.UTF-8');

//在此處執行某些操作

//恢復為預設設定
$skipConstants = array( //這些常數會被 setlocale(LC_ALL, 0) 返回,但已不再存在。
'LC_PAPER',
'LC_NAME',
'LC_ADDRESS',
'LC_TELEPHONE',
'LC_MEASUREMENT',
'LC_IDENTIFICATION'
);

foreach (
$originalLocales as $localeSetting) {
if (
strpos($localeSetting, "=") !== false) {
list (
$category, $locale) = explode("=", $localeSetting);
} else {
$category = LC_ALL;
$locale = $localeSetting;
}

if (!
in_array($category, $skipConstants)) {
setlocale(constant($category), $locale); //使用字串已被棄用。
}
}
?>
3
Periklis
17 年前
在*某些* Windows 系統中,只設定 LC_TIME 並不會生效,您必須設定 LC_ALL 或同時設定 LC_CTYPE 和 LC_TIME。但如果您在腳本中較早的位置已經使用 setlocale 設定了 LC_TIME,日期將不會受到影響!例如:
<?php
setlocale
(LC_TIME, 'greek');
setlocale(LC_CTYPE, 'greek');
?>
不會生效,而
<?php
setlocale
(LC_CTYPE, 'greek');
setlocale(LC_TIME, 'greek');
?>
則會生效。
3
birkholz at web dot de
19 年前
當我嘗試取得目前的語系設定(例如,在使用 setlocale(LC_ALL, 'de_DE'); 將語言設定為德文之後),以下程式碼在我的 SUSE Linux 9.0 系統上無法正常運作:
$currentLocale = setlocale(LC_ALL, NULL);
這段程式碼會將設定重置為伺服器預設值。

$currentLocale = setlocale(LC_ALL, 0); 對我來說可以完美運作,但手冊上說在這種情況下 NULL 和 0 是等效的,但 NULL 的行為似乎像 ""。
1
aaaaa976 at gmail dot com
9 年前
在 Windows 系統中,有時 setlocale 無法正常運作,它會返回一個空陣列,但語系設定卻已經被設定。我發現 Apache 在 Windows「載入」語系設定之前就已經啟動了,您必須重新啟動 Apache 才能解決這個問題。
2
michal dot kocarek at brainbox dot cz
16 年前
關於在 Windows 系統上使用 UTF-8 語系編碼的注意事項

根據 MSDN 的說明,Windows 的 setlocale() 實作不支援 UTF-8 編碼。

引用自「MSDN setlocale, _wsetlocale」頁面(http://msdn.microsoft.com/en-us/library/x99tb11d.aspx
可用的語言、國家/地區代碼和字碼頁集合包含所有 Win32 NLS API 支援的項目,但每個字元需要兩個以上位元組的字碼頁除外,例如 UTF-7 和 UTF-8。如果您提供像 UTF-7 或 UTF-8 這樣的字碼頁,setlocale 將會失敗,並返回 NULL。

所以基本上,像這樣的程式碼:
<?php setlocale(LC_ALL, 'Czech_Czech Republic.65001'); // 65001 是 UTF-8 字碼頁 ?>
在 Windows 上完全無法運作。

(撰寫於 PHP 5.2.4 時期)
3
mk at totu dot com
20 年前
請注意,設定使用逗號而不是點號作為數字小數點的語系設定可能會導致 MySQL 資料庫無法理解查詢。
<?php
setlocale
(LC_ALL,"pl");
$price = 1234 / 100; // 現在價格看起來像 12,34
$query = mysql_query("SELECT Id FROM table WHERE price='".$price."'");
?>
即使價格是 12.34,也找不到任何結果
3
Leigh Morresi
16 年前
設定系統不支援的地區設定,將導致某些字串操作在需要進行轉寫的地方返回問號「?」。

1) 請務必檢查 setlocale() 的返回值,以確保它已設定為支援的設定

2) 在 Linux 上,您可以使用「locale -a」指令來查找支援的地區設定清單
2
garygendron at yahoo dot com
14 年前
對於 php Mysql 查詢,您也可以使用,例如,法語加拿大語:

$query = 'SET lc_time_names = "fr_CA"';
$result = mysql_query($query) or die("查詢失敗");

$query = 'SELECT @@lc_time_names';
$result = mysql_query($query) or die("查詢失敗");

$query = 'SELECT id, created, YEAR(created) as year, MONTH(created) as month,' .
' CONCAT_WS(" ", MONTHNAME(created), YEAR(created)) as archive' .
' FROM #__TABLE as e' .
' GROUP BY archive' .
' ORDER BY id DESC';

您的資料將以您想要的任何地區設定顯示。您甚至可以從您的多語言網站 $_GET[lc_time_name]。
2
szepeshazi at gmail dot com
17 年前
對於那些像我一樣不幸在 Windows 環境中工作,並嘗試將地區設定設定為一種語言_以及_ UTF-8 字元集,但無法做到的人,這裡有一個解決方法。

例如,要以匈牙利語和 UTF-8 字元集輸出日期,可以使用以下方法:

$dateString = "%B %d., %A";
setlocale(LC_ALL,'hungarian');
$res=strftime($dateString);
echo(iconv('ISO-8859-1', 'UTF-8', $res));

如果有人知道如何在 Windows 上將地區設定設定為與 unix 上的「hu_HU.UTF-8」等效的設定,請告訴我。
1
phcorp
13 年前
要查找 Unix 系統的地區設定
<?php system('locale -a') ?>
1
internationalist
9 年前
我的腳本運行一個循環來更改地區設定(多語言應用程式)。我注意到,在某些隨機情況下,即使 setlocale() 函式已在之前的步驟中執行,地區設定仍然沒有更改。我不得不為這種情況添加等待時間。有趣的是,只有在「nl_NL.UTF8」地區設定下才會出現這種情況。

<?php
//一些程式碼
$this->counter = 0;
// 一些程式碼
$this->locale = 'nl_NL.UTF8';
setlocale(LC_ALL, $this->locale);
$this->counter++;
if (
$this->locale !== setlocale(LC_CTYPE, 0)) { // 語系設定尚未變更。
if ($this->counter > 10) {
return;
}
sleep(1);
}
// 一些程式碼
?>
1
leif at neland dot dk
14 年前
關於語系設定中的連字號,似乎應該完全省略。

在我的 /etc/locale.gen 中有

da_DK.ISO-8859-15 ISO-8859-15

但 locale -a 顯示

da_DK.iso885915

這是 setlocale() 想要的格式。

(Debian)
2
Un_passant
16 年前
對於 debian/ubuntu,別忘了 UTF8 字元集。

// 在 Ubuntu 8.04 伺服器上運作
setlocale(LC_TIME, 'fr_FR.UTF8', 'fr.UTF8', 'fr_FR.UTF-8', 'fr.UTF-8');
1
Sven K
18 年前
如果您的系統沒有透過 "locale -a" 顯示任何已安裝的語系設定,請嘗試透過 "dpkg-reconfigure locales"(在 debian 上)安裝它們。
2
info AT hipot-studio DOT com
11 個月前
在 PHP 8.2 及更高版本中,PHP 的內建大小寫轉換函式與語系設定無關,這會影響以下函式

strtolower
strtoupper
lcfirst
ucfirst
ucwords
stristr
stripos
strripos
str_ireplace

以上所有函式僅在 ASCII 字元範圍內執行大小寫轉換和比較。
0
divinity76 at gmail dot com
2 年前
如果有人正在尋找 getlocale(),

<?php
if(!function_exists("getlocale")){
function
getlocale(int $category)/*:string|false*/{
return
setlocale($category, 0);
}
}
?>
0
tim dot peters at live dot com
5 年前
也許很明顯,但我原本預期 setlocale 常數 (LC_*) 會是位元運算的,但它們不是。

例如,執行以下程式碼

<?php
setlocale
(LC_TIME + LC_COLLATE, 'nl');

echo
setlocale(LC_ALL, 0);
?>
會導致以下結果

LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=C;LC_COLLATE=C;LC_MONETARY=C;LC_MESSAGES=nl;LC_PAPER=C;
LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C

請注意,LC_MESSAGES 已變更,取代了 LC_TIME 和 LC_COLLATE。(因為 LC_TIME + LC_COLLATE = LC_MESSAGES)。

如果您不想使用 LC_ALL,則需要個別指定它們。

<?php
setlocale
(LC_TIME, 'nl');
setlocale(LC_COLLATE, 'nl');

echo
setlocale(LC_ALL, 0);
?> LC_CTYPE=C;LC_NUMERIC=C;LC_TIME=nl;LC_COLLATE=nl;LC_MONETARY=C;LC_MESSAGES=C;LC_PAPER=C;
LC_NAME=C;LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=C;LC_IDENTIFICATION=C
0
ostapk
16 年前
目前有一個正在開發中的名為 intl 的 PECL 擴充功能(它將在 PHP5.3 中提供)。同時,所有依賴 setlocale() 及其相關函式的人都應該注意它們的限制,如同 onPHP5.com 部落格上的這篇文章所述:http://www.onphp5.com/article/22
-1
mvanbaak
17 年前
補充 Sven K 關於 Debian 的技巧

您也可以安裝 locales-all 套件
該套件包含所有已編譯的語系設定。
-1
flavioacvalverde at gmail dot com
13 年前
對於葡萄牙,我必須使用

<?php setlocale(LC_ALL, 'Portuguese_Portugal.1252'); ?>

在 Windows 伺服器上使用 IIS 搭配 PHP。
To Top