TechSupport
Crownpeak employee
Crownpeak employee

Mögliche Fallstricke beim Ändern der Anzahl der Sprachen eines Projektes

Sprache hinzufügen

Folgendes sollte immer getan werden, nachdem eine Sprache hinzugefügt wurde:

  • in allen Datenbankschemata - für sprachabhängige Eingabekomponenten müssen entsprechende Spalten angelegt werden. Idealerweise sollten diese das Sprachkürzel als Erweiterung bekommen.
  • Das Mapping aller Tabellenvorlagen, die sprachabhängige Spalten enthalten, muss entsprechend auf diese neue Spalten angepasst werden.
  • Beim Anlegen der neuen Sprache wird man gefragt, ob diese in den Aufträgen aktiviert werden soll. Meistens beantwortet man diese Nachfrage mit Nein, da die neue Sprache noch keinen Inhalt hat. Später muss man dann daran denken, diese Einstellung für jede Generierungsaktion in den entsprechenden Aufträgen entsprechend vorzunehmen.
  • Alle Seiten der neuen Sprache sind nicht übersetzt. Dies ist auch korrekt, da Sie ja noch keinen Inhalt haben. Hier sollte die Einstellung für die Ersatzsprache geprüft werden, ob diese sinnvoll ist.
  • Alle sprachabhängigen Eingabekomponenten in der neuen Sprache sind leer. Wenn es sich dabei um Pflichtfelder handelt, werden diese jeden Speicherversuch (auch bei Änderungen in anderen Sprachen) verhindern, bis diese Pflichtfelder gefüllt sind. Die Regeln sollten gegebenenfalls angepasst werden, wenn dies nicht gewünscht ist.

Sprache löschen

Wenn eine Sprache aus einem Projekt entfernt wird, so sind deren Inhalte noch vorhanden, aber mit normalen Mitteln nicht erreichbar. jede Speicheroperation eines Knotens entfernt die nun nicht mehr benötigten Informationen aus diesem Knoten. Besondere Schritte sind somit nicht notwendig.Wenn die gespeicherten Daten komplett genutzt werden und in einen Kontext überführt werden, in dem die gelöschte Sprache noch vorhanden ist, kann dies aber zu Problemen führen. Dies ist beispielsweise der Fall, wenn Corporate Content, Content Transport, External Sync oder etwas Ähnliches genutzt wird und die gelöschte Sprache im Zielprojekt vorhanden ist. In solchen Fällen sollten folgende Anpassungen vorgenommen werden:

  • in allen Datenbankschemata - für sprachabhängige Eingabekomponenten bleiben die Spalten für die gelöschte Sprache erhalten. Die Spalten sollten entfernt werden und auch das Mapping entsprechender Eingabekomponenten in den Tabellenvorlagen sollte einmal neu gespeichert werden, um die alten Zuordnungen auch dort zu entfernen.
  • Alle Seiten und Absätze haben noch Inhalte der alten Sprache, bis diese das nächste Mal gespeichert werden. Diese Inhalte der gelöschten Sprache sollen entfernt werden (z.B. durch ein Neusetzen der Inhalte per Skript)
  • Der Haken für “Sprache vollständig übersetzt” oder zur Anzeige der Absätze bleibt für die gelöschte Sprache gespeichert, bis diese das nächste Mal in einer der noch vorhandenen Sprachen geändert und dadurch neu gespeichert werden. Diese Einstellungen sollten per Skript neu gesetzt werden.

Hier ein einfaches Skript, welches für alle Seiten und Absätze [Inhalte-Verwaltung und globale Inhalte] den Inhalt neu setzt und zusätzlich die entsprechenden Haken für die gelöschte Seite entfernt. Diese einfache Skript-Variante speichert die Seiten unter dem Namen des aktuellen Benutzers. Außerdem gibt es die Seiten nicht frei, auch wenn diese vorher freigegeben waren. Weiterhin entfernt es von allen Ordnern in der Struktur-Verwaltung die gesetzten Werte in der gelöschten Sprache.

Beispielskript: Dieses geht davon aus, dass niemand sonst im Projekt arbeitet. Weiterhin ändert es alle Seiten und setzt deren Daten neu (Bearbeiter ist derjenige, der das Skript ausführt). Alle Seiten sind danach als verändert markiert. Es werden nur die Inhalte-Verwaltung und globale Inhalte betrachtet. Bitte beachten Sie, dass es sich nur um eine Beispielimplementierung handelt, die nicht alle Fälle abdeckt.

import de.espirit.firstspirit.agency.StoreAgent;

import de.espirit.firstspirit.access.store.Store;

import de.espirit.firstspirit.access.store.pagestore.Page;

import de.espirit.firstspirit.access.store.pagestore.Section;

import de.espirit.firstspirit.access.store.globalstore.GCAPage;

import de.espirit.firstspirit.access.store.globalstore.GCASection;

import de.espirit.firstspirit.access.store.sitestore.PageRefFolder;

context.logInfo("script started");

ml = context.getProject().getMasterLanguage();

storeAgent = context.requestSpecialist(StoreAgent.TYPE);

pageStore = storeAgent.getStore(Store.Type.PAGESTORE);

pages = pageStore.getChildren(Page.class,true);

pageCounter = pages.iterator();

while (pageCounter.hasNext()) {

   page = pageCounter.next();

   try {

      page.setLock(true,true);

      fd = page.getFormData();

      page.setFormData(fd);

      if (page.isTranslated(ml)) {

         page.addTranslated(ml);

      } else {

         page.removeTranslated(ml);

      }

      sections = page.getChildren(Section.class,true);

      sectionCounter = sections.iterator();

      while (sectionCounter.hasNext()) {

         section = sectionCounter.next();

         if (!section.isReference()) {

            fd = section.getFormData();

            section.setFormData(fd);

         }

         //toDo exclude from output

      }

      page.save("removed deleted language",true);

   } catch (Exception e) {

      context.logError("Page " + page.getUid() + " (" + page.getId() + ") not corrected due to this exception",e);

   } finally {

      page.setLock(false,true);

   }

}

globalStore = storeAgent.getStore(Store.Type.GLOBALSTORE);

pages = globalStore.getChildren(GCAPage.class,true);

pageCounter = pages.iterator();

while (pageCounter.hasNext()) {

   page = pageCounter.next();

   try {

      page.setLock(true,true);

      fd = page.getFormData();

      page.setFormData(fd);

      if (page.isTranslated(ml)) {

         page.addTranslated(ml);

      } else {

         page.removeTranslated(ml);

      }

      sections = page.getChildren(GCASection.class,true);

      sectionCounter = sections.iterator();

      while (sectionCounter.hasNext()) {

         section = sectionCounter.next();

         if (!section.isReference()) {

            fd = section.getFormData();

            section.setFormData(fd);

         }

         //toDo exclude from output

      }

      page.save("removed deleted language",true);

   } catch (Exception e) {

      context.logError("Page " + page.getUid() + " (" + page.getId() + ") not corrected due to this exception",e);

   } finally {

      page.setLock(false,true);

   }

}

siteStore = storeAgent.getStore(Store.Type.SITESTORE);

pagereffolders = siteStore.getChildren(PageRefFolder.class,true);

pagereffolderCounter = pagereffolders.iterator();

while (pagereffolderCounter.hasNext()) {

   pagereffolder = pagereffolderCounter.next();

   try {

      pagereffolder.setLock(true,false);

      fd = pagereffolder.getFormData();

      pagereffolder.setFormData(fd);

      pagereffolder.save("removed deleted language",false);

   } catch (Exception e) {

      context.logError("PageRefFolder " + pagereffolder.getUid() + " (" + pagereffolder.getId() + ") not corrected due to this exception",e);

   } finally {

      pagereffolder.setLock(false,true);

   }

}

context.logInfo("script finished");

Labels (1)