From 34b883cfc7726d15af2b09800b3317be5bc74c49 Mon Sep 17 00:00:00 2001 From: himomohi Date: Sun, 9 Aug 2026 22:44:22 +0900 Subject: [PATCH 1/7] Add Korean interface translations --- Delta.xcodeproj/project.pbxproj | 45 +- Delta/ko.lproj/GamesDatabase.strings | 2 + Delta/ko.lproj/Main.strings | 17 + Delta/ko.lproj/PauseMenu.strings | 47 ++ ...ePresentationControllerContentView.strings | 2 + Delta/ko.lproj/Settings.strings | 497 ++++++++++++++++++ 6 files changed, 608 insertions(+), 2 deletions(-) create mode 100644 Delta/ko.lproj/GamesDatabase.strings create mode 100644 Delta/ko.lproj/Main.strings create mode 100644 Delta/ko.lproj/PauseMenu.strings create mode 100644 Delta/ko.lproj/PausePresentationControllerContentView.strings create mode 100644 Delta/ko.lproj/Settings.strings diff --git a/Delta.xcodeproj/project.pbxproj b/Delta.xcodeproj/project.pbxproj index 557eaef4..0acda84a 100644 --- a/Delta.xcodeproj/project.pbxproj +++ b/Delta.xcodeproj/project.pbxproj @@ -89,6 +89,7 @@ BF353FF91C5D870B00C1184C /* MenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF353FF81C5D870B00C1184C /* MenuItem.swift */; }; BF353FFF1C5DA3C500C1184C /* PausePresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF353FFD1C5DA3C500C1184C /* PausePresentationController.swift */; }; BF3540001C5DA3C500C1184C /* PausePresentationControllerContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF353FFE1C5DA3C500C1184C /* PausePresentationControllerContentView.xib */; }; + E5FB2509336BA07BECE429E5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1626A34322395AB20E64B10 /* Localizable.strings */; }; BF3540021C5DA3D500C1184C /* PauseStoryboardSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540011C5DA3D500C1184C /* PauseStoryboardSegue.swift */; }; BF3540081C5DAFAD00C1184C /* PauseTransitionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540071C5DAFAD00C1184C /* PauseTransitionCoordinator.swift */; }; BF3D6C512202865F0083E05A /* Delta2ToDelta3.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF3D6C502202865F0083E05A /* Delta2ToDelta3.xcmappingmodel */; }; @@ -656,9 +657,11 @@ BF34FA101CF1899D006624C7 /* CheatTextView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheatTextView.swift; sourceTree = ""; }; BF353FF11C5D7FB000C1184C /* PauseViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PauseViewController.swift; sourceTree = ""; }; BF353FF51C5D837600C1184C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/PauseMenu.storyboard; sourceTree = ""; }; + 5E850D36BCFD02F13076B334 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/PauseMenu.strings; sourceTree = ""; }; BF353FF81C5D870B00C1184C /* MenuItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MenuItem.swift; sourceTree = ""; }; BF353FFD1C5DA3C500C1184C /* PausePresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PausePresentationController.swift; sourceTree = ""; }; - BF353FFE1C5DA3C500C1184C /* PausePresentationControllerContentView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = PausePresentationControllerContentView.xib; path = Delta/Base.lproj/PausePresentationControllerContentView.xib; sourceTree = SOURCE_ROOT; }; + E8137A1EA5B77524826F252B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/PausePresentationControllerContentView.xib; sourceTree = ""; }; + 379381BFDEEBCE00BA4C7E89 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/PausePresentationControllerContentView.strings; sourceTree = ""; }; BF3540011C5DA3D500C1184C /* PauseStoryboardSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PauseStoryboardSegue.swift; sourceTree = ""; }; BF3540041C5DA70400C1184C /* SaveStatesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SaveStatesViewController.swift; sourceTree = ""; }; BF3540071C5DAFAD00C1184C /* PauseTransitionCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PauseTransitionCoordinator.swift; sourceTree = ""; }; @@ -698,7 +701,8 @@ BF5942911E09BD1A0051894B /* NSManagedObject+Conveniences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSManagedObject+Conveniences.swift"; sourceTree = ""; }; BF5942921E09BD1A0051894B /* NSManagedObjectContext+Conveniences.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSManagedObjectContext+Conveniences.swift"; sourceTree = ""; }; BF5E7F431B9A650B00AE44F8 /* SettingsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; }; - BF5E7F451B9A652600AE44F8 /* Settings.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Settings.storyboard; path = Delta/Base.lproj/Settings.storyboard; sourceTree = SOURCE_ROOT; }; + 6028BB19CF5D883A3000CBCC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Settings.storyboard; sourceTree = ""; }; + 8AF88B976A36206BAAA492BB /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Settings.strings; sourceTree = ""; }; BF616A121F08184A0077F8B2 /* ControllerInputsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControllerInputsViewController.swift; sourceTree = ""; }; BF63A1A221A4AAAE00EE8F61 /* RecordSyncStatusViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordSyncStatusViewController.swift; sourceTree = ""; }; BF63A1B421A4B76E00EE8F61 /* RecordVersionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordVersionsViewController.swift; sourceTree = ""; }; @@ -717,6 +721,7 @@ BF6BF3191EB82146008E83CD /* ClipboardImportOption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ClipboardImportOption.swift; sourceTree = ""; }; BF6BF31B1EB821A0008E83CD /* GamesDatabaseImportOption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamesDatabaseImportOption.swift; sourceTree = ""; }; BF6BF3201EB82362008E83CD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/GamesDatabase.storyboard; sourceTree = ""; }; + 90B38EF277F0027A744C3708 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/GamesDatabase.strings; sourceTree = ""; }; BF6BF3261EB87EB8008E83CD /* PhotoLibraryImportOption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PhotoLibraryImportOption.swift; sourceTree = ""; }; BF6EE5E81F7C5F860051AD6C /* _GameControllerInputMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _GameControllerInputMapping.swift; sourceTree = ""; }; BF6EE5EA1F7C5F8F0051AD6C /* GameControllerInputMapping.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GameControllerInputMapping.swift; sourceTree = ""; }; @@ -768,11 +773,13 @@ BFFA71DB1AAC406100EE9DD1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; BFFA71DC1AAC406100EE9DD1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; BFFA71E11AAC406100EE9DD1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E2A2382998C65E9AA22C02AD /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Main.strings; sourceTree = ""; }; BFFC461B1D59823500AF2CC6 /* GamesPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamesPresentationController.swift; sourceTree = ""; }; BFFC461C1D59823500AF2CC6 /* GamesStoryboardSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamesStoryboardSegue.swift; sourceTree = ""; }; BFFC461D1D59823500AF2CC6 /* InitialGamesStoryboardSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InitialGamesStoryboardSegue.swift; sourceTree = ""; }; BFFC46221D5984A000AF2CC6 /* LaunchViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LaunchViewController.swift; sourceTree = ""; }; BFFC46451D59861000AF2CC6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 0196E53871AA3F1DBCE26872 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; BFFC464B1D5998D600AF2CC6 /* CheatTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CheatTableViewCell.swift; sourceTree = ""; }; C124B55FFADA30BF671EE4F8 /* DeltaOperatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeltaOperatorDelegate.swift; sourceTree = ""; }; C1C8C13CE90324CBBA76BC3E /* OperatorUICoordinators.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OperatorUICoordinators.swift; sourceTree = ""; }; @@ -1548,6 +1555,7 @@ D58013E82CC992560055F11C /* Delta.entitlements */, BFFA71DC1AAC406100EE9DD1 /* AppDelegate.swift */, BFFA71E01AAC406100EE9DD1 /* Main.storyboard */, + C1626A34322395AB20E64B10 /* Localizable.strings */, D502F82129EF05F800ACCDA1 /* Scenes */, BFFC46211D59848000AF2CC6 /* Launch */, BF46894D1AAC469800A2586D /* Game Selection */, @@ -2134,6 +2142,7 @@ English, en, Base, + ko, ); mainGroup = BFFA71CE1AAC406100EE9DD1; packageReferences = ( @@ -2320,6 +2329,7 @@ D53BE5FF2E873E6B0012DE0F /* MicrochipIcon.icon in Resources */, D5D797E9298DCC7300738869 /* cheatbase.zip in Resources */, BFFA71E21AAC406100EE9DD1 /* Main.storyboard in Resources */, + E5FB2509336BA07BECE429E5 /* Localizable.strings in Resources */, D5B6F5D52D6FC23E0061C365 /* FollowUsFooterView.xib in Resources */, D5AE76C62C2B7F3D0086471B /* Icons.xcassets in Resources */, D5AA0F1A2CE404E90015D134 /* AboutPatreonHeaderView.xib in Resources */, @@ -2833,15 +2843,37 @@ isa = PBXVariantGroup; children = ( BF353FF51C5D837600C1184C /* Base */, + 5E850D36BCFD02F13076B334 /* ko */, ); name = PauseMenu.storyboard; path = Delta; sourceTree = SOURCE_ROOT; }; + BF353FFE1C5DA3C500C1184C /* PausePresentationControllerContentView.xib */ = { + isa = PBXVariantGroup; + children = ( + E8137A1EA5B77524826F252B /* Base */, + 379381BFDEEBCE00BA4C7E89 /* ko */, + ); + name = PausePresentationControllerContentView.xib; + path = Delta; + sourceTree = SOURCE_ROOT; + }; + BF5E7F451B9A652600AE44F8 /* Settings.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 6028BB19CF5D883A3000CBCC /* Base */, + 8AF88B976A36206BAAA492BB /* ko */, + ); + name = Settings.storyboard; + path = Delta; + sourceTree = SOURCE_ROOT; + }; BF6BF31F1EB82362008E83CD /* GamesDatabase.storyboard */ = { isa = PBXVariantGroup; children = ( BF6BF3201EB82362008E83CD /* Base */, + 90B38EF277F0027A744C3708 /* ko */, ); name = GamesDatabase.storyboard; path = Delta; @@ -2851,11 +2883,20 @@ isa = PBXVariantGroup; children = ( BFFA71E11AAC406100EE9DD1 /* Base */, + E2A2382998C65E9AA22C02AD /* ko */, ); name = Main.storyboard; path = Delta; sourceTree = SOURCE_ROOT; }; + C1626A34322395AB20E64B10 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + 0196E53871AA3F1DBCE26872 /* ko */, + ); + name = Localizable.strings; + sourceTree = ""; + }; BFFC46441D59861000AF2CC6 /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( diff --git a/Delta/ko.lproj/GamesDatabase.strings b/Delta/ko.lproj/GamesDatabase.strings new file mode 100644 index 00000000..2d996b4f --- /dev/null +++ b/Delta/ko.lproj/GamesDatabase.strings @@ -0,0 +1,2 @@ +/* ObjectID = "rwF-kd-avR"; property = "title"; */ +"rwF-kd-avR.title" = "게임 데이터베이스"; diff --git a/Delta/ko.lproj/Main.strings b/Delta/ko.lproj/Main.strings new file mode 100644 index 00000000..50d7b70c --- /dev/null +++ b/Delta/ko.lproj/Main.strings @@ -0,0 +1,17 @@ +/* ObjectID = "pFk-as-3k4"; property = "title"; */ +"pFk-as-3k4.title" = "게임"; + +/* ObjectID = "wRx-Fi-rb4"; property = "text"; */ +"wRx-Fi-rb4.text" = "General Feature"; + +/* ObjectID = "5aB-oF-ytR"; property = "text"; */ +"5aB-oF-ytR.text" = "Get around your bike in cities like New York and Los Angeles."; + +/* ObjectID = "pPy-OE-4qp"; property = "text"; */ +"pPy-OE-4qp.text" = "후원자"; + +/* ObjectID = "H9c-FD-pG7"; property = "text"; */ +"H9c-FD-pG7.text" = "새로운 기능"; + +/* ObjectID = "a56-e7-hy4"; property = "text"; */ +"a56-e7-hy4.text" = "Delta 1.7"; diff --git a/Delta/ko.lproj/PauseMenu.strings b/Delta/ko.lproj/PauseMenu.strings new file mode 100644 index 00000000..d45772b0 --- /dev/null +++ b/Delta/ko.lproj/PauseMenu.strings @@ -0,0 +1,47 @@ +/* ObjectID = "rY7-Wx-NaD"; property = "title"; */ +"rY7-Wx-NaD.title" = "일시 정지"; + +/* ObjectID = "2yt-vB-uMF"; property = "title"; */ +"2yt-vB-uMF.title" = "메인 메뉴"; + +/* ObjectID = "BoG-k2-aR2"; property = "title"; */ +"BoG-k2-aR2.title" = "상태 저장"; + +/* ObjectID = "FlO-FB-hpP"; property = "title"; */ +"FlO-FB-hpP.title" = "옵션"; + +/* ObjectID = "Gsv-JZ-Yc0"; property = "title"; */ +"Gsv-JZ-Yc0.title" = "치트"; + +/* ObjectID = "QT6-DZ-g70"; property = "headerTitle"; */ +"QT6-DZ-g70.headerTitle" = "이름"; + +/* ObjectID = "DD1-X0-hg7"; property = "placeholder"; */ +"DD1-X0-hg7.placeholder" = "치트 이름"; + +/* ObjectID = "6XN-uU-GJ5"; property = "text"; */ +"6XN-uU-GJ5.text" = "아이콘 변경"; + +/* ObjectID = "rvn-VK-2uH"; property = "headerTitle"; */ +"rvn-VK-2uH.headerTitle" = "유형"; + +/* ObjectID = "rvn-VK-2uH"; property = "footerTitle"; */ +"rvn-VK-2uH.footerTitle" = "설명"; + +/* ObjectID = "rHC-nA-ga0"; property = "headerTitle"; */ +"rHC-nA-ga0.headerTitle" = "코드"; + +/* ObjectID = "rHC-nA-ga0"; property = "footerTitle"; */ +"rHC-nA-ga0.footerTitle" = "설명"; + +/* ObjectID = "a17-LB-QXD"; property = "text"; */ +"a17-LB-QXD.text" = "XXXXXXXX YYYYYYYY"; + +/* ObjectID = "zdc-ES-dan"; property = "title"; */ +"zdc-ES-dan.title" = "치트"; + +/* ObjectID = "xrD-ue-96Q"; property = "segmentTitles[0]"; */ +"xrD-ue-96Q.segmentTitles[0]" = "첫 번째"; + +/* ObjectID = "xrD-ue-96Q"; property = "segmentTitles[1]"; */ +"xrD-ue-96Q.segmentTitles[1]" = "두 번째"; diff --git a/Delta/ko.lproj/PausePresentationControllerContentView.strings b/Delta/ko.lproj/PausePresentationControllerContentView.strings new file mode 100644 index 00000000..c216d76e --- /dev/null +++ b/Delta/ko.lproj/PausePresentationControllerContentView.strings @@ -0,0 +1,2 @@ +/* ObjectID = "ZcT-qE-aES"; property = "text"; */ +"ZcT-qE-aES.text" = "Super Mario World"; diff --git a/Delta/ko.lproj/Settings.strings b/Delta/ko.lproj/Settings.strings new file mode 100644 index 00000000..93248d77 --- /dev/null +++ b/Delta/ko.lproj/Settings.strings @@ -0,0 +1,497 @@ +/* ObjectID = "eHi-aO-uGS"; property = "title"; */ +"eHi-aO-uGS.title" = "설정"; + +/* ObjectID = "Str-BY-agW"; property = "text"; */ +"Str-BY-agW.text" = "Delta 0.6.0"; + +/* ObjectID = "QvT-Yt-oP1"; property = "headerTitle"; */ +"QvT-Yt-oP1.headerTitle" = "후원자"; + +/* ObjectID = "faT-qa-JP0"; property = "text"; */ +"faT-qa-JP0.text" = "Patreon 계정 관리"; + +/* ObjectID = "c6K-sJ-0vW"; property = "headerTitle"; */ +"c6K-sJ-0vW.headerTitle" = "컨트롤러"; + +/* ObjectID = "tls-Hv-Rx2"; property = "text"; */ +"tls-Hv-Rx2.text" = "플레이어 1"; + +/* ObjectID = "vJP-Ie-a9H"; property = "text"; */ +"vJP-Ie-a9H.text" = "Riley's iPhone"; + +/* ObjectID = "e3u-x9-IEC"; property = "text"; */ +"e3u-x9-IEC.text" = "플레이어 2"; + +/* ObjectID = "2OP-A1-VYo"; property = "text"; */ +"2OP-A1-VYo.text" = "SteelSeries Stratus"; + +/* ObjectID = "Cdn-11-xZe"; property = "text"; */ +"Cdn-11-xZe.text" = "플레이어 3"; + +/* ObjectID = "wWc-NY-Bsd"; property = "text"; */ +"wWc-NY-Bsd.text" = "MOGA Gamepad"; + +/* ObjectID = "Hls-3b-EaS"; property = "text"; */ +"Hls-3b-EaS.text" = "플레이어 4"; + +/* ObjectID = "hNf-uc-PLR"; property = "text"; */ +"hNf-uc-PLR.text" = "Jayce's iPhone"; + +/* ObjectID = "Nch-k1-6pR"; property = "headerTitle"; */ +"Nch-k1-6pR.headerTitle" = "컨트롤러 스킨"; + +/* ObjectID = "mBC-YU-BVK"; property = "text"; */ +"mBC-YU-BVK.text" = "시스템 이름"; + +/* ObjectID = "Dxs-Me-IVU"; property = "text"; */ +"Dxs-Me-IVU.text" = "시스템 이름"; + +/* ObjectID = "o9x-Kn-6bC"; property = "text"; */ +"o9x-Kn-6bC.text" = "시스템 이름"; + +/* ObjectID = "XVO-TO-ncw"; property = "text"; */ +"XVO-TO-ncw.text" = "시스템 이름"; + +/* ObjectID = "vV9-Fk-zd5"; property = "text"; */ +"vV9-Fk-zd5.text" = "시스템 이름"; + +/* ObjectID = "Etp-g5-W9R"; property = "text"; */ +"Etp-g5-W9R.text" = "시스템 이름"; + +/* ObjectID = "sF6-5e-HL2"; property = "text"; */ +"sF6-5e-HL2.text" = "시스템 이름"; + +/* ObjectID = "SwK-m9-8gt"; property = "headerTitle"; */ +"SwK-m9-8gt.headerTitle" = "컨트롤러 불투명도"; + +/* ObjectID = "SwK-m9-8gt"; property = "footerTitle"; */ +"SwK-m9-8gt.footerTitle" = "컨트롤러 스킨에서 지원하는 경우 컨트롤러의 불투명도를 결정합니다."; + +/* ObjectID = "zaz-yD-CYG"; property = "text"; */ +"zaz-yD-CYG.text" = "50%"; + +/* ObjectID = "dV4-8P-2Dw"; property = "headerTitle"; */ +"dV4-8P-2Dw.headerTitle" = "화면"; + +/* ObjectID = "dV4-8P-2Dw"; property = "footerTitle"; */ +"dV4-8P-2Dw.footerTitle" = "다른 앱 아이콘을 선택해 Delta를 원하는 모습으로 꾸밀 수 있습니다."; + +/* ObjectID = "iV4-br-PKm"; property = "text"; */ +"iV4-br-PKm.text" = "앱 아이콘 변경"; + +/* ObjectID = "aJ4-xT-aZL"; property = "headerTitle"; */ +"aJ4-xT-aZL.headerTitle" = "게임 오디오"; + +/* ObjectID = "aJ4-xT-aZL"; property = "footerTitle"; */ +"aJ4-xT-aZL.footerTitle" = "사용하면 기기가 무음 모드가 아닐 때만 Delta가 게임 오디오를 재생합니다."; + +/* ObjectID = "mue-uO-1xE"; property = "text"; */ +"mue-uO-1xE.text" = "무음 모드 따르기"; + +/* ObjectID = "vbO-8P-7Mc"; property = "headerTitle"; */ +"vbO-8P-7Mc.headerTitle" = "멀티태스킹"; + +/* ObjectID = "vbO-8P-7Mc"; property = "footerTitle"; */ +"vbO-8P-7Mc.footerTitle" = "게임 창이 활성 상태가 아닐 때 자동으로 일시 정지합니다."; + +/* ObjectID = "yQG-GF-gkg"; property = "text"; */ +"yQG-GF-gkg.text" = "게임을 새 창에서 열기"; + +/* ObjectID = "9fx-lk-IIz"; property = "text"; */ +"9fx-lk-IIz.text" = "비활성 상태에서 일시 정지"; + +/* ObjectID = "avK-bg-nm6"; property = "headerTitle"; */ +"avK-bg-nm6.headerTitle" = "햅틱 피드백"; + +/* ObjectID = "avK-bg-nm6"; property = "footerTitle"; */ +"avK-bg-nm6.footerTitle" = "사용하면 터치 화면 조작에 반응해 기기가 진동합니다."; + +/* ObjectID = "XPP-qe-q75"; property = "text"; */ +"XPP-qe-q75.text" = "버튼"; + +/* ObjectID = "MDR-bb-TYm"; property = "text"; */ +"MDR-bb-TYm.text" = "컨트롤 스틱"; + +/* ObjectID = "y6U-7a-bnX"; property = "headerTitle"; */ +"y6U-7a-bnX.headerTitle" = "Delta 동기화"; + +/* ObjectID = "y6U-7a-bnX"; property = "footerTitle"; */ +"y6U-7a-bnX.footerTitle" = "기기 간에 게임, 저장 데이터, 저장 상태 및 치트를 동기화합니다."; + +/* ObjectID = "4U1-fe-PIb"; property = "text"; */ +"4U1-fe-PIb.text" = "서비스"; + +/* ObjectID = "kLY-5g-v8n"; property = "text"; */ +"kLY-5g-v8n.text" = "Google Drive"; + +/* ObjectID = "1u0-gh-zP7"; property = "text"; */ +"1u0-gh-zP7.text" = "동기화 상태"; + +/* ObjectID = "BoE-ds-6Mb"; property = "headerTitle"; */ +"BoE-ds-6Mb.headerTitle" = "제스처"; + +/* ObjectID = "xqO-bP-GZu"; property = "text"; */ +"xqO-bP-GZu.text" = "메뉴 버튼 제스처"; + +/* ObjectID = "PsL-N1-lvD"; property = "headerTitle"; */ +"PsL-N1-lvD.headerTitle" = "AirPlay"; + +/* ObjectID = "PsL-N1-lvD"; property = "footerTitle"; */ +"PsL-N1-lvD.footerTitle" = "게임 창이 활성 상태가 아닐 때 자동으로 일시 정지합니다."; + +/* ObjectID = "YY1-UX-Gda"; property = "text"; */ +"YY1-UX-Gda.text" = "전체 화면으로 표시"; + +/* ObjectID = "pD5-rE-bOF"; property = "text"; */ +"pD5-rE-bOF.text" = "위쪽 화면만"; + +/* ObjectID = "YWh-UD-X86"; property = "text"; */ +"YWh-UD-X86.text" = "Nintendo DS"; + +/* ObjectID = "4ZP-9E-Rfx"; property = "text"; */ +"4ZP-9E-Rfx.text" = "화면을 가로로 배치"; + +/* ObjectID = "3Mn-R8-hr1"; property = "text"; */ +"3Mn-R8-hr1.text" = "Nintendo DS"; + +/* ObjectID = "fdp-8c-oOc"; property = "headerTitle"; */ +"fdp-8c-oOc.headerTitle" = "햅틱 터치"; + +/* ObjectID = "fdp-8c-oOc"; property = "footerTitle"; */ +"fdp-8c-oOc.footerTitle" = "컨텍스트 메뉴를 사용할 때 게임과 저장 상태를 미리 봅니다."; + +/* ObjectID = "c5i-qG-ir9"; property = "text"; */ +"c5i-qG-ir9.text" = "홈 화면 바로가기"; + +/* ObjectID = "rDR-EH-JuO"; property = "text"; */ +"rDR-EH-JuO.text" = "컨텍스트 메뉴 미리보기"; + +/* ObjectID = "1eN-id-M8c"; property = "headerTitle"; */ +"1eN-id-M8c.headerTitle" = "코어 설정"; + +/* ObjectID = "1eN-id-M8c"; property = "footerTitle"; */ +"1eN-id-M8c.footerTitle" = "개별 에뮬레이션 코어의 설정을 관리합니다."; + +/* ObjectID = "XbP-aW-HU8"; property = "text"; */ +"XbP-aW-HU8.text" = "Nintendo"; + +/* ObjectID = "gXM-DZ-5a1"; property = "text"; */ +"gXM-DZ-5a1.text" = "Nestopia"; + +/* ObjectID = "K3D-rt-m4C"; property = "text"; */ +"K3D-rt-m4C.text" = "Sega Genesis"; + +/* ObjectID = "1ye-yG-hW2"; property = "text"; */ +"1ye-yG-hW2.text" = "Genesis Plus GX"; + +/* ObjectID = "XLE-ZJ-ESC"; property = "text"; */ +"XLE-ZJ-ESC.text" = "Super Nintendo"; + +/* ObjectID = "T9u-HX-5Ar"; property = "text"; */ +"T9u-HX-5Ar.text" = "Snes9x"; + +/* ObjectID = "qJY-Ha-rdz"; property = "text"; */ +"qJY-Ha-rdz.text" = "Nintendo 64"; + +/* ObjectID = "fLK-oP-kku"; property = "text"; */ +"fLK-oP-kku.text" = "Mupen64Plus"; + +/* ObjectID = "zUQ-MC-PSt"; property = "text"; */ +"zUQ-MC-PSt.text" = "Game Boy Color"; + +/* ObjectID = "z1Q-cc-JYV"; property = "text"; */ +"z1Q-cc-JYV.text" = "Gambatte"; + +/* ObjectID = "RAd-mB-Iwr"; property = "text"; */ +"RAd-mB-Iwr.text" = "Game Boy Advance"; + +/* ObjectID = "yYc-QH-cts"; property = "text"; */ +"yYc-QH-cts.text" = "VBA-M"; + +/* ObjectID = "V9s-w5-hm9"; property = "text"; */ +"V9s-w5-hm9.text" = "Nintendo DS"; + +/* ObjectID = "Ejw-YM-kCu"; property = "text"; */ +"Ejw-YM-kCu.text" = "melonDS"; + +/* ObjectID = "EzW-IN-YAf"; property = "headerTitle"; */ +"EzW-IN-YAf.headerTitle" = "고급"; + +/* ObjectID = "EzW-IN-YAf"; property = "footerTitle"; */ +"EzW-IN-YAf.footerTitle" = "기여자가 추가한 새 기능을 시험해 봅니다."; + +/* ObjectID = "XPB-zq-ssX"; property = "text"; */ +"XPB-zq-ssX.text" = "오류 로그 내보내기…"; + +/* ObjectID = "Dca-za-cfI"; property = "text"; */ +"Dca-za-cfI.text" = "실험적 기능"; + +/* ObjectID = "foh-L9-g6W"; property = "headerTitle"; */ +"foh-L9-g6W.headerTitle" = "크레딧"; + +/* ObjectID = "g59-8E-zW7"; property = "text"; */ +"g59-8E-zW7.text" = "기여자"; + +/* ObjectID = "2K3-IL-94S"; property = "text"; */ +"2K3-IL-94S.text" = "라이선스"; + +/* ObjectID = "EXh-f2-RH0"; property = "headerTitle"; */ +"EXh-f2-RH0.headerTitle" = "지원"; + +/* ObjectID = "mLw-eP-4gt"; property = "text"; */ +"mLw-eP-4gt.text" = "문의하기"; + +/* ObjectID = "FH2-gy-ntx"; property = "text"; */ +"FH2-gy-ntx.text" = "기타 결제 방법"; + +/* ObjectID = "9v6-NL-xiw"; property = "text"; */ +"9v6-NL-xiw.text" = "개인정보 처리방침"; + +/* ObjectID = "ggi-Bt-bY5"; property = "text"; */ +"ggi-Bt-bY5.text" = "이용 약관"; + +/* ObjectID = "DYU-tO-Lmw"; property = "title"; */ +"DYU-tO-Lmw.title" = "설정"; + +/* ObjectID = "x1g-pH-DnF"; property = "title"; */ +"x1g-pH-DnF.title" = "조작"; + +/* ObjectID = "4jy-hy-YS3"; property = "title"; */ +"4jy-hy-YS3.title" = "재설정"; + +/* ObjectID = "VBO-V1-Wfu"; property = "text"; */ +"VBO-V1-Wfu.text" = "컨트롤러 이름"; + +/* ObjectID = "tqn-1q-p53"; property = "text"; */ +"tqn-1q-p53.text" = "플레이어 1"; + +/* ObjectID = "OeA-dF-xlk"; property = "text"; */ +"OeA-dF-xlk.text" = "연결된 컨트롤러 없음"; + +/* ObjectID = "QK7-oi-2jJ"; property = "title"; */ +"QK7-oi-2jJ.title" = "컨트롤러"; + +/* ObjectID = "jGW-i7-nK1"; property = "headerTitle"; */ +"jGW-i7-nK1.headerTitle" = "세로"; + +/* ObjectID = "yJn-Ez-ya2"; property = "text"; */ +"yJn-Ez-ya2.text" = "컨트롤러 스킨 없음"; + +/* ObjectID = "PqP-JS-vGE"; property = "headerTitle"; */ +"PqP-JS-vGE.headerTitle" = "가로"; + +/* ObjectID = "lT5-hl-WFR"; property = "text"; */ +"lT5-hl-WFR.text" = "컨트롤러 스킨 없음"; + +/* ObjectID = "epN-iR-ZX6"; property = "title"; */ +"epN-iR-ZX6.title" = "필터"; + +/* ObjectID = "wfE-7e-l8g"; property = "title"; */ +"wfE-7e-l8g.title" = "홈 화면 바로가기"; + +/* ObjectID = "pG9-hI-tRE"; property = "title"; */ +"pG9-hI-tRE.title" = "컨트롤러 스킨"; + +/* ObjectID = "DAY-hh-zI6"; property = "text"; */ +"DAY-hh-zI6.text" = "없음"; + +/* ObjectID = "Ful-dk-I0G"; property = "title"; */ +"Ful-dk-I0G.title" = "컨트롤러 스킨"; + +/* ObjectID = "XU0-TI-SPi"; property = "title"; */ +"XU0-TI-SPi.title" = "재설정"; + +/* ObjectID = "R9m-rV-VgV"; property = "title"; */ +"R9m-rV-VgV.title" = "동기화 서비스"; + +/* ObjectID = "m5I-He-R1D"; property = "footerTitle"; */ +"m5I-He-R1D.footerTitle" = "기기 간에 게임, 저장 데이터, 저장 상태 및 치트를 동기화합니다."; + +/* ObjectID = "mIB-Au-dYz"; property = "headerTitle"; */ +"mIB-Au-dYz.headerTitle" = "서비스"; + +/* ObjectID = "4fb-TC-FrG"; property = "text"; */ +"4fb-TC-FrG.text" = "Google Drive"; + +/* ObjectID = "qR3-zd-gmV"; property = "text"; */ +"qR3-zd-gmV.text" = "Dropbox"; + +/* ObjectID = "1Wk-cG-HDE"; property = "headerTitle"; */ +"1Wk-cG-HDE.headerTitle" = "계정"; + +/* ObjectID = "AYq-XK-j5L"; property = "text"; */ +"AYq-XK-j5L.text" = "Riley Testut"; + +/* ObjectID = "md7-6u-egL"; property = "text"; */ +"md7-6u-egL.text" = "riley@rileytestut.com"; + +/* ObjectID = "4TQ-cm-2sN"; property = "text"; */ +"4TQ-cm-2sN.text" = "로그아웃"; + +/* ObjectID = "4u9-KL-pDs"; property = "title"; */ +"4u9-KL-pDs.title" = "동기화 서비스"; + +/* ObjectID = "vVg-ci-JRa"; property = "title"; */ +"vVg-ci-JRa.title" = "동기화 상태"; + +/* ObjectID = "AWh-ik-Gvu"; property = "text"; */ +"AWh-ik-Gvu.text" = "제목"; + +/* ObjectID = "Piz-MQ-rK5"; property = "text"; */ +"Piz-MQ-rK5.text" = "이전 동기화"; + +/* ObjectID = "Bdv-pR-x5Q"; property = "title"; */ +"Bdv-pR-x5Q.title" = "동기화 상태"; + +/* ObjectID = "RWL-4W-NpH"; property = "text"; */ +"RWL-4W-NpH.text" = "게임"; + +/* ObjectID = "QBt-p1-jpG"; property = "text"; */ +"QBt-p1-jpG.text" = "동기화 활성화"; + +/* ObjectID = "vpJ-Pg-nU9"; property = "headerTitle"; */ +"vpJ-Pg-nU9.headerTitle" = "기기 내"; + +/* ObjectID = "npF-wl-PPC"; property = "text"; */ +"npF-wl-PPC.text" = "상태"; + +/* ObjectID = "SYD-cR-5TY"; property = "text"; */ +"SYD-cR-5TY.text" = "업데이트"; + +/* ObjectID = "EFZ-Om-S4W"; property = "text"; */ +"EFZ-Om-S4W.text" = "날짜"; + +/* ObjectID = "D5a-Na-NTh"; property = "text"; */ +"D5a-Na-NTh.text" = "October 7, 1995"; + +/* ObjectID = "Bct-0y-ptf"; property = "headerTitle"; */ +"Bct-0y-ptf.headerTitle" = "클라우드"; + +/* ObjectID = "aeh-me-gZl"; property = "text"; */ +"aeh-me-gZl.text" = "상태"; + +/* ObjectID = "0Rm-b2-HX5"; property = "text"; */ +"0Rm-b2-HX5.text" = "업데이트"; + +/* ObjectID = "jzK-yT-69q"; property = "text"; */ +"jzK-yT-69q.text" = "날짜"; + +/* ObjectID = "b43-lW-Enx"; property = "text"; */ +"b43-lW-Enx.text" = "October 7, 1995"; + +/* ObjectID = "r04-kp-xeN"; property = "text"; */ +"r04-kp-xeN.text" = "기기"; + +/* ObjectID = "VIa-dS-7SR"; property = "text"; */ +"VIa-dS-7SR.text" = "Riley's iPhone 7"; + +/* ObjectID = "8zd-va-DMf"; property = "text"; */ +"8zd-va-DMf.text" = "버전 보기"; + +/* ObjectID = "Itj-QW-4dw"; property = "text"; */ +"Itj-QW-4dw.text" = "제목"; + +/* ObjectID = "2fS-9A-FKk"; property = "text"; */ +"2fS-9A-FKk.text" = "부제목"; + +/* ObjectID = "GLC-Lc-6VM"; property = "title"; */ +"GLC-Lc-6VM.title" = "버전"; + +/* ObjectID = "I8z-cN-A01"; property = "title"; */ +"I8z-cN-A01.title" = "복원"; + +/* ObjectID = "Rmi-Mn-bdo"; property = "title"; */ +"Rmi-Mn-bdo.title" = "라이선스"; + +/* ObjectID = "OwL-4c-EEA"; property = "title"; */ +"OwL-4c-EEA.title" = "DS 설정"; + +/* ObjectID = "ozc-x3-LhT"; property = "headerTitle"; */ +"ozc-x3-LhT.headerTitle" = "코어 정보"; + +/* ObjectID = "kYg-4f-oTo"; property = "text"; */ +"kYg-4f-oTo.text" = "이름"; + +/* ObjectID = "yak-dZ-uPc"; property = "text"; */ +"yak-dZ-uPc.text" = "melonDS"; + +/* ObjectID = "h6M-Uh-TBA"; property = "text"; */ +"h6M-Uh-TBA.text" = "개발자"; + +/* ObjectID = "ERw-hy-cF5"; property = "text"; */ +"ERw-hy-cF5.text" = "Arisotura"; + +/* ObjectID = "Q4e-k1-vf6"; property = "text"; */ +"Q4e-k1-vf6.text" = "버전"; + +/* ObjectID = "DPq-JK-5hr"; property = "text"; */ +"DPq-JK-5hr.text" = "0.9.5"; + +/* ObjectID = "Uvd-Lt-Ckx"; property = "text"; */ +"Uvd-Lt-Ckx.text" = "소스"; + +/* ObjectID = "kHA-YX-Ah9"; property = "text"; */ +"kHA-YX-Ah9.text" = "GitHub"; + +/* ObjectID = "6JV-NA-R4y"; property = "text"; */ +"6JV-NA-R4y.text" = "후원하기"; + +/* ObjectID = "TXn-bD-NB8"; property = "text"; */ +"TXn-bD-NB8.text" = "Patreon"; + +/* ObjectID = "MyM-jI-qtY"; property = "headerTitle"; */ +"MyM-jI-qtY.headerTitle" = "성능"; + +/* ObjectID = "MyM-jI-qtY"; property = "footerTitle"; */ +"MyM-jI-qtY.footerTitle" = "사용하면 Delta가 AltServer와 동일한 Wi-Fi 네트워크에 있을 때 JIT를 자동으로 활성화합니다."; + +/* ObjectID = "XPc-dG-N6R"; property = "text"; */ +"XPc-dG-N6R.text" = "AltJIT 사용"; + +/* ObjectID = "ObZ-cl-5sV"; property = "headerTitle"; */ +"ObZ-cl-5sV.headerTitle" = "DS BIOS 파일"; + +/* ObjectID = "Bfp-iA-wWE"; property = "text"; */ +"Bfp-iA-wWE.text" = "bios7.bin"; + +/* ObjectID = "fgD-y0-55T"; property = "text"; */ +"fgD-y0-55T.text" = "bios9.bin"; + +/* ObjectID = "SIu-zD-qfE"; property = "text"; */ +"SIu-zD-qfE.text" = "firmware.bin"; + +/* ObjectID = "SAz-hG-O4G"; property = "headerTitle"; */ +"SAz-hG-O4G.headerTitle" = "DSi BIOS 파일"; + +/* ObjectID = "QKd-rm-101"; property = "text"; */ +"QKd-rm-101.text" = "dsibios7.bin"; + +/* ObjectID = "6OX-32-izR"; property = "text"; */ +"6OX-32-izR.text" = "dsibios9.bin"; + +/* ObjectID = "Czu-qN-Luq"; property = "text"; */ +"Czu-qN-Luq.text" = "dsifirmware.bin"; + +/* ObjectID = "VWi-nu-uMv"; property = "text"; */ +"VWi-nu-uMv.text" = "dsinand.bin"; + +/* ObjectID = "7dF-4c-IZh"; property = "title"; */ +"7dF-4c-IZh.title" = "Nintendo DS"; + +/* ObjectID = "ywo-nv-GyW"; property = "text"; */ +"ywo-nv-GyW.text" = "Caroline Moore"; + +/* ObjectID = "kcs-Gu-L9Y"; property = "title"; */ +"kcs-Gu-L9Y.title" = "Patreon"; + +/* ObjectID = "FuI-rT-eft"; property = "segmentTitles[0]"; */ +"FuI-rT-eft.segmentTitles[0]" = "전체 화면"; + +/* ObjectID = "FuI-rT-eft"; property = "segmentTitles[1]"; */ +"FuI-rT-eft.segmentTitles[1]" = "분할 화면"; + +/* ObjectID = "BoE-ds-6Mb"; property = "footerTitle"; */ +"BoE-ds-6Mb.footerTitle" = "메뉴 버튼을 누른 채 제스처를 사용해 빠른 동작을 수행할 수 있습니다.\n\n메뉴 + 가로로 스와이프: 빨리 감기\n메뉴 + 컨트롤러 입력: 버튼 길게 누르기\n메뉴 + 두 번 탭: 빠른 저장\n메뉴 + 길게 누르기: 빠른 불러오기"; + +/* ObjectID = "Lw6-5a-pvQ"; property = "text"; */ +"Lw6-5a-pvQ.text" = "Delta and AltStore LLC are in no way affiliated with Nintendo Co., Ltd.\n\nStephen Celis (SQLite.swift)\nCopyright (c) 2014-2015 Stephen Celis ()\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nOlivier Poitrey (SDWebImage)\nCopyright (c) 2009-2018 Olivier Poitrey rs@dailymotion.com\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is furnished\nto do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n\nThomas Zoechling (ZIPFoundation)\nCopyright (c) 2017 Thomas Zoechling\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\nDropbox Inc. (SwiftyDropbox)\nCopyright (c) 2015 Dropbox Inc., http://www.dropbox.com/\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nGoogle (Google API Objective-C Client)\nLicensed under Apache 2 license.\n\nNick Farina (SMCalloutView)\nLicensed under Apache 2 license.\n\nDelta uses these emulator cores licensed under the GNU Public License version 3:\n\nNestopia\nmupen64plus\nGambatte\nvisualboyadvance-m\nDeSmuME\nmelonDS\n\nDelta uses these emulator cores licensed under their respective licenses:\n\nSnes9x\nGenesis Plus GX\n\nDelta uses OpenVGDB to provide automatic artwork for imported games."; From 0362b779a63019e4293d8e444e659e707c910494 Mon Sep 17 00:00:00 2001 From: himomohi Date: Sun, 9 Aug 2026 22:50:58 +0900 Subject: [PATCH 2/7] Add Korean runtime translations --- Delta/ko.lproj/Localizable.strings | 585 +++++++++++++++++++++++++++++ 1 file changed, 585 insertions(+) create mode 100644 Delta/ko.lproj/Localizable.strings diff --git a/Delta/ko.lproj/Localizable.strings b/Delta/ko.lproj/Localizable.strings new file mode 100644 index 00000000..488e0e1d --- /dev/null +++ b/Delta/ko.lproj/Localizable.strings @@ -0,0 +1,585 @@ +"%@ is %@, but expected size is %@." = "%@의 크기는 %@이지만, 예상 크기는 %@입니다."; +"%@ is %@, but expected size is between %@ and %@." = "%@의 크기는 %@이지만, 예상 크기는 %@에서 %@ 사이입니다."; +"%@ is %@, but expected sizes are:" = "%@의 크기는 %@이지만, 예상 크기는 다음 중 하나입니다:"; +"%@ is not compatible with this version of Delta.\n\nChecksum:\n%@" = "%@ 파일은 이 버전의 Delta와 호환되지 않습니다.\n\n체크섬:\n%@"; +"%@‘s checksum does not match the expected checksum.\n\nChecksum:\n%@\n\nExpected:\n%@" = "%@의 체크섬이 예상 체크섬과 일치하지 않습니다.\n\n체크섬:\n%@\n\n예상값:\n%@"; +"%@’s size could not be determined." = "%@의 크기를 확인할 수 없습니다."; +"%d Selected" = "%d개 선택됨"; +"-" = "-"; +"0 Selected" = "0개 선택됨"; +"0.9.5" = "0.9.5"; +"1 Selected" = "1개 선택됨"; +"1.40" = "1.40"; +"1.63" = "1.63"; +"1.7.4" = "1.7.4"; +"2.2.2" = "2.2.2"; +"2.6.0" = "2.6.0"; +"3D Touch" = "3D Touch"; +"@carolinemoore" = "@carolinemoore"; +"@riley.social" = "@riley.social"; +"@rileytestut" = "@rileytestut"; +"@rileytestut@mastodon.social" = "@rileytestut@mastodon.social"; +"@shanegill.io" = "@shanegill.io"; +"@shanegillio.bsky.social" = "@shanegillio.bsky.social"; +"A" = "A"; +"A Button" = "A 버튼"; +"A cheat already exists with this code." = "같은 코드의 치트가 이미 있습니다."; +"A cheat already exists with this code. Please type in a different code and try again." = "같은 코드의 치트가 이미 있습니다. 다른 코드를 입력한 후 다시 시도해 주세요."; +"A cheat already exists with this name." = "같은 이름의 치트가 이미 있습니다."; +"A cheat already exists with this name. Please rename this cheat and try again." = "같은 이름의 치트가 이미 있습니다. 치트 이름을 변경한 후 다시 시도해 주세요."; +"Active Multiplayer Game" = "진행 중인 멀티플레이 게임"; +"AirPlay" = "AirPlay"; +"AirPlay / External Displays" = "AirPlay / 외부 디스플레이"; +"All Time" = "전체 기간"; +"All associated data, such as saves, save states, and cheat codes, will also be deleted." = "세이브 파일, 세이브 스테이트, 치트 코드 등 관련 데이터도 모두 삭제됩니다."; +"All benefits from Early Adopter and Community Member tiers" = "Early Adopter 및 Community Member 티어의 모든 혜택"; +"All benefits from Early Adopter tier" = "Early Adopter 티어의 모든 혜택"; +"An error occured. Please make sure you typed the cheat code in correctly and try again." = "오류가 발생했습니다. 치트 코드를 올바르게 입력했는지 확인한 후 다시 시도해 주세요."; +"An unknown error occurred." = "알 수 없는 오류가 발생했습니다."; +"Analog Stick Down" = "아날로그 스틱 아래"; +"Analog Stick Left" = "아날로그 스틱 왼쪽"; +"Analog Stick Right" = "아날로그 스틱 오른쪽"; +"Analog Stick Up" = "아날로그 스틱 위"; +"Are you sure you want to change sync services?" = "동기화 서비스를 변경하시겠습니까?"; +"Are you sure you want to delete %d save states? This cannot be undone." = "%d개의 세이브 스테이트를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."; +"Are you sure you want to delete this game?" = "이 게임을 삭제하시겠습니까?"; +"Are you sure you want to delete this save state? This cannot be undone." = "이 세이브 스테이트를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."; +"Are you sure you want to sign out?" = "로그아웃하시겠습니까?"; +"Are you sure you want to unlink your Patreon account?" = "Patreon 계정 연결을 해제하시겠습니까?"; +"Arisotura" = "Arisotura"; +"Arrows" = "화살표"; +"Ask" = "질문하기"; +"Ask Lu" = "Lu에게 질문하기"; +"Ask another" = "다른 질문하기"; +"Auto Save" = "자동 저장"; +"Autorotation Disabled" = "자동 회전 꺼짐"; +"B" = "B"; +"B Button" = "B 버튼"; +"Back to game" = "게임으로 돌아가기"; +"Blue" = "파란색"; +"Bluesky" = "Bluesky"; +"Brown" = "갈색"; +"Buttons" = "버튼"; +"C" = "C"; +"C-Down" = "C-아래"; +"C-Left" = "C-왼쪽"; +"C-Right" = "C-오른쪽"; +"C-Up" = "C-위"; +"Cancel" = "취소"; +"Cannot Modify Locked Save State" = "잠긴 세이브 스테이트를 수정할 수 없음"; +"Cannot Send Mail" = "메일을 보낼 수 없음"; +"Caps Lock" = "Caps Lock"; +"Change" = "변경"; +"Change App Icon" = "앱 아이콘 변경"; +"Change Artwork" = "아트워크 변경"; +"Change Email" = "이메일 변경"; +"Change Icon" = "아이콘 변경"; +"Change Name" = "이름 변경"; +"Change Preview Save State?" = "미리보기 세이브 스테이트를 변경하시겠습니까?"; +"Change Sync Service" = "동기화 서비스 변경"; +"Change icon" = "아이콘 변경"; +"Cheat" = "치트"; +"Cheat Codes" = "치트 코드"; +"Cheats" = "치트"; +"Check back here after adding games to Delta to see their sync status." = "Delta에 게임을 추가한 후 여기에서 동기화 상태를 확인하세요."; +"Choose Game" = "게임 선택"; +"Choose Server" = "서버 선택"; +"Choose WFC Server" = "WFC 서버 선택"; +"Classic" = "클래식"; +"Clipboard" = "클립보드"; +"Close" = "닫기"; +"Cloud" = "클라우드"; +"Code will be formatted automatically as you type." = "입력하면 코드 형식이 자동으로 지정됩니다."; +"Command" = "Command"; +"Community Member" = "Community Member"; +"Compatible" = "호환됨"; +"Confirm" = "확인"; +"Connecting to Nintendo WFC…" = "Nintendo WFC에 연결 중…"; +"Contributors" = "기여자"; +"Control" = "Control"; +"Controller Skin" = "컨트롤러 스킨"; +"Controller Skins" = "컨트롤러 스킨"; +"Copy Deep Link" = "딥 링크 복사"; +"Copy to Clipboard" = "클립보드에 복사"; +"Could Not Share Game" = "게임을 공유할 수 없음"; +"Could not add screenshot to album." = "스크린샷을 앨범에 추가할 수 없습니다."; +"Could not import %@." = "%@ 파일을 가져올 수 없습니다."; +"Could not import “%@”." = "“%@” 파일을 가져올 수 없습니다."; +"Create a new save state by pressing the + button in the top right." = "오른쪽 상단의 + 버튼을 눌러 새 세이브 스테이트를 만드세요."; +"Create a new save state by pressing the Save State option in the pause menu." = "일시 정지 메뉴에서 세이브 스테이트 옵션을 눌러 새 세이브 스테이트를 만드세요."; +"Ctrl" = "Ctrl"; +"Customize Controls…" = "컨트롤 사용자화…"; +"DS" = "DS"; +"DSi" = "DSi"; +"Dark" = "다크"; +"Dark Blue" = "진한 파란색"; +"Dark Brown" = "진한 갈색"; +"Dark Green" = "진한 초록색"; +"Dashes will be inserted automatically as you type." = "입력하면 대시가 자동으로 삽입됩니다."; +"Database Repaired" = "데이터베이스 복구됨"; +"Date" = "날짜"; +"Date Added" = "추가한 날짜"; +"Date Modified" = "수정한 날짜"; +"Debug" = "디버그"; +"Default" = "기본"; +"Delete" = "삭제"; +"Delete %d Save States?" = "%d개의 세이브 스테이트를 삭제하시겠습니까?"; +"Delete Game" = "게임 삭제"; +"Delete Save State?" = "세이브 스테이트를 삭제하시겠습니까?"; +"Deleted" = "삭제됨"; +"Delta" = "Delta"; +"Delta %@" = "Delta %@"; +"Delta Lite" = "Delta Lite"; +"Delta can only play one copy of a game at a time." = "Delta에서는 같은 게임을 한 번에 하나만 실행할 수 있습니다."; +"Delta can only play one game per system at a time.\n\nPlease quit the other game%@, or choose another game for a different system." = "Delta에서는 시스템별로 한 번에 하나의 게임만 실행할 수 있습니다.\n\n다른 게임%@을 종료하거나 다른 시스템의 게임을 선택해 주세요."; +"Delta does not have permission to write to your Photos library." = "Delta가 사진 보관함에 저장할 권한이 없습니다."; +"Delta does not support this cheat type." = "Delta는 이 치트 유형을 지원하지 않습니다."; +"Delta requires certain files to play Nintendo DS games. Please import them to launch this game." = "Delta에서 Nintendo DS 게임을 실행하려면 특정 파일이 필요합니다. 이 게임을 실행하려면 해당 파일을 가져오세요."; +"Delta was unable to import controller skins. Please try again later." = "Delta에서 컨트롤러 스킨을 가져오지 못했습니다. 나중에 다시 시도해 주세요."; +"Delta was unable to import games. Please try again later." = "Delta에서 게임을 가져오지 못했습니다. 나중에 다시 시도해 주세요."; +"Delta will import the games and controller skins copied over via iTunes." = "iTunes로 복사된 게임과 컨트롤러 스킨을 Delta로 가져옵니다."; +"Designed for iPhone" = "iPhone용으로 디자인됨"; +"Disable" = "비활성화"; +"Disable Syncing?" = "동기화를 비활성화하시겠습니까?"; +"Disconnected from Nintendo WFC" = "Nintendo WFC 연결 끊김"; +"Discord Invite Link" = "Discord 초대 링크"; +"Down" = "아래"; +"Down Arrow" = "아래쪽 화살표"; +"Down+A" = "아래+A"; +"Down+B" = "아래+B"; +"Download Anyway" = "그래도 다운로드"; +"Downloading Save File" = "세이브 파일 다운로드 중"; +"Dropbox" = "Dropbox"; +"Dropbox has flagged this game as copyrighted material, so it cannot be downloaded. Please re-import this game to continue syncing." = "Dropbox에서 이 게임을 저작권 보호 자료로 표시하여 다운로드할 수 없습니다. 동기화를 계속하려면 이 게임을 다시 가져오세요."; +"Duplicate Code" = "중복 코드"; +"Duplicate Name" = "중복 이름"; +"Early Adopter" = "Early Adopter"; +"Early access to new features" = "새 기능 조기 이용"; +"Edit Email" = "이메일 편집"; +"Edit Name" = "이름 편집"; +"Enabling syncing again later may result in conflicts that must be resolved manually." = "나중에 동기화를 다시 활성화하면 직접 해결해야 하는 충돌이 발생할 수 있습니다."; +"Enter your question here" = "여기에 질문을 입력하세요"; +"Error" = "오류"; +"Error %@" = "오류 %@"; +"Error %@. %@" = "오류 %@. %@"; +"Error Importing Controller Skins" = "컨트롤러 스킨 가져오기 오류"; +"Error Importing Games" = "게임 가져오기 오류"; +"Error Loading Patrons" = "후원자 불러오기 오류"; +"Escape" = "Escape"; +"Exclusive icons from our favorite indie designers" = "선호하는 인디 디자이너가 제작한 전용 아이콘"; +"Experimental Features" = "실험적 기능"; +"Experimental Features are still in development and will be available for everyone when finished." = "실험적 기능은 아직 개발 중이며, 완성되면 모든 사용자가 이용할 수 있습니다."; +"Export" = "내보내기"; +"Export Save File" = "세이브 파일 내보내기"; +"Failed to Disable Syncing" = "동기화 비활성화 실패"; +"Failed to Enable Syncing" = "동기화 활성화 실패"; +"Failed to Export Save File" = "세이브 파일 내보내기 실패"; +"Failed to Fetch Record Versions" = "기록 버전 가져오기 실패"; +"Failed to Get Sync Status" = "동기화 상태 가져오기 실패"; +"Failed to Import Controller Skin" = "컨트롤러 스킨 가져오기 실패"; +"Failed to Import Save File" = "세이브 파일 가져오기 실패"; +"Failed to Resolve Conflict" = "충돌 해결 실패"; +"Failed to Restore Version" = "버전 복원 실패"; +"Failed to Sign In" = "로그인 실패"; +"Failed to Sign Out" = "로그아웃 실패"; +"Failed to retrieve RetroAchievements game info." = "RetroAchievements 게임 정보를 가져오지 못했습니다."; +"Fast Forward" = "빨리 감기"; +"Fast Forward Disabled" = "빨리 감기 꺼짐"; +"Fast Forward Enabled" = "빨리 감기 켜짐"; +"Fault" = "심각한 오류"; +"Favorite" = "즐겨찾기"; +"Favorites" = "즐겨찾기"; +"Files" = "파일"; +"Filter" = "필터"; +"Friend Zone" = "Friend Zone"; +"Full Name" = "성명"; +"Full Screen" = "전체 화면"; +"GBA" = "GBA"; +"GBC" = "GBC"; +"Gambatte" = "Gambatte"; +"Game" = "게임"; +"Game Already Running" = "게임이 이미 실행 중"; +"Game Boy Advance" = "Game Boy Advance"; +"Game Boy Color" = "Game Boy Color"; +"Game Collection" = "게임 컬렉션"; +"Game Collections" = "게임 컬렉션"; +"Game Controller" = "게임 컨트롤러"; +"Game Controller Input Mapping" = "게임 컨트롤러 입력 매핑"; +"Game Controllers" = "게임 컨트롤러"; +"Game Data Saved" = "게임 데이터 저장됨"; +"Game Paused" = "게임 일시 정지됨"; +"Game Save" = "게임 저장 데이터"; +"Game Settings" = "게임 설정"; +"Game System" = "게임 시스템"; +"Games" = "게임"; +"Games Database" = "게임 데이터베이스"; +"Games will not take over the entire display when AirPlaying." = "AirPlay 중에는 게임이 디스플레이 전체를 차지하지 않습니다."; +"General" = "일반"; +"Genesis (Beta)" = "Genesis (베타)"; +"Genesis Plus GX" = "Genesis Plus GX"; +"GitHub" = "GitHub"; +"Glass" = "글래스"; +"Google Drive" = "Google Drive"; +"Got it!" = "알겠습니다!"; +"Gray" = "회색"; +"Green" = "초록색"; +"Handoff Failed" = "Handoff 실패"; +"Hey ,\n\nYou’re the best. Your account was linked successfully, so you now have access to Patreon-exclusive app icons and Experimental Features. You can find them all in Settings.\n\nThanks for all of your support. Enjoy!\nRiley & Shane" = "Hey ,\n\n정말 최고예요. 계정이 성공적으로 연결되어 이제 Patreon 전용 앱 아이콘과 실험적 기능을 이용할 수 있습니다. 설정에서 모두 확인할 수 있습니다.\n\n항상 응원해 주셔서 감사합니다. 즐겁게 사용하세요!\nRiley & Shane"; +"Hey y'all,\n\nYou can support future development of Delta by donating to us on Patreon. In return, you'll unlock Patreon-exclusive app icons and receive early access to new features.\n\nThanks for all your support 💜\nRiley & Shane" = "안녕하세요, 여러분,\n\nPatreon에서 후원하여 Delta의 향후 개발을 지원할 수 있습니다. 후원하면 Patreon 전용 앱 아이콘을 잠금 해제하고 새로운 기능을 미리 이용할 수 있습니다.\n\n항상 응원해 주셔서 감사합니다 💜\nRiley & Shane"; +"Hold Buttons" = "버튼 고정"; +"Home Screen" = "홈 화면"; +"Home Screen (DSi)" = "홈 화면 (DSi)"; +"Icon Already Selected" = "아이콘이 이미 선택됨"; +"Import" = "가져오기"; +"Import Controller Skin" = "컨트롤러 스킨 가져오기"; +"Import Files" = "파일 가져오기"; +"Import Save File" = "세이브 파일 가져오기"; +"Import from iTunes?" = "iTunes에서 가져오시겠습니까?"; +"Incompatible" = "호환되지 않음"; +"Incompatible Save State" = "호환되지 않는 세이브 스테이트"; +"Incompatible Save States" = "호환되지 않는 세이브 스테이트"; +"Info" = "정보"; +"Input Mappings" = "입력 매핑"; +"Invalid Code" = "잘못된 코드"; +"Invalid Name" = "잘못된 이름"; +"Invalid access token." = "액세스 토큰이 유효하지 않습니다."; +"Invitation to patron-exclusive Discord" = "후원자 전용 Discord 초대"; +"JIT Compilation Enabled" = "JIT 컴파일 활성화됨"; +"Join for $3/month" = "월 $3로 가입하기"; +"L" = "L"; +"L1" = "L1"; +"L1 Button" = "L1 버튼"; +"L2" = "L2"; +"L2 Button" = "L2 버튼"; +"L3" = "L3"; +"L3 Button" = "L3 버튼"; +"Later" = "나중에"; +"Learn More…" = "더 알아보기…"; +"Left" = "왼쪽"; +"Left Arrow" = "왼쪽 화살표"; +"Left Thumbstick" = "왼쪽 스틱"; +"Left+A" = "왼쪽+A"; +"Left+B" = "왼쪽+B"; +"Letters" = "문자"; +"Light" = "라이트"; +"Link Patreon account" = "Patreon 계정 연결"; +"Load State" = "세이브 스테이트 불러오기"; +"Loaded Save State" = "세이브 스테이트를 불러왔습니다"; +"Lock" = "잠그기"; +"Locked" = "잠김"; +"Long-press a game to add it to your favorites." = "게임을 길게 눌러 즐겨찾기에 추가하세요."; +"Lu's Response" = "Lu의 답변"; +"L🕹←" = "L🕹←"; +"L🕹↑" = "L🕹↑"; +"L🕹→" = "L🕹→"; +"L🕹↓" = "L🕹↓"; +"Main Menu" = "메인 메뉴"; +"Manage Patreon Account" = "Patreon 계정 관리"; +"Manage Save File" = "세이브 파일 관리"; +"Manage Subscription" = "구독 관리"; +"Mark as Compatible" = "호환됨으로 표시"; +"Mark as Incompatible" = "호환되지 않음으로 표시"; +"Martin Freij" = "Martin Freij"; +"Mastodon" = "Mastodon"; +"Maybe Later" = "나중에"; +"Menu" = "메뉴"; +"Misc." = "기타"; +"Missing Required DS Files" = "필수 DS 파일 누락"; +"Mode" = "모드"; +"Modern" = "모던"; +"Modifiers" = "보조 키"; +"Mupen64Plus" = "Mupen64Plus"; +"N64" = "N64"; +"NES" = "NES"; +"Name" = "이름"; +"Name listed in Delta in “Special Thanks” section" = "Delta의 “특별히 감사드립니다…” 섹션에 이름 표시"; +"Nestopia" = "Nestopia"; +"New Cheat Code" = "새 치트 코드"; +"Nintendo" = "Nintendo"; +"Nintendo 64" = "Nintendo 64"; +"Nintendo DS" = "Nintendo DS"; +"No Cheats" = "치트 없음"; +"No Cheats in CheatBase" = "CheatBase에 치트 없음"; +"No Favorites" = "즐겨찾기 없음"; +"No Game Controller" = "게임 컨트롤러 없음"; +"No Games" = "게임 없음"; +"No Games Found" = "게임을 찾을 수 없음"; +"No Home Screen Shortcuts" = "홈 화면 단축어 없음"; +"No Save States" = "세이브 스테이트 없음"; +"No connected Patreon account." = "연결된 Patreon 계정이 없습니다."; +"None" = "없음"; +"Normal" = "정상"; +"Notice" = "안내"; +"Numbers" = "숫자"; +"OK" = "확인"; +"On Device" = "기기 내"; +"Open" = "열기"; +"Open New Window" = "새 윈도우 열기"; +"Open in New Window" = "새 윈도우에서 열기"; +"Open in “Safari”?" = "“Safari”에서 여시겠습니까?"; +"Option" = "Option"; +"Option A" = "옵션 A"; +"Option B" = "옵션 B"; +"Option C" = "옵션 C"; +"Option D" = "옵션 D"; +"Option E" = "옵션 E"; +"Option F" = "옵션 F"; +"Option G" = "옵션 G"; +"Option H" = "옵션 H"; +"Optional" = "선택 사항"; +"Orange" = "주황색"; +"Pale Yellow" = "연한 노란색"; +"Past Month" = "지난 한 달"; +"Patreon" = "Patreon"; +"Patrons" = "후원자"; +"Patrons - Button Pack" = "Patrons - Button Pack"; +"Pause game to change orientation." = "방향을 변경하려면 게임을 일시 정지하세요."; +"Photo Library" = "사진 보관함"; +"Please choose a different BIOS file." = "다른 BIOS 파일을 선택해 주세요."; +"Please enter your email so we can send you an invitation to our Discord server." = "Discord 서버 초대장을 보내 드릴 수 있도록 이메일을 입력해 주세요."; +"Please enter your full name so we can credit you on this page." = "이 페이지에 이름을 표시할 수 있도록 실명을 입력해 주세요."; +"Please import the required files in Delta's settings to play DS games." = "DS 게임을 플레이하려면 Delta 설정에서 필수 파일을 가져오세요."; +"Please make sure the name is correct, or try searching for another game." = "이름이 올바른지 확인하거나 다른 게임을 검색해 보세요."; +"Please make sure you typed the cheat code in correctly and try again." = "치트 코드를 올바르게 입력했는지 확인한 후 다시 시도해 주세요."; +"Please rename this cheat and try again." = "치트 이름을 변경한 후 다시 시도해 주세요."; +"Please restart this game to apply your changes." = "변경 사항을 적용하려면 게임을 다시 시작해 주세요."; +"Please wait until after this game's save file has been downloaded before playing to prevent losing save data." = "저장 데이터 유실을 방지하려면 이 게임의 세이브 파일 다운로드가 완료된 후 플레이해 주세요."; +"Press Button" = "버튼을 누르세요"; +"Press the Menu button when finished." = "완료되면 메뉴 버튼을 누르세요."; +"Quick Load" = "빠른 불러오기"; +"Quick Save" = "빠른 저장"; +"Quit Game" = "게임 종료"; +"R" = "R"; +"R1" = "R1"; +"R1 Button" = "R1 버튼"; +"R2" = "R2"; +"R2 Button" = "R2 버튼"; +"R3" = "R3"; +"R3 Button" = "R3 버튼"; +"Recently Played" = "최근 플레이"; +"Recently Played Games" = "최근 플레이한 게임"; +"Red" = "빨간색"; +"Remove" = "제거"; +"Remove as Preview Save State" = "미리보기 세이브 스테이트에서 제거"; +"Rename" = "이름 변경"; +"Rename Game" = "게임 이름 변경"; +"Rename Save State" = "세이브 스테이트 이름 변경"; +"Reset" = "재설정"; +"Reset Controller Skin to Default" = "컨트롤러 스킨을 기본값으로 재설정"; +"Reset Controls to Defaults" = "컨트롤을 기본값으로 재설정"; +"Resolve" = "해결"; +"Resolve Conflict" = "충돌 해결"; +"Restart" = "다시 시작"; +"Restart Required" = "다시 시작 필요"; +"Restore" = "복원"; +"Restore Purchase" = "구매 복원"; +"Restore Version" = "버전 복원"; +"Restoring a remote version will cause any local changes to be lost." = "원격 버전을 복원하면 로컬 변경 사항이 모두 손실됩니다."; +"Resume" = "계속하기"; +"Resuming…" = "재개 중…"; +"RetroAchievements: Logged in as “%@”" = "RetroAchievements: “%@” 계정으로 로그인됨"; +"Retry" = "다시 시도"; +"Return" = "Return"; +"Reverse" = "반전"; +"Reverse Screens" = "화면 순서 반전"; +"Review Save States" = "세이브 스테이트 검토"; +"Richard Goedeken" = "Richard Goedeken"; +"Right" = "오른쪽"; +"Right Arrow" = "오른쪽 화살표"; +"Right Thumbstick" = "오른쪽 스틱"; +"Right+A" = "오른쪽+A"; +"Right+B" = "오른쪽+B"; +"R🕹←" = "R🕹←"; +"R🕹↑" = "R🕹↑"; +"R🕹→" = "R🕹→"; +"R🕹↓" = "R🕹↓"; +"SNES" = "SNES"; +"Save State" = "세이브 스테이트"; +"Save States" = "세이브 스테이트"; +"Saved Save State" = "세이브 스테이트 저장됨"; +"Saved screenshot to Photos" = "스크린샷을 사진 앱에 저장했습니다"; +"Screenshot" = "스크린샷"; +"Search" = "검색"; +"Search CheatBase" = "CheatBase 검색"; +"Sega Genesis" = "Sega Genesis"; +"Select" = "Select"; +"Select Buttons to Hold Down" = "고정할 버튼 선택"; +"Selecting a remote version will cause any local changes to be lost." = "원격 버전을 선택하면 로컬 변경 사항이 모두 손실됩니다."; +"Set as Preview Save State" = "미리보기 세이브 스테이트로 설정"; +"Settings" = "설정"; +"Share" = "공유"; +"Shift" = "Shift"; +"Shortcuts" = "단축어"; +"Sign In" = "로그인"; +"Sign Out" = "로그아웃"; +"Signing in again later may result in conflicts that must be resolved manually." = "나중에 다시 로그인하면 수동으로 해결해야 하는 충돌이 발생할 수 있습니다."; +"Snes9x" = "Snes9x"; +"Snes9x Team" = "Snes9x Team"; +"Some features will be disabled while playing online." = "온라인 플레이 중에는 일부 기능이 비활성화됩니다."; +"Some save files may still be corrupted and require you to restore an older version from the Delta Sync settings.\n\nA text file listing all affected games has been saved to “On My Device/Delta/Backups/conflicts.txt” in the Files app, alongside backups of any conflicted save files." = "일부 세이브 파일은 여전히 손상되어 있을 수 있으며 Delta Sync 설정에서 이전 버전을 복원해야 합니다.\n\n영향을 받은 모든 게임 목록이 담긴 텍스트 파일은 충돌한 세이브 파일의 백업과 함께 파일 앱의 “나의 기기/Delta/Backups/conflicts.txt”에 저장되었습니다."; +"Sort by…" = "정렬 기준…"; +"SourceForge" = "SourceForge"; +"Space" = "스페이스"; +"Spaces and dashes will be inserted automatically as you type." = "입력하는 동안 공백과 하이픈이 자동으로 삽입됩니다."; +"Spaces will be inserted automatically as you type." = "입력하는 동안 공백이 자동으로 삽입됩니다."; +"Special Keys" = "특수 키"; +"Special thanks to…" = "특별히 감사드립니다…"; +"Split View" = "Split View"; +"Stage Manager" = "Stage Manager"; +"Standard" = "표준"; +"Start" = "Start"; +"Super Nintendo" = "Super Nintendo"; +"Switching back later may result in conflicts that must be resolved manually." = "나중에 다시 전환하면 수동으로 해결해야 하는 충돌이 발생할 수 있습니다."; +"Symbols" = "기호"; +"Sync Complete" = "동기화 완료"; +"Sync Failed" = "동기화 실패"; +"Sync Successful" = "동기화 성공"; +"Syncing" = "동기화"; +"Syncing..." = "동기화 중..."; +"System Already Running" = "시스템이 이미 실행 중"; +"System is not yet supported." = "아직 지원되지 않는 시스템입니다."; +"Tab" = "Tab"; +"Thank you for joining our Patreon!" = "Patreon에 가입해 주셔서 감사합니다!"; +"Thank you for supporting us! These icons will remain available even after your subscription ends." = "후원해 주셔서 감사합니다! 구독이 종료된 후에도 이 아이콘을 계속 사용할 수 있습니다."; +"Thanks For Supporting Us!" = "후원해 주셔서 감사합니다!"; +"Thanks for Supporting Us!" = "후원해 주셔서 감사합니다!"; +"The Patreon API rate limit has been exceeded." = "Patreon API 요청 한도를 초과했습니다."; +"The Preview Save State is loaded whenever you 3D Touch this game from the Main Menu. Are you sure you want to change it?" = "미리보기 세이브 스테이트는 메인 메뉴에서 이 게임을 3D Touch할 때 불러옵니다. 변경하시겠습니까?"; +"The Preview Save State is loaded whenever you long press this game from the Main Menu. Are you sure you want to change it?" = "미리보기 세이브 스테이트는 메인 메뉴에서 이 게임을 길게 누를 때 불러옵니다. 변경하시겠습니까?"; +"The SQLite database could not be found." = "SQLite 데이터베이스를 찾을 수 없습니다."; +"The cheat code isn't in the correct format." = "치트 코드 형식이 올바르지 않습니다."; +"The downloaded record is associated with the wrong game (%@)." = "다운로드한 레코드가 잘못된 게임(%@)에 연결되어 있습니다."; +"The downloaded record is associated with the wrong game system (%@)." = "다운로드한 레코드가 잘못된 게임 시스템(%@)에 연결되어 있습니다."; +"The downloaded record is not associated with a game system." = "다운로드한 레코드가 게임 시스템과 연결되어 있지 않습니다."; +"The downloaded record is not associated with a game." = "다운로드한 레코드가 게임과 연결되어 있지 않습니다."; +"The file does not exist." = "파일이 존재하지 않습니다."; +"The file is invalid." = "파일이 올바르지 않습니다."; +"The following controller skin files could not be imported:" = "다음 컨트롤러 스킨 파일을 가져올 수 없습니다:"; +"The following game files could not be imported:" = "다음 게임 파일을 가져올 수 없습니다:"; +"The game for this item is missing. Please re-import the game to resume syncing its data." = "이 항목의 게임이 없습니다. 데이터 동기화를 다시 시작하려면 게임을 다시 가져오세요."; +"The game's identifier is missing." = "게임 식별자가 없습니다."; +"The games you've selected below will appear as shortcuts when long-pressing the app icon." = "아래에서 선택한 게임은 앱 아이콘을 길게 누르면 단축어로 표시됩니다."; +"The image might be corrupted or in an unsupported format." = "이미지가 손상되었거나 지원되지 않는 형식일 수 있습니다."; +"The local version will be uploaded and synced to your other devices." = "로컬 버전이 업로드되어 다른 기기와 동기화됩니다."; +"The name of this cheat is invalid." = "치트 이름이 올바르지 않습니다."; +"The “Delta Screenshots” album could not be found." = "“Delta Screenshots” 앨범을 찾을 수 없습니다."; +"There is no associated game with this cheat." = "이 치트와 연결된 게임이 없습니다."; +"There is no chosen service for syncing." = "선택된 동기화 서비스가 없습니다."; +"There is no product with the requested ID." = "요청한 ID의 제품이 없습니다."; +"There were no errors during last sync." = "마지막 동기화 중 오류가 없었습니다."; +"These icons are available as a thank you to all our patrons who have ever donated to us.\n\nThey will remain available even after your subscription ends." = "이 아이콘은 지금까지 후원해 주신 모든 후원자께 감사하는 의미로 제공됩니다.\n\n구독이 종료된 후에도 계속 사용할 수 있습니다."; +"These save states are incompatible with this version of Delta. You can export them to continue playing in Delta Legacy." = "이 세이브 스테이트는 현재 Delta 버전과 호환되지 않습니다. Delta Legacy에서 계속 플레이하려면 내보낼 수 있습니다."; +"These save states have been modified recently and may be associated with the wrong game.\n\nPlease change any incorrectly associated save states to the correct game by tapping them." = "이 세이브 스테이트는 최근 수정되었으며 잘못된 게임과 연결되어 있을 수 있습니다.\n\n잘못 연결된 세이브 스테이트를 탭하여 올바른 게임으로 변경해 주세요."; +"This Device" = "이 기기"; +"This file is not supported." = "지원되지 않는 파일입니다."; +"This game does not exist in your game library." = "게임 보관함에 이 게임이 없습니다."; +"This game is playing on a second screen." = "이 게임은 두 번째 화면에서 플레이 중입니다."; +"This name is not allowed." = "허용되지 않는 이름입니다."; +"This save state is incompatible with this version of Delta." = "이 세이브 스테이트는 현재 Delta 버전과 호환되지 않습니다."; +"This save state must first be unlocked before it can be modified." = "수정하려면 먼저 세이브 스테이트의 잠금을 해제해야 합니다."; +"This version of Delta is not compatible with previous Nintendo DS save states.\n\nYou can find previous save states by pressing “View Incompatible Save States” in the options menu." = "이 Delta 버전은 이전 Nintendo DS 세이브 스테이트와 호환되지 않습니다.\n\n옵션 메뉴에서 “호환되지 않는 세이브 스테이트 보기”를 눌러 이전 세이브 스테이트를 확인할 수 있습니다."; +"Threads" = "Threads"; +"To search the database, type the name of a game in the search bar." = "데이터베이스를 검색하려면 검색 막대에 게임 이름을 입력하세요."; +"Toggle Fast Forward" = "빨리 감기 켜기/끄기"; +"Touch" = "터치"; +"Touch Screen" = "터치 스크린"; +"Try restoring an older version to resolve this issue." = "이 문제를 해결하려면 이전 버전을 복원해 보세요."; +"Try restoring an older version, or manually re-import the game to resolve this issue." = "이 문제를 해결하려면 이전 버전을 복원하거나 게임을 직접 다시 가져오세요."; +"Unable to Add Cheat" = "치트를 추가할 수 없음"; +"Unable to Authenticate with Patreon" = "Patreon 인증을 완료할 수 없음"; +"Unable to Change App Icon" = "앱 아이콘을 변경할 수 없음"; +"Unable to Change Artwork" = "아트워크를 변경할 수 없음"; +"Unable to Change Syncing Service" = "동기화 서비스를 변경할 수 없음"; +"Unable to Export Save State" = "세이브 스테이트를 내보낼 수 없음"; +"Unable to Import Save State" = "세이브 스테이트를 가져올 수 없음"; +"Unable to Launch Delta" = "Delta를 실행할 수 없음"; +"Unable to Launch Game" = "게임을 실행할 수 없음"; +"Unable to Log In to RetroAchievements" = "RetroAchievements에 로그인할 수 없음"; +"Unable to Manage Subscription" = "구독을 관리할 수 없음"; +"Unable to Purchase Subscription" = "구독을 구매할 수 없음"; +"Unable to Restore Purchase" = "구매를 복원할 수 없음"; +"Unable to Save Changes" = "변경 사항을 저장할 수 없음"; +"Unable to Save Screenshot" = "스크린샷을 저장할 수 없음"; +"Unable to Sign Out of Patreon" = "Patreon에서 로그아웃할 수 없음"; +"Unable to Track Achievements" = "도전 과제를 추적할 수 없음"; +"Unable to Update Display Name" = "표시 이름을 업데이트할 수 없음"; +"Unable to Update Email" = "이메일을 업데이트할 수 없음"; +"Unable to fetch “Delta Screenshots” album." = "“Delta Screenshots” 앨범 정보를 불러올 수 없습니다."; +"Undefined" = "정의되지 않음"; +"Unfavorite" = "즐겨찾기 해제"; +"Unknown" = "알 수 없음"; +"Unknown Error" = "알 수 없는 오류"; +"Unknown Game" = "알 수 없는 게임"; +"Unknown System" = "알 수 없는 시스템"; +"Unlink %@" = "%@ 연결 해제"; +"Unlink Patreon Account" = "Patreon 계정 연결 해제"; +"Unlock" = "잠금 해제"; +"Untitled" = "제목 없음"; +"Up" = "위"; +"Up Arrow" = "위쪽 화살표"; +"Up+A" = "위+A"; +"Up+B" = "위+B"; +"Updated" = "업데이트됨"; +"User is not logged in." = "로그인되어 있지 않습니다."; +"VBA-M Team" = "VBA-M Team"; +"Verifying Database…" = "데이터베이스 확인 중…"; +"Version Corrupted" = "버전 손상됨"; +"View Compatible Save States" = "호환되는 세이브 스테이트 보기"; +"View Incompatible Save States" = "호환되지 않는 세이브 스테이트 보기"; +"View Patreon" = "Patreon 보기"; +"View Save States" = "세이브 스테이트 보기"; +"View Versions" = "버전 보기"; +"VisualBoyAdvance-M" = "VisualBoyAdvance-M"; +"We and our service providers may record your chat with us. By using this chat, you agree to our Terms of Service and Privacy Policy. \n \n https://www.lulabs.ai/legal" = "당사 및 서비스 제공업체는 귀하와의 채팅을 기록할 수 있습니다. 이 채팅을 사용하면 서비스 약관 및 개인정보 처리방침에 동의하는 것입니다. \n \n https://www.lulabs.ai/legal"; +"Welcome to Lu!" = "Lu에 오신 것을 환영합니다!"; +"What would you like to know about this game?" = "이 게임에 관해 무엇을 알고 싶으신가요?"; +"When AirPlaying DS games, both screens will be placed side-by-side on the external display." = "DS 게임을 AirPlay할 때 두 화면이 외부 디스플레이에 나란히 표시됩니다."; +"When AirPlaying DS games, both screens will be stacked vertically on the external display." = "DS 게임을 AirPlay할 때 두 화면이 외부 디스플레이에 위아래로 표시됩니다."; +"When AirPlaying DS games, only the top screen will appear on the external display." = "DS 게임을 AirPlay할 때 상단 화면만 외부 디스플레이에 표시됩니다."; +"Would you like to download this version anyway? Delta will try to fix the corruption if possible." = "그래도 이 버전을 다운로드하시겠습니까? 가능하면 Delta가 손상된 데이터를 복구합니다."; +"Would you like to resume where you left off, or restart the game?" = "중단한 지점부터 계속하시겠습니까, 아니면 게임을 다시 시작하시겠습니까?"; +"X" = "X"; +"X Button" = "X 버튼"; +"Y" = "Y"; +"Y Button" = "Y 버튼"; +"Yellow" = "노란색"; +"You are currently playing %@ online. Please quit this game before playing another one." = "%@의 온라인 플레이가 진행 중입니다. 다른 게임을 플레이하기 전에 이 게임을 종료해 주세요."; +"You can add a new cheat by pressing the + button in the top right." = "오른쪽 상단의 + 버튼을 눌러 새 치트를 추가할 수 있습니다."; +"You can customize the shortcuts that appear when long-pressing the app icon once you've added some games." = "게임을 추가한 후 앱 아이콘을 길게 눌렀을 때 표시되는 단축어를 사용자화할 수 있습니다."; +"You can import games by pressing the + button in the top right." = "오른쪽 상단의 + 버튼을 눌러 게임을 가져올 수 있습니다."; +"You can now Fast Forward DS games up to 3x speed." = "이제 DS 게임을 최대 3배속으로 빨리 감을 수 있습니다."; +"You can now access Patreon-exclusive features like alternate app icons and Experimental Features." = "이제 대체 앱 아이콘과 실험적 기능 같은 Patreon 전용 기능을 사용할 수 있습니다."; +"You can now access patron-exclusive features like alternate app icons and Experimental Features." = "이제 대체 앱 아이콘과 실험적 기능 같은 후원자 전용 기능을 사용할 수 있습니다."; +"You have %@ save states that are incompatible with this version of Delta." = "현재 Delta 버전과 호환되지 않는 세이브 스테이트가 %@개 있습니다."; +"You have 1 save state that is incompatible with this version of Delta." = "현재 Delta 버전과 호환되지 않는 세이브 스테이트가 1개 있습니다."; +"You have no recently played games." = "최근 플레이한 게임이 없습니다."; +"You have save states that are incompatible with this version of Delta." = "현재 Delta 버전과 호환되지 않는 세이브 스테이트가 있습니다."; +"You may have up to 4 shortcuts." = "단축어는 최대 4개까지 설정할 수 있습니다."; +"You may need to also “Erase Nintendo WFC Configuration” in-game." = "게임 내에서 “Erase Nintendo WFC Configuration”도 실행해야 할 수 있습니다."; +"You may need to reboot your device in order for the app icon to update." = "앱 아이콘을 업데이트하려면 기기를 재부팅해야 할 수 있습니다."; +"You must choose a 3rd-party WFC server to use Nintendo DS online features." = "Nintendo DS 온라인 기능을 사용하려면 서드 파티 WFC 서버를 선택해야 합니다."; +"You will leave the app and go to the developer's website." = "앱에서 나가 개발자 웹사이트로 이동합니다."; +"You will no longer be able to access Patreon-exclusive features." = "더 이상 Patreon 전용 기능을 사용할 수 없습니다."; +"Your most recently played games will appear as shortcuts when long-pressing the app icon." = "앱 아이콘을 길게 누르면 최근 플레이한 게임이 단축어로 표시됩니다."; +"Z" = "Z"; +"a game" = "게임"; +"eke-eke" = "eke-eke"; +"iTunes" = "iTunes"; +"me@example.com" = "me@example.com"; +"melonDS" = "melonDS"; +"r571" = "r571"; +"sinamas" = "sinamas"; +"“%@“ is missing. Please re-import this game to resume syncing its data." = "“%@” 게임이 없습니다. 데이터 동기화를 다시 시작하려면 이 게임을 다시 가져오세요."; +"←" = "←"; +"↑" = "↑"; +"→" = "→"; +"↓" = "↓"; +"↩︎" = "↩︎"; +"⇥" = "⇥"; +"⇧" = "⇧"; +"⇪" = "⇪"; +"⌘" = "⌘"; +"⌥" = "⌥"; +"⎋" = "⎋"; +"⚠️ Tap to view our Troubleshooting Guide." = "⚠️ 탭하여 문제 해결 가이드를 확인하세요."; +"✅ Achievement Unlocked" = "✅ 도전 과제 달성"; From e5d31ec9f86c2ca287e943e8137e05c49b68ec3c Mon Sep 17 00:00:00 2001 From: himomohi Date: Sun, 9 Aug 2026 22:58:35 +0900 Subject: [PATCH 3/7] Complete Korean interface localization --- Delta.xcodeproj/project.pbxproj | 52 +++++++++++++++++-- Delta/ko.lproj/AboutPatreonHeaderView.strings | 14 +++++ Delta/ko.lproj/FollowUsFooterView.strings | 11 ++++ Delta/ko.lproj/InfoPlist.strings | 4 ++ .../SyncResultsViewController.strings | 2 + 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 Delta/ko.lproj/AboutPatreonHeaderView.strings create mode 100644 Delta/ko.lproj/FollowUsFooterView.strings create mode 100644 Delta/ko.lproj/InfoPlist.strings create mode 100644 Delta/ko.lproj/SyncResultsViewController.strings diff --git a/Delta.xcodeproj/project.pbxproj b/Delta.xcodeproj/project.pbxproj index 0acda84a..91d9bf39 100644 --- a/Delta.xcodeproj/project.pbxproj +++ b/Delta.xcodeproj/project.pbxproj @@ -90,6 +90,7 @@ BF353FFF1C5DA3C500C1184C /* PausePresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF353FFD1C5DA3C500C1184C /* PausePresentationController.swift */; }; BF3540001C5DA3C500C1184C /* PausePresentationControllerContentView.xib in Resources */ = {isa = PBXBuildFile; fileRef = BF353FFE1C5DA3C500C1184C /* PausePresentationControllerContentView.xib */; }; E5FB2509336BA07BECE429E5 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = C1626A34322395AB20E64B10 /* Localizable.strings */; }; + 4851F22C23545AF790AF115C /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = F41E4AC7EA77A4E548A071BA /* InfoPlist.strings */; }; BF3540021C5DA3D500C1184C /* PauseStoryboardSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540011C5DA3D500C1184C /* PauseStoryboardSegue.swift */; }; BF3540081C5DAFAD00C1184C /* PauseTransitionCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF3540071C5DAFAD00C1184C /* PauseTransitionCoordinator.swift */; }; BF3D6C512202865F0083E05A /* Delta2ToDelta3.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = BF3D6C502202865F0083E05A /* Delta2ToDelta3.xcmappingmodel */; }; @@ -645,7 +646,8 @@ BF18B61E1E2985F900F70067 /* UIAlertController+Importing.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIAlertController+Importing.swift"; sourceTree = ""; }; BF1DAD5C1D9F576000E752A7 /* PreferredControllerSkinsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferredControllerSkinsViewController.swift; sourceTree = ""; }; BF1F45A321AF274D00EF9895 /* SyncResultViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncResultViewController.swift; sourceTree = ""; }; - BF1F45AA21AF4B5800EF9895 /* SyncResultsViewController.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SyncResultsViewController.storyboard; sourceTree = ""; }; + 461E1C1029A65398D84C67C3 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Syncing/SyncResultsViewController.storyboard; sourceTree = ""; }; + 5A56C43E75A93020D886AA3F /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/SyncResultsViewController.strings; sourceTree = ""; }; BF1F45AC21AF57BA00EF9895 /* HarmonyMetadataKey+Keys.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "HarmonyMetadataKey+Keys.swift"; sourceTree = ""; }; BF1F45BE21AF676F00EF9895 /* Box.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Box.swift; sourceTree = ""; }; BF27CC861BC9E3C600A20D89 /* Delta.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = Delta.entitlements; sourceTree = ""; }; @@ -771,6 +773,7 @@ BFFA4C081E8A24D600D87934 /* GameTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GameTableViewCell.swift; sourceTree = ""; }; BFFA71D71AAC406100EE9DD1 /* Delta.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Delta.app; sourceTree = BUILT_PRODUCTS_DIR; }; BFFA71DB1AAC406100EE9DD1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 42E0C602001B0332C6BBB1A8 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/InfoPlist.strings; sourceTree = ""; }; BFFA71DC1AAC406100EE9DD1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; BFFA71E11AAC406100EE9DD1 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; E2A2382998C65E9AA22C02AD /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Main.strings; sourceTree = ""; }; @@ -884,7 +887,8 @@ D5AA0F112CE3F4FB0015D134 /* ManagedPatron.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManagedPatron.swift; sourceTree = ""; }; D5AA0F132CE3F5040015D134 /* _ManagedPatron.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = _ManagedPatron.swift; sourceTree = ""; }; D5AA0F152CE3F65E0015D134 /* FriendZoneManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FriendZoneManager.swift; sourceTree = ""; }; - D5AA0F192CE404E90015D134 /* AboutPatreonHeaderView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AboutPatreonHeaderView.xib; sourceTree = ""; }; + 136DB6A536BF958F45B890C6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Settings/Patreon/AboutPatreonHeaderView.xib; sourceTree = ""; }; + A4213391D4CF78EA29F564AE /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/AboutPatreonHeaderView.strings; sourceTree = ""; }; D5AAF27629884F8600F21ACF /* CheatDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheatDevice.swift; sourceTree = ""; }; D5ADD12129F33FBF00CE0560 /* Features.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Features.swift; sourceTree = ""; }; D5AE76AE2C2B52810086471B /* UserAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserAccount.swift; sourceTree = ""; }; @@ -905,7 +909,8 @@ D5B0F4E42D67F0660069F4DB /* WhatsNew.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = WhatsNew.plist; sourceTree = ""; }; D5B4235B2BD9C24000093054 /* RoundedImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoundedImageView.swift; sourceTree = ""; }; D5B6F5D22D6FC0F00061C365 /* FollowUsFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FollowUsFooterView.swift; sourceTree = ""; }; - D5B6F5D42D6FC23E0061C365 /* FollowUsFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FollowUsFooterView.xib; sourceTree = ""; }; + 1D3C22BE8430516B082C7972 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Components/FollowUsFooterView.xib; sourceTree = ""; }; + 3FD56624305F1D85D99D17A8 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/FollowUsFooterView.strings; sourceTree = ""; }; D5BE1BD62D0B9CBE00D2142E /* PatreonAPI.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PatreonAPI.plist; sourceTree = ""; }; D5C7DD032E26CF350048FF5C /* NESDeltaCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NESDeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D5C7DD062E26CF540048FF5C /* SNESDeltaCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SNESDeltaCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1585,6 +1590,7 @@ BF090CF11B490D8300DCAB45 /* Delta-Bridging-Header.h */, BF27CC861BC9E3C600A20D89 /* Delta.entitlements */, BFFA71DB1AAC406100EE9DD1 /* Info.plist */, + F41E4AC7EA77A4E548A071BA /* InfoPlist.strings */, BFAB9F87219A4B670080EC7D /* GoogleService-Info.plist */, C6F24ADA2D64B5A0002F939F /* Lu-Info.plist */, ); @@ -2330,6 +2336,7 @@ D5D797E9298DCC7300738869 /* cheatbase.zip in Resources */, BFFA71E21AAC406100EE9DD1 /* Main.storyboard in Resources */, E5FB2509336BA07BECE429E5 /* Localizable.strings in Resources */, + 4851F22C23545AF790AF115C /* InfoPlist.strings in Resources */, D5B6F5D52D6FC23E0061C365 /* FollowUsFooterView.xib in Resources */, D5AE76C62C2B7F3D0086471B /* Icons.xcassets in Resources */, D5AA0F1A2CE404E90015D134 /* AboutPatreonHeaderView.xib in Resources */, @@ -2839,6 +2846,45 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + BF1F45AA21AF4B5800EF9895 /* SyncResultsViewController.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 461E1C1029A65398D84C67C3 /* Base */, + 5A56C43E75A93020D886AA3F /* ko */, + ); + name = SyncResultsViewController.storyboard; + path = Delta; + sourceTree = SOURCE_ROOT; + }; + D5AA0F192CE404E90015D134 /* AboutPatreonHeaderView.xib */ = { + isa = PBXVariantGroup; + children = ( + 136DB6A536BF958F45B890C6 /* Base */, + A4213391D4CF78EA29F564AE /* ko */, + ); + name = AboutPatreonHeaderView.xib; + path = Delta; + sourceTree = SOURCE_ROOT; + }; + D5B6F5D42D6FC23E0061C365 /* FollowUsFooterView.xib */ = { + isa = PBXVariantGroup; + children = ( + 1D3C22BE8430516B082C7972 /* Base */, + 3FD56624305F1D85D99D17A8 /* ko */, + ); + name = FollowUsFooterView.xib; + path = Delta; + sourceTree = SOURCE_ROOT; + }; + F41E4AC7EA77A4E548A071BA /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 42E0C602001B0332C6BBB1A8 /* ko */, + ); + name = InfoPlist.strings; + path = Delta; + sourceTree = SOURCE_ROOT; + }; BF353FF41C5D837600C1184C /* PauseMenu.storyboard */ = { isa = PBXVariantGroup; children = ( diff --git a/Delta/ko.lproj/AboutPatreonHeaderView.strings b/Delta/ko.lproj/AboutPatreonHeaderView.strings new file mode 100644 index 00000000..371af3af --- /dev/null +++ b/Delta/ko.lproj/AboutPatreonHeaderView.strings @@ -0,0 +1,14 @@ +/* ObjectID = "zeg-bc-rzK"; property = "text"; */ +"zeg-bc-rzK.text" = "개발자"; + +/* ObjectID = "ihU-uM-YGb"; property = "text"; */ +"ihU-uM-YGb.text" = "운영"; + +/* ObjectID = "yEi-L6-kQ8"; property = "normalTitle"; */ +"yEi-L6-kQ8.normalTitle" = "월 $3에 가입하기"; + +/* ObjectID = "ymY-qC-4y4"; property = "normalTitle"; */ +"ymY-qC-4y4.normalTitle" = "Patreon 계정 연결"; + +/* ObjectID = "FeG-e5-LJl"; property = "text"; */ +"FeG-e5-LJl.text" = "직접 후원해 주시는 모든 Friend Zone Patreon 후원자 여러분께 감사드립니다. 여러분 없이는 해낼 수 없었을 거예요 💜 지금 Friend Zone 후원자가 되어 이 페이지에 이름을 올리고 새로운 기능을 미리 이용해 보세요."; diff --git a/Delta/ko.lproj/FollowUsFooterView.strings b/Delta/ko.lproj/FollowUsFooterView.strings new file mode 100644 index 00000000..a3fb70b8 --- /dev/null +++ b/Delta/ko.lproj/FollowUsFooterView.strings @@ -0,0 +1,11 @@ +/* ObjectID = "l14-Bv-0T9"; property = "text"; */ +"l14-Bv-0T9.text" = "업데이트 소식 받기"; + +/* ObjectID = "UhB-rU-QWe"; property = "text"; */ +"UhB-rU-QWe.text" = "개발자"; + +/* ObjectID = "w1b-Io-oJk"; property = "text"; */ +"w1b-Io-oJk.text" = "운영"; + +/* ObjectID = "WvH-lk-VLq"; property = "text"; */ +"WvH-lk-VLq.text" = "디자이너"; diff --git a/Delta/ko.lproj/InfoPlist.strings b/Delta/ko.lproj/InfoPlist.strings new file mode 100644 index 00000000..79dab01c --- /dev/null +++ b/Delta/ko.lproj/InfoPlist.strings @@ -0,0 +1,4 @@ +"NSLocalNetworkUsageDescription" = "Delta는 AltServer와 통신하고 JIT를 활성화하며 Epilogue Operator 기기에 연결하기 위해 로컬 네트워크를 사용합니다."; +"NSMicrophoneUsageDescription" = "Delta는 Nintendo DS의 마이크 기능을 에뮬레이션하기 위해 사용자의 마이크를 사용합니다."; +"NSPhotoLibraryAddUsageDescription" = "Delta가 스크린샷을 사진 보관함에 저장할 수 있도록 허용해 주세요."; +"NSPhotoLibraryUsageDescription" = "“확인”을 눌러 Delta가 사진 보관함의 이미지를 게임 아트워크로 사용할 수 있도록 허용해 주세요."; diff --git a/Delta/ko.lproj/SyncResultsViewController.strings b/Delta/ko.lproj/SyncResultsViewController.strings new file mode 100644 index 00000000..7f0bbeca --- /dev/null +++ b/Delta/ko.lproj/SyncResultsViewController.strings @@ -0,0 +1,2 @@ +/* ObjectID = "Qzj-eH-8qF"; property = "title"; */ +"Qzj-eH-8qF.title" = "결과"; From 90bfc0e058b7791441b586b274691bc4268dc651 Mon Sep 17 00:00:00 2001 From: himomohi Date: Sun, 9 Aug 2026 23:27:00 +0900 Subject: [PATCH 4/7] Complete Korean runtime localization --- .../Repair/RepairDatabaseViewController.swift | 4 +- Delta/Emulation/GameViewController.swift | 3 +- Delta/Extensions/PauseViewController+Lu.swift | 127 ++++----- Delta/Launch/WhatsNewCell.swift | 4 +- Delta/Launch/WhatsNewViewController.swift | 8 + .../AchievementGameBanner.swift | 6 +- .../AchievementNotification.swift | 6 +- .../ControllersSettingsViewController.swift | 2 +- .../Controllers/ControlsEditorView.swift | 14 +- Delta/Settings/SettingsView.swift | 2 +- Delta/Settings/SettingsViewController.swift | 6 +- Delta/ko.lproj/Localizable.strings | 249 ++++++++++++++++++ 12 files changed, 353 insertions(+), 78 deletions(-) diff --git a/Delta/Database/Repair/RepairDatabaseViewController.swift b/Delta/Database/Repair/RepairDatabaseViewController.swift index db682139..5d05ac0e 100644 --- a/Delta/Database/Repair/RepairDatabaseViewController.swift +++ b/Delta/Database/Repair/RepairDatabaseViewController.swift @@ -77,7 +77,7 @@ private extension RepairDatabaseViewController { case .failure(let error): DispatchQueue.main.async { - let alertController = UIAlertController(title: "Unable to Repair Games", error: error) + let alertController = UIAlertController(title: NSLocalizedString("Unable to Repair Games", comment: ""), error: error) self.present(alertController, animated: true) } @@ -87,7 +87,7 @@ private extension RepairDatabaseViewController switch result { case .failure(let error): - let alertController = UIAlertController(title: "Unable to Repair Save Files", error: error) + let alertController = UIAlertController(title: NSLocalizedString("Unable to Repair Save Files", comment: ""), error: error) self.present(alertController, animated: true) case .success: diff --git a/Delta/Emulation/GameViewController.swift b/Delta/Emulation/GameViewController.swift index e8fc4c58..2c7c0320 100644 --- a/Delta/Emulation/GameViewController.swift +++ b/Delta/Emulation/GameViewController.swift @@ -2593,7 +2593,8 @@ private extension GameViewController toastView.show(in: self.view, duration: 4.0) } else { let title = String(format: NSLocalizedString("✅ Achievement Unlocked", comment: "")) - let message = String(AttributedString(localized: "\(achievement.title) (^[\(achievement.points) \("point")](inflect: true))").characters) + let point = String(localized: "point") + let message = String(AttributedString(localized: "\(achievement.title) (^[\(achievement.points) \(point)](inflect: true))").characters) let toastView = RSTToastView(text: title, detailText: message) toastView.detailTextLabel.textAlignment = .center diff --git a/Delta/Extensions/PauseViewController+Lu.swift b/Delta/Extensions/PauseViewController+Lu.swift index f97262b4..562fda9a 100644 --- a/Delta/Extensions/PauseViewController+Lu.swift +++ b/Delta/Extensions/PauseViewController+Lu.swift @@ -320,7 +320,7 @@ extension PauseViewController { // Show initial loading indicator let loadingAlert = UIAlertController( title: nil, - message: "Checking game...", + message: NSLocalizedString("Checking game...", comment: ""), preferredStyle: .alert ) @@ -374,7 +374,7 @@ extension PauseViewController { private func showLuQuestionPrompt(for game: Game) { let alertController = UIAlertController( - title: NSLocalizedString("Ask Lu about \(game.name)", comment: ""), + title: String(format: NSLocalizedString("Ask Lu about %@", comment: ""), game.name), message: NSLocalizedString("What would you like to know about this game?", comment: ""), preferredStyle: .alert ) @@ -405,7 +405,7 @@ extension PauseViewController { let loadingAlert = UIAlertController( title: nil, - message: "Lu is thinking...", + message: NSLocalizedString("Lu is thinking...", comment: ""), preferredStyle: .alert ) @@ -421,14 +421,14 @@ extension PauseViewController { let urlString = APIConstants.askBaseURL guard let url = URL(string: urlString) else { loadingAlert.dismiss(animated: true) - self.showError("Failed to create request") + self.showError(NSLocalizedString("Failed to create request", comment: "")) return } let activeGameId = ExperimentalFeatures.shared.Lu.wrappedValue.activeGameId if activeGameId.isEmpty { loadingAlert.dismiss(animated: true) - self.showError("Failed to prepare your question") + self.showError(NSLocalizedString("Failed to prepare your question", comment: "")) return } @@ -522,7 +522,7 @@ extension PauseViewController { } catch { luLog(.error, "Failed to encode request: \(error.localizedDescription)") loadingAlert.dismiss(animated: true) - self.showError("Failed to prepare your question") + self.showError(NSLocalizedString("Failed to prepare your question", comment: "")) return } @@ -536,23 +536,23 @@ extension PauseViewController { if let error = error as? URLError { switch error.code { case .timedOut: - self?.showError("Lu is taking longer than usual to respond. Please try again.") + self?.showError(NSLocalizedString("Lu is taking longer than usual to respond. Please try again.", comment: "")) case .notConnectedToInternet: - self?.showError("No internet connection. Please check your connection and try again.") + self?.showError(NSLocalizedString("No internet connection. Please check your connection and try again.", comment: "")) default: - self?.showError("Unable to connect to Lu. Please try again later.") + self?.showError(NSLocalizedString("Unable to connect to Lu. Please try again later.", comment: "")) } return } guard let httpResponse = response as? HTTPURLResponse else { - self?.showError("Received an invalid response. Please try again.") + self?.showError(NSLocalizedString("Received an invalid response. Please try again.", comment: "")) return } guard httpResponse.statusCode == 200, let data = data else { - self?.showError("Lu encountered an error. Please try again later.") + self?.showError(NSLocalizedString("Lu encountered an error. Please try again later.", comment: "")) return } @@ -560,7 +560,7 @@ extension PauseViewController { let luResponse = try JSONDecoder().decode(LuResponse.self, from: data) self?.showLuResponse(response: luResponse, question: question, for: game) } catch { - self?.showError("Failed to understand Lu's response. Please try again.") + self?.showError(NSLocalizedString("Failed to understand Lu's response. Please try again.", comment: "")) } } } @@ -569,16 +569,11 @@ extension PauseViewController { } private func showLuResponse(response: LuResponse, question: String, for game: Game) { - var messageText = "" - - messageText += """ - Q: \(question) - - \(response.answer) - """ + var messageText = String(format: NSLocalizedString("Q: %@", comment: ""), question) + messageText += "\n\n" + response.answer if ExperimentalFeatures.shared.Lu.wrappedValue.rememberConversations { - messageText += "\n\n(Conversation will be remembered for this game)" + messageText += "\n\n" + NSLocalizedString("(Conversation will be remembered for this game)", comment: "") } let responseAlert = UIAlertController( @@ -595,72 +590,72 @@ extension PauseViewController { } let feedbackActions = UIAlertAction( - title: "Share feedback", + title: NSLocalizedString("Share feedback", comment: ""), style: .default ) { [weak self] _ in let feedbackAlert = UIAlertController( - title: "Feedback", - message: "Let us know how Lu handled your question:\n\n\"\(question)\"", + title: NSLocalizedString("Feedback", comment: ""), + message: String(format: NSLocalizedString("Let us know how Lu handled your question:\n\n\"%@\"", comment: ""), question), preferredStyle: .alert ) let thumbsUpAction = UIAlertAction( - title: "👍 Great!", + title: NSLocalizedString("👍 Great!", comment: ""), style: .default ) { [weak self] _ in self?.sendFeedback(messageId: response.message_id, feedback: "POSITIVE", feedbackMessage: nil, for: game) { let successAlert = UIAlertController( - title: "Thank You!", - message: "Your feedback helps Lu improve and provide even better answers in the future.", + title: NSLocalizedString("Thank You!", comment: ""), + message: NSLocalizedString("Your feedback helps Lu improve and provide even better answers in the future.", comment: ""), preferredStyle: .alert ) - successAlert.addAction(UIAlertAction(title: "OK", style: .default)) + successAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default)) self?.present(successAlert, animated: true) } } let thumbsDownAction = UIAlertAction( - title: "👎 Needs Improvement", + title: NSLocalizedString("👎 Needs Improvement", comment: ""), style: .default ) { [weak self] _ in let inputAlert = UIAlertController( - title: "Additional Feedback", - message: "How can Lu improve its response to your question?\n\n\"\(question)\"", + title: NSLocalizedString("Additional Feedback", comment: ""), + message: String(format: NSLocalizedString("How can Lu improve its response to your question?\n\n\"%@\"", comment: ""), question), preferredStyle: .alert ) inputAlert.addTextField { textField in - textField.placeholder = "Enter your feedback" + textField.placeholder = NSLocalizedString("Enter your feedback", comment: "") } let sendAction = UIAlertAction( - title: "Send", + title: NSLocalizedString("Send", comment: ""), style: .default ) { _ in if let message = inputAlert.textFields?.first?.text { self?.sendFeedback(messageId: response.message_id, feedback: "NEGATIVE", feedbackMessage: message, for: game) { let successAlert = UIAlertController( - title: "Feedback Received", - message: "Thank you for helping Lu learn and grow. Your feedback is greatly appreciated!", + title: NSLocalizedString("Feedback Received", comment: ""), + message: NSLocalizedString("Thank you for helping Lu learn and grow. Your feedback is greatly appreciated!", comment: ""), preferredStyle: .alert ) - successAlert.addAction(UIAlertAction(title: "OK", style: .default)) + successAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default)) self?.present(successAlert, animated: true) } } else { self?.sendFeedback(messageId: response.message_id, feedback: "NEGATIVE", feedbackMessage: nil, for: game) { let successAlert = UIAlertController( - title: "Feedback Received", - message: "Thank you for your feedback. Lu will keep working to provide better responses.", + title: NSLocalizedString("Feedback Received", comment: ""), + message: NSLocalizedString("Thank you for your feedback. Lu will keep working to provide better responses.", comment: ""), preferredStyle: .alert ) - successAlert.addAction(UIAlertAction(title: "OK", style: .default)) + successAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default)) self?.present(successAlert, animated: true) } } } - let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) + let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel) inputAlert.addAction(sendAction) inputAlert.addAction(cancelAction) @@ -668,7 +663,7 @@ extension PauseViewController { self?.present(inputAlert, animated: true) } - let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) + let cancelAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: ""), style: .cancel) feedbackAlert.addAction(thumbsUpAction) feedbackAlert.addAction(thumbsDownAction) @@ -696,7 +691,7 @@ extension PauseViewController { // Show loading indicator let loadingAlert = UIAlertController( title: nil, - message: "Sharing feedback...", + message: NSLocalizedString("Sharing feedback...", comment: ""), preferredStyle: .alert ) @@ -737,12 +732,12 @@ extension PauseViewController { if error != nil { let errorAlert = UIAlertController( - title: "Feedback Error", - message: "Failed to send feedback. Please try again later.", + title: NSLocalizedString("Feedback Error", comment: ""), + message: NSLocalizedString("Failed to send feedback. Please try again later.", comment: ""), preferredStyle: .alert ) luLog(.error, "[feedbacks] Failed to send feedback to Lu API") - errorAlert.addAction(UIAlertAction(title: "OK", style: .default)) + errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default)) self?.present(errorAlert, animated: true) return } @@ -758,12 +753,12 @@ extension PauseViewController { } else { // Show error alert for non-200 status codes let errorAlert = UIAlertController( - title: "Lu can't help you right now", - message: "Something went wrong while sharing your feedback with Lu. Please try again later.", + title: NSLocalizedString("Lu can't help you right now", comment: ""), + message: NSLocalizedString("Something went wrong while sharing your feedback with Lu. Please try again later.", comment: ""), preferredStyle: .alert ) luLog(.error, "Error [feedbacks]: Failed to send feedback due to errors, status=\(httpResponse.statusCode)") - errorAlert.addAction(UIAlertAction(title: "OK", style: .default)) + errorAlert.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default)) self?.present(errorAlert, animated: true) } } @@ -774,12 +769,12 @@ extension PauseViewController { private func showError(_ message: String) { let alert = UIAlertController( - title: "Lu can't help you right now", + title: NSLocalizedString("Lu can't help you right now", comment: ""), message: message, preferredStyle: .alert ) - let okAction = UIAlertAction(title: "OK", style: .default) + let okAction = UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default) alert.addAction(okAction) self.present(alert, animated: true) @@ -787,12 +782,12 @@ extension PauseViewController { private func showUnsupportedGameMessage() { let alert = UIAlertController( - title: "Lu Can't Help You Yet", - message: "Sorry, but Lu doesn't support this game just yet. Don't worry—we're already working on getting it onboarded as soon as possible. Thank you so much for giving Lu a try!", + title: NSLocalizedString("Lu Can't Help You Yet", comment: ""), + message: NSLocalizedString("Sorry, but Lu doesn't support this game just yet. Don't worry—we're already working on getting it onboarded as soon as possible. Thank you so much for giving Lu a try!", comment: ""), preferredStyle: .alert ) - let okAction = UIAlertAction(title: "OK", style: .default) + let okAction = UIAlertAction(title: NSLocalizedString("OK", comment: ""), style: .default) alert.addAction(okAction) self.present(alert, animated: true) @@ -807,7 +802,8 @@ extension PauseViewController { let urlString = "\(APIConstants.supportBaseURL)?sha1=\(sha1)" guard let url = URL(string: urlString) else { luLog(.error, "Invalid URL for check-rom endpoint") - showError("Sorry, but Lu can't help you with this game right now. Don't worry—we're already working on getting it fixed as soon as possible. Thank you so much for giving Lu a try! Issue : Something went wrong while checking game knowledge") + let issue = NSLocalizedString("Something went wrong while checking game knowledge", comment: "") + showError(String(format: NSLocalizedString("Sorry, but Lu can't help you with this game right now. Don't worry—we're already working on getting it fixed as soon as possible. Thank you so much for giving Lu a try! Issue : %@", comment: ""), issue)) completion(false) return } @@ -825,24 +821,29 @@ extension PauseViewController { guard let self = self else { return } if let error = error as? URLError { - let errorMessage: String + let logErrorMessage: String + let userErrorMessage: String switch error.code { case .timedOut: - errorMessage = "Connection timed out. Please check your internet connection and try again." + logErrorMessage = "Connection timed out. Please check your internet connection and try again." + userErrorMessage = NSLocalizedString("Connection timed out. Please check your internet connection and try again.", comment: "") case .notConnectedToInternet: - errorMessage = "No internet connection. Please check your connection and try again." + logErrorMessage = "No internet connection. Please check your connection and try again." + userErrorMessage = NSLocalizedString("No internet connection. Please check your connection and try again.", comment: "") default: - errorMessage = "Unable to connect to Lu. Please try again later." + logErrorMessage = "Unable to connect to Lu. Please try again later." + userErrorMessage = NSLocalizedString("Unable to connect to Lu. Please try again later.", comment: "") } - luLog(.error,"check-rom error: \(errorMessage) - \(error.localizedDescription)") - self.showError("Sorry, but Lu can't help you with this game right now. Don't worry—we're already working on getting it fixed as soon as possible. Thank you so much for giving Lu a try! Issue : \(errorMessage)") + luLog(.error,"check-rom error: \(logErrorMessage) - \(error.localizedDescription)") + self.showError(String(format: NSLocalizedString("Sorry, but Lu can't help you with this game right now. Don't worry—we're already working on getting it fixed as soon as possible. Thank you so much for giving Lu a try! Issue : %@", comment: ""), userErrorMessage)) completion(false) return } guard let httpResponse = response as? HTTPURLResponse else { - self.showError("Sorry, but Lu can't help you with this game right now. Don't worry—we're already working on getting it fixed as soon as possible. Thank you so much for giving Lu a try! Issue : Received an invalid response. Please try again.") + let issue = NSLocalizedString("Received an invalid response. Please try again.", comment: "") + self.showError(String(format: NSLocalizedString("Sorry, but Lu can't help you with this game right now. Don't worry—we're already working on getting it fixed as soon as possible. Thank you so much for giving Lu a try! Issue : %@", comment: ""), issue)) luLog(.error,"check-rom error: invalid response \(response?.description ?? "nil")") completion(false) return @@ -866,7 +867,7 @@ extension PauseViewController { completion(true) } catch { luLog(.error, "check-rom decode error: \(error.localizedDescription)") - self.showError("Failed to process game support information") + self.showError(NSLocalizedString("Failed to process game support information", comment: "")) completion(false) } } @@ -876,12 +877,12 @@ extension PauseViewController { completion(false) case 500...599: luLog(.error, "check-rom server error: Status \(httpResponse.statusCode)") - self.showError("Lu is temporarily unavailable. Please try again later.") + self.showError(NSLocalizedString("Lu is temporarily unavailable. Please try again later.", comment: "")) completion(false) default: luLog(.error, "check-rom unexpected error, status: \(httpResponse.statusCode)") - self.showError("Something unexpected happened. Please try again.") + self.showError(NSLocalizedString("Something unexpected happened. Please try again.", comment: "")) completion(false) } } diff --git a/Delta/Launch/WhatsNewCell.swift b/Delta/Launch/WhatsNewCell.swift index e45d57d3..7e6f802a 100644 --- a/Delta/Launch/WhatsNewCell.swift +++ b/Delta/Launch/WhatsNewCell.swift @@ -40,8 +40,8 @@ extension WhatsNewCollectionViewCell { func configure(with feature: WhatsNewViewController.NewFeature) { - self.nameLabel.text = feature.name - self.captionLabel.text = feature.caption + self.nameLabel.text = feature.localizedName + self.captionLabel.text = feature.localizedCaption self.imageView.image = feature.image if feature.isPatronExclusive diff --git a/Delta/Launch/WhatsNewViewController.swift b/Delta/Launch/WhatsNewViewController.swift index a80c4726..f01bb419 100644 --- a/Delta/Launch/WhatsNewViewController.swift +++ b/Delta/Launch/WhatsNewViewController.swift @@ -34,6 +34,14 @@ extension WhatsNewViewController var fallbackIcon: String? var isPatronExclusive: Bool + + var localizedName: String { + Bundle.main.localizedString(forKey: self.name, value: self.name, table: nil) + } + + var localizedCaption: String { + Bundle.main.localizedString(forKey: self.caption, value: self.caption, table: nil) + } var image: UIImage? { if let image = UIImage(systemName: self.icon) diff --git a/Delta/RetroAchievements/AchievementGameBanner.swift b/Delta/RetroAchievements/AchievementGameBanner.swift index 1bfb2959..6cfd3f13 100644 --- a/Delta/RetroAchievements/AchievementGameBanner.swift +++ b/Delta/RetroAchievements/AchievementGameBanner.swift @@ -12,6 +12,10 @@ import SwiftUI struct AchievementGameBanner: View { let game: AchievementsManager.Game + + private var pointUnit: String { + game.currentPoints == 1 ? String(localized: "pt") : String(localized: "pts") + } private var bannerContent: some View { @@ -36,7 +40,7 @@ struct AchievementGameBanner: View } } - Text("\(game.currentPoints.formatted()) \(game.currentPoints == 1 ? "pt" : "pts")") + Text("\(game.currentPoints.formatted()) \(pointUnit)") .padding(.vertical, 2) .padding(.horizontal, 6) .background(Color(uiColor: .deltaLightPurple).opacity(0.3), in: .capsule) diff --git a/Delta/RetroAchievements/AchievementNotification.swift b/Delta/RetroAchievements/AchievementNotification.swift index b4758e95..238af0f4 100644 --- a/Delta/RetroAchievements/AchievementNotification.swift +++ b/Delta/RetroAchievements/AchievementNotification.swift @@ -19,6 +19,10 @@ struct AchievementNotification: View @Environment(AchievementToastView.self) private var hostingView + private var pointUnit: String { + achievement.points == 1 ? String(localized: "pt") : String(localized: "pts") + } + var body: some View { AchievementToast(glassShape: .rect(cornerRadius: 26)) { Button { @@ -44,7 +48,7 @@ struct AchievementNotification: View if isExpanded { Spacer() - Text("\(achievement.points) \(achievement.points == 1 ? "pt" : "pts")") + Text("\(achievement.points) \(pointUnit)") .font(.caption) .padding(.vertical, 2) .padding(.horizontal, 5) diff --git a/Delta/Settings/Controllers/ControllersSettingsViewController.swift b/Delta/Settings/Controllers/ControllersSettingsViewController.swift index daace81e..eb2c0fb7 100644 --- a/Delta/Settings/Controllers/ControllersSettingsViewController.swift +++ b/Delta/Settings/Controllers/ControllersSettingsViewController.swift @@ -49,7 +49,7 @@ class ControllersSettingsViewController: UITableViewController { var playerIndex: Int! { didSet { - self.title = NSLocalizedString("Player \(self.playerIndex + 1)", comment: "") + self.title = String(format: NSLocalizedString("Player %d", comment: ""), self.playerIndex + 1) } } diff --git a/Delta/Settings/Controllers/ControlsEditorView.swift b/Delta/Settings/Controllers/ControlsEditorView.swift index c45b1a46..b2b0f4a9 100644 --- a/Delta/Settings/Controllers/ControlsEditorView.swift +++ b/Delta/Settings/Controllers/ControlsEditorView.swift @@ -284,7 +284,7 @@ private struct InputMappingRow: View } label: { Label(controllerInput.localizedDisplayName, systemImage: controllerInput.sfSymbolName) } currentValueLabel: { - Text(mappedInput.wrappedValue?.localizedDisplayName ?? String(localized: defaultInput == nil ? "Remove" : "Default")) + Text(mappedInput.wrappedValue?.localizedDisplayName ?? (defaultInput == nil ? String(localized: "Remove") : String(localized: "Default"))) } } else @@ -302,8 +302,16 @@ private struct InputMappingRow: View @ViewBuilder var pickerOptions: some View { - Text(defaultInput == nil ? "Remove" : "Default") - .tag(AnyInput?.none) + if defaultInput == nil + { + Text("Remove") + .tag(AnyInput?.none) + } + else + { + Text("Default") + .tag(AnyInput?.none) + } Section { ForEach(mappableInputs, id: \.self) { input in diff --git a/Delta/Settings/SettingsView.swift b/Delta/Settings/SettingsView.swift index 5193182b..96323857 100644 --- a/Delta/Settings/SettingsView.swift +++ b/Delta/Settings/SettingsView.swift @@ -13,7 +13,7 @@ import Harmony private struct SettingsBadge: View { - let text: String + let text: LocalizedStringKey var color: Color = .accentColor var body: some View { diff --git a/Delta/Settings/SettingsViewController.swift b/Delta/Settings/SettingsViewController.swift index d02ca7d3..2c58f46a 100644 --- a/Delta/Settings/SettingsViewController.swift +++ b/Delta/Settings/SettingsViewController.swift @@ -162,14 +162,14 @@ class SettingsViewController: UITableViewController if let version = Bundle.main.object(forInfoDictionaryKey: "DLTAVersion") as? String { - self.versionLabel.text = NSLocalizedString(String(format: "Delta %@", version), comment: "Delta Version") + self.versionLabel.text = String(format: NSLocalizedString("Delta %@", comment: "Delta Version"), version) } else if let version = Bundle.main.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String { #if LITE - self.versionLabel.text = NSLocalizedString(String(format: "Delta Lite %@", version), comment: "Delta Version") + self.versionLabel.text = String(format: NSLocalizedString("Delta Lite %@", comment: "Delta Version"), version) #else - self.versionLabel.text = NSLocalizedString(String(format: "Delta %@", version), comment: "Delta Version") + self.versionLabel.text = String(format: NSLocalizedString("Delta %@", comment: "Delta Version"), version) #endif } else diff --git a/Delta/ko.lproj/Localizable.strings b/Delta/ko.lproj/Localizable.strings index 488e0e1d..61aecad4 100644 --- a/Delta/ko.lproj/Localizable.strings +++ b/Delta/ko.lproj/Localizable.strings @@ -1,3 +1,6 @@ +"$%@/month" = "월 $%@"; +"%@ %@" = "%@ %@"; +"%@ (^[%lld %@](inflect: true))" = "%@ (^[%lld %@](inflect: true))"; "%@ is %@, but expected size is %@." = "%@의 크기는 %@이지만, 예상 크기는 %@입니다."; "%@ is %@, but expected size is between %@ and %@." = "%@의 크기는 %@이지만, 예상 크기는 %@에서 %@ 사이입니다."; "%@ is %@, but expected sizes are:" = "%@의 크기는 %@이지만, 예상 크기는 다음 중 하나입니다:"; @@ -5,7 +8,14 @@ "%@‘s checksum does not match the expected checksum.\n\nChecksum:\n%@\n\nExpected:\n%@" = "%@의 체크섬이 예상 체크섬과 일치하지 않습니다.\n\n체크섬:\n%@\n\n예상값:\n%@"; "%@’s size could not be determined." = "%@의 크기를 확인할 수 없습니다."; "%d Selected" = "%d개 선택됨"; +"%lld" = "%lld"; +"%lld %@" = "%lld %@"; +"%lld Connected" = "%lld대 연결됨"; +"%lld conflicts" = "%lld건의 충돌"; +"%lld%%" = "%lld%%"; +"(Conversation will be remembered for this game)" = "이 게임에서 나눈 대화를 기억합니다"; "-" = "-"; +"/%@" = "/%@"; "0 Selected" = "0개 선택됨"; "0.9.5" = "0.9.5"; "1 Selected" = "1개 선택됨"; @@ -27,38 +37,64 @@ "A cheat already exists with this code. Please type in a different code and try again." = "같은 코드의 치트가 이미 있습니다. 다른 코드를 입력한 후 다시 시도해 주세요."; "A cheat already exists with this name." = "같은 이름의 치트가 이미 있습니다."; "A cheat already exists with this name. Please rename this cheat and try again." = "같은 이름의 치트가 이미 있습니다. 치트 이름을 변경한 후 다시 시도해 주세요."; +"Account" = "계정"; "Active Multiplayer Game" = "진행 중인 멀티플레이 게임"; +"Add Key" = "키 추가"; +"Additional Feedback" = "추가 피드백"; +"Adjusts the transparency of on-screen controller skins, if supported by the skin." = "스킨이 지원하는 경우 화면 컨트롤러 스킨의 투명도를 조절합니다."; +"Advanced" = "고급"; "AirPlay" = "AirPlay"; "AirPlay / External Displays" = "AirPlay / 외부 디스플레이"; +"AirPlay Skins" = "AirPlay 스킨"; "All Time" = "전체 기간"; "All associated data, such as saves, save states, and cheat codes, will also be deleted." = "세이브 파일, 세이브 스테이트, 치트 코드 등 관련 데이터도 모두 삭제됩니다."; "All benefits from Early Adopter and Community Member tiers" = "Early Adopter 및 Community Member 티어의 모든 혜택"; "All benefits from Early Adopter tier" = "Early Adopter 티어의 모든 혜택"; +"All subscriptions are billed monthly.\n" = "모든 구독은 매월 결제됩니다.\n"; +"Allow Lu to analyze gameplay data (e.g., save states, active cheats, playtime) for more personalized and accurate responses. Your personal information is never shared." = "Lu가 게임 플레이 데이터(예: 세이브 스테이트, 활성화된 치트, 플레이 시간)를 분석하여 더 개인화되고 정확한 답변을 제공하도록 허용합니다. 개인 정보는 절대 공유되지 않습니다."; +"Allow Unrestricted Speeds" = "무제한 속도 허용"; +"Allow choosing speeds that exceed the maximum supported speed of a system.\n\nThis can be used to test the performance of new iOS devices." = "시스템의 최대 지원 속도를 초과하는 속도도 선택할 수 있습니다.\n\n새 iOS 기기의 성능을 테스트할 때 사용할 수 있습니다."; +"Allow other apps to fetch your game library via the “delta://gameInfo?scheme=” URL request. Delta responds by opening “://delta?games=”, where the payload is a base64url-encoded JSON array of your games." = "다른 앱이 “delta://gameInfo?scheme=” URL 요청을 통해 게임 라이브러리를 가져오도록 허용합니다. Delta는 “://delta?games=”을 열어 응답하며, 페이로드는 게임의 base64url 인코딩 JSON 배열입니다."; +"An all-new look designed for iOS 26." = "iOS 26에 맞춰 완전히 새롭게 디자인된 모습입니다."; "An error occured. Please make sure you typed the cheat code in correctly and try again." = "오류가 발생했습니다. 치트 코드를 올바르게 입력했는지 확인한 후 다시 시도해 주세요."; "An unknown error occurred." = "알 수 없는 오류가 발생했습니다."; "Analog Stick Down" = "아날로그 스틱 아래"; "Analog Stick Left" = "아날로그 스틱 왼쪽"; "Analog Stick Right" = "아날로그 스틱 오른쪽"; "Analog Stick Up" = "아날로그 스틱 위"; +"Any accounts or purchases made outside of Patreon will be managed by the company “Apple, Inc.”. Your Patreon account, stored payment method, and related features, such as subscription management and refund requests, will not be available. Patreon can't verify any pricing or promotions offered by the company." = "Patreon 외부에서 만든 계정이나 구매는 “Apple, Inc.”에서 관리합니다. Patreon 계정, 저장된 결제 수단, 구독 관리 및 환불 요청과 같은 관련 기능은 사용할 수 없습니다. Patreon은 해당 회사에서 제공하는 가격이나 프로모션을 확인할 수 없습니다."; +"App Icon" = "앱 아이콘"; +"Are you sure you want to change WFC servers?" = "WFC 서버를 변경하시겠습니까?"; "Are you sure you want to change sync services?" = "동기화 서비스를 변경하시겠습니까?"; "Are you sure you want to delete %d save states? This cannot be undone." = "%d개의 세이브 스테이트를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."; "Are you sure you want to delete this game?" = "이 게임을 삭제하시겠습니까?"; "Are you sure you want to delete this save state? This cannot be undone." = "이 세이브 스테이트를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."; +"Are you sure you want to reset all inputs?" = "모든 입력을 재설정하시겠습니까?"; +"Are you sure you want to reset your online settings?" = "온라인 설정을 재설정하시겠습니까?"; "Are you sure you want to sign out?" = "로그아웃하시겠습니까?"; "Are you sure you want to unlink your Patreon account?" = "Patreon 계정 연결을 해제하시겠습니까?"; +"Are you sure you'd like to sign out?" = "로그아웃하시겠습니까?"; "Arisotura" = "Arisotura"; "Arrows" = "화살표"; "Ask" = "질문하기"; "Ask Lu" = "Lu에게 질문하기"; +"Ask Lu about %@" = "%@에 대해 Lu에게 질문하기"; +"Ask Lu questions about your games to receive helpful tips, strategies, and interesting facts tailored to the games you're playing." = "Lu에게 게임에 관해 질문하고 플레이 중인 게임에 맞춘 유용한 팁, 전략, 흥미로운 정보를 받아보세요."; "Ask another" = "다른 질문하기"; +"Audio" = "오디오"; "Auto Save" = "자동 저장"; +"Automatically pause games when they are not the active window." = "게임 윈도우가 활성 상태가 아닐 때 자동으로 게임을 일시 정지합니다."; "Autorotation Disabled" = "자동 회전 꺼짐"; "B" = "B"; "B Button" = "B 버튼"; "Back to game" = "게임으로 돌아가기"; +"Become a Patron" = "Patreon 후원자 되기"; "Blue" = "파란색"; "Bluesky" = "Bluesky"; +"Bottom" = "하단"; "Brown" = "갈색"; +"Button Feedback" = "버튼 피드백"; +"Button Placement" = "버튼 위치"; "Buttons" = "버튼"; "C" = "C"; "C-Down" = "C-아래"; @@ -72,44 +108,74 @@ "Change" = "변경"; "Change App Icon" = "앱 아이콘 변경"; "Change Artwork" = "아트워크 변경"; +"Change Controller Skin" = "컨트롤러 스킨 변경"; "Change Email" = "이메일 변경"; "Change Icon" = "아이콘 변경"; "Change Name" = "이름 변경"; "Change Preview Save State?" = "미리보기 세이브 스테이트를 변경하시겠습니까?"; +"Change Server" = "서버 변경"; "Change Sync Service" = "동기화 서비스 변경"; +"Change how long toasts should be shown." = "토스트 알림이 표시되는 시간을 변경합니다."; "Change icon" = "아이콘 변경"; "Cheat" = "치트"; "Cheat Codes" = "치트 코드"; +"Cheat Not Found" = "치트를 찾을 수 없음"; "Cheats" = "치트"; "Check back here after adding games to Delta to see their sync status." = "Delta에 게임을 추가한 후 여기에서 동기화 상태를 확인하세요."; +"Checking game..." = "게임 확인 중..."; "Choose Game" = "게임 선택"; +"Choose Patron Tier" = "Patreon 등급 선택"; "Choose Server" = "서버 선택"; "Choose WFC Server" = "WFC 서버 선택"; +"Choose a controller skin that should always be used for this game." = "이 게임에서 항상 사용할 컨트롤러 스킨을 선택하세요."; +"Choose the 3rd-party Nintendo WFC server Delta should use for online play in Nintendo DS games." = "Delta가 Nintendo DS 게임의 온라인 플레이에 사용할 타사 Nintendo WFC 서버를 선택하세요."; +"Choose where the Resume and Home buttons appear in the pause menu." = "일시 정지 메뉴에서 계속하기 및 홈 버튼을 표시할 위치를 선택하세요."; "Classic" = "클래식"; "Clipboard" = "클립보드"; "Close" = "닫기"; "Cloud" = "클라우드"; "Code will be formatted automatically as you type." = "입력하면 코드 형식이 자동으로 지정됩니다."; +"Color Palette" = "색상 팔레트"; +"Colors" = "색상"; "Command" = "Command"; "Community Member" = "Community Member"; "Compatible" = "호환됨"; "Confirm" = "확인"; +"Connect a RetroAchievements account to unlock achievements in games." = "RetroAchievements 계정을 연결해 게임에서 도전 과제를 달성하세요."; "Connecting to Nintendo WFC…" = "Nintendo WFC에 연결 중…"; +"Connection timed out. Please check your internet connection and try again." = "연결 시간이 초과되었습니다. 인터넷 연결을 확인한 후 다시 시도해 주세요."; +"Contact Us" = "문의하기"; +"Context Menu Previews" = "컨텍스트 메뉴 미리보기"; +"Continue" = "계속"; "Contributors" = "기여자"; "Control" = "Control"; +"Control Stick Feedback" = "컨트롤 스틱 피드백"; "Controller Skin" = "컨트롤러 스킨"; "Controller Skins" = "컨트롤러 스킨"; +"Controllers" = "컨트롤러"; +"Controls" = "조작"; "Copy Deep Link" = "딥 링크 복사"; "Copy to Clipboard" = "클립보드에 복사"; +"Core Info" = "코어 정보"; +"Cores" = "코어"; "Could Not Share Game" = "게임을 공유할 수 없음"; "Could not add screenshot to album." = "스크린샷을 앨범에 추가할 수 없습니다."; "Could not import %@." = "%@ 파일을 가져올 수 없습니다."; "Could not import “%@”." = "“%@” 파일을 가져올 수 없습니다."; "Create a new save state by pressing the + button in the top right." = "오른쪽 상단의 + 버튼을 눌러 새 세이브 스테이트를 만드세요."; "Create a new save state by pressing the Save State option in the pause menu." = "일시 정지 메뉴에서 세이브 스테이트 옵션을 눌러 새 세이브 스테이트를 만드세요."; +"Credits" = "크레딧"; "Ctrl" = "Ctrl"; +"Custom" = "사용자 설정"; +"Custom DNS" = "사용자 지정 DNS"; +"Customize Controls" = "컨트롤 사용자화"; "Customize Controls…" = "컨트롤 사용자화…"; +"Customize the appearance of each system." = "각 시스템의 모양을 꾸밀 수 있습니다."; +"Customize the appearance of each system. [Learn more…](https://faq.deltaemulator.com/using-delta/controller-skins)" = "각 시스템의 모양을 꾸밀 수 있습니다. [더 알아보기…](https://faq.deltaemulator.com/using-delta/controller-skins)"; +"Customize the appearance of games when AirPlaying to your TV." = "TV로 AirPlay할 때 게임 화면을 원하는 모습으로 꾸밀 수 있습니다."; +"Customize the appearance of your games when AirPlaying to your TV." = "TV로 AirPlay할 때 게임 화면을 원하는 모습으로 꾸며보세요."; "DS" = "DS"; +"DS AirPlay" = "DS AirPlay"; "DSi" = "DSi"; "Dark" = "다크"; "Dark Blue" = "진한 파란색"; @@ -130,19 +196,27 @@ "Delta" = "Delta"; "Delta %@" = "Delta %@"; "Delta Lite" = "Delta Lite"; +"Delta Lite %@" = "Delta Lite %@"; +"Delta Screenshots Album" = "Delta Screenshots 앨범"; +"Delta Sync" = "Delta Sync"; "Delta can only play one copy of a game at a time." = "Delta에서는 같은 게임을 한 번에 하나만 실행할 수 있습니다."; "Delta can only play one game per system at a time.\n\nPlease quit the other game%@, or choose another game for a different system." = "Delta에서는 시스템별로 한 번에 하나의 게임만 실행할 수 있습니다.\n\n다른 게임%@을 종료하거나 다른 시스템의 게임을 선택해 주세요."; "Delta does not have permission to write to your Photos library." = "Delta가 사진 보관함에 저장할 권한이 없습니다."; "Delta does not support this cheat type." = "Delta는 이 치트 유형을 지원하지 않습니다."; "Delta requires certain files to play Nintendo DS games. Please import them to launch this game." = "Delta에서 Nintendo DS 게임을 실행하려면 특정 파일이 필요합니다. 이 게임을 실행하려면 해당 파일을 가져오세요."; +"Delta requires these BIOS files to emulate certain Nintendo %@ features." = "Delta에서 Nintendo %@의 특정 기능을 에뮬레이션하려면 이 BIOS 파일이 필요합니다."; "Delta was unable to import controller skins. Please try again later." = "Delta에서 컨트롤러 스킨을 가져오지 못했습니다. 나중에 다시 시도해 주세요."; "Delta was unable to import games. Please try again later." = "Delta에서 게임을 가져오지 못했습니다. 나중에 다시 시도해 주세요."; "Delta will import the games and controller skins copied over via iTunes." = "iTunes로 복사된 게임과 컨트롤러 스킨을 Delta로 가져옵니다."; "Designed for iPhone" = "iPhone용으로 디자인됨"; "Disable" = "비활성화"; "Disable Syncing?" = "동기화를 비활성화하시겠습니까?"; +"Disables features that could provide an unfair advantage, such as cheats and save states." = "치트와 세이브 스테이트처럼 불공정한 이점을 줄 수 있는 기능을 비활성화합니다."; "Disconnected from Nintendo WFC" = "Nintendo WFC 연결 끊김"; "Discord Invite Link" = "Discord 초대 링크"; +"Display" = "화면"; +"Display Full Screen" = "전체 화면으로 표시"; +"Done" = "완료"; "Down" = "아래"; "Down Arrow" = "아래쪽 화살표"; "Down+A" = "아래+A"; @@ -151,14 +225,27 @@ "Downloading Save File" = "세이브 파일 다운로드 중"; "Dropbox" = "Dropbox"; "Dropbox has flagged this game as copyrighted material, so it cannot be downloaded. Please re-import this game to continue syncing." = "Dropbox에서 이 게임을 저작권 보호 자료로 표시하여 다운로드할 수 없습니다. 동기화를 계속하려면 이 게임을 다시 가져오세요."; +"Dual Slot" = "듀얼 슬롯"; "Duplicate Code" = "중복 코드"; "Duplicate Name" = "중복 이름"; +"Duration" = "지속 시간"; +"Duration: %.1fs" = "지속 시간: %.1f초"; +"Dynamically reverse the order of screen inputFrames in controller skins. Can be used to “flip” between DS screens." = "컨트롤러 스킨의 화면 inputFrames 순서를 동적으로 반전합니다. DS 화면을 서로 “뒤집어” 전환할 때 사용할 수 있습니다."; "Early Adopter" = "Early Adopter"; "Early access to new features" = "새 기능 조기 이용"; +"Edit" = "편집"; "Edit Email" = "이메일 편집"; "Edit Name" = "이름 편집"; +"Emulate inserting a GBA game into the Nintendo DS dual slot." = "Nintendo DS 듀얼 슬롯에 GBA 게임을 삽입한 상태를 에뮬레이션합니다."; +"Emulation" = "에뮬레이션"; +"Enable features useful for mapping controller skins." = "컨트롤러 스킨 매핑에 유용한 기능을 활성화합니다."; +"Enable support for Epilogue Operator devices to play games directly from cartridges. Requires an app restart to take effect." = "Epilogue Operator 기기를 지원하여 카트리지에서 직접 게임을 플레이할 수 있게 합니다. 적용하려면 앱을 다시 시작해야 합니다."; +"Enable this to show What’s New on next launch." = "다음 실행 시 새로운 기능 화면을 표시합니다."; +"Enable to show the Status Bar during gameplay." = "게임 플레이 중 상태 막대를 표시합니다."; "Enabling syncing again later may result in conflicts that must be resolved manually." = "나중에 동기화를 다시 활성화하면 직접 해결해야 하는 충돌이 발생할 수 있습니다."; +"Enter your feedback" = "피드백을 입력하세요"; "Enter your question here" = "여기에 질문을 입력하세요"; +"Epilogue Operator" = "Epilogue Operator"; "Error" = "오류"; "Error %@" = "오류 %@"; "Error %@. %@" = "오류 %@. %@"; @@ -167,9 +254,11 @@ "Error Loading Patrons" = "후원자 불러오기 오류"; "Escape" = "Escape"; "Exclusive icons from our favorite indie designers" = "선호하는 인디 디자이너가 제작한 전용 아이콘"; +"Experimental" = "실험적 기능"; "Experimental Features" = "실험적 기능"; "Experimental Features are still in development and will be available for everyone when finished." = "실험적 기능은 아직 개발 중이며, 완성되면 모든 사용자가 이용할 수 있습니다."; "Export" = "내보내기"; +"Export Error Log" = "오류 로그 내보내기"; "Export Save File" = "세이브 파일 내보내기"; "Failed to Disable Syncing" = "동기화 비활성화 실패"; "Failed to Enable Syncing" = "동기화 활성화 실패"; @@ -182,22 +271,34 @@ "Failed to Restore Version" = "버전 복원 실패"; "Failed to Sign In" = "로그인 실패"; "Failed to Sign Out" = "로그아웃 실패"; +"Failed to create request" = "요청을 만들 수 없습니다"; +"Failed to prepare your question" = "질문을 준비할 수 없습니다"; +"Failed to process game support information" = "게임 지원 정보를 처리할 수 없습니다"; "Failed to retrieve RetroAchievements game info." = "RetroAchievements 게임 정보를 가져오지 못했습니다."; +"Failed to send feedback. Please try again later." = "피드백을 전송할 수 없습니다. 나중에 다시 시도해 주세요."; +"Failed to understand Lu's response. Please try again." = "Lu의 답변을 이해할 수 없습니다. 다시 시도해 주세요."; "Fast Forward" = "빨리 감기"; "Fast Forward Disabled" = "빨리 감기 꺼짐"; "Fast Forward Enabled" = "빨리 감기 켜짐"; +"Fast Forward Toggled" = "빨리 감기 전환"; "Fault" = "심각한 오류"; "Favorite" = "즐겨찾기"; "Favorites" = "즐겨찾기"; +"Feedback" = "피드백"; +"Feedback Error" = "피드백 오류"; +"Feedback Received" = "피드백이 접수되었습니다"; "Files" = "파일"; "Filter" = "필터"; +"For more help, check out our [Troubleshooting Guide](https://faq.deltaemulator.com/using-delta/online-multiplayer)" = "도움이 더 필요하면 [문제 해결 가이드](https://faq.deltaemulator.com/using-delta/online-multiplayer)를 확인하세요."; "Friend Zone" = "Friend Zone"; "Full Name" = "성명"; "Full Screen" = "전체 화면"; "GBA" = "GBA"; +"GBA Game" = "GBA 게임"; "GBC" = "GBC"; "Gambatte" = "Gambatte"; "Game" = "게임"; +"Game Actions" = "게임 동작"; "Game Already Running" = "게임이 이미 실행 중"; "Game Boy Advance" = "Game Boy Advance"; "Game Boy Color" = "Game Boy Color"; @@ -217,20 +318,31 @@ "General" = "일반"; "Genesis (Beta)" = "Genesis (베타)"; "Genesis Plus GX" = "Genesis Plus GX"; +"Gestures" = "제스처"; +"Get early access to new features and unlock exclusive app icons." = "새 기능을 미리 사용하고 전용 앱 아이콘을 잠금 해제하세요."; "GitHub" = "GitHub"; "Glass" = "글래스"; "Google Drive" = "Google Drive"; "Got it!" = "알겠습니다!"; +"Graphics" = "그래픽"; "Gray" = "회색"; "Green" = "초록색"; "Handoff Failed" = "Handoff 실패"; +"Haptics" = "햅틱"; +"Hardcore Mode" = "하드코어 모드"; "Hey ,\n\nYou’re the best. Your account was linked successfully, so you now have access to Patreon-exclusive app icons and Experimental Features. You can find them all in Settings.\n\nThanks for all of your support. Enjoy!\nRiley & Shane" = "Hey ,\n\n정말 최고예요. 계정이 성공적으로 연결되어 이제 Patreon 전용 앱 아이콘과 실험적 기능을 이용할 수 있습니다. 설정에서 모두 확인할 수 있습니다.\n\n항상 응원해 주셔서 감사합니다. 즐겁게 사용하세요!\nRiley & Shane"; "Hey y'all,\n\nYou can support future development of Delta by donating to us on Patreon. In return, you'll unlock Patreon-exclusive app icons and receive early access to new features.\n\nThanks for all your support 💜\nRiley & Shane" = "안녕하세요, 여러분,\n\nPatreon에서 후원하여 Delta의 향후 개발을 지원할 수 있습니다. 후원하면 Patreon 전용 앱 아이콘을 잠금 해제하고 새로운 기능을 미리 이용할 수 있습니다.\n\n항상 응원해 주셔서 감사합니다 💜\nRiley & Shane"; "Hold Buttons" = "버튼 고정"; "Home Screen" = "홈 화면"; "Home Screen (DSi)" = "홈 화면 (DSi)"; +"Home Screen Shortcuts" = "홈 화면 단축어"; +"How can Lu improve its response to your question?\n\n\"%@\"" = "질문에 대한 Lu의 답변을 어떻게 개선하면 좋을지 알려 주세요:\n\n“%@”"; +"How to Activate" = "활성화 방법"; "Icon Already Selected" = "아이콘이 이미 선택됨"; +"Ignore Padding" = "여백 무시"; +"Ignore additional padding (“extended edges”) specified by the skin. Useful for verifying hit targets line up with controls." = "스킨에 지정된 추가 여백(“확장 가장자리”)을 무시합니다. 입력 영역이 조작 버튼과 정확히 맞는지 확인할 때 유용합니다."; "Import" = "가져오기"; +"Import BIOS Files" = "BIOS 파일 가져오기"; "Import Controller Skin" = "컨트롤러 스킨 가져오기"; "Import Files" = "파일 가져오기"; "Import Save File" = "세이브 파일 가져오기"; @@ -240,12 +352,14 @@ "Incompatible Save States" = "호환되지 않는 세이브 스테이트"; "Info" = "정보"; "Input Mappings" = "입력 매핑"; +"Insert GBA Game" = "GBA 게임 삽입"; "Invalid Code" = "잘못된 코드"; "Invalid Name" = "잘못된 이름"; "Invalid access token." = "액세스 토큰이 유효하지 않습니다."; "Invitation to patron-exclusive Discord" = "후원자 전용 Discord 초대"; "JIT Compilation Enabled" = "JIT 컴파일 활성화됨"; "Join for $3/month" = "월 $3로 가입하기"; +"Join our Patreon" = "Patreon 후원하기"; "L" = "L"; "L1" = "L1"; "L1 Button" = "L1 버튼"; @@ -254,20 +368,37 @@ "L3" = "L3"; "L3 Button" = "L3 버튼"; "Later" = "나중에"; +"Layout Screens Horizontally" = "화면을 가로로 배치"; +"Learn More" = "더 알아보기"; "Learn More…" = "더 알아보기…"; +"Learn more…" = "더 알아보기…"; "Left" = "왼쪽"; "Left Arrow" = "왼쪽 화살표"; "Left Thumbstick" = "왼쪽 스틱"; "Left+A" = "왼쪽+A"; "Left+B" = "왼쪽+B"; +"Let us know how Lu handled your question:\n\n\"%@\"" = "질문에 대한 Lu의 답변이 어땠는지 알려 주세요:\n\n“%@”"; "Letters" = "문자"; +"Library Export" = "라이브러리 내보내기"; "Light" = "라이트"; "Link Patreon account" = "Patreon 계정 연결"; +"Liquid Glass UI" = "Liquid Glass UI"; "Load State" = "세이브 스테이트 불러오기"; "Loaded Save State" = "세이브 스테이트를 불러왔습니다"; +"Loading Account…" = "계정 불러오는 중…"; "Lock" = "잠그기"; "Locked" = "잠김"; +"Log in with RetroAchievements to track your progress and achievements in this specific game." = "RetroAchievements에 로그인하여 이 게임의 진행 상황과 도전 과제를 추적하세요."; "Long-press a game to add it to your favorites." = "게임을 길게 눌러 즐겨찾기에 추가하세요."; +"Lu" = "Lu"; +"Lu Can't Help You Yet" = "아직은 Lu가 도와드릴 수 없습니다"; +"Lu can save your previous questions and responses to provide context-aware advice and follow-up suggestions for each game." = "Lu가 이전 질문과 답변을 저장하여 게임별 맥락에 맞는 조언과 후속 제안을 제공할 수 있습니다."; +"Lu can't help you right now" = "지금은 Lu가 도와드릴 수 없습니다"; +"Lu encountered an error. Please try again later." = "Lu에서 오류가 발생했습니다. 나중에 다시 시도해 주세요."; +"Lu is taking longer than usual to respond. Please try again." = "Lu의 답변이 평소보다 오래 걸리고 있습니다. 다시 시도해 주세요."; +"Lu is temporarily unavailable. Please try again later." = "Lu를 일시적으로 사용할 수 없습니다. 나중에 다시 시도해 주세요."; +"Lu is thinking..." = "Lu가 답변을 생각하고 있습니다..."; +"Lu learns from your questions and preferences to provide personalized advice. We do not collect personal information, but we do collect data to maintain and improve our experience. See our Privacy Statement and Terms of Service below for more information.\n\nhttps://www.lulabs.ai/legal\n\nIf you have any questions about Lu, feel free to ask us in our Discord Server!\n\nhttps://discord.gg/XvSysJpQrn" = "Lu는 질문과 선호도를 학습하여 개인화된 조언을 제공합니다. 개인 정보는 수집하지 않지만, 서비스 유지 및 개선을 위한 데이터는 수집합니다. 자세한 내용은 아래 개인정보 처리방침 및 이용 약관을 확인하세요.\n\nhttps://www.lulabs.ai/legal\n\nLu에 대해 궁금한 점이 있다면 Discord 서버에서 언제든지 문의해 주세요!\n\nhttps://discord.gg/XvSysJpQrn"; "Lu's Response" = "Lu의 답변"; "L🕹←" = "L🕹←"; "L🕹↑" = "L🕹↑"; @@ -281,19 +412,26 @@ "Mark as Incompatible" = "호환되지 않음으로 표시"; "Martin Freij" = "Martin Freij"; "Mastodon" = "Mastodon"; +"Maximum" = "최대"; "Maybe Later" = "나중에"; "Menu" = "메뉴"; +"Menu Button Gestures" = "메뉴 버튼 제스처"; +"Metal Renderer" = "Metal 렌더러"; +"Minor" = "기타"; "Misc." = "기타"; "Missing Required DS Files" = "필수 DS 파일 누락"; +"Mix with Other Audio" = "다른 오디오와 함께 재생"; "Mode" = "모드"; "Modern" = "모던"; "Modifiers" = "보조 키"; +"Multitasking" = "멀티태스킹"; "Mupen64Plus" = "Mupen64Plus"; "N64" = "N64"; "NES" = "NES"; "Name" = "이름"; "Name listed in Delta in “Special Thanks” section" = "Delta의 “특별히 감사드립니다…” 섹션에 이름 표시"; "Nestopia" = "Nestopia"; +"New Achievement" = "새 도전 과제"; "New Cheat Code" = "새 치트 코드"; "Nintendo" = "Nintendo"; "Nintendo 64" = "Nintendo 64"; @@ -307,16 +445,24 @@ "No Home Screen Shortcuts" = "홈 화면 단축어 없음"; "No Save States" = "세이브 스테이트 없음"; "No connected Patreon account." = "연결된 Patreon 계정이 없습니다."; +"No controllers connected." = "연결된 컨트롤러가 없습니다."; +"No internet connection. Please check your connection and try again." = "인터넷에 연결되어 있지 않습니다. 연결 상태를 확인한 후 다시 시도해 주세요."; "None" = "없음"; "Normal" = "정상"; "Notice" = "안내"; "Numbers" = "숫자"; "OK" = "확인"; +"Off" = "꺼짐"; +"On" = "켜짐"; "On Device" = "기기 내"; +"Online Multiplayer" = "온라인 멀티플레이"; +"Opacity" = "불투명도"; "Open" = "열기"; +"Open Games in New Window" = "새 윈도우에서 게임 열기"; "Open New Window" = "새 윈도우 열기"; "Open in New Window" = "새 윈도우에서 열기"; "Open in “Safari”?" = "“Safari”에서 여시겠습니까?"; +"OpenGL ES 3.0" = "OpenGL ES 3.0"; "Option" = "Option"; "Option A" = "옵션 A"; "Option B" = "옵션 B"; @@ -329,23 +475,42 @@ "Optional" = "선택 사항"; "Orange" = "주황색"; "Pale Yellow" = "연한 노란색"; +"Password" = "비밀번호"; "Past Month" = "지난 한 달"; "Patreon" = "Patreon"; "Patrons" = "후원자"; "Patrons - Button Pack" = "Patrons - Button Pack"; +"Pause Menu" = "일시 정지 메뉴"; +"Pause Other Audio" = "다른 오디오 일시 정지"; +"Pause While Inactive" = "비활성 상태일 때 일시 정지"; "Pause game to change orientation." = "방향을 변경하려면 게임을 일시 정지하세요."; "Photo Library" = "사진 보관함"; +"Play your favorite Genesis games with our gorgeous new controller skin." = "멋진 새 컨트롤러 스킨으로 좋아하는 Genesis 게임을 즐겨보세요."; +"Player %d" = "플레이어 %d"; +"Player %lld" = "플레이어 %lld"; "Please choose a different BIOS file." = "다른 BIOS 파일을 선택해 주세요."; "Please enter your email so we can send you an invitation to our Discord server." = "Discord 서버 초대장을 보내 드릴 수 있도록 이메일을 입력해 주세요."; "Please enter your full name so we can credit you on this page." = "이 페이지에 이름을 표시할 수 있도록 실명을 입력해 주세요."; "Please import the required files in Delta's settings to play DS games." = "DS 게임을 플레이하려면 Delta 설정에서 필수 파일을 가져오세요."; +"Please make sure the name is correct, or try searching for another cheat." = "이름이 올바른지 확인하거나 다른 치트를 검색해 보세요."; "Please make sure the name is correct, or try searching for another game." = "이름이 올바른지 확인하거나 다른 게임을 검색해 보세요."; "Please make sure you typed the cheat code in correctly and try again." = "치트 코드를 올바르게 입력했는지 확인한 후 다시 시도해 주세요."; "Please rename this cheat and try again." = "치트 이름을 변경한 후 다시 시도해 주세요."; "Please restart this game to apply your changes." = "변경 사항을 적용하려면 게임을 다시 시작해 주세요."; "Please wait until after this game's save file has been downloaded before playing to prevent losing save data." = "저장 데이터 유실을 방지하려면 이 게임의 세이브 파일 다운로드가 완료된 후 플레이해 주세요."; +"Popular" = "인기"; +"Preferred DS fast forward speed." = "DS에서 선호하는 빨리 감기 속도입니다."; +"Preferred GBA fast forward speed." = "GBA에서 선호하는 빨리 감기 속도입니다."; +"Preferred GBC fast forward speed." = "GBC에서 선호하는 빨리 감기 속도입니다."; +"Preferred Genesis fast forward speed." = "Genesis에서 선호하는 빨리 감기 속도입니다."; +"Preferred N64 fast forward speed." = "N64에서 선호하는 빨리 감기 속도입니다."; +"Preferred NES fast forward speed." = "NES에서 선호하는 빨리 감기 속도입니다."; +"Preferred SNES fast forward speed." = "SNES에서 선호하는 빨리 감기 속도입니다."; "Press Button" = "버튼을 누르세요"; "Press the Menu button when finished." = "완료되면 메뉴 버튼을 누르세요."; +"Preview games and save states when using context menus." = "컨텍스트 메뉴를 사용할 때 게임과 세이브 스테이트를 미리 봅니다."; +"Privacy Policy" = "개인정보 처리방침"; +"Q: %@" = "질문: %@"; "Quick Load" = "빠른 불러오기"; "Quick Save" = "빠른 저장"; "Quit Game" = "게임 종료"; @@ -356,19 +521,26 @@ "R2 Button" = "R2 버튼"; "R3" = "R3"; "R3 Button" = "R3 버튼"; +"Received an invalid response. Please try again." = "올바르지 않은 응답을 받았습니다. 다시 시도해 주세요."; "Recently Played" = "최근 플레이"; "Recently Played Games" = "최근 플레이한 게임"; "Red" = "빨간색"; +"Remember Conversations" = "대화 기억"; "Remove" = "제거"; "Remove as Preview Save State" = "미리보기 세이브 스테이트에서 제거"; "Rename" = "이름 변경"; "Rename Game" = "게임 이름 변경"; "Rename Save State" = "세이브 스테이트 이름 변경"; +"Repair Database" = "데이터베이스 복구"; +"Repair invalid relationships in Delta's game database on next app launch." = "다음 앱 실행 시 Delta 게임 데이터베이스의 잘못된 연결 관계를 복구합니다."; "Reset" = "재설정"; +"Reset All" = "모두 재설정"; "Reset Controller Skin to Default" = "컨트롤러 스킨을 기본값으로 재설정"; "Reset Controls to Defaults" = "컨트롤을 기본값으로 재설정"; +"Reset Online Settings" = "온라인 설정 재설정"; "Resolve" = "해결"; "Resolve Conflict" = "충돌 해결"; +"Respect Silent Mode" = "무음 모드 따르기"; "Restart" = "다시 시작"; "Restart Required" = "다시 시작 필요"; "Restore" = "복원"; @@ -377,12 +549,15 @@ "Restoring a remote version will cause any local changes to be lost." = "원격 버전을 복원하면 로컬 변경 사항이 모두 손실됩니다."; "Resume" = "계속하기"; "Resuming…" = "재개 중…"; +"RetroAchievements" = "RetroAchievements"; "RetroAchievements: Logged in as “%@”" = "RetroAchievements: “%@” 계정으로 로그인됨"; "Retry" = "다시 시도"; "Return" = "Return"; "Reverse" = "반전"; +"Reverse Controller Skin Screens" = "컨트롤러 스킨 화면 순서 반전"; "Reverse Screens" = "화면 순서 반전"; "Review Save States" = "세이브 스테이트 검토"; +"Review recent Save States to make sure they are associated with the correct game." = "최근 세이브 스테이트를 검토하여 올바른 게임과 연결되어 있는지 확인합니다."; "Richard Goedeken" = "Richard Goedeken"; "Right" = "오른쪽"; "Right Arrow" = "오른쪽 화살표"; @@ -394,8 +569,10 @@ "R🕹→" = "R🕹→"; "R🕹↓" = "R🕹↓"; "SNES" = "SNES"; +"Save" = "저장"; "Save State" = "세이브 스테이트"; "Save States" = "세이브 스테이트"; +"Save game screenshots to dedicated “Delta Screenshots” album." = "게임 스크린샷을 전용 “Delta Screenshots” 앨범에 저장합니다."; "Saved Save State" = "세이브 스테이트 저장됨"; "Saved screenshot to Photos" = "스크린샷을 사진 앱에 저장했습니다"; "Screenshot" = "스크린샷"; @@ -405,18 +582,41 @@ "Select" = "Select"; "Select Buttons to Hold Down" = "고정할 버튼 선택"; "Selecting a remote version will cause any local changes to be lost." = "원격 버전을 선택하면 로컬 변경 사항이 모두 손실됩니다."; +"Send" = "전송"; "Set as Preview Save State" = "미리보기 세이브 스테이트로 설정"; "Settings" = "설정"; "Share" = "공유"; +"Share Gameplay Data" = "게임 플레이 데이터 공유"; +"Share feedback" = "피드백 보내기"; +"Sharing feedback..." = "피드백 전송 중..."; "Shift" = "Shift"; "Shortcuts" = "단축어"; +"Show Hit Targets" = "입력 영역 표시"; +"Show Status Bar" = "상태 막대 표시"; +"Show Touches" = "터치 표시"; +"Show What’s New" = "새로운 기능 보기"; +"Show toast notifications as a confirmation for various actions, such as saving your game or loading a save state." = "게임 저장이나 세이브 스테이트 불러오기 같은 여러 동작의 완료를 토스트 알림으로 표시합니다."; +"Show toasts when loading a save state." = "세이브 스테이트를 불러올 때 토스트 알림을 표시합니다."; +"Show toasts when performing an in game save." = "게임 내 저장을 수행할 때 토스트 알림을 표시합니다."; +"Show toasts when saving a save state." = "세이브 스테이트를 저장할 때 토스트 알림을 표시합니다."; +"Show toasts when toggling fast forward." = "빨리 감기를 전환할 때 토스트 알림을 표시합니다."; +"Show visual overlays on controller skins to represent hit targets." = "컨트롤러 스킨 위에 입력 영역을 나타내는 오버레이를 표시합니다."; "Sign In" = "로그인"; "Sign Out" = "로그아웃"; +"Sign in" = "로그인"; "Signing in again later may result in conflicts that must be resolved manually." = "나중에 다시 로그인하면 수동으로 해결해야 하는 충돌이 발생할 수 있습니다."; +"Skin Debugging" = "컨트롤러 스킨 디버깅"; +"Skins" = "스킨"; "Snes9x" = "Snes9x"; "Snes9x Team" = "Snes9x Team"; +"Software Licenses" = "소프트웨어 라이선스"; "Some features will be disabled while playing online." = "온라인 플레이 중에는 일부 기능이 비활성화됩니다."; "Some save files may still be corrupted and require you to restore an older version from the Delta Sync settings.\n\nA text file listing all affected games has been saved to “On My Device/Delta/Backups/conflicts.txt” in the Files app, alongside backups of any conflicted save files." = "일부 세이브 파일은 여전히 손상되어 있을 수 있으며 Delta Sync 설정에서 이전 버전을 복원해야 합니다.\n\n영향을 받은 모든 게임 목록이 담긴 텍스트 파일은 충돌한 세이브 파일의 백업과 함께 파일 앱의 “나의 기기/Delta/Backups/conflicts.txt”에 저장되었습니다."; +"Something unexpected happened. Please try again." = "예상치 못한 문제가 발생했습니다. 다시 시도해 주세요."; +"Something went wrong while checking game knowledge" = "게임 정보를 확인하는 중 문제가 발생했습니다"; +"Something went wrong while sharing your feedback with Lu. Please try again later." = "Lu에 피드백을 전송하는 중 문제가 발생했습니다. 나중에 다시 시도해 주세요."; +"Sorry, but Lu can't help you with this game right now. Don't worry—we're already working on getting it fixed as soon as possible. Thank you so much for giving Lu a try! Issue : %@" = "죄송하지만 지금은 Lu가 이 게임을 도와드릴 수 없습니다. 최대한 빨리 문제를 해결하고 있습니다. Lu를 사용해 주셔서 감사합니다! 문제: %@"; +"Sorry, but Lu doesn't support this game just yet. Don't worry—we're already working on getting it onboarded as soon as possible. Thank you so much for giving Lu a try!" = "죄송하지만 Lu는 아직 이 게임을 지원하지 않습니다. 최대한 빨리 지원할 수 있도록 준비하고 있습니다. Lu를 사용해 주셔서 감사합니다!"; "Sort by…" = "정렬 기준…"; "SourceForge" = "SourceForge"; "Space" = "스페이스"; @@ -429,18 +629,25 @@ "Standard" = "표준"; "Start" = "Start"; "Super Nintendo" = "Super Nintendo"; +"Support" = "지원"; "Switching back later may result in conflicts that must be resolved manually." = "나중에 다시 전환하면 수동으로 해결해야 하는 충돌이 발생할 수 있습니다."; "Symbols" = "기호"; "Sync Complete" = "동기화 완료"; "Sync Failed" = "동기화 실패"; +"Sync Status" = "동기화 상태"; "Sync Successful" = "동기화 성공"; "Syncing" = "동기화"; "Syncing..." = "동기화 중..."; "System Already Running" = "시스템이 이미 실행 중"; "System is not yet supported." = "아직 지원되지 않는 시스템입니다."; +"Systems" = "시스템"; "Tab" = "Tab"; +"Terms of Use" = "이용 약관"; +"Thank You!" = "감사합니다!"; +"Thank you for helping Lu learn and grow. Your feedback is greatly appreciated!" = "Lu가 배우고 발전할 수 있도록 도와주셔서 감사합니다. 소중한 피드백에 진심으로 감사드립니다!"; "Thank you for joining our Patreon!" = "Patreon에 가입해 주셔서 감사합니다!"; "Thank you for supporting us! These icons will remain available even after your subscription ends." = "후원해 주셔서 감사합니다! 구독이 종료된 후에도 이 아이콘을 계속 사용할 수 있습니다."; +"Thank you for your feedback. Lu will keep working to provide better responses." = "피드백을 보내주셔서 감사합니다. Lu는 더 나은 답변을 제공하기 위해 계속 노력하겠습니다."; "Thanks For Supporting Us!" = "후원해 주셔서 감사합니다!"; "Thanks for Supporting Us!" = "후원해 주셔서 감사합니다!"; "The Patreon API rate limit has been exceeded." = "Patreon API 요청 한도를 초과했습니다."; @@ -463,11 +670,14 @@ "The local version will be uploaded and synced to your other devices." = "로컬 버전이 업로드되어 다른 기기와 동기화됩니다."; "The name of this cheat is invalid." = "치트 이름이 올바르지 않습니다."; "The “Delta Screenshots” album could not be found." = "“Delta Screenshots” 앨범을 찾을 수 없습니다."; +"There are no cheats for this game in Delta's CheatBase. Please try a different game." = "Delta의 CheatBase에 이 게임의 치트가 없습니다. 다른 게임을 선택해 보세요."; "There is no associated game with this cheat." = "이 치트와 연결된 게임이 없습니다."; "There is no chosen service for syncing." = "선택된 동기화 서비스가 없습니다."; "There is no product with the requested ID." = "요청한 ID의 제품이 없습니다."; "There were no errors during last sync." = "마지막 동기화 중 오류가 없었습니다."; +"These features have been added by contributors to the open-source Delta project on GitHub and are currently being tested.\n\nYou may encounter bugs when using these features." = "이 기능은 GitHub의 오픈 소스 Delta 프로젝트 기여자들이 추가했으며 현재 테스트 중입니다.\n\n이 기능을 사용할 때 버그가 발생할 수 있습니다."; "These icons are available as a thank you to all our patrons who have ever donated to us.\n\nThey will remain available even after your subscription ends." = "이 아이콘은 지금까지 후원해 주신 모든 후원자께 감사하는 의미로 제공됩니다.\n\n구독이 종료된 후에도 계속 사용할 수 있습니다."; +"These individuals have contributed to the open-source Delta project on GitHub.\n\nThank you to all our contributors, your help is much appreciated 💜" = "다음 분들은 GitHub의 오픈 소스 Delta 프로젝트에 기여했습니다.\n\n모든 기여자 여러분의 소중한 도움에 감사드립니다 💜"; "These save states are incompatible with this version of Delta. You can export them to continue playing in Delta Legacy." = "이 세이브 스테이트는 현재 Delta 버전과 호환되지 않습니다. Delta Legacy에서 계속 플레이하려면 내보낼 수 있습니다."; "These save states have been modified recently and may be associated with the wrong game.\n\nPlease change any incorrectly associated save states to the correct game by tapping them." = "이 세이브 스테이트는 최근 수정되었으며 잘못된 게임과 연결되어 있을 수 있습니다.\n\n잘못 연결된 세이브 스테이트를 탭하여 올바른 게임으로 변경해 주세요."; "This Device" = "이 기기"; @@ -480,9 +690,15 @@ "This version of Delta is not compatible with previous Nintendo DS save states.\n\nYou can find previous save states by pressing “View Incompatible Save States” in the options menu." = "이 Delta 버전은 이전 Nintendo DS 세이브 스테이트와 호환되지 않습니다.\n\n옵션 메뉴에서 “호환되지 않는 세이브 스테이트 보기”를 눌러 이전 세이브 스테이트를 확인할 수 있습니다."; "Threads" = "Threads"; "To search the database, type the name of a game in the search bar." = "데이터베이스를 검색하려면 검색 막대에 게임 이름을 입력하세요."; +"Toast Notifications" = "토스트 알림"; "Toggle Fast Forward" = "빨리 감기 켜기/끄기"; +"Top" = "상단"; +"Top Screen Only" = "상단 화면만"; "Touch" = "터치"; +"Touch & Haptics" = "터치 및 햅틱"; "Touch Screen" = "터치 스크린"; +"Track your progress and achievements in retro games. [Learn more…](https://retroachievements.org/)" = "레트로 게임의 진행 상황과 도전 과제를 추적하세요. [더 알아보기…](https://retroachievements.org/)"; +"Troubleshooting Tips" = "문제 해결 팁"; "Try restoring an older version to resolve this issue." = "이 문제를 해결하려면 이전 버전을 복원해 보세요."; "Try restoring an older version, or manually re-import the game to resolve this issue." = "이 문제를 해결하려면 이전 버전을 복원하거나 게임을 직접 다시 가져오세요."; "Unable to Add Cheat" = "치트를 추가할 수 없음"; @@ -494,16 +710,22 @@ "Unable to Import Save State" = "세이브 스테이트를 가져올 수 없음"; "Unable to Launch Delta" = "Delta를 실행할 수 없음"; "Unable to Launch Game" = "게임을 실행할 수 없음"; +"Unable to Load Cheats" = "치트를 불러올 수 없음"; +"Unable to Load Contributors" = "기여자를 불러올 수 없음"; "Unable to Log In to RetroAchievements" = "RetroAchievements에 로그인할 수 없음"; "Unable to Manage Subscription" = "구독을 관리할 수 없음"; "Unable to Purchase Subscription" = "구독을 구매할 수 없음"; +"Unable to Repair Games" = "게임을 복구할 수 없음"; +"Unable to Repair Save Files" = "세이브 파일을 복구할 수 없음"; "Unable to Restore Purchase" = "구매를 복원할 수 없음"; "Unable to Save Changes" = "변경 사항을 저장할 수 없음"; "Unable to Save Screenshot" = "스크린샷을 저장할 수 없음"; +"Unable to Sign In" = "로그인할 수 없음"; "Unable to Sign Out of Patreon" = "Patreon에서 로그아웃할 수 없음"; "Unable to Track Achievements" = "도전 과제를 추적할 수 없음"; "Unable to Update Display Name" = "표시 이름을 업데이트할 수 없음"; "Unable to Update Email" = "이메일을 업데이트할 수 없음"; +"Unable to connect to Lu. Please try again later." = "Lu에 연결할 수 없습니다. 나중에 다시 시도해 주세요."; "Unable to fetch “Delta Screenshots” album." = "“Delta Screenshots” 앨범 정보를 불러올 수 없습니다."; "Undefined" = "정의되지 않음"; "Unfavorite" = "즐겨찾기 해제"; @@ -514,28 +736,42 @@ "Unlink %@" = "%@ 연결 해제"; "Unlink Patreon Account" = "Patreon 계정 연결 해제"; "Unlock" = "잠금 해제"; +"Unlock exclusive app icons and receive early access to new features by donating." = "후원하여 전용 앱 아이콘을 잠금 해제하고 새 기능을 미리 사용해 보세요."; "Untitled" = "제목 없음"; "Up" = "위"; "Up Arrow" = "위쪽 화살표"; "Up+A" = "위+A"; "Up+B" = "위+B"; +"Up-to-date" = "최신 상태"; "Updated" = "업데이트됨"; +"Use Metal to render games instead of OpenGL ES. Does not apply to N64 games." = "OpenGL ES 대신 Metal로 게임을 렌더링합니다. N64 게임에는 적용되지 않습니다."; +"Use OpenGL ES 3.0 to render this game. Try disabling this if you're experiencing graphics-related bugs." = "OpenGL ES 3.0으로 이 게임을 렌더링합니다. 그래픽 관련 버그가 발생하면 이 옵션을 비활성화해 보세요."; +"Use gestures while holding the menu button to perform quick actions.\n\nMenu + Horizontal Swipe: Fast Forward\nMenu + Double-Tap: Quick Save\nMenu + Long-Press: Quick Load" = "메뉴 버튼을 누른 채 제스처를 사용하여 빠른 동작을 실행하세요.\n\n메뉴 + 가로로 쓸기: 빨리 감기\n메뉴 + 두 번 탭: 빠른 저장\n메뉴 + 길게 누르기: 빠른 불러오기"; "User is not logged in." = "로그인되어 있지 않습니다."; +"Username" = "사용자 이름"; "VBA-M Team" = "VBA-M Team"; "Verifying Database…" = "데이터베이스 확인 중…"; "Version Corrupted" = "버전 손상됨"; +"Video" = "비디오"; "View Compatible Save States" = "호환되는 세이브 스테이트 보기"; "View Incompatible Save States" = "호환되지 않는 세이브 스테이트 보기"; "View Patreon" = "Patreon 보기"; "View Save States" = "세이브 스테이트 보기"; "View Versions" = "버전 보기"; "VisualBoyAdvance-M" = "VisualBoyAdvance-M"; +"Visually show touches. Useful for screen recordings and tutorials." = "터치 위치를 화면에 표시합니다. 화면 녹화와 튜토리얼에 유용합니다."; +"WFC Server" = "WFC 서버"; "We and our service providers may record your chat with us. By using this chat, you agree to our Terms of Service and Privacy Policy. \n \n https://www.lulabs.ai/legal" = "당사 및 서비스 제공업체는 귀하와의 채팅을 기록할 수 있습니다. 이 채팅을 사용하면 서비스 약관 및 개인정보 처리방침에 동의하는 것입니다. \n \n https://www.lulabs.ai/legal"; +"Welcome back" = "다시 오신 것을 환영합니다"; "Welcome to Lu!" = "Lu에 오신 것을 환영합니다!"; "What would you like to know about this game?" = "이 게임에 관해 무엇을 알고 싶으신가요?"; "When AirPlaying DS games, both screens will be placed side-by-side on the external display." = "DS 게임을 AirPlay할 때 두 화면이 외부 디스플레이에 나란히 표시됩니다."; "When AirPlaying DS games, both screens will be stacked vertically on the external display." = "DS 게임을 AirPlay할 때 두 화면이 외부 디스플레이에 위아래로 표시됩니다."; "When AirPlaying DS games, only the top screen will appear on the external display." = "DS 게임을 AirPlay할 때 상단 화면만 외부 디스플레이에 표시됩니다."; +"When enabled, Delta will only play game audio if your device isn't silenced." = "활성화하면 기기가 무음 모드가 아닐 때만 Delta에서 게임 오디오를 재생합니다."; +"When enabled, game audio will play alongside other audio on your device." = "활성화하면 기기의 다른 오디오와 함께 게임 오디오를 재생합니다."; +"When enabled, starting a game pauses audio from other apps." = "활성화하면 게임을 시작할 때 다른 앱의 오디오를 일시 정지합니다."; +"When enabled, your device will vibrate in response to touch screen controls." = "활성화하면 터치 화면 조작에 반응하여 기기가 진동합니다."; "Would you like to download this version anyway? Delta will try to fix the corruption if possible." = "그래도 이 버전을 다운로드하시겠습니까? 가능하면 Delta가 손상된 데이터를 복구합니다."; "Would you like to resume where you left off, or restart the game?" = "중단한 지점부터 계속하시겠습니까, 아니면 게임을 다시 시작하시겠습니까?"; "X" = "X"; @@ -556,20 +792,31 @@ "You have save states that are incompatible with this version of Delta." = "현재 Delta 버전과 호환되지 않는 세이브 스테이트가 있습니다."; "You may have up to 4 shortcuts." = "단축어는 최대 4개까지 설정할 수 있습니다."; "You may need to also “Erase Nintendo WFC Configuration” in-game." = "게임 내에서 “Erase Nintendo WFC Configuration”도 실행해야 할 수 있습니다."; +"You may need to re-add any friend codes you’ve previously registered." = "이전에 등록한 친구 코드를 다시 추가해야 할 수 있습니다."; "You may need to reboot your device in order for the app icon to update." = "앱 아이콘을 업데이트하려면 기기를 재부팅해야 할 수 있습니다."; +"You must be an active patron to use Experimental Features." = "실험적 기능을 사용하려면 현재 Patreon 후원자여야 합니다."; "You must choose a 3rd-party WFC server to use Nintendo DS online features." = "Nintendo DS 온라인 기능을 사용하려면 서드 파티 WFC 서버를 선택해야 합니다."; "You will leave the app and go to the developer's website." = "앱에서 나가 개발자 웹사이트로 이동합니다."; "You will no longer be able to access Patreon-exclusive features." = "더 이상 Patreon 전용 기능을 사용할 수 없습니다."; +"Your feedback helps Lu improve and provide even better answers in the future." = "보내주신 피드백은 Lu가 발전하고 앞으로 더 나은 답변을 제공하는 데 도움이 됩니다."; "Your most recently played games will appear as shortcuts when long-pressing the app icon." = "앱 아이콘을 길게 누르면 최근 플레이한 게임이 단축어로 표시됩니다."; +"You’re about to use Apple’s In-App Purchase system.\nPatreon is not responsible for the privacy or security of purchases made with In-App Purchase." = "Apple의 앱 내 구입 시스템을 사용하려고 합니다.\nPatreon은 앱 내 구입으로 이루어진 구매의 개인정보 보호 또는 보안에 책임을 지지 않습니다."; "Z" = "Z"; "a game" = "게임"; "eke-eke" = "eke-eke"; "iTunes" = "iTunes"; "me@example.com" = "me@example.com"; "melonDS" = "melonDS"; +"point" = "포인트"; +"pt" = "포인트"; +"pts" = "포인트"; "r571" = "r571"; "sinamas" = "sinamas"; "“%@“ is missing. Please re-import this game to resume syncing its data." = "“%@” 게임이 없습니다. 데이터 동기화를 다시 시작하려면 이 게임을 다시 가져오세요."; +"• %@" = "• %@"; +"• Devices on the same Wi-Fi network may not be able to connect to each other" = "• 같은 Wi-Fi 네트워크의 기기끼리는 서로 연결하지 못할 수 있습니다"; +"• When using BIOS files, you may need to “Erase Nintendo WFC Configuration” in-game\n" = "• BIOS 파일을 사용할 때 게임 내에서 “Erase Nintendo WFC Configuration”을 실행해야 할 수 있습니다\n"; +"• You can only connect to players on the same server" = "• 같은 서버를 사용하는 플레이어에게만 연결할 수 있습니다"; "←" = "←"; "↑" = "↑"; "→" = "→"; @@ -583,3 +830,5 @@ "⎋" = "⎋"; "⚠️ Tap to view our Troubleshooting Guide." = "⚠️ 탭하여 문제 해결 가이드를 확인하세요."; "✅ Achievement Unlocked" = "✅ 도전 과제 달성"; +"👍 Great!" = "👍 좋아요!"; +"👎 Needs Improvement" = "👎 개선이 필요해요"; From 30c9bd08b6a88932b765713cd992a5f1e3561222 Mon Sep 17 00:00:00 2001 From: himomohi Date: Mon, 10 Aug 2026 00:01:55 +0900 Subject: [PATCH 5/7] Fix Korean interface localization review findings --- Delta.xcodeproj/project.pbxproj | 2 ++ Delta/ko.lproj/AboutPatreonHeaderView.strings | 2 +- Delta/ko.lproj/PauseMenu.strings | 2 +- Delta/ko.lproj/Settings.strings | 6 +++--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Delta.xcodeproj/project.pbxproj b/Delta.xcodeproj/project.pbxproj index 91d9bf39..cea5c3eb 100644 --- a/Delta.xcodeproj/project.pbxproj +++ b/Delta.xcodeproj/project.pbxproj @@ -3172,6 +3172,7 @@ STRIP_INSTALLED_PRODUCT = YES; STRIP_STYLE = "non-global"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = BETA; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INCLUDE_PATHS = "$(inherited) \"$(SRCROOT)/Cores/GPGXDeltaCore/Sources/GPGXBridge\""; SWIFT_OBJC_BRIDGING_HEADER = "Delta/Supporting Files/Delta-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -3206,6 +3207,7 @@ STRIP_INSTALLED_PRODUCT = YES; STRIP_STYLE = "non-global"; SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_EMIT_LOC_STRINGS = YES; SWIFT_INCLUDE_PATHS = "$(inherited) \"$(SRCROOT)/Cores/GPGXDeltaCore/Sources/GPGXBridge\""; SWIFT_OBJC_BRIDGING_HEADER = "Delta/Supporting Files/Delta-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-O"; diff --git a/Delta/ko.lproj/AboutPatreonHeaderView.strings b/Delta/ko.lproj/AboutPatreonHeaderView.strings index 371af3af..bdc4787e 100644 --- a/Delta/ko.lproj/AboutPatreonHeaderView.strings +++ b/Delta/ko.lproj/AboutPatreonHeaderView.strings @@ -11,4 +11,4 @@ "ymY-qC-4y4.normalTitle" = "Patreon 계정 연결"; /* ObjectID = "FeG-e5-LJl"; property = "text"; */ -"FeG-e5-LJl.text" = "직접 후원해 주시는 모든 Friend Zone Patreon 후원자 여러분께 감사드립니다. 여러분 없이는 해낼 수 없었을 거예요 💜 지금 Friend Zone 후원자가 되어 이 페이지에 이름을 올리고 새로운 기능을 미리 이용해 보세요."; +"FeG-e5-LJl.text" = "직접 후원해 주시는 모든 Friend Zone Patreon 후원자 여러분께 감사드립니다. 여러분 없이는 해낼 수 없었을 거예요 💜\n\n지금 Friend Zone 후원자가 되어 이 페이지에 이름을 올리고 새로운 기능을 미리 이용해 보세요."; diff --git a/Delta/ko.lproj/PauseMenu.strings b/Delta/ko.lproj/PauseMenu.strings index d45772b0..f386968f 100644 --- a/Delta/ko.lproj/PauseMenu.strings +++ b/Delta/ko.lproj/PauseMenu.strings @@ -5,7 +5,7 @@ "2yt-vB-uMF.title" = "메인 메뉴"; /* ObjectID = "BoG-k2-aR2"; property = "title"; */ -"BoG-k2-aR2.title" = "상태 저장"; +"BoG-k2-aR2.title" = "세이브 스테이트"; /* ObjectID = "FlO-FB-hpP"; property = "title"; */ "FlO-FB-hpP.title" = "옵션"; diff --git a/Delta/ko.lproj/Settings.strings b/Delta/ko.lproj/Settings.strings index 93248d77..850bceb1 100644 --- a/Delta/ko.lproj/Settings.strings +++ b/Delta/ko.lproj/Settings.strings @@ -116,7 +116,7 @@ "y6U-7a-bnX.headerTitle" = "Delta 동기화"; /* ObjectID = "y6U-7a-bnX"; property = "footerTitle"; */ -"y6U-7a-bnX.footerTitle" = "기기 간에 게임, 저장 데이터, 저장 상태 및 치트를 동기화합니다."; +"y6U-7a-bnX.footerTitle" = "기기 간에 게임, 저장 데이터, 세이브 스테이트 및 치트를 동기화합니다."; /* ObjectID = "4U1-fe-PIb"; property = "text"; */ "4U1-fe-PIb.text" = "서비스"; @@ -158,7 +158,7 @@ "fdp-8c-oOc.headerTitle" = "햅틱 터치"; /* ObjectID = "fdp-8c-oOc"; property = "footerTitle"; */ -"fdp-8c-oOc.footerTitle" = "컨텍스트 메뉴를 사용할 때 게임과 저장 상태를 미리 봅니다."; +"fdp-8c-oOc.footerTitle" = "컨텍스트 메뉴를 사용할 때 게임과 세이브 스테이트를 미리 봅니다."; /* ObjectID = "c5i-qG-ir9"; property = "text"; */ "c5i-qG-ir9.text" = "홈 화면 바로가기"; @@ -305,7 +305,7 @@ "R9m-rV-VgV.title" = "동기화 서비스"; /* ObjectID = "m5I-He-R1D"; property = "footerTitle"; */ -"m5I-He-R1D.footerTitle" = "기기 간에 게임, 저장 데이터, 저장 상태 및 치트를 동기화합니다."; +"m5I-He-R1D.footerTitle" = "기기 간에 게임, 저장 데이터, 세이브 스테이트 및 치트를 동기화합니다."; /* ObjectID = "mIB-Au-dYz"; property = "headerTitle"; */ "mIB-Au-dYz.headerTitle" = "서비스"; From b4a92a63a7a6d4be0220c3be20aefc7f125d460e Mon Sep 17 00:00:00 2001 From: himomohi Date: Mon, 10 Aug 2026 00:03:47 +0900 Subject: [PATCH 6/7] Fix Korean runtime localization review findings --- Delta/Launch/WhatsNewViewController.swift | 6 ++++-- .../AchievementGameBanner.swift | 3 ++- .../AchievementNotification.swift | 3 ++- .../Patreon/PatreonViewController.swift | 17 +++++++++++------ Delta/ko.lproj/Localizable.strings | 4 ++-- 5 files changed, 21 insertions(+), 12 deletions(-) diff --git a/Delta/Launch/WhatsNewViewController.swift b/Delta/Launch/WhatsNewViewController.swift index f01bb419..c0c4a4ee 100644 --- a/Delta/Launch/WhatsNewViewController.swift +++ b/Delta/Launch/WhatsNewViewController.swift @@ -35,11 +35,13 @@ extension WhatsNewViewController var isPatronExclusive: Bool - var localizedName: String { + var localizedName: String + { Bundle.main.localizedString(forKey: self.name, value: self.name, table: nil) } - var localizedCaption: String { + var localizedCaption: String + { Bundle.main.localizedString(forKey: self.caption, value: self.caption, table: nil) } diff --git a/Delta/RetroAchievements/AchievementGameBanner.swift b/Delta/RetroAchievements/AchievementGameBanner.swift index 6cfd3f13..ed785940 100644 --- a/Delta/RetroAchievements/AchievementGameBanner.swift +++ b/Delta/RetroAchievements/AchievementGameBanner.swift @@ -13,7 +13,8 @@ struct AchievementGameBanner: View { let game: AchievementsManager.Game - private var pointUnit: String { + private var pointUnit: String + { game.currentPoints == 1 ? String(localized: "pt") : String(localized: "pts") } diff --git a/Delta/RetroAchievements/AchievementNotification.swift b/Delta/RetroAchievements/AchievementNotification.swift index 238af0f4..766350ba 100644 --- a/Delta/RetroAchievements/AchievementNotification.swift +++ b/Delta/RetroAchievements/AchievementNotification.swift @@ -19,7 +19,8 @@ struct AchievementNotification: View @Environment(AchievementToastView.self) private var hostingView - private var pointUnit: String { + private var pointUnit: String + { achievement.points == 1 ? String(localized: "pt") : String(localized: "pts") } diff --git a/Delta/Settings/Patreon/PatreonViewController.swift b/Delta/Settings/Patreon/PatreonViewController.swift index 75ec4a7d..ae0a8bdf 100644 --- a/Delta/Settings/Patreon/PatreonViewController.swift +++ b/Delta/Settings/Patreon/PatreonViewController.swift @@ -146,8 +146,8 @@ private extension PatreonViewController Riley & Shane """, comment: "") - let isPatronText = NSLocalizedString(""" - Hey , + let isPatronTextFormat = NSLocalizedString(""" + Hey %@, You’re the best. Your account was linked successfully, so you now have access to Patreon-exclusive app icons and Experimental Features. You can find them all in Settings. @@ -164,14 +164,19 @@ private extension PatreonViewController { headerView.supportButton.setTitle(isPatronSupportButtonTitle, for: .normal) + let patronName = account.firstName ?? account.name + let isPatronText = String(format: isPatronTextFormat, patronName) let font = UIFont.systemFont(ofSize: 16) let attributedText = NSMutableAttributedString(string: isPatronText, attributes: [.font: font, .foregroundColor: UIColor.label]) - let boldedName = NSAttributedString(string: account.firstName ?? account.name, - attributes: [.font: UIFont.boldSystemFont(ofSize: font.pointSize), - .foregroundColor: UIColor.label]) - attributedText.insert(boldedName, at: 4) + let nameRange = (isPatronText as NSString).range(of: patronName) + if nameRange.location != NSNotFound + { + attributedText.addAttributes([.font: UIFont.boldSystemFont(ofSize: font.pointSize), + .foregroundColor: UIColor.label], + range: nameRange) + } headerView.textView.attributedText = attributedText } diff --git a/Delta/ko.lproj/Localizable.strings b/Delta/ko.lproj/Localizable.strings index 61aecad4..2f287093 100644 --- a/Delta/ko.lproj/Localizable.strings +++ b/Delta/ko.lproj/Localizable.strings @@ -309,7 +309,7 @@ "Game Controllers" = "게임 컨트롤러"; "Game Data Saved" = "게임 데이터 저장됨"; "Game Paused" = "게임 일시 정지됨"; -"Game Save" = "게임 저장 데이터"; +"Game Save" = "세이브 파일"; "Game Settings" = "게임 설정"; "Game System" = "게임 시스템"; "Games" = "게임"; @@ -330,7 +330,7 @@ "Handoff Failed" = "Handoff 실패"; "Haptics" = "햅틱"; "Hardcore Mode" = "하드코어 모드"; -"Hey ,\n\nYou’re the best. Your account was linked successfully, so you now have access to Patreon-exclusive app icons and Experimental Features. You can find them all in Settings.\n\nThanks for all of your support. Enjoy!\nRiley & Shane" = "Hey ,\n\n정말 최고예요. 계정이 성공적으로 연결되어 이제 Patreon 전용 앱 아이콘과 실험적 기능을 이용할 수 있습니다. 설정에서 모두 확인할 수 있습니다.\n\n항상 응원해 주셔서 감사합니다. 즐겁게 사용하세요!\nRiley & Shane"; +"Hey %@,\n\nYou’re the best. Your account was linked successfully, so you now have access to Patreon-exclusive app icons and Experimental Features. You can find them all in Settings.\n\nThanks for all of your support. Enjoy!\nRiley & Shane" = "안녕하세요, %@님!\n\n정말 최고예요. 계정이 성공적으로 연결되어 이제 Patreon 전용 앱 아이콘과 실험적 기능을 이용할 수 있습니다. 설정에서 모두 확인할 수 있습니다.\n\n항상 응원해 주셔서 감사합니다. 즐겁게 사용하세요!\nRiley & Shane"; "Hey y'all,\n\nYou can support future development of Delta by donating to us on Patreon. In return, you'll unlock Patreon-exclusive app icons and receive early access to new features.\n\nThanks for all your support 💜\nRiley & Shane" = "안녕하세요, 여러분,\n\nPatreon에서 후원하여 Delta의 향후 개발을 지원할 수 있습니다. 후원하면 Patreon 전용 앱 아이콘을 잠금 해제하고 새로운 기능을 미리 이용할 수 있습니다.\n\n항상 응원해 주셔서 감사합니다 💜\nRiley & Shane"; "Hold Buttons" = "버튼 고정"; "Home Screen" = "홈 화면"; From b43310b5a1d3a6f92ef9a0dcfa91a7c8d215c262 Mon Sep 17 00:00:00 2001 From: himomohi Date: Mon, 10 Aug 2026 00:15:37 +0900 Subject: [PATCH 7/7] Fix Patreon localized name range --- .../Patreon/PatreonViewController.swift | 25 +++++++++++++++---- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/Delta/Settings/Patreon/PatreonViewController.swift b/Delta/Settings/Patreon/PatreonViewController.swift index ae0a8bdf..76e93f43 100644 --- a/Delta/Settings/Patreon/PatreonViewController.swift +++ b/Delta/Settings/Patreon/PatreonViewController.swift @@ -165,13 +165,28 @@ private extension PatreonViewController headerView.supportButton.setTitle(isPatronSupportButtonTitle, for: .normal) let patronName = account.firstName ?? account.name - let isPatronText = String(format: isPatronTextFormat, patronName) + let patronNameSentinel = "\u{E000}DeltaPatreonNamePlaceholder\u{E001}" + let isPatronText = NSMutableString(string: String(format: isPatronTextFormat, patronNameSentinel)) + let sentinelRange = isPatronText.range(of: patronNameSentinel) + + let nameRange: NSRange? + if sentinelRange.location != NSNotFound + { + isPatronText.replaceCharacters(in: sentinelRange, with: patronName) + nameRange = NSRange(location: sentinelRange.location, length: (patronName as NSString).length) + } + else + { + isPatronText.setString(String(format: isPatronTextFormat, patronName)) + nameRange = nil + } + let font = UIFont.systemFont(ofSize: 16) - let attributedText = NSMutableAttributedString(string: isPatronText, attributes: [.font: font, - .foregroundColor: UIColor.label]) + let attributedText = NSMutableAttributedString(string: isPatronText as String, + attributes: [.font: font, + .foregroundColor: UIColor.label]) - let nameRange = (isPatronText as NSString).range(of: patronName) - if nameRange.location != NSNotFound + if let nameRange { attributedText.addAttributes([.font: UIFont.boldSystemFont(ofSize: font.pointSize), .foregroundColor: UIColor.label],