paint-brush
Sự phát triển của bản địa hóa trong Swift: Từ chuỗi đến danh mục chuỗitừ tác giả@mniagolov
108 lượt đọc

Sự phát triển của bản địa hóa trong Swift: Từ chuỗi đến danh mục chuỗi

từ tác giả Maksim Niagolov8m2024/06/12
Read on Terminal Reader

dài quá đọc không nổi

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. 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ế.
featured image - Sự phát triển của bản địa hóa trong Swift: Từ chuỗi đến danh mục chuỗi
Maksim Niagolov HackerNoon profile picture

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.


Những thách thức ban đầu trong việc bản địa hóa

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.

Khái niệm cơ bản về 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.

Ví dụ về mục nhập 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.

Chuyển sang 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

  • Hiệu quả: Điều này giúp tiết kiệm thời gian và công sức mà lẽ ra phải dành cho việc quản lý và sửa đổi các tệp bản địa hóa.
  • Độ chính xác: Giúp nâng cao độ chính xác của bản dịch từ trong đó nhiều ngữ cảnh được cung cấp trực tiếp hơn trong môi trường phát triển.
  • Tính linh hoạt: Hỗ trợ điều chỉnh linh hoạt và theo thời gian thực đối với nội dung được bản địa hóa.

Kỹ thuật bản địa hóa hiện đại với danh mục chuỗi

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.stringsstringsdict 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:

  • Trình chỉnh sửa trực quan: Ngược lại với các tệp văn bản đơn giản truyền thống, Danh mục chuỗi được chỉnh sửa với sự trợ giúp của trình chỉnh sửa trực quan trong Xcode, giúp việc thêm, sửa đổi hoặc xóa các chuỗi bản địa hóa trở nên dễ dàng hơn.


  • Tài liệu nội tuyến: Nhà phát triển có thể trực tiếp cung cấp mô tả và ngữ cảnh trong Danh mục chuỗi, điều này giúp cải thiện đáng kể độ rõ ràng và chính xác của bản dịch.


  • Bản địa hóa động: Danh mục chuỗi hỗ trợ bản địa hóa động, vì vậy các nhà phát triển được phép thay đổi các chuỗi đã bản địa hóa mà không cần thoát khỏi ứng dụng, điều này lý tưởng cho việc thử nghiệm và phát triển lặp lại.


  • Đa dạng hóa và thích ứng nâng cao: Nó cũng khắc phục một số thiếu sót của 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:

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


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


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


  4. 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)



Lợi ích của Danh mục chuỗi

  • Hiệu quả: Tiết kiệm thời gian và công sức cần thiết để quản lý các tệp bản địa hóa.


  • Độ chính xác: Cải thiện độ chính xác bằng cách cung cấp thêm ngữ cảnh trực tiếp ngay trong môi trường phát triển.


  • Tính linh hoạt: Hỗ trợ cập nhật theo thời gian thực và thậm chí động cho nội dung được bản địa hóa, điều này đặc biệt hữu ích trong chu kỳ phát triển nhanh chóng.

Thử thách

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.

Phần kết luận

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!