Fork me on GitHub

Translations

Translations in Hathoora PHP Framework are database driven (and cached) which makes it easy to modify content without any code release. In addition translations can also be used for creating static pages quickly without having to deploy any code.

Database Schema

Following is the required database schema for translations.

            
            CREATE TABLE `translation_key` (
              `translation_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
              `translation_key` varchar(105) NOT NULL,
              `notes` varchar(255) NOT NULL,
              PRIMARY KEY (`translation_id`),
              UNIQUE KEY `item_UNIQUE` (`translation_key`)
            ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;


            CREATE TABLE `translation_route` (
              `translation_id` int(11) NOT NULL,
              `route` varchar(150) NOT NULL,
              PRIMARY KEY (`translation_id`,`route`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;


            CREATE TABLE `translation_value` (
              `translation_id` int(11) NOT NULL,
              `language` varchar(5) NOT NULL,
              `translation` longtext NOT NULL,
              PRIMARY KEY (`translation_id`,`language`)
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
            # Sample data
            INSERT INTO `translation_value` VALUES (1,'en_US','Hello, {{name}}'),(1,'fr_FR','Bonjour, {{name}}'),
                                                   (2,'en_US','Today is: {{date}}'),(2,'fr_FR','aujourd\'hui: {{date}}'),
                                                   (3,'en_US','Link to hathoora'),(3,'fr_FR','lien vers hathoora'),
                                                   (4,'en_US','Name is trimmed: "{{name|trim}}"<br />
<br />
Custom filter: "{{name|customFilter(3)|trim}}"'),(4,'fr_FR','nom est coupé: "{{name|trim}}"<br /> <br /> Filtre Personnalisé: "{{name|customFilter(3)|trim}}"');
            INSERT INTO `translation_route` VALUES (2,'hathoora_translation_route'),(3,'hathoora_route_example_title');
        
    

Configuration

Enable configuration in configuration like so

        
            # File config.yml

            hathoora:
                translation:
                    enabled: 1
                    cache_service: @cache@
                    cache_time: 86400
                    dsn: default

                    # display empty translations keys, good for debugging
                    show_empty: true # default value
                    languages: [ en_US, fr_FR ]
                    default_language: en_US

                    # for debugging show translations keys, in below configuration passing
                    # tkDebug=1 would show tks for debugging
                    debug:
                        # GET, HEADER
                        method: GET
                        parameter: tkDebug

                # where cache service is defined as
                cache:
                    debug: 1
                    pools:
                        common: { driver: 'memcache', servers: [{host: "localhost", port: 11211}]}
        
    

hathoora.translation.enabled = 1 adds a translation service. We also passed a cache service so we do not hit database for every fetch. We also specified language we are supporting.

You can now use translation service like so:

        
            // get translation for hathoora_hello_world
            $helloTranslation = $this->getService('translation')->t(
                'hathoora_hello_world', array('name' => 'World')
            );

            // get translations for route
            $routeTranslations = $this->getService('translation')->getRouteTranslations('hathoora_translation_route',
                array(
                    'hathoora_route_example_title' => array(
                        'date' => date('m/d/y H:i:s')
                    ),
                    'hathoora_route_example_body' => array(
                        'link' => 'http://hathoora.org'
                    )
                )
            );
        
    

To learn more about translations, filters and to see translation in action click here.

Page Took:         6.34 msec
Page Memory:   518.38k
docs / viewController / view (200)
Request UUID: 5c6918602e8024.65705441
Get
Post
Cookies
Files
Session
Server
Response
No data.
No data.
No data.
No data.
No data.
REDIRECT_HATHOORA_ENV
prod
REDIRECT_STATUS
200
HATHOORA_ENV
prod
HTTP_HOST
www.hathoora.org
HTTP_X_FORWARDED_FOR
3.80.60.248
HTTP_X_REAL_IP
3.80.60.248
HTTP_CONNECTION
close
HTTP_USER_AGENT
CCBot/2.0 (https://commoncrawl.org/faq/)
HTTP_ACCEPT
text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
HTTP_IF_MODIFIED_SINCE
Thu, 13 Dec 2018 11:26:58 GMT
HTTP_ACCEPT_ENCODING
gzip
PATH
/sbin:/usr/sbin:/bin:/usr/bin
SERVER_SIGNATURE
Apache/2.2.15 (CentOS) Server at www.hathoora.org Port 80
SERVER_SOFTWARE
Apache/2.2.15 (CentOS)
SERVER_NAME
www.hathoora.org
SERVER_ADDR
192.168.1.11
SERVER_PORT
80
REMOTE_ADDR
207.126.164.119
DOCUMENT_ROOT
/var/websites/hathoora.org/docroot
SERVER_ADMIN
webmaster@hathoora.org
SCRIPT_FILENAME
/var/websites/hathoora.org/docroot/index.php
REMOTE_PORT
52656
REDIRECT_URL
/docs/v1/translations
GATEWAY_INTERFACE
CGI/1.1
SERVER_PROTOCOL
HTTP/1.0
REQUEST_METHOD
GET
QUERY_STRING
REQUEST_URI
/docs/v1/translations
SCRIPT_NAME
/index.php
PHP_SELF
/index.php
REQUEST_TIME_FLOAT
1550391392.189
REQUEST_TIME
1550391392
Status: 200
Headers:
Content-Type
text/html; charset=UTF-8
Configutation
Key Value
app.admin
Array
(
    [pattern] => /admin(|/)
    [directory] => hathoora
    [namespace] => hathoora\admin
)
app.docs
Array
(
    [pattern] => /docs(|/)
    [directory] => hathoora
    [dispatcher] => Array
        (
            [class] => customDispatcher
            [method] => dispatch
        )

)
app.site
Array
(
    [default] => 1
)
hathoora.logger
Array
(
    [profiling] => Array
        (
            [enabled] => 1
        )

    [logging] => Array
        (
            [enabled] => 1
            [level] => DEBUG
        )

    [webprofiler] => Array
        (
            [enabled] => 1
            [system] => 
            [show_redirects] => 
        )

)
hathoora.template
Array
(
    [engine] => Array
        (
            [name] => Stuob
        )

)
hathoora.database
Array
(
    [default] => mysql://dbuser:dbpassword@dbhost:3306/dbname
)
services.container
Array
(
    [class] => \hathoora\container
    [method] => getContainer
)
Logging (14)
hathoora.logger.logging.enabled: 1
# Time (msec) Level Memory (KB) Message
1 2.335 DEBUG 309.77 Configuration loaded:
Array
(
    [0] => app_prod.yml
    [1] => config_prod.yml
)
2 2.612 DEBUG 323.38 Listener "kernel.terminate[webprofiler]" has been added because of hathoora.logger.webprofiler.enabled
3 2.795 DEBUG 326.77 Event kernel.ready has been registered.
4 3.012 DEBUG 335.15 Calling App dispatcher (Array ( [class] => customDispatcher [method] => dispatch ) )...
5 3.174 DEBUG 349.56 Event kernel.route has been registered.
6 3.433 DEBUG 378.93 Event kernel.controller has been registered.
7 3.482 DEBUG 379.88 Calling controller (\docs\controller\viewController::view) with following params
Array
(
    [0] => v1
    [1] => translations
)
8 4.118 INFO 467.23 Template (docs/v1/translations.tpl.php) loaded
9 4.579 INFO 477.53 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/htmlMeta.tpl.php) loaded
10 4.710 INFO 478.78 Template (/var/websites/hathoora.org/app/hathoora/docs//resources/templates/components/flashMessages.tpl.php) loaded
11 5.939 INFO 440.17 Template (docs.tpl.php) fetched.
12 6.001 DEBUG 439.77 Event kernel.response has been registered.
13 6.042 DEBUG 440.95 Event kernel.terminate has been registered.
14 6.153 DEBUG 444.17 Event kernel.terminate->webprofiler has been notified.
Profiling
template
# Time (msec) Name Cached Took (msec)
1 3.585 docs.tpl.php 0 2.223