Weird behaviors with Processwire Site Translation Files / Code Internalization

3 posts in this topic

Hi Guys

I have a problem with the Code Internationalization (Site Translation Files) in Processwire. I am using the method Ryan is describing in this topic and also the normal way of translating files. The weird behaviors are that translations are just gone after a change in the main translation file called _strings (uses Ryan method). Or some other weird behavior was, that the english translation of the _strings file were somehow ported inside the german _strings file. I really don't know what could cause this. Have ever witnessed something like that? 

I have made some thoughts about this whole Code Internalization thing in ProcessWire and I am thinking to go another way (don't get me wrong, it's perfect for small to mid projects but in my opinion it is just a overkill for big projects), because at the beginning the strings we needed to translate were splitted up in many files which produced many site translation files to translate per language. It was just to much and confusing for the customer (and also for me), so that we needed another approach. So I tried Ryans method with one central translation files. The problem with this one is that it also gets confusing since it is a very big amount of strings to translate and also the problems described above. So for know I will try to make approach to store the strings in Pages. All translations of a string would be stored side by side. I know that this is probably more complex behind the scenes but it is far easier for the customer (especially with ListerPro). And I also like the idea of having the translations inside the DB instead in form of Files.

What are your thoughts about it? Have ever done something like that?



Share this post

Link to post
Share on other sites

I tried to make a function, which I can fetch translations from a page by it's name field.

Features of the function:

  • Fetches translations from page title (multilanguage).
  • Outputs an edit link to the Translation Page (doesn't output it when 2nd argument is false)
  • When the translation page you are referencing is not found, it outputs an error and also the absolute path to the php file were the function was executed by using debug_backtrace function of PHP.

Benefits of this approach:

  • You have full access to the ProcessWire API in terms of manipulating the translation data
  • Translations of single Strings in different languages are side by side (tabs)
  • Searching of single Translations is easy with Listers (I know search of site translation files is supported in PW3 but not in PW2, and I am using PW 2.7.3)
  • Usability is far better since the users doesn't have to fiddle around in the system languages itself.

Possible disadvantages:

  • Little overhead when using the function, since it always loads a page behind the scenes when the function is used. (I had used 8-13 function calls inside a template file and doesn't had noticed any performance issues (bless processwire)).
function _gt($key, $edit = TRUE){
    $link = "";
    $tracemessage = "";
    $string = "";

    $translationPage = wire('pages')->get("template=translation, name=$key");
      if($edit && wire('user')->isLoggedin()){
          $editlink = " <a style='color:green;' target='_blank' href='".$translationPage->editUrl()."'>[Edit]</a>";
      $string = $translationPage->title.$editlink;
        $trace = debug_backtrace();
        $tracemessage = "(".$trace[0]["file"].")";
      $string = "<span style='color:white;background-color:red;padding:5px;'>[Not Found: '".$key."'] $tracemessage</span>";

    return $string;



echo _gt("akkreditierung");
echo _gt("fachgebiete-doctor");



And when it fails to find the translation page:


Edited by Nukro
Function Rewrite, better explanation of use

Share this post

Link to post
Share on other sites

I am quite happy with translation options included in PW.

Translatable strings like

$out = $this->_("Live long and prosper");  // syntax within a class (modules)
$out = __("Live long and prosper!"); // syntax outside of a class (templates)

are useful for modules and (rarely) in the template system.

To make them accesible globally I define a page property in my _init.php file which is prepended to each template.

 * define globally used translatable strings here
$page->__read_more = __('
$page->__submit = __('Submit');


Furthermore I use some language related functions (language specific date and time formats). These functions are placed in which is included by the _init.php

// Include shared functions

Everything else is content and should be stored in multilanguage fields. (text, textarea, optionselect)

2 people like this

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By Harmen
      Hey all,
      For my website I had to make a connection with an external DB. In that DB there are categories of products in different languages, and I want to import these categories in the languages that are available in processwire, I can do that with a very long code but I want to make it shorter. So I wrote a function to get the categories, but the different languages of the category names not, only if I insert the ISO-code hard-code. So here is my code:
      protected function get_category() { $languages = wire("languages"); try { $prestashp = $this->get_dbPrestashop(); foreach($languages as $language) { $iso_code= $language->name ; $categories = $prestashp->query( "SELECT l.id_lang, l.iso_code, cl.description, AS category_title, cl.id_shop,, c.id_category, c.id_parent, c.position, cl.link_rewrite FROM ps_category c INNER JOIN ps_category_lang cl ON c.id_category=cl.id_category LEFT JOIN ps_lang l ON cl.id_lang=l.id_lang WHERE'1' AND cl.id_shop='1' AND c.id_parent = '2' ORDER BY c.position "); } }catch(Exception $e) { $this->message('Failed to show categories. Try again later.'); return false; } return $categories; }  
      So in the DB there is Deutsch, Dutch, English(default), Spanish, Italian. And when I edit the template the different languages of the category names need to be imported in the right tab of the field. As you can see, there are language tabs above the field, and the names of the category in that language need to be insterted there. 
      Anyone have an idea how I can fix this?
    • By heldercervantes
      I've had this happen before, but now I got this problem again and I'm wondering what it's about.
      I use the basic <?= __('Contacte-nos') ?> method for adding translatable text to templates. Some of these are not appearing on the form when I edit the file's translations in PW.
      Take this line of code:
      <?= __('1 ou +7 pessoas?') ?> <a href="#" class="contactsMenu"><?= __('Contacte-nos') ?></a> The first string "1 ou +7 pessoas?" appears when I edit the translations, but the second one doesn't. Eventually I figured out I can only have one of these per line of code. Adding a line break somewhere somewhere between them was enough to make both translations show up in the form.
      Problem solved, but curiosity remains. What is the reason for this?
    • By Nukro
      Hi Everyone
      Can I change the type of the title field from PageTitleLanguage to PageTitle per template and not only global? 
    • By Nukro
      Hi Guys
      I'am trying to output the localized month names in french, german and italian for my newsletter. At the moment my default language is french.
      This code outputs everytime time the french month name:
      foreach ($languages->find("name!=en") as $language) { $user->language = $languages->get($language->name); switch ($language->name) { case 'default': $date = strftime("%d. %B %G", $page->date). "-FR/DEFAULT"; break; case 'de': $date = strftime("%d. %B %G", $page->date). "-DE"; break; case 'it': $date = strftime("%d. %B %G", $page->date). "-IT"; break; } echo $date."<br />"; } output looks like this:
      31. mars 2016-FR/DEFAULT
      31. mars 2016-DE
      31. mars 2016-IT
      I also have set the right locale inside every language translation file. How can I fix this, that it looks like this:
      31. mars 2016-FR/DEFAULT
      31. März 2016-DE
      31. marzo 2016-IT
    • By kamil
      Hello everyone,
      in the first line I need to say, that I am NO developer or programmer.
      I am just a german language translator and interpreter who is seeking for help.
      The freelancer who created a website (

      I have tried to change the code in this line: <a href="'.$page->siteurl.'">. I managed to get the link work but just for one language. If I changed the language version the link showed me always the same version.

      Can someone tell me if someone like me without any knowledge in this matter can handle it to get this thing done?
        fix a problem with 'SEO boxes' visible here''>'> at the bottom (looks like radio button); the code was copied from the home page, where these SEO buttons are OK; I need this section to be usable wherever I wish to paste it;

      Can sombody tell me the reason for this and help me fix it? Thank you in advance!