Giới thiệu về Wuchale
Mọi người thường cảm thấy ám ảnh với việc quốc tế hóa (i18n). Tôi cũng vậy. Nó giống như việc vật lộn với các danh mục, mã mẫu và những trường hợp ngoại lệ không ngừng. Điều này khiến chúng ta thường tránh xa nó khi có thể. Nhưng khi không thể tránh, tính khả đọc của mã sẽ bị ảnh hưởng: những gì lẽ ra đơn giản giờ trở thành một mê cung.
Tôi đã gặp phải điều này khi thêm i18n vào một dự án lớn với hơn 1.000 thông điệp. Khi đó, trong số các lựa chọn có sẵn, Lingui là lựa chọn tốt nhất để bắt đầu, vì nó tự động xử lý việc tạo danh mục, giúp tôi tiết kiệm rất nhiều công việc thủ công. Hơn nữa, nó không làm hỏng hoàn toàn tính khả đọc, vì các thông điệp vẫn nằm trong mã.
Tuy nhiên, khi dự án phát triển, tôi vẫn cảm thấy bị chôn vùi trong mã mẫu. Mỗi thông điệp mới lại tạo thêm sự cản trở và phức tạp. Quy trình lại trở nên nặng nề. Công cụ đang hỗ trợ, nhưng cũng làm cản trở. Tôi không thích điều này đến mức đã tránh việc thêm i18n vào một dự án nhỏ hơn mà nó có thể cần. Tôi không muốn trải qua điều đó một lần nữa.
Kinh nghiệm này khiến tôi suy nghĩ: chúng ta có thể xác định liệu một đoạn văn bản trong mã có hiển thị cho người dùng hay không. Ví dụ, văn bản nằm trong thẻ HTML sẽ được hiển thị. Vậy tại sao chúng ta phải viết mã mẫu chỉ để quốc tế hóa nó?
Câu hỏi đó đã tạo ra Wuchale, một bộ công cụ i18n thực hiện hai điều:
- Quét mã nguồn của bạn để tìm các thông điệp hiển thị cho người dùng, trích xuất/tuỳ chọn dịch chúng và sau đó biên dịch thành các danh mục không có khóa, chỉ là các mảng, giống như Protobuf.
- Tự động viết lại mã của bạn để lấy thông điệp từ các danh mục đã biên dịch bằng chỉ số, không cần khóa.
Cách hoạt động của Wuchale
Wuchale sử dụng phân tích tĩnh dựa trên AST trên mã của bạn, vì vậy nó rất linh hoạt; nó sẽ tìm thấy các thông điệp của bạn ở bất cứ đâu. Kết quả là mã nguồn của bạn vẫn sạch sẽ và có thể đọc được, trong khi Wuchale xử lý mọi thứ ở phía sau.
Ví dụ mã gốc và mã đã biến đổi
-
Mã gốc
html<p>Hello</p>
-
Mã đã biến đổi
html<p>{_w_runtime_.t(0)}</p>
-
Danh mục đã trích xuất (sau khi dịch)
plaintextmsgid "Hello" msgstr "Hola"
-
Danh mục đã biên dịch
javascript// thông điệp nằm ở chỉ số 0 export let c = ["Hola"]
Giống như Protobuf, các danh mục đã biên dịch không cần siêu dữ liệu; mã tiêu thụ đã biết ánh xạ. Hơn nữa, các danh mục đã biên dịch được tối ưu hóa tại thời điểm xây dựng cho việc sử dụng tại thời gian chạy; không có thay thế chuỗi hoặc bất kỳ điều gì phức tạp xảy ra trong thời gian chạy, ngay cả khi sử dụng các thông điệp phức tạp với chèn và thông điệp lồng nhau.
Tính linh hoạt và hỗ trợ đa nền tảng
Wuchale bắt đầu chỉ với Svelte, và trong gần ba tháng làm việc toàn thời gian, nó đã trải qua nhiều phiên bản và cải tiến dựa trên phản hồi từ cộng đồng, và đã mở rộng khả năng hỗ trợ sang các framework khác. Hiện tại, nó hỗ trợ React/Preact, Svelte, SolidJS và tất nhiên là JavaScript/TypeScript (ngay cả cho các thông điệp phía máy chủ).
Nhưng đây không phải là kết thúc. Để có trải nghiệm người dùng tốt nhất, HMR (Hot Module Replacement) là rất quan trọng, và nó đã nhận được nhiều sự chăm sóc để làm cho nó hoạt động trơn tru. Bạn viết mã của mình như bình thường và Wuchale giữ cho các danh mục đồng bộ trong nền.
Hơn nữa, bạn có thể tùy chọn sử dụng AI để dịch các thông điệp cho bạn. Tất nhiên, điều này không đạt chất lượng của người dịch, nhưng nếu bạn muốn điều gì đó nhanh chóng mà có thể xem lại sau, nó có thể thực hiện dịch trực tiếp. Điều này cho phép bạn viết mã của mình bằng tiếng Anh và xem kết quả bằng một ngôn ngữ khác trong trình duyệt!
Lợi ích của Wuchale
Với tất cả những điều này, bạn có thể nghĩ rằng sẽ có rất nhiều phụ thuộc. Không phải vậy. Một trong những điều tôi không thích về Lingui là kích thước phụ thuộc lớn cho những gì tôi cần. Wuchale chỉ có chưa đến 10 phụ thuộc và nó chia sẻ hầu hết các phụ thuộc giống như Vite và framework của bạn (ví dụ: trình phân tích riêng của Svelte để phân tích Svelte). Điều này có nghĩa là số phụ thuộc bổ sung ít hơn 5 (bao gồm cả phụ thuộc gián tiếp).
Tôi giờ đây rất thích làm việc với nó, cảm giác như nó không hề tồn tại. Để bạn biết, tôi đã quay lại dự án đó và hoàn toàn quốc tế hóa nó với Wuchale trong chưa đầy 30 phút, sử dụng Gemini cho việc dịch. Và hầu hết thời gian đó đã được dành cho UI chọn ngôn ngữ.
Kế hoạch tương lai
Vậy, điều gì sẽ xảy ra tiếp theo? Cập nhật lớn nhất dự kiến là hỗ trợ cho các ngôn ngữ backend khác, Go và Python, để ngay cả các thông điệp từ đó cũng được quốc tế hóa.
Thực hành tốt nhất khi sử dụng Wuchale
- Giữ mã sạch: Hãy đảm bảo rằng mã của bạn luôn rõ ràng và không bị lẫn lộn với các thông điệp i18n.
- Dịch chính xác: Nếu sử dụng AI, hãy kiểm tra lại các bản dịch để đảm bảo tính chính xác và phù hợp với ngữ cảnh.
- Kiểm tra thường xuyên: Đảm bảo rằng bạn kiểm tra ứng dụng của mình thường xuyên để xác định bất kỳ vấn đề nào có thể xảy ra với i18n.
Những cạm bẫy phổ biến
- Quá nhiều mã mẫu: Tránh việc thêm quá nhiều mã mẫu sẽ khiến mã trở nên khó đọc.
- Bỏ qua thông điệp không hiển thị: Đảm bảo rằng bạn không bỏ qua các thông điệp quan trọng mà có thể không hiển thị ngay lập tức.
Mẹo hiệu suất
- Tối ưu hóa danh mục: Đảm bảo rằng các danh mục của bạn được tối ưu hóa cho tốc độ và hiệu suất.
- Sử dụng phân tích tĩnh: Tận dụng phân tích tĩnh để tìm ra các thông điệp một cách hiệu quả hơn.
Câu hỏi thường gặp
- Wuchale có hỗ trợ các framework khác không?
Có, Wuchale hiện hỗ trợ React, Svelte, SolidJS và JavaScript/TypeScript. - Tôi có thể sử dụng AI để dịch không?
Có, Wuchale cho phép bạn sử dụng AI để dịch các thông điệp. - Wuchale có dễ sử dụng không?
Có, Wuchale dễ sử dụng và giúp giữ cho mã của bạn sạch sẽ và khả đọc.
Kết luận
Cảm ơn bạn đã đọc và hy vọng bạn sẽ thử nghiệm với Wuchale. Phản hồi luôn được chào đón. Wuchale hoàn toàn mã nguồn mở và chào đón các đóng góp.
Hãy ghé thăm trang web hoặc kho lưu trữ để trải nghiệm Wuchale ngay hôm nay!