Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

most likely missing word in the card overview #875

Open
typxxi opened this issue Jan 10, 2025 · 9 comments
Open

most likely missing word in the card overview #875

typxxi opened this issue Jan 10, 2025 · 9 comments
Labels
bug Something isn't working

Comments

@typxxi
Copy link

typxxi commented Jan 10, 2025

Here are 2 examples where the second one shows the issues cause there are 2 cases to check based on what has been selected in case of CUSTOM / AUSWÄHLEN

image

Checklist

  • [ X ] I checked for similar existing issues (both open and closed) before posting.
  • [ X ] I am running the latest version.

Expected behavior

"Jeden" makes sense if some but not all days have been selected

And in case every day has been selected there are 2 options in my opinion, a shorter one and a longer one

"Montag bis Sonntag"
or longer
"Jeden Montag bis Sonntag"

Actual behavior

"Jeden von Montag bis Sonntag" is not right in this particular case where every day has been selected.

Steps to Reproduce

as seen in the screenshot I had chosen "AUSWÄHLEN" and selected every weekday

great solution - really missed for many years cause I did not know about it till I saw a german youtuber explaining this solution partially this week which has been released 6 or 9 months ago, but was not getting into the details.

@typxxi typxxi added the bug Something isn't working label Jan 10, 2025
@typxxi typxxi changed the title most likely missing word in the card overview for most likely missing word in the card overview Jan 10, 2025
@nielsfaber
Copy link
Owner

The translations of the card are provided by users , I don’t speak German so I have no idea what is correct.
I think the relevant section is this line:

"repeated_days": "jeden {days}",

The {days} part will be replaced with the selected range of days.
Could you explain in which way this line has to be corrected?

@typxxi
Copy link
Author

typxxi commented Jan 10, 2025

oh sorry,
I had thought you were german due to the name, sorry.

Once again but in english:

Here are 2 examples where the second one shows the issues cause there are 2 cases to check based on what has been selected in case of CUSTOM / AUSWÄHLEN

image

Expected behavior

"Jeden = EVERY" makes sense if some but not all days have been selected
"Every monday, wednesday and sunday" makes sense but not all

In case EVERY day has been selected there are 2 options in my opinion, a shorter one and a longer one

"Monday till Sunday "
or longer
"EVERY Monday till Sunday"

Actual behavior

"EVERY from Monday till Sunday" is not right in this particular case where every day has been selected.
It could also be fixed with
"EVERY DAY from Monday till Sunday" which would be in german
"Jeden Tag von Montag bis Sonntag"

but "every from M till S" makes no sense. In my opinion it is not a translation issue

Steps to Reproduce

as seen in the screenshot I had chosen "CUSTOMS / AUSWÄHLEN" and selected every weekday

great solution - really missed for many years cause I did not know about it till I saw a german youtuber explaining this solution partially this week which has been released 6 or 9 months ago, but was not getting into the details.

@typxxi
Copy link
Author

typxxi commented Jan 10, 2025

Here is the german part

        "repeated_days": "jeden {days}",
        "repeated_days_except": "täglich außer {excludedDays}",
        "days_range": "von {startDay} bis {endDay}",
        "next_week_day": "nächsten {weekday}"

the first means "every monday, ...."

but "days range" cause the issue cause in case of every day you are using most likely this combination of

        "repeated_days": "jeden {days}" = every {days}
        where you use days_range as days ( "von {startDay} bis {endDay}") = ( "from {startDay} till {endDay}")

this creates "every" and then "repeated_days" or "every from {startDay} till {endDay}"
in case of every day has been selected.

As said before in such case with all days selected in english and german this should work
SHORT: {startDay} till {endDay} = monday till sunday
LONG: Every {startDay} till {endDay} = Every monday till sunday

but every from monday till sunday is not really working in english or german and most likely other languages too

Your are combining these 2 options "repeated_days" and "days_range" which the translator have not seen.
Each for alone would be right, but not if you combine them together this way.

I bet it has started "from {startDay} till {endDay}"
the german wrot "von {startDay} bis {endDay}" which is right for this particular case, but not combined together

Every from {startDay} till {endDay}

I hope it helps.

Off Topic: Is there anywhere a switch to turn the automatic first uppcase letter of cause the german translations you had given me the link to is written in lower case and it is right .
I would prefer to get that instead the false "Um" with an uppercase where it is wrong cause every german will have a weird feeling reading it that way, our german teachers would be completely upset cause upper and lower case are important in the language.

image

Thansk a lot

@typxxi
Copy link
Author

typxxi commented Jan 10, 2025

I have checked now the german translation cause there were a lot pieces missing and some lines have not been translated properly and then there were also cases where I have questions you can answer how somthing is meant cause I had some impression from using the scheduler so far.

This is the genuine contnet and I only did made and marked these change with

S        as the source line followed by 
'#'      as the german translation line and sometimes followed by a 
'#####'  line where I have made remarks or asked questions like

how it might be meant cause I had seen already some words that seem to be wrong cause "hidden entries" in english seems to mean "hidden schedules" or in german "ausgeblendete Zeitpläne" which is more accurate than just "entries" or Einträge which had made me wonder when I had seen it in the UI first time tonight.

UPDATE:
I found it again here
image
"There are no entries that can be shown here" - that is more or less the current translation in german and makes not really sense. In german it should be a short "Currently there is no schedule."

I just wanna make clear my considerations cause a lot of terms have not been carefully translatede like all the lines with "setzen" which I bet should mean "set" but this would usually be tranlated in german as "einstellen"

Not sure if this is the proper way regarding translations cause I am not a developer, but here is the content and it would be great if you can check the #### lines where I have made considerations or had questions.

If I get your reply I would then clean up that file and remove all the double lines like S = Source and my #### lines for questions. Then you can replace the json translation file and you will also have some documentation why I had changed what for the better.

{
  "services": {
    "generic": {
      "parameter_to_value": "{parameter} auf {value}",
      "action_with_parameter": "{action} mit {parameter}"
    },
    "climate": {
      "set_temperature": "Temperatur einstellen[ auf {temperature}]",
      "set_temperature_hvac_mode_heat": "heizen[ auf {temperature}]",
      "set_temperature_hvac_mode_cool": "kühlen[ auf {temperature}]",
S      "set_temperature_hvac_mode_heat_cool": "heizen/kühlen[ auf {temperature}]",
#      "set_temperature_hvac_mode_heat_cool": "heizen / kühlen[ auf {temperature}]",
S      "set_temperature_hvac_mode_heat_cool_range": "heizen/kühlen[ auf {target_temp_low} - {target_temp_high}]",
#      "set_temperature_hvac_mode_heat_cool_range": "heizen / kühlen[ auf {target_temp_low} - {target_temp_high}]",
      "set_temperature_hvac_mode_auto": "automatisch[ auf {temperature}]",
S      "set_hvac_mode": "Modus setzen[ auf {hvac_mode}]",
#      "set_hvac_mode": "Modus einstellen[ auf {hvac_mode}]",
S      "set_preset_mode": "Voreinstellung setzen[ auf {preset_mode}]",
#      "set_preset_mode": "Voreinstellung einstellen[ auf {preset_mode}]",
S      "set_fan_mode": "set fan mode[ to {fan_mode}]"
#      "set_fan_mode": "Lüftermodus einstellen[ auf {fan_mode}]"
    },
    "cover": {
      "close_cover": "schließen",
      "open_cover": "öffnen",
S      "set_cover_position": "Position setzen[ auf {position}]",
#      "set_cover_position": "Position speichern[ für {position}]",
###  I am assuming that position means upper and bottom position 

S      "set_cover_tilt_position": "Tilt Position setzen[ auf {tilt_position}]"
#      "set_cover_tilt_position": "Neigung einstellen[ auf {tilt_position}]"
    },
    "fan": {
S      "set_speed": "Geschwindigkeit speed[ auf {speed}]",
#      "set_speed": "Geschwindigkeit einstellen[ auf {speed}]",
S      "set_direction": "Richtung setzen[ auf {direction}]",
#      "set_direction": "Richtung einstellen[ auf {direction}]",
S      "oscillate": "Oszillation setzen[ auf {oscillate}]"
#      "oscillate": "Schwingungsbreite einstellen[ auf {oscillate}]"
    },
    "humidifier": {
S      "set_humidity": "Luftfeuchtigkeit setzen[ auf {humidity}]",
#      "set_humidity": "Luftfeuchtigkeit einstellen[ auf {humidity}]",
S      "set_mode": "Modus setzen[ auf {mode}]"
#      "set_mode": "Modus einstellen[ auf {mode}]"
    },
    "input_number": {
S      "set_value": "Wert setzen[ auf {value}]"
#      "set_value": "Wert einstellen[ auf {value}]"
    },
    "input_select": {
      "select_option": "Option[ {option}] auswählen"
    },
    "select": {
      "select_option": "Option[ {option}] auswählen"
    },
    "light": {
      "turn_on": "anschalten[ mit {brightness} Helligkeit]"
    },
    "media_player": {
      "select_source": "Quelle[ {source}] auswählen"
    },
    "notify": {
      "notify": "Nachricht senden"
    },
    "script": {
      "script": "ausführen"
    },
    "vacuum": {
      "start_pause": "Start / Pause"
    },
    "water_heater": {
S      "set_operation_mode": "Modus setzen[ auf {operation_mode}]",
#      "set_operation_mode": "Modus einstellen[ auf {operation_mode}]",
S      "set_away_mode": "Abwesenheitsmodus setzen"
#      "set_away_mode": "Abwesenheitsmodus aktivieren"
    }
  },
  "domains": {
    "alarm_control_panel": "Alarmzentrale",
G    "binary_sensor": "binary sensors",
#    "binary_sensor": "binäre Sensoren",
##### if it is meant as plural as in english, otherwise a single would be "binärer Sensor" slightly different
    "climate": "Heizung",
    "cover": "Beschattung",
    "fan": "Lüfter",
    "group": "Gruppen",
    "humidifier": "Befeuchter",
G    "input_boolean": "input boolean",
#    "input_boolean": "boolescher Eingangswert",
G    "input_number": "input number",
#    "input_number": "Eingabe Zahl",
G    "input_select": "input select",
#    "input_select": "Eingabeauswahl",
G    "lawn_mower": "lawn mower",
#    "lawn_mower": "Rasenmäher",
    "light": "Licht",
G    "lock": "Schlösser",
#    "lock": "Schloss",
##### lock is singular and therefore "Schloss" is right cause "Schlösser" is plural
    "media_player": "Medienplayer",
    "notify": "notification",
    "switch": "Schalter",
    "vacuum": "Staubsauger",
    "water_heater": "Boiler"
  },
  "ui": {
    "components": {
      "date": {
        "day_types_short": {
          "daily": "täglich",
S          "workdays": "Werktags",
#          "workdays": "werktags",
##### is and adjective like daily and therefore lowercase
          "weekend": "Wochenende"
        },
        "day_types_long": {
##### all 3 of these should start in lower case cause look at the following items from "tomorrow" to "at sun event" are all lower case looks better 
S          "daily": "Jeden Tag",
#          "daily": "jeden Tag",
S          "workdays": "An Werktagen",
#          "workdays": "an Werktagen",
S          "weekend": "Am Wochenende"
#          "weekend": "am Wochenende"
        },
        "days": "Tage",
        "tomorrow": "morgen",
        "repeated_days": "jeden {days}",
        "repeated_days_except": "täglich außer {excludedDays}",
        "days_range": "von {startDay} bis {endDay}",
        "next_week_day": "nächsten {weekday}"
      },
      "time": {
        "absolute": "um {time}",
        "interval": "von {startTime} bis {endTime}",
        "at_midnight": "um Mitternacht",
        "at_noon": "um Mittag",
        "at_sun_event": "beim {sunEvent}"
      }
    },
    "dialog": {
      "enable_schedule": {
        "title": "Modifikationen beenden",
S        "description": "Der geänderte Zeitplan ist derzeit deaktiviert, sollte er aktiviert werden?"
#        "description": "Der geänderte Zeitplan ist derzeit deaktiviert. Soll er jetzt aktiviert werden?"
      },
      "confirm_delete": {
        "title": "Entität entfernen?",
        "description": "Bist du dir sicher, dass du diese Entität löschen möchtest?"
      },
      "weekday_picker": {
S        "title": "Repeated days for schedule",
#        "title": "wiederkehrende Tage für den Zeitplan",
S        "choose": "Choose..."
#        "choose": "Wähle aus ..."
      },
      "entity_picker": {
S        "title": "Choose entities"
#        "title": "Wähle die Entitäten aus"
      },
      "action_picker": {
S        "title": "Choose action"
#        "title": "Wähle eine Aktion"
      }
    },
    "panel": {
      "common": {
        "title": "Zeitplaner",
        "new_schedule": "Neuer Zeitplan",
        "default_name": "Zeitplan #{id}"
      },
      "overview": {
        "no_entries": "Es gibt keine Einträge, die angezeigt werden können",
S        "backend_error": "Es konnte keine Verbindung mit der Schedulerkomponente hergestellt werden. Es muss als Integration installiert werden, bevor diese Karte verwendet werden kann.",
#        "backend_error": "Es konnte keine Verbindung mit der Scheduler Komponente hergestellt werden. Es muss zuerst die Scheduler Integration als Backend installiert worden sein, bevor diese Karte verwendet werden kann.",
        "excluded_items": "{number} {if number is 1} ausgeschlossener Eintrag {else} ausgeschlossene Einträge",
        "excluded_items": "{number} {if number is 1} ausgeschlossener Eintrag {else} ausgeschlossene Einträge",
S        "hide_excluded": "Verstecke ausgeschlossene Einträge",
#        "hide_excluded": "Verstecke ausgeschlossene Zeitpläne",
### the whole entry thing looks more or less like "hide excluded schedules" but i am not sure or is it meant for devices / entities?
### if entities can be meant as schedule then replace "Eintrag" with "Zeitplan" and "Einträge" with "Zeitpläne" in the 6 lines above  

        "additional_tasks": "{number} weitere {if number is 1} Aufgabe {else} Aufgaben"
      },
      "editor": {
S        "repeated_days": "Repeated days",
#        "repeated_days": "wiederholte Tage",
S        "start_time": "Start time",
#        "start_time": "Beginn",
S        "stop_time": "End time",
#        "stop_time": "Ende",
S        "action": "Action",
#        "action": "Aktivität",
S        "add_action": "Add action",
#        "add_action": "Füge eine Aktivität hinzu",
        "select_timeslot": "Wähle ein Zeitfenster aus",
        "validation_errors": {
S          "overlapping_time": "Schedule has overlapping timeslots",
#          "overlapping_time": "Der Zeitplan hat überlappende Zeitfenster",
S          "missing_target_entity": "One or more actions are missing a target entity",
#          "missing_target_entity": "Eine oder mehrere Aktivitäten haben kein Zielobjekt",
S          "missing_service_parameter": "One or more actions are missing a required setting",
#          "missing_service_parameter": "Einer oder mehreren Aktionen fehlt eine erforderliche Einstellung",
S          "missing_action": "Schedule has no actions"
#          "missing_action": "Zeitplan hat keine Aktivitäten"
        }
      },
      "options": {
        "conditions": {
          "header": "Conditions",
S          "add_condition": "Add condition",
#          "add_condition": "Füge eine Bedingung hinzu",
          "types": {
            "equal_to": "{entity} ist {value}",
            "unequal_to": "{entity} ist nicht {value}",
S            "above": "{entity} is above {value}",
#            "above": "{entity} ist größer als {value}",
S            "below": "{entity} is below {value}"
#            "below": "{entity} ist kleiner als {value}"
          },
          "options": {
#            "logic_and": "All conditions must be true",
S            "logic_and": "Alle Bedingungen müssen erfüllt sein",
#            "logic_or": "Any condition must be true",
S            "logic_or": "Jede Bedingung müssen erfüllt sein",
#            "track_changes": "Erneut prüfen wenn sich die Zustände ändern"
S            "track_changes": "Erneut prüfen, sobald es Änderungen gegeben hat"
          }
        },
        "period": {
          "header": "Zeitraum",
S          "start_date": "From",
#          "start_date": "von",
S          "end_date": "To"
#          "end_date": "bis"
        },
        "repeat_type": "Verhalten nach Abschluß",
        "tags": "Tags"
      }
    }
  }
}

@typxxi
Copy link
Author

typxxi commented Jan 11, 2025

I have found out that in the english json file were a lot more new terms which I have added now and translated.

Those belong to the card setup "OTHER" here
image

I have attached that properly to the previous german json file.

Isn't there a possibility to check such a file out locally ?

Here is the german file which is now 247 lines long

{
  "services": {
    "generic": {
      "parameter_to_value": "{parameter} auf {value}",
      "action_with_parameter": "{action} mit {parameter}"
    },
    "climate": {
      "set_temperature": "Temperatur einstellen[ auf {temperature}]",
      "set_temperature_hvac_mode_heat": "heizen[ auf {temperature}]",
      "set_temperature_hvac_mode_cool": "kühlen[ auf {temperature}]",
      "set_temperature_hvac_mode_heat_cool": "heizen / kühlen[ auf {temperature}]",
      "set_temperature_hvac_mode_heat_cool_range": "heizen / kühlen[ auf {target_temp_low} - {target_temp_high}]",
      "set_temperature_hvac_mode_auto": "automatisch[ auf {temperature}]",
      "set_hvac_mode": "Modus einstellen[ auf {hvac_mode}]",
      "set_preset_mode": "Voreinstellung einstellen[ auf {preset_mode}]",
      "set_fan_mode": "Lüftermodus einstellen[ auf {fan_mode}]"
    },
    "cover": {
      "close_cover": "schließen",
      "open_cover": "öffnen",
      "set_cover_position": "Position speichern[ für {position}]",
      "set_cover_tilt_position": "Lamellenneigung einstellen[ auf {tilt_position}]"
    },
    "fan": {
      "set_speed": "Geschwindigkeit einstellen[ auf {speed}]",
      "set_direction": "Richtung einstellen[ auf {direction}]",
      "oscillate": "Schwingungsbreite einstellen[ auf {oscillate}]"
    },
    "humidifier": {
      "set_humidity": "Luftfeuchtigkeit einstellen[ auf {humidity}]",
      "set_mode": "Modus einstellen[ auf {mode}]"
    },
    "input_number": {
      "set_value": "Wert einstellen[ auf {value}]"
    },
    "input_select": {
      "select_option": "Option[ {option}] auswählen"
    },
    "select": {
      "select_option": "Option[ {option}] auswählen"
    },
    "light": {
      "turn_on": "anschalten[ mit {brightness} Helligkeit]"
    },
    "media_player": {
      "select_source": "Quelle[ {source}] auswählen"
    },
    "notify": {
      "notify": "Nachricht senden"
    },
    "script": {
      "script": "ausführen"
    },
    "vacuum": {
      "start_pause": "Start / Pause"
    },
    "water_heater": {
      "set_operation_mode": "Betriebsart einstellen[ auf {operation_mode}]",
      "set_away_mode": "Abwesenheitsmodus aktivieren"
    }
  },
  "domains": {
    "alarm_control_panel": "Alarmzentrale",
    "binary_sensor": "binärer Sensor",
    "climate": "Heizung",
    "cover": "Beschattung",
    "fan": "Lüfter",
    "group": "Gruppen",
    "humidifier": "Befeuchter",
    "input_boolean": "boolescher Eingangswert",
    "input_number": "Eingabe Zahl",
    "input_select": "Eingabeauswahl",
    "lawn_mower": "Rasenmäher",
    "light": "Licht",
    "lock": "Schloss",
    "media_player": "Medienplayer",
    "notify": "notification",
    "switch": "Schalter",
    "vacuum": "Staubsauger",
    "water_heater": "Boiler"
  },
  "ui": {
    "components": {
      "date": {
        "day_types_short": {
          "daily": "täglich",
          "workdays": "werktags",
          "weekend": "Wochenende"
        },
        "day_types_long": {
          "daily": "jeden Tag",
          "workdays": "an Werktagen",
          "weekend": "am Wochenende"
        },
        "days": "Tage",
        "tomorrow": "morgen",
        "repeated_days": "jeden {days}",
        "repeated_days_except": "täglich außer {excludedDays}",
        "days_range": "von {startDay} bis {endDay}",
        "next_week_day": "nächsten {weekday}"
      },
      "time": {
        "absolute": "um {time}",
        "interval": "von {startTime} bis {endTime}",
        "at_midnight": "um Mitternacht",
        "at_noon": "um Mittag",
        "at_sun_event": "beim {sunEvent}"
      }
    },
    "dialog": {
      "enable_schedule": {
        "title": "Änderungen abschließen",
        "description": "Der geänderte Zeitplan ist derzeit deaktiviert. Soll er jetzt aktiviert werden?"
      },
      "confirm_delete": {
        "title": "Entität entfernen?",
        "description": "Bist du dir sicher, dass du diese Entität löschen möchtest?"
      },
      "weekday_picker": {
        "title": "wiederkehrende Tage für den Zeitplan",
        "choose": "Wähle aus ..."
      },
      "entity_picker": {
        "title": "Wähle die Entitäten aus"
      },
      "action_picker": {
        "title": "Wähle die Aktion aus"
      }
    },
    "panel": {
      "common": {
        "title": "Zeitplaner",
        "new_schedule": "Neuer Zeitplan",
        "default_name": "Zeitplan #{id}"
      },
      "overview": {
        "no_entries": "Es gibt keine Einträge, die angezeigt werden können",
        "backend_error": "Es konnte keine Verbindung mit der Scheduler Backend Komponente hergestellt werden. Es muss zuerst die Scheduler Integration als Backend installiert worden sein, bevor diese Karte verwendet werden kann.",
        "excluded_items": "{number} {if number is 1} ausgeschlossener Zeitplan {else} ausgeschlossene Zeitpläne",
        "hide_excluded": "Blende ausgeschlossene Zeitpläne aus",
       "additional_tasks": "{number} weitere {if number is 1} Aufgabe {else} Aufgaben"
      },
      "editor": {
        "repeated_days": "wiederholte Tage",
        "start_time": "Beginn",
        "stop_time": "Ende",
        "action": "Aktivität",
        "add_action": "Füge eine Aktivität hinzu",
        "select_timeslot": "Wähle ein Zeitfenster aus",
        "validation_errors": {
          "overlapping_time": "Der Zeitplan hat überlappende Zeitfenster",
          "missing_target_entity": "Eine oder mehrere Aktivitäten haben noch keine Entität",
          "missing_service_parameter": "Einer oder mehreren Aktionen fehlt eine erforderliche Einstellung",
          "missing_action": "Zeitplan fehlt noch eine Aktion"
        }
      },
      "options": {
        "conditions": {
          "header": "Conditions",
          "add_condition": "Füge eine Bedingung hinzu",
          "types": {
            "equal_to": "{entity} ist {value}",
            "unequal_to": "{entity} ist ungleich {value}",
            "above": "{entity} ist größer als {value}",
            "below": "{entity} ist kleiner als {value}"
          },
          "options": {
            "logic_and": "Alle Bedingungen müssen erfüllt sein",
            "logic_or": "Jede Bedingung müssen erfüllt sein",
            "track_changes": "Erneut prüfen, sobald es Änderungen gibt"
          }
        },
        "period": {
          "header": "Zeitraum",
          "start_date": "von",
          "end_date": "bis"
        },
        "repeat_type": "Verhalten nach Abschluß",
        "tags": "Tags"
      },		
      "card_editor": {
        "tabs": {
          "entities": "Entitäten",
          "other": "Andere"
        },
        "fields": {
          "title": {
            "heading": "Kartentitel",
            "options": {
              "standard": "Standard",
              "hidden": "verborgen",
              "custom": "individuell"
            },
            "custom_title": "individueller Kartentitel"
          },
          "discover_existing": {
            "heading": "Alle Zeitpläne anzeigen",
            "description": "Dieses setzt den Parameter 'discover existing' (entdecke existierende Zeitpläne). Zuvor angelegte Zeitpläne werden automatisch mit in der Karte angezeigt. "
          },
          "time_step": {
            "heading": "Schrittweite Zeit",
            "description": "Zeitauflösung (in Minuten) beim Anlegen von Zeitplänen"
          },
          "sort_by": {
            "heading": "Sortier Optionen",
            "description": "Reihenfolge in welcher die Zeitpläne in der Karte erscheinen",
            "options": {
              "relative_time": "nach der Zeit bis zur nächsten Aktion",
              "title": "nach dem Namen des Zeitplans",
              "state": "aktive Zeitpläne oben anzeigen"
            }
          },
          "display_format_primary": {
            "heading": "Primär angezeigte Infos",
            "description": "Lege fest, welche Bezeichnungen in der Übersicht angezeigt werden",
            "options": {
              "default": "Zeitplan Name",
              "entity_action": "Zusammenfassung der Aufgabe"
            }
          },
          "display_format_secondary": {
            "heading": "Sekundär angezeigte Infos",
            "description": "Lege fest, welche weiteren Bezeichnungen in der Übersicht anzuzeigen sind",
            "options": {
              "relative_time": "verbleibende Zeit bis zur nächsten Aktion",
              "time": "Nächster Auslösezeitpunkt",
              "days": "Tage mit Wiederholungen",
              "additional_tasks": "Anzahl weiterer Schritte"
            }
          },
          "show_header_toggle": {
            "heading": "Haupteinschalter einblenden",
            "description": "Haupteinschalter oben in der Karte zum Ein- / Ausschalten aller Schritte anzeigen"
          },
          "tags": {
            "heading": "Identifizierungskennzeichen",
            "description": "Nutze Identifizierungskennzeichen zum Unterscheiden von Zeitplänen zwischen verschiedenen Karten"
          },
          "entities": {
            "heading": "Nutzbare Entitäten auswählen",
            "description": "Wählen die Entitäten aus, die im Zeitplan genutzt werden können. Klicke eine Gruppen an, um deren Mitglieder anzusehen. Beachte, das einige Entitäten (wie Sensoren) nur für Bedingungen und nicht für Aktionen genutzt werden können.",
            "included_number": "{number}/{total} ausgewählt"
          }
        }
      }
    }
  }

@nielsfaber
Copy link
Owner

I opened a pull request based on your changes
https://github.com/nielsfaber/scheduler-card/pull/870/files

This makes it easier to see all modifications and make further improvements to it if required.
The english version of the translation is here: https://github.com/nielsfaber/scheduler-card/blob/v4/src/localize/languages/en.json

The file contains 248 lines, while yours is 247 lines. I don't know what is missing (this would have to be checked manually).

@nielsfaber
Copy link
Owner

I am also seeing this error message when processing your file:

❗ The file ./src/localize/languages/de.json contains invalid JSON. It needs to be fixed before this PR can be merged.
You may need to add a comma at the end of a line before adding another line.
The error is expecting ',' delimiter: line 248 column 1 (char 9441)
Traceback (most recent call last):
File ".github/workflows/check.py", line 65, in
file = json.load(open(filename, encoding="utf-8"))
File "/opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/json/init.py", line 293, in load
return loads(fp.read(),
File "/opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/json/init.py", line 357, in loads
return _default_decoder.decode(s)
File "/opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/opt/hostedtoolcache/Python/3.8.18/x64/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 248 column 1 (char 9441)

@typxxi
Copy link
Author

typxxi commented Jan 11, 2025

I will check that later when I have more time.

But here is what I have done.
I have taken the file from the link you had provided.
I have translated the whole file again and try to find the spots where the translations could be used.

Later I found out "others" , this whole set of configuration , which had been missing on my german one.
So I went back to your link and grabbed the english version where I instantly saw that it was longer and checked that for a line from the OTHER tab

And then I found out that this english file has been longer and so I tried my best to copy the part which had been missing.

But I will check that out in notepad and compare those 2.

Is there any other way for me to check that file out on my local system before I send it to you ?
Would be alot easier. I have searched for the json file but could not find it, only a javascript which has at least the words or sentences of my german version.

Thanks a lot for your patience.

@typxxi
Copy link
Author

typxxi commented Jan 11, 2025

The last line was missing and needed a } but no comma as you can see here
image

Then I found an issue which I have not caused cause I guess there has been a change or depreciation in line 25
regarding the fan. My german version from github from tonight thas a feature called

set_speed ------ but in your line it is called ------ set_percentage

even though it looks like it would mean the same but might be a better description what figure is expected.
I have now used set_percentage (copy and paste)

image

I finally checked all the end of the lines if there was a comma or " missing, but I have not found any issue.
Only 1 space on the left border was missing in line 141 which might have caused trouble too, but no comma
image

Here is the "cut or seam" where I had prolonged the german json from github (just 182 line lons) with the missing lines from the end of the english one before I started the translation from line 182 to 248.

You can see that "new chapter" called "card editor" in line 181 and how they perfectly fit together.
image

I also have checked the file link you had provided to my first verions where I saw something I was not sure about and did not wanna change there, but it made me wonder cause first I had assumed that all lines and evern the "}" had been alread in that file cause I saw 6 of them.
But the line number 248 was missing and it is marked in red, so I just wanna ask you if I am right that this red marker means that the "}" was the missing line ?
image

Is there any possibility to increase the fontsize in this particular part like maybe css or so which I had been using in the apex charts in the past but I have not much clue about that ?

I have a nearly blind father over 80 years old and he has only 1 eye left and there he has already lost 40% of the sharpnes and sight too. Therefore I usually have to improve most cards with bigger fonts or bold to make it readable for him on his 49 inch monitor.

image

Here is the 248 line long file

{
  "services": {
    "generic": {
      "parameter_to_value": "{parameter} auf {value}",
      "action_with_parameter": "{action} mit {parameter}"
    },
    "climate": {
      "set_temperature": "Temperatur einstellen[ auf {temperature}]",
      "set_temperature_hvac_mode_heat": "heizen[ auf {temperature}]",
      "set_temperature_hvac_mode_cool": "kühlen[ auf {temperature}]",
      "set_temperature_hvac_mode_heat_cool": "heizen / kühlen[ auf {temperature}]",
      "set_temperature_hvac_mode_heat_cool_range": "heizen / kühlen[ auf {target_temp_low} - {target_temp_high}]",
      "set_temperature_hvac_mode_auto": "automatisch[ auf {temperature}]",
      "set_hvac_mode": "Modus einstellen[ auf {hvac_mode}]",
      "set_preset_mode": "Voreinstellung einstellen[ auf {preset_mode}]",
      "set_fan_mode": "Lüftermodus einstellen[ auf {fan_mode}]"
    },
    "cover": {
      "close_cover": "schließen",
      "open_cover": "öffnen",
      "set_cover_position": "Position speichern[ für {position}]",
      "set_cover_tilt_position": "Lamellenneigung einstellen[ auf {tilt_position}]"
    },
    "fan": {
      "set_percentage": "Geschwindigkeit einstellen[ auf {percentage}]",
      "set_direction": "Richtung einstellen[ auf {direction}]",
      "oscillate": "Schwingungsbreite einstellen[ auf {oscillate}]"
    },
    "humidifier": {
      "set_humidity": "Luftfeuchtigkeit einstellen[ auf {humidity}]",
      "set_mode": "Modus einstellen[ auf {mode}]"
    },
    "input_number": {
      "set_value": "Wert einstellen[ auf {value}]"
    },
    "input_select": {
      "select_option": "Option[ {option}] auswählen"
    },
    "select": {
      "select_option": "Option[ {option}] auswählen"
    },
    "light": {
      "turn_on": "anschalten[ mit {brightness} Helligkeit]"
    },
    "media_player": {
      "select_source": "Quelle[ {source}] auswählen"
    },
    "notify": {
      "notify": "Nachricht senden"
    },
    "script": {
      "script": "ausführen"
    },
    "vacuum": {
      "start_pause": "Start / Pause"
    },
    "water_heater": {
      "set_operation_mode": "Betriebsart einstellen[ auf {operation_mode}]",
      "set_away_mode": "Abwesenheitsmodus aktivieren"
    }
  },
  "domains": {
    "alarm_control_panel": "Alarmzentrale",
    "binary_sensor": "binärer Sensor",
    "climate": "Heizung",
    "cover": "Beschattung",
    "fan": "Lüfter",
    "group": "Gruppen",
    "humidifier": "Befeuchter",
    "input_boolean": "boolescher Eingangswert",
    "input_number": "Eingabe Zahl",
    "input_select": "Eingabeauswahl",
    "lawn_mower": "Rasenmäher",
    "light": "Licht",
    "lock": "Schloss",
    "media_player": "Medienplayer",
    "notify": "notification",
    "switch": "Schalter",
    "vacuum": "Staubsauger",
    "water_heater": "Boiler"
  },
  "ui": {
    "components": {
      "date": {
        "day_types_short": {
          "daily": "täglich",
          "workdays": "werktags",
          "weekend": "Wochenende"
        },
        "day_types_long": {
          "daily": "jeden Tag",
          "workdays": "an Werktagen",
          "weekend": "am Wochenende"
        },
        "days": "Tage",
        "tomorrow": "morgen",
        "repeated_days": "jeden {days}",
        "repeated_days_except": "täglich außer {excludedDays}",
        "days_range": "von {startDay} bis {endDay}",
        "next_week_day": "nächsten {weekday}"
      },
      "time": {
        "absolute": "um {time}",
        "interval": "von {startTime} bis {endTime}",
        "at_midnight": "um Mitternacht",
        "at_noon": "um Mittag",
        "at_sun_event": "beim {sunEvent}"
      }
    },
    "dialog": {
      "enable_schedule": {
        "title": "Änderungen abschließen",
        "description": "Der geänderte Zeitplan ist derzeit deaktiviert. Soll er jetzt aktiviert werden?"
      },
      "confirm_delete": {
        "title": "Entität entfernen?",
        "description": "Bist du dir sicher, dass du diese Entität löschen möchtest?"
      },
      "weekday_picker": {
        "title": "wiederkehrende Tage für den Zeitplan",
        "choose": "Wähle aus ..."
      },
      "entity_picker": {
        "title": "Wähle die Entitäten aus"
      },
      "action_picker": {
        "title": "Wähle die Aktion aus"
      }
    },
    "panel": {
      "common": {
        "title": "Zeitplaner",
        "new_schedule": "Neuer Zeitplan",
        "default_name": "Zeitplan #{id}"
      },
      "overview": {
        "no_entries": "Es gibt keine Einträge, die angezeigt werden können",
        "backend_error": "Es konnte keine Verbindung mit der Scheduler Backend Komponente hergestellt werden. Es muss zuerst die Scheduler Integration als Backend installiert worden sein, bevor diese Karte verwendet werden kann.",
        "excluded_items": "{number} {if number is 1} ausgeschlossener Zeitplan {else} ausgeschlossene Zeitpläne",
        "hide_excluded": "Blende ausgeschlossene Zeitpläne aus",
        "additional_tasks": "{number} weitere {if number is 1} Aufgabe {else} Aufgaben"
      },
      "editor": {
        "repeated_days": "wiederholte Tage",
        "start_time": "Beginn",
        "stop_time": "Ende",
        "action": "Aktivität",
        "add_action": "Füge eine Aktivität hinzu",
        "select_timeslot": "Wähle ein Zeitfenster aus",
        "validation_errors": {
          "overlapping_time": "Der Zeitplan hat überlappende Zeitfenster",
          "missing_target_entity": "Eine oder mehrere Aktivitäten haben noch keine Entität",
          "missing_service_parameter": "Einer oder mehreren Aktionen fehlt eine erforderliche Einstellung",
          "missing_action": "Zeitplan fehlt noch eine Aktion"
        }
      },
      "options": {
        "conditions": {
          "header": "Conditions",
          "add_condition": "Füge eine Bedingung hinzu",
          "types": {
            "equal_to": "{entity} ist {value}",
            "unequal_to": "{entity} ist ungleich {value}",
            "above": "{entity} ist größer als {value}",
            "below": "{entity} ist kleiner als {value}"
          },
          "options": {
            "logic_and": "Alle Bedingungen müssen erfüllt sein",
            "logic_or": "Jede Bedingung müssen erfüllt sein",
            "track_changes": "Erneut prüfen, sobald es Änderungen gibt"
          }
        },
        "period": {
          "header": "Zeitraum",
          "start_date": "von",
          "end_date": "bis"
        },
        "repeat_type": "Verhalten nach Abschluß",
        "tags": "Tags"
      },		
      "card_editor": {
        "tabs": {
          "entities": "Entitäten",
          "other": "Andere"
        },
        "fields": {
          "title": {
            "heading": "Kartentitel",
            "options": {
              "standard": "Standard",
              "hidden": "verborgen",
              "custom": "individuell"
            },
            "custom_title": "individueller Kartentitel"
          },
          "discover_existing": {
            "heading": "Alle Zeitpläne anzeigen",
            "description": "Dieses setzt den Parameter 'discover existing' (entdecke existierende Zeitpläne). Zuvor angelegte Zeitpläne werden automatisch mit in der Karte angezeigt."
          },
          "time_step": {
            "heading": "Schrittweite Zeit",
            "description": "Zeitauflösung (in Minuten) beim Anlegen von Zeitplänen"
          },
          "sort_by": {
            "heading": "Sortier Optionen",
            "description": "Reihenfolge in welcher die Zeitpläne in der Karte erscheinen",
            "options": {
              "relative_time": "nach der Zeit bis zur nächsten Aktion",
              "title": "nach dem Namen des Zeitplans",
              "state": "aktive Zeitpläne oben anzeigen"
            }
          },
          "display_format_primary": {
            "heading": "Primär angezeigte Infos",
            "description": "Lege fest, welche Bezeichnungen in der Übersicht angezeigt werden",
            "options": {
              "default": "Zeitplan Name",
              "entity_action": "Zusammenfassung der Aufgabe"
            }
          },
          "display_format_secondary": {
            "heading": "Sekundär angezeigte Infos",
            "description": "Lege fest, welche weiteren Bezeichnungen in der Übersicht anzuzeigen sind",
            "options": {
              "relative_time": "verbleibende Zeit bis zur nächsten Aktion",
              "time": "Nächster Auslösezeitpunkt",
              "days": "Tage mit Wiederholungen",
              "additional_tasks": "Anzahl weiterer Schritte"
            }
          },
          "show_header_toggle": {
            "heading": "Haupteinschalter einblenden",
            "description": "Haupteinschalter oben in der Karte zum Ein- / Ausschalten aller Schritte anzeigen"
          },
          "tags": {
            "heading": "Identifizierungskennzeichen",
            "description": "Nutze Identifizierungskennzeichen zum Unterscheiden von Zeitplänen zwischen verschiedenen Karten"
          },
          "entities": {
            "heading": "Nutzbare Entitäten auswählen",
            "description": "Wählen die Entitäten aus, die im Zeitplan genutzt werden können. Klicke eine Gruppen an, um deren Mitglieder anzusehen. Beachte, das einige Entitäten (wie Sensoren) nur für Bedingungen und nicht für Aktionen genutzt werden können.",
            "included_number": "{number}/{total} ausgewählt"
          }
        }
      }
    }
  }
}

I hope it work this time but I guess I will have to improve some points again cause I spend all the time in the translation and have only barely used the scheduler card with a Rademacher thermostat and a switch.

Here is a screenshot from the json parser cause my brother told me to check that first to get rid of typos and so on, but I had none.
image

Good luck and thanks a lot

@nielsfaber nielsfaber transferred this issue from nielsfaber/scheduler-component Jan 18, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants