Một bài toán khó ?? 2007-09-05 08:58:45
Hiện tại giờ, mình đang gặp một khó khăn như sau, khách hàng kêu là trong phần admin á, là phải có chức năng Quản Lý Ngôn Ngữ trên website, tuy nhiên không chỉ đơn giản là thêm và add. Ví dụ như table News chẳng hạn, có cấu trúc sau:
news(id,newsname_VN,content_VN);
+ Bảng này đối với website có một ngôn ngữ là Việt Nam, Khi show mục viết tin tức, thì dựa vào số ngôn ngữ hiện có trên website, show ra, ví dụ như có thêm ngôn ngữ English nữa, thì phải show 2 textbox, 1 cái nhập tiếng việt, một cái nhập tiếng anh, và 2 cái TEXTAREA 1 cái nhập tiếng việt, một cái nhập tiếng anh. Nói chung phứt tạp quá, nghỉ rối bời lên, ai đã có kinh nghiệm vụ này rồi, xin cho biện pháp
news(id,newsname_VN,content_VN);
+ Bảng này đối với website có một ngôn ngữ là Việt Nam, Khi show mục viết tin tức, thì dựa vào số ngôn ngữ hiện có trên website, show ra, ví dụ như có thêm ngôn ngữ English nữa, thì phải show 2 textbox, 1 cái nhập tiếng việt, một cái nhập tiếng anh, và 2 cái TEXTAREA 1 cái nhập tiếng việt, một cái nhập tiếng anh. Nói chung phứt tạp quá, nghỉ rối bời lên, ai đã có kinh nghiệm vụ này rồi, xin cho biện pháp
Tra loi 28 comment(s) 2007-09-05 08:58:45
cocbay 2007-09-05 09:17:38
Thòng thêm 1 câu: "Đừng làm khổ tui nữa, huhuhuhuh...".
Tra loi
changtraingheo 2007-09-05 09:21:37
Tra loi
cocbay 2007-09-05 09:22:56
Họ làm khó cho bạn thì bạn có cách trả lời, đừng làm theo ý của họ, nếu chạy theo mấy anh í thì có nước chít thui. Nếu bạn sợ bị đuổi việc, qua bên tui làm ok.
Tra loi
e-learning 2007-09-05 10:31:41
@cocbay: ông làm cty nào vậy? trong hcm hay hà nội vậy?
Tra loi
changtraingheo 2007-09-05 10:43:50
Tra loi
HQ 2007-09-05 11:17:16
Tôi thiết kế DB như sau:
tb_language(id, name,....)
tb_news(id,image,...)
tb_news_laguage(newsID, languageID, title, content).
Dữ liệu mẫu như sau :
tb_language :
ID Name
+ 1 vietnam
+ 2 English
tb_news :
ID Image
+ 1 test1.gif
+ 2 test2.gif
tb_news_language :
newsID languageID title content
1 1 Tiêu đề 1 VN Nội dung 1 VN
1 2 Tiêu đề 1 EN Nội dung 1 EN
2 1 Tiêu đề 2 VN Nội dung 2 TV
2 2 Tiêu đề 2 EN Nội dung 2 EN
Đến đây thì changtraingheo hiểu ý tưởng của mình rồi chứ. Chắc là truy vấn ok thôi ha.
Còn việc show form nhập liệu cũng đơn giản thôi. changtraingheo chỉ cần khai như sau cho text box va tương tự cho textarea
<input type="text" name="title[{languageID}]"></td>
Khi vào form nhập liệu mình cần truy vấn xem trong tb_language có bao nhiêu ngôn ngữ. Có bao nhiêu ngôn ngữ nó sẽ tự động lên bấy nhiêu text box mà ko cần phải thêm trong thiết kế. Như ví dụ trên thì nó sẽ lên 2 text box như sau :
<input type="text" name="title[1]"></td>
<input type="text" name="title[2]"></td>
Mình làm được rồi, nhưng trình bày hơi vụng về, nếu ko hiểu changtraingheo cứ cho ý kiến
Chúc thành công!
Tra loi
e-learning 2007-09-05 11:19:27
Giờ nhập liệu thì chỉ cần 1 selectbox để chọn ngôn ngữ nào thôi. Nếu chọn ngôn ngữ Anh thì trường language sẽ chứa english, nếu chọn Việt thì language chứa vietnamese.
Việc show ra cho user xem thì mình chỉ cần lưu cái session là ngôn ngữ gì thôi, rồi select cái tin tương ứng ngôn ngữ đó ra.
Lưu ý: Tin cùng 1 nội dung có 2 ngôn ngữ sẽ như 2 tin khác nhau vì ta cần phải nhập liệu 2 lần, mỗi lần 1 ngôn ngữ.
Đây là trường hợp giải quyết của mình cho đa ngôn ngữ (thông thường là > 2), vì nếu 2 thì xài cách trên được rồi.
Tra loi
cocbay 2007-09-05 01:21:17
Nếu họ đòi tiếng Đức, Tiếng Pháp, Tiếng Somali thì chắc tiêu, còn phải import các bộ gõ kèm theo.... Vậy thì chết Chàng Trai Nghèo là cái chắc...
@e-learning: làm ở HCM, www.timnhanh.com
Tra loi
HQ 2007-09-05 03:06:11
cocbay có thể nói rõ hơn ko?
Tra loi
changtraingheo 2007-09-05 03:46:54
Tra loi
G.K 2007-09-07 03:13:59
- Tạo thêm 1 table để ghi nhớ loại ngôn ngữ.
- Trong database thì table lưu tin tức thêm phần đánh dấu loại ngôn ngữ (anh, việt, pháp, đức ...), cái này lấy lúc nhập liệu từ bảng loại ngôn ngữ.
- Ngoài main site thì khi select ngôn ngữ thì nó sẽ chọn loại tin tương ứng từ database ra. Menu ngôn ngữ sẽ load từ bảng loại ngôn ngữ đã tạo ở trên.
- Kết hợp cái này dùng chung luôn cho ngôn ngữ của website, chỉ khác là thay vì truy vấn database thì main site sẽ chọn cái file language tương ứng. (file này tạo thử công upload lên hoặc dùng database quản lý )
+ Nếu truy vấn ko tồn tại loại ngôn ngữ cần thiết thì lúc đó sẻ trã về loại ngôn ngữ default do mình quy định.
Đây là 1 cách cơ bản trong nhiều cách làm dạng tin đa ngôn ngữ mà vẫn động ( có thể chủ động thêm ngôn ngữ cho site)
Cách này do mình nghĩ ra do hồi trước có 1 khách hàng cũng yêu cầu tương tự. Khi truy vấn cũng ko mất quá nhiều thời gian đối với database tin tức lớn. Nhanh hay chậm là do cách bạn xử lý câu query.
Hy vọng vài cái cơ bản này giúp bạn giải quyết đc vấn đề !
Tra loi
toiyeuphp 2007-09-08 01:54:08
Tra loi
Trần Huỳnh Anh Đức 2007-09-29 02:17:10
Tra loi
TG 2007-09-29 08:46:26
Tra loi
hanhxh 2007-10-12 08:48:17
`idlanguages` tinyint(4) NOT NULL auto_increment,
`languages` varchar(127) NOT NULL default '',
`pseudo` varchar(31) NOT NULL default '',
`description` tinytext NOT NULL default '',
`ordering` tinyint(4) NOT NULL default '0',
`public` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`idlanguages`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `languages` (`idlanguages`, `languages`, `pseudo`, `description`, `ordering`, `public`) VALUES
(1, 'Vietnam', 'vn', 0, '', 1),
(2, 'English', 'en', 0, '', 1);
Đây la table ngôn ngữ, tất cả những table đòi hỏi ngôn ngữ chỉ cần thêm fields idlanguages la ok, ví dụ :
`idnews` int(11) NOT NULL auto_increment,
`idlanguages` tinyint(4) NOT NULL default '1',
`idnewstype` tinyint(4) NOT NULL default '0',
`title` varchar(150) NOT NULL default '',
`intro` text NOT NULL,
`detail` text NOT NULL,
`imageurl` varchar(150) default NULL,
`titleimage` varchar(150) default NULL,
`ordering` tinyint(4) NOT NULL default '0',
`created` datetime NOT NULL default '0000-00-00 00:00:00',
`public` tinyint(1) NOT NULL default '1',
PRIMARY KEY (`idnews`),
KEY `idlanguages` (`idlanguages`),
KEY `idnewstype` (`idnewstype`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
--
-- Dumping data for table `news`
--
INSERT INTO `news` (`idnews`, `idlanguages`, `idnewstype`, `title`, `intro`, `detail`, `imageurl`, `titleimage`, `ordering`, `created`, `public`) VALUES
(1, 2, 1, 'V-cam', '', '', '', 0, '2007-10-03 16:33:05', 1),
(2, 2, 1, '', 'sgc_t1191405064_aP6d.jpg', 'Hình minh há»a', 0, '2007-10-03 17:48:58', 1);
hay có thể thêm fields languages để luu những cái pseudo như VN, EN, FR,...
Tra loi
toiyeuphp 2007-10-12 05:48:31
Tra loi
changtraingheo 2007-10-13 08:45:57
Tra loi
GnuhNguyen 2007-11-28 11:39:26
Tra loi
hehe 2007-12-17 06:32:00
Tự code có gãy tay à
Tra loi
changtraingheo 2007-12-17 08:18:21
Tự code có gãy tay à
hiểu bài viết nói gì hông phát biểu linh tinh thế, nhớ đọc kỉ bài viết trước khi trả lời nhé
Tra loi
donamkhanh 2008-03-10 03:28:32
Với các yêu cầu view bình thường thì không sao nhưng các bạn vẫn chưa tính đến các trường hợp user...lười nhập dữ liệu. Họ sẽ yêu cầu những trường dùng chung (trường lưu ảnh bản tin chẳng hạn) thì chỉ cần nhập 1 lần:
- Ta lại phải join thêm bảng nữa?
- Xài wysiwyg editor tron intro content, nhúng luôn ảnh (mã HTML trong đó) :D
- ...
Tra loi
Nguyễn Văn Ngọc 2009-03-02 01:41:16
lúc bạn lọc csdl cũng gọi như vậy
Tra loi
Nguyễn Minh Hiếu - Fullsoft4vn.com 2009-03-20 10:34:21
Trong table chứa các article, bạn tạo 1 row là VN_CONTENT, 1 row nữa là EN_CONTENT. (Thêm cả cái tiêu đề VN và EN nữa nhé)
Trong Admincp chỉnh lại code cho thêm một phần viết tiếng anh:
<input type="text" name="EN_TITLE" size="20" value="{EN_TITLE}" />
<textarea name="VN_CONTENT" cols="30" rows="5">{VN_CONTENT}</textarea>
.....
Còn ở frontend thì cho 1 câu lệnh switch ($_POST[LANG]) {
EN:
echo ("SQL[EN_CONTENT]");
break;
VI:
echo ("SQL[VN_CONTENT]");
break;
default:
echo ("SQL[VN_CONTENT]");
break;
Ý tưởng là như thế chứ mình mới học php đc 1-2 tuần, chưa biết gì nhiều. Mình chỉ tham khảo 1 số source code thôi.
Chúc bạn thành công !
P/S: Nếu khách hàng đòi như thế thì phải thêm $$ chứ.
Tra loi
donamkhanh 2009-05-08 12:27:45
Hồi đó nhìn ở tầm nhìn khác, thấy nó cũng bình thường.
Giờ mới thấy cái việc localization khoai thật.
@gnuhnguyen: bạn ko tạo bảng language thì khi bạn cần thay đổi ngôn ngữ (thêm mới/sửa) thì bạn làm thế nào?
Tra loi
dunghp 2010-04-15 11:21:37
mình cũng đã tham khảo nhiều site đa ngôn ngữ và mình xin có ý tưởng giúp bạn như sau:
1,chắc chắn là bạn phải thiết kế lại db rồi và db có cấu trúc như sau:
+ bảng language (lang_id,lang_code,name);
+ bảng news(new_id,cat_id,title,content,image,lang_code,createdate,modifiedate);
vd dữ liệu mẫu
bảng language (1,'VI','Viet Nam');(2,'EN','English');...
bảng news(1,1,'tin tức','tin tức việt nam','img1.jpg','VI','2010-15-04 10:24:35','2010-15-04 10:24:35');
(2,1,'news','news viet nam','img1.jpg','EN','2010-15-04 10:24:35','2010-15-04 10:24:35')
2,trong phần quản trị admin bạn có thể thiết kế cho nhiều ô textbox, textarea một lúc tùy theo số ngôn ngữ(cái này không khó lắm chỉ cần query trong bảng language xem có bao nhiêu rows thì tạo ra bấy nhiêu thôi) nhưng theo mình không nên làm theo cách đó mà mình chỉ thiết kế một textbox, và một textarea thôi nhưng thêm một cái select nữa, cái select sẽ lấy dữ liệu từ bảng language và nó hiện các laguage cho bạn chọn, khi bạn chọn language nào thì nhập tin cho language đó. đến đây chắc bạn đã hiểu ý mình.
ngoài ra bạn có thể làm thêm một phần quản trị ngôn ngữ nữa, còn không thì add trực tiếp vào db.
có điều gì thắc mắc bạn có thể pm cho mình : dunghp58@yahoo.com
@chúc bạn thành công!
Tra loi
tinapc 2010-04-15 08:10:05
Máy pác nói thì cũng được đấy nhưng nhìn qua cách của các bạn tui thấy có một vấn đề mà các bạn không nhận ra, Đó là nếu làm theo cách của các bạn thì chẳng lẽ khi bạn thêm tin hay update thì IdNews sẽ khác (Vì filed id là auto mà - nó tự động tăng lên), chính vì vậy khi bạn show data ra frontend thì Id sẽ khác nhau - làm sao mà hiển thị đúng với record mình muốn lấy được - Nếu như theo cách của các bạn thì rõ ràng là các bạn làm 2 site riêng biệt rồi. Tôi thấy cách của HQ cũng hay đấy
Tra loi
Y kien