Package org.olat.core.util.i18n.ui

Source Code of org.olat.core.util.i18n.ui.I18nConfigSubNewLangController

/**
* OLAT - Online Learning and Training<br>
* http://www.olat.org
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Copyright (c) since 2004 at Multimedia- & E-Learning Services (MELS),<br>
* University of Zurich, Switzerland.
* <p>
*/
package org.olat.core.util.i18n.ui;

import java.util.HashSet;
import java.util.Locale;
import java.util.Set;

import org.olat.core.commons.persistence.DB;
import org.olat.core.commons.persistence.DBFactory;
import org.olat.core.dispatcher.DispatcherAction;
import org.olat.core.gui.UserRequest;
import org.olat.core.gui.components.form.flexible.FormItem;
import org.olat.core.gui.components.form.flexible.FormItemContainer;
import org.olat.core.gui.components.form.flexible.FormItemDependencyRule;
import org.olat.core.gui.components.form.flexible.FormUIFactory;
import org.olat.core.gui.components.form.flexible.elements.FormLink;
import org.olat.core.gui.components.form.flexible.elements.TextElement;
import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
import org.olat.core.gui.components.form.flexible.impl.FormEvent;
import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
import org.olat.core.gui.components.form.flexible.impl.rules.FormItemDependencyRuleImpl;
import org.olat.core.gui.components.form.flexible.impl.rules.RulesFactory;
import org.olat.core.gui.components.link.Link;
import org.olat.core.gui.control.Controller;
import org.olat.core.gui.control.Event;
import org.olat.core.gui.control.WindowControl;
import org.olat.core.id.User;
import org.olat.core.logging.AssertException;
import org.olat.core.util.StringHelper;
import org.olat.core.util.Util;
import org.olat.core.util.i18n.I18nManager;
import org.olat.core.util.i18n.I18nModule;

/**
* Description:<br>
* This form allows the user to enter a new language key and create the language
* immediately. The form implements the user interface and calls the necessary
* manager code to create the language.
*
* <h3>Events fired by this controller</h3>
* <ul>
* <li>Event.CANCELLED_EVENT</li>
* </ul>
* When the user presses the save button, the system language preference of this
* user will be set to the new user and he will be logged out immediately.
* <P>
* Initial Date: 27.11.2008 <br>
*
* @author gnaegi
*/
class I18nConfigSubNewLangController extends FormBasicController {
  private TextElement newLanguage, newCountry, newVariant, newTranslatedInEnglish, newTranslatedInLanguage, newTranslator;
  private FormLink cancelButton;

  /**
   * Constructor for the new-language workflow
   *
   * @param ureq
   * @param control
   */
  protected I18nConfigSubNewLangController(UserRequest ureq, WindowControl control) {
    super(ureq, control, LAYOUT_DEFAULT);
    if (!I18nModule.isTransToolEnabled()) { throw new AssertException(
        "New languages can only be created when the translation tool is enabled and the translation tool source pathes are configured in the build.properties"); }
    initForm(ureq);
  }

  /**
   * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#initForm(org.olat.core.gui.components.form.flexible.FormItemContainer,
   *      org.olat.core.gui.control.Controller, org.olat.core.gui.UserRequest)
   */
  @Override
  protected void initForm(FormItemContainer formLayout, @SuppressWarnings("unused") Controller listener,
      @SuppressWarnings("unused") UserRequest ureq) {
    // New language elements:
    // A title, displayed in fieldset
    setFormTitle("configuration.management.create.title");
    String[] args = new String[] { "<a href='http://www.ics.uci.edu/pub/ietf/http/related/iso639.txt' class='b_link_extern' target='_blank'>ISO639</a>",
        "<a href='http://www.chemie.fu-berlin.de/diverse/doc/ISO_3166.html' class='b_link_extern' target='_blank'>ISO3166</a>" };
    setFormDescription("configuration.management.create.description", args);
    //
    // a) the language code
    newLanguage = uifactory.addTextElement("configuration.management.create.language", "configuration.management.create.language", 2, "",
        formLayout);
    newLanguage.setExampleKey("configuration.management.create.language.example", null);
    newLanguage.setMandatory(true);
    newLanguage.setRegexMatchCheck("[a-z]{2}", "configuration.management.create.language.error");
    newLanguage.setDisplaySize(2);
    newLanguage.addActionListener(this, FormEvent.ONCHANGE);
    // b) the country code
    newCountry = uifactory.addTextElement("configuration.management.create.country", "configuration.management.create.country", 2, "",
        formLayout);
    newCountry.setExampleKey("configuration.management.create.country.example", null);
    newCountry.setRegexMatchCheck("[A-Z]{0,2}", "configuration.management.create.country.error");
    newCountry.addActionListener(this, FormEvent.ONCHANGE);
    newCountry.setDisplaySize(2);
    newCountry.addActionListener(this, FormEvent.ONCHANGE);
    // c) the variant, only available when country code is filled out
    newVariant = uifactory.addTextElement("configuration.management.create.variant", "configuration.management.create.variant", 50, "",
        formLayout);
    newVariant.setExampleKey("configuration.management.create.variant.example", null);
    newVariant.setRegexMatchCheck("[A-Za-z0-9_]*", "configuration.management.create.variant.error");
    newVariant.setDisplaySize(10);
    // Rule1: hide variant when country is empty
    Set<FormItem> hideItems = new HashSet<FormItem>();
    RulesFactory.createHideRule(newCountry, "", hideItems, formLayout);
    hideItems.add(newVariant);
    // Rule 2: show variant when country is not empty
    FormItemDependencyRule showRule = new FormItemDependencyRuleImpl(newCountry, ".{2}", hideItems, FormItemDependencyRuleImpl.MAKE_VISIBLE) {
      @Override
      protected boolean doesTrigger() {
        TextElement te = (TextElement) this.triggerElement;
        String val = te.getValue();
        //
        if (val == null && triggerVal == null) {
          // triggerVal and val are NULL -> true
          return true;
        } else if (val != null) {
          // val can be compared
          String stringTriggerValString = (String) triggerVal;
          boolean matches = val.matches(stringTriggerValString);
          return matches;
        } else {
          // triggerVal is null but val is not null -> false
          return false;
        }
      }
    };
    formLayout.addDependencyRule(showRule);
    //
    // Language name and translator data
    newTranslatedInEnglish = uifactory.addTextElement("configuration.management.create.inEnglish", "configuration.management.create.inEnglish", 255,
        "", formLayout);
    newTranslatedInEnglish.setExampleKey("configuration.management.create.inEnglish.example", null);
    newTranslatedInEnglish.setMandatory(true);
    newTranslatedInEnglish.setNotEmptyCheck("configuration.management.create.inEnglish.error");
    newTranslatedInLanguage = uifactory.addTextElement("configuration.management.create.inYourLanguage", "configuration.management.create.inYourLanguage", 255,
        "", formLayout);
    newTranslatedInLanguage.setExampleKey("configuration.management.create.inYourLanguage.example", null);
    newTranslator = uifactory.addTextElement("configuration.management.create.translator", "configuration.management.create.translator", 255,
        "", formLayout);
    newTranslator.setExampleKey("configuration.management.create.translator.example", null);
    // Add warn message
    String warnPage = Util.getPackageVelocityRoot(this.getClass()) + "/i18nConfigurationNewWarnMessage.html";
    FormLayoutContainer logoutWarnMessage = FormLayoutContainer.createCustomFormLayout("logoutWarnMessage", getTranslator(), warnPage);
    formLayout.add(logoutWarnMessage);
    // Add cancel and submit in button group layout
    FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonGroupLayout", getTranslator());
    formLayout.add(buttonGroupLayout);
    cancelButton = uifactory.addFormLink("cancel", buttonGroupLayout, Link.BUTTON);
    uifactory.addFormSubmitButton("configuration.management.create", buttonGroupLayout);
  }

  /**
   * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formOK(org.olat.core.gui.UserRequest)
   */
  @Override
  protected void formOK(UserRequest ureq) {
    String localeKey = newLanguage.getValue().trim();
    if (!newCountry.isEmpty()) {
      localeKey += "_" + newCountry.getValue().trim();
      if (!newVariant.isEmpty()) {
        localeKey += "_" + newVariant.getValue().trim();
      }
    }
    String translatedInEnglish = newTranslatedInEnglish.getValue().trim();
    String translatedInLanguage = newTranslatedInLanguage.getValue().trim();
    String authors = newTranslator.getValue().trim();
    // Try creating the language
    boolean success = I18nManager.getInstance().createNewLanguage(localeKey, translatedInEnglish, translatedInLanguage, authors);
    if (success) {
      // wow, everything worked fine
      logAudit("Created new language::" + localeKey, null);
      // Since 6.2 workflow is that when creating a new language the users
      // language is changed to this new language and the user gets
      // redirect to the login screen.
      updateUserLocaleAndLogout(ureq, localeKey);
    } else {
      // language does already exist or another error
      showError("configuration.management.create.error.exists", localeKey);
    }
  }

  /**
   * Helper method to update the language in the user profile of the current
   * user to the given language and send the user to the page.
   *
   * @param ureq
   * @param localeKey
   */
  private void updateUserLocaleAndLogout(UserRequest ureq, String localeKey) {
    User currUser = ureq.getIdentity().getUser();
    // direct DB calls have to be made here because the
    // user manager is not available in the core
    DB db = DBFactory.getInstance();
    currUser = (User) db.loadObject(currUser);
    currUser.getPreferences().setLanguage(localeKey);
    db.saveObject(currUser);
    DispatcherAction.redirectToDefaultDispatcher(ureq.getHttpResp());
  }

  @Override
  protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
    super.formInnerEvent(ureq, source, event);
    if (source == cancelButton) {
      fireEvent(ureq, Event.CANCELLED_EVENT);
    } else if (source == newLanguage) {
      Locale testLoc = new Locale(newLanguage.getValue());
      // Check for valid language
      if (!testLoc.getLanguage().equals(newLanguage.getValue())) {
        newLanguage.setValue(testLoc.getLanguage());
      }
    } else if (source == newCountry) {
      String val = newCountry.getValue();
      if (StringHelper.containsNonWhitespace(val)) {
        // Check for valid language / country
        Locale testLoc = new Locale(newLanguage.getValue(), val);
        if (!testLoc.getLanguage().equals(newLanguage.getValue()) && testLoc.getCountry().equals(val)) {
          newLanguage.setValue(testLoc.getLanguage());
          newCountry.setValue(testLoc.getCountry());
        }
      } else {
        // Reset country and variant
        newCountry.setValue("");
        newVariant.setValue("");
      }
    }
    if (!newVariant.isEmpty() && newCountry.isEmpty()) {
      newCountry.setErrorKey("configuration.management.create.variant.error.noCountry", null);
    }
  }

  /**
   * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose()
   */
  @Override
  protected void doDispose() {
  // nothing to dispose
  }
}
TOP

Related Classes of org.olat.core.util.i18n.ui.I18nConfigSubNewLangController

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.