diff --git a/Yattee/Localizable.xcstrings b/Yattee/Localizable.xcstrings index 7994517b..3d5752e7 100644 --- a/Yattee/Localizable.xcstrings +++ b/Yattee/Localizable.xcstrings @@ -3,9 +3,6 @@ "strings" : { "" : { - }, - "-%@" : { - }, "%@" : { @@ -97,12 +94,6 @@ } } } - }, - "• %@" : { - - }, - "↑↓ scroll • click to close" : { - }, "+%lld" : { @@ -428,9 +419,6 @@ } } } - }, - "Cancel" : { - }, "channel.menu.disableNotifications" : { "localizations" : { @@ -729,12 +717,6 @@ } } } - }, - "click to expand" : { - - }, - "Comments" : { - }, "comments.disabled" : { "comment" : "Shown when comments are disabled for a video", @@ -1091,6 +1073,16 @@ } } }, + "common.off" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Off" + } + } + } + }, "common.ok" : { "comment" : "OK button", "localizations" : { @@ -1102,6 +1094,16 @@ } } }, + "common.on" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "On" + } + } + } + }, "common.open" : { "localizations" : { "en" : { @@ -1132,6 +1134,16 @@ } } }, + "common.remove" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Remove" + } + } + } + }, "common.reset" : { "localizations" : { "en" : { @@ -1827,9 +1839,6 @@ } } } - }, - "Description" : { - }, "discovery.empty.description" : { "comment" : "Description when no network shares are found", @@ -4476,9 +4485,6 @@ } } } - }, - "Info" : { - }, "Initializing player..." : { @@ -4636,9 +4642,6 @@ } } } - }, - "LIVE" : { - }, "login.email" : { "comment" : "Email field label in login form", @@ -5608,15 +5611,6 @@ } } } - }, - "Off" : { - - }, - "OK" : { - - }, - "On" : { - }, "onboarding.cloud.complete.description" : { "comment" : "iCloud sync complete description on onboarding", @@ -6503,6 +6497,26 @@ } } }, + "player.controls.info" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Info" + } + } + } + }, + "player.controls.quality" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Quality" + } + } + } + }, "player.controls.subtitles" : { "localizations" : { "en" : { @@ -6598,6 +6612,26 @@ } } }, + "player.description.clickToExpand" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "click to expand" + } + } + } + }, + "player.description.scrollToClose" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "↑↓ scroll • click to close" + } + } + } + }, "player.error.button" : { "comment" : "Error button label on failed video overlay", "localizations" : { @@ -6951,6 +6985,26 @@ } } }, + "player.tab.comments" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Comments" + } + } + } + }, + "player.tab.info" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Info" + } + } + } + }, "player.tvos.scrubHint" : { "localizations" : { "en" : { @@ -7311,9 +7365,6 @@ } } } - }, - "Quality" : { - }, "queue.action.addToQueue" : { "comment" : "Add to queue action in action sheet", @@ -7805,9 +7856,6 @@ } } } - }, - "Remove" : { - }, "resume.action.continueAt %@" : { "comment" : "Continue watching action with timestamp", @@ -7831,14 +7879,25 @@ } } }, - "Search bookmarks" : { - + "search.bookmarks.placeholder" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search bookmarks" + } + } + } }, - "Search channels" : { - - }, - "Search history" : { - + "search.channels.placeholder" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search channels" + } + } + } }, "search.clearAllRecents" : { "comment" : "Button to clear all recent searches, channels, and playlists", @@ -8066,6 +8125,16 @@ } } }, + "search.history.placeholder" : { + "localizations" : { + "en" : { + "stringUnit" : { + "state" : "translated", + "value" : "Search history" + } + } + } + }, "search.noResults.description" : { "comment" : "No search results description", "localizations" : { diff --git a/Yattee/Views/Home/BookmarksListView.swift b/Yattee/Views/Home/BookmarksListView.swift index 997d9545..80fb9196 100644 --- a/Yattee/Views/Home/BookmarksListView.swift +++ b/Yattee/Views/Home/BookmarksListView.swift @@ -88,7 +88,7 @@ struct BookmarksListView: View { VStack(spacing: 0) { // tvOS: Inline search field and action button for better focus navigation HStack(spacing: 24) { - TextField("Search bookmarks", text: $searchText) + TextField("search.bookmarks.placeholder", text: $searchText) .textFieldStyle(.plain) Button { diff --git a/Yattee/Views/Home/HistoryListView.swift b/Yattee/Views/Home/HistoryListView.swift index dedc76e1..e35717aa 100644 --- a/Yattee/Views/Home/HistoryListView.swift +++ b/Yattee/Views/Home/HistoryListView.swift @@ -85,7 +85,7 @@ struct HistoryListView: View { VStack(spacing: 0) { // tvOS: Inline search field and action button for better focus navigation HStack(spacing: 24) { - TextField("Search history", text: $searchText) + TextField("search.history.placeholder", text: $searchText) .textFieldStyle(.plain) Button { diff --git a/Yattee/Views/Home/HomeSettingsView.swift b/Yattee/Views/Home/HomeSettingsView.swift index 53659cf3..db7d71eb 100644 --- a/Yattee/Views/Home/HomeSettingsView.swift +++ b/Yattee/Views/Home/HomeSettingsView.swift @@ -739,7 +739,7 @@ private struct TVHomeItemRow: View { .buttonStyle(TVCompactButtonStyle()) .alert(String(localized: "home.removeConfirmation.title"), isPresented: $showingDeleteConfirmation) { Button(String(localized: "common.cancel"), role: .cancel) { } - Button("Remove", role: .destructive) { + Button("common.remove", role: .destructive) { onDelete?() } } diff --git a/Yattee/Views/Player/tvOS/TVDetailsPanel.swift b/Yattee/Views/Player/tvOS/TVDetailsPanel.swift index dedad25b..0bef682d 100644 --- a/Yattee/Views/Player/tvOS/TVDetailsPanel.swift +++ b/Yattee/Views/Player/tvOS/TVDetailsPanel.swift @@ -41,9 +41,9 @@ struct TVDetailsPanel: View { // Tab picker (hidden when description scroll is locked) if !isDescriptionScrollLocked { Picker("", selection: $selectedTab) { - Text("Info").tag(TVDetailsTab.info) + Text("player.tab.info").tag(TVDetailsTab.info) if video?.supportsComments == true { - Text("Comments").tag(TVDetailsTab.comments) + Text("player.tab.comments").tag(TVDetailsTab.comments) } } .pickerStyle(.segmented) @@ -258,7 +258,7 @@ struct TVDetailsPanel: View { // Live indicator if video?.isLive == true { - Label("LIVE", systemImage: "dot.radiowaves.left.and.right") + Label("player.live", systemImage: "dot.radiowaves.left.and.right") .foregroundStyle(.red) } } @@ -379,14 +379,14 @@ struct TVScrollableDescription: View { private var descriptionContent: some View { VStack(alignment: .leading, spacing: 12) { HStack { - Text("Description") + Text("player.description") .font(.headline) .foregroundStyle(.white.opacity(0.7)) Spacer() if isFocused { - Text(isScrollLocked ? "↑↓ scroll • click to close" : "click to expand") + Text(isScrollLocked ? "player.description.scrollToClose" : "player.description.clickToExpand") .font(.callout) .foregroundStyle(.white.opacity(0.5)) } diff --git a/Yattee/Views/Player/tvOS/TVPlayerControlsView.swift b/Yattee/Views/Player/tvOS/TVPlayerControlsView.swift index 2c86e0db..6995f140 100644 --- a/Yattee/Views/Player/tvOS/TVPlayerControlsView.swift +++ b/Yattee/Views/Player/tvOS/TVPlayerControlsView.swift @@ -219,7 +219,7 @@ struct TVPlayerControlsView: View { VStack(spacing: 6) { Image(systemName: "slider.horizontal.3") .font(.system(size: 28)) - Text("Quality") + Text("player.controls.quality") .font(.caption) } } @@ -261,7 +261,7 @@ struct TVPlayerControlsView: View { VStack(spacing: 6) { Image(systemName: "info.circle") .font(.system(size: 28)) - Text("Info") + Text("player.controls.info") .font(.caption) } } diff --git a/Yattee/Views/Settings/TVSettingsButtonStyles.swift b/Yattee/Views/Settings/TVSettingsButtonStyles.swift index 04e5fb61..11ab6f29 100644 --- a/Yattee/Views/Settings/TVSettingsButtonStyles.swift +++ b/Yattee/Views/Settings/TVSettingsButtonStyles.swift @@ -75,10 +75,10 @@ struct TVSettingsTextField: View { } else { TextField(title, text: $editText) } - Button("OK") { + Button("common.ok") { text = editText } - Button("Cancel", role: .cancel) { } + Button("common.cancel", role: .cancel) { } } } } @@ -136,7 +136,7 @@ struct TVSettingsToggle: View { HStack { Text(title) Spacer() - Text(isOn ? "On" : "Off") + Text(isOn ? "common.on" : "common.off") .foregroundStyle(.secondary) } } diff --git a/Yattee/Views/Subscriptions/ManageChannelsView.swift b/Yattee/Views/Subscriptions/ManageChannelsView.swift index 53a23e7f..4928c22e 100644 --- a/Yattee/Views/Subscriptions/ManageChannelsView.swift +++ b/Yattee/Views/Subscriptions/ManageChannelsView.swift @@ -215,7 +215,7 @@ struct ManageChannelsView: View { VStack(spacing: 0) { // tvOS: Inline search field and action button for better focus navigation HStack(spacing: 24) { - TextField("Search channels", text: $searchText) + TextField("search.channels.placeholder", text: $searchText) .textFieldStyle(.plain) Button {