Как получить доступ к локали в пользовательском приложении на стороне сервера в Next.js?

Я переношу проект с next.js 7 на 10. Он использует react-intl для переводов и написан на TypeScript.

В предыдущей версии у меня был пользовательский server.js, и я обрабатывал в нем подмаршрутизацию (/de, /fr и т. д.) для многоязычных целей. А в пользовательском компоненте приложения через getInitialProps я получал локаль из req и передал ее в качестве реквизита моему компоненту. Итак, общая картина была примерно такой:
Пользовательское приложение:

static async getInitialProps({ Component, ctx }) {
    let pageProps = {}

    const { req } = ctx;
    const { locale, messages } = req || (window as any).__NEXT_DATA__.props;
    const initialNow = Date.now();

    if (Component.getInitialProps) {
        pageProps = await Component.getInitialProps(ctx)
    }
    return { pageProps, locale, messages, initialNow }
}

И компонент

render() {
        const { Component, pageProps, locale, messages, initialNow } = (this.props as any);
        return (
            <Container>
                <IntlProvider locale = {locale} messages = {messages} initialNow = {initialNow}>
                    <Component {...pageProps} />
                </IntlProvider>
            </Container>
        )
    }

Теперь, поскольку я использую next.js 10, по многим причинам я удалил пользовательский server.js и выполнил подмаршрутизацию через i18n, поэтому я добавил это в next.config.js:

module.exports = {
   i18n: {
        locales: ["en", "de", "fr"],
        defaultLocale: "en",
    },
}

Единственное, мне нужно передать локаль в IntlProvider реакции-intl на стороне сервера и для всех страниц. Поэтому я полагаю, что должен сделать это в пользовательском приложении, а getInitialProps возвращает неправильное значение для локали (всегда по умолчанию). И мы не можем использовать getServerSideProps или getStaticProps в пользовательском _app.

Итак, наконец! вопрос в том: Как я могу получить доступ к локали на стороне сервера в одном месте для всех моих страниц? Или есть лучший подход к решению этой проблемы?

(Убрать intl и полноценно работать с i18n пока не могу, столько времени нужно на этот конкретный проект, а у нас его нет!)

привет, просто хочу спросить, причина, по которой вы удаляете свой пользовательский сервер, заключается в том, что следующая интернационализация маршрутизации не поддерживает пользовательский сервер? @Али Афса

Paul Wang 01.06.2021 08:52

Привет @Anymore, я удалил пользовательский сервер, так как хотел развернуть свое приложение на Vercel, плюс это вызвало некоторые проблемы с производительностью. Основываясь на документах Next.js 10, рекомендуется не использовать его, если только системы маршрутизации по умолчанию недостаточно для ваших конкретных задач. Пожалуйста, взгляните на пару первых строк этого официального документа: nextjs.org/docs/advanced-features/custom-server

Ali Afsahnoudeh 12.06.2021 18:41
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
7
2
18 109
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете получить доступ к locale в getInitialProps вашего пользовательского приложения через реквизит router.

static async getInitialProps({ Component, ctx, router }) {
    let pageProps = {}

    const { req } = ctx;
    const { locale } = router; // Will return `fr` for `/fr/*` pages
    const { messages } = req || (window as any).__NEXT_DATA__.props;
    const initialNow = Date.now();

    if (Component.getInitialProps) {
        pageProps = await Component.getInitialProps(ctx)
    }
    return { pageProps, locale, messages, initialNow }
}

При использовании getServerSideProps/getStaticProps за пределами пользовательских страниц приложения активная локаль может быть доступна непосредственно из объекта контекста.

export async function getServerSideProps({ locale }) {
    console.info(locale) // Logs current locale    
    // ...
}
export async function getStaticProps({ locale }) {
    console.info(locale) // Logs current locale    
    // ...
}

Для получения более подробной информации см. Документацию по маршрутизации Next.js i18n .

Другие вопросы по теме