diff --git a/en_US.ISO8859-1/books/handbook/Makefile b/en_US.ISO8859-1/books/handbook/Makefile
index f11f0f4fa8..157d298b40 100644
--- a/en_US.ISO8859-1/books/handbook/Makefile
+++ b/en_US.ISO8859-1/books/handbook/Makefile
@@ -223,7 +223,6 @@ CLEANFILES+= eresources.sgml.www.inc.tmp
 mirrors.sgml.${p}.inc: ${XML_MIRRORS} ${XSL_MIRRORS}
 	${XSLTPROC} ${XSLTPROCOPTS} \
 	    -o $@.tmp \
-	    --param 'transtable.xml' "'${XML_TRANSTABLE}'" \
 	    --param 'type' "'$p'" \
 	    --param 'proto' "'$p'" \
 	    --param 'target' "'handbook/mirrors/chapter.sgml'" \
@@ -236,7 +235,6 @@ mirrors.sgml.${p}.inc: ${XML_MIRRORS} ${XSL_MIRRORS}
 eresources.sgml.www.inc: ${XML_MIRRORS} ${XSL_MIRRORS}
 	${XSLTPROC} ${XSLTPROCOPTS} \
 	    -o $@.tmp \
-	    --param 'transtable.xml' "'${XML_TRANSTABLE}'" \
 	    --param 'type' "'www'" \
 	    --param 'proto' "'http'" \
 	    --param 'target' "'handbook/eresources/chapter.sgml'" \
diff --git a/ja_JP.eucJP/share/sgml/mirrors-local.xsl b/ja_JP.eucJP/share/sgml/mirrors-local.xsl
index 1a23c69216..ca0170a0ba 100644
--- a/ja_JP.eucJP/share/sgml/mirrors-local.xsl
+++ b/ja_JP.eucJP/share/sgml/mirrors-local.xsl
@@ -10,11 +10,6 @@
 	      omit-xml-declaration="yes"
 	      indent="yes"/>
 
-  <!-- these params should be externally bound. The values
-       here are not used actually -->
-  <xsl:param name="proto" select="''" />
-  <xsl:param name="target" select="''" />
-
   <!-- template: "mirrors-docbook-contact" -->
 
   <xsl:template name="mirrors-docbook-contact">
diff --git a/ja_JP.eucJP/share/sgml/transtable-local.xsl b/ja_JP.eucJP/share/sgml/transtable-local.xsl
index d1b0e7f6b7..e4e5521c32 100644
--- a/ja_JP.eucJP/share/sgml/transtable-local.xsl
+++ b/ja_JP.eucJP/share/sgml/transtable-local.xsl
@@ -9,8 +9,4 @@
   <xsl:output type="xml" encoding="euc-jp"
 	      indent="yes"/>
 
-  <!-- these params should be externally bound. The values
-       here are not used actually -->
-  <xsl:param name="transtable.xml" select="'./transtable.xml'" />
-  <xsl:param name="transtable-conv-element" select="''" />
 </xsl:stylesheet>
diff --git a/ja_JP.eucJP/share/sgml/transtable.xml b/ja_JP.eucJP/share/sgml/transtable.xml
index 3318cd3a85..ef3f2b49b8 100644
--- a/ja_JP.eucJP/share/sgml/transtable.xml
+++ b/ja_JP.eucJP/share/sgml/transtable.xml
@@ -3,13 +3,15 @@
 
 <!--
 
-  This is a translation table used in transtable-master.xsl.
+  This is a translation table used in transtable-common.xsl.
   For example:
 
-  <word>
-    <orig>word in English</orig>
-    <tran>word in your language</tran>
-  </word>
+  <group id="word-group">
+    <word>
+      <orig>word in English</orig>
+      <tran>word in your language</tran>
+    </word>
+  </group>
 
 -->
 
@@ -20,253 +22,317 @@
     </cvs:keyword>
   </cvs:keywords>
 
-  <word>
-    <orig>Central Servers</orig>
-    <tran>���������</tran>
-  </word>
+  <group id="country">
+    <word>
+      <orig>Central Servers</orig>
+      <tran>���������</tran>
+    </word>
 
-  <word>
-    <orig>Primary Mirror Sites</orig>
-    <tran>�켡�ߥ顼������</tran>
-  </word>
+    <word>
+      <orig>Primary Mirror Sites</orig>
+      <tran>�켡�ߥ顼������</tran>
+    </word>
 
-  <word>
-    <orig>Argentina</orig>
-    <tran>���를�����</tran>
-  </word>
+    <word>
+      <orig>Argentina</orig>
+      <tran>���를�����</tran>
+    </word>
 
-  <word>
-    <orig>Australia</orig>
-    <tran>�������ȥ�ꥢ</tran>
-  </word>
+    <word>
+      <orig>Australia</orig>
+      <tran>�������ȥ�ꥢ</tran>
+    </word>
 
-  <word>
-    <orig>Austria</orig>
-    <tran>�������ȥꥢ</tran>
-  </word>
+    <word>
+      <orig>Austria</orig>
+      <tran>�������ȥꥢ</tran>
+    </word>
 
-  <word>
-    <orig>Belgium</orig>
-    <tran>�٥륮��</tran>
-  </word>
+    <word>
+      <orig>Belgium</orig>
+      <tran>�٥륮��</tran>
+    </word>
 
-  <word>
-    <orig>Brazil</orig>
-    <tran>�֥饸��</tran>
-  </word>
+    <word>
+      <orig>Brazil</orig>
+      <tran>�֥饸��</tran>
+    </word>
 
-  <word>
-    <orig>Bulgaria</orig>
-    <tran>�֥륬�ꥢ</tran>
-  </word>
+    <word>
+      <orig>Bulgaria</orig>
+      <tran>�֥륬�ꥢ</tran>
+    </word>
 
-  <word>
-    <orig>Canada</orig>
-    <tran>���ʥ�</tran>
-  </word>
+    <word>
+      <orig>Canada</orig>
+      <tran>���ʥ�</tran>
+    </word>
 
-  <word>
-    <orig>China</orig>
-    <tran>���</tran>
-  </word>
+    <word>
+      <orig>China</orig>
+      <tran>���</tran>
+    </word>
 
-  <word>
-    <orig>Croatia</orig>
-    <tran>����������</tran>
-  </word>
+    <word>
+      <orig>Croatia</orig>
+      <tran>����������</tran>
+    </word>
 
-  <word>
-    <orig>Czech Republic</orig>
-    <tran>���������¹�</tran>
-  </word>
+    <word>
+      <orig>Czech Republic</orig>
+      <tran>���������¹�</tran>
+    </word>
 
-  <word>
-    <orig>Denmark</orig>
-    <tran>�ǥ�ޡ���</tran>
-  </word>
+    <word>
+      <orig>Denmark</orig>
+      <tran>�ǥ�ޡ���</tran>
+    </word>
 
-  <word>
-    <orig>Estonia</orig>
-    <tran>�����ȥ˥�</tran>
-  </word>
+    <word>
+      <orig>Estonia</orig>
+      <tran>�����ȥ˥�</tran>
+    </word>
 
-  <word>
-    <orig>Finland</orig>
-    <tran>�ե������</tran>
-  </word>
+    <word>
+      <orig>Finland</orig>
+      <tran>�ե������</tran>
+    </word>
 
-  <word>
-    <orig>France</orig>
-    <tran>�ե��</tran>
-  </word>
+    <word>
+      <orig>France</orig>
+      <tran>�ե��</tran>
+    </word>
 
-  <word>
-    <orig>Germany</orig>
-    <tran>�ɥ���</tran>
-  </word>
+    <word>
+      <orig>Germany</orig>
+      <tran>�ɥ���</tran>
+    </word>
 
-  <word>
-    <orig>Greece</orig>
-    <tran>���ꥷ��</tran>
-  </word>
+    <word>
+      <orig>Greece</orig>
+      <tran>���ꥷ��</tran>
+    </word>
 
-  <word>
-    <orig>Hong Kong</orig>
-    <tran>���</tran>
-  </word>
+    <word>
+      <orig>Hong Kong</orig>
+      <tran>���</tran>
+    </word>
 
-  <word>
-    <orig>Hungary</orig>
-    <tran>�ϥ󥬥꡼</tran>
-  </word>
+    <word>
+      <orig>Hungary</orig>
+      <tran>�ϥ󥬥꡼</tran>
+    </word>
 
-  <word>
-    <orig>Iceland</orig>
-    <tran>����������</tran>
-  </word>
+    <word>
+      <orig>Iceland</orig>
+      <tran>����������</tran>
+    </word>
 
-  <word>
-    <orig>Ireland</orig>
-    <tran>���������</tran>
-  </word>
+    <word>
+      <orig>Ireland</orig>
+      <tran>���������</tran>
+    </word>
 
-  <word>
-    <orig>Italy</orig>
-    <tran>�����ꥢ</tran>
-  </word>
+    <word>
+      <orig>Italy</orig>
+      <tran>�����ꥢ</tran>
+    </word>
 
-  <word>
-    <orig>Japan</orig>
-    <tran>����</tran>
-  </word>
+    <word>
+      <orig>Japan</orig>
+      <tran>����</tran>
+    </word>
 
-  <word>
-    <orig>Korea</orig>
-    <tran>�ڹ�</tran>
-  </word>
+    <word>
+      <orig>Korea</orig>
+      <tran>�ڹ�</tran>
+    </word>
 
-  <word>
-    <orig>Kuwait</orig>
-    <tran>����������</tran>
-  </word>
+    <word>
+      <orig>Kuwait</orig>
+      <tran>����������</tran>
+    </word>
 
-  <word>
-    <orig>Latvia</orig>
-    <tran>��ȥӥ�</tran>
-  </word>
+    <word>
+      <orig>Latvia</orig>
+      <tran>��ȥӥ�</tran>
+    </word>
 
-  <word>
-    <orig>Lithuania</orig>
-    <tran>��ȥ��˥�</tran>
-  </word>
+    <word>
+      <orig>Lithuania</orig>
+      <tran>��ȥ��˥�</tran>
+    </word>
 
-  <word>
-    <orig>Netherlands</orig>
-    <tran>������</tran>
-  </word>
+    <word>
+      <orig>Netherlands</orig>
+      <tran>������</tran>
+    </word>
 
-  <word>
-    <orig>New Zealand</orig>
-    <tran>�˥塼��������</tran>
-  </word>
+    <word>
+      <orig>New Zealand</orig>
+      <tran>�˥塼��������</tran>
+    </word>
 
-  <word>
-    <orig>Norway</orig>
-    <tran>�Υ륦����</tran>
-  </word>
+    <word>
+      <orig>Norway</orig>
+      <tran>�Υ륦����</tran>
+    </word>
 
-  <word>
-    <orig>Philippines</orig>
-    <tran>�ե���ԥ�</tran>
-  </word>
+    <word>
+      <orig>Philippines</orig>
+      <tran>�ե���ԥ�</tran>
+    </word>
 
-  <word>
-    <orig>Poland</orig>
-    <tran>�ݡ�����</tran>
-  </word>
+    <word>
+      <orig>Poland</orig>
+      <tran>�ݡ�����</tran>
+    </word>
 
-  <word>
-    <orig>Portugal</orig>
-    <tran>�ݥ�ȥ���</tran>
-  </word>
+    <word>
+      <orig>Portugal</orig>
+      <tran>�ݥ�ȥ���</tran>
+    </word>
 
-  <word>
-    <orig>Romania</orig>
-    <tran>�롼�ޥ˥�</tran>
-  </word>
+    <word>
+      <orig>Romania</orig>
+      <tran>�롼�ޥ˥�</tran>
+    </word>
 
-  <word>
-    <orig>Russia</orig>
-    <tran>������</tran>
-  </word>
+    <word>
+      <orig>Russia</orig>
+      <tran>������</tran>
+    </word>
 
-  <word>
-    <orig>San Marino</orig>
-    <tran>����ޥ��</tran>
-  </word>
+    <word>
+      <orig>San Marino</orig>
+      <tran>����ޥ��</tran>
+    </word>
 
-  <word>
-    <orig>Saudi Arabia</orig>
-    <tran>����������ӥ�</tran>
-  </word>
+    <word>
+      <orig>Saudi Arabia</orig>
+      <tran>����������ӥ�</tran>
+    </word>
 
-  <word>
-    <orig>Singapore</orig>
-    <tran>���󥬥ݡ���</tran>
-  </word>
+    <word>
+      <orig>Singapore</orig>
+      <tran>���󥬥ݡ���</tran>
+    </word>
 
-  <word>
-    <orig>Slovak Republic</orig>
-    <tran>�����Х������¹�</tran>
-  </word>
+    <word>
+      <orig>Slovak Republic</orig>
+      <tran>�����Х������¹�</tran>
+    </word>
 
-  <word>
-    <orig>Slovenia</orig>
-    <tran>�����٥˥�</tran>
-  </word>
+    <word>
+      <orig>Slovenia</orig>
+      <tran>�����٥˥�</tran>
+    </word>
 
-  <word>
-    <orig>South Africa</orig>
-    <tran>��եꥫ</tran>
-  </word>
+    <word>
+      <orig>South Africa</orig>
+      <tran>��եꥫ</tran>
+    </word>
 
-  <word>
-    <orig>Spain</orig>
-    <tran>���ڥ���</tran>
-  </word>
+    <word>
+      <orig>Spain</orig>
+      <tran>���ڥ���</tran>
+    </word>
 
-  <word>
-    <orig>Sweden</orig>
-    <tran>���������ǥ�</tran>
-  </word>
+    <word>
+      <orig>Sweden</orig>
+      <tran>���������ǥ�</tran>
+    </word>
 
-  <word>
-    <orig>Switzerland</orig>
-    <tran>������</tran>
-  </word>
+    <word>
+      <orig>Switzerland</orig>
+      <tran>������</tran>
+    </word>
 
-  <word>
-    <orig>Taiwan</orig>
-    <tran>����</tran>
-  </word>
+    <word>
+      <orig>Taiwan</orig>
+      <tran>����</tran>
+    </word>
 
-  <word>
-    <orig>Turkey</orig>
-    <tran>�ȥ륳</tran>
-  </word>
+    <word>
+      <orig>Turkey</orig>
+      <tran>�ȥ륳</tran>
+    </word>
 
-  <word>
-    <orig>Ukraine</orig>
-    <tran>�����饤��</tran>
-  </word>
+    <word>
+      <orig>Ukraine</orig>
+      <tran>�����饤��</tran>
+    </word>
 
-  <word>
-    <orig>United Kingdom</orig>
-    <tran>�����ꥹ</tran>
-  </word>
+    <word>
+      <orig>United Kingdom</orig>
+      <tran>�����ꥹ</tran>
+    </word>
 
-  <word>
-    <orig>USA</orig>
-    <tran>����ꥫ�罰��</tran>
-  </word>
+    <word>
+      <orig>USA</orig>
+      <tran>����ꥫ�罰��</tran>
+    </word>
+  </group>
+
+  <group id="number-month">
+    <word>
+      <orig>1</orig>
+      <tran>1 ��</tran>
+    </word>
+
+    <word>
+      <orig>2</orig>
+      <tran>2 ��</tran>
+    </word>
+
+    <word>
+      <orig>3</orig>
+      <tran>3 ��</tran>
+    </word>
+
+    <word>
+      <orig>4</orig>
+      <tran>4 ��</tran>
+    </word>
+
+    <word>
+      <orig>5</orig>
+      <tran>5 ��</tran>
+    </word>
+
+    <word>
+      <orig>6</orig>
+      <tran>6 ��</tran>
+    </word>
+
+    <word>
+      <orig>7</orig>
+      <tran>7 ��</tran>
+    </word>
+
+    <word>
+      <orig>8</orig>
+      <tran>8 ��</tran>
+    </word>
+
+    <word>
+      <orig>9</orig>
+      <tran>9 ��</tran>
+    </word>
+
+    <word>
+      <orig>10</orig>
+      <tran>10 ��</tran>
+    </word>
+
+    <word>
+      <orig>11</orig>
+      <tran>11 ��</tran>
+    </word>
+
+    <word>
+      <orig>12</orig>
+      <tran>12 ��</tran>
+    </word>
+  </group>
 </transtable>
diff --git a/share/mk/doc.common.mk b/share/mk/doc.common.mk
index 1ccd364892..4b36bbc409 100644
--- a/share/mk/doc.common.mk
+++ b/share/mk/doc.common.mk
@@ -5,6 +5,9 @@
 # documents commonly used in doc/ and www/ tree.
 #
 
+AWK?=		/usr/bin/awk
+GREP?=		/usr/bin/grep
+
 .if defined(DOC_PREFIX) && !empty(DOC_PREFIX)
 WEB_PREFIX?=	${DOC_PREFIX}/../www
 .elif defined(WEB_PREFIX) && !empty(WEB_PREFIX)
@@ -98,13 +101,6 @@ _WWW_LANGCODE:= ${_WWW2_LANGCODE}
 .endif
 WWW_LANGCODE?=	${_WWW_LANGCODE}
 
-# ------------------------------------------------------------------------
-#
-# advisories.xml dependency.
-#
-
-XML_ADVISORIES=		${WEB_PREFIX}/share/sgml/advisories.xml
-
 # ------------------------------------------------------------------------
 #
 # mirrors.xml dependency.
@@ -122,6 +118,7 @@ XSL_MIRRORS=		${DOC_PREFIX}/share/sgml/mirrors-local.xsl
 .endif
 
 XSL_TRANSTABLE_MASTER=	${DOC_PREFIX}/share/sgml/transtable-master.xsl
+XSL_TRANSTABLE_COMMON=	${DOC_PREFIX}/share/sgml/transtable-common.xsl
 
 .if exists(${DOC_PREFIX}/${LANGCODE}/share/sgml/transtable-local.xsl)
 XSL_TRANSTABLE=		${DOC_PREFIX}/${LANGCODE}/share/sgml/transtable-local.xsl
@@ -135,13 +132,29 @@ XML_TRANSTABLE=		${DOC_PREFIX}/${LANGCODE}/share/sgml/transtable.xml
 XML_TRANSTABLE=		${DOC_PREFIX}/share/sgml/transtable.xml
 .endif
 
-${XSL_MIRRORS}: ${XSL_MIRRORS_MASTER}
+${XSL_MIRRORS}: ${XSL_MIRRORS_MASTER} ${XSL_TRANSTABLE_COMMON}
 
-${XML_MIRRORS}: ${XML_MIRRORS_MASTER} ${XSL_TRANSTABLE} ${XSL_TRANSTABLE_MASTER}
+${XML_MIRRORS}: ${XML_MIRRORS_MASTER} ${XSL_TRANSTABLE} ${XSL_TRANSTABLE_MASTER} ${XSL_TRANSTABLE_COMMON}
 	${MKDIR} -p ${@:H}
+	${XSLTPROC} ${XSLTPROCOPTS} \
+	    --param 'transtable.xml' "'${XML_TRANSTABLE}'" \
+	    --param 'transtable-target-element' "'country'" \
+	    --param 'transtable-word-group' "'country'" \
+	    --param 'transtable-mode' "'sortkey'" \
+	    ${XSL_TRANSTABLE} ${XML_MIRRORS_MASTER} \
+	  | env -i LANG="${LANGCODE}" ${SORT} -f > $@.sort.tmp
+	env -i ${GREP} "^<?xml" < $@.sort.tmp > $@.sort
+	${ECHO} "<sortkeys>" >> $@.sort
+	env -i ${AWK} '/^  / {sub(/@sortkey@/, ++line); print;}' < $@.sort.tmp >> $@.sort
+	${ECHO} '</sortkeys>' >> $@.sort
 	${XSLTPROC} ${XSLTPROCOPTS} -o $@ \
 	    --param 'transtable.xml' "'${XML_TRANSTABLE}'" \
-	    --param 'transtable-conv-element' "'country'" \
+	    --param 'transtable-target-element' "'country'" \
+	    --param 'transtable-word-group' "'country'" \
+	    --param 'transtable-sortkey.xml' "'$@.sort'" \
 	    ${XSL_TRANSTABLE} ${XML_MIRRORS_MASTER}
+	${RM} -f $@.sort $@.sort.tmp
 
 CLEANFILES+= ${XML_MIRRORS}
+CLEANFILES+= ${XML_MIRRORS}.sort
+CLEANFILES+= ${XML_MIRRORS}.sort.tmp
diff --git a/share/sgml/mirrors-local.xsl b/share/sgml/mirrors-local.xsl
index 4fff70caa7..786463bdeb 100644
--- a/share/sgml/mirrors-local.xsl
+++ b/share/sgml/mirrors-local.xsl
@@ -10,8 +10,4 @@
 	      omit-xml-declaration="yes"
 	      indent="yes"/>
 
-  <!-- these params should be externally bound. The values
-       here are not used actually -->
-  <xsl:param name="proto" select="''" />
-  <xsl:param name="target" select="''" />
 </xsl:stylesheet>
diff --git a/share/sgml/mirrors-master.xsl b/share/sgml/mirrors-master.xsl
index cd13a0f6cf..dffb2709e2 100644
--- a/share/sgml/mirrors-master.xsl
+++ b/share/sgml/mirrors-master.xsl
@@ -68,15 +68,16 @@
 
   <xsl:template name="mirrors-docbook-country-index-all">
     <para>
-      <xsl:for-each select="mirrors/entry[country/@role = 'primary' and
-	                    host[@type = $type]]">
+      <xsl:for-each select="mirrors/entry[country/@role = 'primary'
+	                    and host[@type = $type]]">
 	<xsl:call-template name="mirrors-docbook-country-index">
 	  <xsl:with-param name="mirrors-docbook-country-index-without-period" select="'true'" />
 	</xsl:call-template>
       </xsl:for-each>
 
-      <xsl:for-each select="mirrors/entry[country/@role != 'primary' and
+      <xsl:for-each select="mirrors/entry[(not(country/@role) or country/@role != 'primary') and
 	                    host[@type = $type]]">
+	<xsl:sort select="country/@sortkey" data-type="number"/>
 	<xsl:sort select="country" />
 
 	<xsl:call-template name="mirrors-docbook-country-index">
@@ -109,8 +110,9 @@
 	<xsl:call-template name="mirrors-docbook-variablelist-entry" />
       </xsl:for-each>
 
-      <xsl:for-each select="mirrors/entry[country/@role != 'primary' and
+      <xsl:for-each select="mirrors/entry[(not(country/@role) or country/@role != 'primary') and
 	                    host[@type = $type]]">
+	<xsl:sort select="country/@sortkey" data-type="number"/>
 	<xsl:sort select="country" />
 
 	<xsl:call-template name="mirrors-docbook-variablelist-entry" />
@@ -194,9 +196,10 @@
 	<xsl:call-template name="mirrors-docbook-itemizedlist-listitem" />
       </xsl:for-each>
 
-      <xsl:for-each select="mirrors/entry[country/@role != 'primary' and
+      <xsl:for-each select="mirrors/entry[(not(country/@role) or country/@role != 'primary') and
 	                    host[@type = $type]]">
-        <xsl:sort select="country" />
+	<xsl:sort select="country/@sortkey" data-type="number"/>
+	<xsl:sort select="country" />
 
 	<xsl:call-template name="mirrors-docbook-itemizedlist-listitem" />
       </xsl:for-each>
diff --git a/share/sgml/transtable-common.xsl b/share/sgml/transtable-common.xsl
new file mode 100644
index 0000000000..2b9ebaedfe
--- /dev/null
+++ b/share/sgml/transtable-common.xsl
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!-- $FreeBSD$ -->
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+  <!-- these params should be externally bound. The values
+       here are not used actually -->
+  <xsl:param name="transtable.xml" select="'./transtable.xml'" />
+  <xsl:param name="transtable-sortkey.xml" select="'./transtable-sortkey.xml'" />
+
+  <xsl:key name="transtable-lookup-key" match="word" use="orig" />
+  <xsl:key name="transtable-sortkey-lookup-key" match="word" use="@orig" />
+
+  <xsl:template name="transtable-lookup">
+    <xsl:param name="word" select="''"/>
+    <xsl:param name="word-group" select="''"/>
+
+    <xsl:choose>
+      <xsl:when test="document($transtable.xml)/transtable/group[@id = $word-group]">
+	<xsl:for-each select="document($transtable.xml)/transtable/group[@id = $word-group]">
+	  <xsl:choose>
+	    <xsl:when test="key('transtable-lookup-key', $word)">
+	      <xsl:for-each select="key('transtable-lookup-key', $word)">
+		<xsl:value-of select="tran" />
+	      </xsl:for-each>
+	    </xsl:when>
+	    <xsl:otherwise>
+	      <xsl:value-of select="$word" />
+	    </xsl:otherwise>
+	  </xsl:choose>
+	</xsl:for-each>
+      </xsl:when>
+      <xsl:otherwise>
+	<xsl:value-of select="$word" />
+      </xsl:otherwise>
+    </xsl:choose>
+  </xsl:template>
+
+  <xsl:template name="transtable-sortkey-lookup">
+    <xsl:param name="word" select="''"/>
+
+    <xsl:for-each select="document($transtable-sortkey.xml)/sortkeys">
+      <xsl:for-each select="key('transtable-sortkey-lookup-key', $word)">
+	<xsl:attribute name="sortkey">
+	  <xsl:value-of select="@sortkey" />
+	</xsl:attribute>
+      </xsl:for-each>
+    </xsl:for-each>
+  </xsl:template>
+</xsl:stylesheet>
diff --git a/share/sgml/transtable-local.xsl b/share/sgml/transtable-local.xsl
index 25ae67845f..70e7a29c45 100644
--- a/share/sgml/transtable-local.xsl
+++ b/share/sgml/transtable-local.xsl
@@ -12,5 +12,10 @@
   <!-- these params should be externally bound. The values
        here are not used actually -->
   <xsl:param name="transtable.xml" select="'./transtable.xml'" />
-  <xsl:param name="transtable-conv-element" select="''" />
+  <xsl:param name="transtable-sortkey.xml" select="'./transtable-sortkey.xml'" />
+
+  <xsl:param name="transtable-target-element" select="''" />
+  <xsl:param name="transtable-word-group" select="''" />
+  <xsl:param name="transtable-mode" select="''" />
+
 </xsl:stylesheet>
diff --git a/share/sgml/transtable-master.xsl b/share/sgml/transtable-master.xsl
index 2eda63fa62..0c78fe0721 100644
--- a/share/sgml/transtable-master.xsl
+++ b/share/sgml/transtable-master.xsl
@@ -3,31 +3,26 @@
 
 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
 
+  <xsl:import href="./transtable-common.xsl" />
+
   <xsl:output type="xml" encoding="iso-8859-1"
 	      indent="yes"/>
 
   <!-- these params should be externally bound. The values
        here are not used actually -->
-  <xsl:param name="transtable.xml" select="'./transtable.xml'" />
-  <xsl:param name="transtable-conv-element" select="''" />
+  <xsl:param name="transtable-target-element" select="''" />
+  <xsl:param name="transtable-word-group" select="''" />
+  <xsl:param name="transtable-mode" select="''" />
 
-  <xsl:key name="transtable-lookup-key" match="word" use="orig" />
-
-  <xsl:template name="transtable-lookup">
-    <xsl:param name="word" select="''"/>
-
-    <xsl:for-each select="document($transtable.xml)">
-      <xsl:choose>
-        <xsl:when test="key('transtable-lookup-key', $word)">
-          <xsl:for-each select="key('transtable-lookup-key', $word)">
-	    <xsl:value-of select="tran" />
-          </xsl:for-each>
-        </xsl:when>
-        <xsl:otherwise>
-	  <xsl:value-of select="$word" />
-        </xsl:otherwise>
-      </xsl:choose>
-    </xsl:for-each>
+  <xsl:template match="/">
+    <xsl:choose>
+      <xsl:when test="$transtable-mode = 'sortkey'">
+	<xsl:apply-templates mode="sortkey"/>
+      </xsl:when>
+      <xsl:otherwise>
+	<xsl:apply-templates />
+      </xsl:otherwise>
+    </xsl:choose>
   </xsl:template>
 
   <xsl:template match="*">
@@ -37,13 +32,59 @@
     </xsl:copy>
   </xsl:template>
 
-  <xsl:template match="*[local-name() = $transtable-conv-element]">
+  <xsl:template match="*[local-name() = $transtable-target-element]">
     <xsl:element name="{local-name(.)}" namespace="{namespace-uri(.)}">
       <xsl:copy-of select="@*" />
 
+      <xsl:call-template name="transtable-sortkey-lookup">
+	<xsl:with-param name="word" select="." />
+	<xsl:with-param name="word-group" select="$transtable-word-group" />
+      </xsl:call-template>
+
       <xsl:call-template name="transtable-lookup">
         <xsl:with-param name="word" select="." />
+        <xsl:with-param name="word-group" select="$transtable-word-group" />
       </xsl:call-template>
     </xsl:element>
   </xsl:template>
+
+ <!-- mode for generating sortkeytable -->
+
+  <xsl:template match="*" mode="sortkey">
+    <xsl:apply-templates mode="sortkey"/>
+  </xsl:template>
+
+  <xsl:template match="text()" mode="sortkey">
+  </xsl:template>
+
+  <xsl:template match="*[local-name() = $transtable-target-element]" mode="sortkey">
+    <xsl:text>  </xsl:text>
+
+    <xsl:comment>
+      <xsl:call-template name="transtable-lookup">
+	<xsl:with-param name="word" select="." />
+	<xsl:with-param name="word-group" select="$transtable-word-group" />
+      </xsl:call-template>
+    </xsl:comment>
+
+    <xsl:element name="word">
+      <xsl:attribute name="name">
+	<xsl:call-template name="transtable-lookup">
+	  <xsl:with-param name="word" select="." />
+	<xsl:with-param name="word-group" select="$transtable-word-group" />
+	</xsl:call-template>
+      </xsl:attribute>
+
+      <xsl:attribute name="orig">
+	<xsl:value-of select="." />
+      </xsl:attribute>
+
+      <xsl:attribute name="sortkey">
+	<xsl:value-of select="'@sortkey@'" />
+      </xsl:attribute>
+    </xsl:element>
+
+    <xsl:text disable-output-escaping="yes">&#10;</xsl:text>
+
+  </xsl:template>
 </xsl:stylesheet>
diff --git a/share/sgml/transtable.xml b/share/sgml/transtable.xml
index 1d420bf067..c1a1b99950 100644
--- a/share/sgml/transtable.xml
+++ b/share/sgml/transtable.xml
@@ -3,13 +3,15 @@
 
 <!--
 
-  This is a translation table used in transtable-master.xsl.
+  This is a translation table used in transtable-common.xsl.
   For example:
 
-  <word>
-    <orig>word in English)</orig>
-    <tran>word in your language</tran>
-  </word>
+  <group id="country">
+    <word>
+      <orig>word in English</orig>
+      <tran>word in your language</tran>
+    </word>
+  </group>
 
 -->
 
@@ -20,11 +22,65 @@
     </cvs:keyword>
   </cvs:keywords>
 
-<!--
-  <word>
-    <orig>Primary Mirror Sites</orig>
-    <tran></tran>
-  </word>
--->
+  <group id="number-month">
+    <word>
+      <orig>1</orig>
+      <tran>January</tran>
+    </word>
 
+    <word>
+      <orig>2</orig>
+      <tran>February</tran>
+    </word>
+
+    <word>
+      <orig>3</orig>
+      <tran>March</tran>
+    </word>
+
+    <word>
+      <orig>4</orig>
+      <tran>April</tran>
+    </word>
+
+    <word>
+      <orig>5</orig>
+      <tran>May</tran>
+    </word>
+
+    <word>
+      <orig>6</orig>
+      <tran>June</tran>
+    </word>
+
+    <word>
+      <orig>7</orig>
+      <tran>July</tran>
+    </word>
+
+    <word>
+      <orig>8</orig>
+      <tran>August</tran>
+    </word>
+
+    <word>
+      <orig>9</orig>
+      <tran>September</tran>
+    </word>
+
+    <word>
+      <orig>10</orig>
+      <tran>October</tran>
+    </word>
+
+    <word>
+      <orig>11</orig>
+      <tran>November</tran>
+    </word>
+
+    <word>
+      <orig>12</orig>
+      <tran>December</tran>
+    </word>
+  </group>
 </transtable>