Add Korean localization support#5267
Add Korean localization support#5267hellosunghyun wants to merge 2 commits intoRanchero-Software:mainfrom
Conversation
There was a problem hiding this comment.
Pull request overview
Adds first-pass Korean (ko) localization across NetNewsWire’s Apple platform targets and replaces remaining hard-coded English UI strings so the Korean locale is fully reachable.
Changes:
- Added
ko.lprojresources for iOS/macOS apps plus share extensions, widget, Safari extension, and intents. - Registered
koas a supported region in the Xcode project and populated shared string catalogs (.strings/.xcstrings). - Replaced remaining hard-coded English strings in several iOS/macOS UI flows with localized lookups.
Reviewed changes
Copilot reviewed 42 out of 42 changed files in this pull request and generated 4 comments.
Show a summary per file
| File | Description |
|---|---|
| iOS/ko.lproj/Main.strings | Adds Korean storyboard string table for iOS Main storyboard. |
| iOS/ShareExtension/ko.lproj/Localizable.strings | Adds Korean strings for iOS share extension UI. |
| iOS/ShareExtension/ko.lproj/InfoPlist.strings | Adds Korean Info.plist display strings for iOS share extension. |
| iOS/ShareExtension/ShareViewController.swift | Replaces hard-coded share extension strings with NSLocalizedString. |
| iOS/Settings/SettingsViewController.swift | Localizes error titles/messages used in OPML import/export flows. |
| iOS/Settings/AboutView.swift | Switches previously verbatim SwiftUI text to localized Text keys. |
| iOS/Settings/AboutCreditView.swift | Makes contributor section headers localizable via LocalizedStringKey. |
| iOS/Settings/AboutContributor.swift | Localizes the “and many more” contributor label. |
| iOS/Resources/ko.lproj/Localizable.strings | Adds Korean app-wide Localizable.strings entries for iOS. |
| iOS/Resources/ko.lproj/InfoPlist.strings | Adds Korean iOS app Info.plist strings (privacy + display strings). |
| iOS/IntentsExtension/ko.lproj/Localizable.strings | Adds Korean string(s) for iOS intents extension. |
| iOS/IntentsExtension/ko.lproj/InfoPlist.strings | Adds Korean Info.plist display strings for iOS intents extension. |
| iOS/Inspector/AccountInspectorViewController.swift | Localizes sync-content footer string. |
| iOS/Article/ArticleSearchBar.swift | Localizes key command title and accessibility labels for search UI. |
| iOS/Account/ReaderAPIAccountViewController.swift | Localizes show/hide password buttons and error title. |
| iOS/Account/NewsBlurAccountViewController.swift | Localizes show/hide password buttons and error title. |
| iOS/Account/FeedbinAccountViewController.swift | Localizes show/hide password buttons. |
| Widget/ko.lproj/InfoPlist.strings | Adds Korean widget Info.plist strings. |
| Widget/Resources/Localizable.xcstrings | Adds Korean localizations for widget strings. |
| Shared/DefaultAccountNames.xcstrings | Adds Korean device-variant default account names. |
| NetNewsWire.xcodeproj/project.pbxproj | Registers ko region and wires localized resources into the project. |
| Mac/ko.lproj/UnifiedWindow.strings | Adds Korean strings for macOS unified window nib/xib. |
| Mac/ko.lproj/RenameSheet.strings | Adds Korean strings for macOS rename sheet nib/xib. |
| Mac/ko.lproj/Preferences.strings | Adds Korean strings for macOS Preferences UI. |
| Mac/ko.lproj/Main.strings | Adds Korean strings for macOS Main storyboard/menu resources. |
| Mac/ko.lproj/AddFolderSheet.strings | Adds Korean strings for macOS add-folder sheet. |
| Mac/ko.lproj/AddFeedSheet.strings | Adds Korean strings for macOS add-feed sheet. |
| Mac/ko.lproj/AddFeedFromListSheet.strings | Adds Korean strings for macOS add-feed-from-list sheet. |
| Mac/ShareExtension/ko.lproj/ShareViewController.strings | Adds Korean strings for macOS share extension UI file. |
| Mac/ShareExtension/ko.lproj/Localizable.strings | Adds Korean localized strings used by macOS share extension. |
| Mac/ShareExtension/ko.lproj/InfoPlist.strings | Adds Korean Info.plist strings for macOS share extension. |
| Mac/ShareExtension/ShareViewController.swift | Localizes “Folders” popup menu title. |
| Mac/SafariExtension/ko.lproj/SafariExtensionViewController.strings | Adds Korean strings for Safari extension UI. |
| Mac/SafariExtension/ko.lproj/InfoPlist.strings | Adds Korean Info.plist strings for Safari extension. |
| Mac/Resources/ko.lproj/Localizable.strings | Adds Korean app-wide Localizable.strings entries for macOS. |
| Mac/Resources/ko.lproj/InfoPlist.strings | Adds Korean macOS app Info.plist strings. |
| Mac/Preferences/Accounts/AddAccountsView.swift | Localizes macOS add-account sheet SwiftUI strings. |
| Mac/Preferences/Accounts/AccountsPreferencesViewController.swift | Fixes account-delete alert localization to use formatted strings. |
| Mac/Preferences/Accounts/AccountsDetailView.swift | Localizes macOS account detail labels/help text. |
| Mac/MainWindow/Timeline/TimelineViewController.swift | Localizes swipe action titles (Read/Unread, Star/Unstar). |
| Mac/MainWindow/AddFeed/FolderTreeMenu.swift | Localizes add-feed folder popup menu title. |
| Intents/ko.lproj/Intents.strings | Adds Korean strings for Siri intent definition resources. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| /* Delete Theme Message */ | ||
| "Are you sure you want to delete the theme “%@”?." = "테마 “%@”을 삭제하시겠습니까?."; | ||
|
|
There was a problem hiding this comment.
The Korean value for the delete-theme confirmation string ends with an extra "?." sequence, which will be shown to users. Update the localized value to use normal punctuation (typically just a trailing question mark) and consider fixing the English source string/key so other locales don’t inherit the typo.
| /* Search smart feed title prefix */ | ||
| "Search: " = "검색:"; | ||
|
|
||
| /* See articles in Folder */ |
There was a problem hiding this comment.
The Korean translation for the smart-feed title prefix "Search: " drops the trailing space. This prefix is concatenated with the query string in code, so the UI will render as "검색:query" without spacing. Preserve the trailing space in the localized value (or switch the code to a formatted string such as "Search: %@").
|
|
||
| /* Search smart feed title prefix */ | ||
| "Search: " = "검색:"; | ||
|
|
||
| /* Search */ | ||
| "Search: %@" = "검색: %@"; | ||
|
|
There was a problem hiding this comment.
The Korean translation for the smart-feed title prefix "Search: " drops the trailing space. This prefix is concatenated with the query string in code, so the UI will render as "검색:query" without spacing. Preserve the trailing space in the localized value (or use the existing formatted key "Search: %@" everywhere).
| "localizations" : { | ||
| "en" : { | ||
| "stringUnit" : { | ||
| "state" : "translated", | ||
| "value" : "This widget display unread articles." | ||
| } | ||
| }, | ||
| "ko" : { | ||
| "stringUnit" : { | ||
| "state" : "translated", | ||
| "value" : "이 위젯은 읽지 않은 기사를 표시합니다." | ||
| } | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
There is a grammatical error in the English source string: "This widget display unread articles." should be "This widget displays unread articles." Since xcstrings entries are edited in this PR, correcting it now avoids shipping the typo to English users.
Summary
koas a supported localization in the Xcode project and populate the shared string catalogsStarredlabel to match the Korean terminology used elsewhere in the app after manual QAWhy
NetNewsWire already had localization plumbing in place, but the app shipped only with English UI resources. This change adds a first Korean translation pass across the app targets and closes a handful of hard-coded English strings that would otherwise bypass localization.
Validation
xcodebuild -project NetNewsWire.xcodeproj -scheme NetNewsWire -destination "platform=macOS,arch=arm64" build CODE_SIGNING_ALLOWED=NOxcodebuild -project NetNewsWire.xcodeproj -scheme NetNewsWire-iOS -destination 'platform=iOS Simulator,id=8A7BCEDF-9115-4F24-AEEB-CECA80D86ED3' build CODE_SIGNING_ALLOWED=NOplutil -linton the generatedko.lproj/*.stringsfiles, plus the updatediOS/Resources/ko.lproj/Localizable.stringsNotes
xcodebuild testcompleted the suites but then hung during teardown on this machine