82

我正在研究几个小时,但我找不到任何明确、有效的方法来做到这一点:/

我有一个英文的 codeigniter 基础网站,现在我必须添加一种波兰语。根据访问者的选择,用 2 种语言制作我的网站的最佳方法是什么?

有没有办法为每种语言创建数组文件并在视图文件中调用它们取决于语言选择中的会话?我不想使用数据库。

感谢帮助!我快没截止日期了:/谢谢!!

4

11 回答 11

95

你看过CodeIgniter 的语言库吗?

语言类提供了检索语言文件和文本行以实现国际化的功能。

在您的 CodeIgniter 系统文件夹中,您会找到一个名为 language 的包含语言文件集的语言。您可以根据需要创建自己的语言文件,以便以其他语言显示错误和其他消息。

语言文件通常存储在您的系统/语言目录中。或者,您可以在应用程序文件夹中创建一个名为 language 的文件夹并将它们存储在那里。CodeIgniter 将首先在您的应用程序/语言目录中查找。如果该目录不存在或指定的语言不存在,CI 将改为在您的全局系统/语言文件夹中查找。

在你的情况...

  • 你需要在里面polish_lang.php创建一个english_lang.phpapplication/language/polish
  • 然后在该文件中创建您的密钥(例如$lang['hello'] = "Witaj";
  • 然后将其加载到您的控制器中$this->lang->load('polish_lang', 'polish');
  • 然后获取行,$this->lang->line('hello');就像将这个函数的返回值存储在一个变量中,这样你就可以在你的视图中使用它。

对英语和您需要的所有其他语言重复这些步骤。

于 2009-08-25T13:55:52.440 回答
22

还要将语言添加到会话中,我会为每种语言定义一些常量,然后确保会话库在 config/autoload.php 中自动加载,或者在需要时加载它。将用户所需的语言添加到会话中:

$this->session->set_userdata('language', ENGLISH);

然后你可以像这样随时抓住它:

$language = $this->session->userdata('language');
于 2009-08-25T16:34:43.323 回答
7

当您制作 cunstructor 时,在控制器中添加以下行

即,之后

父::控制器();

添加以下行

    $this->load->helper('lang_translate');
    $this->lang->load('nl_site', 'nl'); // ('filename', 'directory')

使用以下函数创建帮助文件 lang_translate_helper.php 并将其放入目录 system\application\helpers

function label($label, $obj)
{
    $return = $obj->lang->line($label);
    if($return)
        echo $return;
    else
        echo $label;
}

对于每种语言,在 system\application\languages 下创建一个带有 en、nl、fr 等语言缩写的目录

在上面(相应的)目录中创建语言文件,其中将包含 $lang 数组,其中包含对 label=>language_value 如下所示

nl_site_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

en_site_lang.php

$lang['welcome'] = 'Welcome';
$lang['hello word'] = 'Hello Word';

您可以根据要求以不同的方式存储相同语言的多个文件,例如,如果您想要单独的语言文件来管理后端(管理员部分),您可以在控制器中将其用作 $this->lang->load('nl_admin', ' nl');

nl_admin_lang.php

$lang['welcome'] = 'Welkom';
$lang['hello word'] = 'worde Witaj';

最后以所需语言打印标签,在视图中访问标签如下

标签('欢迎', $this);

或者

label('hello word', $this);

请注意 hello & word 中的空格,您也可以像这样使用它:)

当语言文件中没有定义标签时,它只会打印您传递给函数标签的内容。

于 2010-12-28T09:55:07.007 回答
1

我赞同兰德尔的回答。

但是,始终可以集成 GeoIP,例如http://www.maxmind.com/app/phphttp://www.ipinfodb.com/。然后您可以使用 codeigniter 会话类保存结果。

如果您想使用 ipinfodb.com api,您可以将 ip2locationlite.class.php 文件添加到您的 codeigniter 应用程序库文件夹,然后创建一个模型函数来执行您的应用程序所需的任何 geoip 逻辑,例如:

function geolocate()
{
    $ipinfodb = new ipinfodb;
    $ipinfodb->setKey('API KEY');

    //Get errors and locations
    $locations = $ipinfodb->getGeoLocation($this->input->ip_address());
    $errors = $ipinfodb->getError();

   //Set geolocation cookie
   if(empty($errors))
   {
       foreach ($locations as $field => $val):
            if($field === 'CountryCode')
            {
                $place = $val;
            }
       endforeach;
   }
   return $place;
}
于 2011-04-13T21:31:38.107 回答
1

为了更容易使用 CI 更新了这个,所以你可以使用

$this->load->helper('language');

并翻译文本

lang('language line');

如果你想在标签内扭曲它,那么使用可选参数

lang('language line', 'element id');

这将输出

// becomes <label for="form_item_id">language_key</label>

为了获得良好的阅读 http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html

于 2013-09-10T09:32:34.080 回答
1

我已经成功使用了 Wiredesignz 的 MY_Language 类。

我刚刚在 github 上发布了它,因为我似乎在任何地方都找不到它的踪迹。

https://github.com/meigwilym/CI_Language

根据新的 v2 更改,我唯一的更改是将类重命名为 CI_Lang。

于 2013-09-10T13:12:30.250 回答
0

在管理实际文件时,除非您非常警惕,否则事情很容易不同步。因此,我们推出了一项名为String的(测试版)免费服务,可让您轻松跟踪您的语言文件,并与翻译人员协作。

您可以导入现有语言文件(PHP 数组、PHP 定义、ini、po 或 .strings 格式)或从头开始创建自己的部分并直接通过系统添加内容。

String 完全免费,因此请查看并告诉我们您的想法。

它实际上也是基于 Codeigniter 构建的!在http://mygengo.com/string查看测试版

于 2009-11-30T23:16:32.667 回答
0

按照这个https://github.com/EllisLab/CodeIgniter/wiki/CodeIgniter-2.1-internationalization-i18n

它简单明了,还可以查看文档@http: //ellislab.com/codeigniter/user-guide/libraries/language.html

它的方式比简单

于 2013-10-24T10:15:12.237 回答
0

我在 config.php 中使用这样的代码:

$lang = 'ru'; // this language will be used if there is no any lang information from useragent (for example, from command line, wget, etc...

if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'],0,2);
$tmp_value = $_COOKIE['language'];
if (!empty($tmp_value)) $lang = $tmp_value;
switch ($lang)
{
    case 'ru':
        $config['language'] = 'russian';
        setlocale(LC_ALL,'ru_RU.UTF-8'); 
        break;
        case 'uk':
        $config['language'] = 'ukrainian';
        setlocale(LC_ALL,'uk_UA.UTF-8'); 
                break;
        case 'foo':
        $config['language'] = 'foo';
        setlocale(LC_ALL,'foo_FOO.UTF-8'); 
                break;
        default:
        $config['language'] = 'english';
        setlocale(LC_ALL,'en_US.UTF-8'); 
        break;
}

....然后我使用 CI 的通常内部机制

哦,差点忘了!在视图中,我使用按钮设置 cookie 的“语言”和用户喜欢的语言。

因此,首先此代码尝试检测用户的用户代理(浏览器)中设置的“首选语言”。然后代码尝试读取cookie“语言”。最后 - 开关为 CI 应用程序设置语言

于 2017-01-08T08:55:39.490 回答
-1

你可以做一个这样的功能

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}
于 2010-04-20T17:33:31.673 回答
-1

朋友,别担心,如果您安装了任何内置在 codeigniter 中的应用程序并且您想添加一些语言包,只需按照以下步骤操作:

1.在文件夹application/language/arabic中添加语言文件(我在sma2 built in ci中添加arabic lang)

2.转到application/modules/settings/views/setting.phpsetting.php中命名的文件。在这里你可以找到数组

<?php /*

 $lang = array (
  'english' => 'English',

  'arabic' => 'Arabic',  // i add this here

  'spanish' => 'Español'

现在保存并运行应用程序。它工作得很好。

于 2014-05-24T02:15:03.330 回答