New Community Website

Ordinarily, you'd be at the right spot, but we've recently launched a brand new community website... For the community, by the community.

Yay... Take Me to the Community!

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.

Localization Editor v 03.04.00

Hi all. Time for an update on the Localization Editor. In case you’re not familiar with this project, it is a tool to help you create language packs of your favorite DNN bit. Whether the core or a module. This new version of the editor aims to support something called CORE and FULL packs for the DNN core. Allow me to explain what’s going on.

A brief history of the full pack

Back when static localization was introduced (DNN 3) the distribution zip of DotNetNuke included a whole bunch of modules that were automatically installed. So when the opportunity was created to make a translation of DNN and upload it (as a so-called language pack), the translator was faced with the daunting task of not only translating all the core tidbits of DNN, but also each and every module that came with it. Pretty soon you saw the emergence of two types of packs: the CORE and the FULL pack. You probably guessed it. The FULL pack included all modules and the CORE didn’t. So far so good. People were comfortable with this division and who could blame a translator for not wanting to translate the forum module which, on it’s own, was about the same amount of work as the complete core at the time.

Later on, we discovered that the amount of stuff you have in the bin folder (i.e. all the module dlls and the core) has an impact on performance. So in an effort to improve performance and to “clean up” DNN introduced the “optionally installed” packaging in DNN 4. This meant that modules that were packaged as zip would get installed and those that were renamed to .resources were kept “at hand” and you could install them by checking a checkbox. This had one quirky impact on the language pack domain: when you installed a FULL pack and you did not have some modules installed, the installer would happily create the necessary folders for the localization files and dump them there. As there was no impact on anything (performance or otherwise) this was never seen as an issue and we all happily continued.

Then DNN 5 came along. And with DNN 5 we got a new installer. And as is often the case: those that designed this bit were not used to making or installing language packs on a daily basis. The new installer made everything a “package”. A package contains 1 or more items to install. A feature of this new approach is that you are assumed to “package” all your bits into a single file and properly announce them in one manifest. This means that if you upload a language pack consisting of more than one pack (e.g. core plus several modules) you list them all in the manifest. The manifest also required a much more rigorous approach to anything being uploaded. This included having language packs bound to a “parent” package. It’s easy to see the advantage of this approach. But when you now make a FULL pack and follow the rules and make that a collection of packs in a single package, the installer will refuse to install it unless all items are installed. And it will fail the complete package! By its very design the installer assumes you install packs one by one for each bit. Now we add a second complexity at this point.

DNN 5 also broke off quite a few bits that were previously integrated. If you check out the Install folder of a distribution zip you’ll see what I mean. This now includes a whole bunch of providers. All of these are separate packages. It’s a really great feature as you can roll out a lean DNN with providers of your own choosing. But unfortunately it meant that if you were to follow the rules and upload language packs for each bit of the core, you’d end up uploading something like 20 packs for each language. So it’s hardly surprising that since the early days of DNN 5 we have heard some resentment from the DNN translators.

Moving forward

With DNN 6 we hope the issue of the installer failing on a compound package will be resolved. I.e. if one of the packs has a dependency on an object that is not there, the installation of the complete pack should not fail. This is an important step to support FULL packs in the future again. For DNN 5 it is too late. The only way to install full packs in DNN 5 is to package it all together in one pack which you label as being a core pack. It’s not pretty but there is no other way for now.

Implications for Localization Editor

The localization editor was not previously well equipped to deal with compound packs. This came down to the fact that each version of DNN can have a different set of items (modules, providers, skins, etc) that are installed by default. So the first thing to do was to implement some kind of bookkeeping. This is done in the new table LocalizationEditor_ObjectCoreVersions. There we keep track of every object that is distributed as zip (i.e. installed by default) with the core version. If you already have the Localization Editor running with stuff in it, you’ll need to somehow make the records yourself if you want to benefit from this aspect. If you start from scratch I’ve made a complete SQL script to add ALL core distributed texts for all DNN 5 versions! In the first lines you’ll see ModuleId being added so you need to change the value of that for the module ID of the localization Editor you’re targeting (find out the module id if any module by clicking “Module Settings” and examining the querystring where you’ll see a value for ModuleId). If you run this under Host > SQL … you’ll probably see an error if you haven’t allowed for uploads bigger than 8 Mb as this file is 9 Mb long! So set the maxRequestLength in your web.config to something a little bigger. Anyway, if you use this you can hit the road running and have a Localization Editor ready to start receiving your translations. Note you must add at least 1 permission (i.e. binding a user as translator to a specific locale code) before you see the list of objects in the editor:



Pack Upload

In this version I’ve also spent some time on language pack uploads. It used to be hidden on the object details screen but now it is on the main screen:


Follow the instructions on screen to upload an existing pack. This will allow you to migrate your old packs into this new system. Lots of time has been spent looking at various packs to see how they were made to come up with a solution that is able to parse all these packs.

Pack Generation

In the new version downloading a DNN core pack brings up the following on your screen:


As you can see you can now download the core or the full pack. The CORE pack will include all objects that were installed by default and the FULL pack will include every object that came with the release. This also takes into account the version numbers of those specific objects.

Final words

The downloads can be found on CodePlex:


The development is done by myself. The DotNetNuke Internationalization team is involved as peer group. If you have any comments talk to one of us. We realize this is not a “perfect” translation tool, but we all have limited time to devote to this project and our aim is to provide a mechanism with which you can manage language packs.


Comment Form

Only registered users may post comments.


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Davies (3)
Alex Shirley (10)
Andrew Hoefling (3)
Andrew Nurse (30)
Andy Tryba (1)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (37)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Bogdan Litescu (1)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (213)
Chris Paterra (55)
Clint Patterson (108)
Cuong Dang (21)
Daniel Bartholomew (2)
Daniel Mettler (181)
Daniel Valadas (48)
Dave Buckner (2)
David Poindexter (12)
David Rodriguez (3)
Dennis Shiao (1)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (80)
Francisco Perez Andres (17)
Geoff Barlow (12)
George Alatrash (12)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (274)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Kelly Ford (4)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matt Rutledge (2)
Matthias Schlomann (16)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Miguel Gatmaytan (3)
Mike Horton (19)
Mitchel Sellers (40)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Oliver Hine (1)
Patricio F. Salinas (1)
Patrick Ryan (1)
Peter Donker (54)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Sacha Trauwaen (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott Schlesier (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Steven Fisher (1)
Timo Breumelhof (24)
Tony Henrich (3)
Torsten Weggen (3)
Tycho de Waard (4)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (40)
Will Strohl (180)
William Severance (5)
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out