5

Tôi đã đấu tranh với điều này trong một thời gian. Một CMS của tôi đã sẵn sàng để được mở rộng với một mô-đun dịch. Tôi đã suy nghĩ về các phương pháp khác nhau nhưng chưa tìm ra cách tốt nhất cho đến nay.Cách tốt nhất để dịch nội dung dựa trên cơ sở dữ liệu

Về cơ bản tôi có CMS sử dụng hệ thống mẫu để phân tích tất cả dữ liệu từ cơ sở dữ liệu sang màn hình. Tôi đã cho đến nay để "chia nhỏ" các mẫu của tôi trong các thư mục khác nhau để có thể dịch những thứ "tĩnh" như hình ảnh có văn bản, liên kết chân trang, v.v.

Tuy nhiên, có nhiều mô-đun (trang, tin tức, sản phẩm) có nhiều trường yêu cầu phải dịch một phương pháp cơ sở dữ liệu. Tôi bắt đầu với một bảng "ngôn ngữ" mô tả ngôn ngữ (id, iso_code, name). Đó là như xa như tôi đã đến .. vì có một vài dự án đã được thực hiện tôi đã không dành nhiều thời gian hơn cho chủ đề này cho đến nay. Ý tưởng đầu tiên của tôi ("sửa chữa nhanh") là thêm nhiều trường bên trong các bảng (chẳng hạn như "title_nl", "title_en"), nhưng điều này thực sự làm cho cơ sở dữ liệu đông đúc hơn là cần thiết theo ý kiến ​​của tôi.

Suy nghĩ thứ hai của tôi là tạo bảng, "news_translations" chẳng hạn. Trong đó có mã iso ngôn ngữ, một news_id, các lĩnh vực yêu cầu dịch thuật. Rõ ràng là news_id kết nối bản dịch với bản gốc và mã iso ngôn ngữ được sử dụng để lấy đúng ngôn ngữ từ cơ sở dữ liệu. Sau đó, trong mã front-end của tôi trước tiên tôi sẽ kiểm tra xem ngôn ngữ mặc định được chọn (=> chọn từ bảng "tin tức") hay bản dịch (=> kiểm tra bên trong bảng dịch). Nếu trường hợp thứ 2 không trả lại bất kỳ kết quả nào, thông báo sẽ hiển thị "Rất tiếc, không có bản dịch có sẵn" và mặc định được hiển thị (hoặc thông báo lỗi, điều gì phù hợp nhất với khách hàng ..).

Nhưng sau đó có tùy chọn thứ 3 .. tất cả các trang web của tôi đều sử dụng các liên kết thân thiện với công cụ tìm kiếm (www.domain.com/pagename/ hoặc www.domain.com/news/1-news-item-here.html). Sẽ tốt hơn nếu tôi có khả năng "ghi đè" URL SEF trong bảng dịch của tôi. Nhưng tôi đoán trong trường hợp này tôi sẽ luôn luôn cần thêm 1 truy vấn vào bảng dịch (vì trước tiên chúng tôi muốn kiểm tra một trang dịch) ... đoán nó không phải là một vấn đề lớn, nhưng đáng xem xét tôi đoán.

Cuối cùng tôi đoán bằng cách mô tả các tùy chọn số 3 là những gì tôi cần. Nhưng tôi cũng muốn có một số ý kiến ​​khác về chủ đề này! Đây là những gì tôi đang cố gắng để đạt được:

  • Tạo một hệ thống với sự hỗ trợ đa ngôn ngữ
  • Không tập tin ngôn ngữ (rõ ràng đây là lý do tại sao tôi sử dụng các mẫu)
  • Có khả năng dịch một trang gốc/newsitem CMS/sản phẩm
  • tùy ý: để thay đổi URL SEF theo ngôn ngữ

tôi nghĩ tùy chọn 3 có tất cả điều này .. vì vậy các bước để tạo ra giải pháp này là:

  1. Tạo một bảng _translation cho từng hạng mục (hoặc có lẽ ngay cả trong gốc bằng cách thêm 2 lĩnh vực mới 'translation_to' (chứa PrimaryKey) và 'translation_is' (chứa mã ISO) - tuy nhiên .. trong trường hợp đó tất cả các lĩnh vực sẽ cần phải được chỉnh sửa (mà không phải lúc nào cũng cần cần thiết .. cộng với việc tạo ra một bảng thứ hai, tôi giữ nguyên bản gốc chia với bản dịch của họ, phải không?)

  2. Nếu ngôn ngữ mặc định KHÔNG được chọn truy vấn đầu tiên, bản dịch để tìm bản dịch, nếu một bản dịch được tìm thấy, hãy hiển thị bản dịch . Nếu không, hãy thông báo/lỗi cho người dùng và/hoặc hiển thị văn bản gốc (dựa trên URL SEF ... nếu SEF không được tìm thấy trong bản dịch hoặc bảng gốc, thì hiển thị chỉ một lỗi ).

Mọi đề xuất? :-)

Cảm ơn bạn đã suy nghĩ cùng!

+0

Bạn đang cố gắng dịch nội dung hoặc hệ thống (CMS)? –

+0

Xin lỗi nếu điều đó không rõ ràng. Tôi đang cố dịch nội dung! CMS bằng tiếng Anh, nếu điều đó phải thay đổi tại một thời điểm nhất định, tôi sẽ sử dụng bảng dịch dựa trên khóa. Vì đó là nhiều khả năng chỉ là những từ hoặc câu đơn giản :) –

Trả lời

0

Tôi muốn xem cấu trúc bảng của bạn trông như thế nào. Có lẽ điều tốt nhất bạn có thể làm là tạo hai bảng mới riêng biệt có tên là "CONTENT_MULTI_LANG" & "SITE_LOCALES".

Sau đó, trong mã in nội dung của bạn thực hiện kiểm tra ban đầu cho cờ ngôn ngữ. Tôi muốn tạo hai lớp riêng biệt để tải nội dung tĩnh, chẳng hạn như "Content_LoadStandard" và "Content_LoadMultiLang". Vì vậy, sau đó điều kiện của bạn sẽ trông như thế này.

if ($this->site_locale == 'standard'){ 
    $contentLoader = new Content_LoadStandard(); 
} else { 
    $contentLoader = new Content_LoadMultiLang($this->site_locale); 
} 

$content->blah($cheese); 

của bạn "CONTENT_MULTI_LANG" bảng phải là một phiên bản thu hẹp của bảng đối tượng CMS tiêu chuẩn của bạn, chỉ chứa các lĩnh vực nội dung liên quan (s) mà cần phải được trong ngôn ngữ thay thế.

// PSEUDO SQL 
    CREATE TABLE `LOCALE` (
     `id` int(11), 
     `locale` varchar(16), // name of locale (language) 
     ...    // any other fields 
) 

    CREATE TABLE `CONTENT_MULTI_LANG` (
     `id` int(11), 
     `pcid` int(11), // parent content id 
     `lid` medint(), // locale id 
     `content` {$type}, // whatever type you use (varchar, text, bin, etc) 
     ...    // any other fields 
) 

Trong Content_LoadMultiLang lớp học của bạn, tạo ra các phương pháp để truy vấn nội dung thay thế bằng cách sử dụng tham gia.

MIPO: Có thể là một ý tưởng tốt để thiết lập các mối quan hệ trong bảng của bạn để thực hiện xóa tầng trên các hàng nội dung, theo cách đó nếu bạn xóa nội dung theo chuẩn, các phiên bản đa ngôn ngữ của bạn cũng sẽ bị xóa.

+0

Đây là những gì tôi đã suy nghĩ về thực sự. Mặt trước là (chưa được) thực hiện trong các lớp học - Tôi biết nó xấu, nhưng đó là lý do tại sao nó đơn giản của tôi CMS haha ​​:). Cảm ơn vì đầu vào của bạn! –

0

Từ những gì tôi đã thấy từ Drupal, tùy chọn ba là cách họ xử lý nó, với một vài điều chỉnh. Họ giữ tất cả trong một bảng và một lĩnh vực được gọi là ngôn ngữ. Sau đó, có một bảng riêng biệt ánh xạ các mục được kết nối.

Cách này là ngôn ngữ chính không thuyết phục, có nghĩa là nội dung có thể được tạo bằng bất kỳ ngôn ngữ nào mà không yêu cầu bản dịch ở bất kỳ ngôn ngữ nào khác.

+0

Đoạn cuối cùng của bạn thú vị để ghi nhớ thực sự! Tôi đã không thực sự nghĩ về điều đó .. tuy nhiên nó cũng giống như việc thêm một tham số ngôn ngữ vào nội dung trong bảng "cơ bản" của nó và sau đó thêm một bản dịch bằng bất kỳ ngôn ngữ nào khác. Nhưng ý tưởng là rõ ràng và đó là một cách tốt để làm điều đó như thế. –

+0

Cân nhắc xem nó có phù hợp với bạn không. Nội dung Drupals (nút) được tách riêng khỏi điều hướng, vì vậy việc thêm nội dung không dẫn đến menu được tạo. Tôi đã thấy các hệ thống ở nơi khác (ví dụ như CMS), nơi bạn tạo trang cụ thể trong cấu trúc cây, dựa trên cấu trúc cây, chúng tự động tạo điều hướng.Hệ thống thứ hai yêu cầu một ngôn ngữ chính, vì nó được sử dụng để xác định trình đơn và cấu trúc trang. Bạn có thể tải xuống và cài đặt hai hệ thống này và xem xét cấu trúc DB của họ, nó có thể giúp đưa ra quyết định thiết kế cuối cùng của bạn. –

+0

Jep, đã làm điều đó. Nhưng không có menu tự động nào cho đến nay và nếu nó đang được xây dựng, nó sẽ không sử dụng bảng trang. Chỉ cần một bảng tùy chỉnh để thêm khả năng liên kết đến các mô-đun aswel. –

Các vấn đề liên quan