1. AdvSearch
      1. AdvSearch.AdvSearch
        1. AdvSearch.AdvSearch.tpl
        2. AdvSearch.Advsearch.paging1Tpl
        3. AdvSearch.AdvSearch.paging0Tpl
        4. AdvSearch.AdvSearch.containerTpl
        5. Advsearch.AdvSearch.extractTpl
      2. AdvSearch.AdvSearchHelp
        1. AdvSearch.AdvSearchHelp.helplinkTpl
      3. AdvSearch.AdvSearchForm
        1. Advsearch.AdvSearchForm.tpl
    2. cookieJar
    3. getYoutube
    4. aliasid
    5. AddHeaderfiles
    6. AjaxUpload
    7. amazonSES mailing list
    8. Analytics
    9. Archivist
      1. Archivist.Archivist
        1. Archivist.Archivist.tpl
      2. Archivist.ArchivistGrouper
      3. Archivist.getArchives
        1. Archivist.getArchives.tpl
    10. Articles
      1. Articles.Theming Articles
      2. Articles.Roadmap
      3. Articles.Retrieving Articles Outside of Articles
      4. Articles.Creating a Blog
    11. Babel
      1. Babel.BabelLinks
      2. Babel.BabelTranslation
    12. BannerX
    13. BannerY
    14. Batcher
      1. Batcher.Roadmap
    15. bdListings
      1. bdListings.bdCategories
      2. bdListings.bdHookNewListing
      3. bdListings.bdListings
      4. bdListings.bdPriceGroups
      5. bdListings.bdRedirect
      6. bdListings.bdTargets
    16. boilerX
      1. bx-head-open
      2. bx-head-append
      3. bx-head-close
      4. bx-container-open
      5. bx-container-close
      6. bx-bottom-open
      7. bx-bottom-close
    17. BreadCrumb
      1. BreadCrumb.containerTpl
      2. BreadCrumb.currentCrumbTpl
      3. BreadCrumb.linkCrumbTpl
      4. BreadCrumb.maxCrumbTpl
      5. BreadCrumb.categoryCrumbTpl
      6. BreadCrumb.homeCrumbTpl
    18. Breadcrumbs
    19. BxrExtra
    20. cachebuster
    21. CamperManagement
      1. CamperManagement.Customizing the Component
      2. CamperManagement.Developing the front-end
        1. CamperManagement.cmCamperDetails Snippet
        2. CamperManagement.cmCampers Snippet
        3. CamperManagement.Placeholders you can use
      3. CamperManagement.Managing your vehicle
      4. CamperManagement.Module home
    22. Church Events Calendar
      1. ChurchEvents.MODX Manager functions
      2. ChurchEventsCalendar Snippet
        1. ChurchEvents.Managing events
      3. ChurchEventsList Snippet
      4. ChurchEventsRss Snippet
    23. Cliche
    24. ClientConfig
    25. CMPGenerator
      1. CMPGenerator.5 minute example
      2. CMPGenerator.Foreign Databases
    26. Collections
    27. ContextRouter
    28. CookieList
    29. CronManager
    30. cssSweet
      1. cssSweet.lighten
      2. cssSweet.modval
      3. cssSweet.prefix
    31. CustomUrls
    32. Databackup
    33. Discuss
      1. Discuss.ChunkMap
      2. Discuss.Contributing
      3. Discuss.Controllers
        1. Discuss.Controllers.board
          1. Discuss.Controllers.board.xml
        2. Discuss.Controllers.home
        3. Discuss.Controllers.login
        4. Discuss.Controllers.logout
        5. Discuss.Controllers.profile
        6. Discuss.Controllers.register
        7. Discuss.Controllers.search
        8. Discuss.Controllers.thread
      4. Discuss.Creating a Discuss Theme
      5. Discuss.Database Model
      6. Discuss.Features
      7. Discuss.Getting Started
      8. Discuss.Installation
        1. Discuss.Installation from Git
      9. Discuss.Roadmap
      10. Configuring Sphinx for Search
    34. DitsNews
    35. Eletters
      1. Eletters.API
      2. Eletters.FormIt
      3. Eletters.Import CSV
      4. Eletters.Templates
    36. EventManager
      1. EventManager.emListEvents
      2. EventManager.emNewReservationHook
    37. eventsCalendar2
      1. eventsCalendar2.eventsCalendar2
      2. eventsCalendar2.Generating events
      3. eventsCalendar2.tplCalendar2
      4. eventsCalendar2.tplCell2
      5. eventsCalendar2.tplEvent2
      6. eventsCalendar2.tplHead2
    38. EventsX
      1. EventsX.Examples
    39. ExerPlan
    40. fastField
    41. FileDownload R
      1. FileDownload R.FileDownload
      2. FileDownload R.FileDownloadLink
      3. FileDownload R.Plugins
    42. FileLister
      1. FileLister.FileLister
        1. FileLister.FileLister.directoryTpl
        2. FileLister.FileLister.fileLinkTpl
        3. FileLister.FileLister.fileTpl
        4. FileLister.FileLister.pathTpl
      2. FileLister.Roadmap
    43. FirstChildRedirect
    44. Flexibility
    45. ForcedPasswdChange
    46. FormIt
      1. FormIt.FormItCountryOptions
      2. FormIt.FormItRetriever
      3. FormIt.FormItStateOptions
      4. FormIt.Hooks
        1. FormIt.Hooks.email
        2. FormIt.Hooks.FormItAutoResponder
        3. FormIt.Hooks.math
        4. FormIt.Hooks.recaptcha
        5. FormIt.Hooks.redirect
        6. FormIt.Hooks.spam
      5. FormIt.Roadmap
      6. FormIt.Tutorials and Examples
        1. FormIt.Examples.Custom Hook
        2. FormIt.Examples.Simple Contact Page
        3. FormIt.Handling Selects, Checkboxes and Radios
        4. FormIt.Using a Blank NoSpam Field
      7. FormIt.Validators
    47. FormIt2db
    48. FormitFastPack
      1. FormitFastPack.Tutorial
      2. FormitFastPack.fieldSetDefaults
      3. FormitFastPack.field
      4. FormitFastPack.fiGenerateReport
    49. FormSave
    50. FoundationX
      1. FoundationX.How to Use FoundationX
    51. FX2themebase
      1. FX2.How to Use FX2
        1. FX2.For Theme Authors
      2. FX2.Included Extras
    52. Gallery
      1. Gallery.Example1
      2. Gallery.Gallery
        1. Gallery.Gallery.containerTpl
        2. Gallery.Gallery.thumbTpl
      3. Gallery.GalleryAlbums
        1. Gallery.GalleryAlbums.rowTpl
        2. Gallery.GalleryAlbums.containerTpl
      4. Gallery.GalleryItem
        1. Gallery.GalleryItem.albumTpl
        2. Gallery.GalleryItem.GalleryItemPagination
        3. Gallery.GalleryItem.tagTpl
        4. Gallery.GalleryItem.tpl
      5. Gallery.Plugins
        1. Gallery.Plugins.Galleriffic
        2. Gallery.Plugins.Slimbox
      6. Gallery.Roadmap
      7. Gallery.Setting Up the GalleryItem TV
      8. Gallery.Setting Up Your Gallery
    53. GatewayManager
    54. gCal
    55. getDate
    56. getFeed
      1. getFeed.Adding a Twitter Feed
    57. getPage
    58. getRelated
    59. getResourceField
    60. getResources
      1. getResources.Examples
        1. getResources.Building a RSS feed
        2. getResources.Category Index Page with Thumbnails
        3. getResources.Google XML Sitemap
    61. getUrlParam
    62. getRTImages
    63. getVimeo
    64. GoogleSiteMap
      1. GoogleSiteMap.GoogleSiteMap
        1. GoogleSiteMap.GoogleSiteMap.containerTpl
        2. GoogleSiteMap.GoogleSiteMap.itemTpl
      2. GoogleSiteMap.Roadmap
    65. GridClassKey
    66. HandyMan
      1. HandyMan.Frequently Asked Questions
      2. HandyMan.Installation
      3. HandyMan.Roadmap
    67. Hits
    68. HitsPage
    69. HybridAuth
      1. HybridAuth.Integrating Facebook
      2. HybridAuth.Integrating Google
      3. HybridAuth.Integrating Twitter
      4. HybridAuth.Integrating VK.com
    70. If
    71. Image+
    72. imageHERE
    73. ImageStyles
    74. ImportX
    75. LexRating
    76. Lingua
    77. Login
      1. Login.ChangePassword
      2. Login.ConfirmRegister
      3. Login.ForgotPassword
      4. Login.Login
      5. Login.Profile
      6. Login.Register
        1. Register.Example Form 1
      7. Login.ResetPassword
      8. Login.Roadmap
      9. Login.Tutorials
        1. Login.Basic Setup
        2. Login.Extended User Profiles
        3. Login.Request Membership
        4. Login.User Profiles
        5. Login.Using Custom Fields
        6. Login.Using Pre and Post Hooks
      10. Login.UpdateProfile
    78. Loginza
      1. Loginza.Loginza
      2. tpl.Loginza.login
      3. tpl.Loginza.logout
      4. tpl.Loginza.profile
    79. mChimpX
    80. MetaX
    81. mhPayPal
      1. mhPayPal.Snippet Usage
        1. mhPayPal.Snippet Usage.Hooks
        2. mhPayPal.Snippet Usage.Templating
    82. MIGX
      1. MIGX.Backend-Usage
      2. MIGX.Data-Entry
      3. MIGX.Frontend-Usage
      4. MIGX.Tutorials
        1. MIGX.Fancybox-images with seperate placeholders in Richtext-Content
        2. MIGX.Simple opening hours table
        3. Using resource-specific mediasource and multifile-uploader with MIGX
        4. MIGX.Varying layout-boxes
          1. MIGX.Varying layout-boxes.Configurator-Version
        5. Creating Selectable and Sortable lists for MIGX
        6. MIGX.sortable resourcelist
        7. Using resource-specific mediasource and multifile-uploader with MIGX
        8. MIGX.Using Grid Inline Editing
    83. MIGXdb
      1. MIGXdb.Configuration
      2. MIGXdb.Tutorials
        1. MIGXdb.Create a basic gallery-management from scratch with MIGXdb
        2. MIGXdb.Create doodles manager with help of MIGXdb
        3. MIGXdb.Manage Child-Resources in a grid-TV with help of MIGXdb
        4. MIGXdb.Manage Events-Resources in a CMP with help of MIGXdb
      3. MigxCalendars
    84. MinifyX
    85. miniShop
      1. miniShop.Screenshots
    86. modActiveDirectory
    87. ModDef
    88. modExtra
    89. modMobile
    90. modSwiftMailer
    91. mxCalendar
      1. mxCalendar.Examples
      2. mxCalendar.Placeholders
    92. mxExtendedMenu
    93. mxFormBuilder
      1. mxFormBuilder.Create Form
      2. mxFormBuilder.Hooks
      3. mxFormBuilder.Field Types
      4. mxFormBuilder.Create Form List in TV
      5. mxFormBuilder.Fields
    94. mxHasTvs
    95. MoneyBird
      1. MoneyBird.Contacts
      2. MoneyBird.Invoices
      3. MoneyBird.NrFormat
    96. ObfuscateEmail-Revo
    97. PackMan
      1. PackMan.Roadmap
    98. PageBreaker
      1. PageBreaker.PageBreaker
      2. tpl.PageBreaker.ajax
      3. tpl.PageBreaker.navigation
    99. Peoples
      1. Peoples.PeopleGroup
        1. Peoples.PeopleGroup.userTpl
      2. Peoples.PeopleGroups
        1. Peoples.PeopleGroups.tpl
      3. Peoples.Peoples
        1. Peoples.Peoples.tpl
      4. Peoples.Roadmap
    100. PHP Tidy (plugin)
    101. phpThumbOf
    102. Polls
      1. Polls.Polls
      2. Polls.PollsLatest
      3. Polls.PollsPrevious
      4. Polls.PollsResult
    103. POI Manager
    104. QuickCrumbs
      1. QuickCrumbs.Example
    105. Quip
      1. Quip.Quip
        1. Quip.Quip.tplComment
        2. Quip.Quip.tplCommentOptions
        3. Quip.Quip.tplComments
        4. Quip.Quip.tplReport
      2. Quip.QuipCount
      3. Quip.QuipLatestComments
      4. Quip.QuipReply
        1. Quip.QuipReply.tplAddComment
        2. Quip.QuipReply.tplLoginToComment
        3. Quip.QuipReply.tplPreview
      5. Quip.QuipRss
      6. Quip.Roadmap
      7. Quip.Upgrading
        1. Quip.Upgrading to 1.0.1
    106. Rampart
      1. Rampart.hook.RampartFormIt
      2. Rampart.hook.RampartQuip
      3. Rampart.preHook.RampartRegister
    107. Redirector
    108. renderResources
    109. ResourceWatcher
    110. RezImgCrop
    111. Rowboat
      1. Rowboat.Rowboat
    112. sekFancyBox
      1. sekFancyBox & Gallery
    113. sekFormTools
      1. sekFormTools.input.autocomplete
      2. sekFormTools.input.combobox
      3. sekFormTools.input.datepicker
      4. sekFormTools.input.helper
      5. sekFormTools.input.textfield
      6. sekFormTools Advanced Examples
    114. sekSiteTools
      1. sekSiteTools.easytabs
      2. sekSiteTools.google.analytics
      3. sekSiteTools.printdiv
    115. sekUserGalleries
      1. sekUserGalleries.album.items.helper
      2. sekUserGalleries.album.items.manage
      3. sekUserGalleries.album.manage
      4. sekUserGalleries.album.view
      5. sekUserGalleries.browse.galleries
      6. sekUserGalleries.directory
      7. sekUserGalleries.image.information
      8. sekUserGalleries.search
      9. sekUserGalleries.users.gallery.manage
      10. sekUserGalleries.users.gallery.view
    116. selfLink
    117. Shopkeeper
    118. siblingNav
    119. SimpleSearch
      1. SimpleSearch.Roadmap
      2. SimpleSearch.SimpleSearch
        1. SimpleSearch.Faceted Search Through PostHooks
        2. SimpleSearch.SimpleSearch.containerTpl
        3. SimpleSearch.SimpleSearch.currentPageTpl
        4. SimpleSearch.SimpleSearch.pageTpl
        5. SimpleSearch.SimpleSearch.tpl
      3. SimpleSearch.SimpleSearchForm
        1. SimpleSearch.SimpleSearchForm.tpl
      4. SimpleSearch.Solr
    120. SiteEditor
    121. sitemapFriend
    122. Slideshow Manager
      1. jgSlideshow Snippet
      2. Slideshow Manager CMP
    123. sLink
    124. SmartOptimizer
    125. SmartTag
    126. StatCache
    127. SocialLogin
    128. SocialSuite
      1. SocialSuite.getFacebookPhotos
      2. SocialSuite.getFacebookProfile
      3. SocialSuite.getFacebookShares
      4. SocialSuite.getGooglePlusShares
      5. SocialSuite.getTwitterProfile
      6. SocialSuite.prettyNumbers
    129. spieFeed
    130. StaticSaver
    131. StoreLocator
    132. SubscribeMe
      1. SubscribeMe.Configuring API Credentials, IPN and going Live
      2. SubscribeMe.Setting up the Payment Flow
        1. SubscribeMe - Listing the Products
        2. SubscribeMe - Setting up the Payment Methods
        3. SubscribeMe - Subscription Confirmation Page
      3. SubscribeMe.User Account Management
    133. SyntaxChecker
    134. Tagger
    135. TaggingAtoZ
    136. tagLister
      1. tagLister.getResourcesTag
      2. tagLister.tagLister
        1. tagLister.tagLister.all
        2. tagLister.tagLister.tpl
      3. tagLister.tolinks
        1. tagLister.tolinks.tpl
    137. TinyMCE
      1. TinyMCE.Spellchecker
      2. TinyMCE.Table controls
      3. TinyMCE.Template
    138. Upload to Users CMP
    139. VersionX
      1. VersionX.Roadmap
    140. virtuNewsletter
    141. VisionCart
      1. VisionCart.Back-end
        1. VisionCart.Category management
        2. VisionCart.Module management
        3. VisionCart.Option management
        4. VisionCart.Order management
        5. VisionCart.Product management
        6. VisionCart.Shop management
      2. VisionCart.Front-end
        1. VisionCart.vcGetCategories
          1. VisionCart.vcGetCategories.tpl
        2. VisionCart.vcGetProducts
          1. VisionCart.vcGetProducts.tpl
        3. VisionCart.vcWayfinder
      3. VisionCart.General
        1. VisionCart.Templating
        2. VisionCart.UserManagement
      4. VisionCart.vcGetProductImages
      5. VisionCart.vcGetProductOptions
    142. Wayfinder
      1. Wayfinder Introductory Examples
    143. xFPC

Lingua

Last edited by Novriko Parhusip on Mar 10, 2015.
This is a user-contributed Extra. If you find issues or would like more info or help, please contact the author.

A MODX's Lexicon switcher for front-end interface.
This can be downloaded from Manager's Package Manager.
The extra page is http://modx.com/extras/package/lingua.
Any issues can be reported to here: https://github.com/goldsky/Lingua/issues

Background

This package was written by goldsky, and first released on June 6, 2013, initially prepared for Adam Wintle of Monogon to create a Chinese and a Thai website.

This add-on was made to answer the need of creating a multilingual website without messing up with contexts.
The concept was based on Translations package, but independently developed from scratch and heading in different direction.

CMP

The Custom Manager Page is provided to manage the list of languages and their settings.

Plugin

The plugin is used to manage the cookie and session of the selected language.
This plugin then provides a placeholder [[+lingua.cultureKey]] for the page.
But to get this value for other snippet, like language selection of a email hook, the developer can use [[!lingua.cultureKey]] below.

Snippets

For front-end usage, Lingua has some utility snippets.
ALL snippets have &toArray to dump all the placeholders and &toPlaceholder to hold the output and store it into the given placeholder's name.

lingua.selector

This snippet is the language selector on the front-end.
The chunks have twitter bootstrap's dropdown-toogle style as default, just to give an idea of how they were prepared.

When the user clicks the link, then the page will be redirected back to the same page, but with additional REQUEST url to initiate the language session.
The REQUEST key can be defined in System Setting, but the default key is lang.

Properties

Name Description Example Default Value Options
tplWrapper the wrapper template chunk &tplWrapper=`chunkName` lingua.selector.wrapper chunk's name, @BINDINGs enabled
tplItem the item template chunk &tplItem=`chunkName` lingua.selector.item chunk's name, @BINDINGs enabled
sortby sort the output by a field name &tplItem=`lcid_string` id id, local_name, lang_code, lcid_string, lcid_dec
sortdir the direction of the sorting &sortdir=`ASC` asc asc, desc
phsPrefix placeholder's prefix to avoid conflict with other packages' placeholders &phsPrefix=`lingua.` lingua. (string)
codeField the field of which will be used as the value of the options &codeField=`lang_code` System Setting's lingua.code.field id, local_name, lang_code, lcid_string, lcid_dec

@BINDING in chunks means the developer can use:

  • chunk name
  • @FILE:[[++core_path]]path/to/chunk/file.tpl
  • @CODE:
    [[+lingua.languages]]

Default Chunks

lingua.selector.wrapper
<div class="container">
        <div class="btn-group">
                <button
                        class="btn btn-link btn-mini dropdown-toggle"
                        data-toggle="dropdown"
                        >[[%lingua.select_language]]
                </button>
                <ul class="dropdown-menu">
                        [[+lingua.languages]]
                </ul>
        </div>
</div>
lingua.selector.item
[[+lingua.cultureKey:is=`[[+lingua.lang_code]]`:then=``:else=`<li>
        <a href="[[+lingua.url]]" title="[[+lingua.local_name]]">
                <img src="[[+lingua.flag]]" alt=""/> [[+lingua.local_name]]
        </a>
</li>`]]

On this chunk, the default content tries to ignore the language of the current language using Output Filter.

lingua.cultureKey

This snippet to get the current active language.
This snippet only contains

return $modx->cultureKey;

No! It's different to

return $modx->getOption('cultureKey');

This snippet is the most important part to grab the language's lexicons.

Version 1: Please notice the exclamation mark in front of the %login. The lexicon must be +UN+CACHED.

[[!%login? &namespace=`Login` &language=`[[!lingua.cultureKey]]`]]

Version 2: Lingua has its own cache folder. All translated pages are stored on different files, so everything can be cached.

[[%login? &namespace=`Login` &language=`[[lingua.cultureKey]]`]]

lingua.getField

This snippet is to get the value of the Lingua's language setting for the running language on the page.
The value will be switched to the selected active language.

Properties

Name Description Example Default Value Options
field any field to be selected &field=`date_format_lite` all available fields: id, active, local_name, lang_code, lcid_string, lcid_dec, date_format_lite, date_format_full, is_rtl, flag
codeField the field of which will be used as the value of the options &codeField=`lang_code` System Setting's lingua.code.field id, local_name, lang_code, lcid_string, lcid_dec
Examples
Created on: [[*createdon:date=`[[!lingua.getField? &field=`date_format_lite`]]`]]

lingua.getValue

This snippet is to get any of resource's translated field for the running language on the page.
The value will be switched to the selected active language.

Properties

Name Description Example Default Value Options
field the "key" name, or the field's name in database. required * &field=`pagetitle` Main fields: pagetitle, longtitle, description, alias, link_attributes, introtext, content, menutitle, uri, uri_override, properties
or any Template Variable's name
id The id of the resource to get the value from &id=`[[+snippetPrefix.id]]` Current resource integer
Examples
On your wayfinder's rowTpl, change the placeholder, like this:
<li[[+wf.id]][[+wf.classes]]>
    <a href="[[+wf.link]]" title="[[+wf.title]]" [[+wf.attributes]]>
        <-- [[-+wf.linktext]] -->
        [[lingua.getValue:default=`[[+wf.linktext]]`? &id=`[[+id]]` &field=`pagetitle`]]
        <!-- rowTpl -->
    </a>
    [[+wf.wrapper]]
</li>

Version 2.0.0+

Since version 2, Lingua now stores clone resource's content, the main content and all defined Template Variables.

Template Variables :

You need to go to Custom Manager Page (Components > Lingua), and define which TV that will be available for translation.

Standard MODX fields (pagetitle, content, etc.) :

You also need to define additional setting for particular context that will use Lingua.
On your resource tree navigation > right click > edit context.

Editing the Context

Right click on the context where Lingua should run, then click "Edit context":

Then add this setting on the "Context Settings" tag:

  • key: modRequest.class, value: LinguaRequest

After it is saved, you will see the setting on the grid like this.

Multiple contexts :

To have different languages set for different context, you can add this setting as well:

  • key: lingua.langs, value: en,de,...

This setting will override Custom Manager Page's setting of which languages are active.

<= Version 2.0.0-beta3

On the plugin itself, you would also need to set to which context this plugin should run, on your element tree navigation > Plugin > Lingua category/folder > click Lingua plugin.

On its "Properties" tab, click "Default Properties Locked" button, and change this:

  • name: lingua.contexts, value: web, your_other_context1, your_other_context2

Version 2.0.0-rc1

On this version, the settings have been moved over to MODX's System Settings instead, to avoid overriding on upgrading.

Template Variable's Cloning Patterns

On cloning Template Variables, Lingua duplicate the input forms of the TVs. To avoid Javascript confliction, Lingua changes any IDs on their html/js codes.

You need to create new ones, if you are using custom TVs.

Go to CMP, select "Template Variables" tab, then select "Cloning Patterns".

You will find pre-existing core TVs' patterns, and MIGX's patterns as example.

You can either create a new one, or duplicate existing one by right-click select the row.

To find out what IDs you need to set, you need to find them out from the TV's template.

By following " Adding a Custom TV Type - MODX 2.2" tutorial, the input form templates should have been created under "core/components/ourtvs/tv/input/tpl/" folder.

You can find some IDs that are defined as {$tv->id}. Add that parts into our Cloning Patterns database.

Limitation

Because of the basic concept of Lingua, which is cloning the default MODX's content for other languages, you can not expect to have different site structure on secondary languages.

For that purpose, Babel wins.

Incompatibility

Lingua is not compatible with any custom Template Variables that store the values outside of MODX's TV database.

It's known incompatible with:

Suggest an edit to this page on GitHub (Requires GitHub account. Opens a new window/tab).