iOS Apps und Übersetzung

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • iOS Apps und Übersetzung

    Hallo,

    ich habe jetzt erfolgreich Wetterdaten von Apples WeatherKit in meiner APP empfangen können, stelle aber fest, dass z.B. die Weather Description nur in Englischer Sprache geliefert wird. Wenn ich es richtig verstanden habe, hat Apple bislang nur seine WeatherKit Alerts in allen Sprachen parat, während die Weather Description als enum hinterlegt ist und somit nur auf Englisch geliefert wird.

    Zur Zeit von Objective C gab es nur die Möglichkeit, mit NSLocalizedStrings zu arbeiten. Ist das immer noch so, oder gibt es jetzt einfachere Lösungen?

    Danke!
  • Hmm, ich hab's in deutsch. Nutzt du was anderes?
    Sieht z.B. so aus:

    Quellcode

    1. ...
    2. let ws = WeatherService()
    3. let wx = try await ws.weather(for: loc)
    4. let wind = wind.compassDirection.description.localizedCapitalized
    5. let text = wx.currentWeather.condition.description.localizedCapitalized
    6. ...
  • @Mattes

    Danke für den Hinweis mit dem String Catalog!
    Ich bin mir allerdings noch nicht so ganz im Klaren, wie ich die Werte des enums in den Klartext überführen kann, da sie ja erst in der UIView als Text sichtbar werden.
    Spontan fällt mir da nur ein, sie vorher in einem Array oder so anzulegen und dann diese Texte per if-Statement oder switch-Statement mit den enum-Werten zu vergleichen und so die localizedStrings aufzurufen .. klingt aber irgendwie kompliziert.
  • Hallo, danke euch ..
    Habe jetzt auch schon etwas rumprobiert und die Lösung war tatsächlich Edit -> Scheme –> Language –> German

    Damit konnte ich den .description Wert übersetzen, aber es bleibt die Frage, wie es mit anderen values aussieht, die nicht automatisch übersetzt werden.

    Beispiel: Ich lasse mir über das tägliche Wetter die Mondphase ausgeben. Der Wert liegt als raw value vor und ich lasse ihn dann als String anzeigen. Aber wie bekomme ich den in meinen String catalog?
  • Wenn du den Text hart in den Code schreibst, tut es ein

    Quellcode

    1. "Mondphase: \(moonPhase) \(illumination)"


    Wenn du die Localizations verwendest, solltest du über String gehen

    Quellcode

    1. String(
    2. format: NSLocalizedString("labelMoonPhases", comment:""),
    3. moonPhase,
    4. illumination
    5. )
    In deiner Localizable.strings steht dann

    Quellcode

    1. "labelMoonPhases" = "Mondphase: %@ %@";
  • @mihema Danke ...

    ... aber hier liegt wohl ein Missverständnis vor. Die Mondphase ist kein statischer sondern ein dynamischer Wert, der sich 8 mal im Monat ändert, was sich dann wiederholt. Deshalb sind die entsprechenden Werte in einem enum gespeichert und können über Apples WeatherKit als rawValue abgerufen werden.

    Meine eigentliche Frage war also, wie ich einen dynamischen Wert automatisch übersetzen lassen kann.
    Die Lösung ist ein dynamischer Key für den String Catalog.

    Ich habe eine Extension angelegt, welche das enum und den key beinhaltet:

    Quellcode

    1. import Foundation
    2. import SwiftUI
    3. enum MoonPhase: String, Codable {
    4. case new
    5. case waxingCrescent
    6. case firstQuarter
    7. case waxingGibbous
    8. case full
    9. case waningGibbous
    10. case lastQuarter
    11. case waningCrescent
    12. }
    13. extension MoonPhase {
    14. var localizationKey: String {
    15. "moon_phase.\(self.rawValue)"
    16. }
    17. var localizedString: String {
    18. NSLocalizedString(self.localizationKey, comment: "")
    19. }
    20. }
    Alles anzeigen

    Danach habe ich alle 8 keys und die dazugehörigen Übersetzungen im String Catalog nach diesem Muster angelegt:

    key: moon_phase.full, en: "Full Moon", de: "Vollmond"

    Im View Controller sieht das jetzt so aus:

    Quellcode

    1. import SwiftUI
    2. import WeatherKit
    3. import CoreLocation
    4. struct ForecastView: View {
    5. @Environment(LocationManager.self) var locationManager
    6. @State private var selectedCity: City?
    7. @State private var isLoading = false
    8. let weatherManager = WeatherManager.shared
    9. @State private var currentWeather: CurrentWeather?
    10. @State private var dailyForecast: Forecast<DayWeather>?
    11. @State private var currentMoonPhase: String?
    12. @State private var moonrise: Date?
    13. @State private var moonset: Date?
    14. @State private var illumination: String?
    15. var body: some View {
    16. VStack {
    17. Text("Moon")
    18. .font(.title2)
    19. if let moonrise = moonrise, let moonset = moonset, let currentMoonPhase = currentMoonPhase,
    20. let moonPhaseEnum = MoonPhase(rawValue: currentMoonPhase) {
    21. HStack {
    22. Spacer()
    23. Text("Moonrise: \(moonrise.localTime(for: timezone))")
    24. Spacer()
    25. Text("Moonset: \(moonset.localTime(for: timezone))")
    26. Spacer()
    27. }
    28. let illumination = Illumination().getCurrentIllumination()
    29. Text("Moon Phase: \(moonPhaseEnum.localizedString) , \(illumination) %")
    30. }
    31. }
    32. // get the weather for the new given location
    33. func fetchWeather(for city: City) async {
    34. isLoading = true // set isLoading to true if weather data are not present yet
    35. // Apple's recommended task to fetch the weather for given location
    36. Task.detached { @MainActor in
    37. currentWeather = await weatherManager.currentWeather(for: city.clLocation)
    38. timezone = await locationManager.getTimeZone(for: city.clLocation)
    39. dailyForecast = await weatherManager.dailyForecast(for: city.clLocation)
    40. if let firstDayForecast = dailyForecast?.first {
    41. self.sunrise = firstDayForecast.sun.sunrise
    42. self.sunset = firstDayForecast.sun.sunset
    43. self.moonrise = firstDayForecast.moon.moonrise
    44. self.moonset = firstDayForecast.moon.moonset
    45. self.currentMoonPhase = firstDayForecast.moon.phase.rawValue
    46. }
    47. }
    48. isLoading = false // set to false again when data are arriving
    49. self.currentMoonPhase = "New Moon"
    50. }
    51. }
    52. #Preview {
    53. ForecastView()
    54. .environment(LocationManager()) // add location manager here
    55. }
    Alles anzeigen
    Mit: Text("Moon Phase: \(moonPhaseEnum.localizedString) , \(illumination) %") wird jetzt der Wert für die Mondphase dynamisch ausgegeben.

    Die Lösung habe ich übrigens mit Hilfe von der kostenlosen Version von ChatGPT erarbeitet. Auch wenn diese KI Modelle nicht wirklich intelligent sind, kann man - wenn man halbwegs weiß, was man tut, Geduld hat und präzise Fragen stellt - mit ihrer Fähigkeit, blitzschnell zu recherchieren und Lösungen anzubieten, solche Probleme lösen :)