I’m trying to localise my project for an RTL language, and including an in app language switcher, but I’m encountering an issue where after switching to the RTL language, and switching back to English the English text is getting mirrored.
It occurs both on iOS 26.2 and iOS 18, but not when running natively on macOS 26.3
Only the text withing the SettingsView is experiencing the issue.
(I will also note that I know I should leave setting the localisation to the system languages, but this is for a class assignment so that not feasible.)
@main
struct Room_PlannerApp: App {
@State var localizableManager = LocalizableManager.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(localizableManager)
.environment(\.locale, Locale(identifier: localizableManager.currentLanguage.rawValue))
.environment(\.layoutDirection, localizableManager.currentLanguage.layoutDirection)
}
}
}
struct ContentView: View {
@Environment(LocalizableManager.self) private var localizableManager
var body: some View {
TabView {
Tab("Home", systemImage: "tray.and.arrow.down.fill") {
VStack {
HStack {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello World")
}
Text(localizableManager.currentLanguage.name)
}
.padding()
}
Tab("Settings", systemImage: "person.crop.circle.fill") {
SettingsView()
}
}
}
}
struct SettingsView: View {
@Environment(LocalizableManager.self) private var localizableManager
var body: some View {
List(LanguageTypes.allCases, id: \.self) { language in
Button(action: {
localizableManager.currentLanguage = language
}, label: {
Text(language.name)
})
}
}
}
enum LanguageTypes: String, CaseIterable {
case english = "en"
case yiddish = "yi"
var code: String {
self.rawValue
}
var layoutDirection: LayoutDirection {
switch self {
case .english: return .leftToRight
case .yiddish: return .rightToLeft
}
}
var name: LocalizedStringResource {
switch self {
case .english: return LocalizedStringResource(stringLiteral: "English")
case .yiddish: return LocalizedStringResource(stringLiteral: "Yiddish")
}
}
}
@Observable
class LocalizableManager {
static let shared = LocalizableManager()
private var storedLanguage: LanguageTypes = .english
var currentLanguage: LanguageTypes = .english {
didSet {
storedLanguage = currentLanguage
}
}
private init() {
currentLanguage = storedLanguage
}
}

