Tại sao các tài nguyên chuỗi thường được giữ bên ngoài mã và không nằm trong mã?


18

Nói chung, trên nhiều nền tảng, tôi đang viết tài nguyên chuỗi của mình vào tệp .resx hoặc .xml, và sau đó tôi sẽ nhận được chúng bằng cách sử dụng một số cách tiếp cận phụ thuộc vào nền tảng.

Đó là, trên iOS, tôi nhận được chúng thông qua NSBundle.MainBundlevà bằng cách sử dụng Context.Resourcestrên Android.

Những lợi thế của phương pháp này là gì và tại sao không có nó có thể truy cập trực tiếp trong mã, ví dụ:

  1. Trong một dự án đa nền tảng, bất kỳ nền tảng nào cũng có thể truy cập trực tiếp vào nó mà không cần tích hợp.

  2. Không có mối quan tâm trong quá trình xây dựng về việc liệu các tài nguyên được xây dựng tốt hay không.

  3. Bộ mã hóa có thể sử dụng các chức năng như xử lý đa ngôn ngữ

Câu chuyện dài: lý do tại sao tài nguyên chuỗi được cấu trúc theo cách đó là gì?

[Biên tập]

Giả sử tập tin của tôi là một phần của dự án "cốt lõi" được chia sẻ giữa các dự án khác. (Hãy nghĩ về PCL, cấu trúc tệp dự án đa nền tảng.)

Và giả sử rằng tệp của tôi hoàn toàn giống với tệp .resx / .xml, trông như thế này (Tôi không phải là chuyên gia trong xml, xin lỗi!): Tham số Paramètres

Vì vậy, về cơ bản, đây là một xml tùy chỉnh, nơi bạn trỏ đến khóa / ngôn ngữ để có được chuỗi thích hợp.

Tệp sẽ là một phần của ứng dụng giống như bạn thêm bất kỳ tệp nào có thể truy cập được trong ứng dụng và hệ thống để truy cập tài nguyên chuỗi, được mã hóa bằng PCL. Điều này sẽ thêm một chi phí cho các ứng dụng?



6
Không, mối quan tâm của tôi không phải là về Quốc tế hóa, và thay vào đó là về kiến ​​trúc và đa nền tảng, xin lỗi.
Léon Pelletier

1
Câu hỏi này có thể được khái quát cho bất kỳ loại tài nguyên nào, thực sự, ngay cả khi dễ dàng nội địa hóa / quốc tế hóa sang một bên. Những lợi thế của việc giữ bất kỳ loại tài nguyên tách biệt với mã là gì? Tại sao các tệp hình ảnh hoặc âm thanh thường không được mã hóa trong nguồn dưới dạng chuỗi nhị phân? (Tất nhiên, các URI dữ liệu tồn tại, nhưng thường không thực tế đối với các tệp lớn). Những người khác đã cung cấp một số câu trả lời khá hay rồi, nhưng tôi chỉ muốn chỉ ra rằng các chuỗi có thể đọc được của người dùng không phải là loại tài nguyên duy nhất thu được lợi ích từ việc được đưa ra ngoài.
JAB

Câu trả lời:


38

Bản địa hóa và quốc tế hóa,

Giữ các chuỗi bên ngoài cho phép chúng thay đổi (đọc: đã dịch) mà không cần phải biên dịch lại (chỉ là một bản phát lại nhiều nhất, và chỉ cần thả vào một thư mục mới là tốt nhất).


Điều này relink vs recompile là một lý do tốt, cảm ơn.
Léon Pelletier

2
Vẫn là người duy nhất hiểu câu hỏi.
Léon Pelletier

3
@ratchetfreak là hình thức xấu để chấp nhận quá sớm (trong vòng vài giờ chắc chắn là có giá trị.) Không dành thời gian cho các câu trả lời khác nổi lên. Điều này rất đơn giản, và chính xác và chính xác ... nhưng ai đó có thể mang đến một câu trả lời chi tiết hơn, đầy đủ hơn vào ngày mai (hoặc tháng tới cho vấn đề đó).
WernerCD

3
Bổ sung: Người dịch có thể chỉnh sửa tệp XML, nhưng đừng bao giờ để họ sử dụng gần mã thực tế ...
Darkhogg

Bây giờ câu hỏi là: "Câu trả lời này có còn áp dụng cho các ngôn ngữ được dịch không?". Tôi yêu cầu bởi vì sẽ không có sự hồi tưởng hay biên dịch lại.
Thomas Eding

10

Nếu bạn có một tệp chỉ chứa các tài nguyên chuỗi thì bạn có thể cung cấp tệp tài nguyên cho cơ quan dịch thuật hoặc một cái gì đó tương tự và nhận bản dịch. Tôi đoán bạn có thể tưởng tượng sẽ khó đến mức nào nếu bạn phải đưa rất nhiều mật mã cho một giáo dân để thực hiện một số bản dịch (ngoài việc có thể không muốn đưa mã của bạn cho bất kỳ ai).


2
Chà, không có sự khác biệt giữa một tệp được bao gồm trong dự án và tệp tài nguyên. Vấn đề là không có.
Léon Pelletier

Tôi đang nói về việc bao gồm các tài nguyên trực tiếp trong mã và sau đó xử lý mọi thứ bên trong chương trình, vì vậy nó thân thiện với PCL / Đa nền tảng hơn.
Léon Pelletier

2
nếu bạn có một tệp "mã" với tất cả các tài nguyên chuỗi của bạn (từ điển definiton hoặc một cái gì đó tương tự) và không có gì khác trong đó .. thì về cơ bản nó là một tệp tài nguyên (nhưng một cho một nền tảng duy nhất, ví dụ như android sẽ không lấy bất kỳ mã mục tiêu-c). Nếu có mã khác trong đó hoặc nếu nó được chia thành nhiều tệp thì việc dịch ngoài sẽ khó hơn. Trong chế độ xem đa nền tảng, định dạng văn bản như xml có lợi thế là bạn có thể đọc và sử dụng trên bất kỳ ngôn ngữ / nền tảng nào (nhưng bạn có thể phải đặt một số công việc đó)
Flo

7

Ngoài việc quốc tế hóa / bản địa hóa, việc tách các chuỗi văn bản ra như thế này cũng cho phép một trình đọc bằng chứng gửi các sửa lỗi chính tả / ngữ pháp / dấu câu được cách ly messages.${LOCALE}mà không cần phải chạm vào một tệp mã nguồn thực sự. Bạn có thể mất điện về thay đổi mã nhưng chấp nhận sửa văn bản như vậy. Nếu bạn chấp nhận thay đổi đồng thời cho cả mã và tin nhắn, việc giữ chúng tách biệt sẽ giúp hợp nhất các bản vá dễ dàng hơn, miễn là các thay đổi mã không xác định lại bất kỳ thông báo nào tồn tại khi trình đọc bằng chứng kiểm tra messages.en_US.

Ngoài ra, tùy thuộc vào cách nó được triển khai, thậm chí có thể không cần thiết phải xem lại ứng dụng. Mã có thể chỉ đơn giản là lấy dòng 138 từ messages.${LOCALE}một thông điệp cụ thể, với số dòng được xác định khi chạy.


0

Đây chỉ là cách mà ngôn ngữ / nền tảng của bạn đã quyết định triển khai nội địa hóa chuỗi. Tất cả các phương pháp tiếp cận nội địa hóa cần một số loại tệp tài nguyên bên ngoài để có được các bản dịch từ đó. Điểm đau chính là cách bạn duy trì các tài nguyên này.

Có vẻ như bạn cần duy trì các tệp tài nguyên này theo cách thủ công , đây có thể là một gánh nặng khá lớn. Nó cũng làm phức tạp việc chia sẻ các chuỗi lặp đi lặp lại. Và phải làm điều này khi bạn hiện chỉ vận chuyển một ngôn ngữ, thậm chí còn trở thành gánh nặng nhiều hơn.

Một cách khác phổ biến là cách tiếp cận GNU Gettext chỉ đánh dấu các chuỗi có thể dịch trong mã nguồn và tự động trích xuất các chuỗi này thành các tệp PO tiêu chuẩn hoạt động đa nền tảng và ngôn ngữ chéo độc đáo. Từ góc độ nhà phát triển, nó đánh bại việc bảo trì thủ công các tệp tài nguyên XML bất kỳ ngày nào.

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.