Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Konwencja plików językowych
Forum PHP.pl > Forum > PHP
markonix
Jakiej konwencji używacie jeżeli chodzi o aplikacje multi-języczne na prostych plikach językowych (tablice)? Np. Laravel.

PHPSTORM fajnie podpowiada użyte indeksy więc warto trzymać się jakiegoś standardu, a nie potrafię wybrać najlepszego, a teraz na dodatek muszę przepisać 10% plików językowych bo nie można użyć czegoś takiego:

  1. 'teacher.name' => 'Nauczyciel',
  2. 'teacher.name.placeholder' => 'Podaj imię i nazwisko',


Ponieważ biblioteki które pozwalają na zarządzanie plikami językowymi dumpują potem to wszystko do tablicy i dot notation jest zmienione na zagnieżdżenia. Tak więc spowoduje to nadpisanie i trzeba stosować np.

  1. 'teacher.name.label' => 'Nauczyciel',
  2. 'teacher.name.placeholder' => 'Podaj imię i nazwisko',


To tyle przestrogi, może kiedyś komu zaoszczędzi to czasu, ja teraz mam około 200 linijek CTR+F i CTR+R sad.gif

Wracając do tematu podzielcie się swoimi konwencjami. Moje przemyślenia:
Na pewno warto nie bać się podziału na pliki. Ja tego żałuje bo teraz gdy pliki mają 2500 linijek to przy edytorach webowych troszkę przymula.
Pliki podzielone na jakieś ogólne, wspólne np. app.php czy system.php oraz na większe moduły (fragmenty systemu).
W samych plikach stosuje podgrupy np.

button.add => Dodaj
button.delete => Usuń

Przy PHPSTORM taka konwencja mega się sprawdza, nie musisz zaglądać do pliku językowej tylko bez problemu na "czuja" zakodujesz widok.

Problem z konwencją mam już przy konkretnym widoku, powiedzmy formularz z nauczycielem.

Plik modules.php

teacher.title => Dodawanie nauczyciela, // Konwencja na tytuł strony, title, text główny?
teacher.form.name.label' => 'Imię',
teacher.form.name.text' => 'Minimum 2 znaki',
teacher.form.name.placeholder' => 'Proszę wprowadzić imię',

Wygląda w porządku, ale już reusable troszkę kuleje, bo wszystkie labele można by użyć w widoku typu "show" czyli profilu nauczyciela.
  1. <span>{{ __('teacher.form.name.label') }}</span>: {{ $teacher->name }}

Troszkę to nie pasuje bo to nie formularz, znowu przejrzyściej byłoby dla mnie:
  1. <span>{{ __('teacher.name') }}</span>: {{ $teacher->name }}

Wtedy, bez zaglądania w pliki wiem na 99% co jest pod tym tłumaczeniem.

teacher.name i opcjonalne teacher.name.placeholder nie wchodzi w grę, tak właśnie robiłem i teraz żałuje (patrz wyżej).
Ewentualnie teacher.name-placeholder lub name_placeholder. Jaki widzicie w ogóle _ - w nazwach? _ staram się używać wyłącznie jako spacja (dwu wyrazowe zmienne), nigdy w innym celu.

Macie jakieś swoje przemyślenia, może swoje koncepcje? Na stacku nic nie znalazłem, jest dużo o konwencjach nazewnictwa zmiennych, klas czy plików, ale kluczy w plikach językowych nie.
Pyton_000
Zawsze można pisać coś w stylu `__('Nauczyciel');` a potem tylko zrobić translacje do języka innego niż PL dzięki temu masz gotowy fallback po polsku a jeśli jest tłumaczenie EN to je zastosuje.
markonix
Wiem ale nie lubię takiego podejścia:
1) pliki językowe mniej czytelnie (json brak komentarzy, bloków itp).
2) nie motywuje do uzupełniania plików językowych
3) storm nic tu nie pomoże
4) biblioteki nie obsługują takich tłumaczeń (bo faktycznie to trudniejsze)
5) wszystko musi być w jednym pliku
6) mniej wygodne np. lubię takie konstrukcje: <button>{{ __('system.button.'. $teacher ? 'edit' : 'create') }}
7) PL w kodzie
8) Jedna mała zmiana (literka, kropka) spowoduje z automatu konieczność edycji wszystkich plików językowych
kayman
mnie najbardzie pasuje takie

  1. class Lang {
  2.  
  3. private static $data = [];
  4. private static $instance;
  5.  
  6. private function __construct() {
  7. $filename = ROOTPATH . 'Langs/' . Session::get('lang') . '.php';
  8. if (file_exists($filename)) {
  9. self::$data = require $filename;
  10. }
  11. }
  12.  
  13. public static function get($key) {
  14. if (!isset(self::$instance)) {
  15. self::$instance = new self();
  16. }
  17. if (isset(self::$data[$key])) {
  18. return self::$data[$key];
  19. }
  20. return $key;
  21. }
  22.  
  23. }


plik langu pl.php

  1. return [
  2. 'Add' => 'Dodaj',
  3. 'Edit' => 'Edytuj',
  4. 'Delete' => 'Usuń'
  5. //......
  6. ];


usage

  1. echo Lang::get('Delete'); // Usuń
  2. echo Lang::get('Deleted'); //Deleted


podobne rozwiązanie stosuje Yii, polega ono na przyjęciu defautowego langu np en, potem już jak nie ma klucza w tablicy wyświetla klucz, jest wyświetla tłumaczenie

wianuszki typu teacher.name.label są chyba trudniejsze do ogarnięcia
markonix
Ty podałeś konstrukcję systemów plików, a dokładnie jednego pliku, ja piszę tutaj o konwencji nazewnictwa już w tych plikach.

Kilka inspiracji jakie znalazłem:

https://github.com/CachetHQ/Cachet/blob/2.4...ng/en/forms.php (od razu w tablicy, też czytelne i od razu wymusza odpowiednie indeksy w tablicy)

https://stackoverflow.com/questions/2819690...-language-files - tu dokładnie ten temat ale mało informacji.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.