ant-design table 組件 列頭名稱 國際化i18n問題 解決

話不多說,直接進入主題。

ant-design 在使用它的table組件的時候,不知道你們有沒有需求說需要翻譯列表頭部名稱:

在切換語言的時候,table的列頭名稱 並不會同步更換對應語言, 而是需要你重新laod或者切換頁面之後才生效。

官方文檔沒有涉及相關問題的解決辦法,其實很明顯原因就是切換語言的時候,表頭的i18n全局指令變量沒有被觸發:

這是正常使用ant-design table 組件時, 給列的title賦值的方法: 

 columns: [
        {
          title: this.$t('general.serial'),
          width: 120,
          scopedSlots: { customRender: 'serial'}
        }
]

columns是table所有列的數據的數組變量,title是給列頭名稱的固定屬性,因爲它會對應一個name爲title的slot。

國際化之後,使用全局i18n指定 this.$t 去翻譯對應列的詞條,這個時候問題就來了,切換語言並不會觸發其自動翻譯,需要重新load 當前頁面或者你切到別的頁面,再返回該頁面,才能拿到對應語言的詞條。

 

所以,怎麼解決這個問題?

通過官方文檔,看到table colums的title屬性的類型可以是string/slot。 string的話就是上面我們採用的方法,所以,此時是不是可以考慮使用slot的方式,給title傳值,然後將翻譯的工作交回到html中。

ok, 我們開始嘗試:

columns: [
        {
          slotName: 'general.serial',
          width: 120,
          scopedSlots: { customRender: 'serial', title: 'general.serial' }
        }
]

在scopedSlots中添加title的slot名稱,這裏直接把對應國際化詞條的完整路徑賦給它,爲什麼這麼做?繼續往下看:

我再給每一列添加一個名叫slotName的屬性,它的值也是對應國際化詞條的完整路徑。

接着在<a-table>組件中定義對應的slot,用來展示column的title。

這個時候,你會有個問題跑進你的腦子裏:

臥槽!這樣我還得在html中加入每一列的slot,因爲每個slot名稱都不一樣,這條html又要增加很多代碼了。

且慢,還記得上面我給每一列增加了一個slotName屬性嗎,而且它的值和title的slot name 是一樣的。

所以,一個循環就可以搞定了。請看:

<template v-for="(item, index) in columns" :slot="item.slotName">
   <span :key="index">{{ $t(item.slotName) }}</span>
</template>

每一列的slotName就是剛剛在columns中定義的slonName的值,而且這個值恰好又是該列的title對應的國際化詞條路徑,所以直接在這裏 $t(item.slotName) 就可以翻譯每一列的title了。

這個問題也就完美的解決了。

 

總結:

1,官方文檔要看仔細;

2,在一條路行不通的時候不一定非要糾結這條路錯在哪,往往可能就是這條路是不通的, 你再怎麼鑽牛角尖它也到不了你想到達的地方。也許你可以再修一條路彎過去,或者把被堵住的地方挖開,但是這樣的代價不一定你能承擔的。而且,往往就是你把障礙挖開了,接下來還有更多你沒想到的障礙。所以,及時的換一條路,可能就輕鬆的到達了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章