不使用forceRTL即可反应本机阿拉伯语(RTL)

时间:2019-09-23 07:31:20

标签: react-native react-native-android react-native-ios

在RN我的双语应用程序(英语-阿拉伯语)中,我使用了I18nManager(视图)和I18n(用于翻译)

当我将应用程序语言更改为阿拉伯语时,会使用以下代码从初始屏幕重新加载整个应用程序:

I18nManager.forceRTL(true)

理想情况下,它不应从启动时重启应用程序,而应继续使用阿拉伯数据显示当前屏幕。

目前还没有发生,仅使用I18n.t('keyword')转换翻译元素,但对于阿拉伯对齐视图,这是不正确的。

仍在寻找更好的解决方案,让我知道是否有人实现了。

谢谢
索波!!

5 个答案:

答案 0 :(得分:0)

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

import RNRestart from "react-native-restart";

I18nManager.forceRTL(true); if (!I18nManager.isRTL) RNRestart.Restart();

答案 1 :(得分:0)

我正在一个项目中使用两种语言,阿拉伯语和英语。我使用redux来处理应用程序语言。我将所有样式都放在redux上,并使用redux处理应用程序样式。当用户更改语言时,我应用程序上的所有样式都会更改为该语言。也所有文本也使用redux处理。这样,我的应用程序不会重新加载,并且应用程序语言不会立即更改。

答案 2 :(得分:0)

在世博会中使用

import {Updates} from "expo"

Updates.reload()

答案 3 :(得分:0)

如果你们想在重新加载后存储堆栈状态(因为没有其他选项不重新加载)并且想要返回堆栈状态,您可以点击此链接,也可以检查我的代码。 链接: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>
  );
};

答案 4 :(得分:0)

如果你的应用是安卓混合应用,你可以试试这个:

import com.facebook.react.modules.i18nmanager.I18nUtil;

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

值 'forceRtl' 是一个布尔值。

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