Tommy 碎碎念

Tommy Wu's blog

« 上一篇 | 下一篇 »

Gallery 3 中文修正 part 1
post by tommy @ 14 十二月, 2011 18:59

Gallery 這軟體很奇怪, 每次改版就是一個全新的程式, 基本上與上一個版本可以當做是完全不同的程式來看待. 據作者的說法, 當初 Galley 2 的出現, 是為了解決在 Gallery 1 上頭的問題.... 而 Gallery 2 看起來是一個很成功的軟體.... 除了整個系統過於肥大之外, 應該也沒什麼缺點. 不過.... 作者還是開發了 Gallery 3, 而且這次的開發應該不太順利吧, 因為由一開始的 beta 到最後正式版的發行, 經過了好幾年. 而且.... 雖然正式版推出了不算短的時間, 整個 Gallery 3 用起來, 我覺得應該還算在 beta 階段吧.... 與 Gallery 2 比起來, 除了用了一些 AJAX 的技巧外, 在功能面上完全比不上舊的 Gallery 2.

如果 Gallery 2 用的還滿意的人, 建議先不要考慮 Gallery 3 吧, 等 3.1 (或 3.2 再來看看). 如果你決定使用 Gallery 3, 那, 這篇與後續的幾篇有關 Gallery 的文章, 應該會對你有些用處.

雖然在 Gallery 2 中, 也不支援使用中文的路徑與檔案名稱, 不過, 至少程式會幫你轉換 (基本上就是把非英文的字改成 _ 來使用), 所以使用者完全不需要知道要怎麼處理中文的檔名, 只要檔案丟上去, 不合法的字元都會被轉換.

不過, 在 Gallery 3 可就不一樣了, 雖然整個 Gallery 3 內部是使用 utf-8 字元在處理.... 不過, 對於非英文的路徑與檔名, 反而不能正常來處理. 動不動就是因為這問題所造成的錯誤. 當然, 解決的方法可以跟使用者說, 不要用非英文的路徑或檔名就可以了, 不過.... 總不如在 Gallery 2 中使用的方便.

接著, 就是我個人對於 Galley 3 與中文有關的相關修正 (有提交給 Gallery 的 team.... 不過由以往的經驗, 我總覺得他們對別人提出的 patch 似乎接受度都不高, 常看到有些明顯的修正在 TRAC 上頭, 但是一直都沒有被收入 git 中... 連新版本推出都不包含, 例如... 刪除 server_add 的路徑設定), 如果你有這個需求, 可以參考看看.

這是 part 1, 那表示還會有 part 2. 其中的分別在於, part 1 會完全轉換非英文的字元到英文字元上 (可能有意義, 也可能變成完全無意義的英文字串, 要看有沒有裝 Transliterate 模組, 有的話會轉成該字的拼音), 如果你的系統本身是不支援 setlocale() 的, 或不支援 utf-8 字元集的檔名與路徑 (我沒在 Windows 下試過, 不過我想 Windows 應該算是這類的系統) 的話, 那就應該只能使用這一篇裡頭的修正方式.

如果你的系統可以用 utf-8 字元集 (多數的 unix-like 的作業系統都可以), 而你也想直接使用中文的檔名或路徑的話, 那可以使用 part 2 裡頭的修正方式 (不過在使用 Gallery Remote 時, 若使用中文的路徑可能會有問題).

這個修正分成三個部份, 首先是相簿的路徑處理:

--- gallery3.orig/modules/gallery/controllers/albums.php  2011-05-25 12:04:04.000000000 +0800
+++ gallery3/modules/gallery/controllers/albums.php 2011-12-13 21:24:08.024116380 +0800
@@ -90,10 +90,24 @@
$album->type = "album";
$album->parent_id = $parent_id;
$album->name = $form->add_album->inputs["name"]->value;
+ // twu2 begin
+ // avoid non-english name
+ $album->name = item::convert_filename_to_slug($album->name);
+ if ($album->name == '')
+ $album->name = 'album'.strftime("%Y%m%d%H%M%S").'-'.rand();
+ // twu2 end
$album->title = $form->add_album->title->value ?
$form->add_album->title->value : $form->add_album->inputs["name"]->value;
$album->description = $form->add_album->description->value;
$album->slug = $form->add_album->slug->value;
+ // twu2 begin
+ // also copy from name if slug is empty
+ $album->slug = item::convert_filename_to_slug($album->slug);
+ if ($album->slug == '')
+ $album->slug = $album->name;
+ // convert for title
+ $album->title = item::convert_filename_to_title($album->title);
+ // twu2 end
$album->validate();
} catch (ORM_Validation_Exception $e) {
// Translate ORM validation errors into form error messages

會把不合法的字元轉換, 如果是空的就用目前的時間與亂數產生一個,  同樣 slug (這我弄不清為什麼, 實際使用上, 效果似乎與直接使用 name 一樣, 不過... slug 這欄位是真的完全不允許出現不合法的字元) 也是一樣的處理. 至於檔名, 似乎本身就會有轉換.

接著, 如果你有使用 Gallery Remote (搭配 remote 模組), 則必須做這個修正 :

diff -Nur gallery3.orig/modules/remote/controllers//gallery_remote.php gallery3/modules/remote/controllers//gallery_remote.php
--- gallery3.orig/modules/remote/controllers//gallery_remote.php 2011-06-29 15:47:43.000000000 +0800
+++ gallery3/modules/remote/controllers//gallery_remote.php 2011-12-13 22:28:07.253406060 +0800
@@ -181,6 +181,12 @@
$name = trim($input->post('newAlbumName'));
$title = trim($input->post('newAlbumTitle'));
$desc = trim($input->post('newAlbumDesc'));
+ // twu2 begin
+ // for non-english name, it might be '' from GR, so we need to change it
+ if ($name == '')
+ $name = item::convert_filename_to_slug($title);
+ if ($name == '') $name = 'album'.strftime('%Y%m%d%H%M%S').'-'.rand();
+ // twu2 end
 
if($album=='0') $parent = item::root();
else $parent = ORM::factory("item")->where("slug", "=", $album)->find();
@@ -192,13 +198,17 @@
 
$album->name = $name;
$album->slug = item::convert_filename_to_slug($name); // <= verification fails if this property has not been set!!!
+// twu2 begin
+ if ($album->slug == '')
+ $album->slug = item::convert_filename_to_slug(base64_encode($name)); // <= verification fails if this property has not been set!!!
+ $title = item::convert_filename_to_title($title);
+// twu2 end
$album->title = $title;
$album->title or $album->title = $album->name;
$album->description = $desc;
$album->view_count = 0;
$album->sort_column = 'weight';
$album->sort_order = 'ASC';
-
try {
$album->validate();
 
@@ -274,7 +284,27 @@
else if($userfilename!='') $filename = $userfilename;
else $filename = $_FILES['userfile']['name'];
 
- $slug = $filename;
+ // twu2 begin
+ // fix for non-english name?
+ if (strchr($filename, '?') !== false) {
+ // non english name?
+ $name = $title;
+ $ext = '';
+ $pos = strrpos($title, '.');
+ if ($pos !== false) {
+ $ext = substr($title, $pos);
+ $name = substr($title, 0, $pos);
+ }
+ $xname = item::convert_filename_to_slug($name);
+ if ($xname === '') {
+ $xname = 'photo'.strftime("%Y%m%d%H%M%S").'-'.rand();
+ }
+ $filename = $xname.$ext;
+ }
+ $slug = item::convert_filename_to_slug($filename);
+ if ($slug == '') $slug = item::convert_filename_to_slug(base64_encode($filename));
+ // $slug = $filename;
+ // twu2 end
$pos = strpos($slug, '.');
if($pos!==false)
$slug = substr($slug, 0, $pos);
@@ -285,7 +315,11 @@
$item->parent_id = $parent->id;
$item->set_data_file($_FILES['userfile']['tmp_name']);
$item->name = $filename;
- $item->slug = item::convert_filename_to_slug($slug);
+ // twu2 begin
+ // we already convert it
+ $item->slug = $slug;
+ //$item->slug = item::convert_filename_to_slug($slug);
+ // twu2 end
$item->mime_type = $type;
$item->title = $title;
$item->title or $item->title = ' '; //don't use $item->name as this clutters up the UI

會把由 Gallery Remote 送來的相簿路徑與相片檔名做轉換.

最後是在 Gallery 3 新的 REST API 部份 (有新的程式如:  rWatcher) 的修正:

--- gallery3.orig/modules/gallery/helpers/item_rest.php  2011-05-25 12:04:04.000000000 +0800
+++ gallery3/modules/gallery/helpers/item_rest.php 2011-12-13 22:23:38.098584827 +0800
@@ -159,9 +159,22 @@
$item->type = "album";
$item->parent_id = $parent->id;
$item->name = $entity->name;
+ // twu2 begin
+ // avoid non-english name
+ $item->name = item::convert_filename_to_slug($item->name);
+ if ($item->name == '')
+ $item->name = 'album'.strftime("%Y%m%d%H%M%S").'-'.rand();
+ // twu2 end
$item->title = isset($entity->title) ? $entity->title : $entity->name;
$item->description = isset($entity->description) ? $entity->description : null;
$item->slug = isset($entity->slug) ? $entity->slug : null;
+ // twu2 begin
+ // copy from name if empty
+ $item->slug = item::convert_filename_to_slug($item->slug);
+ if ($item->slug == '')
+ $item->slug = $item->name;
+ $item->title = item::convert_filename_to_title($item->title);
+ // twu2 end
$item->save();
break;
 
@@ -175,9 +188,34 @@
$item->parent_id = $parent->id;
$item->set_data_file($request->file);
$item->name = $entity->name;
+ // twu2 begin
+ // avoid non-english name
+ $name = $item->name;
+ $ext = '';
+ $pos = strrpos($item->name, '.');
+ if ($pos !== false) {
+ $ext = substr($item->name, $pos);
+ $name = substr($item->name, 0, $pos);
+ }
+ $item->name = item::convert_filename_to_slug($name);
+ if ($item->name == '') {
+ if ($item->type == 'photo')
+ $item->name = 'photo'.strftime("%Y%m%d%H%M%S").'-'.rand();
+ else
+ $item->name = 'movie'.strftime("%Y%m%d%H%M%S").'-'.rand();
+ }
+ $item->name .= $ext;
+ // twu2 end
$item->title = isset($entity->title) ? $entity->title : $entity->name;
$item->description = isset($entity->description) ? $entity->description : null;
$item->slug = isset($entity->slug) ? $entity->slug : null;
+ // twu2 begin
+ // copy from name if empty
+ $item->slug = item::convert_filename_to_slug($item->slug);
+ if ($item->slug == '')
+ $item->slug = item::convert_filename_to_slug($item->name);
+ $item->title = item::convert_filename_to_title($item->title);
+ // twu2 end
$item->save();
break;

同樣會把經由 REST 送來的相簿路徑與相片檔名做轉換.

經過這樣子的處理, 雖然在實際上, 在路徑與檔名都完全沒有使用中文, 不過, 使用者完全不用知道後端的處理, 對他們來說, 只要上傳時可以直接用中文, 不用先去轉換就可以了.

PS. 需要 patch 的, 文章內容抓下的如果不能用, 請去 Galley trac 網站去下載吧.

Del.icio.us Furl HEMiDEMi Technorati MyShare
迴響
暱稱:
標題:
個人網頁:
電子郵件:
authimage

迴響

  

Bad Behavior 已經阻擋了 60 個過去 7 天試圖闖關的垃圾迴響與引用。
Power by LifeType. Template design by JamesHuang. Valid XHTML and CSS