Update API URL to myhoneydue.com, fix missing translations, and UI polish
- Update DEV API URLs from treytartt.com to api.myhoneydue.com - Add rounded corners to app icon in login, register, and onboarding screens - Add 9 missing English translations in Localizable.xcstrings - Fix property feature pills to use equal height for balanced layout - Remove duplicate honeyDue user scheme Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@@ -9,7 +9,7 @@ package com.tt.honeyDue.network
|
|||||||
*/
|
*/
|
||||||
object ApiConfig {
|
object ApiConfig {
|
||||||
// ⚠️ CHANGE THIS TO TOGGLE ENVIRONMENT ⚠️
|
// ⚠️ CHANGE THIS TO TOGGLE ENVIRONMENT ⚠️
|
||||||
val CURRENT_ENV = Environment.LOCAL
|
val CURRENT_ENV = Environment.DEV
|
||||||
|
|
||||||
enum class Environment {
|
enum class Environment {
|
||||||
LOCAL,
|
LOCAL,
|
||||||
@@ -22,7 +22,7 @@ object ApiConfig {
|
|||||||
fun getBaseUrl(): String {
|
fun getBaseUrl(): String {
|
||||||
return when (CURRENT_ENV) {
|
return when (CURRENT_ENV) {
|
||||||
Environment.LOCAL -> "http://${getLocalhostAddress()}:8000/api"
|
Environment.LOCAL -> "http://${getLocalhostAddress()}:8000/api"
|
||||||
Environment.DEV -> "https://honeyDue.treytartt.com/api"
|
Environment.DEV -> "https://api.myhoneydue.com/api"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ object ApiConfig {
|
|||||||
fun getMediaBaseUrl(): String {
|
fun getMediaBaseUrl(): String {
|
||||||
return when (CURRENT_ENV) {
|
return when (CURRENT_ENV) {
|
||||||
Environment.LOCAL -> "http://${getLocalhostAddress()}:8000"
|
Environment.LOCAL -> "http://${getLocalhostAddress()}:8000"
|
||||||
Environment.DEV -> "https://honeyDue.treytartt.com"
|
Environment.DEV -> "https://api.myhoneydue.com"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ object ApiConfig {
|
|||||||
fun getEnvironmentName(): String {
|
fun getEnvironmentName(): String {
|
||||||
return when (CURRENT_ENV) {
|
return when (CURRENT_ENV) {
|
||||||
Environment.LOCAL -> "Local (${getLocalhostAddress()}:8000)"
|
Environment.LOCAL -> "Local (${getLocalhostAddress()}:8000)"
|
||||||
Environment.DEV -> "Dev Server (honeyDue.treytartt.com)"
|
Environment.DEV -> "Dev Server (api.myhoneydue.com)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "icon.png",
|
"filename" : "HoneyDue-01-Standard@2x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"platform" : "ios",
|
"platform" : "ios",
|
||||||
"size" : "1024x1024"
|
"size" : "1024x1024"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "icon.pdf",
|
"filename" : "HoneyDue-01-Standard@2x.png",
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|||||||
BIN
iosApp/iosApp/Assets.xcassets/icon.imageset/HoneyDue-01-Standard@2x.png
vendored
Normal file
|
After Width: | Height: | Size: 1.2 MiB |
BIN
iosApp/iosApp/Assets.xcassets/icon.imageset/icon.pdf
vendored
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "house_outline.pdf",
|
"filename" : "outline.pdf",
|
||||||
"idiom" : "universal"
|
"idiom" : "universal"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
BIN
iosApp/iosApp/Assets.xcassets/outline.imageset/outline.pdf
vendored
Normal file
@@ -1,17 +1,17 @@
|
|||||||
{
|
{
|
||||||
"images" : [
|
"images" : [
|
||||||
{
|
{
|
||||||
"filename" : "house_outline 2.png",
|
"filename" : "outline_1x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "1x"
|
"scale" : "1x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "house_outline 1.png",
|
"filename" : "outline_2x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "2x"
|
"scale" : "2x"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"filename" : "house_outline.png",
|
"filename" : "outline_3x.png",
|
||||||
"idiom" : "universal",
|
"idiom" : "universal",
|
||||||
"scale" : "3x"
|
"scale" : "3x"
|
||||||
}
|
}
|
||||||
BIN
iosApp/iosApp/Assets.xcassets/tab_view.imageset/outline_1x.png
vendored
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
iosApp/iosApp/Assets.xcassets/tab_view.imageset/outline_2x.png
vendored
Normal file
|
After Width: | Height: | Size: 9.1 KiB |
BIN
iosApp/iosApp/Assets.xcassets/tab_view.imageset/outline_3x.png
vendored
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 3.5 KiB |
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 5.7 KiB |
@@ -469,7 +469,7 @@ struct ContractorDetailView: View {
|
|||||||
if let residenceId = residenceId {
|
if let residenceId = residenceId {
|
||||||
DetailSection(title: L10n.Contractors.associatedPropertySection) {
|
DetailSection(title: L10n.Contractors.associatedPropertySection) {
|
||||||
HStack(spacing: AppSpacing.sm) {
|
HStack(spacing: AppSpacing.sm) {
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ struct ContractorFormSheet: View {
|
|||||||
Section {
|
Section {
|
||||||
Button(action: { showingResidencePicker = true }) {
|
Button(action: { showingResidencePicker = true }) {
|
||||||
HStack {
|
HStack {
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -471,7 +471,7 @@ struct FloatingLeaf: View {
|
|||||||
|
|
||||||
// Organic Stat Pills
|
// Organic Stat Pills
|
||||||
HStack(spacing: 12) {
|
HStack(spacing: 12) {
|
||||||
OrganicStatPill(icon: "house_outline", value: "3", label: "Properties", isSystemIcon: false)
|
OrganicStatPill(icon: "outline", value: "3", label: "Properties", isSystemIcon: false)
|
||||||
OrganicStatPill(icon: "checklist", value: "12", label: "Tasks", color: .orange)
|
OrganicStatPill(icon: "checklist", value: "12", label: "Tasks", color: .orange)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,8 @@
|
|||||||
{
|
{
|
||||||
"sourceLanguage": "en",
|
"sourceLanguage": "en",
|
||||||
"strings": {
|
"strings": {
|
||||||
"*" : {
|
"*": {},
|
||||||
|
"%@": {},
|
||||||
},
|
|
||||||
"%@" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"%@ (%lld)": {
|
"%@ (%lld)": {
|
||||||
"comment": "A heading that lists the number of users in a residence. The argument is the count of users.",
|
"comment": "A heading that lists the number of users in a residence. The argument is the count of users.",
|
||||||
"isCommentAutoGenerated": true,
|
"isCommentAutoGenerated": true,
|
||||||
@@ -67,9 +63,7 @@
|
|||||||
"comment": "A badge displaying the number of tasks selected within a category.",
|
"comment": "A badge displaying the number of tasks selected within a category.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"%lld / 5" : {
|
"%lld / 5": {},
|
||||||
|
|
||||||
},
|
|
||||||
"%lld %@": {
|
"%lld %@": {
|
||||||
"comment": "A text that shows the number of residences the user has.",
|
"comment": "A text that shows the number of residences the user has.",
|
||||||
"isCommentAutoGenerated": true,
|
"isCommentAutoGenerated": true,
|
||||||
@@ -82,9 +76,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"%lld common tasks" : {
|
"%lld common tasks": {},
|
||||||
|
|
||||||
},
|
|
||||||
"%lld/%lld tasks selected": {
|
"%lld/%lld tasks selected": {
|
||||||
"localizations": {
|
"localizations": {
|
||||||
"en": {
|
"en": {
|
||||||
@@ -99,25 +91,15 @@
|
|||||||
"comment": "A separator between different pieces of information in a text.",
|
"comment": "A separator between different pieces of information in a text.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"• 10K+ homeowners" : {
|
"• 10K+ homeowners": {},
|
||||||
|
"+%lld": {},
|
||||||
},
|
"$": {},
|
||||||
"+%lld" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"$" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"000000": {
|
"000000": {
|
||||||
"comment": "A placeholder text for a 6-digit code field.",
|
"comment": "A placeholder text for a 6-digit code field.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"0.00" : {
|
"0.00": {},
|
||||||
|
"4.9": {},
|
||||||
},
|
|
||||||
"4.9" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"7-day free trial, then %@%@": {
|
"7-day free trial, then %@%@": {
|
||||||
"localizations": {
|
"localizations": {
|
||||||
"en": {
|
"en": {
|
||||||
@@ -128,12 +110,8 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"12345" : {
|
"12345": {},
|
||||||
|
"ABC123": {},
|
||||||
},
|
|
||||||
"ABC123" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Actions": {
|
"Actions": {
|
||||||
"comment": "A label for the actions menu in the task card.",
|
"comment": "A label for the actions menu in the task card.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -148,16 +126,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Add Most Popular" : {
|
"Add Most Popular": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Add your first property to get started!": {
|
"Add your first property to get started!": {
|
||||||
"comment": "A description below the image in the \"No properties yet\" view, encouraging the user to add their first property.",
|
"comment": "A description below the image in the \"No properties yet\" view, encouraging the user to add their first property.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Already have an account?" : {
|
"Already have an account?": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Already have an account? Log in": {
|
"Already have an account? Log in": {
|
||||||
"comment": "A link that directs users to log in if they already have an account.",
|
"comment": "A link that directs users to log in if they already have an account.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -316,9 +290,7 @@
|
|||||||
"comment": "An alert message displayed when a user taps the \"Cancel Task\" button in a task list. It confirms that the user intends to cancel the task and provides a way to undo the action.",
|
"comment": "An alert message displayed when a user taps the \"Cancel Task\" button in a task list. It confirms that the user intends to cancel the task and provides a way to undo the action.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Are you sure you want to remove %@ from this residence?" : {
|
"Are you sure you want to remove %@ from this residence?": {},
|
||||||
|
|
||||||
},
|
|
||||||
"auth_account_info": {
|
"auth_account_info": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
"localizations": {
|
"localizations": {
|
||||||
@@ -386,10 +358,25 @@
|
|||||||
},
|
},
|
||||||
"auth_already_have_account": {
|
"auth_already_have_account": {
|
||||||
"comment": "Text on the \"Already have an account?\" link in the auth register screen. Navigates to the auth login screen.",
|
"comment": "Text on the \"Already have an account?\" link in the auth register screen. Navigates to the auth login screen.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "Already have an account?"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"auth_creating_account": {
|
"auth_creating_account": {
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "Creating Account..."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"auth_dont_have_account": {
|
"auth_dont_have_account": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
@@ -3058,7 +3045,15 @@
|
|||||||
},
|
},
|
||||||
"auth_sign_in": {
|
"auth_sign_in": {
|
||||||
"comment": "Button text that allows a user to sign in.",
|
"comment": "Button text that allows a user to sign in.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "Sign In"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"auth_sign_in_subtitle": {
|
"auth_sign_in_subtitle": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
@@ -4230,16 +4225,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Back" : {
|
"Back": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Back to Login": {
|
"Back to Login": {
|
||||||
"comment": "A button label that takes the user back to the login screen.",
|
"comment": "A button label that takes the user back to the login screen.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Browse Task Templates" : {
|
"Browse Task Templates": {},
|
||||||
|
|
||||||
},
|
|
||||||
"By: %@": {
|
"By: %@": {
|
||||||
"comment": "A line in the checkout view displaying the name of the contractor who completed a task.",
|
"comment": "A line in the checkout view displaying the name of the contractor who completed a task.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -4248,12 +4239,8 @@
|
|||||||
"comment": "The label of a button that dismisses an alert.",
|
"comment": "The label of a button that dismisses an alert.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Cancel anytime in Settings • No commitment" : {
|
"Cancel anytime in Settings • No commitment": {},
|
||||||
|
"Cancel Task": {},
|
||||||
},
|
|
||||||
"Cancel Task" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Caption": {
|
"Caption": {
|
||||||
"comment": "A label displayed above the caption of an image in the photo viewer.",
|
"comment": "A label displayed above the caption of an image in the photo viewer.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -4270,19 +4257,13 @@
|
|||||||
"comment": "A description below the \"Send New Code\" button, instructing the user to check their spam folder if they haven't received the verification code.",
|
"comment": "A description below the \"Send New Code\" button, instructing the user to check their spam folder if they haven't received the verification code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Choose from common home maintenance tasks or create your own below" : {
|
"Choose from common home maintenance tasks or create your own below": {},
|
||||||
|
"Choose your plan": {},
|
||||||
},
|
|
||||||
"Choose your plan" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Choose Your Plan": {
|
"Choose Your Plan": {
|
||||||
"comment": "A heading displayed at the top of the feature comparison view.",
|
"comment": "A heading displayed at the top of the feature comparison view.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Close" : {
|
"Close": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Code expires in 15 minutes": {
|
"Code expires in 15 minutes": {
|
||||||
"comment": "A description of how long the verification code is valid for.",
|
"comment": "A description of how long the verification code is valid for.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -5304,18 +5285,10 @@
|
|||||||
"comment": "The title for the view that shows a user's photo submissions.",
|
"comment": "The title for the view that shows a user's photo submissions.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"CONFIRM PASSWORD" : {
|
"CONFIRM PASSWORD": {},
|
||||||
|
"Continue": {},
|
||||||
},
|
"Continue with Free": {},
|
||||||
"Continue" : {
|
"Contractor Imported": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Continue with Free" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Contractor Imported" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Contractors": {
|
"Contractors": {
|
||||||
"comment": "A tab label for the contractors section.",
|
"comment": "A tab label for the contractors section.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -8964,18 +8937,10 @@
|
|||||||
"comment": "A label displaying the cost of a task completion. The argument is the cost of the completion.",
|
"comment": "A label displaying the cost of a task completion. The argument is the cost of the completion.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Create a strong password to secure your account" : {
|
"Create a strong password to secure your account": {},
|
||||||
|
"Create Account": {},
|
||||||
},
|
"Create Account with Email": {},
|
||||||
"Create Account" : {
|
"Creating Account...": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Create Account with Email" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Creating Account..." : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Didn't receive a code? Check your spam folder or re-register": {
|
"Didn't receive a code? Check your spam folder or re-register": {
|
||||||
"comment": "A hint instructing the user to check their spam folder if they haven't received the verification code.",
|
"comment": "A hint instructing the user to check their spam folder if they haven't received the verification code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -16983,16 +16948,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Don't worry, nothing's written in stone here.\nYou can always change it later in the app." : {
|
"Don't worry, nothing's written in stone here.\nYou can always change it later in the app.": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Done": {
|
"Done": {
|
||||||
"comment": "A button that dismisses an image viewer sheet.",
|
"comment": "A button that dismisses an image viewer sheet.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Downloading..." : {
|
"Downloading...": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Easy Share": {
|
"Easy Share": {
|
||||||
"comment": "A section header for the \"Easy Share\" feature on the Share Code Card.",
|
"comment": "A section header for the \"Easy Share\" feature on the Share Code Card.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17005,9 +16966,7 @@
|
|||||||
"comment": "A label for an \"Edit Task\" button.",
|
"comment": "A label for an \"Edit Task\" button.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"EMAIL" : {
|
"EMAIL": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Email Address": {
|
"Email Address": {
|
||||||
"comment": "A label for the user to input their email address.",
|
"comment": "A label for the user to input their email address.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17016,9 +16975,7 @@
|
|||||||
"comment": "A placeholder text for a text field where a user can enter a 6-digit code.",
|
"comment": "A placeholder text for a text field where a user can enter a 6-digit code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Enter new password" : {
|
"Enter new password": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Enter share code": {
|
"Enter share code": {
|
||||||
"comment": "A placeholder text for the user to enter the share code.",
|
"comment": "A placeholder text for the user to enter the share code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17031,16 +16988,12 @@
|
|||||||
"comment": "A footer label explaining that users should enter the 6-digit code they received in their email.",
|
"comment": "A footer label explaining that users should enter the 6-digit code they received in their email.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Enter the number of days between each occurrence" : {
|
"Enter the number of days between each occurrence": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Enter your email address and we'll send you a verification code": {
|
"Enter your email address and we'll send you a verification code": {
|
||||||
"comment": "A description below the email input field, instructing the user to enter their email address to receive a password reset code.",
|
"comment": "A description below the email input field, instructing the user to enter their email address to receive a password reset code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Enter your ZIP code so we can suggest\nmaintenance tasks for your climate region." : {
|
"Enter your ZIP code so we can suggest\nmaintenance tasks for your climate region.": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Error": {
|
"Error": {
|
||||||
"comment": "The title of an alert that appears when there's an error.",
|
"comment": "The title of an alert that appears when there's an error.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17390,9 +17343,7 @@
|
|||||||
"comment": "A label indicating a free feature.",
|
"comment": "A label indicating a free feature.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Free trial ends %@" : {
|
"Free trial ends %@": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Generate Code": {
|
"Generate Code": {
|
||||||
"comment": "A button label that generates a new invitation code.",
|
"comment": "A button label that generates a new invitation code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17401,22 +17352,14 @@
|
|||||||
"comment": "A button label that appears when a user wants to generate a new invitation code.",
|
"comment": "A button label that appears when a user wants to generate a new invitation code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Google Sign-In Error" : {
|
"Google Sign-In Error": {},
|
||||||
|
"Help improve honeyDue by sharing anonymous usage data": {},
|
||||||
},
|
"Here are tasks recommended for your area.\nPick the ones you'd like to track!": {},
|
||||||
"Help improve honeyDue by sharing anonymous usage data" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Here are tasks recommended for your area.\nPick the ones you'd like to track!" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"honeyDue": {
|
"honeyDue": {
|
||||||
"comment": "The name of the app.",
|
"comment": "The name of the app.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"HONEYDUE PRO" : {
|
"HONEYDUE PRO": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Hour": {
|
"Hour": {
|
||||||
"comment": "A picker for selecting an hour.",
|
"comment": "A picker for selecting an hour.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17473,65 +17416,39 @@
|
|||||||
"comment": "A button label that allows a user to join an existing residence.",
|
"comment": "A button label that allows a user to join an existing residence.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Joined Residence" : {
|
"Joined Residence": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Joining residence...": {
|
"Joining residence...": {
|
||||||
"comment": "A message displayed while waiting for the app to join a residence.",
|
"comment": "A message displayed while waiting for the app to join a residence.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Joining..." : {
|
"Joining...": {},
|
||||||
|
"Let's get you started with some tasks.\nThe more you pick, the more we'll help you remember!": {},
|
||||||
},
|
"Let's give your place a name!": {},
|
||||||
"Let's get you started with some tasks.\nThe more you pick, the more we'll help you remember!" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Let's give your place a name!" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Loading...": {
|
"Loading...": {
|
||||||
"comment": "A placeholder text indicating that content is loading.",
|
"comment": "A placeholder text indicating that content is loading.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Log in" : {
|
"Log in": {},
|
||||||
|
"Logging in...": {},
|
||||||
},
|
"Manage at honeyDue.treytartt.com": {},
|
||||||
"Logging in..." : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Manage at honeyDue.treytartt.com" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Manage your subscription at honeyDue.treytartt.com": {
|
"Manage your subscription at honeyDue.treytartt.com": {
|
||||||
"comment": "A description of how to manage a subscription on a third-party platform.",
|
"comment": "A description of how to manage a subscription on a third-party platform.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Manage your subscription on your Android device" : {
|
"Manage your subscription on your Android device": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Mark Task In Progress": {
|
"Mark Task In Progress": {
|
||||||
"comment": "A button label that says \"Mark Task In Progress\".",
|
"comment": "A button label that says \"Mark Task In Progress\".",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Need inspiration?" : {
|
"Need inspiration?": {},
|
||||||
|
"NEW PASSWORD": {},
|
||||||
},
|
|
||||||
"NEW PASSWORD" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"No active code": {
|
"No active code": {
|
||||||
"comment": "A message indicating that a user does not have an active share code.",
|
"comment": "A message indicating that a user does not have an active share code.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"No personal data is collected. Analytics are fully anonymous." : {
|
"No personal data is collected. Analytics are fully anonymous.": {},
|
||||||
|
"No properties yet": {},
|
||||||
},
|
"No shared users": {},
|
||||||
"No properties yet" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"No shared users" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"No Tasks": {
|
"No Tasks": {
|
||||||
"comment": "A description displayed when there are no tasks to display in a column view.",
|
"comment": "A description displayed when there are no tasks to display in a column view.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17568,9 +17485,7 @@
|
|||||||
"comment": "A button label that opens the user's subscription management page in a web browser.",
|
"comment": "A button label that opens the user's subscription management page in a web browser.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"or" : {
|
"or": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Overview": {
|
"Overview": {
|
||||||
"comment": "The title of the overview card.",
|
"comment": "The title of the overview card.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17579,9 +17494,7 @@
|
|||||||
"comment": "A label indicating that a user is an owner of a residence.",
|
"comment": "A label indicating that a user is an owner of a residence.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"PASSWORD REQUIREMENTS" : {
|
"PASSWORD REQUIREMENTS": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Photo": {
|
"Photo": {
|
||||||
"comment": "A title for a view that displays a single photo.",
|
"comment": "A title for a view that displays a single photo.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -17590,9 +17503,7 @@
|
|||||||
"comment": "A label indicating that a residence is the user's primary residence.",
|
"comment": "A label indicating that a residence is the user's primary residence.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Privacy" : {
|
"Privacy": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Pro": {
|
"Pro": {
|
||||||
"comment": "The title of the \"Pro\" plan in the feature comparison view.",
|
"comment": "The title of the \"Pro\" plan in the feature comparison view.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -21644,18 +21555,10 @@
|
|||||||
"comment": "A fallback text that appears when the associated residence ID is not found in the user's residences. The placeholder number is replaced with the actual residence ID.",
|
"comment": "A fallback text that appears when the associated residence ID is not found in the user's residences. The placeholder number is replaced with the actual residence ID.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Quick Start" : {
|
"Quick Start": {},
|
||||||
|
"Re-enter new password": {},
|
||||||
},
|
"Remove": {},
|
||||||
"Re-enter new password" : {
|
"Remove User": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Remove" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Remove User" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Reset All Tasks": {
|
"Reset All Tasks": {
|
||||||
"comment": "A button label that resets all tasks.",
|
"comment": "A button label that resets all tasks.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -21664,9 +21567,7 @@
|
|||||||
"comment": "The title of the screen where users can reset their passwords.",
|
"comment": "The title of the screen where users can reset their passwords.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Resetting..." : {
|
"Resetting...": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Residences": {
|
"Residences": {
|
||||||
"comment": "A label for the \"Residences\" tab in the main tab view.",
|
"comment": "A label for the \"Residences\" tab in the main tab view.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -24811,16 +24712,12 @@
|
|||||||
"comment": "A button label that appears when the app is unable to load in-app purchase products. It instructs the user to try again.",
|
"comment": "A button label that appears when the app is unable to load in-app purchase products. It instructs the user to try again.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Return to Login" : {
|
"Return to Login": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Save": {
|
"Save": {
|
||||||
"comment": "The text for a button that saves the selected time.",
|
"comment": "The text for a button that saves the selected time.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Save your home to your account" : {
|
"Save your home to your account": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Search templates...": {
|
"Search templates...": {
|
||||||
"comment": "A placeholder text for a search bar in the task templates browser.",
|
"comment": "A placeholder text for a search bar in the task templates browser.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -24829,9 +24726,7 @@
|
|||||||
"comment": "A label displayed above the picker for selecting the notification time.",
|
"comment": "A label displayed above the picker for selecting the notification time.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Send a .honeydue file via Messages, Email, or AirDrop. They just tap to join." : {
|
"Send a .honeydue file via Messages, Email, or AirDrop. They just tap to join.": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Send Invite Link": {
|
"Send Invite Link": {
|
||||||
"comment": "A button label for sending an invitation link to others.",
|
"comment": "A button label for sending an invitation link to others.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -24844,16 +24739,12 @@
|
|||||||
"comment": "A button label that says \"Send Reset Code\".",
|
"comment": "A button label that says \"Send Reset Code\".",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Sending..." : {
|
"Sending...": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Set Custom Time": {
|
"Set Custom Time": {
|
||||||
"comment": "A button that allows a user to set a custom notification time.",
|
"comment": "A button that allows a user to set a custom notification time.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Set New Password" : {
|
"Set New Password": {},
|
||||||
|
|
||||||
},
|
|
||||||
"settings_language": {
|
"settings_language": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
"localizations": {
|
"localizations": {
|
||||||
@@ -24984,9 +24875,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Share Analytics" : {
|
"Share Analytics": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Share Code": {
|
"Share Code": {
|
||||||
"comment": "A label displayed above the share code section of the view.",
|
"comment": "A label displayed above the share code section of the view.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -24995,29 +24884,19 @@
|
|||||||
"comment": "A description of how to share the invitation code with others.",
|
"comment": "A description of how to share the invitation code with others.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Shared Users (%lld)" : {
|
"Shared Users (%lld)": {},
|
||||||
|
"Sign in with Google": {},
|
||||||
},
|
"Signing in with Apple...": {},
|
||||||
"Sign in with Google" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Signing in with Apple..." : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Skip": {
|
"Skip": {
|
||||||
"comment": "A button label that allows users to skip the current onboarding step.",
|
"comment": "A button label that allows users to skip the current onboarding step.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Skip for Now" : {
|
"Skip for Now": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Something went wrong": {
|
"Something went wrong": {
|
||||||
"comment": "A description of an error that occurs during an asynchronous operation.",
|
"comment": "A description of an error that occurs during an asynchronous operation.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Start 7-Day Free Trial" : {
|
"Start 7-Day Free Trial": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Start Fresh": {
|
"Start Fresh": {
|
||||||
"comment": "A button label that says \"Start Fresh\".",
|
"comment": "A button label that says \"Start Fresh\".",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -25034,9 +24913,7 @@
|
|||||||
"comment": "A hint displayed in the \"Tasks\" section of the app, encouraging users to swipe to view their tasks.",
|
"comment": "A hint displayed in the \"Tasks\" section of the app, encouraging users to swipe to view their tasks.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Take your home management\nto the next level" : {
|
"Take your home management\nto the next level": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Tap the + icon in the top right\nto add your first property": {
|
"Tap the + icon in the top right\nto add your first property": {
|
||||||
"comment": "A description of an action a user can take to add a property.",
|
"comment": "A description of an action a user can take to add a property.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -25701,7 +25578,15 @@
|
|||||||
},
|
},
|
||||||
"tasks_browse_templates": {
|
"tasks_browse_templates": {
|
||||||
"comment": "Text for browsing task templates.",
|
"comment": "Text for browsing task templates.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "Browse Templates"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"tasks_cancel": {
|
"tasks_cancel": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
@@ -28067,7 +27952,15 @@
|
|||||||
},
|
},
|
||||||
"tasks_no_templates_found": {
|
"tasks_no_templates_found": {
|
||||||
"comment": "Text displayed when no task templates are found.",
|
"comment": "Text displayed when no task templates are found.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "No templates found"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"tasks_none": {
|
"tasks_none": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
@@ -29046,11 +28939,27 @@
|
|||||||
},
|
},
|
||||||
"tasks_result": {
|
"tasks_result": {
|
||||||
"comment": "A singular label for a result in a list. E.g. \"1 result\", \"2 results\".",
|
"comment": "A singular label for a result in a list. E.g. \"1 result\", \"2 results\".",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "result"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"tasks_results": {
|
"tasks_results": {
|
||||||
"comment": "Plural form of \"result\".",
|
"comment": "Plural form of \"result\".",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "results"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"tasks_scheduling": {
|
"tasks_scheduling": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
@@ -29119,7 +29028,15 @@
|
|||||||
},
|
},
|
||||||
"tasks_search_templates": {
|
"tasks_search_templates": {
|
||||||
"comment": "Title of a screen that allows users to search for task templates.",
|
"comment": "Title of a screen that allows users to search for task templates.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "Search templates..."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"tasks_select_category": {
|
"tasks_select_category": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
@@ -29903,7 +29820,15 @@
|
|||||||
},
|
},
|
||||||
"tasks_try_different_search": {
|
"tasks_try_different_search": {
|
||||||
"comment": "Text to prompt the user to try a different search query when no task templates are found.",
|
"comment": "Text to prompt the user to try a different search query when no task templates are found.",
|
||||||
"isCommentAutoGenerated" : true
|
"isCommentAutoGenerated": true,
|
||||||
|
"localizations": {
|
||||||
|
"en": {
|
||||||
|
"stringUnit": {
|
||||||
|
"state": "translated",
|
||||||
|
"value": "Try a different search term"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"tasks_unarchive": {
|
"tasks_unarchive": {
|
||||||
"extractionState": "manual",
|
"extractionState": "manual",
|
||||||
@@ -30104,12 +30029,8 @@
|
|||||||
"comment": "A description text displayed when there are no task templates available.",
|
"comment": "A description text displayed when there are no task templates available.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"That's Perfect!" : {
|
"That's Perfect!": {},
|
||||||
|
"The Smith Residence": {},
|
||||||
},
|
|
||||||
"The Smith Residence" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Try a different search term": {
|
"Try a different search term": {
|
||||||
"comment": "A description below the \"No Templates Found\" message in the search results section of the task templates browser.",
|
"comment": "A description below the \"No Templates Found\" message in the search results section of the task templates browser.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -30122,23 +30043,17 @@
|
|||||||
"comment": "A button that unarchives a task.",
|
"comment": "A button that unarchives a task.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Unarchive Task" : {
|
"Unarchive Task": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Upgrade to Pro for unlimited access": {
|
"Upgrade to Pro for unlimited access": {
|
||||||
"comment": "A description of the benefit of upgrading to the Pro plan.",
|
"comment": "A description of the benefit of upgrading to the Pro plan.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Use the share button to invite others" : {
|
"Use the share button to invite others": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Using system default time": {
|
"Using system default time": {
|
||||||
"comment": "A description of how a user can set a custom notification time.",
|
"comment": "A description of how a user can set a custom notification time.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"VERIFICATION CODE" : {
|
"VERIFICATION CODE": {},
|
||||||
|
|
||||||
},
|
|
||||||
"Verify": {
|
"Verify": {
|
||||||
"comment": "A button label that says \"Verify\".",
|
"comment": "A button label that says \"Verify\".",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -30179,9 +30094,7 @@
|
|||||||
"comment": "A welcoming message displayed at the top of the \"Organic Empty Residences\" view.",
|
"comment": "A welcoming message displayed at the top of the \"Organic Empty Residences\" view.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Where's your home?" : {
|
"Where's your home?": {},
|
||||||
|
|
||||||
},
|
|
||||||
"You now have access to %@.": {
|
"You now have access to %@.": {
|
||||||
"comment": "A message displayed when a user successfully imports a residence, indicating that they now have access to it. The argument is the name of the residence that was imported.",
|
"comment": "A message displayed when a user successfully imports a residence, indicating that they now have access to it. The argument is the name of the residence that was imported.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -30190,19 +30103,13 @@
|
|||||||
"comment": "A message displayed to users after successfully upgrading to the Pro version of the app.",
|
"comment": "A message displayed to users after successfully upgrading to the Pro version of the app.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"You're all set up!" : {
|
"You're all set up!": {},
|
||||||
|
|
||||||
},
|
|
||||||
"You're already subscribed": {
|
"You're already subscribed": {
|
||||||
"comment": "A message displayed when a user is already subscribed to the app.",
|
"comment": "A message displayed when a user is already subscribed to the app.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Your data will be synced across devices" : {
|
"Your data will be synced across devices": {},
|
||||||
|
"Your Home Dashboard": {},
|
||||||
},
|
|
||||||
"Your Home Dashboard" : {
|
|
||||||
|
|
||||||
},
|
|
||||||
"Your home maintenance companion": {
|
"Your home maintenance companion": {
|
||||||
"comment": "The tagline for the app, describing its purpose.",
|
"comment": "The tagline for the app, describing its purpose.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
@@ -30211,9 +30118,7 @@
|
|||||||
"comment": "A description of a user's subscription on an unspecified platform.",
|
"comment": "A description of a user's subscription on an unspecified platform.",
|
||||||
"isCommentAutoGenerated": true
|
"isCommentAutoGenerated": true
|
||||||
},
|
},
|
||||||
"Your subscription is managed through Google Play on your Android device." : {
|
"Your subscription is managed through Google Play on your Android device.": {}
|
||||||
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"version": "1.1"
|
"version": "1.1"
|
||||||
}
|
}
|
||||||
@@ -62,6 +62,7 @@ struct LoginView: View {
|
|||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: 80, height: 80)
|
.frame(width: 80, height: 80)
|
||||||
|
.clipShape(RoundedRectangle(cornerRadius: 18, style: .continuous))
|
||||||
}
|
}
|
||||||
|
|
||||||
VStack(spacing: 8) {
|
VStack(spacing: 8) {
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ struct MainTabView: View {
|
|||||||
}
|
}
|
||||||
.id(refreshID)
|
.id(refreshID)
|
||||||
.tabItem {
|
.tabItem {
|
||||||
Label("Residences", image: "tab_view_house")
|
Label("Residences", image: "tab_view")
|
||||||
}
|
}
|
||||||
.tag(Tab.residences)
|
.tag(Tab.residences)
|
||||||
.accessibilityIdentifier(AccessibilityIdentifiers.Navigation.residencesTab)
|
.accessibilityIdentifier(AccessibilityIdentifiers.Navigation.residencesTab)
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ struct OnboardingNameResidenceContent: View {
|
|||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: 100, height: 100)
|
.frame(width: 100, height: 100)
|
||||||
|
.clipShape(RoundedRectangle(cornerRadius: 22, style: .continuous))
|
||||||
.naturalShadow(.pronounced)
|
.naturalShadow(.pronounced)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +146,7 @@ struct OnboardingNameResidenceContent: View {
|
|||||||
)
|
)
|
||||||
.frame(width: 40, height: 40)
|
.frame(width: 40, height: 40)
|
||||||
|
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ struct OnboardingWelcomeView: View {
|
|||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: 24, height: 24)
|
.frame(width: 24, height: 24)
|
||||||
|
.clipShape(RoundedRectangle(cornerRadius: 6, style: .continuous))
|
||||||
Text("Start Fresh")
|
Text("Start Fresh")
|
||||||
.font(.system(size: 17, weight: .semibold))
|
.font(.system(size: 17, weight: .semibold))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -207,7 +207,7 @@ struct NotificationPreferencesView: View {
|
|||||||
.foregroundColor(Color.appTextSecondary)
|
.foregroundColor(Color.appTextSecondary)
|
||||||
}
|
}
|
||||||
} icon: {
|
} icon: {
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.resizable()
|
.resizable()
|
||||||
.frame(width: 22, height: 22)
|
.frame(width: 22, height: 22)
|
||||||
.foregroundColor(Color.appTextOnPrimary)
|
.foregroundColor(Color.appTextOnPrimary)
|
||||||
|
|||||||
@@ -273,7 +273,7 @@ private struct OrganicEmptyResidencesView: View {
|
|||||||
.fill(Color.appPrimary.opacity(0.1))
|
.fill(Color.appPrimary.opacity(0.1))
|
||||||
.frame(width: 100, height: 100)
|
.frame(width: 100, height: 100)
|
||||||
|
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ struct UpgradeFeatureView: View {
|
|||||||
PromoContentView(content: promoContent)
|
PromoContentView(content: promoContent)
|
||||||
} else {
|
} else {
|
||||||
VStack(alignment: .leading, spacing: 14) {
|
VStack(alignment: .leading, spacing: 14) {
|
||||||
OrganicUpgradeFeatureRow(icon: "house_outline", text: "Unlimited properties")
|
OrganicUpgradeFeatureRow(icon: "outline", text: "Unlimited properties")
|
||||||
OrganicUpgradeFeatureRow(icon: "checkmark.circle.fill", text: "Unlimited tasks")
|
OrganicUpgradeFeatureRow(icon: "checkmark.circle.fill", text: "Unlimited tasks")
|
||||||
OrganicUpgradeFeatureRow(icon: "person.2.fill", text: "Contractor management")
|
OrganicUpgradeFeatureRow(icon: "person.2.fill", text: "Contractor management")
|
||||||
OrganicUpgradeFeatureRow(icon: "doc.fill", text: "Document & warranty storage")
|
OrganicUpgradeFeatureRow(icon: "doc.fill", text: "Document & warranty storage")
|
||||||
@@ -251,8 +251,8 @@ private struct OrganicUpgradeFeatureRow: View {
|
|||||||
Circle()
|
Circle()
|
||||||
.fill(Color.appPrimary.opacity(0.1))
|
.fill(Color.appPrimary.opacity(0.1))
|
||||||
.frame(width: 36, height: 36)
|
.frame(width: 36, height: 36)
|
||||||
if icon == "house_outline" {
|
if icon == "outline" {
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ struct UpgradePromptView: View {
|
|||||||
PromoContentView(content: promoContent)
|
PromoContentView(content: promoContent)
|
||||||
} else {
|
} else {
|
||||||
VStack(alignment: .leading, spacing: 14) {
|
VStack(alignment: .leading, spacing: 14) {
|
||||||
OrganicFeatureRow(icon: "house_outline", text: "Unlimited properties")
|
OrganicFeatureRow(icon: "outline", text: "Unlimited properties")
|
||||||
OrganicFeatureRow(icon: "checkmark.circle.fill", text: "Unlimited tasks")
|
OrganicFeatureRow(icon: "checkmark.circle.fill", text: "Unlimited tasks")
|
||||||
OrganicFeatureRow(icon: "person.2.fill", text: "Contractor management")
|
OrganicFeatureRow(icon: "person.2.fill", text: "Contractor management")
|
||||||
OrganicFeatureRow(icon: "doc.fill", text: "Document & warranty storage")
|
OrganicFeatureRow(icon: "doc.fill", text: "Document & warranty storage")
|
||||||
@@ -374,8 +374,8 @@ private struct OrganicFeatureRow: View {
|
|||||||
Circle()
|
Circle()
|
||||||
.fill(Color.appPrimary.opacity(0.1))
|
.fill(Color.appPrimary.opacity(0.1))
|
||||||
.frame(width: 36, height: 36)
|
.frame(width: 36, height: 36)
|
||||||
if icon == "house_outline" {
|
if icon == "outline" {
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ struct LoginHeader: View {
|
|||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
.frame(width: 80, height: 80)
|
.frame(width: 80, height: 80)
|
||||||
.foregroundColor(Color.appPrimary)
|
.clipShape(RoundedRectangle(cornerRadius: 18, style: .continuous))
|
||||||
|
|
||||||
Text("honeyDue")
|
Text("honeyDue")
|
||||||
.font(.largeTitle)
|
.font(.largeTitle)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ struct OverviewCard: View {
|
|||||||
// Stats Grid
|
// Stats Grid
|
||||||
HStack(spacing: AppSpacing.md) {
|
HStack(spacing: AppSpacing.md) {
|
||||||
StatView(
|
StatView(
|
||||||
icon: "house_outline",
|
icon: "outline",
|
||||||
value: "\(summary.totalResidences)",
|
value: "\(summary.totalResidences)",
|
||||||
label: "Properties",
|
label: "Properties",
|
||||||
color: Color.appPrimary
|
color: Color.appPrimary
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ struct StatView: View {
|
|||||||
/// Convenience initializer that accepts a plain string for backward compatibility.
|
/// Convenience initializer that accepts a plain string for backward compatibility.
|
||||||
/// Asset names are detected automatically; everything else is treated as an SF Symbol.
|
/// Asset names are detected automatically; everything else is treated as an SF Symbol.
|
||||||
init(icon: String, value: String, label: String, color: Color = Color.appPrimary) {
|
init(icon: String, value: String, label: String, color: Color = Color.appPrimary) {
|
||||||
if icon == "house_outline" {
|
if icon == "outline" {
|
||||||
self.icon = .asset(icon)
|
self.icon = .asset(icon)
|
||||||
} else {
|
} else {
|
||||||
self.icon = .system(icon)
|
self.icon = .system(icon)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ struct EmptyResidencesView: View {
|
|||||||
.fill(Color.appPrimary.opacity(0.08))
|
.fill(Color.appPrimary.opacity(0.08))
|
||||||
.frame(width: 120, height: 120)
|
.frame(width: 120, height: 120)
|
||||||
|
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ private struct PropertyDetailIcon: View {
|
|||||||
.frame(width: 48, height: 48)
|
.frame(width: 48, height: 48)
|
||||||
|
|
||||||
// Icon
|
// Icon
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: 22, height: 22)
|
.frame(width: 22, height: 22)
|
||||||
@@ -244,7 +244,8 @@ private struct PropertyFeaturePill: View {
|
|||||||
.font(.system(size: 11, weight: .medium))
|
.font(.system(size: 11, weight: .medium))
|
||||||
.foregroundColor(Color.appTextSecondary)
|
.foregroundColor(Color.appTextSecondary)
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity)
|
.frame(minWidth: 0, maxWidth: .infinity)
|
||||||
|
.frame(height: 48)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ private struct PropertyIconView: View {
|
|||||||
.frame(width: 56, height: 56)
|
.frame(width: 56, height: 56)
|
||||||
|
|
||||||
// House icon
|
// House icon
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
.frame(width: 48, height: 48)
|
.frame(width: 48, height: 48)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ struct SummaryCard: View {
|
|||||||
// Main Stats Row
|
// Main Stats Row
|
||||||
HStack(spacing: 0) {
|
HStack(spacing: 0) {
|
||||||
OrganicStatItem(
|
OrganicStatItem(
|
||||||
icon: "house_outline",
|
icon: "outline",
|
||||||
value: "\(summary.totalResidences)",
|
value: "\(summary.totalResidences)",
|
||||||
label: "Properties",
|
label: "Properties",
|
||||||
accentColor: Color.appPrimary
|
accentColor: Color.appPrimary
|
||||||
@@ -95,8 +95,8 @@ private struct OrganicStatItem: View {
|
|||||||
.fill(accentColor.opacity(0.12))
|
.fill(accentColor.opacity(0.12))
|
||||||
.frame(width: 40, height: 40)
|
.frame(width: 40, height: 40)
|
||||||
|
|
||||||
if icon == "house_outline" {
|
if icon == "outline" {
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ struct SummaryStatView: View {
|
|||||||
.fill(Color.appPrimary.opacity(0.1))
|
.fill(Color.appPrimary.opacity(0.1))
|
||||||
.frame(width: 44, height: 44)
|
.frame(width: 44, height: 44)
|
||||||
|
|
||||||
if icon == "house_outline" {
|
if icon == "outline" {
|
||||||
Image("house_outline")
|
Image("outline")
|
||||||
.renderingMode(.template)
|
.renderingMode(.template)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
@@ -42,7 +42,7 @@ struct SummaryStatView: View {
|
|||||||
#Preview {
|
#Preview {
|
||||||
HStack(spacing: 20) {
|
HStack(spacing: 20) {
|
||||||
SummaryStatView(
|
SummaryStatView(
|
||||||
icon: "house_outline",
|
icon: "outline",
|
||||||
value: "3",
|
value: "3",
|
||||||
label: "Properties"
|
label: "Properties"
|
||||||
)
|
)
|
||||||
|
|||||||