diff --git a/GitLab Localizations/en.xcloc/Localized Contents/GitLab iOS/Assets.xcassets/AccentColor.colorset/Contents.json b/GitLab Localizations/en.xcloc/Localized Contents/GitLab iOS/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..d0ffdd5
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Localized Contents/GitLab iOS/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal",
+ "locale" : "en"
+ }
+ ],
+ "properties" : {
+ "localizable" : true
+ },
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/GitLab Localizations/en.xcloc/Localized Contents/GitLab iOS/Assets.xcassets/Contents.json b/GitLab Localizations/en.xcloc/Localized Contents/GitLab iOS/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Localized Contents/GitLab iOS/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/GitLab Localizations/en.xcloc/Localized Contents/GitLab/Assets.xcassets/AccentColor.colorset/Contents.json b/GitLab Localizations/en.xcloc/Localized Contents/GitLab/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..d0ffdd5
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Localized Contents/GitLab/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,15 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal",
+ "locale" : "en"
+ }
+ ],
+ "properties" : {
+ "localizable" : true
+ },
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/GitLab Localizations/en.xcloc/Localized Contents/GitLab/Assets.xcassets/Contents.json b/GitLab Localizations/en.xcloc/Localized Contents/GitLab/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..8cbf8bf
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Localized Contents/GitLab/Assets.xcassets/Contents.json
@@ -0,0 +1,9 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "compression-type" : "gpu-optimized-best"
+ }
+}
diff --git a/GitLab Localizations/en.xcloc/Localized Contents/en.xliff b/GitLab Localizations/en.xcloc/Localized Contents/en.xliff
new file mode 100644
index 0000000..91cc2ab
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Localized Contents/en.xliff
@@ -0,0 +1,1163 @@
+
+
+
+
+
+
+
+ DesktopWidgetTool
+ Bundle display name
+
+
+
+ DesktopWidgetToolExtension
+ Bundle name
+
+
+
+
+ Copyright (human-readable)
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %@
+
+
+
+
+ %lld
+
+
+
+
+ %lld discussions
+
+
+
+
+ Account
+
+
+
+
+ Active:
+
+
+
+
+ Add Account
+
+
+
+
+ Add your GitLab Account
+
+
+
+
+ All your Authored Merge Requests directly visible.
+
+
+
+
+ Approved
+
+
+
+
+ Authored Merge Requests
+
+
+
+
+ Base URL
+
+
+
+
+ CI Created
+
+
+
+
+ CI Failed
+
+
+
+
+ CI Success
+
+
+
+
+ CI Warning
+
+
+
+
+ CI canceled
+
+
+
+
+ CI in progress
+
+
+
+
+ CI pipeline pending
+
+
+
+
+ CI pipeline preparing
+
+
+
+
+ CI pipeline scheduled
+
+
+
+
+ CI pipeline waiting for resources
+
+
+
+
+ Close
+
+
+
+
+ Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with.
+
+
+
+
+ Create merge request
+
+
+
+
+ Created at:
+
+
+
+
+ Delete
+
+
+
+
+ Dismiss
+
+
+
+
+ Draft
+
+
+
+
+ Enter token here...
+
+
+
+
+ Expires at:
+
+
+
+
+ Failed
+
+
+
+
+ GitLab Token
+
+
+
+
+ Last updated at: 19 September 2022 at 12:43
+
+
+
+
+ Last used at:
+
+
+
+
+ Manual CI step
+
+
+
+
+ Merge Train 🚂
+
+
+
+
+ Merge request approved
+
+
+
+
+ Name:
+
+
+
+
+ Needs Review
+
+
+
+
+ Quick access to your recently used Repositories
+
+
+
+
+ Quit
+
+
+
+
+ Remove %@
+
+
+
+
+ Repo Launchpad
+
+
+
+
+ Retry CI pipeline
+
+
+
+
+ Review requested
+
+
+
+
+ Revoked:
+
+
+
+
+ Save
+
+
+
+
+ Scopes:
+
+
+
+
+ Settings
+
+
+
+
+ Share
+
+
+
+
+ Skipped CI step
+
+
+
+
+ Submit
+
+
+
+
+ This %@ account will be removed immediatly. You can't undo this action.
+
+
+
+
+ Too much discussions
+
+
+
+
+ Validating...
+
+
+
+
+ Your Merge Requests
+
+
+
+
+ default widget view
+
+
+
+
+ https://www.gitlab.com
+
+
+
+
+ updating
+
+
+
+
+
+
+
+
+
+ GitLab
+ Bundle display name
+
+
+
+ GitLab iOS
+ Bundle name
+
+
+
+
+
+
+
+
+
+ No comment provided by engineer.
+
+
+
+ %@
+ No comment provided by engineer.
+
+
+
+ %lld
+ No comment provided by engineer.
+
+
+
+ %lld discussions
+ No comment provided by engineer.
+
+
+
+ Account
+ No comment provided by engineer.
+
+
+
+ Active:
+ No comment provided by engineer.
+
+
+
+ Add Account
+ No comment provided by engineer.
+
+
+
+ Add your GitLab Account
+ No comment provided by engineer.
+
+
+
+ Approved
+ No comment provided by engineer.
+
+
+
+ Base URL
+ No comment provided by engineer.
+
+
+
+ CI Created
+ No comment provided by engineer.
+
+
+
+ CI Failed
+ No comment provided by engineer.
+
+
+
+ CI Success
+ No comment provided by engineer.
+
+
+
+ CI Warning
+ No comment provided by engineer.
+
+
+
+ CI canceled
+ No comment provided by engineer.
+
+
+
+ CI in progress
+ No comment provided by engineer.
+
+
+
+ CI pipeline pending
+ No comment provided by engineer.
+
+
+
+ CI pipeline preparing
+ No comment provided by engineer.
+
+
+
+ CI pipeline scheduled
+ No comment provided by engineer.
+
+
+
+ CI pipeline waiting for resources
+ No comment provided by engineer.
+
+
+
+ Cancel
+ No comment provided by engineer.
+
+
+
+ Close
+ No comment provided by engineer.
+
+
+
+ Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with.
+ No comment provided by engineer.
+
+
+
+ Create merge request
+ No comment provided by engineer.
+
+
+
+ Created at:
+ No comment provided by engineer.
+
+
+
+ Delete
+ No comment provided by engineer.
+
+
+
+ Dismiss
+ No comment provided by engineer.
+
+
+
+ Done
+ No comment provided by engineer.
+
+
+
+ Draft
+ No comment provided by engineer.
+
+
+
+ Enter token here...
+ No comment provided by engineer.
+
+
+
+ Expires at:
+ No comment provided by engineer.
+
+
+
+ Failed
+ No comment provided by engineer.
+
+
+
+ GitLab Token
+ No comment provided by engineer.
+
+
+
+ Last updated at: 19 September 2022 at 12:43
+ No comment provided by engineer.
+
+
+
+ Last used at:
+ No comment provided by engineer.
+
+
+
+ Manual CI step
+ No comment provided by engineer.
+
+
+
+ Merge Train 🚂
+ No comment provided by engineer.
+
+
+
+ Merge request approved
+ No comment provided by engineer.
+
+
+
+ Name:
+ No comment provided by engineer.
+
+
+
+ Needs Review
+ No comment provided by engineer.
+
+
+
+ Remove %@
+ No comment provided by engineer.
+
+
+
+ Retry CI pipeline
+ No comment provided by engineer.
+
+
+
+ Review requested
+ No comment provided by engineer.
+
+
+
+ Revoked:
+ No comment provided by engineer.
+
+
+
+ Save
+ No comment provided by engineer.
+
+
+
+ Scopes:
+ No comment provided by engineer.
+
+
+
+ Settings
+ No comment provided by engineer.
+
+
+
+ Share
+ No comment provided by engineer.
+
+
+
+ Skipped CI step
+ No comment provided by engineer.
+
+
+
+ Submit
+ No comment provided by engineer.
+
+
+
+ This %@ account will be removed immediatly. You can't undo this action.
+ No comment provided by engineer.
+
+
+
+ Too much discussions
+ No comment provided by engineer.
+
+
+
+ Validating...
+ No comment provided by engineer.
+
+
+
+ Your Merge Requests
+ No comment provided by engineer.
+
+
+
+ https://www.gitlab.com
+ No comment provided by engineer.
+
+
+
+ sdf
+ No comment provided by engineer.
+
+
+
+ updating
+ No comment provided by engineer.
+
+
+
+
+
+
+
+
+ Enabled
+
+
+
+
+ Group
+ A single strings file, whose title is specified in your preferences schema. The strings files provide the localized content to display to the user for each of your preferences.
+
+
+
+ Name
+
+
+
+
+ none given
+
+
+
+
+
+
+
+
+
+ GitLab
+ Bundle name
+
+
+
+
+
+
+
+
+
+ No comment provided by engineer.
+
+
+
+ %@
+ No comment provided by engineer.
+
+
+
+ Account
+ No comment provided by engineer.
+
+
+
+ Active:
+ No comment provided by engineer.
+
+
+
+ Add your GitLab Account
+ No comment provided by engineer.
+
+
+
+ Approved
+ No comment provided by engineer.
+
+
+
+ Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with.
+ No comment provided by engineer.
+
+
+
+ Created at:
+ No comment provided by engineer.
+
+
+
+ Draft
+ No comment provided by engineer.
+
+
+
+ Enter token here...
+ No comment provided by engineer.
+
+
+
+ Expires at:
+ No comment provided by engineer.
+
+
+
+ Failed
+ No comment provided by engineer.
+
+
+
+ GitLab Desktop
+ No comment provided by engineer.
+
+
+
+ Last updated at: 19 September 2022 at 12:43
+ No comment provided by engineer.
+
+
+
+ Last used at:
+ No comment provided by engineer.
+
+
+
+ Merge Train 🚂
+ No comment provided by engineer.
+
+
+
+ Name:
+ No comment provided by engineer.
+
+
+
+ Needs Review
+ No comment provided by engineer.
+
+
+
+ Quit
+ No comment provided by engineer.
+
+
+
+ Remove %@
+ No comment provided by engineer.
+
+
+
+ Review requested
+ No comment provided by engineer.
+
+
+
+ Revoked:
+ No comment provided by engineer.
+
+
+
+ Save
+ No comment provided by engineer.
+
+
+
+ Scopes:
+ No comment provided by engineer.
+
+
+
+ Share
+ No comment provided by engineer.
+
+
+
+ Submit
+ No comment provided by engineer.
+
+
+
+ This %@ account will be removed immediatly. You can't undo this action.
+ No comment provided by engineer.
+
+
+
+ Validating...
+ No comment provided by engineer.
+
+
+
+ Your Merge Requests
+ No comment provided by engineer.
+
+
+
+ https://www.gitlab.com
+ No comment provided by engineer.
+
+
+
+ sdf
+ No comment provided by engineer.
+
+
+
+ updating
+ No comment provided by engineer.
+
+
+
+
+
+
+
+
+ Label
+ Class = "NSTextFieldCell"; title = "Label"; ObjectID = "Qoh-ff-zg7";
+
+
+
+
+
+
+
+
+ NotificationContent
+ Bundle display name
+
+
+
+ NotificationContent
+ Bundle name
+
+
+
+
+ Copyright (human-readable)
+
+
+
+
+
+
+
+
+
+ No comment provided by engineer.
+
+
+
+ %@
+ No comment provided by engineer.
+
+
+
+ %lld
+ No comment provided by engineer.
+
+
+
+ %lld discussions
+ No comment provided by engineer.
+
+
+
+ Account
+ No comment provided by engineer.
+
+
+
+ Active:
+ No comment provided by engineer.
+
+
+
+ Add Account
+ No comment provided by engineer.
+
+
+
+ Add your GitLab Account
+ No comment provided by engineer.
+
+
+
+ Approved
+ No comment provided by engineer.
+
+
+
+ Base URL
+ No comment provided by engineer.
+
+
+
+ CI Created
+ No comment provided by engineer.
+
+
+
+ CI Failed
+ No comment provided by engineer.
+
+
+
+ CI Success
+ No comment provided by engineer.
+
+
+
+ CI Warning
+ No comment provided by engineer.
+
+
+
+ CI canceled
+ No comment provided by engineer.
+
+
+
+ CI in progress
+ No comment provided by engineer.
+
+
+
+ CI pipeline pending
+ No comment provided by engineer.
+
+
+
+ CI pipeline preparing
+ No comment provided by engineer.
+
+
+
+ CI pipeline scheduled
+ No comment provided by engineer.
+
+
+
+ CI pipeline waiting for resources
+ No comment provided by engineer.
+
+
+
+ Close
+ No comment provided by engineer.
+
+
+
+ Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with.
+ No comment provided by engineer.
+
+
+
+ Create merge request
+ No comment provided by engineer.
+
+
+
+ Created at:
+ No comment provided by engineer.
+
+
+
+ Delete
+ No comment provided by engineer.
+
+
+
+ Dismiss
+ No comment provided by engineer.
+
+
+
+ Draft
+ No comment provided by engineer.
+
+
+
+ Enter token here...
+ No comment provided by engineer.
+
+
+
+ Expires at:
+ No comment provided by engineer.
+
+
+
+ Failed
+ No comment provided by engineer.
+
+
+
+ GitLab Token
+ No comment provided by engineer.
+
+
+
+ Last updated at: 19 September 2022 at 12:43
+ No comment provided by engineer.
+
+
+
+ Last used at:
+ No comment provided by engineer.
+
+
+
+ Manual CI step
+ No comment provided by engineer.
+
+
+
+ Merge Train 🚂
+ No comment provided by engineer.
+
+
+
+ Merge request approved
+ No comment provided by engineer.
+
+
+
+ Name:
+ No comment provided by engineer.
+
+
+
+ Needs Review
+ No comment provided by engineer.
+
+
+
+ Quit
+ No comment provided by engineer.
+
+
+
+ Remove %@
+ No comment provided by engineer.
+
+
+
+ Retry CI pipeline
+ No comment provided by engineer.
+
+
+
+ Review requested
+ No comment provided by engineer.
+
+
+
+ Revoked:
+ No comment provided by engineer.
+
+
+
+ Save
+ No comment provided by engineer.
+
+
+
+ Scopes:
+ No comment provided by engineer.
+
+
+
+ Settings
+ No comment provided by engineer.
+
+
+
+ Share
+ No comment provided by engineer.
+
+
+
+ Skipped CI step
+ No comment provided by engineer.
+
+
+
+ Submit
+ No comment provided by engineer.
+
+
+
+ This %@ account will be removed immediatly. You can't undo this action.
+ No comment provided by engineer.
+
+
+
+ Too much discussions
+ No comment provided by engineer.
+
+
+
+ Validating...
+ No comment provided by engineer.
+
+
+
+ Your Merge Requests
+ No comment provided by engineer.
+
+
+
+ https://www.gitlab.com
+ No comment provided by engineer.
+
+
+
+ updating
+ No comment provided by engineer.
+
+
+
+
diff --git a/GitLab Localizations/en.xcloc/Source Contents/DesktopWidgetTool/InfoPlist.xcstrings b/GitLab Localizations/en.xcloc/Source Contents/DesktopWidgetTool/InfoPlist.xcstrings
new file mode 100644
index 0000000..874f91b
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/DesktopWidgetTool/InfoPlist.xcstrings
@@ -0,0 +1,42 @@
+{
+ "sourceLanguage" : "en",
+ "strings" : {
+ "CFBundleDisplayName" : {
+ "comment" : "Bundle display name",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "DesktopWidgetTool"
+ }
+ }
+ }
+ },
+ "CFBundleName" : {
+ "comment" : "Bundle name",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : "DesktopWidgetToolExtension"
+ }
+ }
+ }
+ },
+ "NSHumanReadableCopyright" : {
+ "comment" : "Copyright (human-readable)",
+ "extractionState" : "extracted_with_value",
+ "localizations" : {
+ "en" : {
+ "stringUnit" : {
+ "state" : "new",
+ "value" : ""
+ }
+ }
+ }
+ }
+ },
+ "version" : "1.0"
+}
\ No newline at end of file
diff --git a/GitLab Localizations/en.xcloc/Source Contents/DesktopWidgetTool/Localizable.xcstrings b/GitLab Localizations/en.xcloc/Source Contents/DesktopWidgetTool/Localizable.xcstrings
new file mode 100644
index 0000000..eda0919
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/DesktopWidgetTool/Localizable.xcstrings
@@ -0,0 +1,186 @@
+{
+ "sourceLanguage" : "en",
+ "strings" : {
+ " " : {
+
+ },
+ "%@" : {
+
+ },
+ "%lld" : {
+
+ },
+ "%lld discussions" : {
+
+ },
+ "Account" : {
+
+ },
+ "Active:" : {
+
+ },
+ "Add Account" : {
+
+ },
+ "Add your GitLab Account" : {
+
+ },
+ "All your Authored Merge Requests directly visible." : {
+
+ },
+ "Approved" : {
+
+ },
+ "Authored Merge Requests" : {
+
+ },
+ "Base URL" : {
+
+ },
+ "CI canceled" : {
+
+ },
+ "CI Created" : {
+
+ },
+ "CI Failed" : {
+
+ },
+ "CI in progress" : {
+
+ },
+ "CI pipeline pending" : {
+
+ },
+ "CI pipeline preparing" : {
+
+ },
+ "CI pipeline scheduled" : {
+
+ },
+ "CI pipeline waiting for resources" : {
+
+ },
+ "CI Success" : {
+
+ },
+ "CI Warning" : {
+
+ },
+ "Close" : {
+
+ },
+ "Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with." : {
+
+ },
+ "Create merge request" : {
+
+ },
+ "Created at:" : {
+
+ },
+ "default widget view" : {
+
+ },
+ "Delete" : {
+
+ },
+ "Dismiss" : {
+
+ },
+ "Draft" : {
+
+ },
+ "Enter token here..." : {
+
+ },
+ "Expires at:" : {
+
+ },
+ "Failed" : {
+
+ },
+ "GitLab Token" : {
+
+ },
+ "https://www.gitlab.com" : {
+
+ },
+ "Last updated at: 19 September 2022 at 12:43" : {
+
+ },
+ "Last used at:" : {
+
+ },
+ "Manual CI step" : {
+
+ },
+ "Merge request approved" : {
+
+ },
+ "Merge Train 🚂" : {
+
+ },
+ "Name:" : {
+
+ },
+ "Needs Review" : {
+
+ },
+ "Quick access to your recently used Repositories" : {
+
+ },
+ "Quit" : {
+
+ },
+ "Remove %@" : {
+
+ },
+ "Repo Launchpad" : {
+
+ },
+ "Retry CI pipeline" : {
+
+ },
+ "Review requested" : {
+
+ },
+ "Revoked:" : {
+
+ },
+ "Save" : {
+
+ },
+ "Scopes:" : {
+
+ },
+ "Settings" : {
+
+ },
+ "Share" : {
+
+ },
+ "Skipped CI step" : {
+
+ },
+ "Submit" : {
+
+ },
+ "This %@ account will be removed immediatly. You can't undo this action." : {
+
+ },
+ "Too much discussions" : {
+
+ },
+ "updating" : {
+
+ },
+ "Validating..." : {
+
+ },
+ "Your Merge Requests" : {
+
+ }
+ },
+ "version" : "1.0"
+}
\ No newline at end of file
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Assets.xcassets/AccentColor.colorset/Contents.json b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..b3e5ea6
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "display-p3",
+ "components" : {
+ "red" : "0.322",
+ "alpha" : "1.000",
+ "blue" : "0.518",
+ "green" : "0.270"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "properties" : {
+ "localizable" : true
+ },
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Assets.xcassets/Contents.json b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Settings.bundle/en.lproj/Root.strings b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Settings.bundle/en.lproj/Root.strings
new file mode 100644
index 0000000..8cd87b9
Binary files /dev/null and b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/Settings.bundle/en.lproj/Root.strings differ
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/en.lproj/GitLab iOS-InfoPlist.strings b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/en.lproj/GitLab iOS-InfoPlist.strings
new file mode 100644
index 0000000..6fadf63
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/en.lproj/GitLab iOS-InfoPlist.strings
@@ -0,0 +1,4 @@
+/* Bundle display name */
+"CFBundleDisplayName" = "GitLab";
+/* Bundle name */
+"CFBundleName" = "GitLab iOS";
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/en.lproj/Localizable.strings b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/en.lproj/Localizable.strings
new file mode 100644
index 0000000..518da18
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab iOS/en.lproj/Localizable.strings
@@ -0,0 +1,171 @@
+/* No comment provided by engineer. */
+" " = " ";
+
+/* No comment provided by engineer. */
+"%@" = "%@";
+
+/* No comment provided by engineer. */
+"%lld" = "%lld";
+
+/* No comment provided by engineer. */
+"%lld discussions" = "%lld discussions";
+
+/* No comment provided by engineer. */
+"Account" = "Account";
+
+/* No comment provided by engineer. */
+"Active:" = "Active:";
+
+/* No comment provided by engineer. */
+"Add Account" = "Add Account";
+
+/* No comment provided by engineer. */
+"Add your GitLab Account" = "Add your GitLab Account";
+
+/* No comment provided by engineer. */
+"Approved" = "Approved";
+
+/* No comment provided by engineer. */
+"Base URL" = "Base URL";
+
+/* No comment provided by engineer. */
+"Cancel" = "Cancel";
+
+/* No comment provided by engineer. */
+"CI canceled" = "CI canceled";
+
+/* No comment provided by engineer. */
+"CI Created" = "CI Created";
+
+/* No comment provided by engineer. */
+"CI Failed" = "CI Failed";
+
+/* No comment provided by engineer. */
+"CI in progress" = "CI in progress";
+
+/* No comment provided by engineer. */
+"CI pipeline pending" = "CI pipeline pending";
+
+/* No comment provided by engineer. */
+"CI pipeline preparing" = "CI pipeline preparing";
+
+/* No comment provided by engineer. */
+"CI pipeline scheduled" = "CI pipeline scheduled";
+
+/* No comment provided by engineer. */
+"CI pipeline waiting for resources" = "CI pipeline waiting for resources";
+
+/* No comment provided by engineer. */
+"CI Success" = "CI Success";
+
+/* No comment provided by engineer. */
+"CI Warning" = "CI Warning";
+
+/* No comment provided by engineer. */
+"Close" = "Close";
+
+/* No comment provided by engineer. */
+"Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with." = "Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with.";
+
+/* No comment provided by engineer. */
+"Create merge request" = "Create merge request";
+
+/* No comment provided by engineer. */
+"Created at:" = "Created at:";
+
+/* No comment provided by engineer. */
+"Delete" = "Delete";
+
+/* No comment provided by engineer. */
+"Dismiss" = "Dismiss";
+
+/* No comment provided by engineer. */
+"Done" = "Done";
+
+/* No comment provided by engineer. */
+"Draft" = "Draft";
+
+/* No comment provided by engineer. */
+"Enter token here..." = "Enter token here...";
+
+/* No comment provided by engineer. */
+"Expires at:" = "Expires at:";
+
+/* No comment provided by engineer. */
+"Failed" = "Failed";
+
+/* No comment provided by engineer. */
+"GitLab Token" = "GitLab Token";
+
+/* No comment provided by engineer. */
+"https://www.gitlab.com" = "https://www.gitlab.com";
+
+/* No comment provided by engineer. */
+"Last updated at: 19 September 2022 at 12:43" = "Last updated at: 19 September 2022 at 12:43";
+
+/* No comment provided by engineer. */
+"Last used at:" = "Last used at:";
+
+/* No comment provided by engineer. */
+"Manual CI step" = "Manual CI step";
+
+/* No comment provided by engineer. */
+"Merge request approved" = "Merge request approved";
+
+/* No comment provided by engineer. */
+"Merge Train 🚂" = "Merge Train 🚂";
+
+/* No comment provided by engineer. */
+"Name:" = "Name:";
+
+/* No comment provided by engineer. */
+"Needs Review" = "Needs Review";
+
+/* No comment provided by engineer. */
+"Remove %@" = "Remove %@";
+
+/* No comment provided by engineer. */
+"Retry CI pipeline" = "Retry CI pipeline";
+
+/* No comment provided by engineer. */
+"Review requested" = "Review requested";
+
+/* No comment provided by engineer. */
+"Revoked:" = "Revoked:";
+
+/* No comment provided by engineer. */
+"Save" = "Save";
+
+/* No comment provided by engineer. */
+"Scopes:" = "Scopes:";
+
+/* No comment provided by engineer. */
+"sdf" = "sdf";
+
+/* No comment provided by engineer. */
+"Settings" = "Settings";
+
+/* No comment provided by engineer. */
+"Share" = "Share";
+
+/* No comment provided by engineer. */
+"Skipped CI step" = "Skipped CI step";
+
+/* No comment provided by engineer. */
+"Submit" = "Submit";
+
+/* No comment provided by engineer. */
+"This %@ account will be removed immediatly. You can't undo this action." = "This %@ account will be removed immediatly. You can't undo this action.";
+
+/* No comment provided by engineer. */
+"Too much discussions" = "Too much discussions";
+
+/* No comment provided by engineer. */
+"updating" = "updating";
+
+/* No comment provided by engineer. */
+"Validating..." = "Validating...";
+
+/* No comment provided by engineer. */
+"Your Merge Requests" = "Your Merge Requests";
+
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab/Assets.xcassets/AccentColor.colorset/Contents.json b/GitLab Localizations/en.xcloc/Source Contents/GitLab/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..4866dbd
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,14 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "properties" : {
+ "localizable" : true
+ },
+ "info" : {
+ "version" : 1,
+ "author" : "xcode"
+ }
+}
\ No newline at end of file
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab/Assets.xcassets/Contents.json b/GitLab Localizations/en.xcloc/Source Contents/GitLab/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..8cbf8bf
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab/Assets.xcassets/Contents.json
@@ -0,0 +1,9 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ },
+ "properties" : {
+ "compression-type" : "gpu-optimized-best"
+ }
+}
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab/en.lproj/InfoPlist.strings b/GitLab Localizations/en.xcloc/Source Contents/GitLab/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..01c9efd
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab/en.lproj/InfoPlist.strings
@@ -0,0 +1,2 @@
+/* Bundle name */
+"CFBundleName" = "GitLab";
diff --git a/GitLab Localizations/en.xcloc/Source Contents/GitLab/en.lproj/Localizable.strings b/GitLab Localizations/en.xcloc/Source Contents/GitLab/en.lproj/Localizable.strings
new file mode 100644
index 0000000..dade906
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/GitLab/en.lproj/Localizable.strings
@@ -0,0 +1,96 @@
+/* No comment provided by engineer. */
+" " = " ";
+
+/* No comment provided by engineer. */
+"%@" = "%@";
+
+/* No comment provided by engineer. */
+"Account" = "Account";
+
+/* No comment provided by engineer. */
+"Active:" = "Active:";
+
+/* No comment provided by engineer. */
+"Add your GitLab Account" = "Add your GitLab Account";
+
+/* No comment provided by engineer. */
+"Approved" = "Approved";
+
+/* No comment provided by engineer. */
+"Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with." = "Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with.";
+
+/* No comment provided by engineer. */
+"Created at:" = "Created at:";
+
+/* No comment provided by engineer. */
+"Draft" = "Draft";
+
+/* No comment provided by engineer. */
+"Enter token here..." = "Enter token here...";
+
+/* No comment provided by engineer. */
+"Expires at:" = "Expires at:";
+
+/* No comment provided by engineer. */
+"Failed" = "Failed";
+
+/* No comment provided by engineer. */
+"GitLab Desktop" = "GitLab Desktop";
+
+/* No comment provided by engineer. */
+"https://www.gitlab.com" = "https://www.gitlab.com";
+
+/* No comment provided by engineer. */
+"Last updated at: 19 September 2022 at 12:43" = "Last updated at: 19 September 2022 at 12:43";
+
+/* No comment provided by engineer. */
+"Last used at:" = "Last used at:";
+
+/* No comment provided by engineer. */
+"Merge Train 🚂" = "Merge Train 🚂";
+
+/* No comment provided by engineer. */
+"Name:" = "Name:";
+
+/* No comment provided by engineer. */
+"Needs Review" = "Needs Review";
+
+/* No comment provided by engineer. */
+"Quit" = "Quit";
+
+/* No comment provided by engineer. */
+"Remove %@" = "Remove %@";
+
+/* No comment provided by engineer. */
+"Review requested" = "Review requested";
+
+/* No comment provided by engineer. */
+"Revoked:" = "Revoked:";
+
+/* No comment provided by engineer. */
+"Save" = "Save";
+
+/* No comment provided by engineer. */
+"Scopes:" = "Scopes:";
+
+/* No comment provided by engineer. */
+"sdf" = "sdf";
+
+/* No comment provided by engineer. */
+"Share" = "Share";
+
+/* No comment provided by engineer. */
+"Submit" = "Submit";
+
+/* No comment provided by engineer. */
+"This %@ account will be removed immediatly. You can't undo this action." = "This %@ account will be removed immediatly. You can't undo this action.";
+
+/* No comment provided by engineer. */
+"updating" = "updating";
+
+/* No comment provided by engineer. */
+"Validating..." = "Validating...";
+
+/* No comment provided by engineer. */
+"Your Merge Requests" = "Your Merge Requests";
+
diff --git a/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/Base.lproj/MainInterface.storyboard b/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/Base.lproj/MainInterface.storyboard
new file mode 100644
index 0000000..0018c11
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/Base.lproj/MainInterface.storyboard
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/en.lproj/InfoPlist.strings b/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/en.lproj/InfoPlist.strings
new file mode 100644
index 0000000..9336756
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/en.lproj/InfoPlist.strings
@@ -0,0 +1,6 @@
+/* Bundle display name */
+"CFBundleDisplayName" = "NotificationContent";
+/* Bundle name */
+"CFBundleName" = "NotificationContent";
+/* Copyright (human-readable) */
+"NSHumanReadableCopyright" = "";
diff --git a/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/en.lproj/Localizable.strings b/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/en.lproj/Localizable.strings
new file mode 100644
index 0000000..8344a88
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/Source Contents/NotificationContent/en.lproj/Localizable.strings
@@ -0,0 +1,165 @@
+/* No comment provided by engineer. */
+" " = " ";
+
+/* No comment provided by engineer. */
+"%@" = "%@";
+
+/* No comment provided by engineer. */
+"%lld" = "%lld";
+
+/* No comment provided by engineer. */
+"%lld discussions" = "%lld discussions";
+
+/* No comment provided by engineer. */
+"Account" = "Account";
+
+/* No comment provided by engineer. */
+"Active:" = "Active:";
+
+/* No comment provided by engineer. */
+"Add Account" = "Add Account";
+
+/* No comment provided by engineer. */
+"Add your GitLab Account" = "Add your GitLab Account";
+
+/* No comment provided by engineer. */
+"Approved" = "Approved";
+
+/* No comment provided by engineer. */
+"Base URL" = "Base URL";
+
+/* No comment provided by engineer. */
+"CI canceled" = "CI canceled";
+
+/* No comment provided by engineer. */
+"CI Created" = "CI Created";
+
+/* No comment provided by engineer. */
+"CI Failed" = "CI Failed";
+
+/* No comment provided by engineer. */
+"CI in progress" = "CI in progress";
+
+/* No comment provided by engineer. */
+"CI pipeline pending" = "CI pipeline pending";
+
+/* No comment provided by engineer. */
+"CI pipeline preparing" = "CI pipeline preparing";
+
+/* No comment provided by engineer. */
+"CI pipeline scheduled" = "CI pipeline scheduled";
+
+/* No comment provided by engineer. */
+"CI pipeline waiting for resources" = "CI pipeline waiting for resources";
+
+/* No comment provided by engineer. */
+"CI Success" = "CI Success";
+
+/* No comment provided by engineer. */
+"CI Warning" = "CI Warning";
+
+/* No comment provided by engineer. */
+"Close" = "Close";
+
+/* No comment provided by engineer. */
+"Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with." = "Create a read-only GitLab [access-token](https://gitlab.com/-/profile/personal_access_tokens) that the app can use to query the API with.";
+
+/* No comment provided by engineer. */
+"Create merge request" = "Create merge request";
+
+/* No comment provided by engineer. */
+"Created at:" = "Created at:";
+
+/* No comment provided by engineer. */
+"Delete" = "Delete";
+
+/* No comment provided by engineer. */
+"Dismiss" = "Dismiss";
+
+/* No comment provided by engineer. */
+"Draft" = "Draft";
+
+/* No comment provided by engineer. */
+"Enter token here..." = "Enter token here...";
+
+/* No comment provided by engineer. */
+"Expires at:" = "Expires at:";
+
+/* No comment provided by engineer. */
+"Failed" = "Failed";
+
+/* No comment provided by engineer. */
+"GitLab Token" = "GitLab Token";
+
+/* No comment provided by engineer. */
+"https://www.gitlab.com" = "https://www.gitlab.com";
+
+/* No comment provided by engineer. */
+"Last updated at: 19 September 2022 at 12:43" = "Last updated at: 19 September 2022 at 12:43";
+
+/* No comment provided by engineer. */
+"Last used at:" = "Last used at:";
+
+/* No comment provided by engineer. */
+"Manual CI step" = "Manual CI step";
+
+/* No comment provided by engineer. */
+"Merge request approved" = "Merge request approved";
+
+/* No comment provided by engineer. */
+"Merge Train 🚂" = "Merge Train 🚂";
+
+/* No comment provided by engineer. */
+"Name:" = "Name:";
+
+/* No comment provided by engineer. */
+"Needs Review" = "Needs Review";
+
+/* No comment provided by engineer. */
+"Quit" = "Quit";
+
+/* No comment provided by engineer. */
+"Remove %@" = "Remove %@";
+
+/* No comment provided by engineer. */
+"Retry CI pipeline" = "Retry CI pipeline";
+
+/* No comment provided by engineer. */
+"Review requested" = "Review requested";
+
+/* No comment provided by engineer. */
+"Revoked:" = "Revoked:";
+
+/* No comment provided by engineer. */
+"Save" = "Save";
+
+/* No comment provided by engineer. */
+"Scopes:" = "Scopes:";
+
+/* No comment provided by engineer. */
+"Settings" = "Settings";
+
+/* No comment provided by engineer. */
+"Share" = "Share";
+
+/* No comment provided by engineer. */
+"Skipped CI step" = "Skipped CI step";
+
+/* No comment provided by engineer. */
+"Submit" = "Submit";
+
+/* No comment provided by engineer. */
+"This %@ account will be removed immediatly. You can't undo this action." = "This %@ account will be removed immediatly. You can't undo this action.";
+
+/* No comment provided by engineer. */
+"Too much discussions" = "Too much discussions";
+
+/* No comment provided by engineer. */
+"updating" = "updating";
+
+/* No comment provided by engineer. */
+"Validating..." = "Validating...";
+
+/* No comment provided by engineer. */
+"Your Merge Requests" = "Your Merge Requests";
+
diff --git a/GitLab Localizations/en.xcloc/contents.json b/GitLab Localizations/en.xcloc/contents.json
new file mode 100644
index 0000000..99df9a6
--- /dev/null
+++ b/GitLab Localizations/en.xcloc/contents.json
@@ -0,0 +1,12 @@
+{
+ "developmentRegion" : "en",
+ "project" : "GitLab.xcodeproj",
+ "targetLocale" : "en",
+ "toolInfo" : {
+ "toolBuildNumber" : "16A242d",
+ "toolID" : "com.apple.dt.xcode",
+ "toolName" : "Xcode",
+ "toolVersion" : "16.0"
+ },
+ "version" : "1.0"
+}
\ No newline at end of file
diff --git a/GitLab.xcodeproj/project.pbxproj b/GitLab.xcodeproj/project.pbxproj
index d3a7fd6..d90e34e 100644
--- a/GitLab.xcodeproj/project.pbxproj
+++ b/GitLab.xcodeproj/project.pbxproj
@@ -75,7 +75,6 @@
8A7935ED2A5583E400F8FB6C /* ExpandHitBoxModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D122A55817400819B80 /* ExpandHitBoxModifier.swift */; };
8A7935EE2A5583E400F8FB6C /* LastUpdateMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D132A55817400819B80 /* LastUpdateMessageView.swift */; };
8A7935EF2A5583E400F8FB6C /* MergeStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D142A55817400819B80 /* MergeStatusView.swift */; };
- 8A7935F02A5583E400F8FB6C /* LastUpdateMessagePlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D152A55817400819B80 /* LastUpdateMessagePlaceholderView.swift */; };
8A7935F12A5583E400F8FB6C /* CIStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D162A55817400819B80 /* CIStatusView.swift */; };
8A7935F22A5583E400F8FB6C /* MergeRequestLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D172A55817400819B80 /* MergeRequestLabelView.swift */; };
8A7935F32A5583E400F8FB6C /* TitleWebLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D1A2A55817400819B80 /* TitleWebLink.swift */; };
@@ -87,6 +86,10 @@
8A7935F92A5583E400F8FB6C /* LaunchpadItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D202A55817400819B80 /* LaunchpadItem.swift */; };
8A7935FB2A5583F700F8FB6C /* Get in Frameworks */ = {isa = PBXBuildFile; productRef = 8A7935FA2A5583F700F8FB6C /* Get */; };
8A7935FD2A5583FA00F8FB6C /* CachedAsyncImage in Frameworks */ = {isa = PBXBuildFile; productRef = 8A7935FC2A5583FA00F8FB6C /* CachedAsyncImage */; };
+ 8A91E2172CB7B68900BE51B9 /* UserAvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A91E2162CB7B68900BE51B9 /* UserAvatarView.swift */; };
+ 8A91E2182CB7B68900BE51B9 /* UserAvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A91E2162CB7B68900BE51B9 /* UserAvatarView.swift */; };
+ 8A91E2192CB7B68900BE51B9 /* UserAvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A91E2162CB7B68900BE51B9 /* UserAvatarView.swift */; };
+ 8A91E21A2CB7B68900BE51B9 /* UserAvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A91E2162CB7B68900BE51B9 /* UserAvatarView.swift */; };
8A9D878A2BD2736C00E2C0CD /* ProjectLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9D87892BD2736C00E2C0CD /* ProjectLink.swift */; };
8A9D878B2BD2736C00E2C0CD /* ProjectLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9D87892BD2736C00E2C0CD /* ProjectLink.swift */; };
8A9D878C2BD2736C00E2C0CD /* ProjectLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8A9D87892BD2736C00E2C0CD /* ProjectLink.swift */; };
@@ -127,9 +130,6 @@
8ADD57102B8220D3001F8E8F /* ModelContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADD570F2B8220D3001F8E8F /* ModelContainer.swift */; };
8ADD57112B8220D3001F8E8F /* ModelContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADD570F2B8220D3001F8E8F /* ModelContainer.swift */; };
8ADD57122B8220D3001F8E8F /* ModelContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADD570F2B8220D3001F8E8F /* ModelContainer.swift */; };
- 8ADD57152B82291B001F8E8F /* WidgetInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADD57142B82291B001F8E8F /* WidgetInterface.swift */; };
- 8ADD57162B82291B001F8E8F /* WidgetInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADD57142B82291B001F8E8F /* WidgetInterface.swift */; };
- 8ADD57172B82291B001F8E8F /* WidgetInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADD57142B82291B001F8E8F /* WidgetInterface.swift */; };
8ADEBF9E2A83A227007C22CD /* URL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADEBF9D2A83A227007C22CD /* URL.swift */; };
8ADEBF9F2A83A227007C22CD /* URL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADEBF9D2A83A227007C22CD /* URL.swift */; };
8AE024DB2A92457C000548D7 /* Get in Frameworks */ = {isa = PBXBuildFile; productRef = 8AE024DA2A92457C000548D7 /* Get */; };
@@ -143,7 +143,6 @@
8AE8A6EF2B989E9A002B3C9E /* DesktopWidgetTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE8A6EE2B989E9A002B3C9E /* DesktopWidgetTool.swift */; };
8AE8A6F12B989E9B002B3C9E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8AE8A6F02B989E9B002B3C9E /* Assets.xcassets */; };
8AE8A6F62B989E9B002B3C9E /* DesktopWidgetToolExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 8AE8A6E82B989E9A002B3C9E /* DesktopWidgetToolExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
- 8AE8A6FA2B989EFA002B3C9E /* WidgetInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8ADD57142B82291B001F8E8F /* WidgetInterface.swift */; };
8AE8A6FB2B989EFA002B3C9E /* GitProviderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AFDAAC82A85112E001937AC /* GitProviderView.swift */; };
8AE8A6FC2B989EFA002B3C9E /* NoticeType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80CF22A55817400819B80 /* NoticeType.swift */; };
8AE8A6FD2B989EFA002B3C9E /* ApprovedReviewIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80CFA2A55817400819B80 /* ApprovedReviewIcon.swift */; };
@@ -190,7 +189,6 @@
8AE8A7262B989EFA002B3C9E /* TokenInformationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AC0C20D2A5D51FA0096772B /* TokenInformationView.swift */; };
8AE8A7272B989EFA002B3C9E /* CIManualIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80CF62A55817400819B80 /* CIManualIcon.swift */; };
8AE8A7282B989EFA002B3C9E /* CISuccessIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80CFB2A55817400819B80 /* CISuccessIcon.swift */; };
- 8AE8A7292B989EFA002B3C9E /* LastUpdateMessagePlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D152A55817400819B80 /* LastUpdateMessagePlaceholderView.swift */; };
8AE8A72A2B989EFA002B3C9E /* ExpandHitBoxModifier.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D122A55817400819B80 /* ExpandHitBoxModifier.swift */; };
8AE8A72B2B989EFA002B3C9E /* KeyedDecodingContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AE7A3D62A83A3FF0004506F /* KeyedDecodingContainer.swift */; };
8AE8A72C2B989EFA002B3C9E /* NetworkReachability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80CEF2A55817400819B80 /* NetworkReachability.swift */; };
@@ -307,8 +305,6 @@
8AF80DAC2A55817400819B80 /* LastUpdateMessageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D132A55817400819B80 /* LastUpdateMessageView.swift */; };
8AF80DAE2A55817400819B80 /* MergeStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D142A55817400819B80 /* MergeStatusView.swift */; };
8AF80DAF2A55817400819B80 /* MergeStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D142A55817400819B80 /* MergeStatusView.swift */; };
- 8AF80DB12A55817400819B80 /* LastUpdateMessagePlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D152A55817400819B80 /* LastUpdateMessagePlaceholderView.swift */; };
- 8AF80DB22A55817400819B80 /* LastUpdateMessagePlaceholderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D152A55817400819B80 /* LastUpdateMessagePlaceholderView.swift */; };
8AF80DB42A55817400819B80 /* CIStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D162A55817400819B80 /* CIStatusView.swift */; };
8AF80DB52A55817400819B80 /* CIStatusView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D162A55817400819B80 /* CIStatusView.swift */; };
8AF80DB72A55817400819B80 /* MergeRequestLabelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8AF80D172A55817400819B80 /* MergeRequestLabelView.swift */; };
@@ -472,6 +468,8 @@
8A5FC11A26EFD08F004136AB /* GitLabUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitLabUITests.swift; sourceTree = ""; };
8A5FC11C26EFD08F004136AB /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
8A7FBF6729C3326D0032E394 /* GitLabAPIService.xpc */ = {isa = PBXFileReference; explicitFileType = "wrapper.xpc-service"; path = GitLabAPIService.xpc; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8A91E2142CB7B5FE00BE51B9 /* en.xcloc */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = en.xcloc; sourceTree = ""; };
+ 8A91E2162CB7B68900BE51B9 /* UserAvatarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserAvatarView.swift; sourceTree = ""; };
8A9D87892BD2736C00E2C0CD /* ProjectLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProjectLink.swift; sourceTree = ""; };
8A9D878E2BD2786E00E2C0CD /* AutoSizingWebLinks.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoSizingWebLinks.swift; sourceTree = ""; };
8AB969012BDBC0210078E5CD /* ExtraLargeMergeRequestWidgetInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtraLargeMergeRequestWidgetInterface.swift; sourceTree = ""; };
@@ -494,7 +492,6 @@
8ADD57052B821964001F8E8F /* PlainMergeRequestList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlainMergeRequestList.swift; sourceTree = ""; };
8ADD570A2B82197C001F8E8F /* SectionedMergeRequestList.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SectionedMergeRequestList.swift; sourceTree = ""; };
8ADD570F2B8220D3001F8E8F /* ModelContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ModelContainer.swift; sourceTree = ""; };
- 8ADD57142B82291B001F8E8F /* WidgetInterface.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = WidgetInterface.swift; path = Views/WidgetInterface.swift; sourceTree = ""; };
8ADEBF9D2A83A227007C22CD /* URL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URL.swift; sourceTree = ""; };
8AE0248A2A91128C000548D7 /* GitLabDesktopWidgetBundle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitLabDesktopWidgetBundle.swift; sourceTree = ""; };
8AE0248C2A91128C000548D7 /* GitLabDesktopWidget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GitLabDesktopWidget.swift; sourceTree = ""; };
@@ -553,7 +550,6 @@
8AF80D122A55817400819B80 /* ExpandHitBoxModifier.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExpandHitBoxModifier.swift; sourceTree = ""; };
8AF80D132A55817400819B80 /* LastUpdateMessageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LastUpdateMessageView.swift; sourceTree = ""; };
8AF80D142A55817400819B80 /* MergeStatusView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MergeStatusView.swift; sourceTree = ""; };
- 8AF80D152A55817400819B80 /* LastUpdateMessagePlaceholderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LastUpdateMessagePlaceholderView.swift; sourceTree = ""; };
8AF80D162A55817400819B80 /* CIStatusView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIStatusView.swift; sourceTree = ""; };
8AF80D172A55817400819B80 /* MergeRequestLabelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MergeRequestLabelView.swift; sourceTree = ""; };
8AF80D192A55817400819B80 /* CIJobsNotificationView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIJobsNotificationView.swift; sourceTree = ""; };
@@ -726,6 +722,7 @@
8A5FC0ED26EFD08E004136AB = {
isa = PBXGroup;
children = (
+ 8A91E2152CB7B5FE00BE51B9 /* GitLab Localizations */,
8A13B85D2A66A3E30090A6D9 /* Credits.rtf */,
8AF80BE92A5580E700819B80 /* Shared */,
8A07E5672890492C0042EACB /* README.md */,
@@ -808,6 +805,14 @@
path = Extensions;
sourceTree = "";
};
+ 8A91E2152CB7B5FE00BE51B9 /* GitLab Localizations */ = {
+ isa = PBXGroup;
+ children = (
+ 8A91E2142CB7B5FE00BE51B9 /* en.xcloc */,
+ );
+ path = "GitLab Localizations";
+ sourceTree = "";
+ };
8AB968FF2BDBBFE60078E5CD /* MergeRequestWiget */ = {
isa = PBXGroup;
children = (
@@ -880,13 +885,13 @@
8AF80CDE2A55817400819B80 /* UserInterface */ = {
isa = PBXGroup;
children = (
+ 8A91E2162CB7B68900BE51B9 /* UserAvatarView.swift */,
8AFF87ED2BDA711500D21D16 /* EnvironmentValues */,
8AFDAA962A84FAED001937AC /* SwiftData */,
8A63DE6F2A83A1FC002DD636 /* Extensions */,
8AF80CDF2A55817400819B80 /* Models */,
8AF80CF42A55817400819B80 /* Icons */,
8AF80D062A55817400819B80 /* UserInterface.swift */,
- 8ADD57142B82291B001F8E8F /* WidgetInterface.swift */,
8A2E61842A9766A6001B6EAE /* MainGitLabView.swift */,
8AF80D072A55817400819B80 /* Views */,
);
@@ -963,7 +968,6 @@
8AF80D122A55817400819B80 /* ExpandHitBoxModifier.swift */,
8AF80D132A55817400819B80 /* LastUpdateMessageView.swift */,
8AF80D142A55817400819B80 /* MergeStatusView.swift */,
- 8AF80D152A55817400819B80 /* LastUpdateMessagePlaceholderView.swift */,
8AF80D162A55817400819B80 /* CIStatusView.swift */,
8AF80D172A55817400819B80 /* MergeRequestLabelView.swift */,
8AF80D182A55817400819B80 /* NotificationViews */,
@@ -1347,7 +1351,6 @@
8AF80D792A55817400819B80 /* CIPendingIcon.swift in Sources */,
8AF80D372A55817400819B80 /* Structs.swift in Sources */,
8AF80D7F2A55817400819B80 /* ShareMergeRequestIcon.swift in Sources */,
- 8ADD57162B82291B001F8E8F /* WidgetInterface.swift in Sources */,
8AE024DE2A92471A000548D7 /* KeyedDecodingContainer.swift in Sources */,
8AF80D9A2A55817400819B80 /* AccountSettingsView.swift in Sources */,
8A9D878B2BD2736C00E2C0CD /* ProjectLink.swift in Sources */,
@@ -1359,7 +1362,6 @@
8AFF87F02BDA713800D21D16 /* IsInWidget.swift in Sources */,
8AFDAACA2A85112E001937AC /* GitProviderView.swift in Sources */,
8AF80DCD2A55817400819B80 /* MenuBarButtonStyle.swift in Sources */,
- 8AF80DB22A55817400819B80 /* LastUpdateMessagePlaceholderView.swift in Sources */,
8AF80D702A55817400819B80 /* CIWaitingForResourceIcon.swift in Sources */,
8AFDAABE2A850763001937AC /* AddAccountView.swift in Sources */,
8AF80D8B2A55817400819B80 /* CIProgressIcon.swift in Sources */,
@@ -1397,6 +1399,7 @@
8AF80D882A55817400819B80 /* MergeTrainIcon.swift in Sources */,
8AF80D7C2A55817400819B80 /* CIRetryIcon.swift in Sources */,
8AF80D5B2A55817400819B80 /* CISkippedIcon.swift in Sources */,
+ 8A91E2182CB7B68900BE51B9 /* UserAvatarView.swift in Sources */,
8AF80DAF2A55817400819B80 /* MergeStatusView.swift in Sources */,
8AF80D2E2A55817400819B80 /* NetworkManager+fetchReviewRequestedMergeRequests.swift in Sources */,
8ADD57112B8220D3001F8E8F /* ModelContainer.swift in Sources */,
@@ -1436,6 +1439,7 @@
files = (
8A7935C12A5583E400F8FB6C /* NetworkManager+repoLaunchPad.swift in Sources */,
8A7935C22A5583E400F8FB6C /* LaunchpadState.swift in Sources */,
+ 8A91E2172CB7B68900BE51B9 /* UserAvatarView.swift in Sources */,
8A7935C32A5583E400F8FB6C /* PushEvents.swift in Sources */,
8A7935C42A5583E400F8FB6C /* NetworkManager+fetchLatestBranchPush.swift in Sources */,
8A7935C52A5583E400F8FB6C /* NetworkManager+fetchReviewRequestedMergeRequests.swift in Sources */,
@@ -1475,7 +1479,6 @@
8AFDAACB2A85112E001937AC /* GitProviderView.swift in Sources */,
8A7935DF2A5583E400F8FB6C /* ShareMergeRequestIcon.swift in Sources */,
8AFAE1942BEB7C1C0030541E /* MergeRequestList.swift in Sources */,
- 8ADD57172B82291B001F8E8F /* WidgetInterface.swift in Sources */,
8A7935E02A5583E400F8FB6C /* CICreatedIcon.swift in Sources */,
8A7935E12A5583E400F8FB6C /* NeedsReviewIcon.swift in Sources */,
8A2E61872A9766A6001B6EAE /* MainGitLabView.swift in Sources */,
@@ -1496,7 +1499,6 @@
8A7935ED2A5583E400F8FB6C /* ExpandHitBoxModifier.swift in Sources */,
8A7935EE2A5583E400F8FB6C /* LastUpdateMessageView.swift in Sources */,
8A7935EF2A5583E400F8FB6C /* MergeStatusView.swift in Sources */,
- 8A7935F02A5583E400F8FB6C /* LastUpdateMessagePlaceholderView.swift in Sources */,
8A7935F12A5583E400F8FB6C /* CIStatusView.swift in Sources */,
8A7935F22A5583E400F8FB6C /* MergeRequestLabelView.swift in Sources */,
8A7935F32A5583E400F8FB6C /* TitleWebLink.swift in Sources */,
@@ -1519,8 +1521,8 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 8AF80DB12A55817400819B80 /* LastUpdateMessagePlaceholderView.swift in Sources */,
8AF80D722A55817400819B80 /* DiscussionCountIcon.swift in Sources */,
+ 8A91E2192CB7B68900BE51B9 /* UserAvatarView.swift in Sources */,
8AF80D812A55817400819B80 /* CICreatedIcon.swift in Sources */,
8AF80D842A55817400819B80 /* NeedsReviewIcon.swift in Sources */,
8AF80DA52A55817400819B80 /* PipelineView.swift in Sources */,
@@ -1560,7 +1562,6 @@
8AF80D8D2A55817400819B80 /* UserInterface.swift in Sources */,
8AF80D5A2A55817400819B80 /* CISkippedIcon.swift in Sources */,
8AFAE1922BEB7C1C0030541E /* MergeRequestList.swift in Sources */,
- 8ADD57152B82291B001F8E8F /* WidgetInterface.swift in Sources */,
8A0CDABB2A55932E0056B63F /* CIJobsNotificationView.swift in Sources */,
8AF80D602A55817400819B80 /* CICanceledIcon.swift in Sources */,
8A2E61852A9766A6001B6EAE /* MainGitLabView.swift in Sources */,
@@ -1620,7 +1621,6 @@
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 8AE8A6FA2B989EFA002B3C9E /* WidgetInterface.swift in Sources */,
8AE8A6FB2B989EFA002B3C9E /* GitProviderView.swift in Sources */,
8AE8A6FC2B989EFA002B3C9E /* NoticeType.swift in Sources */,
8AE8A6FD2B989EFA002B3C9E /* ApprovedReviewIcon.swift in Sources */,
@@ -1678,7 +1678,6 @@
8AE8A7262B989EFA002B3C9E /* TokenInformationView.swift in Sources */,
8AE8A7272B989EFA002B3C9E /* CIManualIcon.swift in Sources */,
8AE8A7282B989EFA002B3C9E /* CISuccessIcon.swift in Sources */,
- 8AE8A7292B989EFA002B3C9E /* LastUpdateMessagePlaceholderView.swift in Sources */,
8AE8A72A2B989EFA002B3C9E /* ExpandHitBoxModifier.swift in Sources */,
8AE8A72B2B989EFA002B3C9E /* KeyedDecodingContainer.swift in Sources */,
8AE8A72C2B989EFA002B3C9E /* NetworkReachability.swift in Sources */,
@@ -1706,6 +1705,7 @@
8AE8A73D2B989EFA002B3C9E /* RefreshStatus.swift in Sources */,
8AE8A73E2B989EFA002B3C9E /* CIJobsNotificationView.swift in Sources */,
8AB969242BDBC25E0078E5CD /* SmallLaunchPadWidgetView.swift in Sources */,
+ 8A91E21A2CB7B68900BE51B9 /* UserAvatarView.swift in Sources */,
8AE8A6EF2B989E9A002B3C9E /* DesktopWidgetTool.swift in Sources */,
8AE8A6ED2B989E9A002B3C9E /* DesktopWidgetToolBundle.swift in Sources */,
);
diff --git a/Shared/UserInterface/Icons/ApprovedReviewIcon.swift b/Shared/UserInterface/Icons/ApprovedReviewIcon.swift
index e7fec87..64a15d3 100644
--- a/Shared/UserInterface/Icons/ApprovedReviewIcon.swift
+++ b/Shared/UserInterface/Icons/ApprovedReviewIcon.swift
@@ -13,48 +13,6 @@ typealias PlatformImage = NSImage
import SwiftUI
-struct UserAvatarView: View {
- let author: Author
- let account: Account?
-
- @Environment(\.isInWidget) private var isInWidget
-
- var body: some View {
- VStack {
- // TODO: ios support
- // TODO: cache data fetch response
- if isInWidget, let avatarUrl = author.avatarUrl, let data = try? Data(contentsOf: avatarUrl), let image = PlatformImage(data: data) {
-#if os(iOS)
- Image(uiImage: image)
- .resizable()
-#elseif os(macOS)
- Image(nsImage: image)
- .resizable()
-#endif
-
- } else
- // Previously we used account.instace to create the base url
- if let avatarUrl = author.avatarUrl {
- AsyncImage(url: avatarUrl) { image in
- image.resizable()
- } placeholder: {
- Image(systemName: "person.circle.fill")
- .symbolRenderingMode(.hierarchical)
- .foregroundColor(.secondary)
- .font(.system(size: 14))
- }
- }
- }
- .aspectRatio(contentMode: .fill)
- .clipShape(Circle())
- .frame(width: 14, height: 14)
- .help(author.username ?? "")
- }
-}
-
-#Preview {
- UserAvatarView(author: .preview, account: .preview)
-}
struct ApprovedReviewIcon: View {
var approvedBy: [Author]
@@ -82,7 +40,7 @@ struct ApprovedReviewIcon: View {
.opacity(0.3)
)
.padding(1)
- .help("Merge request approved")
+ .help(String(localized: "Merge request approved"))
}
/// TODO: Diff in style from CI completed check circle
@@ -91,7 +49,7 @@ struct ApprovedReviewIcon: View {
.symbolRenderingMode(.hierarchical)
.foregroundColor(.green)
.font(.system(size: 18))
- .help("Merge request approved")
+ .help(String(localized: "Merge request approved"))
.clipShape(Rectangle())
// .frame(width: 20, height: 20)
}
diff --git a/Shared/UserInterface/Icons/CICanceledIcon.swift b/Shared/UserInterface/Icons/CICanceledIcon.swift
index bce1179..dbfcabe 100644
--- a/Shared/UserInterface/Icons/CICanceledIcon.swift
+++ b/Shared/UserInterface/Icons/CICanceledIcon.swift
@@ -12,7 +12,7 @@ struct CICanceledIcon: View {
Image(systemName: "circle.slash")
.foregroundColor(.gray)
.font(.system(size: 18))
- .help("CI canceled")
+ .help(String(localized: "CI canceled"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CICreatedIcon.swift b/Shared/UserInterface/Icons/CICreatedIcon.swift
index c44c67f..7418e44 100644
--- a/Shared/UserInterface/Icons/CICreatedIcon.swift
+++ b/Shared/UserInterface/Icons/CICreatedIcon.swift
@@ -13,7 +13,7 @@ struct CICreatedIcon: View {
.foregroundColor(.secondary)
.symbolRenderingMode(.hierarchical)
.font(.system(size: 18))
- .help("CI Created")
+ .help(String(localized: "CI Created"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIFailedIcon.swift b/Shared/UserInterface/Icons/CIFailedIcon.swift
index 4b38264..eff14a2 100644
--- a/Shared/UserInterface/Icons/CIFailedIcon.swift
+++ b/Shared/UserInterface/Icons/CIFailedIcon.swift
@@ -12,7 +12,7 @@ struct CIFailedIcon: View {
Image(systemName: "exclamationmark.circle")
.foregroundColor(.red)
.font(.system(size: 18))
- .help("CI Failed")
+ .help(String(localized: "CI Failed"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIManualIcon.swift b/Shared/UserInterface/Icons/CIManualIcon.swift
index 4ee4ff7..e1bcd4d 100644
--- a/Shared/UserInterface/Icons/CIManualIcon.swift
+++ b/Shared/UserInterface/Icons/CIManualIcon.swift
@@ -12,7 +12,7 @@ struct CIManualIcon: View {
Image(systemName: "gearshape.circle")
.foregroundColor(.secondary)
.font(.system(size: 18))
- .help("Manual CI step")
+ .help(String(localized: "Manual CI step"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIPendingIcon.swift b/Shared/UserInterface/Icons/CIPendingIcon.swift
index dcf34f8..c7f953d 100644
--- a/Shared/UserInterface/Icons/CIPendingIcon.swift
+++ b/Shared/UserInterface/Icons/CIPendingIcon.swift
@@ -12,7 +12,7 @@ struct CIPendingIcon: View {
Image(systemName: "pause.circle")
.foregroundColor(Color(.displayP3, red: (217)/255, green: (123)/255, blue: (0)/255, opacity: 1))
.font(.system(size: 18))
- .help("CI pipeline pending")
+ .help(String(localized: "CI pipeline pending"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIPreparingIcon.swift b/Shared/UserInterface/Icons/CIPreparingIcon.swift
index 1521800..c5a4d1f 100644
--- a/Shared/UserInterface/Icons/CIPreparingIcon.swift
+++ b/Shared/UserInterface/Icons/CIPreparingIcon.swift
@@ -12,7 +12,7 @@ struct CIPreparingIcon: View {
Image(systemName: "circle.dotted")
.foregroundColor(.secondary)
.font(.system(size: 18))
- .help("CI pipeline preparing")
+ .help(String(localized: "CI pipeline preparing"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIProgressIcon.swift b/Shared/UserInterface/Icons/CIProgressIcon.swift
index ca0fbc2..315704c 100644
--- a/Shared/UserInterface/Icons/CIProgressIcon.swift
+++ b/Shared/UserInterface/Icons/CIProgressIcon.swift
@@ -33,7 +33,7 @@ struct CIProgressIcon: View {
})
}
.padding(1)
- .help("CI in progress")
+ .help(String(localized: "CI in progress"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIRetryIcon.swift b/Shared/UserInterface/Icons/CIRetryIcon.swift
index 11c021f..f256a8e 100644
--- a/Shared/UserInterface/Icons/CIRetryIcon.swift
+++ b/Shared/UserInterface/Icons/CIRetryIcon.swift
@@ -12,7 +12,7 @@ struct CIRetryIcon: View {
Image(systemName: "exclamationmark.arrow.circlepath")
.foregroundColor(.red)
.font(.system(size: 18))
- .help("Retry CI pipeline")
+ .help(String(localized: "Retry CI pipeline"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIScheduledIcon.swift b/Shared/UserInterface/Icons/CIScheduledIcon.swift
index 9e5bad7..4126a6d 100644
--- a/Shared/UserInterface/Icons/CIScheduledIcon.swift
+++ b/Shared/UserInterface/Icons/CIScheduledIcon.swift
@@ -12,7 +12,7 @@ struct CIScheduledIcon: View {
Image(systemName: "clock.circle")
.foregroundColor(.primary)
.font(.system(size: 18))
- .help("CI pipeline scheduled")
+ .help(String(localized: "CI pipeline scheduled"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CISkippedIcon.swift b/Shared/UserInterface/Icons/CISkippedIcon.swift
index 60ed547..04dde61 100644
--- a/Shared/UserInterface/Icons/CISkippedIcon.swift
+++ b/Shared/UserInterface/Icons/CISkippedIcon.swift
@@ -12,6 +12,7 @@ struct CISkippedIcon: View {
Image(systemName: "chevron.right.circle")
.foregroundColor(.secondary)
.font(.system(size: 18))
+ .help(String(localized: "Skipped CI step"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CISuccessIcon.swift b/Shared/UserInterface/Icons/CISuccessIcon.swift
index 617328b..81c25ed 100644
--- a/Shared/UserInterface/Icons/CISuccessIcon.swift
+++ b/Shared/UserInterface/Icons/CISuccessIcon.swift
@@ -12,7 +12,7 @@ struct CISuccessIcon: View {
Image(systemName: "checkmark.circle")
.foregroundColor(.green)
.font(.system(size: 18))
- .help("CI Success")
+ .help(String(localized: "CI Success"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIWaitingForResourceIcon.swift b/Shared/UserInterface/Icons/CIWaitingForResourceIcon.swift
index 1c6f891..a71a812 100644
--- a/Shared/UserInterface/Icons/CIWaitingForResourceIcon.swift
+++ b/Shared/UserInterface/Icons/CIWaitingForResourceIcon.swift
@@ -12,7 +12,7 @@ struct CIWaitingForResourceIcon: View {
Image(systemName: "circle.circle")
.foregroundColor(.secondary)
.font(.system(size: 18))
- .help("CI pipeline waiting for resources")
+ .help(String(localized: "CI pipeline waiting for resources"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/CIWarningIcon.swift b/Shared/UserInterface/Icons/CIWarningIcon.swift
index eac54a7..97e335e 100644
--- a/Shared/UserInterface/Icons/CIWarningIcon.swift
+++ b/Shared/UserInterface/Icons/CIWarningIcon.swift
@@ -12,7 +12,7 @@ struct CIWarningIcon: View {
Image(systemName: "exclamationmark.circle")
.foregroundColor(.orange)
.font(.system(size: 18))
- .help("CI Warning")
+ .help(String(localized: "CI Warning"))
.clipShape(Rectangle())
}
}
diff --git a/Shared/UserInterface/Icons/DiscussionCountIcon.swift b/Shared/UserInterface/Icons/DiscussionCountIcon.swift
index 7a2da94..6aed84f 100644
--- a/Shared/UserInterface/Icons/DiscussionCountIcon.swift
+++ b/Shared/UserInterface/Icons/DiscussionCountIcon.swift
@@ -18,13 +18,13 @@ struct DiscussionCountIcon: View {
.font(.system(size: 14))
Text("\(count)")
.font(.system(size: 12))
- .help("\(count) discussions")
+ .help(String(localized: "\(count) discussions"))
}
} else {
Image(systemName: "gift.circle")
.symbolRenderingMode(.hierarchical)
.font(.system(size: 18))
- .help("Too much discussions")
+ .help(String(localized: "Too much discussions"))
}
}
}
diff --git a/Shared/UserInterface/UserAvatarView.swift b/Shared/UserInterface/UserAvatarView.swift
new file mode 100644
index 0000000..de364eb
--- /dev/null
+++ b/Shared/UserInterface/UserAvatarView.swift
@@ -0,0 +1,52 @@
+//
+// UserAvatarView.swift
+// GitLab
+//
+// Created by Stef Kors on 10/10/2024.
+//
+
+
+import SwiftUI
+
+struct UserAvatarView: View {
+ let author: Author
+ let account: Account?
+
+ @Environment(\.isInWidget) private var isInWidget
+
+ var body: some View {
+ VStack {
+ // TODO: ios support
+ // TODO: cache data fetch response
+ if isInWidget, let avatarUrl = author.avatarUrl, let data = try? Data(contentsOf: avatarUrl), let image = PlatformImage(data: data) {
+#if os(iOS)
+ Image(uiImage: image)
+ .resizable()
+#elseif os(macOS)
+ Image(nsImage: image)
+ .resizable()
+#endif
+
+ } else
+ // Previously we used account.instace to create the base url
+ if let avatarUrl = author.avatarUrl {
+ AsyncImage(url: avatarUrl) { image in
+ image.resizable()
+ } placeholder: {
+ Image(systemName: "person.circle.fill")
+ .symbolRenderingMode(.hierarchical)
+ .foregroundColor(.secondary)
+ .font(.system(size: 14))
+ }
+ }
+ }
+ .aspectRatio(contentMode: .fill)
+ .clipShape(Circle())
+ .frame(width: 14, height: 14)
+ .help(author.username ?? "")
+ }
+}
+
+#Preview {
+ UserAvatarView(author: .preview, account: .preview)
+}
diff --git a/Shared/UserInterface/Views/CIJobsView.swift b/Shared/UserInterface/Views/CIJobsView.swift
index 56b1d1f..c2fab2e 100644
--- a/Shared/UserInterface/Views/CIJobsView.swift
+++ b/Shared/UserInterface/Views/CIJobsView.swift
@@ -18,7 +18,6 @@ struct CIJobsView: View {
}
@State var presentPopover: Bool = false
- @State var isHovering: Bool = false
@State var tapState: Bool = false
private var hasFailedChildJob: Bool {
@@ -66,9 +65,5 @@ struct CIJobsView: View {
}
})
}
- .animation(.spring(response: 0.35, dampingFraction: 1, blendDuration: 0), value: isHovering)
- // .onHover { hovering in
- // isHovering = hovering
- // }
}
}
diff --git a/Shared/UserInterface/Views/LastUpdateMessagePlaceholderView.swift b/Shared/UserInterface/Views/LastUpdateMessagePlaceholderView.swift
deleted file mode 100644
index 746e6fe..0000000
--- a/Shared/UserInterface/Views/LastUpdateMessagePlaceholderView.swift
+++ /dev/null
@@ -1,26 +0,0 @@
-//
-// LastUpdateMessagePlaceholderView.swift
-//
-//
-// Created by Stef Kors on 19/09/2022.
-//
-
-import SwiftUI
-
-struct LastUpdateMessagePlaceholderView: View {
- var body: some View {
- Text("Last updated at: 19 September 2022 at 12:43")
- .opacity(0)
- .redacted(reason: .placeholder)
- .transition(.opacity.animation(.easeInOut(duration: 0.35).delay(0.2)))
- .foregroundColor(.gray)
- .font(.system(size: 10))
- .cornerRadius(5)
- }
-}
-
-struct LastUpdateMessagePlaceholderView_Previews: PreviewProvider {
- static var previews: some View {
- LastUpdateMessagePlaceholderView()
- }
-}
diff --git a/Shared/UserInterface/Views/MenuBarButtonStyle.swift b/Shared/UserInterface/Views/MenuBarButtonStyle.swift
index 280a155..ec1dc0c 100644
--- a/Shared/UserInterface/Views/MenuBarButtonStyle.swift
+++ b/Shared/UserInterface/Views/MenuBarButtonStyle.swift
@@ -18,8 +18,6 @@ import SwiftUI
configuration.label
}
.opacity(isMouseDown ? 0 : 1)
- // .offset(y: isMouseDown ? 10 : 0)
- // .scaleEffect(isMouseDown ? 0.7 : 1)
.animation(.spring(), value: isMouseDown)
}
diff --git a/Shared/UserInterface/Views/TitleWebLink.swift b/Shared/UserInterface/Views/TitleWebLink.swift
index 43fbf99..23221e0 100644
--- a/Shared/UserInterface/Views/TitleWebLink.swift
+++ b/Shared/UserInterface/Views/TitleWebLink.swift
@@ -34,8 +34,8 @@ struct TitleWebLink: View {
return linkText
}
- var body: some View {
- let text = HStack {
+ var TitleLabel: some View {
+ HStack {
if linkText.isDraft {
Text("Draft")
.font(.footnote)
@@ -50,18 +50,18 @@ struct TitleWebLink: View {
.foregroundColor(isHovering ? .accentColor : .primary)
.multilineTextAlignment(.leading)
}
-// .animation(.easeInOut(duration: 0.2), value: isHovering)
-
+ }
+ var body: some View {
if let url = destination {
Link(destination: url, label: {
- text
+ TitleLabel
}).onHover { hovering in
isHovering = hovering
}
} else {
- text
+ TitleLabel
}
}
diff --git a/Shared/UserInterface/Views/TokenInformationView.swift b/Shared/UserInterface/Views/TokenInformationView.swift
index 06a6969..3326d5c 100644
--- a/Shared/UserInterface/Views/TokenInformationView.swift
+++ b/Shared/UserInterface/Views/TokenInformationView.swift
@@ -79,8 +79,6 @@ struct TokenInformationView: View {
GroupBox {
Text(scope)
}
- // .padding(2)
- // .background(Color.accentColor, in: RoundedRectangle(cornerRadius: 4))
}
}
}
diff --git a/Shared/UserInterface/Views/WebLink.swift b/Shared/UserInterface/Views/WebLink.swift
index 74e974d..0330e67 100644
--- a/Shared/UserInterface/Views/WebLink.swift
+++ b/Shared/UserInterface/Views/WebLink.swift
@@ -22,15 +22,10 @@ struct WebLink: View {
}
.foregroundColor(isHovering ? .primary : .secondary)
.animation(.interactiveSpring(), value: isHovering)
-// .lineLimit(1)
-// .truncationMode(.head)
})
-// Link(linkText, destination: url)
} else {
Text(linkText)
.foregroundColor(.secondary)
-// .lineLimit(1)
-// .truncationMode(.head)
}
}
}
diff --git a/Shared/UserInterface/Views/WidgetInterface.swift b/Shared/UserInterface/Views/WidgetInterface.swift
deleted file mode 100644
index 2de3fad..0000000
--- a/Shared/UserInterface/Views/WidgetInterface.swift
+++ /dev/null
@@ -1,61 +0,0 @@
-//
-// UserInterface.swift
-// GitLab
-//
-// Created by Stef Kors on 13/09/2021.
-//
-
-import SwiftUI
-import SwiftData
-//
-//struct WidgetInterface: View {
-// // last update
-// var lastUpdate: Date?
-// var mergeRequests: [MergeRequest] = []
-// var accounts: [Account] = []
-// var repos: [LaunchpadRepo] = []
-//
-// @State private var selectedView: QueryType = .reviewRequestedMergeRequests
-// @State private var timelineDate: Date = .now
-//
-// var filteredMergeRequests: [MergeRequest] {
-// mergeRequests //.filter { $0.type == selectedView }
-// }
-//
-// var body: some View {
-// VStack(alignment: .leading, spacing: 10) {
-// VStack(alignment: .leading) {
-// if accounts.count > 1 {
-// SectionedMergeRequestList(
-// accounts: accounts,
-// mergeRequests: filteredMergeRequests,
-// selectedView: selectedView
-// )
-// } else {
-// PlainMergeRequestList(mergeRequests: filteredMergeRequests)
-// }
-// }
-//
-// if let lastUpdate {
-// Text(lastUpdate.description)
-// }
-//
-// Text("mergeRequests \(mergeRequests.count.description)")
-// Text("accounts \(accounts.count.description)")
-// Text("repos \(repos.count.description)")
-// if accounts.isEmpty {
-// BaseTextView(message: "Setup your accounts in the settings")
-// } else if filteredMergeRequests.isEmpty {
-//
-// BaseTextView(message: "All done 🥳")
-// .foregroundStyle(.secondary)
-// }
-//
-//
-// }.frame(alignment: .top)
-// }
-//}
-//
-//#Preview {
-// WidgetInterface()
-//}