You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Streamlit语言切换按钮:解决组件翻译不刷新问题

Streamlit中更新语言后表单组件标签未同步翻译的解决方法

问题描述

我在Streamlit应用中将当前语言名称存储在session_state中,所有翻译文本存于字典内,通过读取session_state的语言值展示对应语言内容。但更新session_state中的语言值后,表单内的multiselect和selectbox标签并未同步刷新翻译。需要在保留session_state其他信息的前提下,实现这些组件的翻译更新。

原代码示例:

def main():
    st.session_state.lang = 'en'
    min_max_date = util_funcs.min_max_date(st.session_state['df'])

    # More code here

    # The "translate" button
    with st.sidebar:
        st.button(label='EN', on_click=lambda: st.session_state.update({'lang': 'en'}))

    with st.form(key='map_properties'):
        # This is the label I want to reload
        st.multiselect(
            content['ams_selector'][st.session_state.lang],
            options=stations,
            default=stations,
            key='station_selector'
        )

        st.selectbox(
            content['metric_selector'][st.session_state.lang],
            options=metrics,
            key='metric_selector'
        )

        submit_button = st.form_submit_button(
            content['submit_button'][st.session_state.lang],
            on_click=form_callback
        )

解决方案

核心原因

Streamlit表单组件的标签在首次渲染后会被缓存,不会自动随session_state的变化重新渲染,需要主动触发组件刷新。


方法1:触发页面重渲染(最简单直接)

在语言切换按钮的回调中调用st.rerun(),让整个页面重新执行脚本,所有组件会读取最新的session_state.lang值更新标签。此方法会保留session_state内的所有用户选择数据。

修改后的代码:

def main():
    # 初始化语言,仅在首次加载时设置
    if 'lang' not in st.session_state:
        st.session_state.lang = 'en'
    min_max_date = util_funcs.min_max_date(st.session_state['df'])

    # More code here

    # 语言切换按钮,添加rerun触发重渲染
    with st.sidebar:
        st.button(label='EN', on_click=lambda: (st.session_state.update({'lang': 'en'}), st.rerun()))
        # 可添加其他语言按钮
        st.button(label='ZH', on_click=lambda: (st.session_state.update({'lang': 'zh'}), st.rerun()))

    with st.form(key='map_properties'):
        st.multiselect(
            content['ams_selector'][st.session_state.lang],
            options=stations,
            default=stations,
            key='station_selector'
        )

        st.selectbox(
            content['metric_selector'][st.session_state.lang],
            options=metrics,
            key='metric_selector'
        )

        submit_button = st.form_submit_button(
            content['submit_button'][st.session_state.lang],
            on_click=form_callback
        )

方法2:动态绑定组件Key(轻量局部刷新)

如果不想触发全页面重渲染,可以给需要翻译的组件Key添加语言后缀。当语言变化时,Streamlit会识别为新组件并重新渲染标签,同时可通过回调同步用户之前的选择值。

修改后的代码:

def switch_lang(new_lang):
    # 同步用户之前的选择到新语言对应的组件Key
    if 'station_selector' in st.session_state:
        st.session_state[f'station_selector_{new_lang}'] = st.session_state['station_selector']
    if 'metric_selector' in st.session_state:
        st.session_state[f'metric_selector_{new_lang}'] = st.session_state['metric_selector']
    # 更新当前语言
    st.session_state.lang = new_lang

def main():
    if 'lang' not in st.session_state:
        st.session_state.lang = 'en'
    current_lang = st.session_state.lang
    min_max_date = util_funcs.min_max_date(st.session_state['df'])

    # More code here

    with st.sidebar:
        st.button(label='EN', on_click=switch_lang, args=('en',))
        st.button(label='ZH', on_click=switch_lang, args=('zh',))

    with st.form(key='map_properties'):
        st.multiselect(
            content['ams_selector'][current_lang],
            options=stations,
            default=stations,
            key=f'station_selector_{current_lang}'
        )

        st.selectbox(
            content['metric_selector'][current_lang],
            options=metrics,
            key=f'metric_selector_{current_lang}'
        )

        submit_button = st.form_submit_button(
            content['submit_button'][current_lang],
            on_click=form_callback
        )

关键注意事项

  • 不要在main()开头直接赋值st.session_state.lang = 'en',否则每次页面刷新都会重置语言,需改为判断lang是否存在后再初始化。

内容的提问来源于stack exchange,提问作者Veneta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:05:33