如何在JSF中實現會話層級的本地化,而不是每個請求/視圖層級的選定區域設定記憶
P粉360266095
2023-08-22 21:30:42
<p><code>faces-config.xml</code>:</p>
<pre class="brush:php;toolbar:false;"><application>
<locale-config>
<default-locale>ru</default-locale>
<supported-locale>ua</supported-locale>
</locale-config>
</application></pre>
<p>在一個bean的動作方法中,我按照以下方式改變當前視圖的語言環境:</p>
<pre class="brush:php;toolbar:false;">FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale("ua"));</pre>
<p>問題是<code>ua</code>語言環境只應用於請求/視圖,而不適用於會話。在同一會話中的另一個請求/視圖會將語言環境重設為預設的<code>ru</code>值。 </p>
<p>如何將語言環境應用於會話? </p>
我看到問題也跟.properties檔名有關。 Java的Locale程式碼(小寫)如:en_gb 但由Netbeans自動產生的Locale是小寫_大寫,例如:messages_en_GB.properties 將其改為:messages_en_gb.properties 然後它應該能夠正常工作 - 如果你已經嘗試了一切
您需要將選擇的區域設定儲存在會話範圍內,並在兩個位置設定它:一次是透過
UIViewRoot#setLocale()
立即在變更區域設定後(這將更改當前視圖根的區域設置,從而在後續請求中反映出來;如果之後執行重定向,則此部分是不必要的),以及一次在<f:view>
的locale
屬性中(這將在後續請求/視圖中設定/保留區域設定)。這是一個
LocaleBean
應該如何看起來的範例:這是視圖應該如何看起來的範例:
這假設
#{text}
已在faces-config.xml
中配置如下:請注意,
<html lang>
對於JSF的功能並不是必要的,但對於搜尋引擎的解釋頁面是強制性的。否則,它可能會被標記為重複內容,這對SEO來說是不好的。另請參閱: