<<

Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional

107.3 Lokalisierung und Internationalisierung

http://creativecommons.org/licenses/by-nc-sa/3.0/de/Copyright (©) 2009 by .Peichl. Dieses Werk oder, Michael Inhalt ist Peichl, unter [email protected] Creative Commons-Lizenz lizenziert. Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional

107.3 Lokalisierung und Internationalisierung

Beschreibung: Kandidaten sollten in der Lage sein, ein System in einer anderen Sprache als Englisch zu lokalisieren. Dazu gehört auch ein Verständnis dafür, warum LANG= in Shellskripten nützlich ist

Die wichtigsten Wissensgebiete: ● Locale­Einstellungen ● Zeitzonen­Einstellungen

Die wichtigsten Dateien, Bezeichnungen und Anwendungen: ● /etc/timezone ● /etc/localtime ● /usr/share/zoneinfo ● /usr/bin/locale ● tzselect, tzconfig ● iconv ● UTF­8, ISO­8859, ASCII, Umgebungsvariablen: ● LC_* ● LC_ALL ● LANG

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Überblick Durch die weltweite Vernetzung, hat die Internationalisierung und Lokalisierung von Linux stark an Bedeutung gewonnen, insbesondere da Linux nun im Begriff ist, zunehmend als Desktop­System benutzt zu werden.

Internationalisierung und Lokalisierung werden wegen der Länge der beiden Wörter oft mit i18n und l10n abgekürzt. (Die Zahlen 18 und 10 entsprechen hier der Anzahl der weggelassenen Buchstaben in den englischen Wörtern ‘internationalization’ und ‘localization’).

Internationalisierung ist die Ausgestaltung eines Softwaresystems, so dass eine spätere Lokalisie­ rung möglich ist.

Lokalisierung« (engl. localization oder l10n) ist die Anpassung eines internationalisierten Systems an die Gepflogenheiten eines bestimmten Kulturkreises. Dazu gehörendie Sprache für die Benut­ zungsoberfläche und Meldungen des Systems, sowie die zu verarbeitenden Daten (die gegebenen­ falls besondere Schriften und Eingabemethoden benötigt), aber auch Aspekte wie standardisierte Schreibweisen für Datums­ und Zeitangaben, Geldbeträge, die Reihenfolge der Zeichen im Alphabet u..a.m.

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional

Zeichencodierungen Vorbedingung für die Internationalisierung und Lokalisierung von Programmen in fremden Spra­ chen (also „alles außer Englisch“) ist, dass das System den Zeichenvorrat der betreffenden Spra­ che anzeigen können muss.

● Der traditionelle Zeichencode für Computer war der ASCII (7­Bit­Code) oder „American Standard Code for Information Interchange“, für amerikanisches Englisch gedacht. (128 verschiedene Zeichen, Ziffern und Sonderzeichen sowie Steuerzeichen wie „Zeilenvorschub“, „Tabulator“ oder „Glocke“).

● In Deutschland war die Zeichencodierung DIN 66003 gebräuchlich, die im wesentlichen dem ASCII ent­ sprach, bis darauf, dass die eckigen und geschweiften Klammern, der vertikale Balken und der Rückstrich durch Umlaute, die Tilde durch das scharfe („ß“) und der Klammeraffe („@“) durch das Paragraphenzei­ chen ersetzt wurde. Das war für Texte annehmbar, aber nicht notwendigerweise für C­Programme.

● Die Masse internationaler Computeranwender brachte den Umstieg auf erweiterte Zeichensätze, die alle 256 möglichen Werte eines Bytes zur Zeichencodierung nutzten.

● Bedeutend ist hier der Standard ISO/IEC 8859, der Zeichencodierungen für viele verschiede­ ne Sprachen vorsieht. ISO/IEC 8859 besteht aus einer Anzahl von numerierten, separat ver­ öffentlichten Teilen, die auch als Standards angesehen werden können. Ziel: Informations­ austausch nicht elegante Typografie. Details zu den ISO­Standards kann man in der Manpage nachschlagen: $ man iso_8859­1

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional

Quelle: LinupFront, 2009

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Unicode und ISO 10646 (Universal Charcter Set)

● Bemühungen, alle Alphabete der Welt in einer gemeinsamen Zeichencodierung zusammenzufassen. (1,1 Millionen Codepunkte möglich!) ● Beide Standards wurden zuerst getrennt entwickelt, aber dann – nachdem die Softwarefirmen der Welt heftigst gegen die Komplexität von ISO 10646 gemeutert hatten – zusammengelegt. ● Heute standardisieren Unicode und ISO 10646 dieselben Zeichen mit denselben Zeichencodes. ● Unterschiede: a) ISO 10646 ist eine reine Zeichentabelle ist (im Prinzip ein erweitertes ISO 8859) ) Unicode enthält Regeln für Sortierung, Normalisierung und bidirektionales Schreiben (für Arabisch / Hebräisch).

ISO 10646 ist quasi eine „Untermenge“ von Unicode; bei Unicode haben Zeichen noch diverse Zusatzeigenschaften, die zum Beispiel beschreiben, wie sich Zeichen sich mit anderen kombi­ nieren lassen (im Arabischen hängt das Aussehen eines Zeichens davon ab, ob am Anfang, in der Mitte oder am Ende eines Worts steht).

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional ISO 10646 (2)

ISO 10646

● Buchstaben und Ziffern ● Zeichenvorrat (Ideogramme: etwa chinesische und japanische Zeichen) ● mathematische Zeichen u.v.a.m. ● Jedes Zeichen wird durch einen eindeutigen Namen und eine Ganzzahl, seinen Codepunkt, identifiziert. ● Codepunkte: Insgesamt stehen über 1,1 Millionen Codepunkte zur Verfügung, von denen praktisch nur die ersten 65.536 verwendet werden. Diese nennt man auch die basic multilingual plane oder BMP. ● Unicode­ bzw. ISO­ BMP 10646­Codepunkte notiert man in der Form U+0040, wobei die vier Ziffern eine hexadezimale Zahl darstellen.

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Unicode und UTF­8 Unicode stellt mit der Kodierung UTF­8 (Unicode Transformation Format) heute den Sta­ tus Quo dar. Dabei wird jedem Unicode­Zeichen eine speziell kodierte Bytekette von va­ riabler Länge zugeordnet. UTF­8 unterstützt bis zu vier Byte, auf die sich wie bei allen UTF­Formaten alle Unicode­Zeichen abbilden lassen. Unicode ist in 17 Ebenen (Planes) zu je 16 Bit definiert: (siehe auch: man 7 utf­8)

● Ebene 0: Basic Multilingual Plane (BMP), ist die wichtigste; sie enthält die Schriftzei­ chen aller lebenden Sprachen und der gebräuchlichen Sonderzeichen. ● Ebene 1: Supplementary Multilingual Plane (SMP) umfasst historische Schriftsysteme, sowie seltener verwendete Symbole, wie .B. Dominosteine. ● Ebene 2: Supplementary Ideographic Plane (SIP) umfasst CJKV­Schriftzeichen (CJKV=Chinesisch, Japanisch, Koreanisch, Vietnamesisch), die seltener benutzt werden ● Ebenen 3­13 sind noch nicht belegt ● Ebene 14: Special Purpose Plane (SSP )

Exkurs: UTF­16 Verwendung z.B. auf IBM­Mainframes. Es verwendet ein oder zwei 16­Bit­Wörter für die Dar­ stellung eines Codepoints. UTF­32 ist das einfachste UTF­Format: Es bildet jeden Codepoint der Ebene 0 (U+0000 bis U+FFFF) direkt (ohne variable Länge) ab. Es braucht aber für Texte, die auf dem lateini­ schen Alphabet basieren, etwa den vierfachen Speicherplatz.

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional iconv

Das Kommando iconv erlaubt die Konvertierung zwischen verschiedenen Zeichencodierungen. Im einfachsten Fall wandelt es den Inhalt einer auf der Kommandozeile benannten Datei von einer angegebenen Zeichencodierung in die aktuell gültige. Das Resultat landet auf der Stan­ dardausgabe:

$ iconv ­ (listet alle unterstützten Kodierungen auf) $ iconv ­ Quellkode ­ Zielkode Quelldatei ­ Zieldatei (konvertiert Quelldatei in Zieldatei) $ iconv ­f Quellkode ­t Zielkode Quelldatei(en) (mehrere Eingabedateien, Ergebnisse werden nacheinander auf der Standardausgabe ausgegeben)

● $ iconv ­f LATIN9 test.txt >test­utf8.txt ● Sie können auch die gewünschte Zielcodierung angeben: $ iconv ­f UTF­8 ­t LATIN9 test­utf8.txt >test­l9.txt ● Mit ­­output (oder ­o) können Sie eine Datei für die Ausgabe auswählen: $ iconv ­f LATIN9 ­o test­utf8.txt test.txt ● Ohne Eingabedateien liest iconv die Standardeingabe: $ grep bla test.txt | iconv ­f LATIN9 ­o grep.out

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Iconv (2)

Wenn iconv in seiner Eingabe auf ein Zeichen stößt, das es nicht in gültige Zeichen der gewünschten Ausgabecodierung übertragen kann, dann meldet es einen Fehler und bricht ab. Als Abhilfe können Sie an die Zielcodierung eines der Suffixe //TRANSLIT oder //IGNORE anhängen. Mit //IGNORE werden alle in der Zielcodie­ rung nicht vorhandenen Zeichen unter den Teppich gekehrt, während sie mit //TRANSLIT, wo möglich, durch ein oder mehrere ähnliche Zeichen approximiert werden:

$ echo xäöüy | iconv ­f UTF­8 ­t ASCII//IGNORE xy iconv: ungültige Eingabe­ Sequenz an der Stelle 9 $ echo xäöüy | iconv ­f UTF­8 ­t ASCII//TRANSLIT xaeoeuey

Option ­c unterdrückt ungültige Zeichen kommentarlos: $ echo xäöüy | iconv ­c ­f UTF­8 ­t ASCII xy

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Spracheneinstellung unter Linux Die Sprache des Linux­Systems wird bei der Installation ausgewählt und i... später nicht mehr geändert.

● Die „Systemsprache“ ist keine Eigenschaft des kompletten Systems, sondern sie bezieht sich jeweils nur auf eine „Sitzung“. Normalerweise wird Ihre Login­Shell oder Ihre Arbeit­ sumgebung mit einer bestimmten Spracheinstellung initialisiert, und alle Prozesse, die von dieser abstammen, „erben“ diese Einstellung. Es spricht also nichts dagegen, dass Sie das System mit einer deutschen Spracheinstellung verwenden, während gleichzeitig je­ mand über das Netz oder an einem anderen Bildschirm angemeldet ist, der eine englische oder französische Spracheinstellung benutzt. ● Maßgeblich für die Sprache einer Sitzung ist der Wert der Umgebungsvariablen LANG. Im einfachsten Fall besteht sie aus einem Sprachencode, gefolgt von einem Unterstrich, gefolgt von einem Ländercode ● de_DE (=Deutsch in Deutschland) ● de_AT (=Deutsch in Österreich) ● de_DE.ISO­8859­15 (=Deutsch in Deutschland ISO­Latin­9) ● de_AT.UTF­8 (=Deutsch in Österreich, basierend auf Unicode) ● de_DE@euro (=Deutsch in Deutschland, mit Euro (ISO Latin­9)

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Auswirkung der Spracheinstellung pem@pem-lx:$ for i in de_DE de_AT en_US; do LANG=$i.UTF-8 date +"% %X"; done 08.11.2009 12:38:28 2009-11-08 12:38:28 11/08/2009 12:38:28 PM

(%x und %X stehen bei „date“ für die Datums­ und Uhrzeitformate der jeweiligen Spracheinstellungen. Bei diesem Beispiel also DE, AT, US) Voraussetzung ist aber, dass die Sprachen überhaupt vorhanden sind!

Die Umgebungsvariable LANGUAGE ( = Unterschied zu LANG!) wird nur von Pro­ grammen beachtet, die die GNU­gettext­Infrastruktur verwenden, um ihre Meldungen in verschiedene Sprachen zu übersetzen (unter Linux die meisten). Der offensichtlichste Unterschied zwischen LANGUAGE und LANG ist, dass LANGUAGE es erlaubt, mehrere Sprachen aufzuzählen (durch Doppelpunkte ge­ trennt). Damit können Sie eine Präferenzliste angeben: LANGUAGE=de_DE.UTF­8:en_US.UTF­8:fr_FR.UTF­8 bedeutet „Deutsch, oder sonst Englisch, oder sonst Französisch“. Die erste Sprache, für die ein Programm Systemmeldungen mitbringt, gewinnt. LANGUAGE hat (für Programme, die GNU gettext benutzen) Vorrang gegenüber LANG.

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Lokalisierungseinstellungen (LANG)

● Tatsächlich beeinflusst der Wert von LANG nicht nur die Sprache, sondern die komplette „kulturelle Einstellung“ eines Linux­Systems. Dazu gehören außerdem die Formatierung von Datums­ und Zeitangaben. ● Manche Länder (USA oder UK) nutzen eine 12­Stunden­Zeit, während in Konti­ nentaleuropa eine 24­Stunden­Zeit üblich ist. ● Formatierung von Zahlen und Geldbeträgen: In Kontinentaleuropa verwenden wir ein Komma als Dezimaltrenner und Punkte, um die Lesbarkeit einer großen Zahl zu erhöhen: 299.792.458,0 In den USA dagegen ist es gerade umgekehrt: 299,792,458.0 ● Sortierreihenfolge von Zeichen. Schon in Deutschland gibt es zwei konkurrie­ rende Methoden gemäß DIN 5007: In Lexika werden Umlaute als äquivalent zu ihren „Basiszeichen“ angesehen (ein „ä“ wird also für Zwecke der Sortierung als „a“ interpretiert), während in Namenslisten, zum Beispiel Telefonbüchern, Um­ laute gemäß ihrer „Ersatzschreibweise“ sortiert werden („ä“ also wie „ae“). In beiden Fällen ist „ß“ äquivalent zu „“«. In Schweden dagegen stehen die Buchstaben „å“, „ä“ und „ö“ in dieser Reihenfolge am Ende des Alphabets (hinter „z“). In Großbritannien kommt „ä“ nach „a“ (also zwischen „az“ und „b“) usw. ●

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional locale $ locale LANG=de_DE.UTF­8 Voreinstellung, wird durch LC_* übergangen LC_CTYPE="de_DE.UTF­8" Zeichenklassifizierung und Groß/Kleinschreibung LC_NUMERIC="de_DE.UTF­8" Zahlendarstellung (nichtmonetär) LC_TIME="de_DE.UTF­8" Zeit­ und Datenformate LC_COLLATE="de_DE.UTF­8" Sortierreihenfolge LC_MONETARY="de_DE.UTF­8" Zahlendarstellung (monetär) LC_MESSAGES="de_DE.UTF­8" Sprache der Textausgaben eines Programms LC_PAPER="de_DE.UTF­8" Papierformat LC_NAME="de_DE.UTF­8" Namensformat LC_ADDRESS="de_DE.UTF­8" Adress­ und Ortsangaben LC_TELEPHONE="de_DE.UTF­8" Telefonnummern LC_MEASUREMENT="de_DE.UTF­8" Maßeinheiten LC_IDENTIFICATION="de_DE.UTF­8" Beschreibung der verwendeten Locale LC_ALL= Erzwingt die angegebene Locale für LC_*

Die Variable LANG wird man hier wohl am häufigsten benuzten: Sie bestimmt die Voreinstellung, falls die Variablen LC_* nicht gesetzt sind. Falls schon, so hat die Einstellungen der jeweiligen LC_­Variable Vorrang gegenüber LANG. Ist dage­ gen LC_ALL nicht leer, so hat diese Vorrang gegenüber allen anderen Einstellungen, mit anderen Worten: Es werden dann sowohl die Einstellungen von LANG als auch LC_* nicht mehr berücksichtigt. Der Wert der Variablen muss mit dem Verzeichnisnamen eines Unterverzeichnisses von /usr/lib/locale/ übereinstimmen.

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Locale (2) Das Kommando „locale ­a“ liefert eine Liste von Werten, die das aktuelle System für LANG und die LC_*­Variablen unterstützt: $ locale -a C de_AT.utf8 de_DE de_DE@euro de_DE.utf8 deutsch POSIX

Die magischen Werte C und POSIX (= äquivalent) beschreiben den fest eingebauten Standard, den Programme verwenden, wenn sie keine gültige andere Einstellung finden. Dies ist wichtig, wenn Sie mit Programmen wie „awk“ oder „cut ­d“ Felder in Bash­Scripts auswerten wollen. Vergleichen Sie zum Bei­ spiel die 4 unterschiedlichen Rsultate: $ LANG=de_DE.UTF-8 -l /bin/ls -rwxr-xr-x 1 root root 92312 4. Apr 2008 /bin/ls $ LANG=ja_JP.UTF-8 ls -l /bin/ls -rwxr-xr-x 1 root root 92312 2008-04-04 16:22 /bin/ls $ LANG=fi_FI.UTF-8 ls -l /bin/ls -rwxr-xr-x 1 root root 92312 4.4.2008 /bin/ls $ LANG=C ls -l /bin/ls -rwxr-xr-x 1 root root 92312 Apr 4 2008 /bin/ls

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Zeitzonen

● Die Zeitzone auf einem Linux­System gehört zu den vererbbaren Eigenschaften eines Prozesses.

● Der Linux­Kernel misst die Zeit in Sekunden seit dem 1.1.1970, 0 Uhr UTC, somit ist der Komplex „Zeitzone“ lediglich eine Frage der Formatierung dieser (inzwischen recht großen) Sekundenzahl.

● Ihr Projekt­Partner aus Sydney, der sich über das Internet auf Ihrem Rechner anmeldet siehr die australische Zeit, während Sie selbst natürlich ME(S)Z verwenden.

● Die Voreinstellung für die Zeitzone, die Sie bei der Installation des Systems machen, hin­ terlegt Linux in der Datei /etc/timezone:

● $ cat /etc/timezone Europe/Berlin

● Die gültigen Zeitzonen können Sie den Namen der Dateien unter /usr/share/zoneinfo entnehmen (Darin sind viele Verzeichnisse enthalten)

● Namen der Zeitzonen (Städte) sind die bevölkerungsreichsten Städte der jeweiligen Zone. (z.B. Schweiz = Zürich, nicht die Hauptstadt Bern).

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Lokalisierung der Systemzeit

● /etc/localtime ist eine Kopie der Binär­Datei unter /usr/share/zoneinfo, die die Um­ rechnungsroutinen für die Zeitzone enthält, die durch den Inhalt von /etc/timezone ge­ geben ist – zum Beispiel /usr/share/zoneinfo/Europe/Berlin.

● /usr/share/zoneinfo/ Dieses Verzeichnis enthält die Zeitumrechnungsroutinen (Winter­/Sommerzeit, Unterschied zur UTC) zu allen Zeitzonen der Welt existiert eine zu­ gehörige Datei, wie z.B. /usr/share/zoneinfo/Europe/Berlin für Deutschland.

● /etc/timezone: Diese Datei enthält den Namen der lokalen Zeitzone und hat wenig Aus­ wirkung auf das System; sie sollte trotzdem nicht von Hand editiert werden. Sie wird vor allem in Debian Linux genutzt.

● #dpkg­reconfigure tzdata Debian: Zeitzone setzen

● #tzconfig veraltet, jedoch für die LPI­Prüfung noch relevant

● $tzselect Menügeführte Auswahl der Timezone

● $ export TZ=America/New_York Für eine Shell und alle Programme, die darin ausgeführt werden andere Zeitzone setzen

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Zusammenfassung ● Internationalisierung ist die Ausgestaltung eines Softwaresystems, so dass eine spätere Lokalisierung möglich ist.

● Lokalisierung ist die Anpassung eines internationalisierten Systems an die Gepflogenheiten eines be­ stimmten Kulturkreises.

● Gängige Zeichencodierungen unter Linux sind ASCII, ISO 8859 und ISO 10646 bzw. Unicode.

● UCS­2, UTF­8 und UTF­16 sind Codierungsformen von ISO 10646/ Unicode

● Das Kommando iconv erlaubt die Umwandlung zwischen verschiedenen Zeichencodierungen.

● Die Sprache für einen Linux­Prozess können Sie über die Umgebungsvariable LANG einstellen.

● Die Umgebungsvariablen LC_* steuern zusammen mit LANG die Lokalisierung eines Linux­Prozes­ ses.

● Das Kommando locale gibt Ihnen Zugriff auf die Lokalisierungsinformationen.

● In Skripten sollten Sie LANG=C verwenden, um lokalisierungsspezifische Einflüsse auf das Verhalten von Standardkommandos auszuschließen.

● Die systemweite Zeitzone entnimmt Linux der Datei /etc/timezone.

● Pro Prozess könnte über die Umgebungsvariable TZ eine Zeitzone gesetzt werden

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Literatur

● Linupfront, 2009, grd2­de­manual­lfnp

● Wikipedia

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected] Auf dem Weg: Certified Linux 107 Administrative Aufgaben Professional Übungen

(1)Was erscheint als Ausgabe des Kommandos $ LANG=ja_JP.UTF­8 date +"%B %"

(2)Stellen Sie sich vor, Sie sind Börsenmakler und brauchen einen schnellen Überblick über die Zeit in Tokyo, Frankfurt und New York. Wie können Sie das mit Linux verwirklichen?

(3)locales erzeugen, unter Debian: Fügen Sie eine Sprche zum System hinzu und entfernen Sie sie später wieder (4)Lassen Sie sich die locales anzeigen

(5)Temoprär persönliche Zeitzone einstellen: (mit tzselect) Europe/London

http://creativecommons.org/licenses/by-nc-sa/3.0/de/, Michael Peichl, [email protected]