You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by sh...@apache.org on 2006/02/08 14:15:00 UTC

svn commit: r375955 - in /portals/jetspeed-2/trunk: applications/j2-admin/ applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/ applications/j2-admin/src/webapp/WEB-INF/ applications/j2-admin/src/webapp/WEB-INF/view/userreg/ applic...

Author: shinsuke
Date: Wed Feb  8 05:14:56 2006
New Revision: 375955

URL: http://svn.apache.org/viewcvs?rev=375955&view=rev
Log:
template fallback mechanism for email on User Registration and Forgotten Password portlet

Added:
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/forgottenPasswdEmail.vm
      - copied unchanged from r375113, portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/forgottenPasswdEmail.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/en/
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/en/forgottenPasswdEmail.vm
      - copied unchanged from r375113, portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/forgottenPasswdEmail_en.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/en/userRegistrationEmail.vm
      - copied unchanged from r375113, portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/userRegistrationEmail_en.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/forgottenPasswdEmail.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/userRegistrationEmail.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/userRegistrationEmail.vm
      - copied unchanged from r375113, portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/userRegistrationEmail.vm
Removed:
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/forgottenPasswdEmail.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/forgottenPasswdEmail_en.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/userRegistrationEmail.vm
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/userRegistrationEmail_en.vm
Modified:
    portals/jetspeed-2/trunk/applications/j2-admin/project.xml
    portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/ForgottenPasswordPortlet.java
    portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java
    portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml
    portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/portlet.xml

Modified: portals/jetspeed-2/trunk/applications/j2-admin/project.xml
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/applications/j2-admin/project.xml?rev=375955&r1=375954&r2=375955&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/project.xml (original)
+++ portals/jetspeed-2/trunk/applications/j2-admin/project.xml Wed Feb  8 05:14:56 2006
@@ -84,6 +84,14 @@
             <war.bundle>true</war.bundle>
         </properties>
     </dependency>
+    <dependency>
+        <id>org.apache.portals.jetspeed-2:jetspeed-locator</id> 
+        <version>${jetspeed.version}</version>
+        <type>jar</type>
+        <properties>
+            <war.bundle>true</war.bundle>
+        </properties>
+    </dependency>
 
     <!-- Portals Bridges -->
     <dependency>

Modified: portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/ForgottenPasswordPortlet.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/ForgottenPasswordPortlet.java?rev=375955&r1=375954&r2=375955&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/ForgottenPasswordPortlet.java (original)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/ForgottenPasswordPortlet.java Wed Feb  8 05:14:56 2006
@@ -15,7 +15,7 @@
  */
 package org.apache.jetspeed.portlets.registration;
 
-import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.security.Principal;
 import java.util.ArrayList;
@@ -40,8 +40,14 @@
 import javax.portlet.RenderResponse;
 
 import org.apache.jetspeed.CommonPortletServices;
+import org.apache.jetspeed.PortalReservedParameters;
 import org.apache.jetspeed.administration.AdministrationEmailException;
 import org.apache.jetspeed.administration.PortalAdministration;
+import org.apache.jetspeed.locator.JetspeedTemplateLocator;
+import org.apache.jetspeed.locator.LocatorDescriptor;
+import org.apache.jetspeed.locator.TemplateDescriptor;
+import org.apache.jetspeed.locator.TemplateLocatorException;
+import org.apache.jetspeed.request.RequestContext;
 import org.apache.jetspeed.security.PasswordCredential;
 import org.apache.jetspeed.security.SecurityException;
 import org.apache.jetspeed.security.User;
@@ -60,7 +66,6 @@
  */
 public class ForgottenPasswordPortlet extends AbstractVelocityMessagingPortlet
 {
-
     private PortalAdministration admin;
 
     private UserManager userManager;
@@ -90,13 +95,21 @@
 
     private static final String IP_RETURN_URL = "returnURL";
 
-    private static final String IP_TEMPLATE = "emailTemplate";
+    private static final String IP_TEMPLATE_LOCATION = "emailTemplateLocation";
+
+    private static final String IP_TEMPLATE_NAME = "emailTemplateName";
 
     // Resource Bundle
     private static final String RB_EMAIL_SUBJECT = "email.subject.forgotten.password";
 
+    private static final String PATH_SEPARATOR = "/";
+
     /** email template to use for merging */
-    private String template;
+    private String templateLocation;
+
+    private String templateName;
+
+    private JetspeedTemplateLocator templateLocator;
 
     /** servlet path of the return url to be printed and href'd in email template */
     private String returnUrlPath;
@@ -121,12 +134,31 @@
 
         this.returnUrlPath = config.getInitParameter(IP_RETURN_URL);
         this.redirectPath = config.getInitParameter(IP_REDIRECT_PATH);
-        this.template = config.getInitParameter(IP_TEMPLATE);
-        
-        List l = new ArrayList();
-        l.add(config.getInitParameter(IP_TEMPLATE));
-        String appRoot = "root";
+        this.templateLocation = config.getInitParameter(IP_TEMPLATE_LOCATION);
+        if (templateLocation == null)
+        {
+            templateLocation = "/WEB-INF/view/userreg/";
+        }
+        templateLocation = getPortletContext().getRealPath(templateLocation);
+        this.templateName = config.getInitParameter(IP_TEMPLATE_NAME);
+        if (templateName == null)
+        {
+            templateName = "forgottenPasswdEmail.vm";
+        }
         
+        ArrayList roots = new ArrayList(1);
+        roots.add(templateLocation);
+
+        try
+        {
+            templateLocator = new JetspeedTemplateLocator(roots, "email", getPortletContext().getRealPath("/"));
+            templateLocator.start();
+        }
+        catch (FileNotFoundException e)
+        {
+            throw new PortletException("Could not start the template locator.", e);
+        }
+
         
     }
 
@@ -267,44 +299,7 @@
             userAttributes.put(CTX_NEW_PASSWORD, newPassword);
             userAttributes.put(CTX_USER_NAME, userName);
 
-
-/*          this code is my first attempt to get things working with a template locator... it's not going to work given the way things are partitioned in the jetspeed
-
-            
-            TemplateLocator templateLocator;
-            
-            templateLocator = (TemplateLocator) Jetspeed.getComponentManager().getComponent("TemplateLocator");
-            
-            List l = new ArrayList();
-            String appRoot = "/WEB-INF/view/userreg/";
-            templateLocator = (TemplateLocator) getPortletContext().getAttribute("TemplateLocator");
-            
-            LocatorDescriptor ld = templateLocator.createLocatorDescriptor(null);
-            RequestContext requestContext = (RequestContext) request.getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
-    
-            CapabilityMap capabilityMap = requestContext.getCapabilityMap();
-            ld.setMediaType(capabilityMap.getPreferredMediaType().getName());
-            
-            //Locale locale = requestContext.getLocale();
-            ld.setCountry(locale.getCountry());
-            ld.setLanguage(locale.getLanguage());
-            
-            TemplateDescriptor td = templateLocator.locateTemplate( ld);
-            
-            this.template = td.getAbsolutePath();
-*/            
-            
-            String language = locale.getLanguage();
-            String templ = this.template;
-            int period = templ.lastIndexOf(".");
-            if (period > 0)
-            {
-                String fixedTempl = templ.substring(0, period) + "_" + language + "." + templ.substring(period + 1);
-                if (new File(getPortletContext().getRealPath(fixedTempl)).exists())
-                {
-                    templ = fixedTempl;
-                }
-            }
+            String templ = getTemplatePath(request, response);
             
             if (templ == null) 
             { 
@@ -415,6 +410,34 @@
         List errors = new LinkedList();
         errors.add(msg);
         return errors;
+    }
+    
+    protected String getTemplatePath(ActionRequest request, ActionResponse response)
+    {
+        if (templateLocator == null)
+        {
+            return templateLocation + PATH_SEPARATOR + templateName;
+        }
+
+        RequestContext requestContext = (RequestContext) request
+                .getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
+        Locale locale = request.getLocale();
+
+        try
+        {
+            LocatorDescriptor locator = templateLocator.createLocatorDescriptor("email");
+            locator.setName(templateName);
+            locator.setMediaType(requestContext.getMediaType());
+            locator.setLanguage(locale.getLanguage());
+            locator.setCountry(locale.getCountry());
+            TemplateDescriptor template = templateLocator.locateTemplate(locator);
+
+            return template.getAppRelativePath();
+        }
+        catch (TemplateLocatorException e)
+        {
+            return templateLocation + PATH_SEPARATOR + templateName;
+        }
     }
 
 }

Modified: portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java?rev=375955&r1=375954&r2=375955&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java (original)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/java/org/apache/jetspeed/portlets/registration/UserRegistrationPortlet.java Wed Feb  8 05:14:56 2006
@@ -16,6 +16,7 @@
 package org.apache.jetspeed.portlets.registration;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -38,8 +39,14 @@
 import javax.portlet.RenderResponse;
 
 import org.apache.jetspeed.CommonPortletServices;
+import org.apache.jetspeed.PortalReservedParameters;
 import org.apache.jetspeed.administration.AdministrationEmailException;
 import org.apache.jetspeed.administration.PortalAdministration;
+import org.apache.jetspeed.locator.JetspeedTemplateLocator;
+import org.apache.jetspeed.locator.LocatorDescriptor;
+import org.apache.jetspeed.locator.TemplateDescriptor;
+import org.apache.jetspeed.locator.TemplateLocatorException;
+import org.apache.jetspeed.request.RequestContext;
 import org.apache.jetspeed.security.SecurityException;
 import org.apache.jetspeed.security.User;
 import org.apache.jetspeed.security.UserManager;
@@ -77,7 +84,9 @@
 
     private static final String IP_GROUPS = "groups"; // comma separated
 
-    private static final String IP_EMAIL_TEMPLATE = "emailTemplate";
+    private static final String IP_TEMPLATE_LOCATION = "emailTemplateLocation";
+
+    private static final String IP_TEMPLATE_NAME = "emailTemplateName";
 
     private static final String IP_RULES_NAMES = "rulesNames";
 
@@ -112,10 +121,16 @@
 
     // Resource Bundle
     private static final String RB_EMAIL_SUBJECT = "email.subject.registration";
+    
+    private static final String PATH_SEPARATOR = "/";
 
     /** email template to use for merging */
-    private String emailTemplate;
+    private String templateLocation;
 
+    private String templateName;
+
+    private JetspeedTemplateLocator templateLocator;
+    
     /** localized emailSubject */
     private String emailSubject = null;
 
@@ -174,8 +189,31 @@
             rules.put(names.get(ix), values.get(ix));
         }
 
-        this.emailTemplate = config.getInitParameter(IP_EMAIL_TEMPLATE);
+        this.templateLocation = config.getInitParameter(IP_TEMPLATE_LOCATION);
+        if (templateLocation == null)
+        {
+            templateLocation = "/WEB-INF/view/userreg/";
+        }
+        templateLocation = getPortletContext().getRealPath(templateLocation);
+        this.templateName = config.getInitParameter(IP_TEMPLATE_NAME);
+        if (templateName == null)
+        {
+            templateName = "userRegistrationEmail.vm";
+        }
+        
+        ArrayList roots = new ArrayList(1);
+        roots.add(templateLocation);
 
+        try
+        {
+            templateLocator = new JetspeedTemplateLocator(roots, "email", getPortletContext().getRealPath("/"));
+            templateLocator.start();
+        }
+        catch (FileNotFoundException e)
+        {
+            throw new PortletException("Could not start the template locator.", e);
+        }
+        
         // user attributes ?
 
         this.optionForceEmailsToBeSystemUnique = Boolean.valueOf(
@@ -627,21 +665,7 @@
                 userInfo.put(CTX_RETURN_URL, generateReturnURL(actionRequest,
                         actionResponse, urlGUID));
 
-                Locale locale = actionRequest.getLocale();
-
-                String language = locale.getLanguage();
-                String templ = this.emailTemplate;
-                int period = templ.lastIndexOf(".");
-                if (period > 0)
-                {
-                    String fixedTempl = templ.substring(0, period) + "_"
-                            + language + "." + templ.substring(period + 1);
-                    if (new File(getPortletContext().getRealPath(fixedTempl))
-                            .exists())
-                    {
-                        this.emailTemplate = fixedTempl;
-                    }
-                }
+                String templ = getTemplatePath(actionRequest, actionResponse);
 
                 if (templ == null) { throw new Exception(
                         "email template not available"); }
@@ -730,5 +754,33 @@
     {
         return admin.getPortalURL(request, response, this.redirectPath);
     }
+ 
     
+    protected String getTemplatePath(ActionRequest request, ActionResponse response)
+    {
+        if (templateLocator == null)
+        {
+            return templateLocation + PATH_SEPARATOR + templateName;
+        }
+
+        RequestContext requestContext = (RequestContext) request
+                .getAttribute(PortalReservedParameters.REQUEST_CONTEXT_ATTRIBUTE);
+        Locale locale = request.getLocale();
+
+        try
+        {
+            LocatorDescriptor locator = templateLocator.createLocatorDescriptor("email");
+            locator.setName(templateName);
+            locator.setMediaType(requestContext.getMediaType());
+            locator.setLanguage(locale.getLanguage());
+            locator.setCountry(locale.getCountry());
+            TemplateDescriptor template = templateLocator.locateTemplate(locator);
+
+            return template.getAppRelativePath();
+        }
+        catch (TemplateLocatorException e)
+        {
+            return templateLocation + PATH_SEPARATOR + templateName;
+        }
+    }
 }

Modified: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml?rev=375955&r1=375954&r2=375955&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml (original)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/portlet.xml Wed Feb  8 05:14:56 2006
@@ -877,11 +877,16 @@
         <name>ViewPage</name>
             <value>/WEB-INF/view/userreg/forgottenPasswd.vm</value>
      </init-param>
-     <init-param>
-        <description>This parameter sets the template used to send the Email for Forgotten password</description>
-        <name>emailTemplate</name>
-            <value>/WEB-INF/view/userreg/forgottenPasswdEmail.vm</value>
-     </init-param>   
+     <init-param>
+        <description>This parameter sets the template used to send the Email for Forgotten password</description>
+        <name>emailTemplateLocation</name>
+            <value>/WEB-INF/view/userreg/</value>
+     </init-param>   
+     <init-param>
+        <description>This parameter sets the template used to send the Email for Forgotten password</description>
+        <name>emailTemplateName</name>
+            <value>forgottenPasswdEmail.vm</value>
+     </init-param>   
      <init-param>
         <description>This parameter sets the url to which folks will return after they receive an email</description>
         <name>returnURL</name>
@@ -977,10 +982,15 @@
 
       <init-param>
         <description>This is the template in which you setup an email to be sent after user exists</description>
-        <name>emailTemplate</name>
-            <value>/WEB-INF/view/userreg/userRegistrationEmail.vm</value>
+        <name>emailTemplateLocation</name>
+            <value>/WEB-INF/view/userreg/</value>
       </init-param> 
       
+      <init-param>
+        <description>This is the template in which you setup an email to be sent after user exists</description>
+        <name>emailTemplateName</name>
+            <value>userRegistrationEmail.vm</value>
+      </init-param> 
         
        
     <portlet-name>UserRegistrationPortlet</portlet-name>

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/forgottenPasswdEmail.vm
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/forgottenPasswdEmail.vm?rev=375955&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/forgottenPasswdEmail.vm (added)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/forgottenPasswdEmail.vm Wed Feb  8 05:14:56 2006
@@ -0,0 +1,15 @@
+こんにちは、$!{map.get("user.name.family")} $!{map.get("user.name.given")} さん
+
+ご利用のアカウントに関する新規パスワード作成依頼を受け付けました。
+アカウントユーザー名: $!{map.get("username")}
+新規パスワード: $!{map.get("password")}
+新規パスワードを有効にするためには、以下のリンクをクリックしてください。
+$!{map.get("returnURL")}
+もし、謝ってこのメールを受け取った場合や、パスワードを更新したくない場合は、
+上のリンクをクリックしないでください。クリックしなければ、ご利用のアカウントで
+現在のパスワードが保持されます。
+
+以上をよろしくお願いいたします。
+
+Jetspeed チーム
+

Added: portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/userRegistrationEmail.vm
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/userRegistrationEmail.vm?rev=375955&view=auto
==============================================================================
--- portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/userRegistrationEmail.vm (added)
+++ portals/jetspeed-2/trunk/applications/j2-admin/src/webapp/WEB-INF/view/userreg/email/html/ja/userRegistrationEmail.vm Wed Feb  8 05:14:56 2006
@@ -0,0 +1,16 @@
+こんにちは、$!{map.get("user.name.family")} $!{map.get("user.name.given")} さん
+
+Jetspeed へようこそ!
+登録していただきありがとうございます。Jetspeed は JSR 168 に合格した
+強力なコンポーネントベースのポータルコンテナシステムです。
+
+ユーザー名: $!{map.get("user.name")}
+パスワード: $!{map.get("password")}
+
+パスワードは、ログインして変更できます。
+以下のリンクでログインしてください。
+$!{map.get("returnURL")}
+
+以上をよろしくお願いいたします。
+
+Jetspeed チーム

Modified: portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/portlet.xml
URL: http://svn.apache.org/viewcvs/portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/portlet.xml?rev=375955&r1=375954&r2=375955&view=diff
==============================================================================
--- portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/portlet.xml (original)
+++ portals/jetspeed-2/trunk/layout-portlets/src/webapp/WEB-INF/portlet.xml Wed Feb  8 05:14:56 2006
@@ -20,6 +20,8 @@
     <portlet-name>VelocityOneColumn</portlet-name>
     <display-name>One Column Layout Using Velocity</display-name>
     <display-name xml:lang="ja">Velocityを利用した 1 列レイアウト</display-name>
+    <display-name xml:lang="zh">使用Velocity的单列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity的單列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -59,6 +61,8 @@
     <portlet-name>VelocityOneColumnTable</portlet-name>
     <display-name>One Column Layout Using Velocity And Tables</display-name>
     <display-name xml:lang="ja">Velocity とテーブルを利用した 1 列レイアウト</display-name>
+    <display-name xml:lang="zh">使用Velocity表格的单列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity表格的單列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>tcolumns</value>
@@ -98,6 +102,8 @@
     <portlet-name>VelocityTwoColumns</portlet-name>
     <display-name>Two Columns Layout Using Velocity</display-name>
     <display-name xml:lang="ja">Velocity を利用した 2 列レイアウト</display-name>
+    <display-name xml:lang="zh">使用Velocity的双列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity的雙列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -137,6 +143,8 @@
     <portlet-name>VelocityTwoColumnsSmallLeft</portlet-name>
     <display-name>Two Columns with a small Left column for navigation controls using Velocity</display-name>
     <display-name xml:lang="ja">Velocity を利用した左側にナビゲーションコントロール用の小さな列を持つ 2 列</display-name>
+    <display-name xml:lang="zh">使用Velocity,导航栏较窄的双列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity,導航欄較窄的雙列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -177,6 +185,8 @@
     <portlet-name>VelocityThreeColumns</portlet-name>
     <display-name>Three Columns Layout Using Velocity</display-name>
     <display-name xml:lang="ja">Velocity を利用した 3 列レイアウト</display-name>
+    <display-name xml:lang="zh">使用Velocity的3列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity的3列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -216,6 +226,8 @@
     <portlet-name>VelocityThreeColumnsTable</portlet-name>
     <display-name>Three Columns Layout Using Velocity And Tables</display-name>
     <display-name xml:lang="ja">Velocity とテーブルを利用した 3 列レイアウト</display-name>
+    <display-name xml:lang="zh">使用Velocity表格的3列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity表格的3列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>tcolumns</value>
@@ -255,6 +267,8 @@
     <portlet-name>VelocityOneColumnNoActions</portlet-name>
     <display-name>One Column Layout Using Velocity with No Page Actions allowed</display-name>
     <display-name xml:lang="ja">ページアクションのない Velocity を利用した 1 列レイアウト</display-name>
+    <display-name xml:lang="zh">没有页面状态、使用Velocity的单列布局</display-name>
+    <display-name xml:lang="zh_TW">沒有頁面狀態、使用Velocity的單列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -292,6 +306,8 @@
     <portlet-name>VelocityTwoColumnsNoActions</portlet-name>
     <display-name>Two Columns Layout Using Velocity with No Page Actions allowed</display-name>
     <display-name xml:lang="ja">ページアクションのない Velocity を利用した 2 列レイアウト</display-name>
+    <display-name xml:lang="zh">没有页面状态、使用Velocity的双列布局</display-name>
+    <display-name xml:lang="zh_TW">沒有頁面狀態、使用Velocity的雙列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -329,6 +345,8 @@
     <portlet-name>VelocityThreeColumnsNoActions</portlet-name>
     <display-name>Three Columns Layout Using Velocity with No Actions allowed</display-name>
     <display-name xml:lang="ja">ページアクションのない Velocity を利用した 3 列レイアウト</display-name>
+    <display-name xml:lang="zh">没有页面状态、使用Velocity的3列布局</display-name>
+    <display-name xml:lang="zh_TW">沒有頁面狀態、使用Velocity的3列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -365,6 +383,8 @@
     <portlet-name>VelocityTwoColumns2575NoActions</portlet-name>
     <display-name>Two Columns Layout Using Velocity with No Page Actions allowed</display-name>
     <display-name xml:lang="ja">ページアクションのない Velocity を利用した 2 列レイアウト</display-name>
+    <display-name xml:lang="zh">没有页面状态、使用Velocity的双列布局</display-name>
+    <display-name xml:lang="zh_TW">沒有頁面狀態、使用Velocity的雙列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -402,6 +422,8 @@
     <portlet-name>VelocityTwoColumns2575</portlet-name>
     <display-name>25/75 Two Columns Layout Using Velocity</display-name>
     <display-name xml:lang="ja">Velocity を利用した 25/75 の 2 列レイアウト</display-name>
+    <display-name xml:lang="zh">使用Velocity的双列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity的雙列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -441,6 +463,8 @@
     <portlet-name>VelocityTwoColumnsSmallLeftNoActions</portlet-name>
     <display-name>Two Columns with a small Left column for navigation controls using Velocity and No Actions</display-name>
     <display-name xml:lang="ja">アクションのない Velocity を利用した左側にナビゲーションコントロール用の小さな列を持つ 2 列</display-name>
+    <display-name xml:lang="zh">没有页面状态、使用Velocity,导航栏较窄的单列布局</display-name>
+    <display-name xml:lang="zh_TW">沒有頁面狀態、使用Velocity,導航欄較窄的雙列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>columns</value>
@@ -478,6 +502,8 @@
     <portlet-name>FrameLayoutPortlet</portlet-name>
     <display-name>Frame Layout Portlet</display-name>
     <display-name xml:lang="ja">フレームレイアウトポートレット</display-name>
+    <display-name xml:lang="zh">框架布局Portlet</display-name>
+    <display-name xml:lang="zh_TW">框架佈局Portlet</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>frames</value>
@@ -515,6 +541,8 @@
     <portlet-name>VelocityTwoColumnsTable</portlet-name>
     <display-name>Two Columns Layout Using Velocity And Tables</display-name>
     <display-name xml:lang="ja">Velocity とテーブルを利用した 2 列レイアウト</display-name>
+    <display-name xml:lang="zh">使用Velocity表格的双列布局</display-name>
+    <display-name xml:lang="zh_TW">使用Velocity表格的雙列佈局</display-name>
     <init-param>
       <name>ViewPage</name>
       <value>tcolumns</value>



---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@portals.apache.org
For additional commands, e-mail: jetspeed-dev-help@portals.apache.org