Migrate from the Properties Plugin to Resource Bundles
To migrate from the Properties Plugin to Resource Bundles, you can use a Groovy updater script to convert your properties documents to a resource bundle.
-  
Create a resource bundle document in a folder of your choice.
 -  
Add the Groovy script below to the script registry.
 -  
Set the 'path' parameter to the absolute path of the resource bundle document your created, e.g. /content/documents/myproject/labels/labels.
 -  
Run the script! You might want to do a dry run first. Make sure you have no conflicting keys.
 -  
Check your resource bundle document. All properties from all your properties documents should have been added to the resource bundle.
 -  
You will still need to adapt your code to use the messages from the resource bundle instead of the properties documents.
 
package org.hippoecm.frontend.plugins.cms.dev.updater
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.jcr.Node;
import javax.jcr.NodeIterator;
import javax.jcr.RepositoryException;
import javax.jcr.query.Query;
import javax.jcr.query.QueryManager;
import javax.jcr.query.QueryResult;
 
import org.onehippo.repository.update.BaseNodeUpdateVisitor;
 
/**
 * Looks up all properties:properties documents, reads the properties in them,
 * and writes them to the specified resource bundle document.
 */
class PropertiesToResourceBundleConverter extends BaseNodeUpdateVisitor {
 
  public boolean doUpdate(Node node) {
    log.debug "Updating node ${node.path}"
 
    Map<String, Map<String, String>> labels = new HashMap<String, Map<String, String>>();
 
    QueryManager qm = node.getSession().getWorkspace().getQueryManager();
    Query query = qm.createQuery("/jcr:root/content//element(*,properties:properties)", Query.XPATH);
    QueryResult result = query.execute();
 
    NodeIterator propertyDocumentNodes = result.getNodes();
    while (propertyDocumentNodes.hasNext()) {
      Node propertyDocumentNode = propertyDocumentNodes.nextNode();
 
      log.debug "Processing properties document ${propertyDocumentNode.getPath()}";
 
      String lang = "en";
      if (propertyDocumentNode.hasProperty("hippotranslation:locale")) {
        String locale = propertyDocumentNode.getProperty("hippotranslation:locale").getString();
        if (locale != null && locale.startsWith("fr")  ) {
          lang = "fr";
        }
      }
 
      NodeIterator propertyNodes = propertyDocumentNode.getNodes("properties:property");
 
      while (propertyNodes.hasNext()) {
        Node propertyNode = propertyNodes.nextNode();
        if (propertyNode.hasProperty("properties:name") && propertyNode.hasProperty("properties:value")) {
          String name = propertyNode.getProperty("properties:name").getString();
          String value = propertyNode.getProperty("properties:value").getString();
 
          log.debug "Convert property ${name}=${value} (${lang})";
 
          if (!labels.containsKey(name)) {
            Map<String, String> values = new HashMap<String, String>();
            values.put(lang, value);
            labels.put(name, values);
          } else {
            if (labels.get(name) == null) {
              labels.put(name, new HashMap<String, String>());
            }
            Map<String, String> values = labels.get(name);
            if (!values.containsKey(lang)) {
              values.put(lang, value);
            } else {
              // error!
              log.debug "duplicate key detected ${lang}:${value}";
            }
          }
        }
      }
 
    }
 
    if (labels.size() > 0) {
 
      List<String> keys = new ArrayList<String>();
      List<String> messages = new ArrayList<String>();
      List<String> messages_fr = new ArrayList<String>();
 
      for (String key : labels.keySet()) {
        Map<String,String> values = labels.get(key);
        keys.add(key);
        for (String langKey : values.keySet()) {
            if ("en".equals(langKey)) {
                messages.add(values.get(langKey));
            } else if ("fr".equals(langKey)) {
                messages_fr.add(values.get(langKey));
            }
        }
 
        if (messages.size() < messages_fr.size()) {
          log.debug "Missing English label for ${key}, inserting empty label"
          messages.add("");
        } else if (messages_fr.size() < messages.size()) {
          log.debug "Missing French label for ${key}, inserting empty label"
          messages_fr.add("");
        }
      }
 
      log.debug "Number of keys: ${keys.size()}";
      log.debug "Number of English messages: ${messages.size()}";
      log.debug "Number of French messages: ${messages_fr.size()}";
 
      node.setProperty("resourcebundle:keys", (String[]) keys.toArray());
      node.setProperty("resourcebundle:messages", (String[]) messages.toArray());
      node.setProperty("resourcebundle:messages_fr", (String[]) messages_fr.toArray());
 
    }
 
    return false;
  }
 
  public boolean undoUpdate(Node node) {
      throw new UnsupportedOperationException("Updater does not implement undoUpdate method");
  }
}