Với thế giới ngày nay là một thị trường toàn cầu, khả năng ứng dụng di động của bạn có các ngôn ngữ và nền văn hóa khác nhau không chỉ là một lựa chọn mà còn là điều cần thiết. Bản địa hóa nâng cao trải nghiệm người dùng, mở rộng phạm vi tiếp cận và có thể có tác động lớn đến sự thành công của phần mềm ở cấp độ quốc tế.
Đối với các nhà phát triển iOS, Swift cung cấp các công cụ mạnh mẽ để dễ dàng kết hợp bản địa hóa vào các ứng dụng. Hướng dẫn này giải thích quá trình chuyển đổi bản địa hóa trong Swift, từ các kỹ thuật ban đầu sang công cụ mới nhất, để giúp các nhà phát triển tận dụng tối đa các khả năng này.
Ban đầu, khi Swift được giới thiệu lần đầu tiên, nó kế thừa cơ sở hạ tầng bản địa hóa từ Objective-C, được xây dựng xung quanh tệp Localizable.strings
và hàm NSLocalizedString
. Bằng cách này, các nhà phát triển phải xử lý việc chỉnh sửa các chuỗi được bản địa hóa theo cách thủ công và đồng bộ hóa chúng trên các tệp ngôn ngữ khác nhau, một quá trình vừa dễ xảy ra lỗi vừa tốn thời gian.
Localizable.strings
Tệp có thể bản địa hóa là một tệp cặp khóa-giá trị đơn giản trong đó các chuỗi được lưu trữ ở định dạng "key" = "value" , trong đó "key" là mã định danh mã và "value" là chuỗi được bản địa hóa mà người dùng sẽ thấy. Tệp này cần được sao chép và dịch sang từng ngôn ngữ được hỗ trợ và đưa vào thư mục '.lproj' tương ứng thích hợp, chẳng hạn như 'en.lproj' cho ngôn ngữ tiếng Anh và 'de.lproj' cho ngôn ngữ tiếng Đức.
Localizable.strings
: "hello_world_key" = "Hello, World!";
Trong mã Swift, chuỗi này có thể được truy xuất dưới dạng:
let greeting = NSLocalizedString("hello_world_key", comment: "The default greeting")
Hàm NSLocalizedString giúp truy cập nội dung đã bản địa hóa dễ dàng hơn bằng cách sử dụng các khóa từ Localizable.strings
.
Hàm này nhận một khóa, cung cấp giá trị dự phòng và đưa ra nhận xét cho người dịch. Việc đưa ra nhận xét là rất quan trọng vì nó cung cấp cho người dịch ẩn ý để cải thiện tính chính xác và phù hợp của bản dịch.
Ví dụ: Chào người dùng dựa trên thời gian trong ngày:
func greetingBasedOnTime() -> String { let hour = Calendar.current.component(.hour, from: Date()) let key = hour < 12 ? "good_morning_key" : "good_evening_key" return NSLocalizedString(key, comment: "Greeting based on time of day") }
Với Localizable.strings
tương ứng, các mục trông giống như:
"good_morning_key" = "Good morning!"; "good_evening_key" = "Good evening!";
Dưới đây là một số thách thức với Localizable. chuỗi mà bạn có thể phải đối mặt:
1) Các vấn đề về khả năng mở rộng.
Khi số lượng chuỗi tăng lên, việc xử lý chúng trở nên khó khăn hơn. Việc quản lý nhiều tệp .strings theo thời gian trở nên cồng kềnh.
2) Sao chép.
Mỗi ngôn ngữ yêu cầu một tệp riêng biệt, dẫn đến tiềm ẩn sự mâu thuẫn và nỗ lực trùng lặp trong việc quản lý chuỗi. Với một ngôn ngữ được hỗ trợ thì có thể không thành vấn đề nhưng khi bạn cần quản lý nhiều ngôn ngữ thì đôi khi nó lại trở nên quá rắc rối.
3) Thiếu bối cảnh.
Tuy nhiên, các nhận xét có thể được thêm vào NSLocalizedString - ngay cả khi chúng không phải lúc nào cũng giúp người dịch hiểu đầy đủ ngữ cảnh, điều đó có thể dẫn đến bản dịch không chính xác. Các nhà phát triển thường quá lười biếng để điền chúng đúng cách.
stringsdict
để đa dạng hóa Sự ra đời của các tệp stringsdict
đã mang lại sự cải thiện đáng kể cho quá trình bản địa hóa Swift, vốn chủ yếu giải quyết các vấn đề về số nhiều. Nguyên nhân chính là do số nhiều của các ngôn ngữ được hình thành khác nhau và những gì có thể hiệu quả đối với tiếng Anh có thể không hiệu quả đối với các ngôn ngữ khác như tiếng Nga hoặc tiếng Ả Rập.
Trước khi giới thiệu stringsdict
, rất khó để quản lý chúng. stringsdict
cho phép lập trình viên xác định các quy tắc cho các danh mục như “một”, “ít”, “nhiều” và “khác”, đảm bảo mức độ chính xác như nhau trong bản dịch giữa các ngôn ngữ.
Hiểu các tập tin stringsdict
Tệp Stringsdict
là một danh sách thuộc tính XML, được sử dụng để tạo các chuỗi được bản địa hóa tùy thuộc vào các giá trị số. Chức năng này nhằm mục đích xử lý chính xác các dạng số nhiều vì các ngôn ngữ khác nhau có các quy tắc khác nhau để xử lý các dạng số nhiều.
Cấu trúc của tệp stringsdict
:
Một mẫu tệp stringsdict
bao gồm các mục nhập của tất cả các chuỗi cần được số nhiều. Mỗi mục bao gồm một khóa và một từ điển trong đó người dùng xác định một hoặc nhiều khóa con đại diện cho các danh mục số nhiều khác nhau.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>numberOfSongs</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@songs@</string> <key>songs</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One song</string> <key>other</key> <string>%d songs</string> </dict> </dict> </dict> </plist>
Ví dụ về việc sử dụng stringsdict
cho số nhiều
Giả sử chúng ta có một ứng dụng hiển thị số lượng bài viết đã được người dùng đọc. Trên màn hình sẽ hiển thị thông báo trình bày dạng số nhiều chính xác của số bài viết đã đọc.
Localizable.stringsdict
cho tiếng Anh và tiếng Ba Lan:
<!-- English --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>One article</string> <key>other</key> <string>%d articles</string> </dict> </dict> <!-- Polish --> <key>article_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@articles@</string> <key>articles</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>Jeden artykuł</string> <key>few</key> <string>%d artykuły</string> <key>many</key> <string>%d artykułów</string> <key>other</key> <string>%d artykułu</string> </dict> </dict>
Ở đây, bản địa hóa tiếng Ba Lan thể hiện rõ ràng sự phức tạp của dạng số nhiều trong một số ngôn ngữ, trong đó cần sử dụng nhiều danh mục số nhiều (một, ít, nhiều, khác) để thể hiện chính xác các ngữ cảnh số khác nhau.
Triển khai nhanh chóng:
Các mục nhập stringsdict
có thể được sử dụng trong mã bằng cách chỉ cần tham khảo các khóa được xác định trong tệp khi gọi NSLocalizedString
.
let count = getArticleCount() let formatString = NSLocalizedString("article_count", comment: "Count of articles read by a user") let message = String(format: formatString, count)
Cách tiếp cận này cho phép bạn sửa đổi chuỗi đầu ra một cách thích ứng để phù hợp với ngữ pháp của các ngôn ngữ được hỗ trợ; tất cả điều này chỉ trong một dòng mã.
Lợi ích của stringsdict
Một trong những tính năng mới được giới thiệu với Xcode 15 là String Catalogs được cho là sẽ giúp các nhà phát triển bản địa hóa các ứng dụng iOS và macOS thậm chí còn dễ dàng hơn trước. Mặc dù Localizable.strings
và stringsdict
là những tài nguyên hữu ích để lưu trữ và sắp xếp các chuỗi, nhưng Danh mục chuỗi lại gắn kết hơn và thân thiện hơn với giao diện người dùng hơn để quản lý các chuỗi được bản địa hóa.
Đây là những khía cạnh chính cần được nêu bật trong danh mục chuỗi:
stringsdict
bằng cách cung cấp khả năng kiểm soát tốt hơn các dạng số nhiều và văn bản với các biến thể tùy thuộc vào thành phần UI và loại thiết bị.
Triển khai nhanh chóng:
Giả sử trong một ứng dụng nhắn tin, bạn phải thông báo cho người dùng về số lượng tin nhắn họ chưa đọc. Thông báo phải linh hoạt bằng cách hiển thị số lượng tin nhắn đã nhận và phải điều chỉnh cho phù hợp với loại nội dung.
Thiết lập từng bước:
Tạo Danh mục chuỗi: Thêm Danh mục chuỗi mới vào dự án của bạn. Điều này sẽ tạo ra một tệp .stringcatalog
.
Thêm mục nhập: Sử dụng trình chỉnh sửa để thêm mục nhập cho từng chuỗi cần bản địa hóa. Sau đó, chỉ định khóa, giá trị mặc định và bất kỳ quy tắc số nhiều hoặc tham số thích ứng nào cho mỗi mục nhập.
Bản địa hóa nội dung: Cung cấp bản dịch cho từng ngôn ngữ được hỗ trợ, chỉ định các dạng khác nhau cho số nhiều, điều chỉnh cho các loại thiết bị, v.v.
Triển khai trong Mã: Tham chiếu các chuỗi này bằng cách sử dụng mã định danh được bản địa hóa trong mã Swift của bạn.
<!-- String Catalog Entry --> <key>unread_messages_count</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@messages@</string> <key>messages</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>one</key> <string>You have one unread message.</string> <key>other</key> <string>You have %d unread messages.</string> </dict> </dict>
Bạn có thể truy cập chuỗi này như vậy:
let unreadCount = fetchUnreadMessagesCount() let message = NSLocalizedString("unread_messages_count", value: "You have \(unreadCount) unread messages.", comment: "Notify about unread messages") print(message)
Mặc dù Danh mục chuỗi cung cấp những cải tiến đáng kể nhưng chúng cũng có những thách thức. Đầu tiên, đó là một đường cong học tập; cần có thời gian để làm quen với một hệ thống mới hoặc cách tạo ra thứ gì đó. Một thách thức tiềm ẩn khác mà các nhà phát triển có thể gặp phải liên quan đến thời gian và những điều chỉnh cần thiết để tích hợp Danh mục chuỗi vào các dự án hiện có nơi các tệp bản địa hóa truyền thống đã được tạo và sử dụng.
Danh mục chuỗi trong Swift là cải tiến gần đây nhất của công nghệ bản địa hóa, cung cấp các công cụ không chỉ mạnh mẽ mà còn linh hoạt và thân thiện với người dùng. Bằng cách bổ sung công nghệ như một phần của vòng đời phát triển, các nhóm sẽ cải thiện đáng kể hiệu quả và chất lượng trong quá trình bản địa hóa; do đó, các sản phẩm toàn cầu tốt hơn sẽ được tạo ra.
Tôi sẽ liên tục cập nhật bài viết này với những phát triển mới nhất về công cụ bản địa hóa Swift. Nếu bạn cảm thấy tôi đã bỏ sót điều gì hoặc bạn có suy nghĩ về những gì tôi đã nói, bạn có thể chia sẻ chúng trong hộp bình luận bên dưới. Hãy nhớ theo dõi tôi để biết thêm thông tin thú vị và tin tức mới nhất!