{"id":109670,"date":"2023-03-03T10:31:03","date_gmt":"2023-03-03T09:31:03","guid":{"rendered":"https:\/\/phrase.com\/blog\/posts\/dein-ultimativer-guide-zur-python-lokalisierung\/"},"modified":"2025-09-17T12:47:36","modified_gmt":"2025-09-17T10:47:36","slug":"python-localization","status":"publish","type":"post","link":"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/","title":{"rendered":"Der ultimative Guide zur Python-Lokalisierung"},"content":{"rendered":"\n<p>Die Lokalisierung von Python-Anwendungen ist ein Prozess mit vielen beweglichen Teilen. Aber wenn es richtig gemacht wird, kann die Zug\u00e4nglichkeit verbessert, die Nutzerbindung erh\u00f6ht und die Marktreichweite erweitert werden.<\/p>\n\n\n\n<p>Um den Einstieg zu erleichtern, werden in diesem Tutorial bew\u00e4hrte Praktiken gezeigt, wie Python-Apps mit JSON- oder YAML-Dateien f\u00fcr die Lokalisierung vorbereitet werden k\u00f6nnen, und g\u00e4ngige Module besprochen, die dabei helfen.<\/p>\n\n\n\n<p>Es bietet wertvolle Einblicke sowohl f\u00fcr Entwickler, die die globale Anziehungskraft verbessern m\u00f6chten, als auch f\u00fcr Unternehmen, die in neue M\u00e4rkte expandieren wollen.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_81 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Overview<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#ui-strings-mit-python-internationalisieren-%e2%80%93-so-gehts\" >UI-Strings mit Python internationalisieren \u2013 so geht&#8217;s<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#warum-werden-uebersetzungsdateien-fuer-die-benutzeroberflaeche-verwendet\" >Warum werden \u00dcbersetzungsdateien f\u00fcr die Benutzeroberfl\u00e4che verwendet?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#installation\" >Installation<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#json-uebersetzungsdateien-laden-%e2%80%93-so-gehts\" >JSON-\u00dcbersetzungsdateien laden \u2013 so geht\u2019s<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#yaml-uebersetzungsdateien-laden-%e2%80%93-so-gehts\" >YAML-\u00dcbersetzungsdateien laden \u2013 so geht\u2019s<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#translator-klasse\" >Translator-Klasse<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#interpolation-zur-translator-klasse-hinzufuegen\" >Interpolation zur Translator-Klasse hinzuf\u00fcgen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#pluralisierung-zur-translator-klasse-hinzufuegen\" >Pluralisierung zur Translator-Klasse hinzuf\u00fcgen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#einsatz-des-translator-moduls-in-der-anwendung\" >Einsatz des Translator-Moduls in der Anwendung<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#wie-kann-die-python-ui-mit-gettext-internationalisiert-werden\" >Wie kann die Python-UI mit gettext internationalisiert werden?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#grundlegende-uebersetzungsnachrichten\" >Grundlegende \u00dcbersetzungsnachrichten<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#pluralisierung-mit-ngettext-hinzufuegen\" >Pluralisierung mit ngettext hinzuf\u00fcgen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-13\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#einsatz-von-gettext-in-der-anwendung\" >Einsatz von gettext in der Anwendung<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-14\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#wie-kann-eine-python-app-unterstuetzung-fuer-sprachen-von-rechts-nach-links-bieten\" >Wie kann eine Python-App Unterst\u00fctzung f\u00fcr Sprachen von rechts nach links bieten?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-15\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#how-do-i-format-localized-dates-and-times-in-python\" >How do I format localized dates and times in Python?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-16\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#how-do-i-work-with-date-and-time-duration\" >How do I work with date and time duration?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-17\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#hier-wird-erklaert-wie-sich-lokalisierte-datumsangaben-mit-babel-formatieren-lassen\" >Hier wird erkl\u00e4rt, wie sich lokalisierte Datumsangaben mit Babel formatieren lassen.<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-18\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#lokalisierte-zahlen-in-python-formatieren-%e2%80%93-so-gehts\" >Lokalisierte Zahlen in Python formatieren \u2013 so geht&#8217;s<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-19\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#das-locale-modul-zur-zahlenformatierung-verwenden-%e2%80%93-so-gehts\" >Das Locale-Modul zur Zahlenformatierung verwenden \u2013 so geht&#8217;s<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-20\" href=\"https:\/\/phrase.com\/de\/blog\/posts\/python-localization\/#lokalisierte-zahlen-mit-babel-formatieren-%e2%80%93-so-gehts\" >Lokalisierte Zahlen mit Babel formatieren \u2013 so geht&#8217;s<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2 class=\"wp-block-heading\" id=\"h-ui-strings-mit-python-internationalisieren-so-geht-s\"><span class=\"ez-toc-section\" id=\"ui-strings-mit-python-internationalisieren-%e2%80%93-so-gehts\"><\/span>UI-Strings mit Python internationalisieren \u2013 so geht&#8217;s<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Hier besprechen wir, was n\u00f6tig ist, um eine Python-App am besten f\u00fcr die Lokalisierung vorzubereiten.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-warum-werden-ubersetzungsdateien-fur-die-benutzeroberflache-verwendet\"><span class=\"ez-toc-section\" id=\"warum-werden-uebersetzungsdateien-fuer-die-benutzeroberflaeche-verwendet\"><\/span>Warum werden \u00dcbersetzungsdateien f\u00fcr die Benutzeroberfl\u00e4che verwendet?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Es gibt einige Vorteile bei der Verwendung von <a href=\"https:\/\/phrase.com\/de\/blog\/posts\/machine-translation\/\">\u00dcbersetzungsdateien<\/a> anstelle von fest codierten \u00dcbersetzungstexten in der Anwendung:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Sie lassen sich einfacher bearbeiten und \u00fcbersetzen, da die meisten \u00dcbersetzer mit Code nicht vertraut sind.<\/li>\n\n\n\n<li>Falsche \u00dcbersetzungstexte lassen sich leicht identifizieren, ohne im Code suchen zu m\u00fcssen<\/li>\n\n\n\n<li>Es ist nicht notwendig, Anwendungen neu zu erstellen, wenn es eine \u00c4nderung an einer \u00dcbersetzung gibt (abh\u00e4ngig von den verwendeten Programmiersprachen und Frameworks)<\/li>\n<\/ul>\n\n\n\n<p>Im Kern k\u00f6nnen \u00dcbersetzungsdateien in verschiedenen Formaten vorliegen. Im folgenden Abschnitt wird gezeigt, wie die Internationalisierung einer Python-Anwendung erfolgen kann:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Benutzerdefinierte Implementierung mit JSON\/YAML als \u00dcbersetzungsdateien<\/li>\n\n\n\n<li><code>babel<\/code> und <code>gettext<\/code> f\u00fcr die Arbeit mit PO- und MO-\u00dcbersetzungsdateien<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-installation\"><span class=\"ez-toc-section\" id=\"installation\"><\/span>Installation<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Bevor es losgeht, sollten die folgenden Python-Pakete installiert werden:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>babel<\/code>: Tools f\u00fcr die Internationalisierung und Lokalisierung in Python<\/li>\n\n\n\n<li><code>pyyaml<\/code>: Unterst\u00fctzung beim Lesen und Schreiben von YAML-Dateien<\/li>\n<\/ul>\n\n\n\n<p>Die folgenden Befehle k\u00f6nnen in der Kommandozeile ausgef\u00fchrt werden, um die Pakete zu installieren:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pip install pyyaml\npip install babel<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-json-ubersetzungsdateien-laden-so-geht-s\"><span class=\"ez-toc-section\" id=\"json-uebersetzungsdateien-laden-%e2%80%93-so-gehts\"><\/span>JSON-\u00dcbersetzungsdateien laden \u2013 so geht\u2019s<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>JSON bietet eine der einfachsten Methoden, \u00dcbersetzungsdateien zu speichern. Zum Beispiel kann eine neue Datei namens <code>en.json<\/code> mit den folgenden Elementen erstellt werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JSON \/ JSON mit Kommentaren\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\">{\n    <span class=\"hljs-attr\">\"title\"<\/span>: <span class=\"hljs-string\">\"Dialogstation\"<\/span>,\n    <span class=\"hljs-attr\">\"ques-name\"<\/span>: <span class=\"hljs-string\">\"Namen eingeben:\"<\/span>,\n    <span class=\"hljs-attr\">\"ques-age\"<\/span>: <span class=\"hljs-string\">\"Bitte Alter eingeben:\"<\/span>,\n    <span class=\"hljs-attr\">\"ans-name\"<\/span>: <span class=\"hljs-string\">\"Hallo $name! Willkommen bei Phrase\"<\/span>\n    <span class=\"hljs-string\">\"ans-age\"<\/span>: {\n        <span class=\"hljs-attr\">\"one\"<\/span>: <span class=\"hljs-string\">\"Du bist $count Jahr alt\"<\/span>,\n        <span class=\"hljs-attr\">\"other\"<\/span>: <span class=\"hljs-string\">\"Du bist $count Jahre alt\"<\/span>\n    },\n    <span class=\"hljs-attr\">\"ques-dob\"<\/span>: <span class=\"hljs-string\">\"Bitte Geburtsdatum eingeben (JJJJ-MM-TT):\"<\/span>,\n    <span class=\"hljs-attr\">\"ans-dob\"<\/span>: <span class=\"hljs-string\">\"Geboren am: $dob\"<\/span>\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON mit Kommentaren<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Danach l\u00e4dt man die Datei wie folgt mit dem integrierten <code>json<\/code> Paket hoch:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> json\n\nmit open(<span class=\"hljs-string\">'filename.json'<\/span>, <span class=\"hljs-string\">'r'<\/span>, encoding=<span class=\"hljs-string\">'utf8'<\/span>) als f:\n    data = json.load(f)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-yaml-ubersetzungsdateien-laden-so-geht-s\"><span class=\"ez-toc-section\" id=\"yaml-uebersetzungsdateien-laden-%e2%80%93-so-gehts\"><\/span>YAML-\u00dcbersetzungsdateien laden \u2013 so geht\u2019s<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Statt JSON-Dateien lassen sich auch YAML-Dateien verwenden. Daf\u00fcr wird das <code>pyyaml<\/code>-Paket ben\u00f6tigt, um YAML zu unterst\u00fctzen.<\/p>\n\n\n\n<p>Angenommen, <code>en.yaml<\/code> ist die \u00dcbersetzungsdatei f\u00fcr Englisch, mit dem folgenden Inhalt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">title: Interaktives Terminal\nques-name: <span class=\"hljs-string\">\"Name eingeben:\"<\/span>\nques-age: <span class=\"hljs-string\">\"Alter eingeben:\"<\/span>\nans-name: Hallo $name! Willkommen bei Phrase\nans-age:\n  one: Du bist $count Jahr alt\n  other: Du bist $count Jahre alt\nques-dob: <span class=\"hljs-string\">\"Bitte Geburtsdatum eingeben (JJJJ-MM-TT):\"<\/span>,\nans-dob: Geboren am: $dob<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Entsprechend sollte die deutsche \u00dcbersetzungsdatei <code>de.yaml<\/code> hei\u00dfen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">title: Dialogstation\nques-name: <span class=\"hljs-string\">\"Name eingeben:\"<\/span>\nques-age: <span class=\"hljs-string\">\"Alter eingeben:\"<\/span>\nans-name: Hallo $name! Willkommen bei Phrase\nans-age:\n  one: Du bist $count Jahr alt\n  other: Du bis $count Jahre alt\nques-dob: <span class=\"hljs-string\">\"Bitte Geburtsdatum eingeben (JJJJ-MM-TT):\"<\/span>,\nans-dob: Geboren am: $dob<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Es kann mit dem <code>pyyaml<\/code> Paket wie folgt geladen werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> yaml\n\nmit open(<span class=\"hljs-string\">'filename.yml'<\/span>, <span class=\"hljs-string\">'r'<\/span>, encoding=<span class=\"hljs-string\">'utf8'<\/span>) als f:\n    data = yaml.safe_load(f)<span class=\"hljs-keyword\">import<\/span> json<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-translator-klasse\"><span class=\"ez-toc-section\" id=\"translator-klasse\"><\/span>Translator-Klasse<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Mit dem bisher Gelernten wird ein individuelles Modul mit einer <code>Translator<\/code>-Klasse mit den folgenden Features erstellt:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00dcbersetzungsdateien beim Start laden<\/li>\n\n\n\n<li>Die aktive Locale wird festgelegt<\/li>\n\n\n\n<li>Die Pluralregeln werden festgelegt<\/li>\n\n\n\n<li>Der \u00dcbersetzungstext wird \u00fcbersetzt und formatiert<\/li>\n<\/ul>\n\n\n\n<p>Zus\u00e4tzlich beinhaltet das Modul noch zwei weitere Funktionen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ein String wird in ein datetime-Objekt umgewandelt<\/li>\n\n\n\n<li>Ein datetime-Objekt wird als String formatiert<\/li>\n<\/ul>\n\n\n\n<p>Man sollte darauf aachten, dass die Dateistruktur wie folgt aussieht:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">.\n\u251c\u2500\u2500 data (Ordner mit JSON- oder YAML-\u00dcbersetzungsdateien)\/\n\u2502   \u251c\u2500\u2500 en.json\n\u2502   \u251c\u2500\u2500 de.json\n\u2502   \u251c\u2500\u2500 en.yaml\n\u2502   \u2514\u2500\u2500 de.yaml\n\u251c\u2500\u2500 i18n.py (benutzerdefiniertes Modul)\n\u2514\u2500\u2500 main.py (Hauptanwendung)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Eine neue Python-Datei namens <code>i18n.py<\/code> mit folgendem Code erstellen:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">import json\nimport glob\nimport os\nimport yaml\nfrom datetime import datetime\nfrom babel.dates import format_datetime\n\nsupported_format = &#91;'json', 'yaml']\n\n\nclass Translator():\n    def __init__(self, translations_folder, file_format='json', default_locale='en'):\n        # Initialisierung\n        self.data = {}\n        self.locale = 'en'\n\n        # pr\u00fcfen, ob das Format unterst\u00fctzt wird\n        if file_format in supported_format:\n            # Liste der Dateien mit spezifischen Erweiterungen abrufen\n            files = glob.glob(os.path.join(translations_folder, f'*.{file_format}'))\n            for fil in files:\n                # Den Namen der Datei ohne Erweiterung abrufen, wird als Locale-Name verwendet\n                loc = os.path.splitext(os.path.basename(fil))&#91;0]\n                mit open(fil, 'r', encoding='utf8') als f:\n                    if file_format == 'json':\n                        self.data&#91;loc] = json.load(f)\n                    elif file_format == 'yaml':\n                        self.data&#91;loc] = yaml.safe_load(f)\n\n    def set_locale(self, loc):\n        if loc in self.data:\n            self.locale = loc\n        else:\n            print('Invalid locale')\n\n    def get_locale(self):\n        return self.locale\n\n    def translate(self, key):\n        # Den Key statt des \u00dcbersetzungstextes zur\u00fcckgeben, wenn das Gebietsschema nicht unterst\u00fctzt wird\n        if self.locale not in self.data:\n            return key\n\n        text = self.data&#91;self.locale].get(key, key)\n        \n        return text\n\n\ndef str_to_datetime(dt_str, format='%Y-%m-%d'):\n    return datetime.strptime(dt_str, format)\n\n\ndef datetime_to_str(dt, format='MMMM dd, yyyy', loc='en'):\n    return format_datetime(dt, format=format, locale=loc)<\/code><\/span><\/pre>\n\n\n<p>Das <code>glob<\/code>-Modul wird verwendet, um die \u00dcbersetzungsdateien je nach <code>file_format<\/code>-Wert dynamisch zu laden. Es werden entweder <code>json<\/code> oder <code>yaml<\/code> akzeptiert:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">    def __init__(<span class=\"hljs-keyword\">self<\/span>, folder, file_format=<span class=\"hljs-string\">'json'<\/span>, default_locale=<span class=\"hljs-string\">'en'<\/span>):\n        <span class=\"hljs-comment\"># ...<\/span>\n\n        <span class=\"hljs-comment\"># pr\u00fcfen, ob das Format unterst\u00fctzt wird<\/span>\n        <span class=\"hljs-keyword\">if<\/span> file_format in supported_format:\n            <span class=\"hljs-comment\"># Liste der Dateien mit spezifischen Erweiterungen abrufen<\/span>\n            Dateien = glob.glob(os.path.join(Ordner, f<span class=\"hljs-string\">'*.{file_format}'<\/span>))\n            <span class=\"hljs-keyword\">for<\/span> fil in files:\n                <span class=\"hljs-comment\"># Den Namen der Datei ohne Erweiterung abrufen, wird als Locale-Name verwendet<\/span>\n                loc = os.path.splitext(os.path.basename(fil))&#91;<span class=\"hljs-number\">0<\/span>]\n                mit open(fil, <span class=\"hljs-string\">'r'<\/span>, encoding=<span class=\"hljs-string\">'utf8'<\/span>) als f:\n                    <span class=\"hljs-keyword\">if<\/span> file_format == <span class=\"hljs-string\">'json'<\/span>:\n                        <span class=\"hljs-keyword\">self<\/span>.data&#91;loc] = json.load(f)\n                    elif file_format == <span class=\"hljs-string\">'yaml'<\/span>:\n                        <span class=\"hljs-keyword\">self<\/span>.data&#91;loc] = yaml.safe_load(f)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Kernfunktion ist die <code>translate<\/code>-Funktion, die den \u00dcbersetzungstext basierend auf der aktuell aktiven Locale zur\u00fcckgibt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">    def translate(<span class=\"hljs-keyword\">self<\/span>, key):\n        <span class=\"hljs-comment\"># stattdessen den Schl\u00fcssel zur\u00fcckgeben<\/span>\n        <span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">self<\/span>.locale not in <span class=\"hljs-keyword\">self<\/span>.data:\n            <span class=\"hljs-keyword\">return<\/span> key\n\n        text = <span class=\"hljs-keyword\">self<\/span>.data&#91;<span class=\"hljs-keyword\">self<\/span>.locale].get(key, key)\n\n        <span class=\"hljs-keyword\">return<\/span> text<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Das Modul enth\u00e4lt au\u00dferdem zwei zus\u00e4tzliche globale Funktionen f\u00fcr die Datumsformatierung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">def str_to_datetime(dt_str, format=<span class=\"hljs-string\">'%Y-%m-%d'<\/span>):\n    <span class=\"hljs-keyword\">return<\/span> datetime.strptime(dt_str, format)\n\ndef datetime_to_str(dt, format=<span class=\"hljs-string\">'MMMM dd, yyyy'<\/span>, loc=<span class=\"hljs-string\">'en'<\/span>):\n    <span class=\"hljs-keyword\">return<\/span> format_datetime(dt, format=format, locale=loc)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-interpolation-zur-translator-klasse-hinzufugen\"><span class=\"ez-toc-section\" id=\"interpolation-zur-translator-klasse-hinzufuegen\"><\/span>Interpolation zur Translator-Klasse hinzuf\u00fcgen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>F\u00fcr die Interpolation von Zeichenfolfen kann das integrierte Template String-Modul verwendet werden. Folgende Import-Anweisung wird hinzugef\u00fcgt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-10\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> string <span class=\"hljs-keyword\">import<\/span> Template<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-10\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Anstatt die Variable <code>text<\/code> direkt unter der Funktion <code>translate<\/code> zur\u00fcckzugeben, wird sie mit der Klasse <code>Template<\/code> instanziiert und die Funktion <code>safe_substitute<\/code> wie folgt aufgerufen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-11\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">def translate(<span class=\"hljs-keyword\">self<\/span>, key, **kwargs):\n    <span class=\"hljs-comment\"># Den Key statt des \u00dcbersetzungstextes zur\u00fcckgeben, wenn das Gebietsschema nicht unterst\u00fctzt wird<\/span>\n    <span class=\"hljs-keyword\">if<\/span> <span class=\"hljs-keyword\">self<\/span>.locale not in <span class=\"hljs-keyword\">self<\/span>.data:\n        <span class=\"hljs-keyword\">return<\/span> key\n\n    text = <span class=\"hljs-keyword\">self<\/span>.data&#91;<span class=\"hljs-keyword\">self<\/span>.locale].get(key, key)\n    \n    <span class=\"hljs-comment\"># String-Interpolation<\/span>\n    <span class=\"hljs-keyword\">return<\/span> Template(text).safe_substitute(**kwargs)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-11\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-pluralisierung-zur-translator-klasse-hinzufugen\"><span class=\"ez-toc-section\" id=\"pluralisierung-zur-translator-klasse-hinzufuegen\"><\/span>Pluralisierung zur Translator-Klasse hinzuf\u00fcgen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Die Klasse <code>babel.plural.PluralRule<\/code> kann f\u00fcr die Unterst\u00fctzung der Pluralisierung importiert werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-12\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> babel.plural <span class=\"hljs-keyword\">import<\/span> PluralRule<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-12\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Unter der <code>__init__<\/code>-Funktion l\u00e4sst sich eine neue <code>plural_rule<\/code>-Variable wie folgt initialisieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-13\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">    def __init__(<span class=\"hljs-keyword\">self<\/span>, folder, file_format=<span class=\"hljs-string\">'json'<\/span>, default_locale=<span class=\"hljs-string\">'en'<\/span>):\n        <span class=\"hljs-keyword\">self<\/span>.data = {}\n        <span class=\"hljs-keyword\">self<\/span>.locale = default_locale\n        <span class=\"hljs-keyword\">self<\/span>.plural_rule = PluralRule({<span class=\"hljs-string\">'one'<\/span>: <span class=\"hljs-string\">'n ist <\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-13\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-14\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">class Translator():\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">code<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">code<\/span>&gt;<\/span><span class=\"hljs-comment\">&lt;!--\/code--&gt;<\/span>\n\n    def set_locale(self, loc):\n        if loc in self.data:\n            self.locale = loc\n        else:\n            print('Invalid locale')\n\n    def get_locale(self):\n        return self.locale\n\n    def set_plural_rule(self, rule):\n        try:\n            self.plural_rule = PluralRule(rule)\n        except Exception:\n            print('Ung\u00fcltige Pluralregel')\n\n    def get_plural_rule(self):\n        return self.plural_rule<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-14\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u00c4nderung des Codes unter der Funktion <code>translate<\/code> zur Einbeziehung einer Pluralisierungspr\u00fcfung:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-15\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">class Translator():\n    <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">code<\/span>&gt;<\/span><span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">code<\/span>&gt;<\/span><span class=\"hljs-comment\">&lt;!--\/code--&gt;<\/span>\n\n    def translate(self, key, **kwargs):\n        # Den Key statt des \u00dcbersetzungstextes zur\u00fcckgeben, wenn das Gebietsschema nicht unterst\u00fctzt wird\n        if self.locale not in self.data:\n            return key\n\n        text = self.data&#91;self.locale].get(key, key)\n\n        # Typ dict steht f\u00fcr Schl\u00fcssel in Pluralform\n        if type(text) == dict:\n            count = kwargs.get('count', 1)\n        # Anzahl in einen Integer umwandeln\n        try:\n            count = int(count)\n        except Exception:\n            print('Invalid count')\n            return key\n\n        text = text.get(self.plural_rule(count), key)\n        return Template(text).safe_substitute(**kwargs)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-15\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der komplette Code f\u00fcr die <code>Translator<\/code>-Klasse sieht wie folgt aus:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">from babel.plural import PluralRule\nimport json\nfrom string import Template\nimport glob\nimport os\nimport yaml\nfrom datetime import datetime\nfrom babel.dates import format_datetime\n\nsupported_format = &#91;'json', 'yaml']\n\n\nclass Translator():\n    def __init__(self, translations_folder, file_format='json', default_locale='en'):\n        # Initialisierung\n        self.data = {}\n        self.locale = 'en'\n        self.plural_rule = PluralRule({'one': 'n ist 1'})\n\n        # pr\u00fcfen, ob das Format unterst\u00fctzt wird\n        if file_format in supported_format:\n            # Liste der Dateien mit spezifischen Erweiterungen abrufen\n            files = glob.glob(os.path.join(translations_folder, f'*.{file_format}'))\n            for fil in files:\n                # Den Namen der Datei ohne Erweiterung abrufen, wird als Locale-Name verwendet\n                loc = os.path.splitext(os.path.basename(fil))&#91;0]\n                mit open(fil, 'r', encoding='utf8') als f:\n                    if file_format == 'json':\n                        self.data&#91;loc] = json.load(f)\n                    elif file_format == 'yaml':\n                        self.data&#91;loc] = yaml.safe_load(f)\n\n    def set_locale(self, loc):\n        if loc in self.data:\n            self.locale = loc\n        else:\n            print('Invalid locale')\n\n    def get_locale(self):\n        return self.locale\n\n    def set_plural_rule(self, rule):\n        try:\n            self.plural_rule = PluralRule(rule)\n        except Exception:\n            print('Ung\u00fcltige Pluralregel')\n\n    def get_plural_rule(self):\n        return self.plural_rule\n\n    def translate(self, key, **kwargs):\n        # Den Key statt des \u00dcbersetzungstextes zur\u00fcckgeben, wenn das Gebietsschema nicht unterst\u00fctzt wird\n        if self.locale not in self.data:\n            return key\n\n        text = self.data&#91;self.locale].get(key, key)\n        # Typ dict steht f\u00fcr Schl\u00fcssel in Pluralform\n        if type(text) == dict:\n            count = kwargs.get('count', 1)\n            # Anzahl in einen Integer umwandeln\n            try:\n                count = int(count)\n            except Exception:\n                print('Invalid count')\n                return key\n            text = text.get(self.plural_rule(count), key)\n        return Template(text).safe_substitute(**kwargs)\n\n\ndef parse_datetime(dt, input_format='%Y-%m-%d', output_format='MMMM dd, yyyy', output_locale='en'):\n    dt = datetime.strptime(dt, input_format)\n    return format_datetime(dt, format=output_format, locale=output_locale)<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-einsatz-des-translator-moduls-in-der-anwendung\"><span class=\"ez-toc-section\" id=\"einsatz-des-translator-moduls-in-der-anwendung\"><\/span>Einsatz des Translator-Moduls in der Anwendung<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Nun kann die Klasser <code>Translator<\/code> als Modul in der Anwendung genutzt werden. Der folgende Code dient als Referenz f\u00fcr die grundlegende Nutzung des individuellen <code>Translator<\/code>-Moduls:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-16\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># Modul importieren<\/span>\nimport i18n\n\n<span class=\"hljs-comment\"># Eine neue Translator-Klasse mit dem Pfad zu den Daten erstellen<\/span>\ntranslator = i18n.Translator(<span class=\"hljs-string\">'data\/'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-16\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-17\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">name = <span class=\"hljs-string\">'John Doe'<\/span>\n<span class=\"hljs-keyword\">print<\/span>(translator.translate(<span class=\"hljs-string\">'ans-name'<\/span>, name=name))\n<span class=\"hljs-comment\"># Hallo John Doe! Willkommen bei Phrase<\/span>\n\n<span class=\"hljs-comment\"># Die aktive Locale auf de \u00e4ndern<\/span>\ntranslator.set_locale(<span class=\"hljs-string\">'de'<\/span>)\n<span class=\"hljs-keyword\">print<\/span>(translator.translate(<span class=\"hljs-string\">'ans-name'<\/span>, name=name))\n<span class=\"hljs-comment\"># Hallo John Doe! Willkommen bei Phrase<\/span>\n\nage = <span class=\"hljs-number\">30<\/span>\n<span class=\"hljs-keyword\">print<\/span>(translator.translate(<span class=\"hljs-string\">'ans-age'<\/span>, count=age))\n<span class=\"hljs-comment\"># Du bist 30 Jahre alt<\/span>\n\ndob = <span class=\"hljs-string\">'1992-01-01'<\/span>\ndob = i18n.parse_datetime(dob)\n\n<span class=\"hljs-keyword\">print<\/span>(translator.translate(<span class=\"hljs-string\">'ans-dob'<\/span>, dob=dob))\n<span class=\"hljs-comment\">#Geboren am: 01. Januar 1992<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-17\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Funktionalit\u00e4t des <code>i18n<\/code> Moduls l\u00e4sst sich problemlos erweitern, um je nach Bedarf weitere Funktionen zu unterst\u00fctzen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-wie-kann-die-python-ui-mit-gettext-internationalisiert-werden\"><span class=\"ez-toc-section\" id=\"wie-kann-die-python-ui-mit-gettext-internationalisiert-werden\"><\/span>Wie kann die Python-UI mit gettext internationalisiert werden?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Alternativ kann das <code>gettext<\/code> Modul zur Internationalisierung von Python-Anwendungen genutzt werden. <code>gettext<\/code> verwendet PO (auch bekannt als POT) und MO-Nachrichtenkatalogdateien.<\/p>\n\n\n\n<p>\ud83d\uddd2 <em>Hinweis \u00bb<\/em> PO-Dateien stellen die von Menschen bearbeitbaren \u00dcbersetzungsdateien dar, w\u00e4hrend MO-Dateien maschinenlesbar f\u00fcr den Gebrauch durch <code>gettext<\/code> sind.<\/p>\n\n\n\n<p>Zum Gl\u00fcck erg\u00e4nzt das <code>babel<\/code> Paket das <code>gettext<\/code> Modul hervorragend. <code>babel<\/code> bietet folgende praktische Funktionen f\u00fcr die Arbeit mit Nachrichtenkatalogen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>extract<\/code>: Nachrichten aus Quelldateien extrahieren, um eine POT-Datei zu generieren<\/li>\n\n\n\n<li><code>init<\/code>: neue Nachrichtenkataloge aus einer POT-Datei erstellen<\/li>\n\n\n\n<li><code>update<\/code>: vorhandene Nachrichtenkataloge in einer POT-Datei updaten<\/li>\n\n\n\n<li><code>compile<\/code>: POT-Dateien zu MO-Dateien kompilieren<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-grundlegende-ubersetzungsnachrichten\"><span class=\"ez-toc-section\" id=\"grundlegende-uebersetzungsnachrichten\"><\/span>Grundlegende \u00dcbersetzungsnachrichten<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>In der ersten Phase werden Strings in den Quelldateien als \u00fcbersetzbar markiert. Dabei lassen sich \u00fcbersetzbare Strings einfach mit der Funktion <code>_()<\/code> umschlie\u00dfen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-18\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\"># unmarkierte Strings<\/span>\n<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">'Interactive Terminal'<\/span>)\n<span class=\"hljs-keyword\">print<\/span>(<span class=\"hljs-string\">'title'<\/span>)\n\n<span class=\"hljs-comment\"># Als \u00fcbersetzbar markierte Strings<\/span>\n<span class=\"hljs-keyword\">print<\/span>(_(<span class=\"hljs-string\">'Interactive Terminal'<\/span>))\n<span class=\"hljs-keyword\">print<\/span>(_(<span class=\"hljs-string\">'title'<\/span>))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-18\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pybabel extract -o data\/messages.pot main_babel.py<\/code><\/span><\/pre>\n\n\n<p>Folgender Inhalt sollte in der Ausgabedatei <code>data\/messages.pot<\/code> enthalten sein:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-19\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">    msgid <span class=\"hljs-string\">\"\"<\/span>\n    msgstr <span class=\"hljs-string\">\"\"<\/span>\n    <span class=\"hljs-string\">\"Project-Id-Version: PROJECT VERSIONn\"<\/span>\n    <span class=\"hljs-string\">\"Report-Msgid-Bugs-To: EMAIL@ADDRESSn\"<\/span>\n    <span class=\"hljs-string\">\"POT-Creation-Date: 2022-06-17 23:04+0800n\"<\/span>\n    <span class=\"hljs-string\">\"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONEn\"<\/span>\n    <span class=\"hljs-string\">\"Last-Translator: FULL NAME &amp;lt;EMAIL@ADDRESS&amp;gt;n\"<\/span>\n    <span class=\"hljs-string\">\"Language-Team: LANGUAGE &amp;lt;LL@li.org&amp;gt;n\"<\/span>\n    <span class=\"hljs-string\">\"MIME-Version: 1.0n\"<\/span>\n    <span class=\"hljs-string\">\"Content-Type: text\/plain; charset=utf-8n\"<\/span>\n    <span class=\"hljs-string\">\"Content-Transfer-Encoding: 8bitn\"<\/span>\n    <span class=\"hljs-string\">\"Generated-By: Babel 2.10.1n\"<\/span>\n\n    <span class=\"hljs-comment\">#: main_babel.py:11<\/span>\n    msgid <span class=\"hljs-string\">\"title\"<\/span>\n    msgstr <span class=\"hljs-string\">\"\"<\/span>\n\n    <span class=\"hljs-comment\">#: main_babel.py:14<\/span>\n    msgid <span class=\"hljs-string\">\"ques-name\"<\/span>\n    msgstr <span class=\"hljs-string\">\"\"<\/span>\n\n    <span class=\"hljs-comment\">#<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-19\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dies bildet die Grund\u00fcbersetzungsdatei. <code>msgid<\/code> ist der einzigartige Identifier f\u00fcr jede zu \u00fcbersetzende Nachricht, w\u00e4hrend <code>msgstr<\/code> den \u00dcbersetzungstext repr\u00e4sentiert. <code>msgstr<\/code> kann vorerst leer bleiben, da der eigentliche \u00dcbersetzungstext in den PO-Dateien stehen sollte.<\/p>\n\n\n\n<p>W\u00e4hrend der Initialisierungsphase erzeugt das <code>babel<\/code> Modul automatisch die relevanten Dateien f\u00fcr jede Locale. Durch Ausf\u00fchren des folgenden Befehls f\u00fcr die Locale <code>en<\/code>  Locale kann ein Test durchgef\u00fchrt werden.<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pybabel init -l en -i data\/messages.pot -d data\/<\/code><\/span><\/pre>\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pybabel init -l de -i data\/messages.pot -d data\/<\/code><\/span><\/pre>\n\n\n<p>Der Inhalt jeder <code>messages.po<\/code> Datei sollte derselbe sein wie der der Basis-POT-Datei. Als n\u00e4chstes wird der entsprechende \u00dcbersetzungstext in die PO-Dateien eingef\u00fcgt:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-20\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">.\n\u251c\u2500\u2500 messages.pot\n\u251c\u2500\u2500 de\/\n\u2502   \u2514\u2500\u2500 LC_MESSAGES\/\n\u2502       \u2514\u2500\u2500 messages.po\n\u2514\u2500\u2500 en\/\n    \u2514\u2500\u2500 LC_MESSAGES\/\n        \u2514\u2500\u2500 messages.po<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-20\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-21\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#: main_babel.py:11<\/span>\nmsgid <span class=\"hljs-string\">\"title\"<\/span>\nmsgstr <span class=\"hljs-string\">\"Interactive Terminal\"<\/span>\n\n<span class=\"hljs-comment\">#: main_babel.py:14<\/span>\nmsgid <span class=\"hljs-string\">\"ques-name\"<\/span>\nmsgstr <span class=\"hljs-string\">\"Name eingeben:\"<\/span>\n\n<span class=\"hljs-comment\">#: main_babel.py:16<\/span>\nmsgid <span class=\"hljs-string\">\"ans-name\"<\/span>\nmsgstr <span class=\"hljs-string\">\"Hallo {name}!\"<\/span> Willkommen bei Phrase<span class=\"hljs-string\">\"\n\n#: main_babel.py:19\nmsgid \"<\/span>ques-age<span class=\"hljs-string\">\"\nmsgstr \"<\/span>Alter eingeben:<span class=\"hljs-string\">\"\n\n#: main_babel.py:21\nmsgid \"<\/span>ans-age<span class=\"hljs-string\">\"\nmsgid_plural \"<\/span>ans-age-plural<span class=\"hljs-string\">\"\nmsgstr&#91;0] \"<\/span>Du bist {count} Jahre alt<span class=\"hljs-string\">\"\nmsgstr&#91;1] \"<\/span>Du bist {count} Jahre alt<span class=\"hljs-string\">\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-21\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Am Ende wird der folgende Befehl ausgef\u00fchrt, um PO-Dateien in MO-Dateien zu kompilieren:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pybabel compile -d data\/<\/code><\/span><\/pre>\n\n\n<p>Der Ordner <code>data<\/code> sollte wie folgt aussehen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-22\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">.\n\u251c\u2500\u2500 messages.pot\n\u251c\u2500\u2500 de\/\n\u2502   \u2514\u2500\u2500 LC_MESSAGES\/\n\u2502       \u251c\u2500\u2500 messages.mo\n\u2502       \u2514\u2500\u2500 messages.po\n\u2514\u2500\u2500 en\/\n    \u2514\u2500\u2500 LC_MESSAGES\/\n        \u251c\u2500\u2500 messages.mo\n        \u2514\u2500\u2500 messages.po<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-22\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Sobald das erledigt ist, k\u00f6nnen mit der Funktion <code>gettext.translation<\/code> die \u00dcbersetzungsdateien geladen werden.<\/p>\n\n\n\n<p>Zum Beispiel kann die <code>install<\/code> Funktion aufgerufen werden, um sie als die aktuell aktive Locale festzulegen und den \u00dcbersetzungstext wie folgt abzurufen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-23\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import gettext\n\n<span class=\"hljs-comment\"># Initialisierung<\/span>\nlang_en = gettext.translation(<span class=\"hljs-string\">'messages'<\/span>, localedir=<span class=\"hljs-string\">'data'<\/span>, languages=&#91;<span class=\"hljs-string\">'en'<\/span>])\n\n<span class=\"hljs-comment\"># aktuelle Sprache auf en setzen<\/span>\nlang_en.install()\n\n<span class=\"hljs-keyword\">print<\/span>(_(<span class=\"hljs-string\">'ans-name'<\/span>))\n<span class=\"hljs-comment\"># Hallo John! Willkommen bei Phrase<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-23\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-24\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#: main_babel.py:16<\/span>\nmsgid <span class=\"hljs-string\">\"ans-name\"<\/span>\nmsgstr <span class=\"hljs-string\">\"Hallo {name}!\"<\/span> Willkommen bei Phrase<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-24\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-25\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import gettext\n\n<span class=\"hljs-comment\"># Initialisierung<\/span>\nlang_en = gettext.translation(<span class=\"hljs-string\">'messages'<\/span>, localedir=<span class=\"hljs-string\">'data'<\/span>, languages=&#91;<span class=\"hljs-string\">'en'<\/span>])\n\n<span class=\"hljs-comment\"># aktuelle Sprache auf en setzen<\/span>\nlang_en.install()\n\n<span class=\"hljs-keyword\">print<\/span>(_(<span class=\"hljs-string\">'ans-name'<\/span>).format(name=<span class=\"hljs-string\">'John'<\/span>))\n<span class=\"hljs-comment\"># Hallo John! Willkommen bei Phrase<\/span>\n\n<span class=\"hljs-keyword\">print<\/span>(_(<span class=\"hljs-string\">'ans-name'<\/span>).format(name=<span class=\"hljs-string\">'Kelly'<\/span>))\n<span class=\"hljs-comment\"># Hallo Kelly! Willkommen bei Phrase<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-25\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-pluralisierung-mit-ngettext-hinzufugen\"><span class=\"ez-toc-section\" id=\"pluralisierung-mit-ngettext-hinzufuegen\"><\/span>Pluralisierung mit ngettext hinzuf\u00fcgen<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>F\u00fcr die Unterst\u00fctzung einer Pluralisierung l\u00e4sst sich die Funktion <code>ngettext<\/code> nutzen. Dabei werden drei Eingabeargumente akzeptiert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>singular<\/code>: ID f\u00fcr Einzahlform<\/li>\n\n\n\n<li><code>plural<\/code>: ID f\u00fcr die Pluralform<\/li>\n\n\n\n<li><code>n<\/code>: Pluralbestimmer<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-26\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">print<\/span>(ngettext(<span class=\"hljs-string\">'ans-age'<\/span>, <span class=\"hljs-string\">'ans-age-plural'<\/span>, age))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-26\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wie die <code>gettext<\/code>-Funktion gibt auch <code>ngettext<\/code> die \u00fcbersetzte Zeichenfolge zur\u00fcck. Mit einer Funktion wie <code>format<\/code> l\u00e4sst sich im Ausgabestring einfach interpolieren:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-27\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-keyword\">print<\/span>(ngettext(<span class=\"hljs-string\">'ans-age'<\/span>, <span class=\"hljs-string\">'ans-age-plural'<\/span>, age).format(count=age))<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-27\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Nach der Extraktion zeigt sich eine andere Syntax in der Basis\u00fcbersetzungsdatei (POT):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-28\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\"><span class=\"hljs-comment\">#: main_babel.py:21<\/span>\nmsgid <span class=\"hljs-string\">\"ans-age\"<\/span>\nmsgid_plural <span class=\"hljs-string\">\"ans-age-plural\"<\/span>\nmsgstr&#91;<span class=\"hljs-number\">0<\/span>] <span class=\"hljs-string\">\"\"<\/span>\nmsgstr&#91;<span class=\"hljs-number\">1<\/span>] <span class=\"hljs-string\">\"\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-28\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Die Anzahl von <code>msgstr<\/code> basiert auf der Anzahl der f\u00fcr das Gebietsschema festgelegten Pluralformen. Verschiedene Sprachregionen haben unterschiedliche Anzahlen an Pluralformen. So gibt es im Englischen zwei, im Arabischen sechs Pluralformen.<\/p>\n\n\n\n<p>Ein Kommentar am Anfang der Datei zeigt, wie die Pluralform einer Nachricht f\u00fcr eine Locale bestimmt wird. Ein Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-29\" data-shcb-language-name=\"JSON \/ JSON mit Kommentaren\" data-shcb-language-slug=\"json\"><span><code class=\"hljs language-json\"><span class=\"hljs-string\">\"Plural-Forms: nplurals=2; plural=(n != 1);n\"<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-29\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JSON \/ JSON mit Kommentaren<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">json<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-30\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\"># 2 Pluralformen\n\"Plural-Forms: nplurals=2; plural=(n != 1)n\"\n\n# 3 Pluralformen\n\"Plural-Forms: nplurals=3; plural=(n%10==1 &amp;&amp; n%100!=11 ? 0 : n%10<span class=\"hljs-symbol\">&amp;gt;<\/span>=2 <span class=\"hljs-symbol\">&amp;amp;<\/span><span class=\"hljs-symbol\">&amp;amp;<\/span> \"\n\"n%10<span class=\"hljs-symbol\">&amp;lt;<\/span>=4 <span class=\"hljs-symbol\">&amp;amp;<\/span><span class=\"hljs-symbol\">&amp;amp;<\/span> (n%100<span class=\"hljs-symbol\">&amp;lt;<\/span>10 || n%100<span class=\"hljs-symbol\">&amp;gt;<\/span>=20) ? 1 : 2)n\"\n\n# 6 Pluralformen\n\"Plural-Forms: nplurals=6; plural=(n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : \"\n\"n%100<span class=\"hljs-symbol\">&amp;gt;<\/span>=3 <span class=\"hljs-symbol\">&amp;amp;<\/span><span class=\"hljs-symbol\">&amp;amp;<\/span> n%100<span class=\"hljs-symbol\">&amp;lt;<\/span>=10 ? 3 : n%100<span class=\"hljs-symbol\">&amp;gt;<\/span>=0 <span class=\"hljs-symbol\">&amp;amp;<\/span><span class=\"hljs-symbol\">&amp;amp;<\/span> n%100<span class=\"hljs-symbol\">&amp;lt;<\/span>=2 ? 4 : 5)n\"<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-30\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der pluralisierte Text kann wie folgt abgerufen werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-31\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import gettext\n\n<span class=\"hljs-comment\"># Initialisierung<\/span>\nlang_en = gettext.translation(<span class=\"hljs-string\">'messages'<\/span>, localedir=<span class=\"hljs-string\">'data'<\/span>, languages=&#91;<span class=\"hljs-string\">'en'<\/span>])\n\n<span class=\"hljs-comment\"># aktuelle Sprache auf en setzen<\/span>\nlang_en.install(names=&#91;<span class=\"hljs-string\">'gettext'<\/span>, <span class=\"hljs-string\">'ngettext'<\/span>])\n\n<span class=\"hljs-keyword\">print<\/span>(ngettext(<span class=\"hljs-string\">'ans-age'<\/span>, <span class=\"hljs-string\">'ans-age-plural'<\/span>, age).format(count=<span class=\"hljs-number\">1<\/span>))\n<span class=\"hljs-comment\"># Du bist 1 Jahr alt<\/span>\n\n<span class=\"hljs-keyword\">print<\/span>(ngettext(<span class=\"hljs-string\">'ans-age'<\/span>, <span class=\"hljs-string\">'ans-age-plural'<\/span>, age).format(count=<span class=\"hljs-number\">12<\/span>))\n<span class=\"hljs-comment\"># Du bist 12 Jahre alt<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-31\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-einsatz-von-gettext-in-der-anwendung\"><span class=\"ez-toc-section\" id=\"einsatz-von-gettext-in-der-anwendung\"><\/span>Einsatz von gettext in der Anwendung<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Anstatt jede Locale einzeln zu laden, k\u00f6nnen die \u00dcbersetzungsdateien dynamisch geladen und in einem <code>dict<\/code> Objekt wie folgt gespeichert werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-32\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import gettext\n\ntranslations = {}\nsupported_langs = &#91;<span class=\"hljs-string\">'en'<\/span>, <span class=\"hljs-string\">'de'<\/span>]\n\n<span class=\"hljs-comment\"># \u00dcbersetzungsdateien dynamisch laden<\/span>\n<span class=\"hljs-keyword\">for<\/span> lang in supported_langs:\n    translations&#91;lang] = gettext.translation(<span class=\"hljs-string\">'messages'<\/span>, localedir=<span class=\"hljs-string\">'data'<\/span>, languages=&#91;lang])<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-32\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Einfach die gew\u00fcnschte Locale festlegen und entweder die Funktionen  <code>_<\/code> oder <code>ngettext<\/code> aufrufen, um die gew\u00fcnschten \u00dcbersetzungstexte abzurufen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-33\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import gettext\n\ntranslations = {}\nsupported_langs = &#91;<span class=\"hljs-string\">'en'<\/span>, <span class=\"hljs-string\">'de'<\/span>]\n\n<span class=\"hljs-comment\"># \u00dcbersetzungsdateien dynamisch laden<\/span>\n<span class=\"hljs-keyword\">for<\/span> lang in supported_langs:\n    translations&#91;lang] = gettext.translation(<span class=\"hljs-string\">'messages'<\/span>, localedir=<span class=\"hljs-string\">'data'<\/span>, languages=&#91;lang])\n\n<span class=\"hljs-comment\"># aktive Sprache auf en einstellen<\/span>\ntranslations&#91;<span class=\"hljs-string\">'en'<\/span>].install(names=&#91;<span class=\"hljs-string\">'gettext'<\/span>, <span class=\"hljs-string\">'ngettext'<\/span>])\n\nname = <span class=\"hljs-string\">'John Doe'<\/span>\n<span class=\"hljs-keyword\">print<\/span>(_(<span class=\"hljs-string\">'ans-name'<\/span>).format(name=name))\n<span class=\"hljs-comment\"># Hallo John Doe! Willkommen bei Phrase<\/span>\n\n<span class=\"hljs-comment\"># Die aktive Locale auf de \u00e4ndern<\/span>\ntranslations&#91;<span class=\"hljs-string\">'de'<\/span>].install(names=&#91;<span class=\"hljs-string\">'gettext'<\/span>, <span class=\"hljs-string\">'ngettext'<\/span>])\n<span class=\"hljs-keyword\">print<\/span>(_(<span class=\"hljs-string\">'ans-name'<\/span>).format(name=name))\n<span class=\"hljs-comment\"># Hallo John Doe! Willkommen bei Phrase<\/span>\n\nage = <span class=\"hljs-number\">30<\/span>\ntext = ngettext(<span class=\"hljs-string\">'ans-age'<\/span>, <span class=\"hljs-string\">'ans-age-plural'<\/span>, age)\n<span class=\"hljs-keyword\">print<\/span>(text)\n<span class=\"hljs-comment\"># Du bist 30 Jahre alt<\/span>\n\ntext = text.format(count=age)\n<span class=\"hljs-keyword\">print<\/span>(text)\n<span class=\"hljs-comment\"># Du bist 30 Jahre alt <\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-33\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Dann einfach die Datei wie gewohnt ausf\u00fchren, und es sollte die gleiche Ausgabe wie zuvor mit JSON oder YAML erscheinen.<\/p>\n\n\n\n<p>\ud83e\udd3f <em>Mehr erfahren \u00bb<\/em> Schau dir unseren Leitfaden zum \u00dcbersetzen von Python-Anwendungen mit dem GNU gettext-Modul an, um mehr \u00fcber das <code>gettext<\/code> Modul zu erfahren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-wie-kann-eine-python-app-unterstutzung-fur-sprachen-von-rechts-nach-links-bieten\"><span class=\"ez-toc-section\" id=\"wie-kann-eine-python-app-unterstuetzung-fuer-sprachen-von-rechts-nach-links-bieten\"><\/span>Wie kann eine Python-App Unterst\u00fctzung f\u00fcr Sprachen von rechts nach links bieten?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Python wird nicht mit einer sofort einsatzbereiten Implementierung zum Anzeigen von Text f\u00fcr Sprachen von rechts nach links geliefert. Aber f\u00fcr solche Anwendungsf\u00e4lle kann das <code>python-bidi<\/code> Modul genutzt werden. <code>python-bidi<\/code> ist eine Python-Umsetzung eines bidirektionalen (BiDi) Layouts. Es stellt eine praktische Funktion zur Verf\u00fcgung, um Sprachen von rechts nach links darzustellen. Das Modul wird mit dem folgenden Befehl installiert:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">pip install python-bidi<\/code><\/span><\/pre>\n\n\n<p>Mit der Funktion <code>get_display<\/code> kann ein String bidirektional angezeigt werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-34\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">from<\/span> bidi.algorithm <span class=\"hljs-keyword\">import<\/span> get_display\n\nget_display(<span class=\"hljs-string\">'\u0627\u064e\u0644\u0652\u0639\u064e\u0631\u064e\u0628\u0650\u064a\u064e\u0651\u0629\u064f'<\/span>)<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-34\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>\u0627\u064e\u0644\u0652\u0639\u064e\u0631\u064e\u0628\u0650\u064a\u064e\u0651\u0629\u064f<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-do-i-format-localized-dates-and-times-in-python\"><span class=\"ez-toc-section\" id=\"how-do-i-format-localized-dates-and-times-in-python\"><\/span>How do I format localized dates and times in Python?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Python has its own built-in <code>datetime<\/code> module for manipulating dates and times. It supports arithmetic operations on objects, making it extremely useful for localization and internationalization.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-how-do-i-work-with-date-and-time-duration\"><span class=\"ez-toc-section\" id=\"how-do-i-work-with-date-and-time-duration\"><\/span>How do I work with date and time duration?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>A <code>timedelta<\/code> object represents the difference between 2 dates or times. You can think of it as a duration. It accepts the following input arguments:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">datetime.timedelta(milliseconds=0, microseconds=0, seconds=0, minutes=0, hours=0, days=0, weeks=0)<\/code><\/span><\/pre>\n\n\n<p>Ein neues <code>timedelta<\/code> l\u00e4sst sich wie folgt erstellen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-35\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from datetime import timedelta\n\ndelta = timedelta(\n    seconds=<span class=\"hljs-number\">27<\/span>,\n    minutes=<span class=\"hljs-number\">5<\/span>,\n    hours=<span class=\"hljs-number\">8<\/span>,\n    days=<span class=\"hljs-number\">50<\/span>,\n    weeks=<span class=\"hljs-number\">2<\/span>\n)\n\n<span class=\"hljs-comment\"># 64 Tage, 8:05:27<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-35\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-36\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from datetime import datetime, timedelta, timezone\n\n<span class=\"hljs-comment\"># naive datetime-Obj<\/span>\ndt = datetime.now()\n<span class=\"hljs-comment\"># 2022-06-12 15:48:40.014838<\/span>\n\n<span class=\"hljs-comment\"># Aware-Datetime-Objekt (GMT+8)<\/span>\ntz = timezone(timedelta(hours=<span class=\"hljs-number\">8<\/span>))\ndt = datetime.now(tz=tz)\n<span class=\"hljs-comment\"># 2022-06-12 15:48:40.014838+08:00<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-36\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ein <code>datetime<\/code>-Objekt unterst\u00fctzt die folgenden Methoden zur Konvertierung von Datum und Uhrzeit:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>strftime<\/code>: ein <code>datetime<\/code>-Objekt gem\u00e4\u00df einem gegebenen Format in eine Zeichenfolge umwandeln<\/li>\n\n\n\n<li><code>strptime<\/code>: eine Zeichenfolge gem\u00e4\u00df einem entsprechenden Format in ein <code>datetime<\/code>-Objekt parsen<\/li>\n<\/ul>\n\n\n\n<p>Die <code>strftime<\/code>-Funktion akzeptiert eine Zeichenfolge, die das entsprechende Datums- und Uhrzeitformat angibt. Das ist praktisch, wenn der Inhalt einer Anwendung lokalisiert wird.<\/p>\n\n\n\n<p>\ud83e\udd3f <em>Mehr erfahren \u00bb<\/em> In der <a href=\"https:\/\/docs.python.org\/3\/library\/datetime.html#strftime-and-strptime-behavior\">strftime und strptime<\/a>-Dokumentation finden sich genauere Informationen.<\/p>\n\n\n\n<p>Der folgende Code zeigt unterschiedliche String-Ausgaben je nach Eingabeformat-String an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-37\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from datetime import datetime, timezone\n\ndt = datetime(year=<span class=\"hljs-number\">2022<\/span>, month=<span class=\"hljs-number\">6<\/span>, day=<span class=\"hljs-number\">12<\/span>, hour=<span class=\"hljs-number\">16<\/span>, minute=<span class=\"hljs-number\">32<\/span>, second=<span class=\"hljs-number\">45<\/span>, tzinfo=timezone.utc)\n\ndt.strftime(<span class=\"hljs-string\">'%Y-%m-%d %H:%M:%S'<\/span>)\n<span class=\"hljs-comment\"># 2022-06-12 16:32:45<\/span>\n\ndt.strftime(<span class=\"hljs-string\">'%b %d, %Y'<\/span>)\n<span class=\"hljs-comment\"># 12. Jun 2022<\/span>\n\ndt.strftime(<span class=\"hljs-string\">'%A (%I.%M %p)'<\/span>)\n<span class=\"hljs-comment\"># Sonntag (16:32 Uhr)<\/span>\n\ndt.strftime(<span class=\"hljs-string\">'%c'<\/span>)\n<span class=\"hljs-comment\"># So 12. Juni 16:32:45 2022<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-37\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Das Format ist abh\u00e4ngig von der aktuellen Spracheinstellung der Anwendung. Mit dem eingebauten <code>locale<\/code> Modul l\u00e4sst sich das \u00e4ndern.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-38\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import locale\n\n<span class=\"hljs-comment\"># aktuelle Spracheinstellung abrufen<\/span>\nlocale.getlocale()\n<span class=\"hljs-comment\"># ('English_Singapur', '1252')<\/span>\n\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># ('de_DE', 'ISO8859-1')<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-38\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-39\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from datetime import datetime, timezone\nimport locale\n\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'de_DE'<\/span>)\n\ndt = datetime(year=<span class=\"hljs-number\">2022<\/span>, month=<span class=\"hljs-number\">6<\/span>, day=<span class=\"hljs-number\">12<\/span>, hour=<span class=\"hljs-number\">16<\/span>, minute=<span class=\"hljs-number\">32<\/span>, second=<span class=\"hljs-number\">45<\/span>, tzinfo=timezone.utc)\n\ndt.strftime(<span class=\"hljs-string\">'%Y-%m-%d %H:%M:%S'<\/span>)\n<span class=\"hljs-comment\"># 2022-06-12 16:32:45<\/span>\n\ndt.strftime(<span class=\"hljs-string\">'%b %d, %Y'<\/span>)\n<span class=\"hljs-comment\"># 12. Jun 2022<\/span>\n\ndt.strftime(<span class=\"hljs-string\">'%A (%I.%M %p)'<\/span>)\n<span class=\"hljs-comment\"># Sonntag (04.32 )<\/span>\n\ndt.strftime(<span class=\"hljs-string\">'%c'<\/span>)\n<span class=\"hljs-comment\"># 12.06.2022 16:32:45<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-39\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Auf der anderen Seite akzeptiert die <code>strptime<\/code>-Funktion zwei Eingabeargumente:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>date_string<\/code>: eine Zeichenfolgen-Darstellung eines Datums, basierend auf dem <a href=\"https:\/\/docs.python.org\/3\/library\/datetime.html#strftime-and-strptime-format-codes\">1989 C Standard<\/a>.<\/li>\n\n\n\n<li><code>format<\/code>: das Format, um die Eingabe <code>date_string<\/code> zu parsen<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\uddd2 <em>Hinweis \u00bb<\/em> Beim Einlesen der Eingabe ber\u00fccksichtigt die <code>strptime<\/code>-Funktion die aktuelle Locale.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-40\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from datetime import datetime\n\ntext = <span class=\"hljs-string\">'2022-06-12 16:32:45'<\/span>\nformat = <span class=\"hljs-string\">'%Y-%m-%d %H:%M:%S'<\/span>\n\ndatetime.strptime(text, format)\n<span class=\"hljs-comment\"># 2022-06-12 16:32:45<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-40\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-hier-wird-erklart-wie-sich-lokalisierte-datumsangaben-mit-babel-formatieren-lassen\"><span class=\"ez-toc-section\" id=\"hier-wird-erklaert-wie-sich-lokalisierte-datumsangaben-mit-babel-formatieren-lassen\"><\/span>Hier wird erkl\u00e4rt, wie sich lokalisierte Datumsangaben mit Babel formatieren lassen.<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Alternativ kann das Modul <code>babel.dates<\/code> zur Formatierung von Datum und Uhrzeit genutzt werden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-eine-anmerkung-zu-babel\">Eine Anmerkung zu Babel<\/h4>\n\n\n\n<p>Das <code>babel<\/code>-Modul bietet eine Reihe von Hilfsmitteln f\u00fcr l10n und i18n in Python. Es wird aktiv gepflegt und bietet folgende Funktionen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Datums- und Zeitformatierung<\/li>\n\n\n\n<li>Zahlenformatierung<\/li>\n\n\n\n<li>W\u00e4hrungsformatierung<\/li>\n\n\n\n<li>Nachrichtenkataloge (\u00dcbersetzungsdateien) erstellen<\/li>\n<\/ul>\n\n\n\n<p>Okay, zur\u00fcck zur Datumsformatierung. <code>babel.dates<\/code> bietet die folgenden Funktionen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>format_time<\/li>\n\n\n\n<li>format_date<\/li>\n\n\n\n<li>format_datetime<\/li>\n<\/ul>\n\n\n\n<p>Dieser Code zeigt, wie sich die Formatierungsfunktionen von Babel nutzen lassen<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-41\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from datetime import datetime, timezone\nfrom babel.dates import format_time, format_date, format_datetime\n\ndt = datetime(year=<span class=\"hljs-number\">2022<\/span>, month=<span class=\"hljs-number\">6<\/span>, day=<span class=\"hljs-number\">12<\/span>, hour=<span class=\"hljs-number\">16<\/span>, minute=<span class=\"hljs-number\">32<\/span>, second=<span class=\"hljs-number\">45<\/span>, tzinfo=timezone.utc)\n\n<span class=\"hljs-comment\"># Nutzung des Standard-Medium-Formats<\/span>\nformat_time(dt, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># 16:32:45 Uhr<\/span>\n\nformat_date(dt, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># 12. Jun 2022<\/span>\n\nformat_datetime(dt, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># 12. Juni 2022, 16:32:45<\/span>\n\n<span class=\"hljs-comment\"># Verwendung des vollst\u00e4ndigen Formats<\/span>\nformat_time(dt, format=<span class=\"hljs-string\">'full'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># 16:32:45 Uhr Koordinierte Weltzeit<\/span>\n\nformat_date(dt, format=<span class=\"hljs-string\">'full'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># Sonntag, 12. Juni 2022<\/span>\n\nformat_datetime(dt, format=<span class=\"hljs-string\">'full'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># Sonntag, 12. Juni 2022 um 16:32:45 Uhr Koordinierte Weltzeit<\/span>\n\n<span class=\"hljs-comment\"># Verwendung der deutschen Locale<\/span>\nformat_time(dt, format=<span class=\"hljs-string\">'full'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># 16:32:45 Koordinierte Weltzeit<\/span>\n\nformat_date(dt, format=<span class=\"hljs-string\">'full'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># Sonntag, der 12. Juni 2022<\/span>\n\nformat_datetime(dt, format=<span class=\"hljs-string\">'full'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># Sonntag, der 12. Juni 2022 um 16:32:45 Koordinierte Weltzeit<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-41\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Das <code>format<\/code>-Argument ist optional und kann eine der folgenden Optionen sein:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Kurz<\/li>\n\n\n\n<li>Mittel (der Standardwert)<\/li>\n\n\n\n<li>Lang<\/li>\n\n\n\n<li>Komplett<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\uddd2 <em>Hinweis \u00bb<\/em> Das endg\u00fcltige Ergebnis h\u00e4ngt vom Eingabeargument <code>locale<\/code> ab.<\/p>\n\n\n\n<p>\ud83e\udd3f <em>Mehr erfahren \u00bb<\/em> In der Dokumentation zu den <a href=\"https:\/\/babel.pocoo.org\/en\/latest\/dates.html#date-fields\">babel.dates-Feldern<\/a> gibt es mehr Informationen \u00fcber individuelle Muster.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"h-wie-lasst-sich-babel-fur-den-umgang-mit-zeitzonen-nutzen\">Wie l\u00e4sst sich Babel f\u00fcr den Umgang mit Zeitzonen nutzen?<\/h4>\n\n\n\n<p>Mit der <code>get_timezone<\/code> Funktion l\u00e4sst sich ein neues Zeitzonenobjekt erstellen, das auf Zeitzonennamen wie <code>US\/Eastern<\/code> oder <code>Europe\/Berlin<\/code> basiert. Dann wird das Objekt als Eingabe f\u00fcr das <code>tzinfo<\/code>-Argument \u00fcbergeben:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-42\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from datetime import datetime, timezone\nfrom babel.dates import get_timezone, format_datetime\n\ndt = datetime(year=<span class=\"hljs-number\">2022<\/span>, month=<span class=\"hljs-number\">6<\/span>, day=<span class=\"hljs-number\">12<\/span>, hour=<span class=\"hljs-number\">16<\/span>, minute=<span class=\"hljs-number\">32<\/span>, second=<span class=\"hljs-number\">45<\/span>, tzinfo=timezone.utc)\n\neastern = get_timezone(<span class=\"hljs-string\">'US\/Eastern'<\/span>)\nberlin = get_timezone(<span class=\"hljs-string\">'Europe\/Berlin'<\/span>)\n\n<span class=\"hljs-comment\"># Verwendung der Eastern Time Zone<\/span>\nformat_datetime(dt, format=<span class=\"hljs-string\">'full'<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>, tzinfo=eastern)\n<span class=\"hljs-comment\"># Sonntag, 12. Juni 2022 um 12:32:45 PM Eastern Daylight Time<\/span>\n\n<span class=\"hljs-comment\"># Verwendung der Berliner Zeitzone<\/span>\nformat_datetime(dt, format=format, locale=<span class=\"hljs-string\">'en_US'<\/span>, tzinfo=berlin)\n<span class=\"hljs-comment\"># Sonntag, 12. Juni 2022 um 18:32:45 Uhr Mitteleurop\u00e4ische Sommerzeit<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-42\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-lokalisierte-zahlen-in-python-formatieren-so-geht-s\"><span class=\"ez-toc-section\" id=\"lokalisierte-zahlen-in-python-formatieren-%e2%80%93-so-gehts\"><\/span>Lokalisierte Zahlen in Python formatieren \u2013 so geht&#8217;s<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p>Die Zahlenformatierung kann bei der Internationalisierung knifflig sein. Zum Beispiel hat der Text <code>12,345<\/code> unterschiedliche Bedeutungen f\u00fcr amerikanisches Englisch (<code>en_US<\/code>) und Deutsch (<code>de_DE<\/code>). Das liegt haupts\u00e4chlich daran, dass in verschiedenen Sprachen unterschiedliche Symbole f\u00fcr Dezimalpunkte und Tausendertrennzeichen verwendet werden.<\/p>\n\n\n\n<p>\ud83e\udd3f <em>Mehr erfahren \u00bb <\/em>Unser umfassender Leitfaden zur <a href=\"https:\/\/phrase.com\/de\/blog\/posts\/number-localization\/\">Zahlenlokalisierung<\/a> deckt Gruppierungen, Trennzeichen, Zahlensysteme und mehr ab.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-das-locale-modul-zur-zahlenformatierung-verwenden-so-geht-s\"><span class=\"ez-toc-section\" id=\"das-locale-modul-zur-zahlenformatierung-verwenden-%e2%80%93-so-gehts\"><\/span>Das Locale-Modul zur Zahlenformatierung verwenden \u2013 so geht&#8217;s<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>F\u00fcr die Umwandlung von Zeichenfolgen in Ganzzahlen oder Flie\u00dfkommazahlen ist das Modul <code>locale<\/code> eine gute Option. Es verf\u00fcgt \u00fcber die folgende eingebaute Funktion:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>atoi<\/code>: Umwandlung einer Zeichenfolge in eine Ganzzahl unter Verwendung der aktuellen lokalen Zahlenkonventionen<\/li>\n\n\n\n<li><code>atof<\/code>: Ein String wird nach den aktuellen lokalen numerischen Konventionen in eine Flie\u00dfkommazahl umgewandelt<\/li>\n<\/ul>\n\n\n\n<p>Wenn <code>12,345<\/code> der Eingabestring ist, sehen die Ergebnisse von <code>atof<\/code> f\u00fcr beide Sprachen so aus:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-43\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import locale\n\n<span class=\"hljs-comment\"># Englisch<\/span>\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'en_US'<\/span>)\nlocale.atof(<span class=\"hljs-string\">'12,345'<\/span>)\n<span class=\"hljs-comment\"># 12345.0<\/span>\n\n<span class=\"hljs-comment\"># Deutsch<\/span>\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'de_DE'<\/span>)\nlocale.atof(<span class=\"hljs-string\">'12,345'<\/span>)\n<span class=\"hljs-comment\"># 12.345<\/span>\n\n<span class=\"hljs-comment\"># Englisch<\/span>\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'en_US'<\/span>)\nlocale.atof(<span class=\"hljs-string\">'12.345'<\/span>)\n<span class=\"hljs-comment\"># 12.345<\/span>\n\n<span class=\"hljs-comment\"># Deutsch<\/span>\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'de_DE'<\/span>)\nlocale.atof(<span class=\"hljs-string\">'12.345'<\/span>)\n<span class=\"hljs-comment\"># 12345.0<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-43\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Andererseits kann die Funktion <code>format_string<\/code> genutzt werden, um eine Zahl in eine lokalisierte Zeichenfolge zu konvertieren. Folgendes Eingabe-Argument wird akzeptiert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>format<\/code>: eine Zeichenfolge, die die <a href=\"https:\/\/docs.python.org\/3\/library\/string.html#format-specification-mini-language\">Format-Spezifikation<\/a> darstellt<\/li>\n\n\n\n<li><code>val<\/code>: eine Zahl<\/li>\n\n\n\n<li><code>Gruppierung<\/code>: ob die Gruppierung ber\u00fccksichtigt wird. Gruppierung bezieht sich auf eine Zahlenfolge, die angibt, an welchen relativen Positionen das Tausendertrennzeichen erwartet wird. Standardm\u00e4\u00dfig ist <code>False<\/code> eingestellt.<\/li>\n<\/ul>\n\n\n\n<p>Schau dir den folgenden Code-Ausschnitt an:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-44\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import locale\n\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'en_US'<\/span>)\nlocale.format_string(<span class=\"hljs-string\">'%10.2f'<\/span>, <span class=\"hljs-number\">123456.78<\/span>)\n<span class=\"hljs-comment\"># 123456.78<\/span>\n\nlocale.format_string(<span class=\"hljs-string\">'%10.2f'<\/span>, <span class=\"hljs-number\">123456.78<\/span>, grouping=<span class=\"hljs-keyword\">True<\/span>)\n<span class=\"hljs-comment\"># 123.456,78<\/span>\n\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'de_DE'<\/span>)\nlocale.format_string(<span class=\"hljs-string\">'%10.2f'<\/span>, <span class=\"hljs-number\">123456.78<\/span>)\n<span class=\"hljs-number\">123.456<\/span>,<span class=\"hljs-number\">78<\/span>\n\nlocale.format_string(<span class=\"hljs-string\">'%10.2f'<\/span>, <span class=\"hljs-number\">123456.78<\/span>, grouping=<span class=\"hljs-keyword\">True<\/span>)\n<span class=\"hljs-number\">123.456<\/span>,<span class=\"hljs-number\">78<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-44\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-lokalisierte-zahlen-mit-babel-formatieren-so-geht-s\"><span class=\"ez-toc-section\" id=\"lokalisierte-zahlen-mit-babel-formatieren-%e2%80%93-so-gehts\"><\/span>Lokalisierte Zahlen mit Babel formatieren \u2013 so geht&#8217;s<span class=\"ez-toc-section-end\"><\/span><\/h3>\n\n\n\n<p>Alternativ lassen sich die folgenden lokalspezifischen Formatierungsfunktionen aus dem <code>babel.numbers<\/code> Modul nutzen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>format_decimal<\/code>: formatiert eine gegebene Zahl, basierend auf dem Eingabe-Locale<\/li>\n\n\n\n<li><code>format_percent<\/code>: formatiert eine gegebene Zahl prozentual, basierend auf dem Eingabe-Locale<\/li>\n\n\n\n<li><code>format_scientific<\/code>: formatiert eine gegebene Zahl in wissenschaftlicher Notation, basierend auf dem Eingabe-Locale. <code>E<\/code> wird als Notation f\u00fcr die Zehnerpotenz verwendet<\/li>\n<\/ul>\n\n\n\n<p>Der folgende Code veranschaulicht die Ausgabe f\u00fcr <code>format_decimal<\/code> bei Verwendung verschiedener Gebietsschemas:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-45\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">from babel.numbers import format_decimal, format_percent, format_scientific\n\nformat_decimal(<span class=\"hljs-number\">12345<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># 12.345<\/span>\nformat_decimal(<span class=\"hljs-number\">12345.67<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># 12,345.67<\/span>\nformat_decimal(<span class=\"hljs-number\">12345<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># 12.345<\/span>\nformat_decimal(<span class=\"hljs-number\">12345.67<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># 12.345,67<\/span>\n\nformat_percent(<span class=\"hljs-number\">0.34<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># 34%<\/span>\nformat_percent(<span class=\"hljs-number\">0.34<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># 34 %<\/span>\n\nformat_scientific(<span class=\"hljs-number\">1234567<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># 1.234567E6<\/span>\nformat_scientific(<span class=\"hljs-number\">1234567<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-comment\"># 1,234567E6<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-45\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div id=\"acf\/text-block_62a14e5f3c3789f34e6a09db4d44637b\" class=\"pxblock pxblock--text alignfull spacing--default bg--white\">\n\n\t\n\t<div class=\"container\">\n\t\t<div class=\"wysiwyg animate-in\">\n\t\t\t\t\t<\/div>\n\t<\/div>\n<\/div>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-46\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import locale\nfrom babel.numbers import format_currency\n\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'en_US'<\/span>)\nlocale.currency(<span class=\"hljs-number\">1234.56<\/span>)\n<span class=\"hljs-comment\"># $1234.56<\/span>\nlocale.currency(<span class=\"hljs-number\">1234.56<\/span>, international=<span class=\"hljs-keyword\">True<\/span>)\n<span class=\"hljs-comment\"># USD1234.56<\/span>\n\nformat_currency(<span class=\"hljs-number\">1234.56<\/span>, <span class=\"hljs-string\">'USD'<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># $1,234.56<\/span>\n<span class=\"hljs-comment\"># die W\u00e4hrung auf EURO setzen<\/span>\nformat_currency(<span class=\"hljs-number\">1234.56<\/span>, <span class=\"hljs-string\">'EUR'<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># \u20ac1.234,56<\/span>\n<span class=\"hljs-comment\"># die W\u00e4hrung auf Japan YEN setzen<\/span>\nformat_currency(<span class=\"hljs-number\">1234.56<\/span>, <span class=\"hljs-string\">'JPY'<\/span>, locale=<span class=\"hljs-string\">'en_US'<\/span>)\n<span class=\"hljs-comment\"># JPY1.234,56<\/span>\n\n\n\nlocale.setlocale(locale.LC_ALL, <span class=\"hljs-string\">'de_DE'<\/span>)\nlocale.currency(<span class=\"hljs-number\">1234.56<\/span>)\n<span class=\"hljs-comment\"># 1234,56 \u20ac<\/span>\nlocale.currency(<span class=\"hljs-number\">1234.56<\/span>, international=<span class=\"hljs-keyword\">True<\/span>)\n<span class=\"hljs-comment\"># 1234,56 EUR<\/span>\n\nformat_currency(<span class=\"hljs-number\">1234.56<\/span>, <span class=\"hljs-string\">'USD'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-number\">1.234<\/span>,<span class=\"hljs-number\">56<\/span> $\nformat_currency(<span class=\"hljs-number\">1234.56<\/span>, <span class=\"hljs-string\">'EUR'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-number\">1.234<\/span>,<span class=\"hljs-number\">56<\/span> \u20ac\nformat_currency(<span class=\"hljs-number\">1234.56<\/span>, <span class=\"hljs-string\">'JPY'<\/span>, locale=<span class=\"hljs-string\">'de_DE'<\/span>)\n<span class=\"hljs-number\">1.234<\/span>,<span class=\"hljs-number\">56<\/span> JPY<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-46\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<div id=\"acf\/text-block_62a14e5f3c3789f34e6a09db4d44637b\" class=\"pxblock pxblock--text alignfull spacing--default bg--white\">\n\n\t\n\t<div class=\"container\">\n\t\t<div class=\"wysiwyg animate-in\">\n\t\t\t\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Mit dem Schritt-f\u00fcr-Schritt-Leitfaden zur Vorbereitung von Python-Apps f\u00fcr die Lokalisierung und den g\u00e4ngigen Modulen kann mehrsprachige Unterst\u00fctzung f\u00fcr eine globale Benutzerbasis implementiert werden.<\/p>\n","protected":false},"author":61,"featured_media":38665,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"post-refresh-updated","format":"standard","meta":{"_acf_changed":false,"_stopmodifiedupdate":false,"_modified_date":"","_searchwp_excluded":"","episode_type":"","audio_file":"","podmotor_file_id":"","podmotor_episode_id":"","cover_image":"","cover_image_id":"","duration":"","filesize":"","filesize_raw":"","date_recorded":"","explicit":"","block":"","itunes_episode_number":"","itunes_title":"","itunes_season_number":"","itunes_episode_type":"","footnotes":""},"categories":[46],"class_list":["post-109670","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-lokalisierung"],"acf":[],"_links":{"self":[{"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/posts\/109670","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/users\/61"}],"replies":[{"embeddable":true,"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/comments?post=109670"}],"version-history":[{"count":8,"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/posts\/109670\/revisions"}],"predecessor-version":[{"id":117439,"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/posts\/109670\/revisions\/117439"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/media\/38665"}],"wp:attachment":[{"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/media?parent=109670"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/phrase.com\/de\/wp-json\/wp\/v2\/categories?post=109670"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}