Tôi đã đấu tranh với câu hỏi này trong một vài tháng nay, nhưng tôi đã không ở trong một tình huống mà tôi cần phải khám phá tất cả các lựa chọn có thể trước đây. Ngay bây giờ, tôi cảm thấy như đã đến lúc tìm hiểu các khả năng và tạo ra sở thích cá nhân của riêng mình để sử dụng trong các dự án sắp tới của mình.
Trước tiên hãy để tôi phác họa tình huống tôi đang tìm kiếm
Tôi sắp nâng cấp / phát triển lại một hệ thống quản lý nội dung mà tôi đã sử dụng khá lâu rồi. Tuy nhiên, tôi cảm thấy đa ngôn ngữ là một cải tiến tuyệt vời cho hệ thống này. Trước đây tôi không sử dụng bất kỳ khuôn khổ nào nhưng tôi sẽ sử dụng Laraval4 cho dự án sắp tới. Laravel dường như là sự lựa chọn tốt nhất về cách viết mã PHP sạch hơn. Sidenote: Laraval4 should be no factor in your answer
. Tôi đang tìm kiếm những cách dịch chung chung là độc lập với nền tảng / khung.
Những gì nên được dịch
Vì hệ thống tôi đang tìm kiếm cần phải thân thiện với người dùng nhất có thể, phương pháp quản lý bản dịch phải nằm trong CMS. Không cần thiết phải khởi động kết nối FTP để sửa đổi các tệp dịch hoặc bất kỳ mẫu phân tích cú pháp html / php nào.
Hơn nữa, tôi đang tìm cách dễ nhất để dịch nhiều bảng cơ sở dữ liệu có lẽ mà không cần phải tạo thêm bảng.
Tôi đã nghĩ ra cái gì
Như tôi đã tìm kiếm, đọc và thử mọi thứ bản thân mình. Có một vài lựa chọn tôi có. Nhưng tôi vẫn không cảm thấy như mình đã đạt được một phương pháp thực hành tốt nhất cho những gì tôi thực sự đang tìm kiếm. Ngay bây giờ, đây là những gì tôi nghĩ ra, nhưng phương pháp này cũng có tác dụng phụ.
- Các mẫu được phân tích cú pháp PHP: hệ thống mẫu nên được phân tích cú pháp bởi PHP. Bằng cách này, tôi có thể chèn các tham số đã dịch vào HTML mà không cần phải mở các mẫu và sửa đổi chúng. Ngoài ra, các mẫu được phân tích cú pháp PHP cung cấp cho tôi khả năng có 1 mẫu cho trang web hoàn chỉnh thay vì có thư mục con cho mỗi ngôn ngữ (mà tôi đã có trước đây). Phương pháp để đạt được mục tiêu này có thể là Smarty, TemplatePower, Laravel's Blade hoặc bất kỳ trình phân tích cú pháp mẫu nào khác. Như tôi đã nói điều này nên độc lập với giải pháp bằng văn bản.
- Cơ sở dữ liệu hướng dẫn : có lẽ tôi không cần phải đề cập đến điều này một lần nữa. Nhưng giải pháp nên được điều khiển cơ sở dữ liệu. CMS hướng đến đối tượng và MVC, vì vậy tôi cần nghĩ về cấu trúc dữ liệu logic cho các chuỗi. Vì các mẫu của tôi sẽ được cấu trúc: samples / Controller / View.php có lẽ cấu trúc này sẽ có ý nghĩa nhất :
Controller.View.parameter
. Bảng cơ sở dữ liệu sẽ có các trường này dài với mộtvalue
trường. Trong các mẫu chúng ta có thể sử dụng một số phương thức sắp xếp nhưecho __('Controller.View.welcome', array('name', 'Joshua'))
và tham số chứaWelcome, :name
. Do đó, kết quả làWelcome, Joshua
. Đây có vẻ là một cách tốt để làm điều này, bởi vì các tham số như: tên rất dễ hiểu bởi trình soạn thảo. - Tải cơ sở dữ liệu thấp : Tất nhiên hệ thống trên sẽ gây ra tải tải cơ sở dữ liệu nếu các chuỗi này đang được tải khi đang di chuyển. Do đó, tôi sẽ cần một hệ thống lưu trữ bộ nhớ lại kết xuất lại các tệp ngôn ngữ ngay khi chúng được chỉnh sửa / lưu trong môi trường quản trị. Bởi vì các tập tin được tạo ra, cũng cần một bố trí hệ thống tập tin tốt. Tôi đoán chúng ta có thể đi với
languages/en_EN/Controller/View.php
hoặc .ini, bất cứ điều gì phù hợp với bạn nhất. Có lẽ một .ini thậm chí còn được phân tích cú pháp nhanh hơn cuối cùng. Fould này nên chứa dữ liệu trongformat parameter=value;
. Tôi đoán đây là cách tốt nhất để làm điều này, vì mỗi Chế độ xem được hiển thị có thể bao gồm tệp ngôn ngữ của chính nó nếu nó tồn tại. Các tham số ngôn ngữ sau đó nên được tải vào một chế độ xem cụ thể chứ không phải trong phạm vi toàn cầu để ngăn các tham số ghi đè lên nhau. - Bảng dịch cơ sở dữ liệu : thực tế đây là điều tôi lo lắng nhất. Tôi đang tìm cách tạo bản dịch Tin tức / Trang / v.v. càng nhanh càng tốt. Có hai bảng cho mỗi mô-đun (ví dụ
News
vàNews_translations
) là một tùy chọn nhưng cảm giác cần nhiều công việc để có được một hệ thống tốt. Một trong những điều tôi đã đưa ra được dựa trên mộtdata versioning
hệ thống tôi đã viết: có một tên bảng cơ sở dữ liệuTranslations
, bảng này có một sự kết hợp độc đáo củalanguage
,tablename
vàprimarykey
. Ví dụ: en_En / Tin tức / 1 (Tham khảo phiên bản tiếng Anh của mục Tin tức có ID = 1). Nhưng có hai nhược điểm rất lớn đối với phương pháp này: trước hết bảng này có xu hướng khá dài với nhiều dữ liệu trong cơ sở dữ liệu và thứ hai sẽ là một công việc tồi tệ khi sử dụng thiết lập này để tìm kiếm bảng. Ví dụ: tìm kiếm slug SEO của mục sẽ là một tìm kiếm toàn văn, khá là ngu ngốc. Nhưng mặt khác: đó là một cách nhanh chóng để tạo ra nội dung có thể dịch được trong mỗi bảng rất nhanh, nhưng tôi không tin rằng chuyên gia này vượt trội so với con lừa. - Front-end Work : Ngoài ra front-end sẽ cần một số suy nghĩ. Tất nhiên, chúng tôi sẽ lưu trữ các ngôn ngữ có sẵn trong cơ sở dữ liệu và (kích hoạt) các ngôn ngữ chúng tôi cần. Bằng cách này, tập lệnh có thể tạo ra một danh sách thả xuống để chọn ngôn ngữ và phần cuối có thể tự động quyết định bản dịch nào có thể được thực hiện bằng CMS. Ngôn ngữ được chọn (ví dụ en_EN) sau đó sẽ được sử dụng khi lấy tệp ngôn ngữ để xem hoặc để có bản dịch đúng cho một mục nội dung trên trang web.
Vì vậy, họ có. Ý tưởng của tôi cho đến nay. Chúng thậm chí không bao gồm các tùy chọn bản địa hóa cho ngày, v.v., nhưng vì máy chủ của tôi hỗ trợ PHP5.3.2 + tùy chọn tốt nhất là sử dụng tiện ích mở rộng intl như được giải thích tại đây: http -php-53 / - nhưng điều này sẽ được sử dụng trong bất kỳ sân vận động phát triển nào sau này. Bây giờ vấn đề chính là làm thế nào để có những thông lệ tốt nhất về dịch thuật nội dung trong một trang web.
Ngoài mọi thứ tôi đã giải thích ở đây, tôi vẫn còn một điều nữa mà tôi chưa quyết định, nó có vẻ như là một câu hỏi đơn giản, nhưng thực tế nó đang khiến tôi đau đầu:
Dịch URL? Có nên làm điều này hay không? và theo cách nào?
Vì vậy, nếu tôi có url này: http://www.domain.com/about-us
và tiếng Anh là ngôn ngữ mặc định của tôi. URL này có nên được dịch sang http://www.domain.com/over-ons
khi tôi chọn tiếng Hà Lan làm ngôn ngữ của mình không? Hoặc chúng ta nên đi con đường dễ dàng và chỉ cần thay đổi nội dung của trang hiển thị tại /about
. Điều cuối cùng dường như không phải là một tùy chọn hợp lệ bởi vì điều đó sẽ tạo ra nhiều phiên bản của cùng một URL, việc lập chỉ mục nội dung này sẽ không đúng cách.
Một lựa chọn khác là sử dụng http://www.domain.com/nl/about-us
thay thế. Điều này tạo ra ít nhất một URL duy nhất cho mỗi nội dung. Ngoài ra, điều này sẽ dễ dàng hơn để đi đến một ngôn ngữ khác, ví dụ http://www.domain.com/en/about-us
và URL được cung cấp dễ hiểu hơn cho cả khách truy cập Google và Con người. Sử dụng tùy chọn này, chúng ta sẽ làm gì với các ngôn ngữ mặc định? Ngôn ngữ mặc định có nên loại bỏ ngôn ngữ được chọn theo mặc định? Vì vậy, chuyển hướng http://www.domain.com/en/about-us
đến http://www.domain.com/about-us
... Trong mắt tôi đây là giải pháp tốt nhất, bởi vì khi CMS được thiết lập chỉ cho một ngôn ngữ thì không cần phải có nhận dạng ngôn ngữ này trong URL.
Và tùy chọn thứ ba là sự kết hợp từ cả hai tùy chọn: sử dụng "không nhận dạng ngôn ngữ" -URL ( http://www.domain.com/about-us
) cho ngôn ngữ chính. Và sử dụng URL với một con sên SEO được dịch cho các ngôn ngữ con: http://www.domain.com/nl/over-ons
&http://www.domain.com/de/uber-uns
Tôi hy vọng câu hỏi của tôi khiến đầu bạn nứt ra, chắc chắn họ đã bẻ khóa tôi! Nó đã giúp tôi sẵn sàng giải quyết vấn đề ở đây. Đã cho tôi khả năng xem lại các phương pháp tôi đã sử dụng trước đây và ý tưởng tôi đang có cho CMS sắp tới của mình.
Tôi muốn cảm ơn bạn đã dành thời gian để đọc bó văn bản này!
// Edit #1
:
Tôi quên đề cập: hàm __ () là bí danh để dịch một chuỗi đã cho. Trong phương thức này rõ ràng nên có một số phương thức dự phòng trong đó văn bản mặc định được tải khi chưa có bản dịch. Nếu bản dịch bị thiếu thì nên chèn hoặc tệp dịch sẽ được tạo lại.