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ó.