diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml
index 74c31c2d..195726b9 100644
--- a/.buildkite/pipeline.yml
+++ b/.buildkite/pipeline.yml
@@ -7,26 +7,47 @@ agents:
queue: "mac"
env:
IMAGE_ID: $IMAGE_ID
+ SWIFTFORMAT_VERSION: $SWIFTFORMAT_VERSION
steps:
#################
# Lint Source files
#################
- - label: "🕵️ Lint"
- key: "lint"
- command: |
- echo "--- 🛠 Linting"
- make lint
+ - group: "Linters"
+ steps:
+ - label: ":swift: SwiftLint"
+ command: swiftlint
+ notify:
+ - github_commit_status:
+ context: "SwiftLint"
+ agents:
+ queue: "linter"
- - label: ☢️ Danger - PR Check
- command: danger
- key: danger
- if: build.pull_request.id != null
- retry:
- manual:
- permit_on_passed: true
- agents:
- queue: linter
+ - label: ":swift: SwiftFormat Linting"
+ plugins:
+ - docker#v5.12.0:
+ image: "ghcr.io/nicklockwood/swiftformat:$SWIFTFORMAT_VERSION"
+ command: ["--lint", "Sources"]
+ workdir: "${BUILDKITE_BUILD_CHECKOUT_PATH}"
+ - docker#v5.12.0:
+ image: "ghcr.io/nicklockwood/swiftformat:$SWIFTFORMAT_VERSION"
+ command: ["--lint", "Tests"]
+ workdir: "${BUILDKITE_BUILD_CHECKOUT_PATH}"
+ notify:
+ - github_commit_status:
+ context: "SwiftFormat Linting"
+ agents:
+ queue: "default"
+
+ - label: ☢️ Danger - PR Check
+ command: danger
+ key: danger
+ if: build.pull_request.id != null
+ retry:
+ manual:
+ permit_on_passed: true
+ agents:
+ queue: linter
#################
# Build and Test
diff --git a/.buildkite/shared-pipeline-vars b/.buildkite/shared-pipeline-vars
index b29e7fd5..3898f2a4 100644
--- a/.buildkite/shared-pipeline-vars
+++ b/.buildkite/shared-pipeline-vars
@@ -6,3 +6,5 @@
export IMAGE_ID="xcode-16.2-macos-14.7.1-v1"
export CI_TOOLKIT="automattic/a8c-ci-toolkit#3.2.2"
+
+export SWIFTFORMAT_VERSION=$( awk '/^--minversion/ { print $2 }' .swiftformat )
diff --git a/.swiftformat b/.swiftformat
index 7d829622..44fa13e1 100644
--- a/.swiftformat
+++ b/.swiftformat
@@ -1,3 +1,6 @@
+## SwiftFormat version
+--minversion 0.54.5
+
## Swift version
# Some rules are applicable only to newer versions of Swift.
diff --git a/.swiftlint.yml b/.swiftlint.yml
new file mode 100644
index 00000000..b89cb37a
--- /dev/null
+++ b/.swiftlint.yml
@@ -0,0 +1,21 @@
+swiftlint_version: 0.57.1
+only_rules: # Rules to run
+ - custom_rules
+
+# If true, SwiftLint will treat all warnings as errors.
+strict: true
+
+included:
+ - Sources
+ - Tests
+
+custom_rules:
+ no_ns_localized_string:
+ included:
+ - "Sources/.*\\.swift"
+ name: "No NSLocalizedString"
+ regex: "NSLocalizedString\\("
+ match_kinds:
+ - identifier
+ message: "Use `SDKLocalizedString()` instead of `NSLocalizedString()`."
+ severity: error
diff --git a/Makefile b/Makefile
index 2ff6ba0c..230a7cc7 100644
--- a/Makefile
+++ b/Makefile
@@ -1,12 +1,15 @@
-.PHONY: all clean run
+.PHONY: all clean run swiftlint
# To see how to drive this makefile use:
#
# % make help
-# Cache
-# No spaces allowed
-SWIFTFORMAT_CACHE = ~/Library/Caches/com.charcoaldesign.swiftformat
+# SwiftLint
+SWIFTLINT_VERSION := $(shell awk -F': ' '/^swiftlint_version: / {print $$2}' .swiftlint.yml)
+SWIFTLINT_DOCKER_BUILDER_NAME = swiftlint_builder
+
+# SwiftFormat
+SWIFTFORMAT_VERSION := $(shell awk '/^--minversion/ { print $$2 }' .swiftformat)
# The following values can be changed here, or passed on the command line.
OPENAPI_GENERATOR_DOCKER_IMAGE ?= openapitools/openapi-generator-cli
@@ -66,17 +69,35 @@ setup-secrets: bundle-install
bundle exec fastlane run configure_apply
swiftformat: # Automatically find and fixes lint issues
- swift package plugin \
- --allow-writing-to-package-directory \
- --allow-writing-to-directory $(SWIFTFORMAT_CACHE) \
- swiftformat
+ @docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) ghcr.io/nicklockwood/swiftformat:$(SWIFTFORMAT_VERSION) Sources
+ @docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) ghcr.io/nicklockwood/swiftformat:$(SWIFTFORMAT_VERSION) Tests
+
+swiftformat-lint:
+ @docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) ghcr.io/nicklockwood/swiftformat:$(SWIFTFORMAT_VERSION) --lint Sources
+ @docker run --rm -v $(shell pwd):$(shell pwd) -w $(shell pwd) ghcr.io/nicklockwood/swiftformat:$(SWIFTFORMAT_VERSION) --lint Tests
+
+swiftlint: docker-swiftlint-builder swiftlint-run # Sets up the buildx builder and runs the swiftlint command
+
+docker-swiftlint-builder: # Create and use the Buildx builder because the SwiftLint docker image doesn't support Apple Silicon
+ @if ! docker buildx inspect $(SWIFTLINT_DOCKER_BUILDER_NAME) >/dev/null 2>&1; then \
+ docker buildx create --use --name $(SWIFTLINT_DOCKER_BUILDER_NAME); \
+ else \
+ docker buildx use $(SWIFTLINT_DOCKER_BUILDER_NAME); \
+ fi
+
+swiftlint-run: # Docker command to run swiftlint
+ docker run --platform linux/amd64 -v $(shell pwd):$(shell pwd) -w $(shell pwd) ghcr.io/realm/swiftlint:$(SWIFTLINT_VERSION)
+
+swiftlint-version:
+ @if [ -z "$(SWIFTLINT_VERSION)" ]; then \
+ echo "SwiftLint version not found in .swiftlint.yml"; \
+ else \
+ echo "SwiftLint version: $(SWIFTLINT_VERSION)"; \
+ fi
lint: # Use swiftformat to warn about format issues
- swift package plugin \
- --allow-writing-to-package-directory \
- --allow-writing-to-directory $(SWIFTFORMAT_CACHE) \
- swiftformat \
- --lint
+ @make swiftlint
+ @make swiftformat-lint
validate-pod: bundle-install
# For some reason this fixes a failure in `lib lint`
diff --git a/Package.resolved b/Package.resolved
index 980268c5..4a230bf7 100644
--- a/Package.resolved
+++ b/Package.resolved
@@ -1,5 +1,5 @@
{
- "originHash" : "dddfee60d726ac68a5cd796dea6619c69dcce5cc55b1b6d7d75bb308b96243a1",
+ "originHash" : "ef380bfd827500bb40ef65e62058cb22bbebbf217402a19c327d4201d142ba21",
"pins" : [
{
"identity" : "swift-snapshot-testing",
@@ -18,15 +18,6 @@
"revision" : "303e5c5c36d6a558407d364878df131c3546fad8",
"version" : "510.0.2"
}
- },
- {
- "identity" : "swiftformat",
- "kind" : "remoteSourceControl",
- "location" : "https://github.com/nicklockwood/SwiftFormat",
- "state" : {
- "revision" : "ab6844edb79a7b88dc6320e6cee0a0db7674dac3",
- "version" : "0.54.5"
- }
}
],
"version" : 3
diff --git a/Package.swift b/Package.swift
index cf51ca4b..2b6ba1bf 100644
--- a/Package.swift
+++ b/Package.swift
@@ -23,7 +23,6 @@ let package = Package(
),
],
dependencies: [
- .package(url: "https://github.com/nicklockwood/SwiftFormat", from: "0.54.5"),
.package(url: "https://github.com/pointfreeco/swift-snapshot-testing", from: "1.17.6"),
],
targets: [
diff --git a/Sources/Gravatar/Resources/SDKInfo.plist b/Sources/Gravatar/Resources/SDKInfo.plist
index 499c40b8..f241e8b5 100644
--- a/Sources/Gravatar/Resources/SDKInfo.plist
+++ b/Sources/Gravatar/Resources/SDKInfo.plist
@@ -3,6 +3,6 @@
CFBundleShortVersionString
- 3.1.1
+ 3.2.0-rc.1
diff --git a/Sources/GravatarUI/Resources/ar.lproj/Localizable.strings b/Sources/GravatarUI/Resources/ar.lproj/Localizable.strings
index 9b1f3b1a..a873c609 100644
--- a/Sources/GravatarUI/Resources/ar.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/ar.lproj/Localizable.strings
@@ -1,16 +1,52 @@
-/* Translation-Revision-Date: 2024-12-16 11:34:52+0000 */
+/* Translation-Revision-Date: 2025-01-14 13:54:02+0000 */
/* Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: ar */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "إلغاء";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "كتابة النص البديل...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "حفظ";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "النص البديل";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "عام";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "توجيه أبوي";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "مقيد";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "حد أقصى";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "النص البديل";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "حذف";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "التقييم: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "مشاركة...";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "يلزم تسجيل الدخول";
+/* Headline of an intro screen for editing a user's profile. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.headline" = "تحرير ملفك الشخصي";
+
+/* Subheadline of an intro screen for editing a user's profile. %@ is the name of a mobile app that uses Gravatar services. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subheadline" = "حسِّن ملفك الشخصي على %@ باستخدام جرافتار.";
+
+/* A message that informs the user about Gravatar. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subtext" = "أدر ملفك الشخصي للويب في مكان واحد.";
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "المحاولة مجددًا";
@@ -33,12 +69,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "انتهت صلاحية الجلسة لأسباب تتعلق بالأمان. يرجى تسجيل الدخول لتحديث صورتك الرمزية.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "تسجيل الدخول";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "لتعديل ملفك الشخصي على جرافتار، يجب عليك تسجيل الدخول أولاً.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "انتهت صلاحية الجلسة";
@@ -54,6 +84,9 @@
/* Title of a message advising the user to setup their avatar */
"AvatarPicker.ContentLoading.success.title" = "لنقم بإعداد الأفاتار الخاص بك";
+/* Title of a button that will proceed with the action. */
+"AvatarPicker.Continue.title" = "متابعة";
+
/* The title button which confirms the avatar deletion. */
"AvatarPicker.Deletion.Confirmation.ctaButtonTitle" = "حذف";
@@ -69,6 +102,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "الصور الرمزية";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "لم يتم تحديد صورة. يرجى تحديد صورة أو سيتم استخدام الصورة الافتراضية.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "تتجاوز الصورة المتوفرة الحد الأقصى للحجم: 10 ميجابايت";
@@ -84,9 +120,27 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "عرض الملف الشخصي ←";
+/* Placeholder text for the name field */
+"AvatarPickerProfile.Name.placeholder" = "اسمك";
+
+/* Placeholder text for some profile fields. */
+"AvatarPickerProfile.ProfileFields.placeholder" = "الوظيفة، والموقع، والضمائر، وما إلى ذلك";
+
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "عذرًا، ثمَّة شيء لم يعمل بشكل طبيعي في أثناء محاولة تحديث النص البديل.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "تم تغيير النص البديل للصورة بنجاح.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "عذرًا، كان هناك خطأ في أثناء حذف الصورة.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "عذرًا، ثمَّة شيء لم يعمل بشكل طبيعي في أثناء محاولة تقييم صورتك الرمزية.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "تم تغيير تقييم الصورة الافتراضية بنجاح.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "عذرًا، حدث خطأ ما في أثناء محاولة مشاركة صورتك الرمزية.";
diff --git a/Sources/GravatarUI/Resources/de.lproj/Localizable.strings b/Sources/GravatarUI/Resources/de.lproj/Localizable.strings
index 35a21f3b..37a4eb4f 100644
--- a/Sources/GravatarUI/Resources/de.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/de.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-02 17:54:02+0000 */
+/* Translation-Revision-Date: 2025-01-01 13:54:03+0000 */
/* Plural-Forms: nplurals=2; plural=n != 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: de */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Abbrechen";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Alt-Text schreiben";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Speichern";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Alt-Text";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Allgemein";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Parental Guidance (elterliche Anleitung erforderlich)";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Eingeschränkt";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Extrem";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Alt-Text";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Löschen";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Bewertung: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Teilen";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Anmelden erforderlich";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Erneut versuchen";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "Die Sitzung ist aus Sicherheitsgründen abgelaufen. Bitte melde dich an, um deinen Avatar zu aktualisieren.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Anmelden";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Du musst dich zuerst anmelden, um dein Gravatar-Profil ändern zu können.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Sitzung abgelaufen";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatare";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Kein Bild ausgewählt. Bitte wähle eines aus, andernfalls wird das Standardbild verwendet.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "Das angegebene Bild überschreitet die maximal zulässige Größe: 10 MB";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Profil anzeigen →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Ups, beim Versuch, den Alt-Text zu aktualisieren, ist etwas schiefgegangen.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Bild: Alt-Text wurde erfolgreich geändert";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Ups, beim Löschen des Bilds ist ein Fehler aufgetreten.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Ups, beim Bewerten deines Avatars ist etwas schiefgegangen.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "Die Avatar-Bewertung wurde erfolgreich geändert.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Ups, beim Teilen deines Avatars hat etwas nicht richtig funktioniert.";
diff --git a/Sources/GravatarUI/Resources/es.lproj/Localizable.strings b/Sources/GravatarUI/Resources/es.lproj/Localizable.strings
index bb24ada2..c96dc8b3 100644
--- a/Sources/GravatarUI/Resources/es.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/es.lproj/Localizable.strings
@@ -1,16 +1,52 @@
-/* Translation-Revision-Date: 2024-12-03 16:54:02+0000 */
+/* Translation-Revision-Date: 2025-01-14 09:54:05+0000 */
/* Plural-Forms: nplurals=2; plural=n != 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: es */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Cancelar";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Escribir texto alternativo...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Guardar";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Texto alternativo";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "General";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Control parental";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Restringido";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Extremo";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Texto alternativo";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Eliminar";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Valoración: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Compartir";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Inicio de sesión obligatorio";
+/* Headline of an intro screen for editing a user's profile. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.headline" = "Edita tu perfil";
+
+/* Subheadline of an intro screen for editing a user's profile. %@ is the name of a mobile app that uses Gravatar services. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subheadline" = "Mejora tu perfil de %@ con Gravatar";
+
+/* A message that informs the user about Gravatar. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subtext" = "Gestiona tu perfil para la web en un único lugar.";
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Volver a intentarlo";
@@ -33,12 +69,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "Sesión caducada por motivos de seguridad. Inicia sesión para actualizar tu avatar.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Iniciar sesión";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Para modificar tu perfil de Gravatar primero tienes que iniciar sesión.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Sesión caducada";
@@ -54,6 +84,9 @@
/* Title of a message advising the user to setup their avatar */
"AvatarPicker.ContentLoading.success.title" = "Vamos a configurar tu avatar";
+/* Title of a button that will proceed with the action. */
+"AvatarPicker.Continue.title" = "Continuar";
+
/* The title button which confirms the avatar deletion. */
"AvatarPicker.Deletion.Confirmation.ctaButtonTitle" = "Eliminar";
@@ -69,6 +102,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatares";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "No se han elegido imágenes. Elige una o se utilizará la imagen por defecto.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "La imagen proporcionada excede el tamaño máximo: 10 MB";
@@ -84,9 +120,27 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Ver perfil →";
+/* Placeholder text for the name field */
+"AvatarPickerProfile.Name.placeholder" = "Tu nombre";
+
+/* Placeholder text for some profile fields. */
+"AvatarPickerProfile.ProfileFields.placeholder" = "Trabajo, ubicación, pronombres, etc.";
+
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Se ha producido un error al intentar actualizar el texto alternativo.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "El texto alternativo de la imagen se ha modificado correctamente.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "¡Vaya! Se ha producido un error al eliminar la imagen.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Se ha producido un error al intentar valorar tu avatar.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "La valoración del avatar se ha cambiado correctamente.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Se ha producido un error al intentar compartir tu avatar.";
diff --git a/Sources/GravatarUI/Resources/fr.lproj/Localizable.strings b/Sources/GravatarUI/Resources/fr.lproj/Localizable.strings
index 3ef51994..44aac2d3 100644
--- a/Sources/GravatarUI/Resources/fr.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/fr.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-04 09:54:07+0000 */
+/* Translation-Revision-Date: 2024-12-30 13:54:03+0000 */
/* Plural-Forms: nplurals=2; plural=n > 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: fr */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Annuler";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Rédigez le texte alternatif…";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Enregistrer";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Texte alternatif";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Tous publics";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Accompagnement parental souhaitable";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Restreint";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Extrême";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Texte alternatif";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Supprimer";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Classification : %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Partager…";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Connexion obligatoire";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Réessayer";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "La session a expiré pour des raisons de sécurité. Veuillez vous connecter pour mettre à jour votre avatar.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Se connecter";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Pour modifier votre profil Gravatar, vous devez d’abord vous connecter.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "La session a expiré";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatars";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Aucune image sélectionnée. Veuillez en sélectionner une, faute de quoi l’image par défaut sera utilisée.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "L’image fournie dépasse la taille maximum : 10 Mo";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Afficher le profil →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Oups, un couac est survenu lors de la tentative de mise à jour du texte alternatif.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Le texte alternatif de l’image a bien été modifié.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Oups, une erreur est survenue lors de la suppression de l’image.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Oups, un couac est survenu lors de la tentative de classification de votre avatar.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "La classification de l’avatar a bien été modifiée.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Oups, un couac est survenu lors de la tentative de partage de votre avatar.";
diff --git a/Sources/GravatarUI/Resources/he.lproj/Localizable.strings b/Sources/GravatarUI/Resources/he.lproj/Localizable.strings
index d5543228..08ea994a 100644
--- a/Sources/GravatarUI/Resources/he.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/he.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-05 11:54:05+0000 */
+/* Translation-Revision-Date: 2024-12-31 11:54:02+0000 */
/* Plural-Forms: nplurals=2; plural=n != 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: he_IL */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "ביטול";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "לכתוב טקסט חלופי...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "לשמור";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "טקסט חלופי";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "כללי";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "השגחה של הורים";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "שימוש מוגבל";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "קיצוני";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "טקסט חלופי";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "למחוק";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "דירוג: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "לשתף...";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "נדרשת התחברות";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "לנסות שוב";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "מטעמי אבטחה, פג תוקף ההפעלה. עליך להתחבר כדי לעדכן את צלמית המשתמש שלך.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "התחברות";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "כדי לשנות את פרופיל ה-Gravatar שלך, עליך להתחבר תחילה.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "פג תוקף ההפעלה";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "צלמיות משתמשים";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "לא נבחרה תמונה. יש לבחור לפחות תמונה אחת, אחרת נשתמש בברירת המחדל.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "התמונה שהוספת חורגת ממגבלות הגודל: 10 MB";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "להצגת הפרופיל ←";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "אופס, משהו השתבש במהלך הניסיון לעדכן את הטקסט החלופי.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "הטקסט החלופי לתמונה שונה בהצלחה.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "אופס, אירעה שגיאה בעת מחיקת התמונה.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "אופס, משהו השתבש במהלך הניסיון לדרג את צלמית המשתמש שלך.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "הדירוג של צלמית המשתמש שונה בהצלחה.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "אופס, משהו השתבש במהלך הניסיון לשתף את צלמית המשתמש שלך.";
diff --git a/Sources/GravatarUI/Resources/id.lproj/Localizable.strings b/Sources/GravatarUI/Resources/id.lproj/Localizable.strings
index fcab620d..4e5d2c58 100644
--- a/Sources/GravatarUI/Resources/id.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/id.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-04 09:54:06+0000 */
+/* Translation-Revision-Date: 2024-12-27 15:54:03+0000 */
/* Plural-Forms: nplurals=2; plural=n > 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: id */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Batal";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Tulis teks alt ...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Simpan";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Teks Alt";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Umum";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Bimbingan Orang Tua";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Terbatas";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Ekstrem";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Teks Alt";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Hapus";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Rating: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Bagikan";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Wajib login";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Coba lagi";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "Sesi telah kedaluwarsa karena alasan keamanan. Login untuk memperbarui Avatar Anda.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Login";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Untuk mengubah profil Gravatar, Anda harus login terlebih dahulu.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Sesi telah kedaluwarsa";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatar";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Tidak ada gambar dipilih. Harap pilih satu gambar atau gambar default akan digunakan.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "Ukuran gambar yang diberikan melebihi batas maksimal: 10 MB ";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Lihat profil →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Ups, terjadi kesalahan saat memperbarui teks alt.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Teks alt gambar berhasil diubah.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Ups, terjadi error saat menghapus gambar.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Ups, terjadi kesalahan saat memberi rating avatar.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "Rating avatar berhasil diubah.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Ups, terjadi kesalahan saat berbagi avatar Anda.";
diff --git a/Sources/GravatarUI/Resources/it.lproj/Localizable.strings b/Sources/GravatarUI/Resources/it.lproj/Localizable.strings
index cd153a6b..c86752f0 100644
--- a/Sources/GravatarUI/Resources/it.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/it.lproj/Localizable.strings
@@ -1,16 +1,52 @@
-/* Translation-Revision-Date: 2024-12-02 23:54:03+0000 */
+/* Translation-Revision-Date: 2025-01-14 22:54:03+0000 */
/* Plural-Forms: nplurals=2; plural=n != 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: it */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Annulla";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Scrivi testo alternativo...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Salva";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Testo alternativo";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Generale";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "PG (visibile in presenza di un adulto)";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Limitato";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Estremo";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Testo alternativo";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Elimina";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Valutazione: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Condividi...";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Accesso richiesto";
+/* Headline of an intro screen for editing a user's profile. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.headline" = "Modifica il tuo profilo";
+
+/* Subheadline of an intro screen for editing a user's profile. %@ is the name of a mobile app that uses Gravatar services. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subheadline" = "Migliora il tuo profilo %@ con Gravatar.";
+
+/* A message that informs the user about Gravatar. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subtext" = "Gestisci il tuo profilo web da un unico luogo.";
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Riprova";
@@ -33,12 +69,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "Sessione scaduta per ragioni di sicurezza. Accedi per aggiornare l'Avatar.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Accedi";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Per modificare il tuo profilo Gravatar devi prima accedere.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Sessione scaduta";
@@ -54,6 +84,9 @@
/* Title of a message advising the user to setup their avatar */
"AvatarPicker.ContentLoading.success.title" = "Imposta il tuo avatar";
+/* Title of a button that will proceed with the action. */
+"AvatarPicker.Continue.title" = "Continua";
+
/* The title button which confirms the avatar deletion. */
"AvatarPicker.Deletion.Confirmation.ctaButtonTitle" = "Elimina";
@@ -69,6 +102,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatar";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Nessuna immagine selezionata. Seleziona un'immagine, altrimenti verrà usata quella predefinita.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "L'immagine fornita supera il peso massimo: 10MB";
@@ -84,9 +120,27 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Visualizza profilo →";
+/* Placeholder text for the name field */
+"AvatarPickerProfile.Name.placeholder" = "Il tuo nome";
+
+/* Placeholder text for some profile fields. */
+"AvatarPickerProfile.ProfileFields.placeholder" = "Impiego, località, pronomi ecc.";
+
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Ops, qualcosa è andato storto durante il tentativo di aggiornamento del testo alternativo.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Testo alternativo dell'immagine modificato con successo.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Ops, si è verificato un errore durante l'eliminazione dell'immagine.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Ops, qualcosa è andato storto durante il tentativo di valutare il tuo avatar.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "Valutazione dell'avatar modificata con successo.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Ops, qualcosa è andato storto durante il tentativo di condivisione del tuo avatar.";
diff --git a/Sources/GravatarUI/Resources/ja.lproj/Localizable.strings b/Sources/GravatarUI/Resources/ja.lproj/Localizable.strings
index adac507e..1e2246ff 100644
--- a/Sources/GravatarUI/Resources/ja.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/ja.lproj/Localizable.strings
@@ -1,16 +1,52 @@
-/* Translation-Revision-Date: 2024-12-04 09:54:09+0000 */
+/* Translation-Revision-Date: 2025-01-14 09:54:06+0000 */
/* Plural-Forms: nplurals=1; plural=0; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: ja_JP */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "キャンセル";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "代替テキストを作成...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "保存";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "代替テキスト";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "一般";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "保護者の助言と指導が必要";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "制限付き";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "過激";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "代替テキスト";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "削除";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "評価: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "共有...";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "ログインが必須です";
+/* Headline of an intro screen for editing a user's profile. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.headline" = "プロフィールを編集";
+
+/* Subheadline of an intro screen for editing a user's profile. %@ is the name of a mobile app that uses Gravatar services. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subheadline" = "Gravatar で %@ のプロフィールをレベルアップできます。";
+
+/* A message that informs the user about Gravatar. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subtext" = "ウェブのプロフィールを1か所から管理できます。";
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "再試行";
@@ -33,12 +69,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "セキュリティ上の理由でセッションの有効期限が切れました。 ログインしてアバターを更新してください。";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "ログイン";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Gravatar プロフィールを変更するには、まずログインする必要があります。";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "セッションの有効期限が切れました";
@@ -54,6 +84,9 @@
/* Title of a message advising the user to setup their avatar */
"AvatarPicker.ContentLoading.success.title" = "アバターを設定しましょう";
+/* Title of a button that will proceed with the action. */
+"AvatarPicker.Continue.title" = "続行";
+
/* The title button which confirms the avatar deletion. */
"AvatarPicker.Deletion.Confirmation.ctaButtonTitle" = "削除";
@@ -69,6 +102,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "アバター";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "画像が選択されていません。 いずれかを選択してください。選択しない場合はデフォルトが使用されます。";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "提供された画像は最大サイズの10MB を超えています。";
@@ -84,9 +120,27 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "プロフィールを表示→";
+/* Placeholder text for the name field */
+"AvatarPickerProfile.Name.placeholder" = "あなたの名前";
+
+/* Placeholder text for some profile fields. */
+"AvatarPickerProfile.ProfileFields.placeholder" = "仕事、場所、代名詞など";
+
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "代替テキストの変更中にエラーが発生しました。";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "画像の代替テキストの変更に成功しました。";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "画像の削除中にエラーが発生しました。";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "アバターの評価中にエラーが発生しました。";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "アバター評価の変更に成功しました。";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "アバターの共有中にエラーが発生しました。";
diff --git a/Sources/GravatarUI/Resources/ko.lproj/Localizable.strings b/Sources/GravatarUI/Resources/ko.lproj/Localizable.strings
index 22ddcbad..4932da49 100644
--- a/Sources/GravatarUI/Resources/ko.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/ko.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-16 11:32:24+0000 */
+/* Translation-Revision-Date: 2024-12-31 09:54:04+0000 */
/* Plural-Forms: nplurals=1; plural=0; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: ko_KR */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "취소";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "대체 텍스트 작성...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "저장";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "대체 텍스트";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "일반";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "보호자 지도";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "제한";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "극단";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "대체 텍스트";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "삭제";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "등급: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "공유...";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "로그인 필요";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "다시 시도";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "보안상의 이유로 세션이 만료되었습니다. 아바타를 업데이트하려면 로그인하세요.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "로그인";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "그라바타 프로필을 수정하려면 먼저 로그인해야 합니다.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "세션이 만료됐습니다";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "아바타";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "선택된 이미지가 없습니다. 이미지를 선택하지 않으면 기본 이미지가 사용됩니다.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "제공된 이미지가 최대 크기(10MB)를 초과합니다.";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "프로필 보기 →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "죄송합니다. 대체 텍스트를 업데이트하는 중 문제가 발생했습니다.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "이미지 대체 텍스트가 변경되었습니다.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "죄송합니다. 이미지를 삭제하는 중 오류가 발생했습니다.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "죄송합니다. 아바타 등급을 지정하는 중 문제가 발생했습니다.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "아바타 등급이 변경되었습니다.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "죄송합니다. 아바타를 공유하는 중 문제가 발생했습니다.";
diff --git a/Sources/GravatarUI/Resources/nl.lproj/Localizable.strings b/Sources/GravatarUI/Resources/nl.lproj/Localizable.strings
index 73eba106..69cf1b03 100644
--- a/Sources/GravatarUI/Resources/nl.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/nl.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-16 11:02:40+0000 */
+/* Translation-Revision-Date: 2025-01-03 13:54:02+0000 */
/* Plural-Forms: nplurals=2; plural=n != 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: nl */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Annuleren";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Alt. tekst schrijven ...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Opslaan";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Alt. tekst";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Algemeen";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Ouderlijk toezicht";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Beperkt";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Extreem";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Alt. tekst";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Verwijderen";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Beoordeling: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Delen";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Login vereist";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Opnieuw proberen";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "Sessie verlopen vanwege beveiligingsredenen. Log in om je Avatar bij te werken.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Inloggen";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Je moet eerst inloggen om je Gravatar-profiel aan te passen.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Sessie verlopen";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatars";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Geen afbeelding geselecteerd Selecteer een afbeelding, anders wordt de standaardafbeelding gebruikt.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "De opgegeven afbeelding overschrijdt de maximale grootte: 10 MB";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Profiel bekijken →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Oeps, er is iets misgegaan terwijl je je alt. tekst probeerde aan te passen.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Alt. tekst van afbeelding is gewijzigd.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Oeps, er is een fout opgetreden bij het verwijderen van de afbeelding.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Oeps, er is iets misgegaan terwijl je je avatar probeerde te beoordelen.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "Beoordeling van avatar is gewijzigd.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Oeps, er is iets misgegaan terwijl je je avatar probeerde aan te passen.";
diff --git a/Sources/GravatarUI/Resources/pt-BR.lproj/Localizable.strings b/Sources/GravatarUI/Resources/pt-BR.lproj/Localizable.strings
index 3d009edf..f8965ddc 100644
--- a/Sources/GravatarUI/Resources/pt-BR.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/pt-BR.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-05 13:54:03+0000 */
+/* Translation-Revision-Date: 2024-12-30 15:54:03+0000 */
/* Plural-Forms: nplurals=2; plural=(n > 1); */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: pt_BR */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Cancelar";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Escreva um texto alternativo…";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Salvar";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Texto alternativo";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Livre";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Orientação parental";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "+16";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "+18";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Texto alternativo";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Excluir";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Classificação: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Compartilhar...";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Login obrigatório";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Tentar novamente";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "A sessão expirou por motivos de segurança. Faça login para atualizar seu avatar.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Fazer login";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Para alterar seu perfil no Gravatar, você precisa fazer login primeiro.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "A sessão expirou";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatares";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Nenhuma imagem selecionada. Selecione uma ou a padrão será utilizada.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "A imagem fornecida excede o tamanho máximo: 10 MB";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Visualizar perfil →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Ops! Ocorreu um erro ao tentar atualizar o texto alternativo.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "O texto alternativo da imagem foi alterado com sucesso.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Ops! Ocorreu um erro ao excluir a imagem.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Ops! Ocorreu um erro ao tentar classificar seu avatar.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "A classificação do avatar foi alterada com sucesso.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Ops! Ocorreu um erro ao tentar compartilhar seu avatar.";
diff --git a/Sources/GravatarUI/Resources/ru.lproj/Localizable.strings b/Sources/GravatarUI/Resources/ru.lproj/Localizable.strings
index 03585c32..6a6694f2 100644
--- a/Sources/GravatarUI/Resources/ru.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/ru.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-16 11:29:01+0000 */
+/* Translation-Revision-Date: 2024-12-27 09:54:07+0000 */
/* Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: ru */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "Отмена";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Введите альтернативный текст…";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Сохранить";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Альтернативный текст";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Общедоступный";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Родительский контроль";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Ограниченный доступ";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Экстремальный";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Альтернативный текст";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Удалить";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Рейтинг: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Поделиться…";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Необходимо войти в учётную запись";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Повторить попытку";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "В целях безопасности время сеанса истекло. Войдите, чтобы изменить свой аватар.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Войти";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Необходимо войти в учётную запись, чтобы изменить профиль Gravatar.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Время сеанса истекло";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Аватары";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Изображение не выбрано. Выберите изображение, если не хотите использовать изображение по умолчанию.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "Размер предоставленного изображения превосходит максимально допустимый: 10 МБ";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Просмотреть профиль →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Что-то пошло не так при попытке изменить альтернативный текст.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Альтернативный текст изображения изменён.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Ошибка при удалении изображения.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Что-то пошло не так при попытке оценить ваш аватар.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "Рейтинг аватара успешно изменён.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Что-то пошло не так при попытке опубликовать ваш аватар.";
diff --git a/Sources/GravatarUI/Resources/sv.lproj/Localizable.strings b/Sources/GravatarUI/Resources/sv.lproj/Localizable.strings
index 5150106d..37eeb515 100644
--- a/Sources/GravatarUI/Resources/sv.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/sv.lproj/Localizable.strings
@@ -1,14 +1,20 @@
-/* Translation-Revision-Date: 2024-12-16 11:17:20+0000 */
+/* Translation-Revision-Date: 2025-01-06 15:03:44+0000 */
/* Plural-Forms: nplurals=2; plural=n != 1; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: sv_SE */
-/* Title for Cancel button */
+/* Title for Cancel button. */
"AltText.Editor.cancelButtonTitle" = "Avbryt";
-/* Title for Save button */
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Skriv Alt-text …";
+
+/* Title for Save button. */
"AltText.Editor.saveButtonTitle" = "Spara";
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Alt-text";
+
/* Rating that indicates that the avatar is suitable for everyone */
"Avatar.Rating.G.subtitle" = "Allmänt";
@@ -21,14 +27,26 @@
/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
"Avatar.Rating.X.subtitle" = "Extrem";
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Alternativ text";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Ta bort";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Klassificering: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Dela …";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Inloggning krävs";
+/* Headline of an intro screen for editing a user's profile. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.headline" = "Redigera din profil";
+
+/* Subheadline of an intro screen for editing a user's profile. %@ is the name of a mobile app that uses Gravatar services. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subheadline" = "Förbättra din %@-profil med Gravatar.";
+
+/* A message that informs the user about Gravatar. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subtext" = "Hantera din profil för webben på ett ställe.";
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Försök igen";
@@ -51,12 +69,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "Sessionen har löpt ut av säkerhetsskäl. Logga in för att uppdatera din profilbild.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Logga in";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "För att ändra din Gravatar-profil måste du först logga in.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Session löpt ut";
@@ -72,6 +84,9 @@
/* Title of a message advising the user to setup their avatar */
"AvatarPicker.ContentLoading.success.title" = "Låt oss konfigurera din profilbild";
+/* Title of a button that will proceed with the action. */
+"AvatarPicker.Continue.title" = "Fortsätt";
+
/* The title button which confirms the avatar deletion. */
"AvatarPicker.Deletion.Confirmation.ctaButtonTitle" = "Ta bort";
@@ -105,9 +120,27 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Visa profil →";
+/* Placeholder text for the name field */
+"AvatarPickerProfile.Name.placeholder" = "Ditt namn";
+
+/* Placeholder text for some profile fields. */
+"AvatarPickerProfile.ProfileFields.placeholder" = "Jobb, plats, pronomen etc.";
+
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Hoppsan, något fungerade inte riktigt när du försökte uppdatera den alternativa texten.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Bildens alternativa text har ändrats.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Hoppsan, det uppstod ett fel när bilden skulle tas bort.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Hoppsan, något fungerade inte riktigt när du försökte klassificera din profilbild.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "Profilbildens klassificering ändrades.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Hoppsan, något fungerade inte riktigt när du försökte dela din profilbild.";
diff --git a/Sources/GravatarUI/Resources/tr.lproj/Localizable.strings b/Sources/GravatarUI/Resources/tr.lproj/Localizable.strings
index c1eac627..3e7cbd42 100644
--- a/Sources/GravatarUI/Resources/tr.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/tr.lproj/Localizable.strings
@@ -1,16 +1,52 @@
-/* Translation-Revision-Date: 2024-11-29 08:29:05+0000 */
+/* Translation-Revision-Date: 2025-01-13 11:37:38+0000 */
/* Plural-Forms: nplurals=2; plural=(n > 1); */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: tr */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "İptal Et";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "Alt metin yazın...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "Kaydet";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "Alt Metin";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "Genel";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "Ebeveyn Rehberliği";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "Kısıtlı";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "Yetişkin";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "Alt Metin";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "Sil";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "Derecelendirme: %@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "Paylaş...";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "Oturum açmanız gerekiyor";
+/* Headline of an intro screen for editing a user's profile. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.headline" = "Profilini düzenle";
+
+/* Subheadline of an intro screen for editing a user's profile. %@ is the name of a mobile app that uses Gravatar services. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subheadline" = "%@ profilinizi Gravatar ile güzelleştirin.";
+
+/* A message that informs the user about Gravatar. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subtext" = "Web'deki profilinizi tek bir yerden yönetin.";
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "Tekrar dene";
@@ -33,12 +69,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "Güvenlik nedeniyle oturum süresi doldu. Avatarınızı güncellemek için lütfen oturum açın.";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "Oturum aç";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "Gravatar profilinizi değiştirmek için önce oturum açmalısınız.";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "Oturum süresi doldu";
@@ -54,6 +84,9 @@
/* Title of a message advising the user to setup their avatar */
"AvatarPicker.ContentLoading.success.title" = "Avatarınızı oluşturalım";
+/* Title of a button that will proceed with the action. */
+"AvatarPicker.Continue.title" = "Devam et";
+
/* The title button which confirms the avatar deletion. */
"AvatarPicker.Deletion.Confirmation.ctaButtonTitle" = "Sil";
@@ -69,6 +102,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "Avatarlar";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "Görsel seçilmedi. Lütfen bir görsel seçin, aksi halde varsayılan görsel kullanılır.";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "Sağlanan görsel maksimum boyutu aşıyor: 10MB";
@@ -84,9 +120,27 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "Profili görüntüle →";
+/* Placeholder text for the name field */
+"AvatarPickerProfile.Name.placeholder" = "İsminiz";
+
+/* Placeholder text for some profile fields. */
+"AvatarPickerProfile.ProfileFields.placeholder" = "İş, konum, zamirler vb.";
+
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "Üzgünüz, alt metni değiştirmeye çalışırken bir sorun yaşandı.";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "Görselin alt metni başarıyla değiştirildi.";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "Hay aksi, görseli silerken bir hata oluştu.";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "Üzgünüz, avatarınızı derecelendirmeye çalışırken bir sorun yaşandı.";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "Avatar derecelendirmesi başarıyla değiştirildi.";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "Hay aksi, avatarınızı paylaşmaya çalışırken bir şeyler yolunda gitmedi.";
diff --git a/Sources/GravatarUI/Resources/zh-Hans.lproj/Localizable.strings b/Sources/GravatarUI/Resources/zh-Hans.lproj/Localizable.strings
index 4185bf31..f671bd59 100644
--- a/Sources/GravatarUI/Resources/zh-Hans.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/zh-Hans.lproj/Localizable.strings
@@ -1,16 +1,52 @@
-/* Translation-Revision-Date: 2024-12-04 11:54:03+0000 */
+/* Translation-Revision-Date: 2025-01-14 13:54:02+0000 */
/* Plural-Forms: nplurals=1; plural=0; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: zh_CN */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "取消";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "编写替代文本…";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "保存";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "替代文本";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "大众级";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "辅导级";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "限制级";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "严加限制级";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "替代文本";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "删除";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "评级:%@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "共享";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "需要登录";
+/* Headline of an intro screen for editing a user's profile. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.headline" = "编辑您的个人资料";
+
+/* Subheadline of an intro screen for editing a user's profile. %@ is the name of a mobile app that uses Gravatar services. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subheadline" = "使用 Gravatar 完善您的 %@ 个人资料。";
+
+/* A message that informs the user about Gravatar. */
+"AvatarPicker.ContentLoading.Failure.MissingToken.subtext" = "一站式管理您的网络个人资料。";
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "重试";
@@ -33,12 +69,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "出于安全原因,会话已过期。 请登录以更新您的头像。";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "登录";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "要修改您的 Gravatar 个人资料,请先登录。";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "会话已过期";
@@ -54,6 +84,9 @@
/* Title of a message advising the user to setup their avatar */
"AvatarPicker.ContentLoading.success.title" = "让我们来设置您的头像";
+/* Title of a button that will proceed with the action. */
+"AvatarPicker.Continue.title" = "继续";
+
/* The title button which confirms the avatar deletion. */
"AvatarPicker.Deletion.Confirmation.ctaButtonTitle" = "删除";
@@ -69,6 +102,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "头像";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "未选择图片。 请选择一张图片,否则系统将使用默认图片。";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "所提供图片的大小超出最大值:10 MB";
@@ -84,9 +120,27 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "查看个人资料 →";
+/* Placeholder text for the name field */
+"AvatarPickerProfile.Name.placeholder" = "您的姓名";
+
+/* Placeholder text for some profile fields. */
+"AvatarPickerProfile.ProfileFields.placeholder" = "职位、地点、代号等。";
+
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "糟糕,尝试更新替代文本时出现错误。";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "图片替代文本更改成功。";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "糟糕,删除图片时出现错误。";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "糟糕,尝试给您的头像评级时出现错误。";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "头像评级更改成功。";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "糟糕,尝试共享您的头像时出现错误。";
diff --git a/Sources/GravatarUI/Resources/zh-Hant.lproj/Localizable.strings b/Sources/GravatarUI/Resources/zh-Hant.lproj/Localizable.strings
index d381c9ff..d55c389f 100644
--- a/Sources/GravatarUI/Resources/zh-Hant.lproj/Localizable.strings
+++ b/Sources/GravatarUI/Resources/zh-Hant.lproj/Localizable.strings
@@ -1,17 +1,44 @@
-/* Translation-Revision-Date: 2024-12-04 09:54:10+0000 */
+/* Translation-Revision-Date: 2024-12-26 09:54:04+0000 */
/* Plural-Forms: nplurals=1; plural=0; */
/* Generator: GlotPress/2.4.0-alpha */
/* Language: zh_TW */
+/* Title for Cancel button. */
+"AltText.Editor.cancelButtonTitle" = "取消";
+
+/* Placeholder text for Alt Text editor text field. */
+"AltText.Editor.placeholder" = "撰寫替代文字...";
+
+/* Title for Save button. */
+"AltText.Editor.saveButtonTitle" = "儲存";
+
+/* The title of Alt Text editor screen. */
+"AltText.Editor.title" = "替代文字";
+
+/* Rating that indicates that the avatar is suitable for everyone */
+"Avatar.Rating.G.subtitle" = "普遍級";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.PG.subtitle" = "輔導級";
+
+/* Rating that indicates that the avatar may not be suitable for children */
+"Avatar.Rating.R.subtitle" = "限制級";
+
+/* Rating that indicates that the avatar is obviously and extremely unsuitable for children */
+"Avatar.Rating.X.subtitle" = "超限制級";
+
+/* An option in the avatar menu that edits the avatar's Alt Text. */
+"AvatarPicker.AvatarAction.altText" = "替代文字";
+
/* An option in the avatar menu that deletes the avatar */
"AvatarPicker.AvatarAction.delete" = "刪除";
+/* An option in the avatar menu that shows the current rating, and allows the user to change that rating. The rating is used to indicate the appropriateness of an avatar for different audiences, and follows the US system of Motion Picture ratings: G, PG, R, and X. */
+"AvatarPicker.AvatarAction.rate" = "分級:%@";
+
/* An option in the avatar menu that shares the avatar */
"AvatarPicker.AvatarAction.share" = "分享…";
-/* Title of a message advising the user that something went wrong while trying to log in. */
-"AvatarPicker.ContentLoading.Failure.LogInError.title" = "需要登入";
-
/* Title of a button that allows the user to try loading their avatars again */
"AvatarPicker.ContentLoading.Failure.Retry.ctaButtonTitle" = "再試一次";
@@ -33,12 +60,6 @@
/* A message describing the error and advising the user to login again to resolve the issue */
"AvatarPicker.ContentLoading.Failure.SessionExpired.LogIn.subtext" = "基於安全考量,工作階段已過期。 請登入以更新大頭貼。";
-/* Title of a button that will begin the process of authenticating the user, appearing beneath a message stating that a previous log in attept has failed. */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.buttonTitle" = "登入";
-
-/* A message describing the error and advising the user to login again to resolve the issue */
-"AvatarPicker.ContentLoading.Failure.SessionExpired.LogInError.subtext" = "請先登入,才能修改 Gravatar 個人檔案。";
-
/* Title of a message advising the user that their login session has expired. */
"AvatarPicker.ContentLoading.Failure.SessionExpired.title" = "工作階段已過期";
@@ -69,6 +90,9 @@
/* Title appearing in the header of a view that allows users to manage their avatars */
"AvatarPicker.Header.title" = "大頭貼";
+/* Message displayed when no image is selected */
+"AvatarPicker.NoImageSelected.message" = "未選取圖片。 請選取圖片,不然系統就會使用預設圖片。";
+
/* Error message to show when the upload fails because the image is too big. */
"AvatarPicker.Upload.Error.ImageTooBig.Error" = "你提供的圖片超過大小上限:10MB";
@@ -84,9 +108,21 @@
/* Title of a button that will take you to your Gravatar profile, with an arrow indicating that this action will cause you to leave this view */
"AvatarPickerProfile.Button.ViewProfile.title" = "檢視個人檔案 →";
+/* This error message shows when the user attempts to change the alt text of an avatar and fails. */
+"AvatarPickerViewModel.AltText.Error" = "糟糕,嘗試更新替代文字時發生問題。";
+
+/* This confirmation message shows when the user has updated the alt text. */
+"AvatarPickerViewModel.AltText.Success" = "已成功變更圖片替代文字。";
+
/* This error message shows when the user attempts to delete an avatar and fails. */
"AvatarPickerViewModel.Delete.Error" = "糟糕,刪除圖片時發生錯誤。";
+/* This error message shows when the user attempts to change the rating of an avatar and fails. */
+"AvatarPickerViewModel.Rating.Error" = "糟糕,嘗試替大頭貼分級時發生問題。";
+
+/* This confirmation message shows when the user picks a different avatar rating and the change was applied successfully. */
+"AvatarPickerViewModel.RatingUpdate.Success" = "已成功變更大頭貼分級。";
+
/* This error message shows when the user attempts to share an avatar and fails. */
"AvatarPickerViewModel.Share.Fail" = "糟糕,嘗試分享大頭貼時發生問題。";
diff --git a/Sources/GravatarUI/SwiftUI/AvatarPicker/AvatarPickerView.swift b/Sources/GravatarUI/SwiftUI/AvatarPicker/AvatarPickerView.swift
index 8c6b3d94..b8c0f6d6 100644
--- a/Sources/GravatarUI/SwiftUI/AvatarPicker/AvatarPickerView.swift
+++ b/Sources/GravatarUI/SwiftUI/AvatarPicker/AvatarPickerView.swift
@@ -405,7 +405,7 @@ struct AvatarPickerView: View {
func notifyAvatarSelection() {
// Trigger the inner avatar refresh
model.forceRefreshAvatar = true
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
+ DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
// Reset the flag with a small delay otherwise the system ignores the value change.
model.forceRefreshAvatar = false
}
diff --git a/version.rb b/version.rb
index 54c177bf..9eee83e5 100644
--- a/version.rb
+++ b/version.rb
@@ -1,7 +1,7 @@
# frozen_string_literal: true
module Gravatar
- VERSION = '3.1.1'
+ VERSION = '3.2.0-rc.1'
SWIFT_VERSIONS = [
'5.10'
].freeze