Moment: Como alterar a localidade no momentJS no React Native?

Criado em 30 jan. 2018  ·  21Comentários  ·  Fonte: moment/moment

Isso é o que eu tenho, mas não funciona.

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())  
} 

saídas de log do console: en, en, en
saída esperada do log do console: en, zh-cn, zh-cn

Quando tentei alterar o momento de importação de 'momento' para o momento de importação de 'momento/min/momento-com-locales', mas ele gera um erro nesta linha:

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

erro: momentWithLocales2.default.duration(...).format não é uma função

Troubleshooting Up-For-Grabs

Comentários muito úteis

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

faz o truque!

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

resulta em "1 févr. 2018" como esperado.

Todos 21 comentários

Confirmando isso, moment.locale('es') não tem efeito para mim no React Native.

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

faz o truque!

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

resulta em "1 févr. 2018" como esperado.

Se você não quiser usar moment-with-locales , que carrega todos os dados de localidade, voltando para o momento v2.18 corrigiu isso para mim. Definitivamente, há um bug com o moment v2.20 e a configuração da localidade em reagir nativo.

@Leeds-eBooks Você poderia explicar como você importa o momento? Eu voltei para 2.18 e ainda preciso importar o momento do momento com locales para que o local funcione corretamente no react-native

Obrigado

@msevestre Sim, claro, embora eu ache que minha solução possa estar desatualizada agora, eu fiz funcionar no meu código e segui em frente, acho que uma versão posterior do momento pode ter corrigido. No entanto, minha correção é:

  • instale https://github.com/tqc/moment.git#no-dynamic-import do git, em vez de moment diretamente do npm
  • então:
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'])

Isso é o que estou fazendo, e está funcionando para mim, mas como eu disse, pode não ser mais necessário.

@Leeds-eBooks Incrível. Obrigado pelo seu feedback rápido. Realmente ajudou

Isso funcionou comigo,
https://momentjs.com/docs/#/i18n/instance -locale/

Você deve colocar no App.js todas as palavras para o idioma que desejar, isso funcionará em todos os seus aplicativos.

@VanessaChu - você ainda tem um problema?

Esta solução funciona para mim

Ei pessoal, import 'moment/locale/fr'; funciona para mim, mas se eu quiser fazer um dinâmico, como não ter que importar todos os idiomas existentes, você conhece algum truque para fazer algo como import 'moment/locale/[variable]' where variable é o idioma necessário?
Para que funcione com todos os países... :/

Espero que a maioria dos participantes da discussão tenha resolvido seus problemas :) Obrigado @Leeds-eBooks

Para 3.x, podemos ter mais versões do moment com/sem a importação dinâmica/es6, então isso é um problema menor.

Olá @MayeuldP ,
Não sei se você chega a corrigir usando linguagens variáveis ​​de momentos no Reactjs/ReactNative, mas quero compartilhar a solução pode ajudar alguém.
você não precisa importar cultura por cultura, basta adicionar: import 'moment/min/locales' only e depois você pode definir seu moment.local('') com sua cultura favorita.

Estou usando a v2.18 e esse método funciona.

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

Oi, @KashifAhmed Na v.2.22.2 você deve usar moment.updateLocale('fr',momentFR)

Aviso de descontinuação: use moment.updateLocale(localeName, config) para alterar uma localidade existente. moment.defineLocale(localeName, config) deve ser usado apenas para criar uma nova localidade Veja http://momentjs.com/guides/#/warnings/define -locale/ para mais informações.

Verifique isso:

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

Isso inclui todas as configurações de idioma do momento, é js, então não há problema com tamanho.

Eu tive problema antes quando alguém instala o aplicativo com um celular com idioma diferente.

A partir disso, você pode definir qualquer local definido por momento sem nenhum problema,

moment.locale('es');

Ou usar a localidade do dispositivo sem se preocupar com isso está fora das especificações do seu idioma, como exemplo de @benadamstyles

No meu caso, importar a localidade não foi suficiente, então usei o dicionário importado e removi o primeiro caractere que é um sublinhado _

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' não funcionou para mim, mas import 'moment/locale/en-gb' sim.

  "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"
  },

No arquivo mais alto da árvore, veja como meu código se parece:

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

Estou usando a v2.18 e esse método funciona.

` import moment from 'moment'; import momentFR from 'moment/src/locale/fr' moment.locale('fr',momentFR );
poderia dar alguns exemplos.
Muito obrigado!

Mudei minha versão de 2.24 para 2.18 e agora funciona. Há um bug em algum lugar após 2.20.

seu trabalho para mim

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

seu trabalho para mim

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

Certifique-se de verificar se o que você recebe de .locale() é o que você definiu. Ele cai de volta silenciosamente.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

FGRibreau picture FGRibreau  ·  112Comentários

mau21mau picture mau21mau  ·  69Comentários

lllopo picture lllopo  ·  35Comentários

fernandoacorreia picture fernandoacorreia  ·  31Comentários

theazureshadow picture theazureshadow  ·  44Comentários