Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
100.00%
1 / 1
100.00%
5 / 5
CRAP
100.00%
17 / 17
I18n
100.00%
1 / 1
100.00%
5 / 5
8
100.00%
17 / 17
 __construct(\Scrivo\String $langCode, \Scrivo\String $dir=null)
100.00%
1 / 1
3
100.00%
10 / 10
 offsetGet($i18nKey)
100.00%
1 / 1
2
100.00%
1 / 1
 offsetSet($offset, $value)
100.00%
1 / 1
1
100.00%
2 / 2
 offsetExists($offset)
100.00%
1 / 1
1
100.00%
2 / 2
 offsetUnset($offset)
100.00%
1 / 1
1
100.00%
2 / 2
<?php
/* Copyright (c) 2012, Geert Bergman (geert@scrivo.nl)
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of "Scrivo" nor the names of its contributors may be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* $Id: I18n.php 711 2013-07-04 12:05:36Z geert $
*/
/**
* Implementation of the \Scrivo\I18n class.
*/
namespace Scrivo;
/**
* Class for Scrivo internationalization (i18n) resources.
*
* This is a class to create a set of i18n key value pairs. By default the
* created instance will use Scrivo's own set of i18n resources, but it is
* possible to use your own set(s).
*
* An i18n resource file is a PHP script that declares a single array
* variabele ($I18N_TEXT) that contains the i18n key value pairs, where the
* keys are the english texts and the values contain the translations, f.i.
* the file "nl_NL.php" might contain the following:
*
* <?php $I18N_TEXT = array("Cancel" => "Annuleer"); ?>
*
* The file name needs to be named after the language set it contains:
* "nl_NL.php" contains the Dutch i18n resources. It is of course strongly
* advised to use the UTF-8 encoding for your internationalization files.
*
* Because we're dealing with hard coded data and it will be excessively
* cumbersome to deal I18N keys if you'll have to use the \Scrivo\String wrappers,
* you can use plain strings as i18n keys.
*
* Typical usage:
*
* $i18n = new \Scrivo\I18n(new \Scrivo\String("nl_NL"));
* echo $i18n["Cancel"];
*/
class I18n implements \ArrayAccess {
/**
* The i18n key value pairs, where the keys are the English texts and
* the values contain the translations.
*
* @var array
*/
private $data;
/**
* Create a set of internationalization key/value pairs for a given
* language.
*
* @param \Scrivo\String $langCode The language code for which to create the
* set of resources for.
* @param \Scrivo\String $dir An optional directory for an alternative
* location for the i18n resource file.
*
* @throws \Exception If no 1i8n resource file was found.
*/
function __construct(\Scrivo\String $langCode, \Scrivo\String $dir=null) {
if (!$dir) {
// The location of Scrivo UI language keys.
$dir = dirname(__FILE__)."/I18n";
}
// Sanitize the file name for security reasons.
$file = $dir."/".preg_replace("/[^_a-zA-Z]/u", "", $langCode).".php";
if (file_exists($file)) {
require $file;
$this->data = $I18N_TEXT;
} else {
// TODO: only when in debug mode
//throw new \Exception("I18n recourse file '$file' was not found.");
$this->data = array();
}
}
/**
* Get an i18n entry from a set using array brackets.
*
* Note that this method is part of the implementation of ArrayAccess and
* should not be called from another context.
*
* @param string $i18nKey A character offet in the string.
*
* @return string The translation of the key, or the key if the key
* was not found.
*/
public function offsetGet($i18nKey) {
return isset($this->data[$i18nKey]) ? $this->data[$i18nKey] : $i18nKey;
}
/**
* Illegal method: set a character at a specified index location.
*
* Note that this method is part of the implementation of ArrayAccess.
* I18n sets are inmutable so this method implementation is not relevant
* and throws an exception if called.
*
* @param int $offset
* @param string $value
*
* @throws \Scrivo\SystemException If this method is called.
*/
public function offsetSet($offset, $value) {
throw new \Scrivo\SystemException(
"offsetSet can't be called on I18n objects");
}
/**
* Check if the specified index location in this string is valid.
*
* Note that this method is part of the implementation of ArrayAccess.
* It is assumed that i18n keys are always set: if not it is pretended
* it's set and key itself is returned. So this method implementation is
* not relevant and throws an exception if called.
*
* @param int $offset
*
* @throws \Scrivo\SystemException If this method is called.
*/
public function offsetExists($offset) {
throw new \Scrivo\SystemException(
"offsetExists can't be called on I18n objects");
}
/**
* Illegal method: unset a character at a specified index location.
*
* Note that this method is part of the implementation of ArrayAccess.
* I18n sets are inmutable so this method implementation is not relevant
* and throws an exception if called.
*
* @param int $offset
*
* @throws \Scrivo\SystemException If this method is called.
*/
public function offsetUnset($offset) {
throw new \Scrivo\SystemException(
"offsetUnset can't be called on I18n objects");
}
}