<?php
/**
 * Zend Framework (http://framework.zend.com/)
 *
 * @link      http://github.com/zendframework/zf2 for the canonical source repository
 * @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
 * @license   http://framework.zend.com/license/new-bsd New BSD License
 */

namespace Zend\Config\Processor;

use 
Zend\Config\Config;
use 
Zend\Config\Exception;
use 
Zend\I18n\Translator\Translator as ZendTranslator;

class 
Translator implements ProcessorInterface
{
    
/**
     * @var ZendTranslator
     */
    
protected $translator;

    
/**
     * @var string|null
     */
    
protected $locale null;

    
/**
     * @var string
     */
    
protected $textDomain 'default';

    
/**
     * Translator uses the supplied Zend\I18n\Translator\Translator to find
     * and translate language strings in config.
     *
     * @param  ZendTranslator $translator
     * @param  string $textDomain
     * @param  string|null $locale
     */
    
public function __construct(ZendTranslator $translator$textDomain 'default'$locale null)
    {
        
$this->setTranslator($translator);
        
$this->setTextDomain($textDomain);
        
$this->setLocale($locale);
    }

    
/**
     * @param  ZendTranslator $translator
     * @return Translator
     */
    
public function setTranslator(ZendTranslator $translator)
    {
        
$this->translator $translator;
        return 
$this;
    }

    
/**
     * @return ZendTranslator
     */
    
public function getTranslator()
    {
        return 
$this->translator;
    }

    
/**
     * @param  string|null $locale
     * @return Translator
     */
    
public function setLocale($locale)
    {
        
$this->locale $locale;
        return 
$this;
    }

    
/**
     * @return string|null
     */
    
public function getLocale()
    {
        return 
$this->locale;
    }

    
/**
     * @param  string $textDomain
     * @return Translator
     */
    
public function setTextDomain($textDomain)
    {
        
$this->textDomain $textDomain;
        return 
$this;
    }

    
/**
     * @return string
     */
    
public function getTextDomain()
    {
        return 
$this->textDomain;
    }

    
/**
     * Process
     *
     * @param  Config $config
     * @return Config
     * @throws Exception\InvalidArgumentException
     */
    
public function process(Config $config)
    {
        if (
$config->isReadOnly()) {
            throw new 
Exception\InvalidArgumentException('Cannot process config because it is read-only');
        }

        
/**
         * Walk through config and replace values
         */
        
foreach ($config as $key => $val) {
            if (
$val instanceof Config) {
                
$this->process($val);
            } else {
                
$config->{$key} = $this->translator->translate($val$this->textDomain$this->locale);
            }
        }

        return 
$config;
    }

    
/**
     * Process a single value
     *
     * @param $value
     * @return mixed
     */
    
public function processValue($value)
    {
        return 
$this->translator->translate($value$this->textDomain$this->locale);
    }
}