摘要:國際化和本地化完成了博客引擎后,我們來考慮額外的一件事應用的國際化和語言的本地化。國際化和本地化我們將分兩步討論,先是國際化,再是本地化。實際上,兩者是同步進行的你在國際化的同時,往往也是在本地化。
國際化和本地化
完成了博客引擎后,我們來考慮額外的一件事:Web應用的國際化和語言的本地化。雖然我們可以一開始就做這件事,但是最好還是先完成該應用的單一語言版本,然后再添加其他語言的支持。
國際化和本地化我們將分兩步討論,先是國際化,再是本地化。這兩樣都會被重點提及。
國際化,在編程領域中,指的是移除本地特定的代碼。在Web應用中,基本上是修改模板中特定于語言的交互文本。它還包括修改非文本的數(shù)據(jù)類型:日期,貨幣和其他數(shù)字。
本地化,是打造應用的本地版本。如果應用已經國際化了,就意味著存在一個或多個可選的本地版本。在Web應用中,本地化主要是把交互文本翻譯成特定的語言。這里的“特定語言”,取決于瀏覽器和應用自己的設置。
實際上,兩者是同步進行的:你在國際化的同時,往往也是在本地化。
YABE我們此次的起點,是在Play安裝包的samples-and-tests/yabe中的已完成版本。目標是徹底國際化應用,然后添加簡體中文的本地版本。(我擅自修改了教程的內容 :D )
現(xiàn)在開始吧。首先打開conf/application.conf,去除注釋或添加一行來支持兩種語言:
# 為英文,簡體中文本地化 application.langs=en,zh_CN
如果你現(xiàn)在啟動應用,Play命令行會顯示兩個Warning,因為你還沒準備好本地信息文件:
16:19:04,728 WARN ~ Messages file missing for locale en 16:19:04,729 WARN ~ Messages file missing for locale zh_CNUTF-8 信息文件
前面的警告提醒我們需要把現(xiàn)有的conf/messages文件替換成每個語言對應一個信息文件:
messages.en messages.zh_CN
在這里,我們遇到跟一般在Java中的做法不一樣的地方。這些文件用的語法跟Java properties文件一樣,但它們不是properties文件,因為它們需要使用UTF-8編碼。而Java properties文件使用的是Latin-1編碼。
使用UTF-8進行編碼能夠給本地化帶來很多的好處。這使得你可以用純文本記錄下本地化信息。比如,這意味著對于希臘本地化文本,原本需要:
hello.morning = u0152u222bu0152u00b1u0152u00aau0152u2211u0152u00bau0152u2260u0153u00c5u0152u00b1 hello.informal = u0152u2265u0152u00b5u0152u03c0u0152u00b1 u0153u00c9u0152u00f8u0153u00d6
現(xiàn)在只需直接使用希臘字母:
hello.morning = καλημ?ρα hello.informal = γεια σου
在本教程剩余部分,我們會在上述文件中定義信息,或在HTML模板中使用國際化標記。
簡單的信息最簡單的情況是HTML模板中被包含起來的一條文本字符串。舉個例子,在yabe/app/views/main.html模板內的tools列表中:
僅需使用&{"key"}語法,把該文本替換成待查找的信息,就能實現(xiàn)國際化:
添加對應的行到每個信息文件,就能實現(xiàn)本地化。在conf/messages.en:
views.main.tools.login = Log in to write something
在conf/messages.zh_CN:
views.main.tools.login = 寫點什么
具體的內容由你來定;在這個例子中,我使用了一個鍵來標記位置views/main.html#tools
一旦保存了更改,刷新一下,應該可以看到原本的英文文本變成中文了。這是因為請求中設定了Accept-Language為zh-CN的緣故。
應用模型的本地化如果登錄進博客的"admin"頁面,你就能看到文章,標簽,評論和用戶的列表。這些頁面是CRUD模塊的功勞。對于每個頁面,標題和列表頭是與應用的模型,比如JavaBean類和屬性名,聯(lián)系在一起的。
我們可以使用這些模型的名字作為信息鍵,來國際化CRUD模塊。就跟前面做的一樣:
在conf/messages.zh_CN
post = 文章 Post = 文章 posts = 文章列表 Posts = 文章列表 comment = 評論 Comment = 評論 comments = 評論列表 Comments = 評論列表 user = 用戶 User = 用戶 users = 用戶列表 Users = 用戶列表
你將注意到那些圓角的紫色導航鏈接沒有改變:
它們是在views/admin.html中定義的,通過用&{"..."}把文本包圍起來,你就能把它們國際化:
&{"Posts"} … &{"Tags"} … &{"Comments"} … &{"Users"}帶參數(shù)的信息
除了字面量字符串,我們的應用還包括帶有變量的信息,比如posts tagged with Play。
對于帶單個參數(shù)的字符串,用Java格式化字符串來插入參數(shù):
views.Application.listTagged.title = Posts tagged with %s
接著在模板中,添加這樣的參數(shù):
&{"views.Application.listTagged.title", tag}
當一個信息包括多個參數(shù)時,在格式化字符串中添加索引來指定參數(shù)順序:
views.Admin.index.welcome = Welcome %1$s, you have written %2$s posts so far
……然后就是這樣:
&{"views.Admin.index.welcome", user, posts.size()}
在這個例子中,我們想要使用“post”的正確的復數(shù)形式,所以也把這個詞當做一個參數(shù):
views.Admin.index.welcome = Welcome %1$s, you have written %2$s %3$s so far
然后在模板中使用pluralize拓展:
&{"views.Admin.index.welcome", user, posts.size(), posts.pluralize(messages.get("post"), messages.get("posts"))}
注意我們需要使用messages.get來查找對應的單數(shù)和復數(shù)形式。
對模型層的本地化對Play模型的本地化就跟對其他地方的本地化一樣。這個應用使用到了CRUD和Secure模塊,意味著我們需要本地化play/modules/crud/conf/messages和play/modules/secure/conf/messages中的用到的信息。
在conf/messages.zh_CN:
# play/modules/crud (administration) crud.title = 管理面板 crud.home = 主頁 crud.blank = 新增功能 crud.index.title = 選擇編輯對象 crud.index.objectType = 輸入對象 crud.index.action = crud.index.add = 添加 crud.add = &{%s} 添加 crud.list.title = &{%s} crud.list.size = %d &{%s} crud.list.totalSize = %d 總計 crud.pagination.previous = ? 上一頁 crud.pagination.next = 下一頁 ? crud.pagination.last = 末頁 ?? crud.pagination.first = ?? 首頁 crud.show.title = &{%s} 編輯 crud.save = 保存 crud.saveAndContinue = 保存并繼續(xù)編輯 crud.cancel = 取消 crud.hasErrors = 請更正錯誤 crud.blank.title = &{%s} 添加 crud.saveAndAddAnother = 保存并新增 crud.delete = &{%s} 刪除 crud.created = &{%s} 已創(chuàng)建 crud.saved = &{%s} 已保存 crud.deleted = &{%s} 已刪除 crud.delete.error = 此對象無法刪除 crud.search = 搜索 crud.none = (無) crud.help.required = 必填 crud.help.minlength = 至少要有 %d. crud.help.maxlength = 最多只能是 %d. crud.help.email = 需要有效郵箱 crud.help.dateformat = 時間格式 YYYY-MM-DD crud.help.numeric = 需要數(shù)值類型 crud.help.min = 至少需要 %d crud.help.future = 在將來 crud.help.past = 在之前 crud.help.after = 之上 %s. crud.help.before = 之下 %s. crud.help.range = 從 %d 到 %d # play/modules/secure secure.username = 您的郵箱: secure.password = 您的密碼: secure.signin = 馬上登錄特殊情況
當你在本地化一個Web應用時,假如你正在使用一個基于組件的Web應用框架,比如JavaServer Faces,難免會遇到一些難以下手的地方:
在屬性的值中用到了參數(shù)信息
格式化字符串中的信息
用作信息的鏈接
在Play里,這三點都不是問題。
第一種情況,你在模板的屬性的值里用到了參數(shù)信息,比如:
這是JSF的一個問題,因為通常需要使用XML標簽來完成參數(shù)替換,而不能直接在屬性值里完成。在Play中,你可以直接這么寫:
第二種情況是在想要使用格式化字符串來排版一個值,比如用參數(shù)拼出By Bob on 2009-06-14這樣的日期格式。這又是由于使用XML標簽來格式化所導致的問題。本來如果能使用一個XML屬性的值來排版,就能解決這個問題。在Play中,由于傳遞信息參數(shù)的語法不一樣,你不會遇到這樣的問題。你可以:
&{"views.tags.display.author", _post.author.fullname, comment.postedAt.format("yyyy-MM-dd")}"}
你也可以這樣寫:
&{"views.tags.display.author", _post.author.fullname, comment.postedAt.format(messages.get("views.dateFormat"))}"}
第三種情況發(fā)生在你想把一個特定信息作為超鏈接的時候。在JSF,這是一個問題。因為超鏈接是一個JSF組件,意味著它的標記不能放在信息文件中。Play,正好相反,允許你在模板中使用原生HTML,所以你可以把用于URL的參數(shù)直接放入帶信息的標記中:
logIn = Log in to write something &{"logIn", "/admin"}
我們應用就曾用這樣的語法會讓框架生成基于路由文件的URL。要想在本地化的過程中處理它,使用:
&{"logIn"}, actionBridge.Admin.index()}最終成果
來看下我們給“Yet Another Blog Engine”進行本地化(漢化)的結果。
其實沒有漢化完全,對吧……(╯▽╰)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64092.html
摘要:確保你的文本編輯器已經做了相應的配置。第一個,會自動監(jiān)測源代碼的改變并在運行時自動重載。檢查下面的一行是否出現(xiàn)在應用日志中使用版本控制系統(tǒng)來追蹤變化當你開發(fā)一個項目時,最好使用版本控制系統(tǒng)來存儲你的源代碼。 Play是一個Java Web敏捷開發(fā)的框架http://www.playframework.com/documentation/1.2.7/home 之所以要翻譯這個教程,是因...
摘要:通過來實現(xiàn)一個基本的管理面板目前,我們還沒法使用博客的來寫新的文章,或修改評論。提供了一個即開即用的模塊,可以快速生成一個基本的管理面板。這是因為默認是以的輸出來得到一個模型對象的表示。在本教程的最后一章,你會學到關于本地化信息的更多東西。 通過CRUD來實現(xiàn)一個基本的管理面板 目前,我們還沒法使用博客的UI來寫新的文章,或修改評論。Play提供了一個即開即用的CRUD模塊,可以快速...
摘要:對的詳細配置已經超出了本教程的范圍,但大體上看上去像這樣然后在中加入下面一行,讓本地的反向代理能夠連接上你的應用這才只是個開始如果一路上你一直跟著本教程,你應該已經懂得如何開發(fā)一個應用了。 部署應用 如今我們已經完成了博客引擎了。讓我們來看一下一些部署Play應用的步驟。 定義一個框架ID 一般,你需要部署你的應用到一臺跟開發(fā)時不一樣的電腦。這臺電腦(很有可能是臺服務器)上面的P...
摘要:設置驗證碼任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。然后我們修改表單來顯示驗證碼,并把寫入隱藏的域里面。檢查驗證碼功能是否完成了。 設置驗證碼 任何人都可以在我們的博客下發(fā)布評論,所以我們需要避免非人類用戶來擾亂秩序。一個簡單的防范方法是設置驗證碼。 生成驗證碼 如何利用Play框架來生成驗證碼?簡單來說,我們需要增...
摘要:瀏覽和提交評論博客主頁現(xiàn)在已經完成,接下來要完成博客正文頁面。整個頁面將展示當前文章的所有評論,還包括一個用于提交新的評論的表單。刷新瀏覽器,檢查這次是否使用了正確的。給模板添加表單在后面試下提交新的評論。 瀏覽和提交評論 博客主頁現(xiàn)在已經完成,接下來要完成博客正文頁面。整個頁面將展示當前文章的所有評論,還包括一個用于提交新的評論的表單。 創(chuàng)建show action 要顯示文章內...
閱讀 2382·2021-11-24 10:26
閱讀 2582·2021-11-16 11:44
閱讀 1699·2021-09-22 15:26
閱讀 3570·2021-09-10 11:11
閱讀 3185·2021-09-07 10:25
閱讀 3624·2021-09-01 10:41
閱讀 1008·2021-08-27 13:11
閱讀 3505·2021-08-16 11:02