2010-10-21 161 views
3

我正在使用PECL intl模塊在PHP項目中本地化日期和數字。在我使用的所有其他語言(40)中,本地化序數工作正常。然而在瑞典,我得到了奇怪的輸出。它似乎是用來生成序數的模板常量。PHP PECL擴展intl給瑞典序號的亂碼結果

$fnf = new NumberFormatter('sv_FI', NumberFormatter::ORDINAL); 
echo $fnf->format(1); 

$snf = new NumberFormatter('sv_SE', NumberFormatter::ORDINAL); 
echo $snf->format(1); 

兩個返回1:e%digits-ordinal-neutre:0: 1:a與類似1st1er

我唯一的猜測,除了一個bug之外,就是我缺少一些額外的參數,例如關聯動詞的性別。

+0

聽起來像一個bug,也許在pecl-dev郵件列表上提出問題http://pecl.php.net/support.php – quickshiftin 2011-12-30 01:15:01

+0

如果你告訴你正在使用的PHP版本和版本的模塊。 – hakre 2011-12-30 10:58:02

+0

PHP 5.3.6-13ubuntu3.3與Suhosin-Patch,intl版本=> 1.1.0, ICU版本=> 4.4.2。 – Lucent 2011-12-30 21:12:47

回答

1

如果輸出基於數字格式化規則規則$fnf->getPattern()

%digits-ordinal-masculine: 
    0: =#,##0==%%dord-mascabbrev=; 
    -x: −>%digits-ordinal-masculine>; 
%%dord-mascabbrev: 
    0: :e%digits-ordinal-neutre:0: =%digits-ordinal-feminine=; 
%digits-ordinal-reale: 
    0: =%digits-ordinal-feminine=; 
%digits-ordinal-feminine: 
    0: =#,##0==%%dord-femabbrev=; 
    -x: −>%digits-ordinal-feminine>; 
%%dord-femabbrev: 
    0: :e; 
    1: :a; 
    2: :a; 
    3: :e; 
    20: >%%dord-femabbrev>; 
    100: >%%dord-femabbrev>; 
%digits-ordinal: 
    0: =%digits-ordinal-masculine=; 

你可以看到,私人規則集dord-mascabbrev只有一個規則,給予該值:

:e%digits-ordinal-neutre:0: 1:a 

,你將不得不然後在1之後輸出,就像你在你的問題中描述的那樣。

這不是PECL INTL中的錯誤,但其底層規則是格式錯誤的,它是ICU庫(that rule there)的一部分。大約三年前,sv數字格式程序規則修復了缺少分號的問題,看起來像是一行代碼滑過了。

這些規則從Unicode聯合會的CLDR(Common Locale Data Repository,共同語言環境數據存儲庫)中提取到ICU中。我打開了一個bug report there,因爲除非在CLDR中解決這個問題,然後放入ICU,否則它不能與PHP INTL擴展一起使用。

替代方法可能是手動修補ICU庫(版本4.8),然後針對修補過的庫構建PECL包。