i18n: complete app-wide localization (10 languages) + audit tooling
Android UI Tests / ui-tests (push) Has been cancelled
Android UI Tests / ui-tests (push) Has been cancelled
Localize all user-facing strings across iOS (SwiftUI), shared Kotlin, and Android Compose into en/es/fr/de/pt/it/ja/ko/nl/zh: - iOS String Catalogs: main + widget Localizable.xcstrings, InfoPlist.xcstrings (permissions), plural variations, ~200 new keys translated - Shared Kotlin ClientStrings table + Android composeResources/values-* (884 keys ×10), routed Api/ViewModel/util error & UI strings through localization - Backend-localized lookups/suggestions consumed via display names - Widget extension catalog; theme names, home-profile fallbacks, validation, network errors, accessibility labels all localized Add re-runnable verification gates: - scripts/i18n_audit.py — enumerate every literal, partition to GAP=0 - scripts/i18n_coverage.py — all 10 locales translated, format-specifier parity Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,59 +1,62 @@
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
/**
|
||||
* Static option lists for home profile pickers.
|
||||
* Each entry is a (apiValue, displayLabel) pair.
|
||||
* Static option lists for home profile pickers (live fallback shown when the
|
||||
* backend options aren't loaded). Each entry is a (apiValue, displayLabelKey)
|
||||
* pair: the FIRST element is the stable backend API value and must never
|
||||
* change; the SECOND element is a [com.tt.honeyDue.i18n.ClientStrings] key
|
||||
* resolved to a localized label at the render site.
|
||||
*/
|
||||
object HomeProfileOptions {
|
||||
val heatingTypes = listOf(
|
||||
"gas_furnace" to "Gas Furnace",
|
||||
"electric" to "Electric",
|
||||
"heat_pump" to "Heat Pump",
|
||||
"boiler" to "Boiler",
|
||||
"radiant" to "Radiant",
|
||||
"wood_stove" to "Wood Stove",
|
||||
"none" to "None"
|
||||
"gas_furnace" to "home_profile.heating.gas_furnace",
|
||||
"electric" to "home_profile.heating.electric",
|
||||
"heat_pump" to "home_profile.heating.heat_pump",
|
||||
"boiler" to "home_profile.heating.boiler",
|
||||
"radiant" to "home_profile.heating.radiant",
|
||||
"wood_stove" to "home_profile.heating.wood_stove",
|
||||
"none" to "home_profile.heating.none"
|
||||
)
|
||||
val coolingTypes = listOf(
|
||||
"central_ac" to "Central AC",
|
||||
"window_unit" to "Window Unit",
|
||||
"mini_split" to "Mini Split",
|
||||
"evaporative" to "Evaporative",
|
||||
"none" to "None"
|
||||
"central_ac" to "home_profile.cooling.central_ac",
|
||||
"window_unit" to "home_profile.cooling.window_unit",
|
||||
"mini_split" to "home_profile.cooling.mini_split",
|
||||
"evaporative" to "home_profile.cooling.evaporative",
|
||||
"none" to "home_profile.cooling.none"
|
||||
)
|
||||
val waterHeaterTypes = listOf(
|
||||
"tank_gas" to "Tank (Gas)",
|
||||
"tank_electric" to "Tank (Electric)",
|
||||
"tankless" to "Tankless",
|
||||
"solar" to "Solar",
|
||||
"heat_pump_wh" to "Heat Pump"
|
||||
"tank_gas" to "home_profile.water_heater.tank_gas",
|
||||
"tank_electric" to "home_profile.water_heater.tank_electric",
|
||||
"tankless" to "home_profile.water_heater.tankless",
|
||||
"solar" to "home_profile.water_heater.solar",
|
||||
"heat_pump_wh" to "home_profile.water_heater.heat_pump"
|
||||
)
|
||||
val roofTypes = listOf(
|
||||
"asphalt_shingle" to "Asphalt Shingle",
|
||||
"metal" to "Metal",
|
||||
"tile" to "Tile",
|
||||
"flat_tpo" to "Flat/TPO",
|
||||
"slate" to "Slate",
|
||||
"wood_shake" to "Wood Shake"
|
||||
"asphalt_shingle" to "home_profile.roof.asphalt_shingle",
|
||||
"metal" to "home_profile.roof.metal",
|
||||
"tile" to "home_profile.roof.tile",
|
||||
"flat_tpo" to "home_profile.roof.flat_tpo",
|
||||
"slate" to "home_profile.roof.slate",
|
||||
"wood_shake" to "home_profile.roof.wood_shake"
|
||||
)
|
||||
val exteriorTypes = listOf(
|
||||
"vinyl_siding" to "Vinyl Siding",
|
||||
"brick" to "Brick",
|
||||
"stucco" to "Stucco",
|
||||
"wood" to "Wood",
|
||||
"stone" to "Stone",
|
||||
"fiber_cement" to "Fiber Cement"
|
||||
"vinyl_siding" to "home_profile.exterior.vinyl_siding",
|
||||
"brick" to "home_profile.exterior.brick",
|
||||
"stucco" to "home_profile.exterior.stucco",
|
||||
"wood" to "home_profile.exterior.wood",
|
||||
"stone" to "home_profile.exterior.stone",
|
||||
"fiber_cement" to "home_profile.exterior.fiber_cement"
|
||||
)
|
||||
val flooringTypes = listOf(
|
||||
"hardwood" to "Hardwood",
|
||||
"carpet" to "Carpet",
|
||||
"tile" to "Tile",
|
||||
"laminate" to "Laminate",
|
||||
"vinyl" to "Vinyl"
|
||||
"hardwood" to "home_profile.flooring.hardwood",
|
||||
"carpet" to "home_profile.flooring.carpet",
|
||||
"tile" to "home_profile.flooring.tile",
|
||||
"laminate" to "home_profile.flooring.laminate",
|
||||
"vinyl" to "home_profile.flooring.vinyl"
|
||||
)
|
||||
val landscapingTypes = listOf(
|
||||
"lawn" to "Lawn",
|
||||
"xeriscaping" to "Xeriscaping",
|
||||
"none" to "None"
|
||||
"lawn" to "home_profile.landscaping.lawn",
|
||||
"xeriscaping" to "home_profile.landscaping.xeriscaping",
|
||||
"none" to "home_profile.landscaping.none"
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user