Реализация мультиязычности на сайте

W1
На сайте с 22.01.2021
Offline
306
#91
Sly32 #:
Невозможность расширения, выше уже писал.

Выше у тебя таблица какая-то кривая, поэтому и проблемы с расширением.

Sly32 #:
необходимоссть  джойнить таблицы - сложный запрос для простой задачи - неоправданный расход ресурсов и время.

Я и написал: выбор варианта - в зависимости от конкретики проекта. Например, одно дело 2 языка, другое дело - 20 языков. И т.п.

Мой форум - https://webinfo.guru –Там я всегда на связи
S3
На сайте с 29.03.2012
Offline
355
#92
webinfo #:

Выше у тебя таблица какая-то кривая, поэтому и проблемы с расширением.

Я и написал: выбор варианта - в зависимости от конкретики проекта. Например, одно дело 2 языка, другое дело - 20 языков. И т.п.

Это пример таблицы, где имя колонки- ключ а строка- перевод. Плюсы- запрос отдает всего одну строку данных, по факту индекс не нужен для таблицы. Вариант- одна таблица где три колонки, язык, ключ значение. Легко добавлять новые поля, но будет селектится несколько строк, которые нужно преобразовать  в формать удобный для шаблонизатора. Лишний код. Ну и плюс расширение до нескольких уровней вложенности усложняет задачу сразу

Ну и третий вариант, несколько таблиц, мне совсем не нравится

W1
На сайте с 22.01.2021
Offline
306
#93
Sly32 #:
Это пример таблицы, где имя колонки- ключ а строка- перевод.

Это делается не так. Нужно делать таблицу, где каждая строка соответствует конкретному пункту меню.

S3
На сайте с 29.03.2012
Offline
355
#94
webinfo #:

Это делается не так. Нужно делать таблицу, где каждая строка соответствует конкретному пункту меню.

Вариант 2. А как хранить  меню второго уровня?

W1
На сайте с 22.01.2021
Offline
306
#95
Sly32 #:

Вариант 2. А как хранить  меню второго уровня?

Указывать родительский пункт.

FuRReX
На сайте с 04.12.2020
Offline
48
#96
S3
На сайте с 29.03.2012
Offline
355
#97
webinfo #:

Указывать родительский пункт.

Но потом еще обрабатывать ответ. С утра набросал сравнительный профайлер по времени и простенький код

import os
import time
import json
import functools
from sqlalchemy import create_engine, text
from sqlalchemy.orm import sessionmaker


def profiler(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start_time = time.time()  # Start the timer
        result = func(*args, **kwargs)  # Execute the function
        end_time = time.time()  # End the timer
        execution_time = end_time - start_time  # Calculate the execution time
        print(f"Execution time for {func.__name__}: {execution_time:.4f} seconds")
        return result  # Return the function result
    return wrapper


@profiler
def get_language_db():
    connector = "postgresql+psycopg2://postgres:postgres@localhost:5432/simple_db"
    engine = create_engine(
        connector,
        connect_args={"options": "-c timezone=utc", "connect_timeout": 30},
    )
    Session = sessionmaker(bind=engine, expire_on_commit=False)
    session = Session()
    try:
        result = session.execute(text("SELECT * FROM menu"))
        return result.fetchall()  # Fetch all the results
    finally:
        session.close()



@profiler
def get_language_from_file(lang: str = "en") -> dict:
    file_name = "lang_settings.json"
    file_path = "".join((os.getcwd(), "/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


if __name__=="__main__":
    print(get_language_from_file())
    print(get_language_db())

И вот результат без кэширования работы с базой:

Файл:

Execution time for get_language: 0.0002 seconds

{'subjects': {'subjects': {'chemistry': 'chemistry', 'math': 'mathematics'}}, 'mentors': 'mentors', 'scheduler': 'scheduler', 'news': 'news', 'adverts': 'adverts'}

База:

Execution time for get_language_db: 0.1151 seconds

[('en        ', 'mentee    ', 'mentee    '), ('en        ', 'mentor    ', 'mentor    '), ('en        ', 'news      ', 'news      '), ('en        ', 'advert    ', 'advert    '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  '), ('en        ', 'schedule  ', 'schedule  ')]

Обратите внимание,  в каком виде ответ. Из файла я сразу получаю удобоваримый json, который могу отдавать в шаблонизатор.
Из базы мне еше нужно написать обработчик, который сконвертит список в json.

FuRReX #:
На DLE достаточно просто.

Натыкать кнопок?? Создать 2 шаблона и два языковых файла? Это вообще не SOLID 😀

FuRReX
На сайте с 04.12.2020
Offline
48
#98
Sly32 #:
Натыкать кнопок?? Создать 2 шаблона и два языковых файла? Это вообще не SOLID 😀

Почему не SOLID? Будет полнота действий без ограничений. Меняй как пожелаешь.

Кнопки для переключения языка можно в селекте натыкать.

Нет необходимости создавать языковые пакеты для версий DLE, они уже давно адаптированы под ru/en/uk, нужно просто подключить к каждому шабу.

А конкретно будущей редакции шаблонов, ничего сложного в этом не вижу, главное не запутаться.

ArbNet
На сайте с 27.10.2019
Offline
142
#99
FuRReX #:
DLE, они уже давно адаптированы под ru/en/uk

Sly32, слушай что люди говорят, они ж плохого не посоветуют, вот чего ты мучаешься с этим json, возьми DLE да и всё. Всё уже придумано, зачем велосипеды изобретать...

ЗЫ. Понимаешь теперь с чем мне приходилось сталкиваться?

Александр Воробьев
На сайте с 03.02.2020
Offline
50
#100
WebStorm #:
во-вторых каждый раз при загрузке этих переводов будет парситься json, это тоже накладные расходы, по-хорошему надо или хранить в отдельных py файлах, чтобы далее сгенерировался байт код pyc или прикрутить компиляцию джейсона в py, а далее в pyc

А зачем json? Почему не обычный массив?

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий