language translation using array

12 posts by 3 authors in: Forums > CMS Builder
Last Post: November 4, 2013   (RSS)

By ht1080z - October 21, 2013 - edited: October 21, 2013


I created a multi section with keyphrase, title_en, title_gr, title_hu fields and stored some strings for translation data, example:

keyphrase: login
title_en: Login
title_gr: Είσοδος
title_hu: Bejelentkezés

My selected language is stored in $_SESSION['language'] = "gr";
and i use to get my desired language from tables for example: $blog['title_'.$_SESSION['language']];

Is there any easy way to create a php translation function that search for translation in my array giving the key phrase and return with the translation of the used language?

<?php echo translation('login'); ?> and return with "Είσοδος"?

Please advise,

By ross - October 24, 2013

Hi Karls

Thanks for posting! I feel like I understand what you are looking for here and have an idea. If it doesn't take too much work to change, in your multi section have the fields like this:


Then, you can use the <?php echo translation('login'); ?> function. The code in your translation function will look something like this:


function translation($keyphrase) {

    $language = $_SESSION['language'];

    $translation = mysql_select("TABLE NAME", "keyphrase = '$keyphrase'");

    return $translation[$language]; 


You will need to put the name of your keyphrase table where I have "TABLE NAME".You'll also need to be using CMS Builder version 2.08 or higher to use the mysql_select function.  

Does this make sense? Do you want to give it a shot and let me know how you make out? Thanks!

Ross Fairbairn - Consulting

Hire me! Save time by getting our experts to help with your project.
Template changes, advanced features, full integration, whatever you
need. Whether you need one hour or fifty, get it done fast with
Priority Consulting:

By ht1080z - October 24, 2013 - edited: October 25, 2013

Hello Ross,

Thank you for your help and your time on this.

I changed some things i the script you provide so i can make it work in my case:

function translation($keyphrase) {
    $language = $_SESSION['language'];
    $translation = mysql_select("language", "keystr = '$keyphrase'"); $trans = @$translation[0];
    return $trans['title_'.$language];

Its working exactly like i imagined!

I have one more question; my translation table in the database is for no more than 500 records.

What is faster for the server when calculate php and mysql:
- load the whole translation table at the head of every page and find the keyphrases than  return the translation in the memory or
- select every time from the translation table with mysql select (like in this solution)?

Thank you again,

By ht1080z - October 30, 2013

Hello Dave,

Thank you for your reply and
Can you give me some guidelines to modify this function to make it work from loaded array?

I assume first i need to load the translation table to array and then find with foreach...

Thank you in advance,

By Dave - October 31, 2013

HI Karlz, 

Can you give me some guidelines to modify this function to make it work from loaded array?

I assume first i need to load the translation table to array and then find with foreach...

You'll have to experiment to figure out exact code, but you here's a code snippet to load $records the first time a function is called and have it available after that without reloading.

// load $records the first time this function is called
static $records;
if (!isset($records)) { $records = mysql_select('your_table_name'); }  // 

The PHP keyword "static" basically means "remember the value of this variable the next time this function is called".  PHP Docs:

So basically the first time the function is called it will load $records and then it will be available after that without needing to be reloaded.

Hope that helps!

Dave Edis - Senior Developer

By ht1080z - October 31, 2013

Hello Dave,

thank you for your help, that was exactly what i needed i think.

I came up with this and its working.

function translate($keyphrase) {
    static $transRecords;
    if(!isset($transRecords)) { $transRecords = mysql_select('language'); }
    $language = $_SESSION['language'];
    for($i=0; $i<sizeof($transRecords); $i++)
        $row = @$transRecords[$i];
        if($row['keystr'] === $keyphrase )
            return $row['title_'.$language];       

Please review the above script if you have more time on this.

Thank you again,

By Dave - November 1, 2013

Hi Karlz, 

Looks good!  If there's not too many language records and it's fast enough on the server I'd just leave it as is.  

If you want to make it faster you could try create an associative array of keystring values to records so you didn't need to loop over them every time.  PHP's associative array lookup code is likely a lot faster.  We actually have a utility function that does that called array_groupBy().  So your code might be something like this (untested): 

function translate($keyphrase) {
    static $transRecords;
    if(!isset($transRecords)) {
      $transRecords = mysql_select('language');
      $transRecordsByKeystr = array_groupBy($transRecords, 'keystr');

    return @$transRecordsByKeystr[$keyphrase][ 'title_' . @$_SESSION['language'] ];

Hope that helps, let me know if that works.  

Dave Edis - Senior Developer

By ht1080z - November 3, 2013

Hi Dave,

Thank you for your reply.

I tried the suggested array_groupBy() solution to achieve better performance but it working only for the first call of the function, on every other calls in the same page, nothing returns.


By Dave - November 3, 2013

Hi Karlz,

Sorry, we'll need to make that new variable static too.  Try this:

static $transRecords;
static $transRecordsByKeystr;

Hope that helps!

Dave Edis - Senior Developer