在用Drupal 7搭建新網站時,根據具體情況可以添加多語言及手機版,我記錄在博文《Drupal的多語言系列網站搭建和設置》中。
在對更早使用Drupal 6已經搭建起來的網站進行擴充添加多語言及手機版的時候,過程也類似,隻是稍微有些不同,下面我也記錄一下過程:
初期準備:
- 模塊:如果是系列網站,可以做一個統一的模塊,包含各站通用的block等,并且指定此模塊的翻譯文件,便于以後的翻譯更新;
- 翻譯:48種語言的翻譯文件統一做,覆蓋系列網站所需要的各種單詞、短語、句子,用l10n_update來導入、更新;
- 目錄:sites目錄下添加手機版站點目錄及settings.php文件,可以修改電腦版的settings.php,其中自行判斷網址來确定是否啟用nokia mobile皮膚,然後手機版目錄就隻需要軟鍊接到電腦版目錄;
- 模塊:設置模塊,關閉不需要的模塊,下載和安裝需要的模塊,特别是多語言支持所用的i18n及部分子模塊(最初是多數都打開,後來改為隻有需要的幾個打開)、l10n_update翻譯自動更新模塊、nokia mobile皮膚等,添加48種語言(一個站添加後,其它站複制其數據庫的languages表),都可以通過drush來進行設置;
- 緩存:可以關閉boost cache功能,以免添加50種語言後生成的緩存文件過多過大;
修改設置:
- 翻譯:可以将各個站不同的分類詞等翻譯做成一個po文件,目前主要是中文地名,導入翻譯庫,以後可以考慮每個站增加一個專門的模塊,對應專門的幾十種語言地名翻譯文件;
- 名稱:修改content type, content fields, vocabulary taxonomy裡面的name,将以前中英文雙語改為英文,以便翻譯能夠有效;
- 菜單:修改菜單設置,Home、Contact Us可以去掉,其它的盡量用views生成的,少用專門做的page;
- 查詢:修改views,将views名稱、标題、顯示字段的label都由中英文雙語改為英文,每行顯示數量、每頁顯示數量更加具體情況進行調整,以便手機版顯示清晰,header, footer根據需要來進行修改;
修改程序:
- 模闆:修改顯示模闆,可以将contemplate從數據庫轉移到磁盤文件的形式,在sites/xxx下創建contemplates目錄,放置node-typename-body.tpl.php,更改後便于保存曆史版本,注意手機版可以通過軟連接指向同一個模闆文件,在文件中再進行判斷、處理,改用磁盤文件方式後,電腦版、手機版都需要在後台管理頁面中刷新,以便contemplate更改生效;
- 首頁:修改首頁,去掉首頁網址别名,增加misson顯示,修改site information中的首頁鍊接為node/xxx,去掉Mission和Footer message内容;
- 區塊:修改block設置,電腦版、手機版中都顯示語言切換、電腦/手機切換,以前的header, footer改用統一模塊中的header, footer,對分類頁頂部、底部的block根據具體情況進行修改或替換,檢查電腦版、手機版的各種頁面顯示,根據需要來調整順序、是否需要添加頂部/底部廣告等;
網站地圖:
- 添加:檢查xml sitemap的設置,首頁更新周期從weekly改為monthly,最早的default改為en,然後添加其它的48種語言,這個添加的過程手工太慢,可以直接用phpMyAdmin修改數據庫中的xmlsitemap_sitemap表,用INSERT INTO `xmlsitemap_sitemap` (`smid`, `context`, `updated`, `links`, `chunks`, `max_filesize`) VALUES ('LZa-7jhy2SBG0FuW3jja03SHjgSZ8QIoG3AnsQoOmy8', 'a:1:{s:8:"language";s:2:"af";}', 0, 0, 0, 0),('LKmx_ZVMy7dOYfDz0RjgPeF1gGWia54MlPtIrVIOgjA', 'a:1:{s:8:"language";s:2:"cy";}', 0, 0, 0, 0);這樣的語句批量添加;
- 生成:用drush xmlsitemap-regenerate或者drush xmlsitemap-rebuild來重新生成49種語言的站點地圖;
- 提交:用程序調用google webmaster tools api提交站點地圖到webmaster tools中去,有電腦版、手機版共98個。
後續收尾:
- 跳轉:根據需要來修改.htaccess文件,實現自動判斷用戶終端類型,手持終端自動跳轉到手機版本;
- 鍊接:修改以前的博客文章(jamesqi.com)、各相關網站(youbianku.com)、各系列網站(postcodebase.com,mingluji.com,bizdirlib.com)的相關頁面,添加到多語言手機版的鍊接。
從上面的步驟來看,這個過程還是相當複雜的,做起來需要費不少時間,重點是做各種檢查:首頁、分類頁、views頁、内頁、菜單,電腦版、手機版,多種語言,頁面顯示内容、源代碼keywords/description、microdata等,這還隻是做多語言、手機版的擴展,更深入的各個站數據分析、優化排列導航等可以留待今後再進行,真是改進無止境啊!
评论3
英文以外的48種語言xmlsitemap添加代碼
在MySQL中直接執行以下代碼,以便快速添加:
INSERT INTO `xmlsitemap_sitemap` (`smid`, `context`, `updated`, `links`, `chunks`, `max_filesize`) VALUES ('LZa-7jhy2SBG0FuW3jja03SHjgSZ8QIoG3AnsQoOmy8', 'a:1:{s:8:"language";s:2:"af";}', 0, 0, 0, 0), ('R4VND5L097ddYE6wDXaN5Jl7CqlrRkI227laTrqdQzI', 'a:1:{s:8:"language";s:2:"sq";}', 0, 0, 0, 0), ('3QWhCTe7KQ0ZR-MqzkhYgq7PkekhXoahRK0-ktC9198', 'a:1:{s:8:"language";s:2:"ar";}', 0, 0, 0, 0), ('rEA7Ume326CMKb7huj3-iZNj8dgxwytUE_QKafGPoS8', 'a:1:{s:8:"language";s:2:"hy";}', 0, 0, 0, 0), ('_FuRjiXoiaiYVERsV6LaopM3QXdVIco8fTq4juua7dA', 'a:1:{s:8:"language";s:2:"az";}', 0, 0, 0, 0), ('Ws6Pk8Ccl-kGwmsqzRfJRYC5u0_rI4DDI11AQdPNhTY', 'a:1:{s:8:"language";s:2:"bg";}', 0, 0, 0, 0), ('aNkRiCzjfJQdg8nBocBcXhm1bm6WLTXsKRTh-yDHMc8', 'a:1:{s:8:"language";s:2:"ca";}', 0, 0, 0, 0), ('3QuYVMoAVDdMUmwuEdFhwSFxLtcBNDrxIy91p4VzGdY', 'a:1:{s:8:"language";s:7:"zh-hans";}', 0, 0, 0, 0), ('gNQigJ8V6aUMKO8U3wkd4y04rttp_RCe6uGO4kXyQnU', 'a:1:{s:8:"language";s:7:"zh-hant";}', 0, 0, 0, 0), ('igVpPQY_QVAMYlftsuIhWLnR9NOb52mZ9URjmMzBHqk', 'a:1:{s:8:"language";s:2:"hr";}', 0, 0, 0, 0), ('JqsSZ0ACA-VztmE3q054r5qUF8LYCLshZpXn9ZWOgYo', 'a:1:{s:8:"language";s:2:"cs";}', 0, 0, 0, 0), ('87mlCzCcgPXzQvm2qE3Is2lMA7b3UyFAJgnINaSi04Y', 'a:1:{s:8:"language";s:2:"da";}', 0, 0, 0, 0), ('VYOTF4bQdgrfTJyQddsbQTYCd13NBvx-ifXqmOhuH9w', 'a:1:{s:8:"language";s:2:"nl";}', 0, 0, 0, 0), ('I9T_cIxer-FMIaMXxRrx5-bnxgj16Z55dELZHsSb0SQ', 'a:1:{s:8:"language";s:2:"eo";}', 0, 0, 0, 0), ('4Cb0X8hFMUkO3ED6IxmWAWSWup0KInr0U1kPzHui9xY', 'a:1:{s:8:"language";s:2:"et";}', 0, 0, 0, 0), ('PYgq5vYzAuvYMcuKajN7voJEvUlYuPXv7goZjmMJ8Fk', 'a:1:{s:8:"language";s:2:"fi";}', 0, 0, 0, 0), ('2e9ZfIfLFCC0V-PbcDKUTb1Wk22XgjzJ6f-b16CFlPE', 'a:1:{s:8:"language";s:2:"fr";}', 0, 0, 0, 0), ('V6W10nlwnkf_N8uu4GwUpZ_dbf-e66z8IcMdkWyzUQM', 'a:1:{s:8:"language";s:2:"gl";}', 0, 0, 0, 0), ('FY_-EiR_oa31k2g2U3tQi1FdUv4LT0KDDxOamtSjyi8', 'a:1:{s:8:"language";s:2:"ka";}', 0, 0, 0, 0), ('oWx2Pl033k1XFmYJFOs7sO0G3JasH0cjDbduvDwKuwo', 'a:1:{s:8:"language";s:2:"de";}', 0, 0, 0, 0), ('XYbrhwAOg0sH5tuc45W4YgKnq1SObpmzxm9kN1Dy3QI', 'a:1:{s:8:"language";s:2:"el";}', 0, 0, 0, 0), ('Q-DnbT83L1sy4kAX_nYRCyT4AJOTpg30-XEPI1hmyNg', 'a:1:{s:8:"language";s:2:"hu";}', 0, 0, 0, 0), ('QLefgmOMHyi_NiinQJa9AKCQNccFfPrNIdRGIqQJXXo', 'a:1:{s:8:"language";s:2:"is";}', 0, 0, 0, 0), ('G11UQ93ugnrx9ZOPe8RHDN4OJ7uYSZCYtF9EOrlEQlA', 'a:1:{s:8:"language";s:2:"ga";}', 0, 0, 0, 0), ('o1lnqD7hynYmesOfRQVh_UIPswJqoj5Mjjb0krTsxBI', 'a:1:{s:8:"language";s:2:"it";}', 0, 0, 0, 0), ('4vXFu1xAuZ1nftmnnfowGaQ0yrARIcSvgyG5T7cqg04', 'a:1:{s:8:"language";s:2:"ja";}', 0, 0, 0, 0), ('zqY91BRIiHW3IzuCP7ygvlayDVv_LsCV3gx5oYyZM0c', 'a:1:{s:8:"language";s:2:"ko";}', 0, 0, 0, 0), ('2KhpMoaeN8AdO8hifieREj7vkzINMolX97tRzkIQ3BQ', 'a:1:{s:8:"language";s:2:"lv";}', 0, 0, 0, 0), ('kkE2MTArkFb4S-r2Nve1rlFEv86OTmedrSd0DhgfCtE', 'a:1:{s:8:"language";s:2:"lt";}', 0, 0, 0, 0), ('qaKz2M8Q1Hx-usBG6hz7uJXmOAF1PVvM3WmgLsQE62Y', 'a:1:{s:8:"language";s:2:"mk";}', 0, 0, 0, 0), ('ehIYDa6eZtWBG9ofuU3JJwe7ePsWdnOwkygkE_8UlIk', 'a:1:{s:8:"language";s:2:"ms";}', 0, 0, 0, 0), ('caOAq7WZXTCbDsMfG81QIbCf0bkLMDWBxOrYdWgeMMU', 'a:1:{s:8:"language";s:2:"mt";}', 0, 0, 0, 0), ('JujatUJ6eea9-3GLZFmBcT7CgN2qXYl-odpyftFpjYI', 'a:1:{s:8:"language";s:2:"fa";}', 0, 0, 0, 0), ('h_Rziqj_J13oB-imJ4qIG8ksKWXWZ_Hynp5POSsd07k', 'a:1:{s:8:"language";s:2:"pl";}', 0, 0, 0, 0), ('cJKZwij0C3MEWV1FN_hbRiNhXls614wbansVqEAuRc4', 'a:1:{s:8:"language";s:5:"pt-pt";}', 0, 0, 0, 0), ('GI3xOGu1J_C9ymceu4SPSzs6JE8tv61AEnpI3lzXVW0', 'a:1:{s:8:"language";s:2:"ro";}', 0, 0, 0, 0), ('_KyYVoP1pMRSEJD8cDQst9Nj-h1vo7ZVPnvdm5RCdy4', 'a:1:{s:8:"language";s:2:"ru";}', 0, 0, 0, 0), ('s0XnmLCtZcWgnQ7ZFew1Fhtbt9EQ38Ddg7J87BGJ2ys', 'a:1:{s:8:"language";s:2:"sr";}', 0, 0, 0, 0), ('40Vfh2LHqOFN8RF3OKzRCh_w_cwudpGkr0xa3V2yFqY', 'a:1:{s:8:"language";s:2:"sk";}', 0, 0, 0, 0), ('x6B8OtrKWrEaGY6P503gk4XvAlmc1lRjZsZKbrZZp2Y', 'a:1:{s:8:"language";s:2:"sl";}', 0, 0, 0, 0), ('t9UQ7FvqR0wMQMnd5n2XukH0kM9liAM9wOhfSLRl2qw', 'a:1:{s:8:"language";s:2:"es";}', 0, 0, 0, 0), ('7p_cwXvUFez4aPn5SewMmsgoJ2J6qRNN2mgf8hEe3mU', 'a:1:{s:8:"language";s:2:"sw";}', 0, 0, 0, 0), ('t16K-LvlM4dINVHfcxC__57flE1iMIVnUezIVBDDZfE', 'a:1:{s:8:"language";s:2:"sv";}', 0, 0, 0, 0), ('5x3-O5uUfArK1LK8i29anopPRkWTuhyFnzYWdcyBrso', 'a:1:{s:8:"language";s:2:"th";}', 0, 0, 0, 0), ('4t2LDT2-5kkWXwt0FTm6JNAFOdzcz7Fs55mzMuovLmc', 'a:1:{s:8:"language";s:2:"tr";}', 0, 0, 0, 0), ('T43qaxwUQWS5cOCpwG2tGLGOF5UzykA0K-mCFL6oRhs', 'a:1:{s:8:"language";s:2:"uk";}', 0, 0, 0, 0), ('uIMIDC5eEaw7jcWdnI3wjc67eo8miZwUihIKzFid2oA', 'a:1:{s:8:"language";s:2:"vi";}', 0, 0, 0, 0), ('LKmx_ZVMy7dOYfDz0RjgPeF1gGWia54MlPtIrVIOgjA', 'a:1:{s:8:"language";s:2:"cy";}', 0, 0, 0, 0); 另外一個bel中有的暫不加: ('Cnvxov87lqV5zVrYi_CjzUuzdaJJjXuMgGom6z2VYXo', 'a:1:{s:8:"language";s:2:"nb";}', 0, 0, 0, 0),插入languages表來添加48種語言
INSERT INTO `postcodebase_al`.`languages` (`language`, `name`, `native`, `direction`, `enabled`, `plurals`, `formula`, `domain`, `prefix`, `weight`, `javascript`) VALUES ('af', 'Afrikaans', 'Afrikaans', 0, 1, 2, '($n!=1)', '', 'af', 0, ''), ('sq', 'Albanian', 'Shqip', 0, 1, 2, '($n!=1)', '', 'sq', 0, ''), ('ar', 'Arabic', 'العربية', 1, 1, 6, '(($n==1)?(0):(($n==0)?(1):(($n==2)?(2):(((($n%100)>=3)&&(($n%100)<=10))?(3):(((($n%100)>=11)&&(($n%100)<=99))?(4):5)))))', '', 'ar', 0, ''), ('hy', 'Armenian', 'Հայերեն', 0, 1, 0, '', '', 'hy', 0, ''), ('az', 'Azerbaijani', 'azərbaycan', 0, 1, 2, '($n!=1)', '', 'az', 0, ''), ('bg', 'Bulgarian', 'Български', 0, 1, 2, '($n!=1)', '', 'bg', 0, ''), ('ca', 'Catalan', 'Català', 0, 1, 2, '($n>1)', '', 'ca', 0, ''), ('zh-hans', 'Chinese, Simplified', '簡體中文', 0, 1, 2, '($n!=1)', '', 'zh-hans', 0, ''), ('zh-hant', 'Chinese, Traditional', '繁體中文', 0, 1, 2, '($n>1)', '', 'zh-hant', 0, ''), ('hr', 'Croatian', 'Hrvatski', 0, 1, 3, '(((($n%10)==1)&&(($n%100)!=11))?(0):((((($n%10)>=2)&&(($n%10)<=4))&&((($n%100)<10)||(($n%100)>=20)))?(1):2))', '', 'hr', 0, ''), ('cs', 'Czech', 'Čeština', 0, 1, 3, '(((($n%10)==1)&&(($n%100)!=11))?(0):((((($n%10)>=2)&&(($n%10)<=4))&&((($n%100)<10)||(($n%100)>=20)))?(1):2))', '', 'cs', 0, ''), ('da', 'Danish', 'Dansk', 0, 1, 2, '($n!=1)', '', 'da', 0, ''), ('nl', 'Dutch', 'Nederlands', 0, 1, 2, '($n!=1)', '', 'nl', 0, ''), ('eo', 'Esperanto', 'Esperanto', 0, 1, 2, '($n!=1)', '', 'eo', 0, ''), ('et', 'Estonian', 'Eesti', 0, 1, 2, '($n!=1)', '', 'et', 0, ''), ('fi', 'Finnish', 'Suomi', 0, 1, 2, '($n!=1)', '', 'fi', 0, ''), ('fr', 'French', 'Français', 0, 1, 2, '($n!=1)', '', 'fr', 0, ''), ('gl', 'Galician', 'Galego', 0, 1, 2, '($n!=1)', '', 'gl', 0, ''), ('ka', 'Georgian', 'Georgian', 0, 1, 2, '($n!=1)', '', 'ka', 0, ''), ('de', 'German', 'Deutsch', 0, 1, 2, '($n!=1)', '', 'de', 0, ''), ('el', 'Greek', 'Ελληνικά', 0, 1, 2, '($n!=1)', '', 'el', 0, ''), ('hu', 'Hungarian', 'Magyar', 0, 1, 2, '($n!=1)', '', 'hu', 0, ''), ('is', 'Icelandic', 'Íslenska', 0, 1, 2, '($n!=1)', '', 'is', 0, ''), ('ga', 'Irish', 'Gaeilge', 0, 1, 0, '', '', 'ga', 0, ''), ('it', 'Italian', 'Italiano', 0, 1, 2, '($n!=1)', '', 'it', 0, ''), ('ja', 'Japanese', '日本語', 0, 1, 2, '($n!=1)', '', 'ja', 0, ''), ('ko', 'Korean', '한국어', 0, 1, 2, '($n!=1)', '', 'ko', 0, ''), ('lv', 'Latvian', 'Latviešu', 0, 1, 3, '(((($n%10)==1)&&(($n%100)!=11))?(0):(($n!=0)?(1):2))', '', 'lv', 0, ''), ('lt', 'Lithuanian', 'Lietuvių', 0, 1, 3, '(((($n%10)==1)&&(($n%100)!=11))?(0):(((($n%10)>=2)&&((($n%100)<10)||(($n%100)>=20)))?(1):2))', '', 'lt', 0, ''), ('mk', 'Macedonian', 'Македонски', 0, 1, 2, '((($n==1)||(($n%10)==1))?(0):1)', '', 'mk', 0, ''), ('ms', 'Malay', 'Bahasa Melayu', 0, 1, 2, '($n!=1)', '', 'ms', 0, ''), ('mt', 'Maltese', 'Malti', 0, 1, 0, '', '', 'mt', 0, ''), ('fa', 'Persian', 'فارسی', 1, 1, 2, '($n!=1)', '', 'fa', 0, ''), ('pl', 'Polish', 'Polski', 0, 1, 3, '(($n==1)?(0):((((($n%10)>=2)&&(($n%10)<=4))&&((($n%100)<10)||(($n%100)>=20)))?(1):2))', '', 'pl', 0, ''), ('pt-pt', 'Portuguese, Portugal', 'Português', 0, 1, 2, '($n!=1)', '', 'pt-pt', 0, ''), ('ro', 'Romanian', 'Română', 0, 1, 3, '(($n==1)?(0):((($n==0)||((($n%100)>0)&&(($n%100)<20)))?(1):2))', '', 'ro', 0, ''), ('ru', 'Russian', 'Русский', 0, 1, 3, '(((($n%10)==1)&&(($n%100)!=11))?(0):((((($n%10)>=2)&&(($n%10)<=4))&&((($n%100)<10)||(($n%100)>=20)))?(1):2))', '', 'ru', 0, ''), ('sr', 'Serbian', 'Српски', 0, 1, 3, '(((($n%10)==1)&&(($n%100)!=11))?(0):((((($n%10)>=2)&&(($n%10)<=4))&&((($n%100)<10)||(($n%100)>=20)))?(1):2))', '', 'sr', 0, ''), ('sk', 'Slovak', 'Slovenčina', 0, 1, 3, '(($n==1)?(0):((($n>=2)&&($n<=4))?(1):2))', '', 'sk', 0, ''), ('sl', 'Slovenian', 'Slovenščina', 0, 1, 4, '((($n%100)==1)?(0):((($n%100)==2)?(1):(((($n%100)==3)||(($n%100)==4))?(2):3)))', '', 'sl', 0, ''), ('es', 'Spanish', 'Español', 0, 1, 2, '($n!=1)', '', 'es', 0, ''), ('sw', 'Swahili', 'Kiswahili', 0, 1, 0, '', '', 'sw', 0, ''), ('sv', 'Swedish', 'Svenska', 0, 1, 2, '($n!=1)', '', 'sv', 0, ''), ('th', 'Thai', 'ภาษาไทย', 0, 1, 2, '($n!=1)', '', 'th', 0, ''), ('tr', 'Turkish', 'Türkçe', 0, 1, 0, '', '', 'tr', 0, ''), ('uk', 'Ukrainian', 'Українська', 0, 1, 3, '(((($n%10)==1)&&(($n%100)!=11))?(0):((((($n%10)>=2)&&(($n%10)<=4))&&((($n%100)<10)||(($n%100)>=20)))?(1):2))', '', 'uk', 0, ''), ('vi', 'Vietnamese', 'Tiếng Việt', 0, 1, 0, '', '', 'vi', 0, ''), ('cy', 'Welsh', 'Cymraeg', 0, 1, 4, '(($n==1)?(0):(($n==2)?(1):((($n!=8)&&($n!=11))?(2):3)))', '', 'cy', 0, '');不用上面的MySQL插入表辦法,而是在Drush中運行PHP的辦法如下:
LA=(af sq ar hy az bg ca zh-hans zh-hant hr cs da nl eo et fi fr gl ka de el hu is ga it ja ko lv lt mk ms mt fa pl pt-pt ro ru sr sk sl es sw sv th tr uk vi cy) for j in "${LA[@]}";do echo language: $j $d cc all # $d ev "include_once '\/usr\/local\/apache2\/htdocs\/drupal\.youbianku\.com\/includes\/locale\.inc';" $d ev "echo 'j is $j \n';locale_add_language('$j');" done避免Nokia Mobile過濾Javascript的問題
最近在進行多語言擴展的時候,手機版的語言選擇Language Switcher Drop Down是有的,但卻不跳轉,檢查了很長時間,其實2年前就有類似這樣的問題,當時是修改sites/all/themes/nokia_mobile/template.php來去掉判斷的,這次再這樣設置就可以了,唉白白又浪費了N多個小時!