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

Tra loi 28 comment(s) changtraingheo 2007-09-05 08:58:45

cocbay 2007-09-05 09:17:38

Chỉ còn cách, hỏi khách hàng: "Bây giờ anh có bao nhiu ngôn ngữ cần thêm nữa?", sao đó làm bấy nhiu cái textbox, textarea, và table trong database.
Thòng thêm 1 câu: "Đừng làm khổ tui nữa, huhuhuhuh...".

Tra loi

changtraingheo 2007-09-05 09:21:37

ọc, cũng đang tính nói nó là làm thủ công thôi, khi nào muốn thêm ngôn ngữ thì nói, để sửa code, chứ làm như thế thì khả năng ko làm được

Tra loi

cocbay 2007-09-05 09:22:56

Đâu phải lúc nào "Khách hàng là Thượng Đế" ?...
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

Vậy sao changtraingheo kô làm thêm trường chứa thông tin của ngôn ngữ đó. Ví dụ thêm trường language vào, chứa nội dung là vietnamese cho tiếng việt, english cho tiếng anh,... cái này thì cùng 1 tin cho 2 ngôn ngữ thì buộc phải nhập 2 lần thôi.

@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

hổng đơn giản xí nào, dĩ nhiên là phải tạo ra một trường chứa thông tin của ngôn ngữ, nhưng mỗi lần thêm ngôn ngữ, thì phải đồng thời tạo thêm 2 field trên bản tin tức nữa, rồi phải ký hiệu như thế nào để phân biệt bài viết nào thuộc ngôn ngữ nào, rồi lúc phải đếm có nhiêu field trong bảng title, rồi show form nhập liệu, rồi phân biệt dữ liệu nào thuộc ngôn ngữ nào nữa, nói chung lung tung ben, cầm cây viét ngồi vẻ sơ đồ ko được, chắc bỏ cái này quá, dễ bị điên

Tra loi

HQ 2007-09-05 11:17:16

Tôi có cách xử lý thế này, tôi đã làm và thấy cũng ổn, changtraingheo xem có thể ứng dụng được ko.
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

Ví dụ table News như vầy News(id,title,content,language).

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

Có thể bạn HQ nói rất có lý, chỉ cần xử lý JS để hiển thị số textbox, textarear theo mong muốn của khác hàng.
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

Mình ko hiểu lắm ý của cocbay. Vì từ trước giờ chủ yếu mình làm song ngữ là English và tiếng Việt. Mình ko hiểu tiếng Đức, Pháp, .... thì có gì khác (hihih, thông cảm chưa có kinh nghiệm). Có nhất thiết mình phải import các bộ gõ kèm theo ko?
cocbay có thể nói rõ hơn ko?

Tra loi

changtraingheo 2007-09-05 03:46:54

đã hiểu được phần nào cách của HQ roài, để thử xem sao

Tra loi

G.K 2007-09-07 03:13:59

Dễ mà
- 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

Vấn đề bình thường vậy mà sao phải phóng đại hóa nó lên nhỉ? Cái đó chỉ là xử lý charset lúc nhập dữ liệu thôi. Anh, Việt thì không thành vấn đề, nhưng thêm Đức, Nga vào thì phải phân rõ giữa iso,windows-1215 và utf-8

Tra loi

Trần Huỳnh Anh Đức 2007-09-29 02:17:10

Minh xu ly the nay trong database minh tao ra nhieu table va cau truc cung nhu ten cot giong nhau chi khac nhau ve ten bảng. Khi import mot ngon ngu thi tu dong tao ra mot table voi kien truc nhu vay. Cu vay tren url ta su dung GET voi lang =? va ta se co mot table langue khi nguoi ta muon them language va tu do kiem soat duoc. Rui dua theo lang =? tren url ta se quyet dinh save vao table nao. Con form de nhap thong tin chi la mot form duy nhat. va dua tren url do ma ta chi viec doi thong tin theo ngon ngu do. Do la cach giai quyet cho nhieu ngon ngu cua minh. >8 ngon ngu. neu ai co canh giai quyet hay gop y minh nhe YM: ducsinh_software@yahoo.com

Tra loi

TG 2007-09-29 08:46:26

Với cách này dữ liệu của bạn sẽ có dung lượng năng hơn và code sẽ nhiều hơn

Tra loi

hanhxh 2007-10-12 08:48:17

Đây là cách thiết kế với n ngôn ngữ của mình mà không mất nhiều công sức để code:

CREATE TABLE `languages` (
  `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ụ :

CREATE TABLE `news` (
  `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

Dùng luôn mã quốc gia luôn chi tiện us, vn, tạo chi thêm table nữa.

Tra loi

changtraingheo 2007-10-13 08:45:57

thanks mọi người nhiều, mình đã thấu hiểu ^^

Tra loi

GnuhNguyen 2007-11-28 11:39:26

uh, việc gi phải tạo thêm table language nữa làm chi, tốn công lắm connect ra connect vào. trong table new thì thêm cái field language ký hiệu us, vn, fr đi.

Tra loi

hehe 2007-12-17 06:32:00

Kiếm cái CMS free nào đó kiểu gì chả có chức năng đa ngôn ngữ
Tự code có gãy tay à

Tra loi

changtraingheo 2007-12-17 08:18:21

Kiếm cái CMS free nào đó kiểu gì chả có chức năng đa ngôn ngữ
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

các bài thảo luận đã có từ năm trước rồi :D
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

Hi Đỗ Nam Khánh ơi, trong CSDL bạn chỉ cần cho một trườn lang để quản lý ngôn ngữ thôi, bạn có thể dùng sesion để quản lý ngôn ngữ lúc đó khi đang ở tiếng việt thì trường lang= vi còn khi ở tiếng anh thì lang=en giả sử như vậy

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

Mình có một ý kiến như thế này:
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

Hehe...lâu rồi mới vào xem lại bài viết này.
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

chào bạn changtraingheo!

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

Cho tui góp chút ý kiến nhá.
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