Это делается не так. Нужно делать таблицу, где каждая строка соответствует конкретному пункту меню.
Вариант 2. А как хранить меню второго уровня?
Выше у тебя таблица какая-то кривая, поэтому и проблемы с расширением.
Я и написал: выбор варианта - в зависимости от конкретики проекта. Например, одно дело 2 языка, другое дело - 20 языков. И т.п.
Это пример таблицы, где имя колонки- ключ а строка- перевод. Плюсы- запрос отдает всего одну строку данных, по факту индекс не нужен для таблицы. Вариант- одна таблица где три колонки, язык, ключ значение. Легко добавлять новые поля, но будет селектится несколько строк, которые нужно преобразовать в формать удобный для шаблонизатора. Лишний код. Ну и плюс расширение до нескольких уровней вложенности усложняет задачу сразу
Ну и третий вариант, несколько таблиц, мне совсем не нравится
Невозможность расширения, выше уже писал.
необходимоссть джойнить таблицы - сложный запрос для простой задачи - неоправданный расход ресурсов и время.Спасибо, твой вариант я рассматривал имеет место быть
Ну есть сайт о животних, или вас интересует именно водний мир?
такой простой вопрос а ты хочешь разьяснений...
Да там 100500 способов реализации. Выбор конкретного способа зависит от конкретного проекта. И да, в файлах тоже хранят, но нет так, как у тебя, а переводы фраз.
Я не требую за меня решать. Знаю что вариантов множество. Мне интересно, как бы ты решал эту проблему. Не привязывайся к проекту, исходи из задачи. Для сайта - окей, приведи как бы ты делал многоязычное меню для сайта.
Спасибо за интересную дискуссию
все верно, и свои консерны к этому способу я уже высказывал, но да - он самый быстрый
Нет, я думал ты знаком с питон. Приведенный код один раз обращается к файлу, получает нужные данные по ключу. Потом json конвертируется в питоновский обьект типа "словарь"(dict), если не ошибаюсь, это аналог пхпэшного array, и уже в байткоде путешествует дальше. То есть ничего не разрастется. добавлю в json строку иеню - скомпилируется и буде использована. При этом мне не надо лезть руками в код-файлы, все можно реализовать через пользовательский интерфейс
Гораздо надежнее чем авторизация через логин/пароль. Удобно для пользователей. Всегда стараюсь использовать. Не слышал историй, чтоюы получили доступ несанкционированный таким способом Там токенизация, ее поломать крайне сложно. А если еще и вход черех двухфакторную - можно спать спокойно.
Смешно... Если почитать тему, кто здесь что пишет. Ну ладно, продолжай блистать.
Слушай, если у тебя есть возражения по техчасти, реализации - добро пожаловать, с удовольствием выслушаю. Мне на самом деле эта дискуссия очень помогает - пытаясь сформулировать ответы, я уже оптимизировал свой код неплохо. Давай не будем переходить на стиль Арбнета. Если аргументируешь плюсы за базу данных, покажешь как бы ты хранил это в БД, как получалбы - буду очень благодарен, может я что-то упускаю и твой вариант окажется верным?
и на вашу текущую реализацию
1 - во-первых с портянкой со всеми языками в одном файле, зачем если нужен только один язык, подгружать сразу все переводы?
Спасибо за комментарии, не думал что python код так сложен для понимания, поясняю. Все данные никогда не выгребаются. Вот есть условный роутер, обрабатывающий запросы типа
site.com/{lang}/users/profile когда пользователь в меню выбирает язык ru происходит переадресайия на урл
site.com/ru/users/profile
Соотвтетсвенно роутер идет в этот мой большой JSON:
{ "en": { "subjects": { "subjects": { "chemistry": "chemistry", "math": "mathematics" } }, "mentors": "mentors", "scheduler": "scheduler", "news": "news", "adverts": "adverts" }, "ru": { "subjects": { "предметы": { "chemistry": "химия", "math": "математика" } }, "mentors": "преподаватели", "scheduler": "расписание", "news": "новости", "adverts": "обьявления" }}
И по ключу "ru" выгребает только данные для русского интерфейса:
"ru": { "subjects": { "предметы": { "chemistry": "химия", "math": "математика" } }, "mentors": "преподаватели", "scheduler": "расписание", "news": "новости", "adverts": "обьявления" }
Fastapi умеет кэшировать данные и пока пользователь не сменит язык - ему будет подгружаться интерфейс из "ru" интерфейса. То есть в шаблонизатор приходит малюсенький обьект только с тем что нужно.
так и есть:
def get_language(lang: str = "en") -> dict: file_name = "lang_settings.json" file_path = "".join((os.getcwd(), "/src/settings/", file_name)) with open(file_path, "r") as f: data = json.load(f) lang = data.get(lang) if not lang: return data.get("en") return lang