2014-03-13 40 views
2

我需要爲非拉丁語言(簡體中文,日文漢字等)創建i18n屬性文件使用我們產品的Swing部分,我們使用其中包含原始UTF-8字符的Java屬性文件,Netbeans會自動爲我們轉換爲8859-1,並且它工作正常。使用JavaFX,這種策略不起作用。 Our strategy matches this answer precisely這似乎並沒有在這種情況下工作。如何使用非拉丁字符的FXML和屬性文件?

在我對這個問題的調查中,我發現this old article表示需要使用native2ascii轉換屬性文件中的字符;仍然不起作用。

爲了消除儘可能多的變量,我創建了一個示例FXML項目來說明問題。日文漢字有三個國際化標籤。第一個標籤在FXML文檔中有文本。第二個從屬性文件加載原始未轉義字符。第三個加載轉義Unicode(匹配native2ascii輸出)。

jp_test.properties

btn.one=閉じる 
btn.two=\u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039 

jp_test.fxml

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 
<?scenebuilder-preview-i18n-resource jp_test.properties?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="147.0" prefWidth="306.0" xmlns:fx="http://javafx.com/fxml"> 
    <children> 
    <Label layoutX="36.0" layoutY="33.0" text="閉じる" /> 
    <Label layoutX="36.0" layoutY="65.0" text="%btn.one" /> 
    <Label layoutX="36.0" layoutY="97.0" text="%btn.two" /> 
    <Label layoutX="132.0" layoutY="33.0" text="Static Label" textFill="RED" /> 
    <Label layoutX="132.0" layoutY="65.0" text="Properties File Unescaped" textFill="RED" /> 
    <Label layoutX="132.0" layoutY="97.0" text="Properties File Escaped" textFill="RED" /> 
    </children> 
</AnchorPane> 

結果

Help me fix the third label

正如你所看到的,第三個標籤不能正確渲染。

環境:

Java 7的U21,U27,U45,U51,32位和64位。 (JavaFX 2.2.3-2.2.45)

Windows 7 Enterprise,Professional 64位。

UPDATE

我驗證過的屬性文件 ISO 8859-1

enter image description here

回答

1

大多數IDE(NetBeans的至少)默認情況下,在處理Unicode編碼的文件。如果您在NetBeans中創建屬性文件並在其中輸入日文文本,則輸入的文本將自動編碼爲utf。要看到這個打開記事本(++)的屬性文件,你會看到日文字符被轉義。
UTF轉義等價物「閉じる」爲「\u9589\u3058\u308b」,而「\u00e9\u2013\u2030\u00e3\ufffd\u02dc\u00e3\u201a\u2039」爲反面的「é–‰ã�˜ã‚‹」。所以圖片中的程序輸出是正確的。此外,如果您重新打開NetBeans中的jp_test.properties文件,您將看到轉義的utf編碼文本將被視爲已解碼。

編輯:按照評論,
它爲什麼要這樣做呢?
這可能是因爲您省略了native2ascii的-encoding參數,那麼系統的默認字符集可能不是UTF。這可能是該輸出的原因。

此外,爲什麼Java和Swing與我們的屬性文件沒有問題,因爲它們是
但FXML無法處理它?

不能這樣,因爲「FXML是Java」。唯一的區別也可能是「系統字符集的使用」與「在某個配置位置覆蓋字符集」。

無論如何,我建議根據輸入文件編碼使用native2ascii的正確編碼參數。更具體地說,首先將屬性文件轉換爲utf-8編碼,然後執行其餘的操作。如果您使用NetBeans作爲IDE,則不需要native2ascii。

+0

所以,'\ u00e9 \ u2013 \ u2030 \ u00e3 \ ufffd \ u02dc \ u00e3 \ u201a \ u2039'是從Java的''上閉じる'執行native2ascii'工具。它爲什麼這樣做?此外,爲什麼Java和Swing與我們的屬性文件沒有問題,但FXML無法處理它? – mawcsco

+0

@mawcsco查看更新。 –

+0

所以,你讓我指出了正確的方向。我們從翻譯器獲得的文件缺少物料清單。添加BOM後,Netbeans和native2ascii都會生成正確的轉義字符。 – mawcsco