diff --git a/PasswordBox.xcodeproj/project.pbxproj b/PasswordBox.xcodeproj/project.pbxproj index f49640c..d8397b9 100644 --- a/PasswordBox.xcodeproj/project.pbxproj +++ b/PasswordBox.xcodeproj/project.pbxproj @@ -19,9 +19,9 @@ 3F13F9C82C1DED720068908E /* EditView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F13F9C72C1DED720068908E /* EditView.swift */; }; 3F13F9CB2C1DEE020068908E /* PasswordFormView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F13F9CA2C1DEE020068908E /* PasswordFormView.swift */; }; 3F1DFECF2C4B552E00BAA193 /* SafariView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F1DFECE2C4B552E00BAA193 /* SafariView.swift */; }; - 3F1DFEDD2C4CA01300BAA193 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 3F1DFEDC2C4CA01300BAA193 /* Localizable.xcstrings */; }; 3F1DFEE12C4CB06700BAA193 /* CommonButtonStrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F1DFEE02C4CB06700BAA193 /* CommonButtonStrings.swift */; }; - 3F1DFEE32C4CB5F300BAA193 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 3F1DFEE22C4CB5F300BAA193 /* InfoPlist.xcstrings */; }; + 3F1DFEE82C4CD18F00BAA193 /* InfoPlist.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 3F1DFEE62C4CD18F00BAA193 /* InfoPlist.xcstrings */; }; + 3F1DFEE92C4CD18F00BAA193 /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 3F1DFEE72C4CD18F00BAA193 /* Localizable.xcstrings */; }; 3F3DE2F82C1DE2500089CB5A /* InfomationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3DE2F72C1DE2500089CB5A /* InfomationView.swift */; }; 3F3DE2FA2C1DE2710089CB5A /* AddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F3DE2F92C1DE2710089CB5A /* AddView.swift */; }; 3F6AA4B82C2FDF22008EC918 /* PasswordField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F6AA4B72C2FDF22008EC918 /* PasswordField.swift */; }; @@ -71,9 +71,9 @@ 3F13F9C72C1DED720068908E /* EditView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditView.swift; sourceTree = ""; }; 3F13F9CA2C1DEE020068908E /* PasswordFormView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordFormView.swift; sourceTree = ""; }; 3F1DFECE2C4B552E00BAA193 /* SafariView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafariView.swift; sourceTree = ""; }; - 3F1DFEDC2C4CA01300BAA193 /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 3F1DFEE02C4CB06700BAA193 /* CommonButtonStrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommonButtonStrings.swift; sourceTree = ""; }; - 3F1DFEE22C4CB5F300BAA193 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; + 3F1DFEE62C4CD18F00BAA193 /* InfoPlist.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = InfoPlist.xcstrings; sourceTree = ""; }; + 3F1DFEE72C4CD18F00BAA193 /* Localizable.xcstrings */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = ""; }; 3F3DE2F72C1DE2500089CB5A /* InfomationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InfomationView.swift; sourceTree = ""; }; 3F3DE2F92C1DE2710089CB5A /* AddView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddView.swift; sourceTree = ""; }; 3F6AA4B72C2FDF22008EC918 /* PasswordField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasswordField.swift; sourceTree = ""; }; @@ -298,8 +298,8 @@ 3F026F432C3A789500ED696C /* URLs.swift */, 3FEE0F152C3C2EDE0057EE2F /* AppTips.swift */, 3F1DFEE02C4CB06700BAA193 /* CommonButtonStrings.swift */, - 3F1DFEDC2C4CA01300BAA193 /* Localizable.xcstrings */, - 3F1DFEE22C4CB5F300BAA193 /* InfoPlist.xcstrings */, + 3F1DFEE62C4CD18F00BAA193 /* InfoPlist.xcstrings */, + 3F1DFEE72C4CD18F00BAA193 /* Localizable.xcstrings */, ); path = Resources; sourceTree = ""; @@ -419,10 +419,10 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 3F1DFEE82C4CD18F00BAA193 /* InfoPlist.xcstrings in Resources */, 3F8C85A22C189D4B0032277E /* Preview Assets.xcassets in Resources */, + 3F1DFEE92C4CD18F00BAA193 /* Localizable.xcstrings in Resources */, 3F8C859F2C189D4B0032277E /* Assets.xcassets in Resources */, - 3F1DFEE32C4CB5F300BAA193 /* InfoPlist.xcstrings in Resources */, - 3F1DFEDD2C4CA01300BAA193 /* Localizable.xcstrings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/PasswordBox/Resources/InfoPlist.xcstrings b/PasswordBox/Resources/InfoPlist.xcstrings index 50f2bc8..53b549e 100644 --- a/PasswordBox/Resources/InfoPlist.xcstrings +++ b/PasswordBox/Resources/InfoPlist.xcstrings @@ -11,11 +11,23 @@ "value" : "PasswordBox" } }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "PasswordBox" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "PasswordBox" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "PasswordBox" + } } } }, @@ -29,11 +41,23 @@ "value" : "Use FaceID to secure access to apps and provide secure authentication" } }, + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Use FaceID to secure access to apps and provide secure authentication" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "FaceIDを使用してアプリへのアクセスを保護し、安全な認証を提供します。" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Use FaceID to secure access to apps and provide secure authentication" + } } } } diff --git a/PasswordBox/Resources/Localizable.xcstrings b/PasswordBox/Resources/Localizable.xcstrings index c4dfcbb..023683b 100644 --- a/PasswordBox/Resources/Localizable.xcstrings +++ b/PasswordBox/Resources/Localizable.xcstrings @@ -3,291 +3,639 @@ "strings" : { "Add" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Add" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "追加" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Add" + } } } }, "alphabet" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "alphabet" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "アルファベット" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "alphabet" + } } } }, "App Infomation" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "App Infomation" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "アプリ情報" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "App Infomation" + } } } }, "Authentication required" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Authentication required" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "認証が必要です" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Authentication required" + } } } }, "Automatic Password Update" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Automatic Password Update" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "パスワードを自動更新" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Automatic Password Update" + } } } }, "Cancel" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Cancel" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "キャンセル" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Cancel" + } } } }, "Change icon and title" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Change icon and title" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "アイコンとタイトルを変更" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Change icon and title" + } } } }, "Contact Us" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Contact Us" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "お問い合わせ" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Contact Us" + } } } }, "Done" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Done" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "完了" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Done" + } } } }, "Edit" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "編集" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit" + } } } }, "Edit password manually" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit password manually" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "パスワードを手動で編集" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Edit password manually" + } } } }, "Icons and titles can be edited here." : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Icons and titles can be edited here." + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "アイコンとタイトルはこちらから編集することができます。" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Icons and titles can be edited here." + } } } }, "Infomation" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Infomation" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "情報" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Infomation" + } } } }, "LICENCE" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "LICENCE" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "ライセンス" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "LICENCE" + } } } }, "List" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "List" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "リスト" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "List" + } } } }, "List Name" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "List Name" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "リスト名" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "List Name" + } } } }, "Login authentication is required" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Login authentication is required" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "ログイン認証が必要です" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Login authentication is required" + } } } }, "number of characters: %lld" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "number of characters: %lld" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "文字数: %lld" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "number of characters: %lld" + } } } }, "OK" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "OK" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "OK" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "OK" + } } } }, "PasswordField" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "PasswordField" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "PasswordField" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "PasswordField" + } } } }, "Privacy Policy" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Privacy Policy" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "プライバシーポリシー" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Privacy Policy" + } } } }, "Re-authenticate" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Re-authenticate" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "再認証する" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Re-authenticate" + } } } }, "Select Icon" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Select Icon" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "アイコン選択" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Select Icon" + } } } }, "symbol" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "symbol" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "記号" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "symbol" + } } } }, "Text Field" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Text Field" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "テキストフィールド" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Text Field" + } } } }, "unkown" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "unkown" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "不明" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "unkown" + } } } }, "Version" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "Version" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "バージョン" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "Version" + } } } }, "WebSite" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "WebSite" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "Webサイト" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "WebSite" + } } } }, "You must authenticate your device in order to use the application. \n Please **re-authenticate** to continue" : { "localizations" : { + "fr" : { + "stringUnit" : { + "state" : "new", + "value" : "You must authenticate your device in order to use the application. \n Please **re-authenticate** to continue" + } + }, "ja" : { "stringUnit" : { "state" : "translated", "value" : "アプリを使用するには端末の認証が必要です。続けるには**再認証**をしてください" } + }, + "zh-Hans" : { + "stringUnit" : { + "state" : "new", + "value" : "You must authenticate your device in order to use the application. \n Please **re-authenticate** to continue" + } } } } diff --git a/README.md b/README.md index 53a2fb5..a24489c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # 🔐Password Box +[![Crowdin](https://badges.crowdin.net/passwordbox-ios/localized.svg)](https://crowdin.com/project/passwordbox-ios) Password Box is an iOS app designed to store passwords that cannot be managed by conventional password management tools like iCloud Keychain. It addresses the need to securely store a variety of real-world passcodes that typical password managers can’t handle, such as computer passcodes for different operating systems at the office, bike lock combinations, and more. @@ -16,7 +17,6 @@ To run this app, you need the following libraries: - Xcode: 15.4 or higher - KeychainAccess: 4.2.2 - LicenseList: 0.7.0 -- WebUI: 2.1.0 ## Installation diff --git a/docs/CONTRIBUTEING.md b/docs/CONTRIBUTEING.md index b48bf9c..63bbeef 100644 --- a/docs/CONTRIBUTEING.md +++ b/docs/CONTRIBUTEING.md @@ -12,7 +12,9 @@ We will respond to your comment as soon as possible, but feel free to start work Using GitHub Issues is preferable, but if you have specific ideas for implementation or refactoring, Pull Requests are also welcome. ## App Translation -TBD +his project is managed on Crowdin. +For translations, please contribute via [Crowdin](https://crowdin.com/project/passwordbox-ios). +If you would like to add any languages, please write it in an [Issue](https://github.com/KaitoMuraoka/PasswordBox/issues). ## Web site TBD