Tôi (giống như tất cả những người khác) đang sử dụng NSLocalizedString
để bản địa hóa ứng dụng của mình.
Thật không may, có một số "nhược điểm" (không nhất thiết là lỗi của chính NSLocalizedString), bao gồm
- Không tự động hoàn thành cho các chuỗi trong Xcode. Điều này làm cho công việc không chỉ dễ bị lỗi mà còn mệt mỏi.
- Cuối cùng, bạn có thể xác định lại một chuỗi đơn giản vì bạn không biết một chuỗi tương đương đã tồn tại (nghĩa là "Vui lòng nhập mật khẩu" so với "Nhập mật khẩu trước")
- Tương tự như vấn đề tự động hoàn thành, bạn cần "nhớ" / sao chép chuỗi nhận xét, nếu không
genstring
sẽ kết thúc với nhiều nhận xét cho một chuỗi - Nếu bạn muốn sử dụng
genstring
sau khi bạn đã bản địa hóa một số chuỗi, bạn phải cẩn thận để không bị mất bản địa hóa cũ. - Các chuỗi giống nhau nằm rải rác trong toàn bộ dự án của bạn. Ví dụ: bạn đã sử dụng
NSLocalizedString(@"Abort", @"Cancel action")
ở mọi nơi và sau đó Đánh giá mã yêu cầu bạn đổi tên chuỗiNSLocalizedString(@"Cancel", @"Cancel action")
để làm cho mã phù hợp hơn.
Những gì tôi làm (và sau một số tìm kiếm trên SO tôi đã hình dung nhiều người làm điều này) là có một strings.h
tệp riêng biệt trong đó tôi có #define
tất cả mã địa phương hóa. Ví dụ
// In strings.h
#define NSLS_COMMON_CANCEL NSLocalizedString(@"Cancel", nil)
// Somewhere else
NSLog(@"%@", NSLS_COMMON_CANCEL);
Điều này về cơ bản cung cấp hoàn thành mã, một nơi duy nhất để thay đổi tên biến (vì vậy không cần chuỗi gen nữa) và một từ khóa duy nhất để tự động tái cấu trúc. Tuy nhiên, điều này phải trả giá bằng việc kết thúc bằng một loạt các #define
câu lệnh không có cấu trúc vốn có (ví dụ như LocString.Common.Cattery hoặc đại loại như thế).
Vì vậy, trong khi điều này hoạt động tốt, tôi đã tự hỏi làm thế nào các bạn làm điều đó trong các dự án của bạn. Có cách tiếp cận nào khác để đơn giản hóa việc sử dụng NSLocalizedString không? Có thể thậm chí có một khung đóng gói nó?