2010-02-26 46 views
6

Tôi đang phát triển một trang web bằng PHP và tôi muốn cung cấp cho người dùng dễ dàng chuyển đổi từ tiếng Đức sang tiếng Anh.Cách tốt nhất để đưa một hệ thống dịch thuật vào trang web php là gì?

Vì vậy, một chính trị dịch phải được xem xét:

Tôi có nên lưu trữ dữ liệu và dịch của nó trong một bảng cơ sở dữ liệu ((1, "Hello", "hallo"), (2, "Chào buổi sáng", "Guten Tag") vv ..?

Hoặc tôi nên sử dụng ".mo" Files để lưu trữ nó?
những cách là tốt nhất?
những ưu và khuyết điểm là gì?

+0

Trùng lặp. Xem http://stackoverflow.com/questions/2275270/whats-the-simplest-php-alternative-to-the-php-gettext-extension-which-can-be-sup http://stackoverflow.com/questions/2149116/php-localization-question –

Trả lời

4

Có một số yếu tố bạn nên cân nhắc.

Trang web có được cập nhật thường xuyên không? nếu có, bởi ai? bạn hoặc chủ sở hữu? bạn đang xử lý bao nhiêu dữ liệu/thông tin? và ... bạn có thường xuyên làm điều này (cho nhiều khách hàng) không? Tôi khó có thể nghĩ rằng việc sử dụng cơ sở dữ liệu quan hệ có thể gây bất kỳ tác động tốc độ nghiêm trọng nào trừ khi bạn có lưu lượng truy cập rất cao (vài trăm nghìn lần xem trang mỗi ngày).

Nếu bạn thường xuyên thực hiện việc này (đối với nhiều khách hàng), đừng nghĩ xa hơn: hãy xây dựng CMS (hoặc sử dụng CMS hiện có). Nếu bạn thực sự cần phải xem xét tác động tốc độ, bạn có thể tùy chỉnh nó để khi bạn làm xong với trang web, bạn có thể xuất các trang HTML tĩnh nếu có thể.

Nếu bạn đang cập nhật thường xuyên, giống như trên áp dụng. Nếu khách hàng phải cập nhật (và không phải bạn), một lần nữa, bạn cần một CMS. Nếu bạn đang xử lý nhiều thông tin (lớn và nhiều bài viết), bạn cần một CMS.

Tất cả trong tất cả, CMS sẽ giúp bạn xây dựng cấu trúc trang web nhanh chóng, thêm nội dung nhanh và không lo lắng nhiều về mã vì nó sẽ có thể sử dụng lại được.

Bây giờ, nếu bạn chỉ cần tạo một trang web nhỏ nhanh, bạn có thể dễ dàng thực hiện điều này với các mảng được mã hóa cứng và các tệp dữ liệu.

+0

Cập nhật. Bài đăng này của tôi bỏ lỡ gợi ý một chiến lược bộ nhớ đệm khác với HTML tĩnh. Người ta cũng có thể sử dụng memcache, redis hoặc một số cơ sở dữ liệu NoSQL trong một số trường hợp nhất định. – mspir

1

Nếu bạn cần cung cấp giao diện web để thêm/chỉnh sửa bản dịch, sau đó cơ sở dữ liệu là một ý tưởng hay.

Nếu, tuy nhiên, bản dịch của bạn là tĩnh, tôi sẽ sử dụng gettext hoặc thậm chí cả mảng PHP thuần túy.

Dù bằng cách nào bạn cũng có thể tận dụng Zend_Translate.

so sánh nhỏ, lần đầu tiên hai từ Zend hướng dẫn:

  1. Plain PHP mảng: trang nhỏ; sử dụng đơn giản nhất; chỉ dành cho người lập trình.
  2. Gettext: GNU chuẩn cho Linux; chủ đề an toàn; cần các công cụ để dịch.
  3. Cơ sở dữ liệu: Động; Hiệu suất tồi tệ nhất.
0

Tôi muốn giới thiệu mảng PHP, chúng có thể được xây dựng xung quanh GUI để dễ dàng truy cập.

6

Tôi cũng đề xuất gói Zend Framework Zend_Translate.

Hướng dẫn cung cấp tổng quan tốt về How to decide which translation adapter to use. Ngay cả khi không sử dụng ZF, điều này sẽ cung cấp cho bạn một số ý tưởng về những gì được ra khỏi đó và những ưu và nhược điểm là gì.

Adapters cho Zend_Translate

  • Mảng
    • Sử dụng PHP mảng trang nhỏ;
    • cách sử dụng đơn giản nhất; chỉ dành cho các lập trình viên
  • Csv
    • Sử dụng dấu phẩy tách ra (.csv/ .txt) tập tin
    • Simple định dạng file văn bản; Nhanh; vấn đề có thể với các ký tự unicode
  • gettext
    • Sử dụng nhị phân gettext (*.mo) tập tin GNU chuẩn cho Linux;
    • chỉ an toàn; cần công cụ để dịch
  • Ini
    • Sử dụng đơn giản ini (* .ini) tập tin
    • Simple định dạng file văn bản; Nhanh; vấn đề có thể với các ký tự unicode
  • TBX
    • trao đổi Sử dụng termbase (.tbx/ .xml) tập tin
    • tiêu chuẩn nghiệp cho các chuỗi ngữ ứng dụng liên; XML định dạng
  • TMX
    • Sử dụng TMX (.tmx/ .xml) tập tin
    • tiêu chuẩn nghiệp để dịch ứng dụng liên; Định dạng XML; con người có thể đọc được
  • Qt
    • Sử dụng ngôn ngữ học qt (* .ts) tập tin
    • Chữ thập khuôn khổ nền tảng ứng dụng; Định dạng XML; con người có thể đọc được
  • xliff
    • Sử dụng xliff (.xliff/ .xml) tập tin
    • Một định dạng đơn giản như TMX nhưng liên quan đến nó; Định dạng XML; con người có thể đọc được
  • XmlTm
    • Sử dụng xmltm (* .xml) tập tin
    • tiêu chuẩn nghiệp cho bộ nhớ dịch tài liệu XML; Định dạng XML; con người có thể đọc được
8

Sau khi chỉ giải quyết này bản thân mình thời gian gần đây (12 ngôn ngữ và đếm) trên một hệ thống sản xuất và đã gặp phải một số vấn đề hiệu suất lớn dọc theo con đường tôi sẽ đề nghị một hệ thống hybrid.

1) Lưu trữ chuỗi ngôn ngữ và bản dịch trong cơ sở dữ liệu - điều này sẽ giúp bạn dễ dàng tương tác với/cập nhật/xóa các mục cộng với sẽ là một phần trong các thói quen sao lưu bình thường của bạn.

2) Cache các ngôn ngữ thành các tệp phẳng trên máy chủ và vẽ các ngôn ngữ đó ra khi cần thiết để hiển thị trên trang.

Lợi ích ở đây rất nhiều - chủ yếu là nhanh! Tôi không phải đối phó với chi phí kết nối cho MySQL hoặc bất kỳ sự chậm trễ giao thông nào trong quá trình chuyển. (đặc biệt quan trọng nếu máy chủ DB của bạn không phải là localhost).

Điều này cũng sẽ làm cho nó rất dễ sử dụng.Lưu trữ dữ liệu từ cơ sở dữ liệu của bạn trong các tập tin như là một mảng serialized php và GZIP nội dung của tập tin để thu hẹp chi phí lưu trữ (điều này cũng làm cho nó nhanh hơn trong điểm chuẩn của tôi).

Ví dụ:

$lang = array(
    'hello' => 'Hallo', 
    'good_morning' => 'Guten Tag', 
    'logout_message' = > 'We are sorry to see you go, come again!'  
); 

$storage_lang = gzcompress(serialize($lang)); 

// WRITE THIS INTO A FILE SUCH AS 'my_page.de' 

Khi người dùng tải hệ thống của bạn cho lần đầu tiên làm một file_exists('/files/languages/my_page.de'). Nếu tập tin tồn tại thì tải nội dung, un-gzip, và un-serialize và nó đã sẵn sàng để đi.

Ví dụ

$file_contents = get_contents('my_page.de'); 
$lang = unserialize(gzuncompress($file_contents)); 

Như bạn thấy bạn có thể làm cho bộ nhớ đệm cụ thể cho từng trang trong hệ thống giữ cho chi phí thậm chí còn nhỏ hơn và sử dụng phần mở rộng tập tin để biểu thị ngôn ngữ ... (my_page.en , my_page.de, my_page.fr)

Nếu tệp KHÔNG tồn tại thì truy vấn DB, tạo mảng của bạn, tuần tự hóa, gzip và ghi tệp bị thiếu - cùng lúc bạn vừa tạo xong mảng mà trang cần để tiếp tục hiển thị trang và mọi người đều hạnh phúc. Cuối cùng, điều này cho phép bạn xây dựng trong các trang cập nhật có thể truy cập được đối với người không lập trình nhưng bạn cũng kiểm soát thời điểm thay đổi xuất hiện bằng cách quyết định thời điểm xóa tệp bộ nhớ cache để hệ thống có thể xây dựng lại.

Cảnh báo và những cạm bẫy

Khi tôi giữ mọi thứ trong cơ sở dữ liệu trực tiếp, chúng tôi nhấn một số chậm YẾU khi giao thông của chúng tôi tăng vọt.

Cố gắng giữ chúng trong các mảng tệp phẳng chỉ gây ra nhiều rắc rối vì các bản cập nhật gây đau đớn và dễ bị lỗi.

Không GZIP nén nội dung của tệp bộ nhớ cache khiến hệ thống ngôn ngữ chậm hơn 20% trong điểm chuẩn của tôi.

Đảm bảo tất cả các trường cơ sở dữ liệu của bạn có chứa ngôn ngữ được đặt thành UTF8-general-ci (hoặc ít nhất một trong các tùy chọn UTF8, tôi thấy tốt nhất cho việc sử dụng của tôi). Nếu bạn không bạn sẽ không thể để lưu trữ các bộ ký tự phi unicode trong cơ sở dữ liệu của bạn (như Trung Quốc, Nhật Bản, vv)

Extension: Để đáp lại bình luận dưới đây, hãy chắc chắn để thiết lập cơ sở dữ liệu của bạn lập bảng với các chuỗi ngôn ngữ cấp trang.

id  string    page  global 
1  hello    NULL   1 
2  good_morning  my_page.php 0 

Bất cứ thứ gì xuất hiện trong đầu hoặc cuối trang có thể có một lá cờ toàn cầu mà sẽ được truy vấn trong mỗi tập tin bộ nhớ cache được tạo ra, nếu không truy vấn họ bằng cách trang để giữ cho hệ thống của bạn đáp ứng.

+1

Giữ nó trong cơ sở dữ liệu sẽ thực sự làm chậm tải trang và giảm hiệu suất. Bạn sẽ hoặc là bộ nhớ đệm tất cả các chuỗi sẽ mất bộ nhớ không cần thiết, hoặc lấy một hàng cho mỗi chuỗi mà sẽ chỉ gây ra một đại tu kết nối. Mảng nhanh hơn rất nhiều, dễ quản lý và dễ tìm nạp hơn. – casraf

+2

@henasraf - Tôi hoàn toàn không đồng ý. Với bộ nhớ đệm tập tin bạn có được lợi ích của việc có nó một cơ sở dữ liệu cho các bản cập nhật và chèn hàng mới nhưng bạn chỉ phải truy vấn các hàng cần thiết thời gian đầu tiên tải trang. Một người thực hiện cú đánh đó và mọi người khác đều có lợi. Ngoài ra bạn sai về giả định rằng bạn phải kéo mọi hàng. Bạn có thể truy vấn một tệp cho mỗi trang trong hệ thống của bạn và chỉ tải các chuỗi cho trang đó làm cho các tệp nhỏ. Cuối cùng, thực hiện một tệp readfile và unserialize trên một tệp phẳng gzipped thực sự nhanh hơn trong các tiêu chí chuẩn của tôi hơn là bao gồm một tệp mảng không gzipped php. – Shane

+0

Hey @shanee, đây là một cách ấn tượng để xử lý nội địa hóa ... Sau tất cả những năm này, bạn vẫn nghĩ nó hiệu quả hay bạn sẽ đề xuất một cách tiếp cận tốt hơn? – KAD

5

Mảng PHP thực sự là cách nhanh nhất để tải bản dịch. Tuy nhiên, bạn thực sự không muốn cập nhật các tệp này bằng tay trong trình chỉnh sửa. Điều này có thể hoạt động ngay từ đầu và cho một hoặc hai ngôn ngữ, nhưng khi trang web của bạn phát triển thì điều này thực sự khó duy trì.

Tôi khuyên bạn nên thiết lập một vài bảng đơn giản trong cơ sở dữ liệu nơi bạn giữ bản dịch và xây dựng một ứng dụng đơn giản cho phép bạn cập nhật bản dịch (một số biểu mẫu để thêm và cập nhật văn bản). Đối với cơ sở dữ liệu: sử dụng một bảng để lưu trữ các biến dịch; sử dụng một liên kết khác để dịch các biến này.

Ví dụ:

`text` 

id variable 
1 hello 
2 bye
`text_translations` 

id textId language translation 
1 1  en  hello 
2 1  de  hallo 
3 2  en  bye 
4 2  de  tschüss

Vì vậy, những gì bạn làm là:

  • tạo biến trong bảng đầu tiên

  • thêm bản dịch nó trong bảng thứ hai (bằng bất cứ ngôn ngữ nào bạn muốn)

Sau khi bạn đã cập nhật các bản dịch, tạo/cập nhật một tập tin ngôn ngữ cho mỗi ngôn ngữ mà bạn đang sử dụng:

  • chọn các biến bạn cần và dịch nó (tip: sử dụng tiếng Anh nếu có không dịch)

  • tạo ra một mảng lớn với tất cả các công cụ này, ví dụ:

$texts = array('hello' => 'hallo', 'bye' => 'tschüss');
  • viết mảng vào một tập tin, ví dụ như:
file_put_contents('de.php', serialize($texts));
  • trong chương trình PHP/HTML tạo ra các mảng từ tập tin (dựa trên ngôn ngữ được chọn bởi người dùng), ví dụ:
$texts = unserialize(file_get_contents('de.php'));
  • trong chương trình PHP/HTML sử dụng các biến, ví dụ như:
<h1><?php echo $texts['hello']; ?></h1> 

or if you like/enabled PHP short tags: 

<p><?=$texts['bye'];?></p>

Cài đặt này rất linh hoạt và với một vài biểu mẫu để cập nhật bản dịch, việc cập nhật trang web của bạn trở nên dễ dàng bằng nhiều ngôn ngữ.

0

Hãy nhận ra mọi người trên thế giới khi giao tiếp với máy tính, họ thường biết một số tiếng Anh thông dụng được sử dụng trong máy tính hoặc internet như Giới thiệu, Trang chủ, Gửi, Xóa, Đọc thêm v.v. ?

Ok, thành thật mà nói, một số bản dịch cho những từ đó thực sự không phải về 'bắt buộc', tất cả đều là về 'kiểu'.

Bây giờ, nếu nó thực sự muốn, đối với những từ phổ biến mà không cần phải thay đổi mãi mãi, nó tốt hơn sử dụng một tập tin php mà đầu ra mảng lang cho chỉ địa phương và tiếng Anh. Và đối với một số nội dung như blog, tin tức và một số mô tả, hãy sử dụng cơ sở dữ liệu và lưu vào nhiều bản dịch yêu cầu ngôn ngữ. Bạn phải làm điều đó bằng tay.

Sử dụng và dựa vào Google Dịch? Tôi nghĩ bạn phải suy nghĩ 1000 lần. Ít nhất là trong thập kỷ này.

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