18.08.2025, 21:12
(Dieser Beitrag wurde zuletzt bearbeitet: 18.08.2025, 21:17 von Manfred Aabye.)
# Du arbeitest mit den **XML-Übersetzungsdateien im Viewer**, und willst `gettext()` **dazwischen schalten**, sodass die Übersetzung **zur Laufzeit** passiert, **ohne die Originaldaten zu verändern**
(Mit Zuhilfenahme von Github Copilot Pro)
Es wird zum Beispiel geladen:
```xml
```
Daraus muss das folgend mit gettext verändert werden, Beispiel Deutsch:
```xml
```
---
## ? Ziel im Kontext des Second Life Viewers
- Die Viewer-Engine lädt XML-Dateien (z. B. UI-Layouts, Kategorien, Inventargruppen etc.).
- Diese Dateien enthalten Strings wie `"people & body"` in `<string>`-Elementen.
- Du willst, dass **beim Zugriff auf diese Strings** automatisch `gettext()` verwendet wird.
- Die Übersetzung soll **nicht beim Laden**, sondern **beim Auslesen** passieren.
- Die Lösung muss **transparent** sein: Der Viewer-Code soll sich **nicht ändern müssen**.
---
## ✅ Lösung: Hook oder Wrapper für XML-Zugriff
In Second Life wird XML oft über die `LLXMLNodePtr` oder `LLSD`-Strukturen verarbeitet. Du kannst eine **Wrapper-Funktion oder Hook** einbauen, die:
1. Den Originalwert aus dem XML liest.
2. Prüft, ob er übersetzt werden soll (z. B. durch `<translatestring>` oder Schlüsselname).
3. `gettext()` aufruft.
4. Den übersetzten Wert zurückgibt.
---
## ? Beispiel: Wrapper-Funktion für LLSD oder LLXMLNode
Angenommen, du hast:
```cpp
```
Dann kannst du in der Viewer-Logik (z. B. beim UI-Parsing) statt:
```cpp
```
einfach:
```cpp
```
Oder du baust es direkt in die `LLXMLNode::getValue()`-Methode ein, wenn du Zugriff auf die Quelle hast.
---
## ? Sprachwechsel zur Laufzeit
Second Life unterstützt bereits Sprachumschaltung über die Locale. Du kannst also:
```cpp
```
Und alle `gettext()`-Aufrufe liefern automatisch die neue Sprache.
---
## ? Erweiterungsidee: Automatische Markierung
Wenn du `<translatestring>` verwenden willst, kannst du beim XML-Parsing gezielt danach suchen:
```cpp
```
Oder du baust eine generische Funktion:
```cpp
```
---
## ? Fazit
Du brauchst:
- Eine **Zwischenschicht**, die `gettext()` beim Zugriff auf XML-Werte aufruft.
- Optional: Markierung im XML (`<translatestring>`) oder Schlüsselprüfung (`Category`, `Label`, etc.).
- Keine Änderung der Originaldaten.
- Sprachwechsel über `setlocale()` und `bindtextdomain()` jederzeit möglich.
(Mit Zuhilfenahme von Github Copilot Pro)
Es wird zum Beispiel geladen:
```xml
Code:
<map>
<key>Name</key>
<string>people and body</string>
<key>Category</key>
<string>people & body</string>
</map>
Daraus muss das folgend mit gettext verändert werden, Beispiel Deutsch:
```xml
Code:
<map>
<key>Name</key>
<string>people and body</string>
<key>Category</key>
<string>Menschen & Körper</string>
</map>
---
## ? Ziel im Kontext des Second Life Viewers
- Die Viewer-Engine lädt XML-Dateien (z. B. UI-Layouts, Kategorien, Inventargruppen etc.).
- Diese Dateien enthalten Strings wie `"people & body"` in `<string>`-Elementen.
- Du willst, dass **beim Zugriff auf diese Strings** automatisch `gettext()` verwendet wird.
- Die Übersetzung soll **nicht beim Laden**, sondern **beim Auslesen** passieren.
- Die Lösung muss **transparent** sein: Der Viewer-Code soll sich **nicht ändern müssen**.
---
## ✅ Lösung: Hook oder Wrapper für XML-Zugriff
In Second Life wird XML oft über die `LLXMLNodePtr` oder `LLSD`-Strukturen verarbeitet. Du kannst eine **Wrapper-Funktion oder Hook** einbauen, die:
1. Den Originalwert aus dem XML liest.
2. Prüft, ob er übersetzt werden soll (z. B. durch `<translatestring>` oder Schlüsselname).
3. `gettext()` aufruft.
4. Den übersetzten Wert zurückgibt.
---
## ? Beispiel: Wrapper-Funktion für LLSD oder LLXMLNode
Angenommen, du hast:
```cpp
Code:
std::string getTranslatedString(const std::string& raw) {
return gettext(raw.c_str());
}
Dann kannst du in der Viewer-Logik (z. B. beim UI-Parsing) statt:
```cpp
Code:
std::string label = node->getValue();
einfach:
```cpp
Code:
std::string label = getTranslatedString(node->getValue());
Oder du baust es direkt in die `LLXMLNode::getValue()`-Methode ein, wenn du Zugriff auf die Quelle hast.
---
## ? Sprachwechsel zur Laufzeit
Second Life unterstützt bereits Sprachumschaltung über die Locale. Du kannst also:
```cpp
Code:
setlocale(LC_ALL, "de_DE.UTF-8");
bindtextdomain("secondlife", "/path/to/locale");
textdomain("secondlife");
Und alle `gettext()`-Aufrufe liefern automatisch die neue Sprache.
---
## ? Erweiterungsidee: Automatische Markierung
Wenn du `<translatestring>` verwenden willst, kannst du beim XML-Parsing gezielt danach suchen:
```cpp
Code:
if (node->getName() == "translatestring") {
std::string raw = node->getValue();
std::string translated = gettext(raw.c_str());
// Weiterverarbeiten
}
Oder du baust eine generische Funktion:
```cpp
Code:
std::string getLocalizedValue(LLXMLNodePtr node) {
if (shouldTranslate(node)) {
return gettext(node->getValue().c_str());
} else {
return node->getValue();
}
}
---
## ? Fazit
Du brauchst:
- Eine **Zwischenschicht**, die `gettext()` beim Zugriff auf XML-Werte aufruft.
- Optional: Markierung im XML (`<translatestring>`) oder Schlüsselprüfung (`Category`, `Label`, etc.).
- Keine Änderung der Originaldaten.
- Sprachwechsel über `setlocale()` und `bindtextdomain()` jederzeit möglich.
Ein Metaversum sind viele kleine Räume, die nahtlos aneinander passen,
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.
sowie direkt sichtbar und begehbar sind, als wäre es aus einem Guss.