Ich nutze für die Übersetzung meines Programms Textdateien, die zu den genutzten Strings die übersetzten Texte enthalten.
Bei mir (macOS) sieht das alles gut aus. Allerdings scheint es mit anderen Systemsprachen Probleme zu geben.
Hier eine Mail eines Anwenders (auch macOS):
Regarding menus in German and English, on a Mac the following: Menu item Familenbande, 3rd option down is marked Dienste, I think it should be Services. 4th option down is marked Familienbande ausblenden - I don’t know what that is. 5th option down is Andere ausblenden - don’t know what is 5th option down is Alle einblenden - don’t know this 6th option is Familienbande beenden - would that be Quit Familienbande.
On Edit menu 10th option is Diktat starten - don’t know this option. 11th option is Emoji & Symbole Leerstaste - should this be Emoji & Symbols key combination
Help menu 1st option is Suchen nach - don’t know what this is
If I choose save as then on the favourites it lists Programme - should be Applications Dienstprogra… - I think is Utilities Schreibtisch - I think maybe Desktop Dokumente - should be Documents Bilder - should be Pictures Filme - should be Film Muisk - should be Music Geteilt - I don’t know what that is
On the Format dialog it lists Stammbaumdaten - don’t know what that means It also displays Neuer Ordner - is that new folder And Abbrechen - should that be Cancel Sichern - should that be accept
Für mich sieht es so aus, dass macOS hier. diverse Menüs einfügt (von mir aus). Aber warum sind die in deutsch, wenn deutsch nicht die Systemsprache ist?
Wie kann in das Einfügen dieser Menüpunkte (passiert übrigens auch in Kontextmenüs) verhindern?
Noch kurioser wird es bei Dialogboxen.
Mein Code:
d.icon=3 //display question icon
d.ActionButton.Caption=AllgemeinesUebernehmen
d.CancelButton.Visible=True //show the Cancel button
d.CancelButton.Caption=AllgemeinesAbbrechen
d.AlternateActionButton.Visible=True //show the Dont Save button
d.AlternateActionButton.Caption=AllgemeinesNichtUebernehmen
d.Message=MessageVeraendertenDatensatzUebernehmen
Ich habe mein Programm mit englischen Texten geladen und bekomme im Dialog “Abbrechen” als Buttonbeschiftung (für den CancelButton), obwohl im Debugger der String für AllgemeinesAbbrechen mit “Cancel” ausgewiesen wird.
Auf was ist Language eingestellt? Das darf nie auf Default stehen.
Habe ich bisher nicht betrachtet.
…
Steht auf “German”.
Bedeutet das, ich muss für jede Sprache eine eigene Programmversion erzeugen?
Wäre suboptimal
Ich hätte angenommen, dass “Default” die Systemsprache nutz. Also das, was ich haben möchte. Warum sollte ich das dann nicht nutzen und wozu ist es dann gut?
Kann ich die “unerwünschten” (von macOS eingefügten) Einträge irgendwie verhindern?
Warum verwendest Du keine localised strings?
Das ist bei mir halt so gewachsen. Ich habe mich mit localised strings noch nicht auseinander gesetzt.
Wie muss ich mir das vorstellen?
Kann ich da auch Textdateien mit Übersetzungen einlesen, damit Anwender die Texte selbst lokalisieren können?
Probiere es einmal mit Englisch als Sprache. Soweit ich mich erinnere, nimmt Default die Sprache des Computers, auf dem das Programm erzeugt wurde. Was überhaupt keinen Sinn macht.
Dann ist aber bei mir auf dem Rechner auch alles auf Englisch. Ich hätte bei Default erwarte, dass die Systemsprache des Systems genutzt wird, auf dem die kompilierte App läuft.
Die localised strings verwendest Du wie jede andere Konstante.
Die Werte können exportiert werden und dann mit Lingua (Xojo) oder Open Lingua (Thomas Tempelmann und ich) bearbeitet werden.
Hört sich nicht schlecht an. Aber wie bekomme ich dann die Werte im Programm zur Laufzeit geändert? Wird wohl nicht gehen, wenn es Konstanten sind.
Aktuell habe ich einige Textdateien, die zeilenweise den Variablennamen, ein Trennzeichen und den Inhalt enthält.
Wie kann ich diese Dateien in den Programmcode einlesen? Muss ich das für jede Sprache händisch in alle Konstanten einfügen? Wäre bei über zweieinhalb Tausend Stings kein Vergnügen.
…
Ich habe mal kurz nach Lingua gegoogelt. Muss ich mir wohl mal genauer ansehen.
Bleibt für mich erst mal die Frage, ob man die Lokalisierung dann während der Programmnutzung ändern kann und ob der Anwender die Texte selbst ändern kann.
Vor allem wäre es aus meiner Sicht wünschenswert, wenn ich nur die lokalisierten Texte separat zum Nachladen anbieten könnte. Dann müssten die verschiedenen Sprachvarianten nicht grundsätzlich in der App vorhanden sein.
Leg Dir ein Modul “Strings” an und füge dort eine “Constant” vom Typ “String” ein. Die kann man dann auf “localized” stellen. Der Konstante dann einen aussagekräftigen Namen geben, wie z.b. “kAbout” (wird bei mir für den “Über” Text benutzt). Dann den Default value eingeben und in der Liste die gewünschten Sprachen ergänzen und den Text eingeben. Der Default value wird immer dann benutzt wenn das System keine der vorhandenen Sprachen kennt.
Verwendet wird das Ganze dann als Caption, Text oder Tooltip mit “Strings.kAbout” bzw. “#Strings.kAbout”.
Die lokalisierten Texte landen dann im Resources Ordner der App, z.B. als “de.lproj” bei macOS.
Selbst können die Anwender da allerdings nichts ändern - das würde die Code-Signierung des Programms zerstören.
Wenn man jemanden hat, der eine Fremdsprache (komplett) übersetzen will, dann ist der Weg über das von Beatrix geannnte Lingua Hlfsprogramm m.M.n. der beste Weg…
Nein, aber wozu auch? Als Anwender erwartet man doch, dass eine Anwendung in der Sprache startet, die man in den Systemeinstellungen unter „Sprache & Region“ angegeben hat, sofern sie diese unterstützt. Warum sollte man das zur Laufzeit ändern wollen? Wenn man die Anwendung in einer anderen Sprache nutzen will, muss man dazu vorher die Systemeinstellungen ändern und die Anwendung erneut starten. Das ist das übliche Prozedere, wie es macOS-Anwender erwarten.
Ich habe das Programm mal mit “Englisch” gestartet. Dann werden bei mir die vom System eingefügten Menüpunkte (z. B. Dienste) in Englisch angezeigt, obwohl ich deutsch als Systemsprache verwende.
…
Umgestellt auf Default. Jetzt sind die Dienste in deutsch. Somit scheint default wohl die Systemsprache zu verwenden.
Als Anwender erwartet man doch, dass eine Anwendung in der Sprache startet, die man in den Systemeinstellungen unter „Sprache & Region“ angegeben hat, sofern sie diese unterstützt. Warum sollte man das zur Laufzeit ändern wollen?
Weil jemand Deutscher ist, Deutsch als Systemsprache verwendet und in eine andere Sprache übersetzen möchte. Da ist es hilfreich, wenn das Programm in der Zielsprache ausgegeben wird und die nicht übersetzten Stellen in Deutsch erkennbar sind.
Weil jemand als Programmierer lieber mit einem englischen System arbeitet, mein Programm aber in Deutsch nutzen möchte.
Weil er einen anderen Grund hat.
Weil es geht (und weil ich es möchte ).
Aktuell sieht es so aus, als wäre die Spracheinstellung in Xojo auf Default für mich das Richtige.
Nein, auf gar keinen Fall Default verwenden. Ich denke, Dein Programm kommt durcheinander, weil Du eine eigene Übersetzung hast.
Was soll denn da durcheinander kommen?
Mir geht es nur darum, dass ich die vom System hinzugefügten Menüpunkte in Systemsprache ausgegeben werden. Das passt (denke ich).
Die Übersetzung der Springs übernehme ich im Programm selbst. Da greift “Default” doch gar nicht.
Ich verstehe das Problem nicht.
Also, das Programm sollte eine Sprache anzeigen. Warum sollten die Menüpunkte in einer anderen Sprache sein?
Soweit ich mich erinnere, zeigt Default die Sprache Deines Rechners an für alle Sprachen, die Du nicht definiert hast. Sprich, wenn Du Deutsch und Englisch hast und Dein Benutzer ist Franzose, dann bekommt der arme Franzose Deutsch angezeigt.
Früher mal war das noch einfacher, denn damals erlaubte es Apple, mit den Bordmitteln des Systems nachzuschauen, was für Lokalisierungen eine Anwendung hatte, und man konnte die einzelnen Sprachpakete deaktivieren oder sogar löschen. Bei manchen Anwendungen sparte man eine Menge Speicherplatz (manchmal an die 90 Prozent), wenn man nicht benötigte Lokalisierungen löschte. Wenn man eine Anwendung in einer anderen als der Systemsprache nutzen wollte, genügte es, die nicht gewünschten Lokalisierungen zu deaktivieren. Wenn man die Anwendung vorher duplizierte, konnte man sich so verschiedene Sprachversionen erzeugen und wahlweise die eine oder die andere starten.
Vor etlichen Jahren hat Apple dieses Feature leider entfernt, warum auch immer. Allerdings kann man sich den Inhalt einer App im Finder als Ordner anzeigen lassen und wie früher einzelne Lokalisierungen entfernen oder deaktivieren – es ist bloß nicht mehr so komfortabel, als man zur Deaktivierung nur in eine Checkbox klicken musste.
Du nutzt nun aber offensichtlich ein eigenes System zur Lokalisierung, und nicht das, das Apple dafür vorgesehen hat. Ich weiß nicht, ob das so populär ist. Man erwartet ja generell, dass sich Anwendungen unter macOS so verhalten, wie macOS-Anwendungen das üblicherweise tun – nämlich so, wie Apple es vorgesehen hat, ob man das nun gut findet oder nicht.
Dann stellt er im Programm auf französisch um.
Ich habe für etliche Sprachen Sprachdateien um alle programminternen Texte zu lokalisieren. Lediglich die Menüpunkte, die macOS von sich aus (ungefragt und unnötiger Weise) hinzufügt sind in der Sprache, die ich in Xojo angebe.
Ist das Default, sind sie in Systemssprache. Stelle ich in Xojo auf Englisch, sind sie immer in Englisch.
Ich finde es sinnvoller, diese Menüpunkte grundsätzlich in Systemsprache zu sehen. Oder sie komplett zu unterdrücken, da sie unnütz sind. Ich weiß aber nicht, wie das geht.
Denken wir das mal durch:
Der Anwender startet das Programm. Beim ersten Start bekommt er eine Sprachwahlbox, aus der er eine Sprache wählen kann. Die wird dann genutzt.
Du schreibst:
Ich bin nicht mal sicher, ob ich an den Dateien innerhalb des App-Ordners überhaupt etwas ändern kann oder ob dann die Notarisierung den Start nicht verhindert.
Ich finde meine Variante besser. Macht mir auch weniger Arbeit, als alles anpassen zu müssen