Справа налево для определенного текста в React-Native RTL

Я разрабатываю приложение на арабском языке в React Native, я использовал вкладки и меню из собственной базы. я выровнял правильно, потому что есть только одно слово. но теперь мне нужно написать предложение, которое выровнено справа налево. Есть ли способ установить формат RTL для определенного текста, потому что, когда я установил I18nManager.forceRTL(true);, он изменил его для всего приложения, и моя предыдущая работа была разрушена, а вкладки не работают правильно. пожалуйста помоги .


person Asad    schedule 02.05.2017    source источник


Ответы (1)


Версия React Native теперь 0.57, и пока нет нативной конфигурации для поддержки RTL.

Но для этого есть нативное решение. для IOS и Android используйте следующую конфигурацию:

IOS:

найдите файл AppDeligete.m в пути к проекту, затем импортируйте библиотеку RCTI18nUtil из React и поместите конфигурацию RTL в класс didFinishLaunchingWithOptions. После установки моих конфигов у вас будет следующий код:

/* AppDeligete.m */
#import <React/RCTI18nUtil.h> //<== AmerllicA config
#import "AppDelegate.h"

#import <React/RCTBundleURLProvider.h>
#import <React/RCTRootView.h>


@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  [[RCTI18nUtil sharedInstance] allowRTL:YES]; //<== AmerllicA config
  [[RCTI18nUtil sharedInstance] forceRTL:YES]; //<== AmerllicA config

  NSURL *jsCodeLocation;

  jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil];

  RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
                                                      moduleName:@"rntest"
                                               initialProperties:nil
                                                   launchOptions:launchOptions];
  rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1];

  self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
  UIViewController *rootViewController = [UIViewController new];
  rootViewController.view = rootView;
  self.window.rootViewController = rootViewController;
  [self.window makeKeyAndVisible];
  return YES;
}

@end

Android:

найдите файл MainApplication.java в пути к проекту, затем импортируйте класс I18nUtil из com.facebook.react.modules.i18nmanager и поместите конфигурацию RTL внутри MainApplication после функции onCreate. После установки моих конфигов у вас будет следующий код:

/* MainAppliaction.java */

package com.rntest;

import android.app.Application;

import com.facebook.react.ReactApplication;
import com.oblador.vectoricons.VectorIconsPackage;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;

import java.util.Arrays;
import java.util.List;

import com.facebook.react.modules.i18nmanager.I18nUtil; //<== AmerllicA config


public class MainApplication extends Application implements ReactApplication {

    private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
        @Override
        public boolean getUseDeveloperSupport() {
            return BuildConfig.DEBUG;
        }

        @Override
        protected List<ReactPackage> getPackages() {
            return Arrays.<ReactPackage>asList(
                    new MainReactPackage(),
                    new VectorIconsPackage()
            );
        }

        @Override
        protected String getJSMainModuleName() {
            return "index";
        }
    };

    @Override
    public ReactNativeHost getReactNativeHost() {
        return mReactNativeHost;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        I18nUtil sharedI18nUtilInstance = I18nUtil.getInstance(); //<== AmerllicA config
        sharedI18nUtilInstance.forceRTL(this, true); //<== AmerllicA config
        sharedI18nUtilInstance.allowRTL(this, true); //<== AmerllicA config

        SoLoader.init(this, /* native exopackage */ false);
    }
}

Теперь перезапустите свои реагирующие нативные стеки. эти конфигурации требуют перезапуска процесса разработки. После перезапуска проект готов к RTL, для моего проекта все FlexBox поведения меняются на right to left. Повторяю, ВСЕ ПОВЕДЕНИЕ.

ПРИМЕЧАНИЕ. В Android все компоненты react native изменятся на направление RTL, но в IOS для направления справа налево компонента react native Text используйте writingDirection: 'rtl' код стиля.

ВНИМАНИЕ: использование textAlign: 'right/left/center' — это другая концепция. Направление RTL/LTR.

person AmerllicA    schedule 18.09.2018
comment
Лучший ответ для форсирования RTL, мне нравится - person Rondev; 04.10.2020