Xây dựng cơ sở dữ liệu dịch chuỗi cho nhiều dự án (trong nhà)


9

Tại công ty của chúng tôi, chúng tôi có một bảng dịch ms-sql dịch hiện có lưu trữ các chuỗi như thế này:

Id |     Key     | Language | Value 
 1 | hello-world |  nl-BE   | Hallo Wereld
 2 | hello-world |  en-GB   | Hello World

Có 3 ngôn ngữ trong hệ thống và tôi hy vọng nó sẽ phát triển tối đa khoảng 10 ngôn ngữ trong tương lai

Bảng này được đọc bởi nhiều dự án rất khác nhau (khoảng 60 dự án, chủ yếu là các trang web / ứng dụng web và một số dịch vụ web), mỗi dự án mở một kết nối cơ sở dữ liệu đến cơ sở dữ liệu dịch, lưu trữ các bản dịch

Phản hồi từ các nhà phát triển giao diện người dùng là giao diện người dùng của chúng tôi để nhập hoặc sửa đổi nhược điểm lớn nhất của bản dịch là họ không thể biết dự án nào sử dụng chuỗi nào.

Đôi khi họ sửa đổi các chuỗi không biết rằng họ đang phá vỡ 7 dự án với nó.

Bây giờ họ chỉ cần gõ một cái gì đó như this.Translate("Hello World")và hệ thống sẽ chăm sóc phần còn lại.

Tôi có thể buộc họ phải làm một cái gì đó tương tự this.Translate("Hello World","AwesomeApplication1")nhưng có vẻ như nó sẽ đòi hỏi khá nhiều tái cấu trúc trong nhiều dự án.

Làm thế nào bạn sẽ đi về việc cung cấp giải pháp này? Làm thế nào bạn, như một nhà phát triển, cung cấp "tên dự án" cho bản dịch? Làm thế nào bạn sẽ lưu trữ này trong cơ sở dữ liệu?

Lưu ý quan trọng: việc sử dụng lại bản dịch là toàn bộ điểm của cơ sở dữ liệu tập trung, vì vậy hãy phân chia các bản dịch cho một dự án bằng cách đi

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1
5|hello-world|nl-BE|Hallo Wereld!|MyAwesomeApplicatoin2

không thực sự là một lựa chọn mong muốn.

Tôi thích cái gì đó như:

1|hello-world|nl-BE|Hallo Wereld|MyAwesomeApplicatoin1,MyAwesomeApplicatoin2

hoặc khóa ngoại tương đương với việc chỉ đặt tên trong bảng.

CẬP NHẬT

Dựa trên lời khuyên để bình thường hóa cơ sở dữ liệu, tôi đã nghĩ ra một cái gì đó như thế này cho đến nay:

//this allows me to distinquish if translations where added by developer or by translator

CẬP NHẬT2: thêm edmx thay vì văn bản. Nếu mọi người quan tâm tôi có thể github dự án WCF tôi đang gói khái niệm này để người khác có thể thử nghiệm và sử dụng nó.


Ty cho bình thường hóa. bình chọn q và a. Tôi tin rằng, một github java mùa xuân sẽ giúp.
tgkprog

Câu trả lời:


5

Ghi chú sơ bộ số 1: Bạn hiện không cho chúng tôi biết bản dịch được duy trì như thế nào

Lưu ý sơ bộ # 2: Cơ sở dữ liệu của bạn không được chuẩn hóa. Dù bạn đang dùng giải pháp nào, trước tiên hãy bình thường hóa cơ sở dữ liệu của bạn . Bạn gặp phải vấn đề bảo trì khủng khiếp sau này nếu bạn không làm điều đó ngay bây giờ

Đây là những gì tôi sẽ làm.

  1. Viết lại cuộc gọi dịch của bạn để nó mang ID chương trình trở lại máy chủ

  2. Trình dịch back end sẽ đặt chuỗi vào bảng cơ sở dữ liệu nếu nó chưa tồn tại và sẽ gắn thẻ nó với id chương trình

  3. Nếu chuỗi đã tồn tại, nó sẽ chỉ được cập nhật nếu id chương trình khớp với id chương trình gốc mà chuỗi được tạo. Nếu không, trả lại một thông báo xung đột.

Biến thể:

  • Bạn có thể sử dụng 'ID nhà phát triển / ID người dịch' thay vì ID chương trình. Tôi xem xét điều đó tốt hơn bởi vì có những người biết ngoại ngữ và những người nghĩ rằng họ biết. Chỉ nhóm đầu tiên có quyền sửa đổi.

  • Bạn có thể muốn lưu trữ ID của tất cả các chương trình sử dụng chuỗi trong DB, để bạn biết chương trình nào xung đột.

  • Bạn có thể mở rộng 'quyền sở hữu' này cho từng ngôn ngữ riêng lẻ: một người có thể làm tiếng Anh, người Hà Lan khác.

  • Khi cơ sở dữ liệu của bạn được chuẩn hóa, bạn thêm độ phức tạp xây dựng như "Chương trình A có trong Ngôn ngữ 1,2,3; B nằm trong 3 và 5"

Tôi cũng đề nghị bạn viết một chương trình 'bảo trì dịch thuật' riêng biệt sẽ hiển thị cho bạn các bản dịch bị thiếu, v.v. Tôi đã từng làm điều đó với ủy quyền 2 cấp: mỗi bản dịch phải được người thứ hai xem xét (thường là người bản ngữ).


1
Tôi đã cập nhật câu hỏi của mình dựa trên ý tưởng của bạn
Mvision

5

Vì họ đang tham chiếu một 'cái này' ... nên bạn có thể gán tên dự án một lần cho 'cái này' (chẳng hạn thông qua hàm tạo) và giao diện cho các chức năng dịch sẽ không thay đổi cho các lập trình viên. Trong mui xe, nó chỉ cần thêm tên dự án vào truy vấn cơ sở dữ liệu. Ngoài ra, bạn có thể cung cấp 'đây' một phương tiện để tự biết tên dự án. Nó thực sự sẽ phụ thuộc vào cách bạn có các lớp có cấu trúc.

Để lưu trữ, bạn có thể làm một cái gì đó như:

1 ! hello-world ! nl-EN ! Hello World  ! *
2 ! hello-world ! nl-EN ! Howdy, World ! CowboyApp
3 ! hello-world ! nl-EN ! Arrgh        ! PirateApp

Sử dụng thẻ đại diện để áp dụng bản dịch chung cho tất cả các ứng dụng, nhưng tên ứng dụng cụ thể khi bạn muốn ghi đè bản dịch cho một ứng dụng cụ thể. Điều này sẽ giữ cho các bản sao xuống đến mức tối thiểu.

Để xem chương trình nào đang sử dụng bản dịch nào, bây giờ bạn biết điều này - nếu bạn không muốn thực hiện và thu thập thông tin theo cách thủ công, bạn có thể đăng nhập các yêu cầu dịch.


Ý tưởng chuyển nó sang lớp 'this' có vẻ tốt với tôi, tôi nghĩ rằng tôi sẽ chuyển tên dự án sang tệp web / app.config và đọc nó từ đó. Bạn có nghĩ rằng ý tưởng tên thẻ / dự án hoang dã có thể mở rộng thành thứ gì đó như 4000 bản dịch không?
Mvision

3
Là một cải tiến, một trình kích hoạt có thể được thêm vào cơ sở dữ liệu hoặc DBAL cập nhật cột "chương trình đã đăng ký" bất cứ khi nào một từ được dịch được đọc.

Làm thế nào để kích hoạt cơ sở dữ liệu bao giờ biết tên dự án? (Chúng tôi đang sử dụng khung thực thể 4)
Mvision

@Mvision Tôi không hiểu tại sao không - âm lượng không phải là vấn đề. Nếu rất nhiều bản dịch dành riêng cho ứng dụng chỉ đơn giản là chèn tên ứng dụng, bạn cũng có thể sử dụng các hằng số để cắt giảm các dups.
GrandmasterB

nvm tôi hiểu lầm. vâng, một trình kích hoạt có thể làm được, và sẽ cải thiện mọi thứ so với việc kiểm tra và cập nhật công cụ đó qua máng đọc được .... cuộc gọi tốt
Mvision

1

Nếu tất cả các dự án của bạn được viết bằng C # và tất cả các cuộc gọi của người dịch trông giống như thế này

this.Translate("hello-world")

trong đó "hello-world" là chìa khóa trong bảng dịch của bạn, không quá khó để viết một trình quét mã nguồn nhỏ bằng cách sử dụng một biểu thức thông thường để tìm tất cả các cuộc gọi của người dịch và gán từ khóa cho các tên dự án tương ứng. Bằng cách này, bạn không phải thay đổi bất kỳ giao diện mã hoặc trình dịch hiện có nào.

Tùy thuộc vào cấu trúc thực của chương trình của bạn, thay vào đó, có thể dễ dàng trích xuất thông tin đó từ mã IL của các hội đồng của bạn. Tôi đã làm một cái gì đó rất giống trước đây, cũng cho mục đích dịch thuật, sử dụng mã ví dụ này để phân tích các cụm.


Tôi đã từng thích loại giải pháp này. Nhưng nó sẽ yêu cầu tất cả 60 dự án (một số thậm chí không phải của tôi) phải được kiểm tra đầy đủ trước khi đi vào sản xuất với hệ thống mới này. Giải pháp được đề xuất để chuyển tên dự án vào mã gọi hoạt động tốt và sẽ gây ra ít rắc rối hơn, dù sao cũng cảm ơn!
Mvision

1
@Mvision: Tôi nghĩ điều ngược lại là đúng. Nếu bạn xác định tên dự án cho các bản dịch trong thời gian chạy, bạn phải đảm bảo mọi trang web với mỗi bản dịch cho tất cả 60 dự án của bạn phải được gọi một lần để đảm bảo bạn đã đăng nhập tất cả. Tuy nhiên, quét tĩnh nguồn hoặc các cụm, cung cấp cho bạn một danh sách đầy đủ mà không cần bất kỳ kiểm tra hoặc chạy toàn bộ hệ thống.
Doc Brown
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.