React Native阿拉伯语(RTL)无需强制使用RTL

4
在我的RN双语应用程序(英文 - 阿拉伯语)中,我使用了I18nManager(视图)和I18n(翻译)。
当我将应用程序语言更改为阿拉伯语时,整个应用程序会使用以下代码从启动画面重新加载:
I18nManager.forceRTL(true)

理想情况下,应该不需要从头重新启动应用程序,并且应该使用当前屏幕上的阿拉伯语数据继续。目前这并不是发生的情况,只有翻译元素使用"I18n.t('keyword')"进行转换,但对于视图的阿拉伯语对齐,这是不太合适的。
仍在寻找更好的解决方案,如果有人实现了,请告诉我。
谢谢
Sopo !!
5个回答

3

您应该将此代码放在项目中的顶层组件

import RNRestart from "react-native-restart";

I18nManager.forceRTL(true);

如果不是从右到左阅读,就使用RNRestart.Restart()重启应用。


它会导致应用程序重新加载,我想让它保持不重新加载。 - Sopo
我认为在不重新加载应用程序的情况下改变方向是不可能的。 - morteza moradi

1
如果您想要在重新加载后储存堆栈状态(因为没有其他选项),并且想要获得堆栈状态,请参考此链接,您也可以查看我的代码。 链接:React navigation state persist 任何组件
AsyncStorage.setItem('navigation_state', JSON.stringify(navigation.dangerouslyGetState()));

我的 App.js

const App = () => {
  const [initialState, setInitialState] = useState();
  const [isReady, setIsReady] = useState(false);

  useEffect(() => {
    restoreState();
  }, []);
  const restoreState = async () => {
    try {
      const savedStateString = await AsyncStorage.getItem('navigation_state');
      const state = savedStateString ? JSON.parse(savedStateString) : undefined;
      if (state !== undefined) {
        AsyncStorage.removeItem('navigation_state');
        setInitialState(state);
      }
    } finally {
      setIsReady(true);
    }
  };
  if (!isReady) {
    return null;
  }
  return (
    <Provider store={store}>
      <NavigationContainer
        initialState={initialState}
        ref={rootNavigationRef}>
        <Root>
          <AppNavigator />
        </Root>
      </NavigationContainer>
    </Provider>
  );
};

0
如果您的应用是一个安卓混合应用程序,您可以尝试以下方法:
import com.facebook.react.modules.i18nmanager.I18nUtil;

I18nUtil i18nUtil = I18nUtil.getInstance();
i18nUtil.forceRTL(context, forceRtl);
i18nUtil.allowRTL(context, true);

值 'forceRtl' 是一个布尔值。

对于 iOS,我认为你可以找到相同的方法。


0
我正在开发一个包含阿拉伯语和英语两种语言的项目。我使用redux来处理应用程序的语言。我将所有样式放在redux中,并使用redux来处理应用程序的样式。当用户更改语言时,我的应用程序中的所有样式都会更改为该语言。同时,所有文本也由redux处理。通过这种方式,我的应用程序不需要重新加载,应用程序的语言可以立即更改。

那么没有其他简单的选择吗?如果要转移到redux,这将需要我付出巨大的努力来更改应用程序代码。 - Sopo
是的,这是一个巨大的变化,但我只是分享我的经验,也许可以从中得到一些想法。 - Moein Hosseini

-1

在Expo中使用

import {Updates} from "expo"

Updates.reload()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接