Moment: Как изменить локаль в momentJS в React Native?

Созданный на 30 янв. 2018  ·  21Комментарии  ·  Источник: moment/moment

Это то, что у меня есть, но это не работает.

import moment from 'moment' 
import 'moment/min/moment-with-locales' 
import 'moment-duration-format' // used by moment  
componentDidMount () {  
 console.log(moment.locale())   
 console.log(moment.locale('zh-cn'))    
 console.log(moment.locale())  
} 

вывод журнала консоли: en, en, en
ожидаемый вывод журнала консоли: en, zh-cn, zh-cn

Когда я попытался изменить момент импорта с «момент» на момент импорта с «момент/минута/момент-с-локалями», но в этой строке возникает ошибка:

const total = moment.duration(this.props.stoveUsage.total, 'seconds').format('H:mm', { trim: false })

ошибка: momentWithLocales2.default.duration(...).format не является функцией

Troubleshooting Up-For-Grabs

Самый полезный комментарий

import 'moment/min/moment-with-locales'

делает трюк!

moment.locale('fr'); moment().format("ll");

приводит к "1 févr. 2018" , как и ожидалось.

Все 21 Комментарий

Подтверждая это, moment.locale('es') не действует на меня в React Native.

import 'moment/min/moment-with-locales'

делает трюк!

moment.locale('fr'); moment().format("ll");

приводит к "1 févr. 2018" , как и ожидалось.

Если вы не хотите использовать moment-with-locales , который загружает все данные локали, откат к моменту v2.18 исправил это для меня. Определенно есть ошибка с моментом v2.20 и установкой локали в родной реакции.

@Leeds-eBooks Не могли бы вы объяснить, как вы импортируете момент? Я откатился на 2.18, и все же мне нужно импортировать момент из момента с локалями, чтобы заставить локальный работать правильно в реактивном родном

Спасибо

@msevestre Да, конечно, хотя я думаю, что мое решение может быть устаревшим сейчас, я заставил его работать в своем коде и пошел дальше, я думаю, что более поздняя версия момента могла бы это исправить. Тем не менее, мое исправление:

  • установить https://github.com/tqc/moment.git#no-dynamic-import из git вместо moment напрямую из npm
  • тогда:
import moment from 'moment'

import 'moment/src/locale/en-gb'
import 'moment/src/locale/es'
import 'moment/src/locale/fr'
import 'moment/src/locale/pl'
import 'moment/src/locale/pt'
// ...etc

// bonus trick!
import DeviceInfo from 'react-native-device-info'
const deviceLocale = DeviceInfo.getDeviceLocale()
moment.locale([deviceLocale, 'en'])

Это то, что я делаю, и это работает для меня, но, как я уже сказал, это может больше не понадобиться.

@Leeds-eBooks Потрясающе. Спасибо за ваш быстрый отзыв. Действительно помогло

Это сработало для меня,
https://momentjs.com/docs/#/i18n/экземпляр -locale/

Вы должны указать в App.js все слова на языке, чем вы хотите, это будет работать во всех ваших приложениях.

@VanessaChu - у тебя все еще есть проблема?

Это решение работает для меня

Привет, люди, import 'moment/locale/fr'; работает для меня, но если я хочу сделать динамический, например, не нужно импортировать все существующие языки, знаете ли вы какие-нибудь приемы, чтобы сделать что-то вроде import 'moment/locale/[variable]' где переменная нужен ли язык?
Так что это работает с каждой страной... :/

Надеюсь, большинство участников обсуждения решили свои проблемы :) Спасибо @Leeds-eBooks

Для 3.x у нас может быть больше версий moment с/без динамического импорта/es6, так что это не проблема.

Привет @MayeuldP ,
Я не знаю, приедете ли вы, чтобы исправить использование переменных языков моментов в Reactjs / ReactNative, но я хочу поделиться решением, которое может кому-то помочь.
вам не нужно импортировать культуру по культуре, вместо этого просто добавьте: import 'moment/min/locales' only, а позже вы можете установить свой moment.local('') с вашей любимой культурой.

Я использую v2.18, и этот метод работает.

import moment from 'moment';
import momentFR from 'moment/src/locale/fr' 
moment.locale('fr',momentFR );

Привет, @KashifAhmed В версии 2.22.2 вы должны использовать moment.updateLocale('fr',momentFR)

Предупреждение об устаревании: используйте moment.updateLocale(localeName, config) для изменения существующей локали. moment.defineLocale(localeName, config) следует использовать только для создания новой локали. См. http://momentjs.com/guides/#/warnings/define -locale/ для получения дополнительной информации.

Проверь это:

import moment from "moment";
import 'moment/min/locales'

Это включает в себя все конфигурации languajes с момента, это js, так что проблем с размером нет.

Раньше у меня была проблема, когда кто-то устанавливал приложение на мобильный телефон с другим языком.

Отсюда вы можете без проблем установить любую локаль, определенную моментом,

moment.locale('es');

Или используйте языковой стандарт устройства, не беспокоясь о том, что он не соответствует вашим языковым спецификациям, как пример из @benadamstyles.

В моем случае импорта локали было недостаточно, поэтому я использовал импортированный словарь и удалил первый символ подчеркивания _

import moment from 'moment';
import momentPTBR from 'moment/src/locale/pt-br';

function prepareLocale(locale) {
  for (const key in locale) {
    if (locale.hasOwnProperty(key)) {
      // remove first character underscore fom key, i.e. '_calendar' => 'calendar'
      locale[key.substring(1)] = locale[key];
    }
  }
  return locale;
}

moment.defineLocale('pt-br', prepareLocale(momentPTBR));

import 'moment/src/locale/en-gb' у меня не сработало, а import 'moment/locale/en-gb' сработало.

  "dependencies": {
    "expo": "32.0.0",
    "moment": "2.24.0",
    "react": "16.5.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz"
  },

В самом верхнем файле дерева вот как выглядит мой код:

import moment from 'moment'

import 'moment/locale/en-gb'

const momentLocale = moment.locale('en-gb')
if (momentLocale !== 'en-gb') {
  throw new Error(`Moment fell back to locale ${momentLocale}`)
}

export default () => null

Я использую v2.18, и этот метод работает.

` import moment from 'moment'; import momentFR from 'moment/src/locale/fr' moment.locale('fr',momentFR );
не могли бы вы привести несколько примеров.
большое спасибо!

Я изменил свою версию с 2.24 на 2.18, и теперь она работает. Где-то после 2.20 есть баг.

это работа для меня

import moment from 'moment'
import 'moment/locale/pt-br'
moment.locale('pt-br')

это работа для меня

import moment from 'moment'
import 'moment/locale/pt-br'
moment.locale('pt-br')

Убедитесь, что вы проверяете, что то, что вы возвращаете из .locale() , является тем, что вы установили. Он молча падает обратно.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги