Hướng dẫn dùng ngu alexander trong PHP
Đây là phần bốn trong loạt bài Xây dựng Khởi nghiệp Với PHP của bạn trên Tuts. Trong loạt bài này, tôi hướng dẫn bạn thông qua việc khởi chạy một khởi động từ khái niệm này sang thực tế bằng ứng dụng Meeting Planner của tôi như một ví dụ thực tế về cuộc sống. Mỗi bước trong bài viết, chúng tôi sẽ phát hành code của Meeting Planner làm ví dụ nguồn mở mà bạn có thể học hỏi. Chúng tôi cũng sẽ giải quyết các vấn đề kinh doanh phát sinh có liên quan đến startup. Show Trong hướng dẫn này, tôi muốn quay trở lại và thêm phần hỗ trợ quốc tế hóa I18n vào ứng dụng của chúng ta trước khi chúng ta xây dựng nhiều code hơn nữa. Theo Wikipedia, I18n là một tên số: 18 là viết tắt của số lượng chữ cái giữa chữ I đầu tiên và n cuối cùng trong quá trình quốc tế hóa, một cách sử dụng được đặt ra vào tháng 12 năm 1970 hoặc thập niên 80. Với I18n, tất cả các chuỗi văn bản được hiển thị cho người dùng từ ứng dụng được thay thế bằng các việc gọi hàm có thể tự động tải chuỗi đã dịch cho bất kỳ ngôn ngữ nào mà người dùng chọn. Tất cả mã cho Công cụ lập kế hoạch cuộc họp được viết trong Khung công tác Yii2 cho PHP, đã hỗ trợ sẵn cho I18n. Nếu bạn muốn tìm hiểu thêm về Yii2, hãy xem loạt bài Programming with Yii2 của chúng tôi tại Tuts. Chỉ xin nhắc rằng, tôi tham gia vào các chủ đề bình luận dưới đây. Tôi đặc biệt quan tâm nếu bạn có các cách tiếp cận khác nhau hoặc các ý tưởng bổ sung hoặc muốn đề xuất các chủ đề cho các hướng dẫn trong tương lai. Mục tiêu của việc quốc tế hóaKhi xây dựng một startup, sẽ rất hữu ích khi suy nghĩ toàn cầu ngay từ đầu - nhưng không phải lúc nào cũng vậy. Thay vào đó, có thể chỉ tập trung vào xây dựng cho thị trường nội địa của bạn. Sản phẩm tối thiểu của bạn có cần phải hoạt động ở các ngôn ngữ khác cho người dùng từ các quốc gia khác nhau không? Trong trường hợp của chúng tôi, framework Yii cung cấp hỗ trợ xây dựng sẵn cho I18n, vì vậy việc xây dựng hỗ trợ cho I18n ngay từ đầu cũng rất dễ dàng và cần nhiều thời gian để bổ sung nó sau này. Cách hoạt động của I18nI18n hoạt động bằng cách thay thế tất cả các tham chiếu đến văn bản được hiển thị cho người dùng bằng các cuộc gọi hàm cung cấp bản dịch khi cần. Ví dụ, đây là những gì tên trường thuộc tính trong model Place trông giống như trước I18n: public function attributeLabels() { return [ 'id' => 'ID', 'name' => 'Name', 'place_type' => 'Place Type', ... Việc cung cấp các phiên bản mã đã dịch sẽ trở nên rất phức tạp. Người dịch không hiểu về kỹ thuật sẽ phải dịch mã, có khả năng phá vỡ cú pháp. Đoạn code phía trên sẽ trông thế này với I18n: public function attributeLabels() { return [ 'id' => Yii::t('frontend', 'ID'), 'name' => Yii::t('frontend', 'Name'), 'place_type' => Yii::t('frontend', 'Place Type'),
Ngôn ngữ mặc định, trong trường hợp này là tiếng Anh, được viết vào mã, như được hiển thị ở trên. File tài nguyên ngôn ngữ là danh sách các mảng chuỗi có khóa là văn bản ngôn ngữ mặc định — ví dụ: "Place Type" — và mỗi file cung cấp giá trị văn bản đã dịch cho ngôn ngữ thích hợp của chúng. Dưới đây là ví dụ về tệp dịch tiếng Tây Ban Nha hoàn chỉnh của chúng tôi, mã ngôn ngữ Hàm 'Agregar ubicación actual', 'Add a Google {modelClass}' => 'Añadir un Google {modelClass}', 'Created By' => 'Creado por', 'Full Address' => 'Dirección completa', 'Google Place ID' => 'Google Place ID', 'Name' => 'Nombre', 'Notes' => 'Notas', 'Place Type' => 'Place Tipo', 'Places' => 'Lugares', Khi việc này có vẻ tốn thời gian, Yii cung cấp các script để tự động hóa việc tạo và tổ chức các file này. Bằng cách tách văn bản ra khỏi code, chúng tôi giúp các chuyên gia đa ngôn ngữ không chuyên về kỹ thuật dễ dàng dịch các ứng dụng cho chúng tôi hơn — mà không phá võ các cú pháp code. I18n cũng cung cấp các hàm chuyên biệt để dịch thời gian, tiền tệ, số nhiều v.v. Tôi sẽ không đi vào chi tiết của những điều này trong hướng dẫn này. Cấu hình hỗ trợ I18nThật không may, tài liệu Yii2 cho I18n chưa được mô tả rõ - và rất khó để tìm ra các ví dụ chi tiết từng bước một. May mắn cho bạn, tôi sẽ hướng dẫn bạn những gì tôi đã học được từ việc tìm kiếm tài liệu và web. Tôi tìm thấy ví dụ hữu ích I18n của Code Ninja và Yii2 Definitive Guide về I18n, và người đóng góp cho Yii Alexander Makarov cũng đã đề nghị hỗ trợ tôi. Tạo file cấu hình I18nChúng tôi đang sử dụng
template Yii2 nâng cao cho Meeting Planner. Điều này tạo ra hai ứng dụng Yii trong codebase, frontend và backend của chúng tôi. Và, nó tạo ra một khu vực chung cho các mô hình được chia sẻ giữa cả hai ứng dụng. Tệp cấu hình của Yii được tải bất cứ khi nào yêu cầu trang được thực hiện. Chúng ta sẽ sử dụng các kịch bản lệnh I18n của Yii để xây dựng một tệp cấu hình cho I18n trong đường dẫn
Từ gốc codebase của chúng ta, chúng ta sẽ chạy script ./yii message/config @common/config/i18n.php Điều này tạo ra template sau đây mà chúng ta có thể tùy chỉnh: __DIR__, // array, required, list of language codes that the extracted messages // should be translated to. For example, ['zh-CN', 'de']. 'languages' => ['de'], // string, the name of the function for translating messages. // Defaults to 'Yii::t'. This is used as a mark to find the messages to be // translated. You may use a string for single function name or an array for // multiple function names. 'translator' => 'Yii::t', // boolean, whether to sort messages by keys when merging new messages // with the existing ones. Defaults to false, which means the new (untranslated) // messages will be separated from the old (translated) ones. 'sort' => false, // boolean, whether to remove messages that no longer appear in the source code. // Defaults to false, which means each of these messages will be enclosed with a pair of '@@' marks. 'removeUnused' => false, // array, list of patterns that specify which files/directories should NOT be processed. // If empty or not set, all files/directories will be processed. // A path matches a pattern if it contains the pattern string at its end. For example, // '/a/b' will match all files and directories ending with '/a/b'; // the '*.svn' will match all files and directories whose name ends with '.svn'. // and the '.svn' will match all files and directories named exactly '.svn'. // Note, the '/' characters in a pattern matches both '/' and '\'. // See helpers/FileHelper::findFiles() description for more details on pattern matching rules. 'only' => ['*.php'], // array, list of patterns that specify which files (not directories) should be processed. // If empty or not set, all files will be processed. // Please refer to "except" for details about the patterns. // If a file/directory matches both a pattern in "only" and "except", it will NOT be processed. 'except' => [ '.svn', '.git', '.gitignore', '.gitkeep', '.hgignore', '.hgkeep', '/messages', ], // 'php' output format is for saving messages to php files. 'format' => 'php', // Root directory containing message translations. 'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages', // boolean, whether the message file should be overwritten with the merged messages 'overwrite' => true, /* // 'db' output format is for saving messages to database. 'format' => 'db', // Connection component to use. Optional. 'db' => 'db', // Custom source message table. Optional. // 'sourceMessageTable' => '{{%source_message}}', // Custom name for translation message table. Optional. // 'messageTable' => '{{%message}}', */ /* // 'po' output format is for saving messages to gettext po files. 'format' => 'po', // Root directory containing message translations. 'messagePath' => __DIR__ . DIRECTORY_SEPARATOR . 'messages', // Name of the file that will be used for translations. 'catalog' => 'messages', // boolean, whether the message file should be overwritten with the merged messages 'overwrite' => true, */ ]; Tôi đang tùy chỉnh tệp của mình. Tôi di chuyển messagePath lên đến đỉnh và tùy chỉnh sourcePath và messagePath. Tôi cũng chỉ định ngôn ngữ tôi muốn ứng dụng của mình hỗ trợ ngoài tiếng Anh — trong trường hợp này là tiếng Tây Ban Nha và tiếng Đức, 'es' và 'de'. Dưới đây là danh sách tất cả các mã ngôn ngữ I18n. return [ // string, required, root directory of all source files 'sourcePath' => __DIR__. DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR, // Root directory containing message translations. 'messagePath' => __DIR__ . DIRECTORY_SEPARATOR .'..'. DIRECTORY_SEPARATOR . 'messages', // array, required, list of language codes that the extracted messages // should be translated to. For example, ['zh-CN', 'de']. 'languages' => ['es','de'], Trong bước tiếp theo, chúng tôi sẽ chạy tập lệnh trích xuất của Yii, sẽ quét tất cả mã trong cây sourcePath để tạo các tệp chuỗi mặc định cho tất cả các nhãn được sử dụng trong mã của chúng tôi. Tôi đang tùy biến sourcePath để quét toàn bộ cây mã. Tôi đang tùy biến messagePath để tạo ra các tập tin kết quả chung / tin nhắn. ./yii message/extract @common/config/i18n.php Bạn sẽ thấy Yii quét tất cả các file code của bạn: Extracting messages from /Users/Jeff/Sites/mp/frontend/models/Place.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/models/PlaceGPS.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/models/PlaceSearch.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/models/ResetPasswordForm.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/models/SignupForm.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/layouts/main.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/_form.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/_search.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/create.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/index.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/update.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/meeting/view.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_form.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_formGeolocate.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_formPlaceGoogle.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/_search.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/create.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/create_geo.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/create_place_google.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/index.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/locate.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/update.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/place/view.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/about.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/contact.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/error.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/index.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/login.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/requestPasswordResetToken.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/resetPassword.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/views/site/signup.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/web/index-test.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/web/index.php... Extracting messages from /Users/Jeff/Sites/mp/frontend/widgets/Alert.php... Khi hoàn thành, bạn sẽ thấy kết quả như thế này trong codebase: Kích hoạt I18n và chọn một ngôn ngữTrong tập tin cấu hình chung, dirname(dirname(__DIR__)) . '/vendor', 'language' => 'es', // spanish 'components' => [ 'cache' => [ 'class' => 'yii\caching\FileCache', ], 'i18n' => [ 'translations' => [ 'frontend*' => [ 'class' => 'yii\i18n\PhpMessageSource', 'basePath' => '@common/messages', ], 'backend*' => [ 'class' => 'yii\i18n\PhpMessageSource', 'basePath' => '@common/messages', ], ], ], ], ]; Nhưng vẫn còn nhiều việc phải làm. Chúng ta phải làm cho code của chúng ta biết đến I18n. Sử dụng bộ tạo mã Gii của Yii với I18nTrong phần hai của loạt bài, Xây dựng Startup của bạn Với PHP: Yêu cầu tính năng và Thiết kế cơ sở dữ liệu, chúng tôi đã dùng trình tạo mã của Yii, Gii, để tạo ra các model, controller và view của chúng ta. Nhưng, chúng tôi không kích hoạt I18n, vì vậy tất cả code của chúng tôi nhúng các chuỗi văn bản.. Hãy làm lại điều này. Chúng tôi dùng lại Gii, có thể là http://localhost:8888/mp/gii trong trình duyệt của bạn và chạy lại trình tạo model và controller với I18n được kích hoạt. Lưu ý: Nếu bạn tiếp tục với phần ba của loạt bài này, có thể bạn cần lưu ý sự khác biệt của từng file và sao chép code theo cách thủ công. Hoặc, có thể dễ dàng thay thế code của bạn bằng repo trên Github cho hướng dẫn này, được liên kết phía trên bên phải. Dưới đây là ví dụ về việc tạo mã mô hình
Cuộc họp với kích hoạt I18n. Lưu ý rằng chúng tôi chỉ định "frontend" cho Message Category. Chúng tôi đang đặt tất cả các chuỗi văn cho người dùng trong một file danh mục cho người dùng. Tương tự thực hiện tạo mã CRUD cho các controller và view: Nếu bạn duyệt code được tạo trong các model, controller và view, bạn sẽ thấy các chuỗi văn bản được thay thế bằng hàm title = Yii::t('frontend', 'Places'); $this->params['breadcrumbs'][] = $this->title; ?> |