Truy cập các đối tượng i18n từ các phạm vi khác nhau


10

Tôi đã xây dựng một khung công tác cá nhân của mình bắt đầu như là một cách để tìm hiểu mô hình MVC và bây giờ đã phát triển thành một thứ mà tôi thích hơn hầu hết các khung công tác ngoài đó (có lẽ là vì tôi thêm những gì tôi thích và thay đổi những gì tôi không 'thích nhưng tuy nhiên) và tốt hay xấu tôi sử dụng nó trong một số dự án.

Vấn đề tôi gặp phải bây giờ là tôi không thể tìm ra cách tốt để truy cập chức năng i18n của mình (nó không thực sự là i18n, đó chỉ là bản dịch, không bao gồm hỗ trợ i18n đầy đủ, ít nhất là chưa có).

Cách thức hoạt động là tôi sử dụng các tệp cấu hình làm tệp ngôn ngữ vì tôi cho rằng sẽ rất thuận tiện khi sử dụng Configlớp để tải chúng vì trong tệp cấu hình khung của tôi được tải động - không được tải trừ khi cần, bạn có thể xem lướt qua tại đây

class Config {

    private static $settings = array();

    private function __construct() {

    }

    public static function load($file) {
        $path = PROJECT_PATH . '/config/' . $file . '.php';
        if (is_file($path)) {
            $settings = require($path);
        } else {
            throw new Exception('Configuration file [' . $file . '] doesn\'t exist', 500);
        }

        self::$settings[$file] = $settings;
        return true;
    }

    public static function get($file = null) {
        if ($file === null) {
            return self::$settings;
        } elseif (isset(self::$settings[$file]) || self::load($file)) {
            return self::$settings[$file];
        }
    }
}

Trường hợp một tệp cấu hình duy nhất trông giống như thế này

<?php return array(
    'setting0' => 'value',
    'setting1' => 'value',
    ....
);

Điều đó cho phép PHP lưu trữ các tệp đó và tải chúng trở nên rất nhanh.

Bây giờ đối với các bản dịch, như tôi đã nói chúng là các tệp cấu hình trong một thư mục khác có tên lang, nhưng tôi không thể cứ gọi điện Config::get('lang/en/myLangFile')mỗi khi tôi cần truy cập một bản dịch, vì vậy tôi đã phát minh ra (phát minh, huh) Translationslớp, đại diện cho một tập tin dịch duy nhất

class Translations {

    protected $data = [];

    public function __construct(array $translations) {
        $this->data = $translations;
    }

    public function __get($name) {
        return isset($this->data[$name]) ? $this->data[$name] : $name;
    }

}

Bây giờ nó là siêu thuận tiện và đẹp để truy cập các bản dịch

$t = new Translations([...]);

echo $t->translationKey;

Tôi có một Langlớp được sử dụng để thiết lập ngôn ngữ ưa thích của người dùng trong số những thứ nhỏ nhặt khác vì vậy tôi nghĩ rằng tôi sẽ sử dụng nó như một nhà máy cho Translationscác lớp học của mình

class Lang {

    public static function get($file) {
        return new Translations(Config::get('lang/' . self::$lang . '/' . $file));
    }

}

Vì vậy, bây giờ tất cả những gì tôi phải làm để lấy một số bản dịch là

$t = Lang::get('myLangFile');

echo $t->translationKey;

Trong trường hợp bạn đang tự hỏi tại sao tôi có quá nhiều công cụ tĩnh bởi vì các lớp này không có ý nghĩa để được khởi tạo và tôi không thích mẫu thiết kế đơn lẻ, tôi thích có "các lớp tĩnh" mặc dù chúng không được hỗ trợ trong PHP (chưa?).

Cho đến nay rất tốt, tôi đã có các bản dịch đi, nhưng chúng ta hãy đi đến vấn đề (cuối cùng).

Khi một khung nhìn được hiển thị, rất có thể nó sẽ in một số văn bản ra cho người dùng và vì vậy tôi cần phải có một đối tượng dịch có sẵn nhưng điều đó khá bất tiện khi phải chuyển nó từ bộ điều khiển vì tôi sẽ phải đi và Đặt điều đó vào từng phương thức và đó sẽ là địa ngục, hơn nữa nếu tôi làm điều đó thì một số bộ điều khiển khác gọi cùng một chế độ xem mà không có bản dịch chính xác, các đối tượng sẽ bị phá vỡ, điều này có ý nghĩa nhưng làm tăng thêm sự phức tạp cho chương trình.

Những gì tôi đã làm cho đến thời điểm này là trên cùng của mỗi chế độ xem tôi xây dựng đối tượng dịch thuật của mình

<?php $t = Lang::get('myLangFile') ?>

<div><?= $t->helloWorld ?></div>

Điều này hoạt động và đảm bảo cho tôi các quan điểm của tôi sẽ hoạt động bất kể ai gọi chúng và về cơ bản gần như không tốn gì về hiệu suất vì việc tạo ra một Translationsbản sao sẽ không sao chép mảng chứa thông tin trừ khi thay đổi được đưa ra vì mã trong hàm tạo chỉ là một phép gán, Vì vậy, tôi đoán rằng không có vấn đề gì với điều đó nhưng nó chỉ làm phiền tôi vì một số lý do rằng đó không phải là điều chính xác để làm.

Hơn nữa Translations, thỉnh thoảng tôi sẽ cần sử dụng một lớp trong một mô hình hoặc trình xác nhận hợp lệ và tôi cũng cần phải khởi tạo nó ở đó, vì vậy trong một lần thực hiện, tôi có thể khởi tạo cùng một Translationsđối tượng nhiều lần. Để giải quyết vấn đề này, tôi sẽ cần bắt đầu đưa các đối tượng đó vào sổ đăng ký và tôi nghĩ rằng điều này sẽ trở nên quá xa.

Tôi muốn xem một số suy nghĩ về phương pháp này là gì khi tôi có thể bị mù bởi chính mình như vậy và có thể nhận được một số lời khuyên và công cụ hữu ích. Cảm ơn trước cho bất cứ ai chọn dành thời gian của họ với vấn đề của tôi!

Câu trả lời:


0

<?php $t = Lang::get('myLangFile') ?>

<div><?= $t->helloWorld ?></div>

Điều này hoạt động và đảm bảo cho tôi các quan điểm của tôi sẽ hoạt động bất kể ai gọi họ và về cơ bản chi phí gần như không có gì về hiệu suất vì việc tạo ra một Bản dịch sẽ không sao chép mảng chứa thông tin trừ khi thay đổi được đưa ra vì mã trong hàm tạo chỉ là một phép gán , vì vậy tôi đoán rằng không có vấn đề gì với điều đó nhưng nó chỉ làm phiền tôi vì một số lý do rằng đó không phải là điều chính xác để làm.

Tôi hiểu ý của bạn ...
Tôi nghĩ rằng một điều có thể làm phiền bạn là bằng cách thêm vào chế độ xem trách nhiệm tải các tệp ngôn ngữ, ví dụ như bạn đang phá vỡ mẫu thiết kế Inversion of Control
'myLangFile' của bạn quá lớn và bạn muốn chia nó thành 2 tệp riêng biệt, bạn không thể làm điều đó mà không thay đổi mã xem.
bạn nghĩ sao?


1
Chính xác, đó hoàn toàn là một lý do hợp lệ.
php_nub_qq

1
Có thật không? Các tập tin ngôn ngữ không thể bao gồm các tập tin khác trong chính nó? Hoặc đọc từ cơ sở dữ liệu?
Svidgen

@svidgen có thiết kế cực kỳ tệ
php_nub_qq
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.