Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 创建函数以确定和设置应用程序语言的正确位置_Php_Database_Zend Framework2_Locale - Fatal编程技术网

Php 创建函数以确定和设置应用程序语言的正确位置

Php 创建函数以确定和设置应用程序语言的正确位置,php,database,zend-framework2,locale,Php,Database,Zend Framework2,Locale,我的应用程序包含几种基于域扩展的语言。该语言将用于数据库查询并设置正确的区域设置 我想知道设置语言设置器/获取器的正确方法或位置是什么 目前我有两个方案 我在自己的供应商库中创建了一个类,我可以在Module.php中调用该类来设置正确的翻译,或者在何处为查询获取正确的语言代码 我在应用程序/模型/语言中创建了一个函数,用于在Module.php中设置或获取应用程序语言,并在控制器和/或数据库模型中获取该语言 描述了应用模型 应用程序结构将使用完全相同的代码处理两种语言。文本将通过ZF2翻译模块

我的应用程序包含几种基于域扩展的语言。该语言将用于数据库查询并设置正确的区域设置

我想知道设置语言设置器/获取器的正确方法或位置是什么

目前我有两个方案

  • 我在自己的供应商库中创建了一个类,我可以在Module.php中调用该类来设置正确的翻译,或者在何处为查询获取正确的语言代码

  • 我在应用程序/模型/语言中创建了一个函数,用于在Module.php中设置或获取应用程序语言,并在控制器和/或数据库模型中获取该语言

  • 描述了应用模型

    应用程序结构将使用完全相同的代码处理两种语言。文本将通过ZF2翻译模块进行翻译,但我只需要根据扩展确定语言

    我编写了一个简单的函数来确定要使用的应用程序语言,并通过此输出设置语言环境。现在已经设置了正确的语言,但我仍然需要为我的查询输入(一个where子句,其中包含用于接收所确定语言的匹配行的语言代码)

    我写的函数的一个例子

    在Module.php中

    public function onBootstrap(MvcEvent $e)
    {
            $application         = $e->getApplication();
            $eventManager        = $application->getEventManager();
            $moduleRouteListener = new ModuleRouteListener();
            $moduleRouteListener->attach($eventManager);
    
            # Set application language
            $appLanguage = $this->_setApplicationLanguage();
            $translator  = $application->getServiceManager()->get('translator');
            $translator->setLocale($appLanguage);
    }
    
    private function _setLanguage()
    {
            # Default language
            $language = 'nl_NL';
    
            # Supported languages (will be served by database later)
            $aSupportedLanguages = array('en_US' => 'en', 'de_DE' => 'de', 'fr_FR' => 'fr');
    
            # Explode host
            $aExplode = explode('.', $_SERVER['HTTP_HOST']);
    
            # Loop through http host parts
            foreach ($aExplode as $key => $value) {
    
                # Match for tld
                if (in_array($value, $aSupportedLanguages)) {
                $language = array_search($value, $aSupportedLanguages);
                break;
                }
            }
            return $language;
    } 
    
    谢谢你的建议。

    我这样做的

  • 创建LanguageController,处理新语言的创建和文件的翻译

  • 所有翻译都存储在语言文件夹中的php数组文件中。它更容易解析、工作和缓存(耶!)

  • 第2点的配置

    'translator' => [
    'locale' => 'en',
    'translation_file_patterns' => [
        [
            'base_dir' =>             __DIR__.'/../../module/Application/languages/phpArray',
            'type'     => 'phpArray',
            'pattern'  => '%s.php',
        ],
    ],
    'cache' => [
        'adapter' => [
            'name'    => 'Filesystem',
            'options' => [
                'cache_dir' => __DIR__ . '/../../data/cache/frontend',
                'ttl'       => '604800', // 1week
            ],
        ],
        'plugins' => [
            [
                'name'    => 'serializer',
                'options' => [],
            ],
            'exception_handler' => [
                'throw_exceptions' => (APP_ENV === "development"),
            ],
        ],
    ],
    ],
    
  • 我创建了一个控制器插件函数。有了这个功能,我可以轻松地从控制器和视图文件中转换任何内容

  • 名称空间应用程序\控制器\插件

    使用Zend\Mvc\Controller\Plugin\AbstractPlugin; 使用Zend\I18n\Translator\Translator

    final class Translate extends AbstractPlugin
    {
        /**
         * @var Translator $translator
         */
        private $translator = null;
    
        /**
         * @param Translator $translator
         */
        public function __construct(Translator $translator = null)
        {
            $this->translator = $translator;
        }
    
        /**
         * @param string $message
         *
         * @return string
         */
        public function __invoke($message = '')
        {
            return $this->translator->translate($message);
        }
    }
    
    namespace Application\Controller\Plugin\Factory;
    
    use Application\Controller\Plugin\Translate;
    use Zend\Mvc\Controller\PluginManager;
    
    class TranslateFactory
    {
        /**
         * @{inheritDoc}
         */
        public function __invoke(PluginManager $pluginManager)
        {
            $translator = $pluginManager->getController()->getServiceLocator()->get("translator")->getTranslator();
    
            $plugin = new Translate($translator);
    
            return $plugin;
        }
    }
    
  • 在Module.php中,将此代码设置为在disptach事件时触发

    $app=$e->getApplication(); $lang=新容器(“翻译”); $translator=$sm->get('translator')

    $translator->setLocale($lang->languageName)->setFallbackLocale('en'); $viewModel=$app->getMvcEvent()->getViewModel(); $viewModel->lang=$translator->getLocale();//用于html标记中的lang attr

  • 如果用户想要更改语言,我已经在我的
    IndexController
    中创建了
    languageAction()


  • 你的问题太宽泛了。您能否通过向我们展示一些您的工作(仅相关部分)来缩小可能性,这些工作加载了什么以及何时加载,以便我们能够更好地了解您的业务流程?添加了一些代码和有关应用程序的更多说明,希望这能让您对其有更好的了解。谢谢