diff --git a/MyQrCode.xcodeproj/xcshareddata/xcschemes/MyQrCode.xcscheme b/MyQrCode.xcodeproj/xcshareddata/xcschemes/MyQrCode.xcscheme new file mode 100644 index 0000000..d7b4809 --- /dev/null +++ b/MyQrCode.xcodeproj/xcshareddata/xcschemes/MyQrCode.xcscheme @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcschemes/xcschememanagement.plist b/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcschemes/xcschememanagement.plist index 25f757a..7f3a464 100644 --- a/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/MyQrCode.xcodeproj/xcuserdata/yc.xcuserdatad/xcschemes/xcschememanagement.plist @@ -10,5 +10,23 @@ 0 + SuppressBuildableAutocreation + + 5817662E2E54241200C1B687 + + primary + + + 5817663B2E54241300C1B687 + + primary + + + 581766452E54241300C1B687 + + primary + + + diff --git a/MyQrCode/LanguageManager.swift b/MyQrCode/LanguageManager.swift index 0509d23..0c199bf 100644 --- a/MyQrCode/LanguageManager.swift +++ b/MyQrCode/LanguageManager.swift @@ -13,7 +13,7 @@ enum Language: String, CaseIterable { case .english: return "English" case .chinese: - return NSLocalizedString("chinese_language", comment: "Chinese language") + return "chinese_language".localized case .thai: return "ไทย" } diff --git a/MyQrCode/Models/BarcodeValidator.swift b/MyQrCode/Models/BarcodeValidator.swift index b631c37..770252a 100644 --- a/MyQrCode/Models/BarcodeValidator.swift +++ b/MyQrCode/Models/BarcodeValidator.swift @@ -46,15 +46,15 @@ class BarcodeValidator { formattedContent: formatEAN13(content), errorMessage: nil, expectedLength: 13, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } else { return ValidationResult( isValid: false, formattedContent: content, - errorMessage: NSLocalizedString("ean_13_must_be_13_digits", comment: "EAN-13 must be 13 digits"), + errorMessage: "ean_13_must_be_13_digits".localized, expectedLength: 13, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } } @@ -71,15 +71,15 @@ class BarcodeValidator { formattedContent: formatEAN8(content), errorMessage: nil, expectedLength: 8, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } else { return ValidationResult( isValid: false, formattedContent: content, - errorMessage: NSLocalizedString("ean_8_must_be_8_digits", comment: "EAN-8 must be 8 digits"), + errorMessage: "ean_8_must_be_8_digits".localized, expectedLength: 8, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } } @@ -96,15 +96,15 @@ class BarcodeValidator { formattedContent: formatUPCE(content), errorMessage: nil, expectedLength: 8, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } else { return ValidationResult( isValid: false, formattedContent: content, - errorMessage: NSLocalizedString("upc_e_must_be_8_digits", comment: "UPC-E must be 8 digits"), + errorMessage: "upc_e_must_be_8_digits".localized, expectedLength: 8, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } } @@ -121,15 +121,15 @@ class BarcodeValidator { formattedContent: formatCode39(content), errorMessage: nil, expectedLength: nil, - allowedCharacters: NSLocalizedString("code_39_characters", comment: "Code 39 allowed characters") + allowedCharacters: "code_39_characters".localized ) } else { return ValidationResult( isValid: false, formattedContent: content, - errorMessage: NSLocalizedString("code_39_only_contains", comment: "Code 39 only contains specific characters"), + errorMessage: "code_39_only_contains".localized, expectedLength: nil, - allowedCharacters: NSLocalizedString("code_39_characters", comment: "Code 39 allowed characters") + allowedCharacters: "code_39_characters".localized ) } } @@ -148,15 +148,15 @@ class BarcodeValidator { formattedContent: formatCode128(content), errorMessage: nil, expectedLength: nil, - allowedCharacters: NSLocalizedString("code_128_characters", comment: "Code 128 allowed characters") + allowedCharacters: "code_128_characters".localized ) } else { return ValidationResult( isValid: false, formattedContent: content, - errorMessage: NSLocalizedString("code_128_only_contains", comment: "Code 128 only contains ASCII characters"), + errorMessage: "code_128_only_contains".localized, expectedLength: nil, - allowedCharacters: NSLocalizedString("code_128_characters", comment: "Code 128 allowed characters") + allowedCharacters: "code_128_characters".localized ) } } @@ -173,15 +173,15 @@ class BarcodeValidator { formattedContent: formatITF14(content), errorMessage: nil, expectedLength: 14, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } else { return ValidationResult( isValid: false, formattedContent: content, - errorMessage: NSLocalizedString("itf_14_must_be_14_digits", comment: "ITF-14 must be 14 digits"), + errorMessage: "itf_14_must_be_14_digits".localized, expectedLength: 14, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ) } } @@ -198,15 +198,15 @@ class BarcodeValidator { formattedContent: formatPDF417(content), errorMessage: nil, expectedLength: nil, - allowedCharacters: NSLocalizedString("pdf417_characters", comment: "PDF417 allowed characters") + allowedCharacters: "pdf417_characters".localized ) } else { return ValidationResult( isValid: false, formattedContent: content, - errorMessage: NSLocalizedString("pdf417_only_contains", comment: "PDF417 only contains ASCII characters"), + errorMessage: "pdf417_only_contains".localized, expectedLength: nil, - allowedCharacters: NSLocalizedString("pdf417_characters", comment: "PDF417 allowed characters") + allowedCharacters: "pdf417_characters".localized ) } } diff --git a/MyQrCode/Models/HistoryEnums.swift b/MyQrCode/Models/HistoryEnums.swift index e9c6ea2..35532dc 100644 --- a/MyQrCode/Models/HistoryEnums.swift +++ b/MyQrCode/Models/HistoryEnums.swift @@ -100,9 +100,9 @@ public enum DataSource: String, CaseIterable { var displayName: String { switch self { case .scanned: - return NSLocalizedString("scanned", comment: "Scanned") + return "scanned".localized case .created: - return NSLocalizedString("manually_created", comment: "Manually created") + return "manually_created".localized } } @@ -195,12 +195,12 @@ public struct QRCodeStyleData: Codable { // 获取样式的描述信息 public var styleDescription: String { - var description = String(format: NSLocalizedString("style_description_format", comment: "Style description format"), foregroundColor, backgroundColor, dotType, eyeType) + var description = String(format: "style_description_format".localized, foregroundColor, backgroundColor, dotType, eyeType) if let logo = logo { - description += String(format: NSLocalizedString("style_logo_format", comment: "Style logo format"), logo) + description += String(format: "style_logo_format".localized, logo) } if hasCustomLogo { - description += NSLocalizedString("custom_logo", comment: "Custom logo") + description += "custom_logo".localized } return description } diff --git a/MyQrCode/Models/QRCodeParser.swift b/MyQrCode/Models/QRCodeParser.swift index 86f1ccf..1e65924 100644 --- a/MyQrCode/Models/QRCodeParser.swift +++ b/MyQrCode/Models/QRCodeParser.swift @@ -220,7 +220,7 @@ class QRCodeParser { // 默认为文本类型 return ParsedQRData( type: .text, - title: NSLocalizedString("text_information", comment: "Text information"), + title: "text_information".localized, subtitle: trimmedContent.count > 50 ? String(trimmedContent.prefix(50)) + "..." : trimmedContent, icon: "text.quote" ) @@ -245,8 +245,8 @@ class QRCodeParser { } } - let title = NSLocalizedString("wifi_network", comment: "Wi-Fi network") - let subtitle = String(format: NSLocalizedString("wifi_network_info", comment: "Wi-Fi network information"), ssid, encryption, password.isEmpty ? NSLocalizedString("not_set", comment: "Not set") : NSLocalizedString("password_set", comment: "Password set")) + let title = "wifi_network".localized + let subtitle = String(format: "wifi_network_info".localized, ssid, encryption, password.isEmpty ? "not_set".localized : "password_set".localized) return ParsedQRData( type: .wifi, @@ -262,7 +262,7 @@ class QRCodeParser { return ParsedQRData( type: .mail, - title: NSLocalizedString("email_address", comment: "Email address"), + title: "email_address".localized, subtitle: email, icon: "envelope" ) @@ -274,7 +274,7 @@ class QRCodeParser { return ParsedQRData( type: .phone, - title: NSLocalizedString("phone_number", comment: "Phone number"), + title: "phone_number".localized, subtitle: phone, icon: "phone" ) @@ -288,8 +288,8 @@ class QRCodeParser { let phone = components.first ?? "" let message = components.count > 1 ? components[1] : "" - let title = NSLocalizedString("sms", comment: "SMS") - let subtitle = String(format: NSLocalizedString("sms_number_content", comment: "SMS number and content"), phone, message) + let title = "sms".localized + let subtitle = String(format: "sms_number_content".localized, phone, message) return ParsedQRData( type: .sms, @@ -350,13 +350,13 @@ class QRCodeParser { } var subtitle = "" - if !name.isEmpty { subtitle += String(format: NSLocalizedString("contact_name", comment: "Contact name"), name) + "\n" } - if !phone.isEmpty { subtitle += String(format: NSLocalizedString("contact_phone", comment: "Contact phone"), phone) + "\n" } - if !email.isEmpty { subtitle += String(format: NSLocalizedString("contact_email", comment: "Contact email"), email) + "\n" } - if !company.isEmpty { subtitle += String(format: NSLocalizedString("contact_company", comment: "Contact company"), company) + "\n" } - if !title.isEmpty { subtitle += String(format: NSLocalizedString("contact_title", comment: "Contact title"), title) + "\n" } - if !address.isEmpty { subtitle += String(format: NSLocalizedString("contact_address", comment: "Contact address"), address) + "\n" } - if !website.isEmpty { subtitle += String(format: NSLocalizedString("contact_website", comment: "Contact website"), website) + "\n" } + if !name.isEmpty { subtitle += String(format: "contact_name".localized, name) + "\n" } + if !phone.isEmpty { subtitle += String(format: "contact_phone".localized, phone) + "\n" } + if !email.isEmpty { subtitle += String(format: "contact_email".localized, email) + "\n" } + if !company.isEmpty { subtitle += String(format: "contact_company".localized, company) + "\n" } + if !title.isEmpty { subtitle += String(format: "contact_title".localized, title) + "\n" } + if !address.isEmpty { subtitle += String(format: "contact_address".localized, address) + "\n" } + if !website.isEmpty { subtitle += String(format: "contact_website".localized, website) + "\n" } // 移除最后一个换行符 if subtitle.hasSuffix("\n") { @@ -365,7 +365,7 @@ class QRCodeParser { return ParsedQRData( type: .vcard, - title: NSLocalizedString("contact_information", comment: "Contact information"), + title: "contact_information".localized, subtitle: subtitle, icon: "person.crop.rectangle" ) @@ -418,7 +418,7 @@ class QRCodeParser { let year = String(birthdayValue.prefix(4)) let month = String(birthdayValue.dropFirst(4).prefix(2)) let day = String(birthdayValue.dropFirst(6)) - birthday = String(format: NSLocalizedString("birthday_format", comment: "Birthday format"), year, month, day) + birthday = String(format: "birthday_format".localized, year, month, day) } else { birthday = birthdayValue } @@ -428,15 +428,15 @@ class QRCodeParser { } var subtitle = "" - if !name.isEmpty { subtitle += String(format: NSLocalizedString("contact_name", comment: "Contact name"), name) + "\n" } - if !nickname.isEmpty { subtitle += String(format: NSLocalizedString("contact_nickname", comment: "Contact nickname"), nickname) + "\n" } - if !phone.isEmpty { subtitle += String(format: NSLocalizedString("contact_phone", comment: "Contact phone"), phone) + "\n" } - if !email.isEmpty { subtitle += String(format: NSLocalizedString("contact_email", comment: "Contact email"), email) + "\n" } - if !company.isEmpty { subtitle += String(format: NSLocalizedString("contact_company", comment: "Contact company"), company) + "\n" } - if !address.isEmpty { subtitle += String(format: NSLocalizedString("contact_address", comment: "Contact address"), address) + "\n" } - if !website.isEmpty { subtitle += String(format: NSLocalizedString("contact_website", comment: "Contact website"), website) + "\n" } - if !birthday.isEmpty { subtitle += String(format: NSLocalizedString("contact_birthday", comment: "Contact birthday"), birthday) + "\n" } - if !note.isEmpty { subtitle += String(format: NSLocalizedString("contact_note", comment: "Contact note"), note) + "\n" } + if !name.isEmpty { subtitle += String(format: "contact_name".localized, name) + "\n" } + if !nickname.isEmpty { subtitle += String(format: "contact_nickname".localized, nickname) + "\n" } + if !phone.isEmpty { subtitle += String(format: "contact_phone".localized, phone) + "\n" } + if !email.isEmpty { subtitle += String(format: "contact_email".localized, email) + "\n" } + if !company.isEmpty { subtitle += String(format: "contact_company".localized, company) + "\n" } + if !address.isEmpty { subtitle += String(format: "contact_address".localized, address) + "\n" } + if !website.isEmpty { subtitle += String(format: "contact_website".localized, website) + "\n" } + if !birthday.isEmpty { subtitle += String(format: "contact_birthday".localized, birthday) + "\n" } + if !note.isEmpty { subtitle += String(format: "contact_note".localized, note) + "\n" } // 移除最后一个换行符 if subtitle.hasSuffix("\n") { @@ -445,7 +445,7 @@ class QRCodeParser { return ParsedQRData( type: .mecard, - title: NSLocalizedString("contact_information", comment: "Contact information"), + title: "contact_information".localized, subtitle: subtitle, icon: "person.crop.rectangle" ) @@ -478,13 +478,13 @@ class QRCodeParser { let formattedStartTime = formatCalendarTime(startTime) let formattedEndTime = formatCalendarTime(endTime) - let title = NSLocalizedString("calendar_event", comment: "Calendar event") - var subtitle = String(format: NSLocalizedString("calendar_event_info", comment: "Calendar event information"), summary, formattedStartTime, formattedEndTime) + let title = "calendar_event".localized + var subtitle = String(format: "calendar_event_info".localized, summary, formattedStartTime, formattedEndTime) if !location.isEmpty { - subtitle += String(format: NSLocalizedString("calendar_event_location", comment: "Calendar event location"), location) + subtitle += String(format: "calendar_event_location".localized, location) } if !description.isEmpty { - subtitle += String(format: NSLocalizedString("calendar_event_description", comment: "Calendar event description"), description) + subtitle += String(format: "calendar_event_description".localized, description) } return ParsedQRData( @@ -518,8 +518,8 @@ class QRCodeParser { return ParsedQRData( type: .instagram, - title: NSLocalizedString("instagram", comment: "Instagram"), - subtitle: String(format: NSLocalizedString("instagram_username", comment: "Instagram username"), username), + title: "instagram".localized, + subtitle: String(format: "instagram_username".localized, username), icon: "camera" ) } @@ -530,8 +530,8 @@ class QRCodeParser { return ParsedQRData( type: .facebook, - title: NSLocalizedString("facebook", comment: "Facebook"), - subtitle: String(format: NSLocalizedString("facebook_profile_id", comment: "Facebook profile ID"), profileId), + title: "facebook".localized, + subtitle: String(format: "facebook_profile_id".localized, profileId), icon: "person.2" ) } @@ -542,8 +542,8 @@ class QRCodeParser { return ParsedQRData( type: .spotify, - title: NSLocalizedString("spotify", comment: "Spotify"), - subtitle: String(format: NSLocalizedString("spotify_search_query", comment: "Spotify search query"), searchQuery), + title: "spotify".localized, + subtitle: String(format: "spotify_search_query".localized, searchQuery), icon: "music.note" ) } @@ -560,8 +560,8 @@ class QRCodeParser { return ParsedQRData( type: .twitter, - title: NSLocalizedString("x", comment: "X"), - subtitle: String(format: NSLocalizedString("twitter_username", comment: "Twitter username"), username), + title: "x".localized, + subtitle: String(format: "twitter_username".localized, username), icon: "bird" ) } @@ -572,8 +572,8 @@ class QRCodeParser { return ParsedQRData( type: .whatsapp, - title: NSLocalizedString("whatsapp", comment: "WhatsApp"), - subtitle: String(format: NSLocalizedString("whatsapp_phone_number", comment: "WhatsApp phone number"), phone), + title: "whatsapp".localized, + subtitle: String(format: "whatsapp_phone_number".localized, phone), icon: "message.circle" ) } @@ -584,8 +584,8 @@ class QRCodeParser { return ParsedQRData( type: .viber, - title: NSLocalizedString("viber", comment: "Viber"), - subtitle: String(format: NSLocalizedString("viber_phone_number", comment: "Viber phone number"), phone), + title: "viber".localized, + subtitle: String(format: "viber_phone_number".localized, phone), icon: "bubble.left.and.bubble.right" ) } @@ -596,8 +596,8 @@ class QRCodeParser { return ParsedQRData( type: .snapchat, - title: NSLocalizedString("snapchat", comment: "Snapchat"), - subtitle: String(format: NSLocalizedString("snapchat_username", comment: "Snapchat username"), username), + title: "snapchat".localized, + subtitle: String(format: "snapchat_username".localized, username), icon: "camera.viewfinder" ) } @@ -620,8 +620,8 @@ class QRCodeParser { return ParsedQRData( type: .tiktok, - title: NSLocalizedString("tiktok", comment: "TikTok"), - subtitle: String(format: NSLocalizedString("tiktok_username", comment: "TikTok username"), username), + title: "tiktok".localized, + subtitle: String(format: "tiktok_username".localized, username), icon: "music.mic" ) } @@ -630,7 +630,7 @@ class QRCodeParser { private static func parseURL(_ content: String) -> ParsedQRData { return ParsedQRData( type: .url, - title: NSLocalizedString("url_link", comment: "URL link"), + title: "url_link".localized, subtitle: content, icon: "link" ) @@ -644,8 +644,8 @@ class QRCodeParser { let latitude = coords.first ?? "" let longitude = coords.count > 1 ? coords[1] : "" - let title = NSLocalizedString("geolocation", comment: "Geolocation") - let subtitle = String(format: NSLocalizedString("geolocation_coordinates", comment: "Geolocation coordinates"), latitude, longitude) + let title = "geolocation".localized + let subtitle = String(format: "geolocation_coordinates".localized, latitude, longitude) return ParsedQRData( type: .location, diff --git a/MyQrCode/ScannerView/ScannerView.swift b/MyQrCode/ScannerView/ScannerView.swift index 4993483..e31e24a 100644 --- a/MyQrCode/ScannerView/ScannerView.swift +++ b/MyQrCode/ScannerView/ScannerView.swift @@ -363,7 +363,7 @@ struct ScannerView: View { let qrResults = detectedQR.enumerated().map { index, qrCode in DetectedCode( type: "QR Code", - content: qrCode.messageString ?? NSLocalizedString("unknown_content", comment: "Unknown content"), + content: qrCode.messageString ?? "unknown_content".localized, bounds: qrCode.bounds, source: .image ) @@ -393,7 +393,7 @@ struct ScannerView: View { } } else { self.isDecodingImage = false - self.decodeFailureMessage = NSLocalizedString("no_codes_detected_in_image", comment: "No codes detected in image") + self.decodeFailureMessage = "no_codes_detected_in_image".localized self.showDecodeFailure = true logWarning("❌ 图片中未检测到二维码或条形码", className: "ScannerView") } @@ -448,7 +448,7 @@ struct ScannerView: View { return results.enumerated().map { index, observation in let barcodeType = getBarcodeTypeString(from: observation.symbology) - let content = observation.payloadStringValue ?? NSLocalizedString("unknown_content", comment: "Unknown content") + let content = observation.payloadStringValue ?? "unknown_content".localized logInfo("检测到条形码 #\(index + 1): 类型=\(barcodeType), 内容=\(content)", className: "ScannerView") diff --git a/MyQrCode/ScannerView/ScanningOverlayView.swift b/MyQrCode/ScannerView/ScanningOverlayView.swift index f05bad8..5710fd2 100644 --- a/MyQrCode/ScannerView/ScanningOverlayView.swift +++ b/MyQrCode/ScannerView/ScanningOverlayView.swift @@ -85,7 +85,7 @@ struct ScanningBottomButtonsView: View { Image(systemName: "photo.on.rectangle.angled") .font(.system(size: 16, weight: .semibold)) - Text(NSLocalizedString("image_decode", comment: "Image decode")) + Text("image_decode".localized) .font(.subheadline) .fontWeight(.medium) } @@ -118,7 +118,7 @@ struct ScanningStyleSelectorView: View { var body: some View { VStack(spacing: 12) { // 标题 - Text(NSLocalizedString("scanning_line_style", comment: "Scanning line style")) + Text("scanning_line_style".localized) .font(.caption) .foregroundColor(.white.opacity(0.8)) .padding(.bottom, 4) diff --git a/MyQrCode/Views/BarcodeDetailView.swift b/MyQrCode/Views/BarcodeDetailView.swift index 45034b2..f91af5a 100644 --- a/MyQrCode/Views/BarcodeDetailView.swift +++ b/MyQrCode/Views/BarcodeDetailView.swift @@ -29,7 +29,7 @@ struct BarcodeDetailView: View { } .padding() } - .navigationTitle(NSLocalizedString("barcode_detail", comment: "Barcode detail")) + .navigationTitle("barcode_detail".localized) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { @@ -51,8 +51,8 @@ struct BarcodeDetailView: View { ShareSheet(activityItems: [historyItem.content ?? ""]) } } - .alert(NSLocalizedString("tip", comment: "Tip"), isPresented: $showingAlert) { - Button(NSLocalizedString("confirm", comment: "Confirm")) { } + .alert("tip".localized, isPresented: $showingAlert) { + Button("confirm".localized) { } } message: { Text(alertMessage) } @@ -78,7 +78,7 @@ struct BarcodeDetailView: View { ) } - Text(NSLocalizedString("scan_this_barcode", comment: "Scan this barcode")) + Text("scan_this_barcode".localized) .font(.caption) .foregroundColor(.secondary) } @@ -92,7 +92,7 @@ struct BarcodeDetailView: View { .font(.title2) .foregroundColor(.green) - Text(NSLocalizedString("barcode_type", comment: "Barcode type")) + Text("barcode_type".localized) .font(.headline) Spacer() @@ -129,7 +129,7 @@ struct BarcodeDetailView: View { .font(.title2) .foregroundColor(.blue) - Text(NSLocalizedString("barcode_content", comment: "Barcode content")) + Text("barcode_content".localized) .font(.headline) Spacer() @@ -142,14 +142,14 @@ struct BarcodeDetailView: View { .font(.title3) .foregroundColor(.blue) - Text(String(format: NSLocalizedString("content_length", comment: "Content length"), content.count)) + Text(String(format: "content_length".localized, content.count)) .font(.title3) .fontWeight(.medium) Spacer() } - Text(NSLocalizedString("data_content", comment: "Data content")) + Text("data_content".localized) .font(.subheadline) .foregroundColor(.secondary) .padding(.top, 4) @@ -173,7 +173,7 @@ struct BarcodeDetailView: View { .font(.title2) .foregroundColor(.purple) - Text(NSLocalizedString("original_content", comment: "Original content")) + Text("original_content".localized) .font(.headline) Spacer() @@ -208,7 +208,7 @@ struct BarcodeDetailView: View { Image(systemName: historyItem.isFavorite ? "heart.fill" : "heart") .foregroundColor(historyItem.isFavorite ? .red : .gray) - Text(historyItem.isFavorite ? NSLocalizedString("unfavorite", comment: "Unfavorite") : NSLocalizedString("favorite", comment: "Favorite")) + Text(historyItem.isFavorite ? "unfavorite".localized : "favorite".localized) .fontWeight(.medium) } .frame(maxWidth: .infinity) @@ -224,7 +224,7 @@ struct BarcodeDetailView: View { Image(systemName: "doc.on.doc") .foregroundColor(.blue) - Text(NSLocalizedString("copy_content", comment: "Copy content")) + Text("copy_content".localized) .fontWeight(.medium) } .frame(maxWidth: .infinity) @@ -243,7 +243,7 @@ struct BarcodeDetailView: View { Image(systemName: "photo") .foregroundColor(.green) - Text(NSLocalizedString("share_barcode_image", comment: "Share barcode image")) + Text("share_barcode_image".localized) .fontWeight(.medium) } .frame(maxWidth: .infinity) @@ -283,7 +283,7 @@ struct BarcodeDetailView: View { historyItem.isFavorite.toggle() coreDataManager.save() - let message = historyItem.isFavorite ? NSLocalizedString("added_to_favorites", comment: "Added to favorites") : NSLocalizedString("removed_from_favorites", comment: "Removed from favorites") + let message = historyItem.isFavorite ? "added_to_favorites".localized : "removed_from_favorites".localized alertMessage = message showingAlert = true } @@ -292,7 +292,7 @@ struct BarcodeDetailView: View { private func copyContent() { if let content = historyItem.content { UIPasteboard.general.string = content - alertMessage = NSLocalizedString("content_copied_to_clipboard", comment: "Content copied to clipboard") + alertMessage = "content_copied_to_clipboard".localized showingAlert = true } } diff --git a/MyQrCode/Views/BarcodePreviewView.swift b/MyQrCode/Views/BarcodePreviewView.swift index d4f50f2..14ae0c0 100644 --- a/MyQrCode/Views/BarcodePreviewView.swift +++ b/MyQrCode/Views/BarcodePreviewView.swift @@ -24,11 +24,11 @@ struct BarcodePreviewView: View { .font(.system(size: 32)) .foregroundColor(.gray) - Text(NSLocalizedString("cannot_generate_barcode", comment: "Cannot generate barcode")) + Text("cannot_generate_barcode".localized) .font(.caption) .foregroundColor(.gray) - Text(NSLocalizedString("check_input_format", comment: "Please check input content format")) + Text("check_input_format".localized) .font(.caption2) .foregroundColor(.gray) } diff --git a/MyQrCode/Views/BarcodeValidationInfoView.swift b/MyQrCode/Views/BarcodeValidationInfoView.swift index 36fea59..6739603 100644 --- a/MyQrCode/Views/BarcodeValidationInfoView.swift +++ b/MyQrCode/Views/BarcodeValidationInfoView.swift @@ -13,7 +13,7 @@ struct BarcodeValidationInfoView: View { Image(systemName: result.isValid ? "checkmark.circle.fill" : "xmark.circle.fill") .foregroundColor(result.isValid ? .green : .red) - Text(result.isValid ? NSLocalizedString("format_correct", comment: "Format correct") : NSLocalizedString("format_error", comment: "Format error")) + Text(result.isValid ? "format_correct".localized : "format_error".localized) .font(.caption) .foregroundColor(result.isValid ? .green : .red) .fontWeight(.medium) @@ -36,7 +36,7 @@ struct BarcodeValidationInfoView: View { Image(systemName: "number") .foregroundColor(.blue) .font(.caption) - Text(String(format: NSLocalizedString("length_requirement", comment: "Length requirement"), expectedLength)) + Text(String(format: "length_requirement".localized, expectedLength)) .font(.caption) .foregroundColor(.blue) } @@ -47,7 +47,7 @@ struct BarcodeValidationInfoView: View { Image(systemName: "character") .foregroundColor(.blue) .font(.caption) - Text(String(format: NSLocalizedString("allowed_characters", comment: "Allowed characters"), allowedCharacters)) + Text(String(format: "allowed_characters".localized, allowedCharacters)) .font(.caption) .foregroundColor(.blue) } @@ -61,7 +61,7 @@ struct BarcodeValidationInfoView: View { Image(systemName: "textformat") .foregroundColor(.green) .font(.caption) - Text(String(format: NSLocalizedString("formatted_content", comment: "Formatted content"), result.formattedContent)) + Text(String(format: "formatted_content".localized, result.formattedContent)) .font(.caption) .foregroundColor(.green) .fontWeight(.medium) @@ -74,7 +74,7 @@ struct BarcodeValidationInfoView: View { Image(systemName: "info.circle") .foregroundColor(.blue) .font(.caption) - Text(String(format: NSLocalizedString("please_enter_valid_format", comment: "Please enter valid format"), barcodeType.displayName)) + Text(String(format: "please_enter_valid_format".localized, barcodeType.displayName)) .font(.caption) .foregroundColor(.blue) } @@ -97,7 +97,7 @@ struct BarcodeValidationInfoView: View { formattedContent: "123 4567 8901 2", errorMessage: nil, expectedLength: 13, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ), barcodeType: .ean13 ) @@ -107,9 +107,9 @@ struct BarcodeValidationInfoView: View { validationResult: BarcodeValidator.ValidationResult( isValid: false, formattedContent: "12345", - errorMessage: NSLocalizedString("ean_13_must_be_13_digits", comment: "EAN-13 must be 13 digits"), + errorMessage: "ean_13_must_be_13_digits".localized, expectedLength: 13, - allowedCharacters: NSLocalizedString("numbers_0_9", comment: "Numbers 0-9") + allowedCharacters: "numbers_0_9".localized ), barcodeType: .ean13 ) diff --git a/MyQrCode/Views/CodeContentInputView.swift b/MyQrCode/Views/CodeContentInputView.swift index c57b990..815fe1e 100644 --- a/MyQrCode/Views/CodeContentInputView.swift +++ b/MyQrCode/Views/CodeContentInputView.swift @@ -83,11 +83,11 @@ struct CodeContentInputView: View { // 输入统计与验证状态 HStack { if let result = validationResult, result.isValid { - Text(NSLocalizedString("format_correct", comment: "Format correct")) + Text("format_correct".localized) .font(.caption2) .foregroundColor(.green) } else if !content.isEmpty { - Text(NSLocalizedString("format_checking", comment: "Format checking")) + Text("format_checking".localized) .font(.caption2) .foregroundColor(.orange) } @@ -229,19 +229,19 @@ struct CodeContentInputView: View { private func getBarcodeFormatHint() -> String { switch selectedBarcodeType { case .ean13: - return NSLocalizedString("ean_13_format_hint", comment: "EAN-13 format hint") + return "ean_13_format_hint".localized case .ean8: - return NSLocalizedString("ean_8_format_hint", comment: "EAN-8 format hint") + return "ean_8_format_hint".localized case .upce: - return NSLocalizedString("upc_e_format_hint", comment: "UPC-E format hint") + return "upc_e_format_hint".localized case .code39: - return NSLocalizedString("code_39_format_hint", comment: "Code 39 format hint") + return "code_39_format_hint".localized case .code128: - return NSLocalizedString("code_128_format_hint", comment: "Code 128 format hint") + return "code_128_format_hint".localized case .itf14: - return NSLocalizedString("itf_14_format_hint", comment: "ITF-14 format hint") + return "itf_14_format_hint".localized case .pdf417: - return NSLocalizedString("pdf417_format_hint", comment: "PDF417 format hint") + return "pdf417_format_hint".localized } } @@ -249,22 +249,22 @@ struct CodeContentInputView: View { if selectedDataType == .barcode { switch selectedBarcodeType { case .ean13: - return NSLocalizedString("input_13_digits", comment: "Input 13 digits") + return "input_13_digits".localized case .ean8: - return NSLocalizedString("input_8_digits", comment: "Input 8 digits") + return "input_8_digits".localized case .upce: - return NSLocalizedString("input_8_digits", comment: "Input 8 digits") + return "input_8_digits".localized case .code39: - return NSLocalizedString("input_letters_numbers", comment: "Input letters and numbers") + return "input_letters_numbers".localized case .code128: - return NSLocalizedString("input_any_characters", comment: "Input any characters") + return "input_any_characters".localized case .itf14: - return NSLocalizedString("input_14_digits", comment: "Input 14 digits") + return "input_14_digits".localized case .pdf417: - return NSLocalizedString("input_any_characters", comment: "Input any characters") + return "input_any_characters".localized } } else { - return NSLocalizedString("please_enter_content", comment: "Please enter content") + return "please_enter_content".localized } } diff --git a/MyQrCode/Views/CodeTypeSelectionView.swift b/MyQrCode/Views/CodeTypeSelectionView.swift index 1838728..448346d 100644 --- a/MyQrCode/Views/CodeTypeSelectionView.swift +++ b/MyQrCode/Views/CodeTypeSelectionView.swift @@ -95,7 +95,7 @@ struct CodeTypeSelectionView: View { )) ) { HStack(spacing: 8) { - Text(NSLocalizedString("next", comment: "Next")) + Text("next".localized) .font(.system(size: 18, weight: .semibold)) .foregroundColor(.white) @@ -113,7 +113,7 @@ struct CodeTypeSelectionView: View { .padding(.horizontal, 20) .padding(.bottom, 30) } - .navigationTitle(NSLocalizedString("select_type", comment: "Select type")) + .navigationTitle("select_type".localized) .navigationBarTitleDisplayMode(.inline) } } diff --git a/MyQrCode/Views/Components/InputComponentFactory.swift b/MyQrCode/Views/Components/InputComponentFactory.swift index d8e5cbc..d550a76 100644 --- a/MyQrCode/Views/Components/InputComponentFactory.swift +++ b/MyQrCode/Views/Components/InputComponentFactory.swift @@ -262,41 +262,41 @@ struct InputComponentFactory { static func getPlaceholderText(for qrCodeType: QRCodeType) -> String { switch qrCodeType { case .text: - return NSLocalizedString("input_any_text_content", comment: "Input any text content") + return "input_any_text_content".localized case .phone: - return NSLocalizedString("input_phone_number", comment: "Input phone number") + return "input_phone_number".localized case .sms: - return NSLocalizedString("input_sms_content", comment: "Input SMS content") + return "input_sms_content".localized case .wifi: - return NSLocalizedString("input_wifi_info", comment: "Input WiFi information") + return "input_wifi_info".localized case .vcard: - return NSLocalizedString("input_contact_info", comment: "Input contact information") + return "input_contact_info".localized case .mecard: - return NSLocalizedString("input_contact_info", comment: "Input contact information") + return "input_contact_info".localized case .location: - return NSLocalizedString("input_location_info", comment: "Input location information") + return "input_location_info".localized case .calendar: - return NSLocalizedString("input_calendar_event_info", comment: "Input calendar event information") + return "input_calendar_event_info".localized case .instagram: - return NSLocalizedString("input_instagram_username", comment: "Input Instagram username") + return "input_instagram_username".localized case .facebook: - return NSLocalizedString("input_facebook_user_id_or_link", comment: "Input Facebook user ID or link") + return "input_facebook_user_id_or_link".localized case .spotify: - return NSLocalizedString("input_artist_and_song_info", comment: "Input artist and song information") + return "input_artist_and_song_info".localized case .twitter: - return NSLocalizedString("input_x_info", comment: "Input X information") + return "input_x_info".localized case .whatsapp: - return NSLocalizedString("input_whatsapp_phone_number", comment: "Input WhatsApp phone number") + return "input_whatsapp_phone_number".localized case .viber: - return NSLocalizedString("input_viber_phone_number", comment: "Input Viber phone number") + return "input_viber_phone_number".localized case .snapchat: - return NSLocalizedString("input_snapchat_info", comment: "Input Snapchat information") + return "input_snapchat_info".localized case .tiktok: - return NSLocalizedString("input_tiktok_info", comment: "Input TikTok information") + return "input_tiktok_info".localized case .mail: - return NSLocalizedString("input_email_content", comment: "Input email content") + return "input_email_content".localized case .url: - return NSLocalizedString("input_website_url", comment: "Input website URL") + return "input_website_url".localized } } diff --git a/MyQrCode/Views/Components/InputFieldView.swift b/MyQrCode/Views/Components/InputFieldView.swift index 917e792..1753161 100644 --- a/MyQrCode/Views/Components/InputFieldView.swift +++ b/MyQrCode/Views/Components/InputFieldView.swift @@ -173,15 +173,15 @@ extension InputFieldView { #Preview { VStack(spacing: 16) { InputFieldView.text( - title: NSLocalizedString("username", comment: "Username"), + title: "username".localized, isRequired: true, - placeholder: NSLocalizedString("enter_username", comment: "Please enter username"), + placeholder: "enter_username".localized, text: .constant(""), icon: "person" ) InputFieldView.email( - title: NSLocalizedString("email_address", comment: "Email address"), + title: "email_address".localized, isRequired: true, placeholder: "user@example.com", text: .constant(""), @@ -189,7 +189,7 @@ extension InputFieldView { ) InputFieldView.phone( - title: NSLocalizedString("phone_number", comment: "Phone number"), + title: "phone_number".localized, isRequired: true, placeholder: "+1 (555) 123-4567", text: .constant(""), @@ -197,9 +197,9 @@ extension InputFieldView { ) InputFieldView.password( - title: NSLocalizedString("password", comment: "Password"), + title: "password".localized, isRequired: true, - placeholder: NSLocalizedString("enter_password", comment: "Please enter password"), + placeholder: "enter_password".localized, text: .constant(""), icon: "lock" ) diff --git a/MyQrCode/Views/Components/KeyboardToolbarView.swift b/MyQrCode/Views/Components/KeyboardToolbarView.swift index f282bc9..be76e97 100644 --- a/MyQrCode/Views/Components/KeyboardToolbarView.swift +++ b/MyQrCode/Views/Components/KeyboardToolbarView.swift @@ -54,7 +54,7 @@ struct KeyboardToolbarView: View { } if showDoneButton { - Button(NSLocalizedString("done", comment: "Done"), action: onDone) + Button("done".localized, action: onDone) .foregroundColor(.blue) .font(.system(size: 16, weight: .medium)) } @@ -98,7 +98,7 @@ struct KeyboardToolbarView: View { } if showDoneButton { - Button(NSLocalizedString("done", comment: "Done"), action: onDone) + Button("done".localized, action: onDone) .foregroundColor(.blue) .font(.system(size: 16, weight: .medium)) } @@ -143,7 +143,7 @@ extension KeyboardToolbarButton { position: ButtonPosition = .left ) -> KeyboardToolbarButton { KeyboardToolbarButton( - title: NSLocalizedString("clear", comment: "Clear"), + title: "clear".localized, icon: "trash", color: .red, position: position @@ -157,7 +157,7 @@ extension KeyboardToolbarButton { position: ButtonPosition = .left ) -> KeyboardToolbarButton { KeyboardToolbarButton( - title: NSLocalizedString("copy", comment: "Copy"), + title: "copy".localized, icon: "doc.on.doc", color: .blue, position: position @@ -171,7 +171,7 @@ extension KeyboardToolbarButton { position: ButtonPosition = .left ) -> KeyboardToolbarButton { KeyboardToolbarButton( - title: NSLocalizedString("paste", comment: "Paste"), + title: "paste".localized, icon: "doc.on.clipboard", color: .green, position: position @@ -187,7 +187,7 @@ extension KeyboardToolbarButton { position: ButtonPosition = .right ) -> KeyboardToolbarButton { KeyboardToolbarButton( - title: NSLocalizedString("next", comment: "Next"), + title: "next".localized, icon: "arrow.right", color: .blue, position: position, @@ -200,7 +200,7 @@ extension KeyboardToolbarButton { position: ButtonPosition = .left ) -> KeyboardToolbarButton { KeyboardToolbarButton( - title: NSLocalizedString("previous", comment: "Previous"), + title: "previous".localized, icon: "arrow.left", color: .blue, position: position, @@ -257,16 +257,16 @@ extension KeyboardToolbarView { #Preview { VStack(spacing: 16) { - Text(NSLocalizedString("simple_toolbar", comment: "Simple toolbar")) + Text("simple_toolbar".localized) .font(.headline) - Text(NSLocalizedString("toolbar_with_clear", comment: "Toolbar with clear button")) + Text("toolbar_with_clear".localized) .font(.headline) - Text(NSLocalizedString("toolbar_with_copy_paste", comment: "Toolbar with copy/paste")) + Text("toolbar_with_copy_paste".localized) .font(.headline) - Text(NSLocalizedString("toolbar_with_navigation", comment: "Toolbar with navigation")) + Text("toolbar_with_navigation".localized) .font(.headline) } .padding() diff --git a/MyQrCode/Views/Components/ListView.swift b/MyQrCode/Views/Components/ListView.swift index 0c29077..e3f62a2 100644 --- a/MyQrCode/Views/Components/ListView.swift +++ b/MyQrCode/Views/Components/ListView.swift @@ -199,7 +199,7 @@ struct EmptyStateView: View { struct LoadingStateView: View { let message: String - init(message: String = NSLocalizedString("loading", comment: "Loading")) { + init(message: String = "loading".localized) { self.message = message } @@ -224,8 +224,8 @@ struct ErrorStateView: View { let retryAction: (() -> Void)? init( - title: String = NSLocalizedString("error_occurred", comment: "Error occurred"), - message: String = NSLocalizedString("load_failed_retry", comment: "Load failed, please retry"), + title: String = "error_occurred".localized, + message: String = "load_failed_retry".localized, retryAction: (() -> Void)? = nil ) { self.title = title @@ -253,7 +253,7 @@ struct ErrorStateView: View { if let retryAction = retryAction { Button(action: retryAction) { - Text(NSLocalizedString("retry", comment: "Retry")) + Text("retry".localized) .font(.subheadline) .fontWeight(.medium) .foregroundColor(.blue) @@ -274,7 +274,7 @@ struct ErrorStateView: View { #Preview { VStack(spacing: 20) { // 列表视图 - ListView(data: Array(1...5).map { ListItemData(id: $0, title: String(format: NSLocalizedString("item_format", comment: "Item format"), $0)) }) { item in + ListView(data: Array(1...5).map { ListItemData(id: $0, title: String(format: "item_format".localized, $0)) }) { item in ListItem.standard { AnyView( HStack { @@ -293,19 +293,19 @@ struct ErrorStateView: View { // 空状态 EmptyStateView( icon: "tray", - title: NSLocalizedString("no_data", comment: "No data"), - subtitle: NSLocalizedString("no_content_yet", comment: "No content yet"), - actionTitle: NSLocalizedString("add_content", comment: "Add content"), + title: "no_data".localized, + subtitle: "no_content_yet".localized, + actionTitle: "add_content".localized, action: {} ) // 加载状态 - LoadingStateView(message: NSLocalizedString("loading_data", comment: "Loading data")) + LoadingStateView(message: "loading_data".localized) // 错误状态 ErrorStateView( - title: NSLocalizedString("network_error", comment: "Network error"), - message: NSLocalizedString("connection_failed_check_network", comment: "Cannot connect to server, please check network connection"), + title: "network_error".localized, + message: "connection_failed_check_network".localized, retryAction: {} ) } diff --git a/MyQrCode/Views/Components/PickerView.swift b/MyQrCode/Views/Components/PickerView.swift index 3e8dbbe..2582db0 100644 --- a/MyQrCode/Views/Components/PickerView.swift +++ b/MyQrCode/Views/Components/PickerView.swift @@ -52,7 +52,7 @@ extension SimplePickerView { icon: String? = "lock" ) -> SimplePickerView { SimplePickerView( - title: NSLocalizedString("encryption_type", comment: "Encryption type"), + title: "encryption_type".localized, selection: selection, options: WiFiInputView.WiFiEncryptionType.allCases, optionTitle: { $0.displayName }, @@ -65,7 +65,7 @@ extension SimplePickerView { icon: String? = "globe" ) -> SimplePickerView { SimplePickerView( - title: NSLocalizedString("social_platform", comment: "Social platform"), + title: "social_platform".localized, selection: selection, options: SocialInputView.SocialPlatform.allCases, optionTitle: { $0.displayName }, @@ -78,7 +78,7 @@ extension SimplePickerView { icon: String? = "phone" ) -> SimplePickerView { SimplePickerView( - title: NSLocalizedString("phone_type", comment: "Phone type"), + title: "phone_type".localized, selection: selection, options: PhoneInputView.PhoneInputType.allCases, optionTitle: { $0.displayName }, diff --git a/MyQrCode/Views/Components/QRCodePreviewView.swift b/MyQrCode/Views/Components/QRCodePreviewView.swift index 0ac7284..11a3840 100644 --- a/MyQrCode/Views/Components/QRCodePreviewView.swift +++ b/MyQrCode/Views/Components/QRCodePreviewView.swift @@ -9,7 +9,7 @@ struct QRCodePreviewView: View { var body: some View { VStack(spacing: 16) { HStack { - InputTitleView.required(NSLocalizedString("preview", comment: "Preview"), icon: "eye") + InputTitleView.required("preview".localized, icon: "eye") .padding(.horizontal, 20) Spacer() @@ -37,7 +37,7 @@ struct QRCodePreviewView: View { Image(systemName: "qrcode") .font(.system(size: 40)) .foregroundColor(.secondary) - Text(NSLocalizedString("cannot_generate_qrcode", comment: "Cannot generate QR code")) + Text("cannot_generate_qrcode".localized) .font(.caption) .foregroundColor(.secondary) } @@ -47,7 +47,7 @@ struct QRCodePreviewView: View { // 内容预览卡片 VStack(alignment: .leading, spacing: 8) { HStack { - Text(NSLocalizedString("content", comment: "Content")) + Text("content".localized) .font(.caption) .foregroundColor(.secondary) @@ -83,7 +83,7 @@ struct QRCodePreviewView: View { #Preview { QRCodePreviewView( qrCodeImage: nil, - formattedContent: NSLocalizedString("sample_content", comment: "Sample content"), + formattedContent: "sample_content".localized, qrCodeType: .text ) } diff --git a/MyQrCode/Views/Components/SocialInputView.swift b/MyQrCode/Views/Components/SocialInputView.swift index a022641..6a6e9e8 100644 --- a/MyQrCode/Views/Components/SocialInputView.swift +++ b/MyQrCode/Views/Components/SocialInputView.swift @@ -205,19 +205,19 @@ struct SocialInputView: View { private func getInputLabel() -> String { switch platform { case .instagram: - return "instagram_username".localized + return String(format:"instagram_username".localized, "") case .facebook: return "user_id_or_link".localized case .twitter: return "x_username".localized case .tiktok: - return "tiktok_username".localized + return String(format:"tiktok_username".localized, "") case .snapchat: - return "snapchat_username".localized + return String(format: "snapchat_username".localized, "") case .whatsapp: - return "whatsapp_phone_number".localized + return String(format: "whatsapp_phone_number".localized, "") case .viber: - return "viber_phone_number".localized + return String(format: "viber_phone_number".localized, "") case .spotify: return "song_link_or_id".localized } diff --git a/MyQrCode/Views/Components/TextEditorView.swift b/MyQrCode/Views/Components/TextEditorView.swift index 6e33655..ae01d18 100644 --- a/MyQrCode/Views/Components/TextEditorView.swift +++ b/MyQrCode/Views/Components/TextEditorView.swift @@ -173,25 +173,25 @@ extension TextEditorView { #Preview { VStack(spacing: 16) { TextEditorView.description( - title: NSLocalizedString("description", comment: "Description"), + title: "description".localized, isRequired: true, - placeholder: NSLocalizedString("enter_description_content", comment: "Enter description content"), + placeholder: "enter_description_content".localized, text: .constant(""), icon: "text.quote" ) TextEditorView.longText( - title: NSLocalizedString("long_text", comment: "Long text"), + title: "long_text".localized, isRequired: false, - placeholder: NSLocalizedString("enter_long_text_content", comment: "Enter long text content"), + placeholder: "enter_long_text_content".localized, text: .constant(""), icon: "doc.text" ) TextEditorView.emailBody( - title: NSLocalizedString("email_body", comment: "Email body"), + title: "email_body".localized, isRequired: true, - placeholder: NSLocalizedString("enter_email_body_content", comment: "Enter email body content"), + placeholder: "enter_email_body_content".localized, text: .constant(""), icon: "envelope" ) diff --git a/MyQrCode/Views/Components/TextInputView.swift b/MyQrCode/Views/Components/TextInputView.swift index 88931dc..455523b 100644 --- a/MyQrCode/Views/Components/TextInputView.swift +++ b/MyQrCode/Views/Components/TextInputView.swift @@ -104,7 +104,7 @@ struct TextInputView: View { #Preview { TextInputView( content: .constant(""), - placeholder: NSLocalizedString("text_placeholder", comment: "Input any text content"), + placeholder: "text_placeholder".localized, maxCharacters: 150 ) } \ No newline at end of file diff --git a/MyQrCode/Views/Components/UtilityFunctions.swift b/MyQrCode/Views/Components/UtilityFunctions.swift index 8f8b9aa..00896fb 100644 --- a/MyQrCode/Views/Components/UtilityFunctions.swift +++ b/MyQrCode/Views/Components/UtilityFunctions.swift @@ -102,18 +102,18 @@ extension Date { if let day = components.day, day > 0 { if day == 1 { - return NSLocalizedString("yesterday", comment: "Yesterday") + return "yesterday".localized } else if day < 7 { - return String(format: NSLocalizedString("days_ago", comment: "Days ago"), day) + return String(format: "days_ago".localized, day) } else { return self.formattedString(style: .short) } } else if let hour = components.hour, hour > 0 { - return String(format: NSLocalizedString("hours_ago", comment: "Hours ago"), hour) + return String(format: "hours_ago".localized, hour) } else if let minute = components.minute, minute > 0 { - return String(format: NSLocalizedString("minutes_ago", comment: "Minutes ago"), minute) + return String(format: "minutes_ago".localized, minute) } else { - return NSLocalizedString("just_now", comment: "Just now") + return "just_now".localized } } } @@ -277,11 +277,11 @@ enum PasswordStrength { var description: String { switch self { case .weak: - return NSLocalizedString("weak", comment: "Weak") + return "weak".localized case .medium: - return NSLocalizedString("medium", comment: "Medium") + return "medium".localized case .strong: - return NSLocalizedString("strong", comment: "Strong") + return "strong".localized } } diff --git a/MyQrCode/Views/Components/ValidationView.swift b/MyQrCode/Views/Components/ValidationView.swift index 9a18cc7..4ed71d0 100644 --- a/MyQrCode/Views/Components/ValidationView.swift +++ b/MyQrCode/Views/Components/ValidationView.swift @@ -168,9 +168,9 @@ struct CharacterCountValidation: View { Spacer() if currentCount >= maxCount { - ValidationView.error(message: NSLocalizedString("max_characters_reached", comment: "Maximum characters reached")) + ValidationView.error(message: "max_characters_reached".localized) } else if currentCount >= Int(Double(maxCount) * warningThreshold) { - ValidationView.warning(message: NSLocalizedString("near_character_limit", comment: "Near character limit")) + ValidationView.warning(message: "near_character_limit".localized) } else { Text("\(currentCount)/\(maxCount)") .font(.caption) @@ -187,7 +187,7 @@ struct RequiredFieldValidation: View { var body: some View { if isEmpty { - ValidationView.error(message: String(format: NSLocalizedString("field_required", comment: "Field is required"), fieldName)) + ValidationView.error(message: String(format: "field_required".localized, fieldName)) } } } @@ -211,7 +211,7 @@ struct FormatValidation: View { var body: some View { if !isValid { ValidationView.error( - message: errorMessage ?? String(format: NSLocalizedString("field_format_incorrect", comment: "Field format is incorrect"), fieldName) + message: errorMessage ?? String(format: "field_format_incorrect".localized, fieldName) ) } } diff --git a/MyQrCode/Views/CreateCodeView.swift b/MyQrCode/Views/CreateCodeView.swift index 6bf673a..02fdf42 100644 --- a/MyQrCode/Views/CreateCodeView.swift +++ b/MyQrCode/Views/CreateCodeView.swift @@ -31,16 +31,16 @@ struct CreateCodeView: View { isContentFieldFocused: $isContentFieldFocused ) } - .navigationTitle(String(format: NSLocalizedString("create_data_type", comment: "Create data type"), selectedDataType.displayName)) + .navigationTitle(String(format: "create_data_type".localized, selectedDataType.displayName)) .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { - Button(NSLocalizedString("create", comment: "Create")) { createCode() } + Button("create".localized) { createCode() } .disabled(content.isEmpty) } } - .alert(NSLocalizedString("tip", comment: "Tip"), isPresented: $showingAlert) { - Button(NSLocalizedString("confirm", comment: "Confirm")) { } + .alert("tip".localized, isPresented: $showingAlert) { +Button("confirm".localized) { } } message: { Text(alertMessage) } .onAppear { // 稍延迟以确保进入页面时自动聚焦 @@ -60,7 +60,7 @@ struct CreateCodeView: View { if selectedDataType == .barcode { let validation = BarcodeValidator.validateBarcode(content, type: selectedBarcodeType) if !validation.isValid { - alertMessage = validation.errorMessage ?? NSLocalizedString("barcode_format_incorrect", comment: "Barcode format incorrect") + alertMessage = validation.errorMessage ?? "barcode_format_incorrect".localized showingAlert = true return } @@ -79,7 +79,7 @@ struct CreateCodeView: View { historyItem.qrCodeType = selectedQRCodeType.rawValue } coreDataManager.addHistoryItem(historyItem) - alertMessage = String(format: NSLocalizedString("data_type_created_successfully", comment: "Data type created successfully"), selectedDataType.displayName) + alertMessage = String(format: "data_type_created_successfully".localized, selectedDataType.displayName) showingAlert = true // 创建成功后返回主页 DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { diff --git a/MyQrCode/Views/CreateQRCodeView.swift b/MyQrCode/Views/CreateQRCodeView.swift index 23cfc9f..7fbd00b 100644 --- a/MyQrCode/Views/CreateQRCodeView.swift +++ b/MyQrCode/Views/CreateQRCodeView.swift @@ -83,7 +83,7 @@ struct CreateQRCodeView: View { .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .navigationBarTrailing) { - Button(NSLocalizedString("create", comment: "Create")) { + Button("create".localized) { if canCreateQRCode() { navigateToStyleView = true } @@ -92,8 +92,8 @@ struct CreateQRCodeView: View { .font(.system(size: 16, weight: .semibold)) } } - .alert(NSLocalizedString("tip", comment: "Tip"), isPresented: $showingAlert) { - Button(NSLocalizedString("confirm", comment: "Confirm")) { } + .alert("tip".localized, isPresented: $showingAlert) { +Button("confirm".localized) { } } message: { Text(alertMessage) } .background( NavigationLink( @@ -577,70 +577,70 @@ struct CreateQRCodeView: View { // 根据类型设置内容 switch selectedQRCodeType { case .mail: - var mailContent = String(format: NSLocalizedString("email_content_format", comment: "Email content format"), emailAddress, emailSubject, emailBody) + var mailContent = String(format: "email_content_format".localized, emailAddress, emailSubject, emailBody) if !emailCc.isEmpty { - mailContent += String(format: NSLocalizedString("email_cc_format", comment: "Email CC format"), emailCc) + mailContent += String(format: "email_cc_format".localized, emailCc) } if !emailBcc.isEmpty { - mailContent += String(format: NSLocalizedString("email_bcc_format", comment: "Email BCC format"), emailBcc) + mailContent += String(format: "email_bcc_format".localized, emailBcc) } historyItem.content = mailContent case .wifi: - historyItem.content = String(format: NSLocalizedString("wifi_content_format", comment: "WiFi content format"), wifiSSID, wifiEncryptionType.displayName) + historyItem.content = String(format: "wifi_content_format".localized, wifiSSID, wifiEncryptionType.displayName) case .vcard, .mecard: - var contactContent = NSLocalizedString("contact_content_prefix", comment: "Contact content prefix") + var contactContent = "contact_content_prefix".localized if !contactFirstName.isEmpty || !contactLastName.isEmpty { contactContent += "\(contactFirstName) \(contactLastName)" } if !contactNickname.isEmpty { - contactContent += String(format: NSLocalizedString("contact_nickname_format", comment: "Contact nickname format"), contactNickname) + contactContent += String(format: "contact_nickname_format".localized, contactNickname) } if !contactPhone.isEmpty { - contactContent += String(format: NSLocalizedString("contact_phone_format", comment: "Contact phone format"), contactPhone) + contactContent += String(format: "contact_phone_format".localized, contactPhone) } if !contactEmail.isEmpty { - contactContent += String(format: NSLocalizedString("contact_email_format", comment: "Contact email format"), contactEmail) + contactContent += String(format: "contact_email_format".localized, contactEmail) } if !contactCompany.isEmpty { - contactContent += String(format: NSLocalizedString("contact_company_format", comment: "Contact company format"), contactCompany) + contactContent += String(format: "contact_company_format".localized, contactCompany) } if !contactTitle.isEmpty { - contactContent += String(format: NSLocalizedString("contact_title_format", comment: "Contact title format"), contactTitle) + contactContent += String(format: "contact_title_format".localized, contactTitle) } if !contactAddress.isEmpty { - contactContent += String(format: NSLocalizedString("contact_address_format", comment: "Contact address format"), contactAddress) + contactContent += String(format: "contact_address_format".localized, contactAddress) } if !contactWebsite.isEmpty { - contactContent += String(format: NSLocalizedString("contact_website_format", comment: "Contact website format"), contactWebsite) + contactContent += String(format: "contact_website_format".localized, contactWebsite) } if !contactNote.isEmpty { - contactContent += String(format: NSLocalizedString("contact_note_format", comment: "Contact note format"), contactNote) + contactContent += String(format: "contact_note_format".localized, contactNote) } historyItem.content = contactContent case .location: - historyItem.content = String(format: NSLocalizedString("location_content_format", comment: "Location content format"), locationLatitude, locationLongitude) + historyItem.content = String(format: "location_content_format".localized, locationLatitude, locationLongitude) case .calendar: - historyItem.content = String(format: NSLocalizedString("calendar_content_format", comment: "Calendar content format"), eventTitle) + historyItem.content = String(format: "calendar_content_format".localized, eventTitle) case .instagram, .facebook, .spotify, .twitter, .snapchat, .tiktok, .whatsapp, .viber: historyItem.content = generateSocialMediaContent() case .phone, .sms: - historyItem.content = String(format: NSLocalizedString("phone_content_format", comment: "Phone content format"), phoneNumber) + historyItem.content = String(format: "phone_content_format".localized, phoneNumber) case .url: - historyItem.content = String(format: NSLocalizedString("url_content_format", comment: "URL content format"), urlString) + historyItem.content = String(format: "url_content_format".localized, urlString) default: historyItem.content = content } do { try context.save() - alertMessage = NSLocalizedString("qrcode_created_successfully", comment: "QR code created successfully") + alertMessage = "qrcode_created_successfully".localized showingAlert = true // 创建成功后返回 DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { dismiss() } } catch { - alertMessage = String(format: NSLocalizedString("save_failed_error", comment: "Save failed with error"), error.localizedDescription) + alertMessage = String(format: "save_failed_error".localized, error.localizedDescription) showingAlert = true } } diff --git a/MyQrCode/Views/HistoryView.swift b/MyQrCode/Views/HistoryView.swift index b7cdd70..1e4ae1b 100644 --- a/MyQrCode/Views/HistoryView.swift +++ b/MyQrCode/Views/HistoryView.swift @@ -28,17 +28,17 @@ struct HistoryView: View { var displayName: String { switch self { case .all: - return NSLocalizedString("all", comment: "All") - case .barcode: - return NSLocalizedString("barcode", comment: "Barcode") - case .qrcode: - return NSLocalizedString("qrcode", comment: "QR Code") - case .scanned: - return NSLocalizedString("scanned", comment: "Scanned") - case .created: - return NSLocalizedString("created", comment: "Created") - case .favorites: - return NSLocalizedString("favorites", comment: "Favorites") +return "all".localized +case .barcode: +return "barcode".localized +case .qrcode: +return "qrcode".localized +case .scanned: +return "scanned".localized +case .created: +return "created".localized +case .favorites: +return "favorites".localized } } @@ -108,7 +108,7 @@ struct HistoryView: View { historyList } } - .navigationTitle(NSLocalizedString("history_records", comment: "History records")) + .navigationTitle("history_records".localized) .id(languageManager.refreshTrigger) .navigationBarTitleDisplayMode(.large) .toolbar { @@ -171,9 +171,9 @@ struct HistoryView: View { onConfirm: clearHistory ) } - .alert(NSLocalizedString("delete_confirmation", comment: "Delete confirmation"), isPresented: $showingDeleteAlert) { - Button(NSLocalizedString("cancel", comment: "Cancel"), role: .cancel) { } - Button(NSLocalizedString("delete", comment: "Delete"), role: .destructive) { + .alert("delete_confirmation".localized, isPresented: $showingDeleteAlert) { +Button("cancel".localized, role: .cancel) { } +Button("delete".localized, role: .destructive) { if let item = itemToDelete { deleteHistoryItem(item) itemToDelete = nil @@ -181,7 +181,7 @@ struct HistoryView: View { } } message: { if let item = itemToDelete { - Text(String(format: NSLocalizedString("confirm_delete_record", comment: "Confirm delete record"), item.content ?? "")) + Text(String(format: "confirm_delete_record".localized, item.content ?? "")) .id(languageManager.refreshTrigger) } } @@ -292,7 +292,7 @@ struct HistoryView: View { Image(systemName: "magnifyingglass") .foregroundColor(.gray) - TextField(NSLocalizedString("search_history_records", comment: "Search history records"), text: $searchText) + TextField("search_history_records".localized, text: $searchText) .textFieldStyle(RoundedBorderTextFieldStyle()) } .padding(.horizontal) @@ -330,7 +330,7 @@ struct HistoryView: View { VStack(spacing: 16) { ProgressView() .scaleEffect(1.2) - Text(NSLocalizedString("loading", comment: "Loading")) + Text("loading".localized) .font(.caption) .foregroundColor(.secondary) .id(languageManager.refreshTrigger) @@ -373,13 +373,13 @@ struct HistoryView: View { .font(.system(size: 60)) .foregroundColor(.gray) - Text(NSLocalizedString("no_history_records", comment: "No history records")) + Text("no_history_records".localized) .font(.title2) .fontWeight(.medium) .foregroundColor(.gray) .id(languageManager.refreshTrigger) - Text(NSLocalizedString("scan_or_create_to_start", comment: "Scan or create to start")) + Text("scan_or_create_to_start".localized) .font(.body) .foregroundColor(.gray) .multilineTextAlignment(.center) @@ -388,7 +388,7 @@ struct HistoryView: View { NavigationLink(destination: CodeTypeSelectionView()) { HStack { Image(systemName: "plus.circle.fill") - Text(NSLocalizedString("create_first_record", comment: "Create first record")) + Text("create_first_record".localized) .id(languageManager.refreshTrigger) } .font(.headline) @@ -580,7 +580,7 @@ struct HistoryItemRow: View { } .padding(.vertical, 8) .swipeActions(edge: .trailing, allowsFullSwipe: false) { - Button(NSLocalizedString("delete", comment: "Delete"), role: .destructive) { + Button("delete".localized, role: .destructive) { onDelete() } } @@ -625,13 +625,13 @@ struct ClearHistoryConfirmView: View { .foregroundColor(.red) // 标题 - Text(NSLocalizedString("clear_history", comment: "Clear history")) + Text("clear_history".localized) .font(.title2) .fontWeight(.bold) .id(languageManager.refreshTrigger) // 简单说明 - Text(NSLocalizedString("clear_history_warning", comment: "Clear history warning")) + Text("clear_history_warning".localized) .font(.body) .foregroundColor(.secondary) .multilineTextAlignment(.center) @@ -648,7 +648,7 @@ struct ClearHistoryConfirmView: View { }) { HStack { Image(systemName: "trash.fill") - Text(NSLocalizedString("confirm_delete", comment: "Confirm delete")) + Text("confirm_delete".localized) .id(languageManager.refreshTrigger) } .frame(maxWidth: .infinity) @@ -662,7 +662,7 @@ struct ClearHistoryConfirmView: View { Button(action: { isPresented = false }) { - Text(NSLocalizedString("cancel", comment: "Cancel")) + Text("cancel".localized) .frame(maxWidth: .infinity) .padding() .background(Color(.systemGray5)) @@ -672,13 +672,13 @@ struct ClearHistoryConfirmView: View { } } .padding(20) - .navigationTitle(NSLocalizedString("confirm_delete", comment: "Confirm delete")) + .navigationTitle("confirm_delete".localized) .id(languageManager.refreshTrigger) .navigationBarTitleDisplayMode(.inline) .navigationBarBackButtonHidden(true) .toolbar { ToolbarItem(placement: .navigationBarLeading) { - Button(NSLocalizedString("close", comment: "Close")) { + Button("close".localized) { isPresented = false } .id(languageManager.refreshTrigger) diff --git a/MyQrCode/Views/QRCodeDetailView.swift b/MyQrCode/Views/QRCodeDetailView.swift index dc7a661..eb00ac5 100644 --- a/MyQrCode/Views/QRCodeDetailView.swift +++ b/MyQrCode/Views/QRCodeDetailView.swift @@ -49,8 +49,8 @@ struct QRCodeDetailView: View { .sheet(isPresented: $showingShareSheet) { ShareSheet(activityItems: [historyItem.content ?? ""]) } - .alert(NSLocalizedString("tip", comment: "Tip"), isPresented: $showingAlert) { - Button(NSLocalizedString("confirm", comment: "Confirm")) { } + .alert("tip".localized, isPresented: $showingAlert) { +Button("confirm".localized) { } } message: { Text(alertMessage) } @@ -89,7 +89,7 @@ struct QRCodeDetailView: View { ) } - Text(NSLocalizedString("scan_this_qr_code", comment: "Scan this QR code")) + Text("scan_this_qr_code".localized) .font(.caption) .foregroundColor(.secondary) } @@ -105,7 +105,7 @@ struct QRCodeDetailView: View { .font(.title2) .foregroundColor(.green) - Text(NSLocalizedString("parsed_info", comment: "Parsed Information")) + Text("parsed_info".localized) .font(.headline) Spacer() @@ -153,7 +153,7 @@ struct QRCodeDetailView: View { .font(.title2) .foregroundColor(.purple) - Text(NSLocalizedString("original_content", comment: "Original Content")) + Text("original_content".localized) .font(.headline) Spacer() @@ -199,7 +199,7 @@ struct QRCodeDetailView: View { // 样式标签 HStack(spacing: 8) { - Label(NSLocalizedString("custom", comment: "Custom"), systemImage: "paintpalette") + Label("custom".localized, systemImage: "paintpalette") .font(.caption) .padding(.horizontal, 8) .padding(.vertical, 4) @@ -225,7 +225,7 @@ struct QRCodeDetailView: View { .shadow(radius: 4) } - Label(NSLocalizedString("standard", comment: "Standard"), systemImage: "qrcode") + Label("standard".localized, systemImage: "qrcode") .font(.caption) .padding(.horizontal, 8) .padding(.vertical, 4) @@ -250,7 +250,7 @@ struct QRCodeDetailView: View { Image(systemName: historyItem.isFavorite ? "heart.fill" : "heart") .foregroundColor(historyItem.isFavorite ? .red : .gray) - Text(historyItem.isFavorite ? NSLocalizedString("unfavorite", comment: "Unfavorite") : NSLocalizedString("favorite", comment: "Favorite")) + Text(historyItem.isFavorite ? "unfavorite".localized : "favorite".localized) .fontWeight(.medium) } .frame(maxWidth: .infinity) @@ -266,7 +266,7 @@ struct QRCodeDetailView: View { Image(systemName: "doc.on.doc") .foregroundColor(.blue) - Text(NSLocalizedString("copy_content", comment: "Copy Content")) + Text("copy_content".localized) .fontWeight(.medium) } .frame(maxWidth: .infinity) @@ -283,7 +283,7 @@ struct QRCodeDetailView: View { Image(systemName: "arrow.up.right.square") .foregroundColor(.green) - Text(NSLocalizedString("open_link", comment: "Open Link")) + Text("open_link".localized) .fontWeight(.medium) } .frame(maxWidth: .infinity) @@ -327,7 +327,7 @@ struct QRCodeDetailView: View { historyItem.isFavorite.toggle() coreDataManager.save() - let message = historyItem.isFavorite ? NSLocalizedString("added_to_favorites", comment: "Added to favorites") : NSLocalizedString("removed_from_favorites", comment: "Removed from favorites") + let message = historyItem.isFavorite ? "added_to_favorites".localized : "removed_from_favorites".localized alertMessage = message showingAlert = true } @@ -336,7 +336,7 @@ struct QRCodeDetailView: View { private func copyContent() { if let content = historyItem.content { UIPasteboard.general.string = content - alertMessage = NSLocalizedString("content_copied_to_clipboard", comment: "Content copied to clipboard") + alertMessage = "content_copied_to_clipboard".localized showingAlert = true } } @@ -637,26 +637,26 @@ extension QRCodeDetailView { private func getColorDisplayName(_ colorString: String) -> String { if let color = QRCodeColor(rawValue: colorString) { switch color { - case .black: return NSLocalizedString("black", comment: "Black") - case .white: return NSLocalizedString("white", comment: "White") - case .red: return NSLocalizedString("red", comment: "Red") - case .blue: return NSLocalizedString("blue", comment: "Blue") - case .green: return NSLocalizedString("green", comment: "Green") - case .yellow: return NSLocalizedString("yellow", comment: "Yellow") - case .purple: return NSLocalizedString("purple", comment: "Purple") - case .orange: return NSLocalizedString("orange", comment: "Orange") - case .pink: return NSLocalizedString("pink", comment: "Pink") - case .cyan: return NSLocalizedString("cyan", comment: "Cyan") - case .magenta: return NSLocalizedString("magenta", comment: "Magenta") - case .brown: return NSLocalizedString("brown", comment: "Brown") - case .gray: return NSLocalizedString("gray", comment: "Gray") - case .navy: return NSLocalizedString("navy", comment: "Navy") - case .teal: return NSLocalizedString("teal", comment: "Teal") - case .indigo: return NSLocalizedString("indigo", comment: "Indigo") - case .lime: return NSLocalizedString("lime", comment: "Lime") - case .maroon: return NSLocalizedString("maroon", comment: "Maroon") - case .olive: return NSLocalizedString("olive", comment: "Olive") - case .silver: return NSLocalizedString("silver", comment: "Silver") + case .black: return "black".localized +case .white: return "white".localized +case .red: return "red".localized +case .blue: return "blue".localized +case .green: return "green".localized +case .yellow: return "yellow".localized +case .purple: return "purple".localized +case .orange: return "orange".localized +case .pink: return "pink".localized +case .cyan: return "cyan".localized +case .magenta: return "magenta".localized +case .brown: return "brown".localized +case .gray: return "gray".localized +case .navy: return "navy".localized +case .teal: return "teal".localized +case .indigo: return "indigo".localized +case .lime: return "lime".localized +case .maroon: return "maroon".localized +case .olive: return "olive".localized +case .silver: return "silver".localized } } return colorString @@ -698,7 +698,7 @@ extension QRCodeDetailView { let qrCodeType = QRCodeType(rawValue: qrCodeTypeString) { return qrCodeType.displayName } - return NSLocalizedString("qr_code_detail", comment: "QR Code Detail") + return "qr_code_detail".localized } // MARK: - Decorate code按钮 @@ -712,7 +712,7 @@ extension QRCodeDetailView { .font(.title2) .foregroundColor(.white) - Text(NSLocalizedString("decorate_code", comment: "Decorate Code")) + Text("decorate_code".localized) .font(.headline) .fontWeight(.semibold) .foregroundColor(.white) @@ -744,7 +744,7 @@ extension QRCodeDetailView { .font(.caption) .foregroundColor(.orange) - Text(NSLocalizedString("qr_code_has_style", comment: "This QR code has custom style, tap to edit")) + Text("qr_code_has_style".localized) .font(.caption) .foregroundColor(.secondary) diff --git a/MyQrCode/Views/QRCodeStyleView.swift b/MyQrCode/Views/QRCodeStyleView.swift index 81cf47d..deb76e4 100644 --- a/MyQrCode/Views/QRCodeStyleView.swift +++ b/MyQrCode/Views/QRCodeStyleView.swift @@ -241,14 +241,14 @@ struct QRCodeStyleView: View { VStack(spacing: 24) { // 前景色选择 colorSelectionSection( - title: NSLocalizedString("foreground_color", comment: "Foreground color"), + title: "foreground_color".localized, colors: QRCodeColor.foregroundColors, selectedColor: $selectedForegroundColor ) // 背景色选择 colorSelectionSection( - title: NSLocalizedString("background_color", comment: "Background color"), + title: "background_color".localized, colors: QRCodeColor.backgroundColors, selectedColor: $selectedBackgroundColor ) diff --git a/docs/INTERFACE_LOCALIZATION_FIX_README.md b/docs/INTERFACE_LOCALIZATION_FIX_README.md index e4d9376..61aeed4 100644 --- a/docs/INTERFACE_LOCALIZATION_FIX_README.md +++ b/docs/INTERFACE_LOCALIZATION_FIX_README.md @@ -314,6 +314,32 @@ - 保持了所有必要的本地化键 - 提高了文件的可维护性 +### 30. NSLocalizedString 替换为 String.localized +- **问题**: 项目中大量使用 `NSLocalizedString("key", comment: "comment")` 语法,代码冗长且不够简洁 +- **修复**: 将所有 `NSLocalizedString` 调用替换为 `String.localized` 扩展方法 +- **修复的文件**: 所有包含 `NSLocalizedString` 的 Swift 文件,包括: + - `MyQrCode/Views/CreateQRCodeView.swift` + - `MyQrCode/Views/CreateCodeView.swift` + - `MyQrCode/Views/HistoryView.swift` + - `MyQrCode/Views/QRCodeDetailView.swift` + - `MyQrCode/Views/CodeContentInputView.swift` + - `MyQrCode/Views/BarcodePreviewView.swift` + - `MyQrCode/Views/CodeTypeSelectionView.swift` + - `MyQrCode/Views/QRCodeStyleView.swift` + - `MyQrCode/ScannerView/ScanningOverlayView.swift` + - `MyQrCode/Models/QRCodeParser.swift` + - `MyQrCode/Models/HistoryEnums.swift` + - `MyQrCode/Models/BarcodeValidator.swift` + - 以及其他所有相关文件 +- **替换模式**: + - `NSLocalizedString("key", comment: "comment")` → `"key".localized` + - `String(format: NSLocalizedString("key", comment: "comment"), args...)` → `String(format: "key".localized, args...)` +- **修复效果**: + - 代码更加简洁易读 + - 统一了本地化调用方式 + - 提高了代码的可维护性 + - 减少了代码重复 + ## 新增的本地化键 ### 验证消息 @@ -511,6 +537,12 @@ - **泰文文件**: 从836行清理到686行,删除了150行重复内容 - **总计**: 删除了615行重复内容,确保每个本地化键只出现一次 +### 代码优化 +- **NSLocalizedString 替换**: 将所有 `NSLocalizedString("key", comment: "comment")` 替换为 `"key".localized` +- **代码简化**: 减少了代码冗长度,提高了可读性 +- **统一调用**: 使用统一的 `String.localized` 扩展方法进行本地化 +- **维护性提升**: 简化了本地化调用方式,便于后续维护 + ### 二维码解析器(扩展) - `wifi_network_info` - Wi-Fi网络信息 - `password_set` - 密码已设置