cách tốt nhất để làm cho trang web viết mã đa ngôn ngữ. gọi từ mảng lang phụ thuộc vào phiên lang?


81

Tôi đang nghiên cứu hàng giờ đồng hồ, nhưng tôi không thể tìm thấy bất kỳ cách rõ ràng và hiệu quả nào để thực hiện: /

Tôi có một trang web cơ sở mã hóa bằng tiếng Anh và tôi phải thêm ngôn ngữ Ba Lan vào bây giờ. Cách tốt nhất để tạo trang web của tôi bằng 2 ngôn ngữ tùy thuộc vào lựa chọn của khách truy cập là gì?

có cách nào để tạo tệp mảng cho mỗi ngôn ngữ và gọi chúng trong tệp xem phụ thuộc vào Phiên từ lựa chọn lang không? Tôi không muốn sử dụng cơ sở dữ liệu.

Đánh giá cao sự giúp đỡ! Tôi sắp hết thời hạn: / cảm ơn !!


1
tất cả các câu trả lời được đăng ở đây đều tuyệt vời nhưng sử dụng chúng, bạn sẽ mất tùy chọn tính tiền cho các trang của mình, vì một bộ điều khiển của nó sẽ được lưu vào bộ nhớ đệm và nó sẽ ở ngôn ngữ cuối cùng mà bạn đặt. cho mọi ngôn ngữ.

Câu trả lời:


93

Bạn đã xem thư viện Ngôn ngữ của CodeIgniter chưa?

Lớp Ngôn ngữ cung cấp các chức năng để truy xuất các tệp ngôn ngữ và các dòng văn bản cho các mục đích quốc tế hóa.

Trong thư mục hệ thống CodeIgniter của bạn, bạn sẽ tìm thấy một ngôn ngữ được gọi là chứa các tập hợp các tệp ngôn ngữ. Bạn có thể tạo tệp ngôn ngữ của riêng mình nếu cần để hiển thị thông báo lỗi và các thông báo khác bằng các ngôn ngữ khác.

Các tệp ngôn ngữ thường được lưu trữ trong thư mục hệ thống / ngôn ngữ của bạn. Ngoài ra, bạn có thể tạo một thư mục được gọi là ngôn ngữ bên trong thư mục ứng dụng của bạn và lưu trữ chúng ở đó. CodeIgniter sẽ xuất hiện đầu tiên trong thư mục ứng dụng / ngôn ngữ của bạn. Nếu thư mục không tồn tại hoặc ngôn ngữ được chỉ định không được đặt ở đó, CI sẽ thay vào đó tìm trong thư mục hệ thống / ngôn ngữ chung của bạn.

Trong trường hợp của bạn...

  • bạn cần tạo một polish_lang.phpenglish_lang.phpbên trongapplication/language/polish
  • sau đó tạo khóa của bạn bên trong tệp đó (ví dụ: $lang['hello'] = "Witaj";
  • sau đó tải nó vào bộ điều khiển của bạn như $this->lang->load('polish_lang', 'polish');
  • sau đó tìm nạp dòng như $this->lang->line('hello');Chỉ lưu trữ giá trị trả về của hàm này trong một biến để bạn có thể sử dụng nó trong chế độ xem của mình.

Lặp lại các bước cho ngôn ngữ tiếng Anh và tất cả các ngôn ngữ khác mà bạn cần.


cảm ơn cho câu trả lời nhanh chóng, có tôi đã thấy điều này. nhưng thực ra tôi cũng không rõ: / về cách thực hiện nhu cầu của tôi, nơi tạo tệp lang, định dạng gì, loại cấu trúc, cách gọi, v.v. Tôi khá mới trong lĩnh vực codeigniter. đó là lý do tại sao tôi đang tìm kiếm hướng dẫn rõ ràng hoặc sth. : /
nhà thiết kế-cố-mã hóa

1
heyooo nó là tuyệt vời, hoạt động tốt: D cảm ơn rất nhiều vì đã giúp đỡ! bạn là người cứu hộ! :) thanks
nhà thiết kế-cố-mã hóa

2
Đây là giải pháp cho văn bản không thể chỉnh sửa, nhưng nó không bao gồm bất kỳ nội dung đa ngôn ngữ nào được lưu trữ và truy xuất từ ​​cơ sở dữ liệu. Một trang web đa ngôn ngữ với hệ thống quản lý nội dung tùy chỉnh được tạo bằng CI sẽ cần nhiều hơn thế. Tôi đã tự tạo, với sự trợ giúp của phân đoạn ngôn ngữ trong URL và / hoặc phân đoạn bí danh duy nhất xác định nội dung duy nhất bằng một ngôn ngữ duy nhất. Tôi vẫn chưa tìm ra cách để quản lý việc này tốt hơn. Đó là lý do tại sao tôi đâm vào chủ đề này.
Luis Martin

@Randell nó đang hoạt động nhưng bạn có thể giải thích chi tiết cách dịch sang ngôn ngữ khác bằng onclick không .... ý tôi là nó để lưu trữ trong các phiên? how

@Nadh, tốt nhất là đăng câu hỏi của bạn trên một chuỗi mới, để chúng ta có thể giữ cho các cuộc thảo luận ngắn gọn.
Randell

22

Ngoài ra để thêm ngôn ngữ vào phiên, tôi sẽ xác định một số hằng số cho mỗi ngôn ngữ, sau đó đảm bảo rằng bạn có thư viện phiên được tự động tải trong config / autoload.php hoặc bạn tải nó bất cứ khi nào bạn cần. Thêm ngôn ngữ mong muốn của người dùng vào phiên:

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

Sau đó, bạn có thể lấy nó bất cứ lúc nào như thế này:

$language = $this->session->userdata('language');

vâng đây là một vấn đề khác của tôi. bạn đã giúp tôi rồi: D tuyệt vời! Tôi cũng đang nghĩ đến việc sử dụng cookie để ghi nhớ lựa chọn ngôn ngữ của khách truy cập.
designer-try-coding,

1
tôi nên xác định các phiên này ở đâu? Tôi nghĩ rằng không tốt khi xác định những điều này ở bộ điều khiển cho mỗi trang. phải là một cách mà tôi xác định tại một tệp toàn cầu và nó ảnh hưởng đến tất cả các trang web. cảm ơn!!
designer-try-coding,

Bằng cách nào đó, có một cách tốt hơn để làm điều này. Nhưng đó là một câu hỏi hoàn toàn mới. Nhưng điều này cũng có thể được thực hiện chỉ để giúp bạn bắt đầu.
Randell

7

Trong bộ điều khiển, hãy thêm các dòng sau khi bạn tạo khối mã lệnh

tức là, sau khi

cha :: Controller ();

thêm dòng bên dưới

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

tạo tệp trợ giúp lang_translate_helper.php với chức năng sau và đặt nó vào thư mục system \ application \ helpers

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

đối với mỗi ngôn ngữ, hãy tạo một thư mục có chữ viết tắt của ngôn ngữ như en, nl, fr, v.v., trong system \ application \ Languages

tạo tệp ngôn ngữ trong thư mục trên (tương ứng) sẽ chứa các cặp $ lang array giữ nhãn => language_value như được đưa ra bên dưới

nl_site_lang.php

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

en_site_lang.php

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

bạn có thể lưu trữ nhiều tệp cho cùng một ngôn ngữ khác nhau tùy theo yêu cầu, ví dụ: nếu bạn muốn tệp ngôn ngữ riêng biệt để quản lý phần phụ trợ (phần quản trị viên), bạn có thể sử dụng nó trong bộ điều khiển dưới dạng $ this-> lang-> load ('nl_admin', ' nl ');

nl_admin_lang.php

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

và cuối cùng để in nhãn bằng ngôn ngữ mong muốn, hãy truy cập các nhãn như bên dưới trong chế độ xem

label ('chào mừng', $ this);

HOẶC LÀ

label ('hello word', $ this);

lưu ý khoảng trống trong hello & từ bạn cũng có thể sử dụng nó theo cách này :)

khi không có lable được định nghĩa trong tệp ngôn ngữ, nó sẽ chỉ in ra những gì bạn đã chuyển vào nhãn hàm.


1

Tôi thứ hai câu trả lời của Randell.

Tuy nhiên, người ta luôn có thể tích hợp một GeoIP chẳng hạn như http://www.maxmind.com/app/php hoặc http://www.ipinfodb.com/ . Sau đó, bạn có thể lưu kết quả với lớp phiên mã.

Nếu bạn muốn sử dụng api ipinfodb.com Bạn có thể thêm tệp ip2locationlite.class.php vào thư mục thư viện ứng dụng codeigniter và sau đó tạo một hàm mô hình để thực hiện bất kỳ logic địa lý nào bạn cần cho ứng dụng của mình, chẳng hạn như:

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;
}

3
Phát hiện ngôn ngữ dựa trên IP không hoạt động rất tốt. Hãy nghĩ về VPN, khách du lịch, người di cư hoặc đơn giản là các quốc gia có nhiều ngôn ngữ như Canada hoặc Trung Quốc. Tốt hơn là sử dụng ngôn ngữ của trình duyệt.
PiTheNumber

1

Để sử dụng dễ dàng hơn, CI đã cập nhật điều này để bạn có thể sử dụng

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

và dịch văn bản

lang('language line');

và nếu bạn muốn làm cong nó bên trong nhãn thì hãy sử dụng tham số tùy chọn

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

Điều này sẽ xuất ra

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

Để đọc tốt, http://ellislab.com/codeigniter/user-guide/helpers/language_helper.html


1

Tôi đã sử dụng lớp MY_Language của Wiredesignz rất thành công.

Tôi vừa xuất bản nó trên github, vì tôi dường như không thể tìm thấy dấu vết của nó ở bất cứ đâu.

https://github.com/meigwilym/CI_Language

Thay đổi duy nhất của tôi là đổi tên lớp thành CI_Lang, phù hợp với những thay đổi v2 mới.


Tại sao mọi người cảm thấy cần phải sử dụng toàn cầu? Nó rất dễ dàng nhưng có thể tạo ra những vấn đề lớn.
Starlays

0

Khi quản lý các tệp thực tế, mọi thứ có thể mất đồng bộ khá dễ dàng trừ khi bạn thực sự cảnh giác. Vì vậy, chúng tôi đã ra mắt một dịch vụ miễn phí (beta) có tên là String cho phép bạn theo dõi các tệp ngôn ngữ của mình một cách dễ dàng và cộng tác với người dịch.

Bạn có thể nhập các tệp ngôn ngữ hiện có (trong mảng PHP, định dạng PHP Define, ini, po hoặc .strings) hoặc tạo các phần của riêng bạn từ đầu và thêm nội dung trực tiếp thông qua hệ thống.

Chuỗi hoàn toàn miễn phí vì vậy vui lòng kiểm tra và cho chúng tôi biết suy nghĩ của bạn.

Nó cũng thực sự được xây dựng trên Codeigniter! Kiểm tra bản beta tại http://mygengo.com/string


Đây thực sự là một điểm tốt; Các tệp ngôn ngữ của CI không dễ duy trì theo thời gian.
sourcejedi 27/11/12


0

Tôi đang sử dụng mã như vậy trong 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;
}

.... và sau đó tôi đang sử dụng cơ chế nội bộ thông thường của CI

o, suýt quên! trong các chế độ xem, tôi sử dụng các nút, nơi đặt cookie 'ngôn ngữ' với ngôn ngữ, được người dùng ưa thích.

Vì vậy, trước tiên mã này cố gắng phát hiện "ngôn ngữ ưu tiên" được đặt trong useragent của người dùng (trình duyệt). Sau đó, mã thử đọc 'ngôn ngữ' cookie. Và finaly - chuyển đổi đặt ngôn ngữ cho ứng dụng CI


-1

bạn có thể tạo một chức năng như thế này

function translateTo($language, $word) {  
   define('defaultLang','english');  
   if (isset($lang[$language][$word]) == FALSE)  
      return $lang[$language][$word];  
   else  
      return $lang[defaultLang][$word];  
}

6
Đây là một ví dụ về lập trình tồi, không có gì xúc phạm. KHÔNG xác định hằng số trong một hàm. Đó là lý do tại sao nó được gọi là hằng số, giá trị của nó không thay đổi, vì vậy nó sẽ được xác định một lần duy nhất. Thứ hai, mã isset($lang[$language][$word]) == FALSEsẽ là đủ như thế này isset($lang[$language][$word]), bởi vì Isset chỉ trả về true và false. Và thứ ba, khi bạn đánh giá nếu điều gì đó là sai LUÔN LUÔN sử dụng ===để xác minh loại .
machineaddict

-1

Bạn ơi, đừng lo lắng, nếu bạn đã cài đặt bất kỳ ứng dụng nào được tích hợp sẵn trong bộ mã và bạn muốn thêm một số gói ngôn ngữ, chỉ cần làm theo các bước sau:

1. Thêm tệp ngôn ngữ trong ứng dụng thư mục / ngôn ngữ / tiếng Ả Rập (tôi thêm ngôn ngữ Ả Rập trong sma2 được tích hợp sẵn ci)

2. Chuyển đến tệp có tên setting.phptrong application / modules / settings / views / setting.php . Ở đây bạn tìm thấy mảng

<?php /*

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

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

  'spanish' => 'Español'

Bây giờ lưu và chạy ứng dụng. Nó hoạt động tốt.


không có bất kỳ tệp nào được đặt tên setting.phpnếu bạn đã sử dụng bất kỳ thư viện hoặc người trợ giúp nào hãy chia sẻ nó trước.
Ali Qorbani
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.