Actions

J3.x

Difference between revisions of "Making a Language Pack for Joomla"

From Joomla! Documentation

m (What not to translate)
m (Notes: updating links)
(3 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{version/tutor|3.0}}
+
{{version/tutor|3.x}} {{RightTOC}}
 
==How to create localized CORE language packs==
 
==How to create localized CORE language packs==
 
===Notes===
 
===Notes===
Line 6: Line 6:
 
* The localise component may help you create and update the ini files: http://extensions.joomla.org/extensions/languages/language-edition/17755
 
* The localise component may help you create and update the ini files: http://extensions.joomla.org/extensions/languages/language-edition/17755
  
* For 3rd party extensions self-contained ini files installation, see http://docs.joomla.org/Making_non-core_language_packs_in_2.5
+
* For 3rd party extensions self-contained ini files installation in Joomla 2.5, see [[J2.5:Making non-core language packs]]
  
* For Joomla 2.x core language packs, see http://docs.joomla.org/Making_a_Language_Pack_for_Joomla_1.6
+
* For Joomla 2.5 core language packs, see [[J2.5:Making a Language Pack for Joomla]]
  
 
==Full language packs==
 
==Full language packs==
Line 756: Line 756:
 
</extension>
 
</extension>
 
</source>
 
</source>
[[Category:Joomla! 3.0]]
 
[[Category:Tutorials]]
 
[[Category:Language Development]]
 
 
  
 
==What not to translate==
 
==What not to translate==
Line 768: Line 764:
 
JHELP_COMPONENTS_MESSAGING_INBOX="Components_Messaging_Inbox"</source>
 
JHELP_COMPONENTS_MESSAGING_INBOX="Components_Messaging_Inbox"</source>
 
They are used for mapping the help. They may have to be used in the future if we have a specific wiki for help per language
 
They are used for mapping the help. They may have to be used in the future if we have a specific wiki for help per language
 +
 +
[[Category:Joomla! 3.0]]
 +
[[Category:Tutorials]]
 +
[[Category:Language Development]]

Revision as of 09:46, 16 April 2013

Contents

How to create localized CORE language packs

Notes

  • ALL FILES MUST BE SAVED AS UTF8 NO BOM (for non-ascii glyphs as in accented letters, etc.)

Full language packs

* fr-FR is taken as an example of language prefix. A full language pack will contain translations for site and admin parts

  1. In the case of a FULL pack, the package is composed of 3 files, then zipped.
    • pkg_fr-FR.xml
    • site_fr-FR.zip
    • admin_fr-FR.zip
  1. Naming of the pack
    • fr-FR_joomla_lang_full_3.1.0v1.zip
  1. Files required for partial deletion


A pkg_fr-FR.xml file

<?xml version="1.0" encoding="UTF-8" ?>
<extension type="package" version="3.1">
        <name>French Language Pack</name>
        <packagename>fr-FR</packagename>  <!-- the packagename has to be the same as the name of pkg_whatever.xml -->
        <version>3.1.0.1</version>  <!-- change the version # 3.x.x.x when updating, will display in manager -->
        <creationDate>15/05/2013</creationDate>   <!-- will display in manager -->
        <author>French translation team : joomla.fr</author>  <!-- will display in manager -->
        <authorEmail>traduction@joomla.fr</authorEmail>  <!-- will display in manager -->
        <authorUrl>www.joomla.fr</authorUrl>  <!-- will display in manager -->
    <copyright>Copyright (C) 2005 - 2013 joomla.fr et Open Source Matters. Tous droits réservés</copyright>
        <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
        <url></url>
        <packager>Joomla! French</packager>
        <packagerurl>www.joomla.fr</packagerurl>
        <description>
                <![CDATA[
                <div style="text-align:left;">
                <h3>Joomla! 3.1 Full French (fr-FR) Language Package - Version 3.1.0v1</h3>
                <h3>Paquet de langue Joomla! 3.1 français (fr-FR) complet - Version 3.1.0v1</h3>
                <br>
                <h4>Installation du pack de langue fr-FR de TinyMCE 3.5.6 pour Joomla 3.1 inclus</h4>
                <div style="font-weight: normal; padding-bottom:20px;">N'oubliez pas de sélectionner la langue FR dans les <a href="index.php?option=com_plugins&amp;view=plugins&amp;filter_search=TinyMCE"><strong>paramètres du plug-in 'Éditeur - TinyMCE'</strong></a> (paramètre  'Langue de l'éditeur' = fr).<br><br>
                Si vous utilisez la <strong>détection automatique</strong>, veillez à ce que soient installés les différents packs de langue de TinyMCE correspondants aux packs de langue installés pour Joomla!</div>
                </div>
                ]]>
        </description>
        <files>
                <file type="language" client="site" id="fr-FR">site_fr-FR.zip</file>
                <file type="language" client="administrator" id="fr-FR">admin_fr-FR.zip</file>
                <file type="file" client="site" id="TinyMCE_fr-FR">fr-FR_TinyMCE_3.5.6.zip</file>
        </files>
    <updateservers>
        <server type="collection" priority="1" name="Accredited Joomla! Translations">http://update.joomla.org/language/translationlist_3.xml</server>
    </updateservers>
</extension>

Note: TinyMCE files are not mandatory but recommended.

One zip per client (i.e. site and admin)

  • site_fr-FR.zip
  • admin_fr-FR.zip

Content of the client's zip (example below is for admin)

an install.xml

Example for admin

<extension version="3.1" client="administrator" type="language" method="upgrade"> // change to client="site" if site pack
        <name>French (fr-FR)</name>
        <tag>fr-FR</tag>
        <version>3.1.0.1</version>
        <creationDate>15/05/2013</creationDate>
        <author>French translation team : joomla.fr</author>
        <authorEmail>traduction@joomla.fr</authorEmail>
        <authorUrl>www.joomla.fr</authorUrl>
        <copyright>Copyright (C) 2005 - 2013 joomla.fr et Open Source Matters. Tous droits réservés</copyright>
        <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
        <description>fr-FR administrator language</description>
        <files>
        <filename>index.html</filename>
                <filename>fr-FR.com_admin.ini</filename>
                <filename>fr-FR.com_admin.sys.ini</filename>
                <filename>fr-FR.com_banners.ini</filename>
                <filename>fr-FR.com_banners.sys.ini</filename>
                <filename>fr-FR.com_cache.ini</filename>
                <filename>fr-FR.com_cache.sys.ini</filename>
                <filename>fr-FR.com_categories.ini</filename>
                <filename>fr-FR.com_categories.sys.ini</filename>
                <filename>fr-FR.com_checkin.ini</filename>
                <filename>fr-FR.com_checkin.sys.ini</filename>
                <filename>fr-FR.com_config.ini</filename>
                <filename>fr-FR.com_config.sys.ini</filename>
                <filename>fr-FR.com_contact.ini</filename>
                <filename>fr-FR.com_contact.sys.ini</filename>
                <filename>fr-FR.com_content.ini</filename>
                <filename>fr-FR.com_content.sys.ini</filename>
                <filename>fr-FR.com_cpanel.ini</filename>
                <filename>fr-FR.com_cpanel.sys.ini</filename>
                <filename>fr-FR.com_finder.ini</filename>
                <filename>fr-FR.com_finder.sys.ini</filename>
                <filename>fr-FR.com_installer.ini</filename>
                <filename>fr-FR.com_installer.sys.ini</filename>
                <filename>fr-FR.com_joomlaupdate.ini</filename>
                <filename>fr-FR.com_joomlaupdate.sys.ini</filename>
                <filename>fr-FR.com_languages.ini</filename>
                <filename>fr-FR.com_languages.sys.ini</filename>
                <filename>fr-FR.com_login.ini</filename>
                <filename>fr-FR.com_login.sys.ini</filename>
                <filename>fr-FR.com_mailto.sys.ini</filename>
                <filename>fr-FR.com_media.ini</filename>
                <filename>fr-FR.com_media.sys.ini</filename>
                <filename>fr-FR.com_menus.ini</filename>
                <filename>fr-FR.com_menus.sys.ini</filename>
                <filename>fr-FR.com_messages.ini</filename>
                <filename>fr-FR.com_messages.sys.ini</filename>
                <filename>fr-FR.com_modules.ini</filename>
                <filename>fr-FR.com_modules.sys.ini</filename>
                <filename>fr-FR.com_newsfeeds.ini</filename>
                <filename>fr-FR.com_newsfeeds.sys.ini</filename>
                <filename>fr-FR.com_plugins.ini</filename>
                <filename>fr-FR.com_plugins.sys.ini</filename>
                <filename>fr-FR.com_redirect.ini</filename>
                <filename>fr-FR.com_redirect.sys.ini</filename>
                <filename>fr-FR.com_search.ini</filename>
                <filename>fr-FR.com_search.sys.ini</filename>
                <filename>fr-FR.com_templates.ini</filename>
                <filename>fr-FR.com_templates.sys.ini</filename>
                <filename>fr-FR.com_users.ini</filename>
                <filename>fr-FR.com_users.sys.ini</filename>
                <filename>fr-FR.com_weblinks.ini</filename>
                <filename>fr-FR.com_weblinks.sys.ini</filename>
                <filename>fr-FR.com_wrapper.ini</filename>
                <filename>fr-FR.com_wrapper.sys.ini</filename>
                <filename>fr-FR.ini</filename>
                <filename>fr-FR.lib_joomla.ini</filename>
                <filename>fr-FR.localise.php</filename>
                <filename>fr-FR.mod_custom.ini</filename>
                <filename>fr-FR.mod_custom.sys.ini</filename>
                <filename>fr-FR.mod_feed.ini</filename>
                <filename>fr-FR.mod_feed.sys.ini</filename>
                <filename>fr-FR.mod_latest.ini</filename>
                <filename>fr-FR.mod_latest.sys.ini</filename>
                <filename>fr-FR.mod_logged.ini</filename>
                <filename>fr-FR.mod_logged.sys.ini</filename>
                <filename>fr-FR.mod_login.ini</filename>
                <filename>fr-FR.mod_login.sys.ini</filename>
                <filename>fr-FR.mod_menu.ini</filename>
                <filename>fr-FR.mod_menu.sys.ini</filename>
                <filename>fr-FR.mod_multilangstatus.ini</filename>
                <filename>fr-FR.mod_multilangstatus.sys.ini</filename>
                <filename>fr-FR.mod_popular.ini</filename>
                <filename>fr-FR.mod_popular.sys.ini</filename>
                <filename>fr-FR.mod_quickicon.ini</filename>
                <filename>fr-FR.mod_quickicon.sys.ini</filename>
                <filename>fr-FR.mod_stats_admin.ini</filename>
                <filename>fr-FR.mod_stats_admin.sys.ini</filename>
                <filename>fr-FR.mod_status.ini</filename>
                <filename>fr-FR.mod_status.sys.ini</filename>
                <filename>fr-FR.mod_submenu.ini</filename>
                <filename>fr-FR.mod_submenu.sys.ini</filename>
                <filename>fr-FR.mod_title.ini</filename>
                <filename>fr-FR.mod_title.sys.ini</filename>
                <filename>fr-FR.mod_toolbar.ini</filename>
                <filename>fr-FR.mod_toolbar.sys.ini</filename>
                <filename>fr-FR.mod_version.ini</filename>
                <filename>fr-FR.mod_version.sys.ini</filename>
                <filename>fr-FR.plg_authentication_gmail.ini</filename>
                <filename>fr-FR.plg_authentication_gmail.sys.ini</filename>
                <filename>fr-FR.plg_authentication_joomla.ini</filename>
                <filename>fr-FR.plg_authentication_joomla.sys.ini</filename>
                <filename>fr-FR.plg_authentication_ldap.ini</filename>
                <filename>fr-FR.plg_authentication_ldap.sys.ini</filename>
                <filename>fr-FR.plg_captcha_recaptcha.ini</filename>
                <filename>fr-FR.plg_captcha_recaptcha.sys.ini</filename>
                <filename>fr-FR.plg_content_emailcloak.ini</filename>
                <filename>fr-FR.plg_content_emailcloak.sys.ini</filename>
                <filename>fr-FR.plg_content_finder.ini</filename>
                <filename>fr-FR.plg_content_finder.sys.ini</filename>
                <filename>fr-FR.plg_content_geshi.ini</filename>
                <filename>fr-FR.plg_content_geshi.sys.ini</filename>
                <filename>fr-FR.plg_content_joomla.ini</filename>
                <filename>fr-FR.plg_content_joomla.sys.ini</filename>
                <filename>fr-FR.plg_content_loadmodule.ini</filename>
                <filename>fr-FR.plg_content_loadmodule.sys.ini</filename>
                <filename>fr-FR.plg_content_pagebreak.ini</filename>
                <filename>fr-FR.plg_content_pagebreak.sys.ini</filename>
                <filename>fr-FR.plg_content_pagenavigation.ini</filename>
                <filename>fr-FR.plg_content_pagenavigation.sys.ini</filename>
                <filename>fr-FR.plg_content_vote.ini</filename>
                <filename>fr-FR.plg_content_vote.sys.ini</filename>
                <filename>fr-FR.plg_editors_codemirror.ini</filename>
                <filename>fr-FR.plg_editors_codemirror.sys.ini</filename>
                <filename>fr-FR.plg_editors_none.ini</filename>
                <filename>fr-FR.plg_editors_none.sys.ini</filename>
                <filename>fr-FR.plg_editors_tinymce.ini</filename>
                <filename>fr-FR.plg_editors_tinymce.sys.ini</filename>
                <filename>fr-FR.plg_editors-xtd_article.ini</filename>
                <filename>fr-FR.plg_editors-xtd_article.sys.ini</filename>
                <filename>fr-FR.plg_editors-xtd_image.ini</filename>
                <filename>fr-FR.plg_editors-xtd_image.sys.ini</filename>
                <filename>fr-FR.plg_editors-xtd_pagebreak.ini</filename>
                <filename>fr-FR.plg_editors-xtd_pagebreak.sys.ini</filename>
                <filename>fr-FR.plg_editors-xtd_readmore.ini</filename>
                <filename>fr-FR.plg_editors-xtd_readmore.sys.ini</filename>
                <filename>fr-FR.plg_extension_joomla.ini</filename>
                <filename>fr-FR.plg_extension_joomla.sys.ini</filename>
                <filename>fr-FR.plg_finder_categories.ini</filename>
                <filename>fr-FR.plg_finder_categories.sys.ini</filename>
                <filename>fr-FR.plg_finder_contacts.ini</filename>
                <filename>fr-FR.plg_finder_contacts.sys.ini</filename>
                <filename>fr-FR.plg_finder_content.ini</filename>
                <filename>fr-FR.plg_finder_content.sys.ini</filename>
                <filename>fr-FR.plg_finder_newsfeeds.ini</filename>
                <filename>fr-FR.plg_finder_newsfeeds.sys.ini</filename>
                <filename>fr-FR.plg_finder_weblinks.ini</filename>
                <filename>fr-FR.plg_finder_weblinks.sys.ini</filename>
                <filename>fr-FR.plg_quickicon_extensionupdate.ini</filename>
                <filename>fr-FR.plg_quickicon_extensionupdate.sys.ini</filename>
                <filename>fr-FR.plg_quickicon_joomlaupdate.ini</filename>
                <filename>fr-FR.plg_quickicon_joomlaupdate.sys.ini</filename>
                <filename>fr-FR.plg_search_categories.ini</filename>
                <filename>fr-FR.plg_search_categories.sys.ini</filename>
                <filename>fr-FR.plg_search_contacts.ini</filename>
                <filename>fr-FR.plg_search_contacts.sys.ini</filename>
                <filename>fr-FR.plg_search_content.ini</filename>
                <filename>fr-FR.plg_search_content.sys.ini</filename>
                <filename>fr-FR.plg_search_newsfeeds.ini</filename>
                <filename>fr-FR.plg_search_newsfeeds.sys.ini</filename>
                <filename>fr-FR.plg_search_weblinks.ini</filename>
                <filename>fr-FR.plg_search_weblinks.sys.ini</filename>
                <filename>fr-FR.plg_system_cache.ini</filename>
                <filename>fr-FR.plg_system_cache.sys.ini</filename>
                <filename>fr-FR.plg_system_debug.ini</filename>
                <filename>fr-FR.plg_system_debug.sys.ini</filename>
                <filename>fr-FR.plg_system_highlight.ini</filename>
                <filename>fr-FR.plg_system_highlight.sys.ini</filename>
                <filename>fr-FR.plg_system_languagecode.ini</filename>
                <filename>fr-FR.plg_system_languagecode.sys.ini</filename>
                <filename>fr-FR.plg_system_languagefilter.ini</filename>
                <filename>fr-FR.plg_system_languagefilter.sys.ini</filename>
                <filename>fr-FR.plg_system_log.ini</filename>
                <filename>fr-FR.plg_system_log.sys.ini</filename>
                <filename>fr-FR.plg_system_logout.ini</filename>
                <filename>fr-FR.plg_system_logout.sys.ini</filename>
                <filename>fr-FR.plg_system_p3p.ini</filename>
                <filename>fr-FR.plg_system_p3p.sys.ini</filename>
                <filename>fr-FR.plg_system_redirect.ini</filename>
                <filename>fr-FR.plg_system_redirect.sys.ini</filename>
                <filename>fr-FR.plg_system_remember.ini</filename>
                <filename>fr-FR.plg_system_remember.sys.ini</filename>
                <filename>fr-FR.plg_system_sef.ini</filename>
                <filename>fr-FR.plg_system_sef.sys.ini</filename>
                <filename>fr-FR.plg_user_contactcreator.ini</filename>
                <filename>fr-FR.plg_user_contactcreator.sys.ini</filename>
                <filename>fr-FR.plg_user_joomla.ini</filename>
                <filename>fr-FR.plg_user_joomla.sys.ini</filename>
                <filename>fr-FR.plg_user_profile.ini</filename>
                <filename>fr-FR.plg_user_profile.sys.ini</filename>
                <filename>fr-FR.tpl_hathor.ini</filename>
                <filename>fr-FR.tpl_hathor.sys.ini</filename>
                <filename>fr-FR.tpl_isis.ini</filename>
                <filename>fr-FR.tpl_isis.sys.ini</filename>
                <filename file="meta">install.xml</filename>
                <filename file="meta">fr-FR.xml</filename>
        </files>
        <media destination="fr-FR">  <!-- If one needs to add a specific calendar -->
            <filename>index.html</filename>
            <filename>js/index.html</filename>
            <filename>js/calendar-setup.js</filename>
            <filename>js/calendar.js</filename>
        </media>
        <params />
</extension>

Notes:

  • fr-FR.lib_joomla.ini : Add in both admin and site At least in site if "site only pack", see below
  • fr-FR.css : NEW IN 1.7: this file can be added in the ADMINISTRATOR pack if one wants to change the fonts used to display the back-end interface.
  • fr-FR.xml : Note the file="meta" tag, telling it's the basic xml holding info about the pack.
  • install.xml : Mandatory! This file lets uninstall a language. Note file="meta"
  • fr-FR.localise.php : Add in both admin and site. At least in site if "site only pack", see below
  • Folder media destination="fr-FR" : If one needs to add a specific calendar


All the ini files

Beware of new formatting!

  • Double quotes in the value should be written as "_QQ_" or as &quot;
  • NEVER use an escaped quote \" as these will break in php 5.2.x


the fr-FR.xml

<?xml version="1.0" encoding="utf-8"?>
<metafile version="3.1" client="administrator">
    <tag>fr-FR</tag>
        <name>French (fr-FR)</name>
        <version>3.1.0.1</version>
        <creationDate>15/04/2013</creationDate>
        <author>French translation team : joomla.fr</author>
        <authorEmail>traduction@joomla.fr</authorEmail>
        <authorUrl>www.joomla.fr</authorUrl>
        <copyright>Copyright (C) 2005 - 2013 Open Source Matters &amp; Joomla.fr. All rights reserved.</copyright>
        <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
        <description>French administrator language for Joomla 3.0</description>
        <metadata>
                <name>Français (FR)</name>
                <tag>fr-FR</tag>
                <rtl>0</rtl>
                <locale>fr_FR.utf8, fr_FR.UTF-8, fr_FR.UTF-8@euro, fr_FR, fre_FR, fr, france</locale>
                <firstDay>1</firstDay>
        </metadata>
        <params />
</metafile>

Notes:

  • <locale> the locale is used to sort translated lists when present on the server.
  • <firstDay>1</firstDay> used for the Calendar icon to specify what is the first day of the week in that language. 0 is Sunday, 1 is Monday, etc.


the fr-FR.localise.php

This file should be present at least in site zip

Explanation of this file: It replaces the fr-FR.ignore.php and it can be customized depending on languages.

  • Ignore search words.
  • Define upper and lower limit of search words length.
  • Define number of characters to display for the result of the search.
  • Define specific plural functionality for some languages where the value of the string can change depending on the count (Russian for example).
  • Define custom transliteration (i.e. when NOT using the Unicode URLS parameter in Global Configuration) to ensure proper change of some alphabets to ascii for the alias used when SEF is on. (The transliteration which is now default in 1.7 should take care of all latin-based languages.)
  • Define a custom calendar by adding a function as well as some js files

ALWAYS SAVE THIS FILE AS UTF8 NO BOM if it contains non-ascii glyphs (accented letters, etc.)


Example 1 - Custom transliteration NOT implemented

Example of a basic fr-FR.localise.php (where custom transliteration is NOT implemented)

<?php
/**
 * @version             $Id: fr-FR.localise.php 15628 2010-03-27 05:20:29Z infograf768 $
 * @copyright   Copyright (C) 2005 - 2010 Open Source Matters, Inc. All rights reserved.
 * @license             GNU General Public License version 2 or later; see LICENSE.txt
 */
 
/**
 * fr-FR localise class
 *
 * @package             Joomla.Site
 * @since               1.6
 */
abstract class fr_FRLocalise {    //// !!!! NOTE the use of fr_FR for the class !!!  // not the same as your language prefix.
        /**
         * Returns the potential suffixes for a specific number of items
         *
         * @param       int $count  The number of items.
         * @return      array  An array of potential suffixes.
         * @since       1.6
         */
        public static function getPluralSuffixes($count) {
                if ($count == 0) {
                        $return =  array('0');
                }
                elseif($count == 1) {
                        $return =  array('1');
                }
                else {
                        $return = array('MORE');  // Beware, this will be added to a language KEY. It should be in ascii and Uppercase.
                }
                return $return;
        }
        /**
         * Returns the ignored search words
         *
         * @return      array  An array of ignored search words.
         * @since       1.6
         */
        public static function getIgnoredSearchWords() {
                $search_ignore = array();
                $search_ignore[] = "et";
                $search_ignore[] = "si";
                $search_ignore[] = "ou";
                return $search_ignore;
        }
        /**
         * Returns the lower length limit of search words
         *
         * @return      integer  The lower length limit of search words.
         * @since       1.6
         */
        public static function getLowerLimitSearchWord() {
                return 3;
        }
        /**
         * Returns the upper length limit of search words
         *
         * @return      integer  The upper length limit of search words.
         * @since       1.6
         */
        public static function getUpperLimitSearchWord() {
                return 20;
        }
        /**
         * Returns the number of chars to display when searching
         *
         * @return      integer  The number of chars to display when searching.
         * @since       1.6
         */
        public static function getSearchDisplayedCharactersNumber() {
                return 200;
        }
}
Example 2 - Custom transliteration implemented

Example of the function to add to file localise.php when custom transliteration is desired

/**
         * This method processes a string and replaces all accented UTF-8 characters by unaccented
         * ASCII-7 "equivalents"
         *
         * @param       string  $string The string to transliterate
         * @return      string  The transliteration of the string
         * @since       1.6
         */
        public static function transliterate($string)
        {
                $str = JString::strtolower($string);
 
                //Specific language transliteration.
                //This one is for latin 1, latin supplement , extended A, Cyrillic, Greek
 
                $glyph_array = array(
                'a'             =>      'a,à,á,â,ã,ä,å,a,a,a,?,a,?',
                'ae'    =>      'æ',
                'b'             =>      'ß,?',
                'c'             =>      'c,ç,c,c,c,c,?,?',
                'ch'    =>      '?',
                'd'             =>      'd,d,Ð,?,?,d,ð',
                'dz'    =>      '?',
                'e'             =>      'e,è,é,ê,ë,e,e,e,e,e,?,e,?',
                'f'             =>      'ƒ,?',
                'g'             =>      'g,g,g,g,g,?,?',
                'h'             =>      'h,h,H,?',
                'i'             =>      'i,ì,í,î,ï,i,i,i,i,i,?,?,?,?,?,?,?',
                'ij'    =>      '?',
                'j'             =>      'j,j',
                'ja'    =>      '?',
                'ju'    =>      '??',
                'k'             =>      'k,?,?',
                'l'             =>      'l,l,l,?,l,?,?',
                'lj'    =>      '?',
                'm'             =>      'µ,?',
                'n'             =>      'ñ,n,n,?,?,?,?',
                'nj'    =>      '?',
                'o'             =>      'ò,ó,ô,õ,ø,o,o,o,?,?,?,?',
                'oe'    =>      'œ,ö',
                'p'             =>      '?,p',
                'ph'    =>      'f',
                'ps'    =>      '?',
                'r'             =>      'r,r,r,?,?,s,?',
                's'             =>      's,s,s,s,š,?',
                'ss'    =>      'ß,?',
                'sh'    =>      '?',
                'shch'  =>      '?',
                't'             =>      't,t,t,t,?',
                'th'    =>      '?',
                'u'             =>      'u,ù,ú,û,ü,u,u,u,u,u,u,?',
                'v'             =>      '?',
                'w'             =>      'w',
                'x'             =>      '?,?',
                'y'             =>      'ý,þ,ÿ,y',
                'z'             =>      'z,z,ž,?,?,?'
                );
 
                foreach( $glyph_array as $letter => $glyphs ) {
                        $glyphs = explode( ',', $glyphs );
                        $str = str_replace( $glyphs, $letter, $str );
                }
 
                return $str;
        }
Example 3 - Custom calendar implemented

Here is an example of a function to add in the localise.php file in order to implement a custom calendar for fa-IR (Persian language)

/**
 * fa-IR Date class
 *
 * @package             Joomla.Site
 * @since               1.6
 */
jimport('joomla.utilities.date');
class fa_IRDate extends JDate {
        const DAY_NUMBER        = "\x027\x03";
        const DAY_NUMBER2       = "\x030\x03";
        const DAY_YEAR          = "\x032\x03";
        const MONTH_ABBR        = "\x033\x03";
        const MONTH_NAME        = "\x034\x03";
        const MONTH_NUMBER      = "\x035\x03";
        const MONTH_NUMBER2     = "\x036\x03";
        const MONTH_LENGTH      = "\x037\x03";
        const YEAR_ABBR         = "\x040\x03";
        const YEAR_NAME         = "\x041\x03";
        const AM_LOWER          = "\x042\x03";
        const AM_UPPER          = "\x043\x03";
        const PERSIAN_EPOCH     = 1948320.5;
 
        protected static $month_names   = array("???????","????????","?????","???","?????","??????","???","????","???","??","????","?????");
 
 
        /**
         * Gets the date as a formatted string.
         *
         * @param       string  The date format specification string (see {@link PHP_MANUAL#date})
         * @param       boolean True to return the date string in the local time zone, false to return it in GMT.
         * @return      string  The date string in the french republican calendar (see @link{http://en.wikipedia.org/wiki/French_Republican_Calendar}).
         * @since       1.6
         */
        public function calendar($format, $local = false, $translate = true)
        {
                // Do string replacements for date format options that can be translated.
                $format = preg_replace('/(^|[^\\\])d/', "\\1".self::DAY_NUMBER2, $format);
                $format = preg_replace('/(^|[^\\\])j/', "\\1".self::DAY_NUMBER, $format);
                $format = preg_replace('/(^|[^\\\])z/', "\\1".self::DAY_YEAR, $format);
                $format = preg_replace('/(^|[^\\\])M/', "\\1".self::MONTH_ABBR, $format);
                $format = preg_replace('/(^|[^\\\])F/', "\\1".self::MONTH_NAME, $format);
                $format = preg_replace('/(^|[^\\\])n/', "\\1".self::MONTH_NUMBER, $format);
                $format = preg_replace('/(^|[^\\\])m/', "\\1".self::MONTH_NUMBER2, $format);
                $format = preg_replace('/(^|[^\\\])t/', "\\1".self::MONTH_LENGTH, $format);
                $format = preg_replace('/(^|[^\\\])y/', "\\1".self::YEAR_ABBR, $format);
                $format = preg_replace('/(^|[^\\\])Y/', "\\1".self::YEAR_NAME, $format);
                $format = preg_replace('/(^|[^\\\])a/', "\\1".self::AM_LOWER, $format);
                $format = preg_replace('/(^|[^\\\])A/', "\\1".self::AM_UPPER, $format);
 
                // Format the date.
                $return = parent::calendar($format, $local);
 
                $jd = gregoriantojd($this->month, $this->day, $this->year);
                $jalaliDate = self::jd_to_persian($jd);
                $m = $jalaliDate['mon'];
                $d = $jalaliDate['day'];
                $y = $jalaliDate['year'];
 
                // Manually modify the strings in the formated time.
                if (strpos($return, self::DAY_NUMBER) !== false) {
                        $return = str_replace(self::DAY_NUMBER, $d , $return);
                }
                if (strpos($return, self::DAY_NUMBER2) !== false) {
                        $return = str_replace(self::DAY_NUMBER2, sprintf("%02d",$d), $return);
                }
                if (strpos($return, self::DAY_YEAR) !== false) {
                        $return = str_replace(self::DAY_YEAR, $jd - self::persian_to_jd(1,1,$y)+1, $return);
                }
                if (strpos($return, self::MONTH_ABBR) !== false) {
                        $return = str_replace(self::MONTH_ABBR, self::$month_names[$m-1] , $return);
                }
                if (strpos($return, self::MONTH_NAME) !== false) {
                        $return = str_replace(self::MONTH_NAME, self::$month_names[$m-1] , $return);
                }
                if (strpos($return, self::MONTH_NUMBER) !== false) {
                        $return = str_replace(self::MONTH_NUMBER, $m , $return);
                }
                if (strpos($return, self::MONTH_NUMBER2) !== false) {
                        $return = str_replace(self::MONTH_NUMBER2, sprintf("%02d", $m) , $return);
                }
                if (strpos($return, self::MONTH_LENGTH) !== false) {
                        $return = str_replace(self::MONTH_LENGTH, $m < 7 ? 31 : $m < 12 ? 30 : self::leap_persian($y) ? 30 : 29 , $return);
                }
                if (strpos($return, self::YEAR_ABBR) !== false) {
                        $return = str_replace(self::YEAR_ABBR, sprintf("%02d",$y % 100), $return);
                }
                if (strpos($return, self::YEAR_NAME) !== false) {
                        $return = str_replace(self::YEAR_NAME, $y, $return);
                }
                if (strpos($return, self::AM_LOWER) !== false) {
                        $return = str_replace(self::AM_LOWER, $this->format('a',$local)=='pm' ? '? ?' : '? ?', $return);
                }
                if (strpos($return, self::AM_UPPER) !== false) {
                        $return = str_replace(self::AM_UPPER, $this->format('a',$local)=='pm' ? '? ?' : '? ?', $return);
                }
 
                return $return;
        }
        public static function jd_to_persian($jd)
 
        {
 
                //var $year, $month, $day, $depoch, $cycle, $cyear, $ycycle,
 
                //    $aux1, $aux2, $yday;
 
 
 
                $jd = floor($jd) + 0.5;
 
 
 
                $depoch = $jd - self::persian_to_jd(1, 1, 475);
 
                $cycle = floor($depoch / 1029983);
 
                $cyear = $depoch % 1029983;
 
                if ($cyear == 1029982) {
 
                    $ycycle = 2820;
 
                } else {
 
                    $aux1 = floor($cyear / 366);
 
                    $aux2 = $cyear % 366;
 
                    $ycycle = floor(((2134 * $aux1) + (2816 * $aux2) + 2815) / 1028522) +
 
                                $aux1 + 1;
 
                }
 
                $year = $ycycle + (2820 * $cycle) + 474;
 
                if ($year <= 0) {
 
                    $year--;
 
                }
 
                $yday = ($jd - self::persian_to_jd(1, 1, $year)) + 1;
 
                $month = ($yday <= 186) ? ceil($yday / 31) : ceil(($yday - 6) / 30);
 
                $day = ($jd - self::persian_to_jd($month, 1, $year)) + 1;
 
                return array('year'=>$year, 'mon'=>$month,'day'=> $day);
 
        }
        public static function persian_to_jd($month, $day, $year)
 
        {
 
                //var $epbase, $epyear;
 
                $epbase = $year - (($year >= 0) ? 474 : 473);
 
                $epyear = 474 + $epbase % 2820;
 
 
 
                return $day +
 
                        (($month <= 7) ?
 
                            (($month - 1) * 31) :
 
                            ((($month - 1) * 30) + 6)
 
                        ) +
 
                        floor((($epyear * 682) - 110) / 2816) +
 
                        ($epyear - 1) * 365 +
 
                        floor($epbase / 2820) * 1029983 +
 
                        self::PERSIAN_EPOCH;
 
        }
 
        public static function leap_persian($year) {
 
            return (((((($year - (($year > 0) ? 474 : 473)) % 2820) + 474) + 38) * 682) % 2816) < 682;
 
        }
 
}

Note: One has also to add the right calendar.js files in the package.


TinyMCE language files

You can include a zip file for tinyMCE editor language files. See files statement at pkg_fr-FR.xml file Note: TinyMCE files are not mandatory but recommended. They can also be installed in separated language pack


The Site-only pack

Concerning those of you providing "site only" packs:

The packages have to be made on the model of http://joomlacode.org/gf/download/frsrelease/16677/72539/gd-GB_joomla_lang_full_2.5.1.zip (Download and decompress locally to see the exact structure of the pack (install.xml, files included, etc.)

I.e. IT IS NECESSARY TO PROVIDE A LIMITED ADMIN PACK and to post a unique package including both

Why? ==> because some plugin ini files are used in front-end! Here is a typical xml for admin in this case. Example for 2.5:

<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" client="administrator" type="language" method="upgrade">
        <name>Scottish Gaelic (GB)</name>
    <tag>gd-GB</tag>
    <version>3.1.0.1</version>
    <creationDate>15/04/2013</creationDate>
    <author>akerbeltz</author>
    <authorEmail>fios@akerbeltz.org</authorEmail>
    <authorUrl>www.akerbeltz.org</authorUrl>
    <copyright>Copyright (C) 2005 - 2013 Joomla Open Source Matters. Gach còir glèidhte.</copyright>
    <license>GNU General Public License version 2 or later; see LICENSE.txt</license>
    <description>Scottish Gaelic language pack for Joomla! 3.1</description>
        <files>
        <filename>index.html</filename>
                <filename>gd-GB.plg_captcha_recaptcha.ini</filename>
                <filename>gd-GB.plg_finder_categories.ini</filename>
                <filename>gd-GB.plg_finder_contacts.ini</filename>
                <filename>gd-GB.plg_finder_content.ini</filename>
                <filename>gd-GB.plg_finder_newsfeeds.ini</filename>
                <filename>gd-GB.plg_finder_weblinks.ini</filename>
                <filename>gd-GB.plg_content_pagebreak.ini</filename>
                <filename>gd-GB.plg_content_vote.ini</filename>
                <filename>gd-GB.plg_editors-xtd_article.ini</filename>
                <filename>gd-GB.plg_editors-xtd_image.ini</filename>
                <filename>gd-GB.plg_editors-xtd_pagebreak.ini</filename>
                <filename>gd-GB.plg_editors-xtd_readmore.ini</filename>
                <filename>gd-GB.plg_search_categories.ini</filename>
                <filename>gd-GB.plg_search_contacts.ini</filename>
                <filename>gd-GB.plg_search_content.ini</filename>
                <filename>gd-GB.plg_search_newsfeeds.ini</filename>
                <filename>gd-GB.plg_search_weblinks.ini</filename>
                <filename>gd-GB.plg_user_profile.ini</filename>
                <filename file="meta">install.xml</filename>
                <filename file="meta">gd-GB.xml</filename>
        </files>
</extension>

What not to translate

Don't translate this lines

  • file fr-FR.ini = the lines for "JHELP_COMPONENTS_"

example

JHELP_COMPONENTS_MESSAGING_INBOX="Components_Messaging_Inbox"

They are used for mapping the help. They may have to be used in the future if we have a specific wiki for help per language