簡體   English   中英

Android(Java)中的國際化,在布局(XML)中使用 xliff:g 的默認值

[英]Internationalization in Android (Java), use default values of xliff:g in layouts (XML)

我猜我是在 Android 開始使用 i18n 進行國際化的(默認情況下在 Android Studio 中)。 但是,我有一個主要問題。 我的應用程序需要能夠在我的字符串中注入變量,所以我小心翼翼地使用,正如我在Android 的官方文檔中看到的那樣,我們可以使用標簽<xliff:g>來做到這一點。 當我們在 Java 中使用這個 String 和 getString 時, example屬性工作得很好,但是當我們在它的 XML 活動布局中使用這個相同的變量時,它會失去所有效率。

例如,這個strings.xml文件用於翻譯:

<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
    <string name="starting">Start: <xliff:g id="unknown_position" example="Unknown position">%1$s</xliff:g>.</string>
    <string name="end">Arrival: <xliff:g id="unknown_position" example="Unknown position">%1$s</xliff:g>.</string>
    <string name="beginning_default">• Beginning: <xliff:g id="unknown_start_date" example="21 august 2022 at 14h21">%1$s</xliff:g></string>
    <string name="ending_default">• End: <xliff:g id="unknown_end_date" example="22 august 2022 at 14h20">%1$s</xliff:g></string>
</resources>

我在activity_layout.xml文件中使用了這些變量:

        <TextView
            android:id="@+id/startPositionText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="@string/starting"
            android:textColor="@color/white"
            android:textSize="20sp"
            />

        <TextView
            android:id="@+id/endPositionText"
            android:layout_below="@id/startPositionText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="@string/end"
            android:textColor="@color/white"
            android:textSize="20sp"
            />

        <TextView
            android:id="@+id/startText"
            android:layout_below="@+id/endPositionText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/beginning_default"
            android:textColor="@color/white"
            android:textSize="17sp"
            />

        <TextView
            android:id="@+id/endText"
            android:layout_below="@id/startText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/ending_default"
            android:textColor="@color/white"
            android:textSize="17sp"
            />

但是,我有以下結果:

問題

你知道我怎么解決這個問題嗎? 為什么會這樣?

我提前謝謝你,祝你有美好的一天!

所以,我找到了解決辦法,因為,我很笨。

來自這篇文章

example屬性包含一個供翻譯者使用的示例,以便他知道占位符是代表 integer、日期、名稱、組織還是完全不同的東西,這可能會影響目標語言的語法。

所以,我只需要在我的strings.xml文件中添加這兩行:

<string name="starting_default">Start: Unknown position.</string>
<string name="end_default">Arrival: Unknown position.</string>

並使用@string/starting_default值在activity_layout.xml文件中引用它們。

<xliff:g>標簽不會在運行時保留。
它們僅在翻譯階段有用。 他們保護中間的文本,這樣翻譯人員就不會損壞%1$s等等,並且他們為翻譯人員提供額外的上下文(通過 ID 和示例),以便他們知道那將是什么最后。

但是編譯資源時標簽會被刪除。

所以這是你在運行時看到的:

starting = "Start: %1$s."
end = "Arrival: %1$s."
beginning_default="• Beginning: %1$s"
ending_default="• End: %1$s"

請注意,您所擁有的只是位置參數。

當你從代碼中調用它們時,你可能會做這樣的事情:

String text = resources.getString(R.string.beginning_default, startDate);

您提供一個格式化的參數並替換%1$s
但是當您在布局中使用字符串時,沒有參數, %1$s保持“原樣”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM