From e06ba0139d8ece7acbc611d44241c0aa7b11c4a4 Mon Sep 17 00:00:00 2001
From: Diego Mello <diegolmello@gmail.com>
Date: Fri, 21 Sep 2018 14:24:32 -0300
Subject: [PATCH] [NEW] Portuguese translation (#452)

* [NEW] Portuguese translation

* Remove servers from sidebar
---
 app/containers/Sidebar.js          | 131 ++---------
 app/i18n/index.js                  |   3 +-
 app/i18n/locales/pt-BR.js          | 345 +++++++++++++++++++++++++++++
 app/sagas/init.js                  |  11 +-
 app/views/RoomMembersView/index.js |   2 +-
 app/views/SettingsView/index.js    |   3 +
 6 files changed, 377 insertions(+), 118 deletions(-)
 create mode 100644 app/i18n/locales/pt-BR.js

diff --git a/app/containers/Sidebar.js b/app/containers/Sidebar.js
index d079a0b5a..e471ad734 100644
--- a/app/containers/Sidebar.js
+++ b/app/containers/Sidebar.js
@@ -1,12 +1,9 @@
 import React, { Component } from 'react';
 import PropTypes from 'prop-types';
-import { ScrollView, Text, View, StyleSheet, FlatList, LayoutAnimation, SafeAreaView, AsyncStorage } from 'react-native';
+import { ScrollView, Text, View, StyleSheet, FlatList, LayoutAnimation, SafeAreaView } from 'react-native';
 import { connect } from 'react-redux';
-import FastImage from 'react-native-fast-image';
 import Icon from 'react-native-vector-icons/MaterialIcons';
 
-import database from '../lib/realm';
-import { selectServerRequest } from '../actions/server';
 import { appStart } from '../actions';
 import { logout } from '../actions/login';
 import Avatar from '../containers/Avatar';
@@ -44,11 +41,6 @@ const styles = StyleSheet.create({
 		borderColor: '#ddd',
 		marginVertical: 4
 	},
-	serverImage: {
-		width: 24,
-		height: 24,
-		borderRadius: 4
-	},
 	header: {
 		paddingVertical: 16,
 		flexDirection: 'row',
@@ -90,13 +82,11 @@ const keyExtractor = item => item.id;
 	user: {
 		id: state.login.user && state.login.user.id,
 		language: state.login.user && state.login.user.language,
-		server: state.login.user && state.login.user.server,
 		status: state.login.user && state.login.user.status,
 		username: state.login.user && state.login.user.username
 	},
 	baseUrl: state.settings.Site_Url || state.server ? state.server.server : ''
 }), dispatch => ({
-	selectServerRequest: server => dispatch(selectServerRequest(server)),
 	logout: () => dispatch(logout()),
 	appStart: () => dispatch(appStart('outside'))
 }))
@@ -105,7 +95,6 @@ export default class Sidebar extends Component {
 		baseUrl: PropTypes.string,
 		navigator: PropTypes.object,
 		server: PropTypes.string.isRequired,
-		selectServerRequest: PropTypes.func.isRequired,
 		user: PropTypes.object,
 		logout: PropTypes.func.isRequired,
 		appStart: PropTypes.func
@@ -114,15 +103,12 @@ export default class Sidebar extends Component {
 	constructor(props) {
 		super(props);
 		this.state = {
-			servers: [],
-			showServers: false
+			showStatus: false
 		};
 	}
 
 	componentDidMount() {
-		this.setState(this.getState());
 		this.setStatus();
-		database.databases.serversDB.addListener('change', this.updateState);
 	}
 
 	componentWillReceiveProps(nextProps) {
@@ -131,14 +117,6 @@ export default class Sidebar extends Component {
 		}
 	}
 
-	componentWillUnmount() {
-		database.databases.serversDB.removeListener('change', this.updateState);
-	}
-
-	onPressItem = (item) => {
-		this.props.selectServerRequest(item.id);
-	}
-
 	setStatus = () => {
 		setTimeout(() => {
 			this.setState({
@@ -159,14 +137,6 @@ export default class Sidebar extends Component {
 		});
 	}
 
-	getState = () => ({
-		servers: database.databases.serversDB.objects('servers')
-	})
-
-	updateState = () => {
-		this.setState(this.getState());
-	}
-
 	closeDrawer = () => {
 		this.props.navigator.toggleDrawer({
 			side: 'left',
@@ -175,9 +145,9 @@ export default class Sidebar extends Component {
 		});
 	}
 
-	toggleServers = () => {
+	toggleStatus = () => {
 		LayoutAnimation.easeInEaseOut();
-		this.setState({ showServers: !this.state.showServers });
+		this.setState({ showStatus: !this.state.showStatus });
 	}
 
 	sidebarNavigate = (screen, title) => {
@@ -215,7 +185,7 @@ export default class Sidebar extends Component {
 			selected: this.props.user.status === item.id,
 			onPress: () => {
 				this.closeDrawer();
-				this.toggleServers();
+				this.toggleStatus();
 				if (this.props.user.status !== item.id) {
 					try {
 						RocketChat.setUserPresenceDefaultStatus(item.id);
@@ -227,41 +197,6 @@ export default class Sidebar extends Component {
 		})
 	)
 
-	renderServer = ({ item }) => (
-		this.renderItem({
-			text: item.id,
-			left: <FastImage
-				style={styles.serverImage}
-				source={{ uri: encodeURI(`${ item.id }/assets/favicon_32.png`) }}
-			/>,
-			selected: this.props.server === item.id,
-			onPress: async() => {
-				this.closeDrawer();
-				this.toggleServers();
-				if (this.props.server !== item.id) {
-					this.props.selectServerRequest(item.id);
-					const token = await AsyncStorage.getItem(`${ RocketChat.TOKEN_KEY }-${ item.id }`);
-					if (!token) {
-						this.props.appStart();
-						setTimeout(() => {
-							NavigationActions.push({
-								screen: 'NewServerView',
-								backButtonTitle: '',
-								passProps: {
-									server: item.id
-								},
-								navigatorStyle: {
-									navBarHidden: true
-								}
-							});
-						}, 1000);
-					}
-				}
-			},
-			testID: `sidebar-${ item.id }`
-		})
-	)
-
 	renderNavigation = () => (
 		[
 			this.renderItem({
@@ -292,44 +227,14 @@ export default class Sidebar extends Component {
 		]
 	)
 
-	renderServers = () => (
-		[
-			<FlatList
-				key='status-list'
-				data={this.state.status}
-				extraData={this.props.user}
-				renderItem={this.renderStatusItem}
-				keyExtractor={keyExtractor}
-			/>,
-			this.renderSeparator('separator-status'),
-			<FlatList
-				key='servers-list'
-				data={this.state.servers}
-				extraData={this.props.server}
-				renderItem={this.renderServer}
-				keyExtractor={keyExtractor}
-			/>,
-			this.renderSeparator('separator-add-server'),
-			this.renderItem({
-				text: I18n.t('Add_Server'),
-				left: <Icon
-					name='add'
-					size={20}
-				/>,
-				onPress: () => {
-					this.closeDrawer();
-					this.toggleServers();
-					this.props.navigator.showModal({
-						screen: 'NewServerView',
-						title: I18n.t('Add_Server'),
-						passProps: {
-							previousServer: this.props.server
-						}
-					});
-				},
-				testID: 'sidebar-add-server'
-			})
-		]
+	renderStatus = () => (
+		<FlatList
+			key='status-list'
+			data={this.state.status}
+			extraData={this.props.user}
+			renderItem={this.renderStatusItem}
+			keyExtractor={keyExtractor}
+		/>
 	)
 
 	render() {
@@ -341,10 +246,10 @@ export default class Sidebar extends Component {
 			<SafeAreaView testID='sidebar' style={styles.container}>
 				<ScrollView style={styles.container} {...scrollPersistTaps}>
 					<Touch
-						onPress={() => this.toggleServers()}
+						onPress={() => this.toggleStatus()}
 						underlayColor='rgba(255, 255, 255, 0.5)'
 						activeOpacity={0.3}
-						testID='sidebar-toggle-server'
+						testID='sidebar-toggle-status'
 					>
 						<View style={styles.header}>
 							<Avatar
@@ -361,7 +266,7 @@ export default class Sidebar extends Component {
 								<Text style={styles.currentServerText} numberOfLines={1}>{server}</Text>
 							</View>
 							<Icon
-								name={this.state.showServers ? 'keyboard-arrow-up' : 'keyboard-arrow-down'}
+								name={this.state.showStatus ? 'keyboard-arrow-up' : 'keyboard-arrow-down'}
 								size={30}
 								style={{ paddingHorizontal: 10 }}
 							/>
@@ -370,8 +275,8 @@ export default class Sidebar extends Component {
 
 					{this.renderSeparator('separator-header')}
 
-					{!this.state.showServers ? this.renderNavigation() : null}
-					{this.state.showServers ? this.renderServers() : null}
+					{!this.state.showStatus ? this.renderNavigation() : null}
+					{this.state.showStatus ? this.renderStatus() : null}
 				</ScrollView>
 				<Text style={styles.version}>
 					{DeviceInfo.getReadableVersion()}
diff --git a/app/i18n/index.js b/app/i18n/index.js
index 30ce0ffc5..aeaa983df 100644
--- a/app/i18n/index.js
+++ b/app/i18n/index.js
@@ -1,11 +1,12 @@
 import I18n from 'react-native-i18n';
 import en from './locales/en';
 import ru from './locales/ru';
+import pt from './locales/pt-BR';
 
 I18n.fallbacks = true;
 
 I18n.translations = {
-	en, ru
+	en, ru, pt
 };
 
 export default I18n;
diff --git a/app/i18n/locales/pt-BR.js b/app/i18n/locales/pt-BR.js
new file mode 100644
index 000000000..f0e4ef42b
--- /dev/null
+++ b/app/i18n/locales/pt-BR.js
@@ -0,0 +1,345 @@
+export default {
+	'1_online_member': '1 membro online',
+	'1_person_reacted': '1 pessoa reagiu',
+	'1_user': '1 usuário',
+	'error-action-not-allowed': '{{action}} não é permitido',
+	'error-application-not-found': 'Aplicação não encontrada',
+	'error-archived-duplicate-name': 'Já há um canal arquivado com o nome {{room_name}}',
+	'error-avatar-invalid-url': 'URL inválida de avatar: {{url}}',
+	'error-avatar-url-handling': 'Erro durante o manuseio configuração avatar a partir de uma URL ({{url}}) para {{username}}',
+	'error-cant-invite-for-direct-room': 'Não é possível convidar usuários para salas diretas',
+	'error-could-not-change-email': 'Não foi possível mudar e-mail',
+	'error-could-not-change-name': 'Não foi possível mudar o nome',
+	'error-could-not-change-username': 'Não foi possível alterar o nome de usuário',
+	'error-delete-protected-role': 'Não é possível remover um papel protegido',
+	'error-department-not-found': 'Departamento não encontrado',
+	'error-direct-message-file-upload-not-allowed': 'Compartilhamento de arquivos não está permitido em mensagens diretas',
+	'error-duplicate-channel-name': 'Já existe um canal com nome {{channel_name}}',
+	'error-email-domain-blacklisted': 'O domínio de e-mail está na lista negra',
+	'error-email-send-failed': 'Erro ao tentar enviar e-mail: {{message}}',
+	'error-field-unavailable': '{{field}} já está sendo usado :(',
+	'error-file-too-large': 'Arquivo é muito grande',
+	'error-importer-not-defined': 'O importador não foi definido corretamente;  está faltando a classe Import.',
+	'error-input-is-not-a-valid-field': '{{input}} não é válido um {{field}}',
+	'error-invalid-actionlink': 'Link de ação inválido',
+	'error-invalid-arguments': 'Argumentos inválidos',
+	'error-invalid-asset': 'Arquivo Inválido',
+	'error-invalid-channel': 'Canal inválido.',
+	'error-invalid-channel-start-with-chars': 'Canal inválido. Comece com @ ou #',
+	'error-invalid-custom-field': 'Campo personalizado inválido',
+	'error-invalid-custom-field-name': 'Nome inválido para o campo personalizado. Use apenas letras, números, hífens e underscores.',
+	'error-invalid-date': 'Data fornecida inválida',
+	'error-invalid-description': 'Descrição inválida',
+	'error-invalid-domain': 'Domínio inválido',
+	'error-invalid-email': '{{email}} não é um e-mail válido',
+	'error-invalid-email-address': 'Endereço de e-mail inválido',
+	'error-invalid-file-height': 'Altura de arquivo inválida',
+	'error-invalid-file-type': 'Tipo de arquivo inválido',
+	'error-invalid-file-width': 'Altura de arquivo inválida',
+	'error-invalid-from-address': 'Você informou um e-mail DE inválido.',
+	'error-invalid-integration': 'Integração inválida',
+	'error-invalid-message': 'Mensagem inválida',
+	'error-invalid-method': 'Método inválido',
+	'error-invalid-name': 'Nome inválido',
+	'error-invalid-password': 'Senha inválida',
+	'error-invalid-redirectUri': 'redirectUri inválido',
+	'error-invalid-role': 'Papel inválido',
+	'error-invalid-room': 'Sala inválida',
+	'error-invalid-room-name': '{{room_name}} não é um nome de sala válido',
+	'error-invalid-room-type': '{{type}} não é um tipo de sala válido.',
+	'error-invalid-settings': 'Configurações fornecidas inválidas',
+	'error-invalid-subscription': 'Assinatura inválida',
+	'error-invalid-token': 'Token inválido',
+	'error-invalid-triggerWords': 'triggerWords inválidos',
+	'error-invalid-urls': 'URLs inválidas',
+	'error-invalid-user': 'Usuário inválido',
+	'error-invalid-username': 'Nome de usuário Inválido',
+	'error-invalid-webhook-response': 'O URL do webhook respondeu com um status diferente de 200',
+	'error-message-deleting-blocked': 'Exclusão de mensagens está bloqueada',
+	'error-message-editing-blocked': 'Edição de mensagens está bloqueada',
+	'error-message-size-exceeded': 'O tamanho da mensagem excede Message_MaxAllowedSize',
+	'error-missing-unsubscribe-link': 'Você deve fornecer o link para desinscrever-se: [unsubscribe].',
+	'error-no-tokens-for-this-user': 'Não existem tokens para este usuário',
+	'error-not-allowed': 'Não permitido',
+	'error-not-authorized': 'Não autorizado',
+	'error-password-policy-not-met': 'A senha não atende a política do servidor',
+	'error-password-policy-not-met-maxLength': 'A senha não está de acordo com a política de comprimento máximo do servidor  (senha muito longa)',
+	'error-password-policy-not-met-minLength': 'A senha não está de acordo com a política de comprimento mínimo do servidor  (senha muito curta)',
+	'error-password-policy-not-met-oneLowercase': 'A senha não está de acordo com a política do servidor de pelo menos um caractere minúsculo.',
+	'error-password-policy-not-met-oneNumber': 'A senha não está de acordo com a política do servidor, de pelo menos um caractere numérico.',
+	'error-password-policy-not-met-oneSpecial': 'A senha não está de acordo com a política do servidor, de pelo menos um caractere especial.',
+	'error-password-policy-not-met-oneUppercase': 'A senha não está de acordo com a política do servidor, de pelo menos um caractere maiúsculo.',
+	'error-password-policy-not-met-repeatingCharacters': 'A senha não está de acordo com a política do servidor, relativamente aos caracteres proibidos repetidos (existem vários caracteres proibidos próximos uns dos outros)',
+	'error-push-disabled': 'Notificações push desativadas',
+	'error-remove-last-owner': 'Este é o último proprietário. Por favor, defina um novo proprietário antes de remover este.',
+	'error-role-in-use': 'Não é possível remover o papel pois ele está em uso',
+	'error-role-name-required': 'Nome do papel é obrigatório',
+	'error-the-field-is-required': 'O campo {{field}} é obrigatório.',
+	'error-too-many-requests': 'Erro, muitas solicitações. Por favor, diminua a velocidade. Você deve esperar {{seconds}} segundos antes de tentar novamente.',
+	'error-user-has-no-roles': 'O usuário não possui permissões',
+	'error-user-is-not-activated': 'O usuário não está ativo',
+	'error-user-limit-exceeded': 'O número de usuários que você está tentando convidar para #channel_name excede o limite determindado pelo administrador',
+	'error-user-not-in-room': 'O usuário não está nesta sala',
+	'error-user-registration-disabled': 'O registro do usuário está desativado',
+	'error-user-registration-secret': 'O registro de usuário é permitido somente via URL secreta',
+	'error-you-are-last-owner': 'Você é o último proprietário da sala. Por favor defina um novo proprietário antes de sair.',
+	Actions: 'Ações',
+	activity: 'atividade',
+	Activity: 'Atividade',
+	Add_Reaction: 'Reagir',
+	Add_Server: 'Adicionar servidor',
+	Add_user: 'Adicionar usuário',
+	Alert: 'Alerta',
+	alert: 'alerta',
+	alerts: 'alertas',
+	All_users_in_the_channel_can_write_new_messages: 'Todos usuários no canal podem enviar mensagens novas',
+	All: 'Todos',
+	Allow_Reactions: 'Permitir reagir',
+	Alphabetical: 'Alfabético',
+	and_more: 'e mais',
+	and: 'a',
+	announcement: 'anúncio',
+	Announcement: 'Anúncio',
+	ARCHIVE: 'ARQUIVAR',
+	archive: 'arquivar',
+	are_typing: 'estão digitando',
+	Are_you_sure_question_mark: 'Você tem certeza?',
+	Are_you_sure_you_want_to_leave_the_room: 'Tem certeza de que deseja sair da sala {{room}}?',
+	Authenticating: 'Autenticando',
+	Avatar_changed_successfully: 'Avatar alterado com sucesso!',
+	Avatar_Url: 'Avatar URL',
+	Away: 'Ausente',
+	Block_user: 'Bloquear usuário',
+	Broadcast_channel_Description: 'Somente usuários autorizados podem escrever novas mensagens, mas os outros usuários poderão responder',
+	Broadcast_Channel: 'Canal de Transmissão',
+	Busy: 'Ocupado',
+	By_proceeding_you_are_agreeing: 'Ao prosseguir você está aceitando',
+	Cancel_editing: 'Cancelar edição',
+	Cancel_recording: 'Cancelar gravação',
+	Cancel: 'Cancelar',
+	changing_avatar: 'trocando avatar',
+	creating_channel: 'criando canal',
+	Channel_Name: 'Nome do Canal',
+	Channels: 'Canais',
+	Chats: 'Conversas',
+	Close: 'Fechar',
+	Close_emoji_selector: 'Fechar seletor de emojis',
+	Choose: 'Escolher',
+	Choose_from_library: 'Escolha da biblioteca',
+	Code: 'Código',
+	Colaborative: 'Colaborativo',
+	Connect: 'Conectar',
+	Connect_to_a_server: 'Conectar a um servidor',
+	Connected_to: 'Conectado a',
+	Connecting: 'Conectando',
+	Copied_to_clipboard: 'Copiado para a área de transferência!',
+	Copy_Message: 'Copiar Mensagem',
+	Copy_Permalink: 'Copiar Link-Permanente',
+	Create_account: 'Criar conta',
+	Create_Channel: 'Criar Canal',
+	Create_a_new_workspace: 'Criar nova área de trabalho',
+	Create: 'Criar',
+	Delete_Room_Warning: 'A exclusão de uma sala irá apagar todas as mensagens postadas na sala. Isso não pode ser desfeito.',
+	delete: 'excluir',
+	Delete: 'Excluir',
+	DELETE: 'EXCLUIR',
+	description: 'descrição',
+	Description: 'Descrição',
+	Disable_notifications: 'Desabilitar notificações',
+	Direct_Messages: 'Mensagens Diretas',
+	Do_you_really_want_to_key_this_room_question_mark: 'Você quer realmente {{key}} esta sala?',
+	edit: 'editar',
+	erasing_room: 'apagando sala',
+	Edit: 'Editar',
+	Email_or_password_field_is_empty: 'Email ou senha estão vazios',
+	Email: 'Email',
+	Enable_notifications: 'Habilitar notificações',
+	Everyone_can_access_this_channel: 'Todos podem acessar este canal',
+	Error_uploading: 'Erro subindo',
+	Favorites: 'Favoritos',
+	Files: 'Arquivos',
+	Finish_recording: 'Encerrar gravação',
+	For_your_security_you_must_enter_your_current_password_to_continue: 'Para sua segurança, você precisa digitar sua senha',
+	Forgot_my_password: 'Esqueci minha senha',
+	Forgot_password_If_this_email_is_registered: 'Se este e-mail estiver cadastrado, enviaremos instruções sobre como redefinir sua senha. Se você não receber um e-mail em breve, volte e tente novamente.',
+	Forgot_password: 'Esqueci minha senha',
+	Forgot_Password: 'Esqueci minha senha',
+	Group_by_favorites: 'Grupos favoritos',
+	Group_by_type: 'Grupos por tipo',
+	Has_joined_the_channel: 'Entrou no canal',
+	Has_left_the_channel: 'Saiu da conversa',
+	I_have_an_account: 'Eu tenho uma conta',
+	Invisible: 'Invisível',
+	Invite: 'Convidar',
+	is_typing: 'está digitando',
+	Join_the_community: 'Junte-se à comunidade',
+	Join: 'Entrar',
+	Just_invited_people_can_access_this_channel: 'Apenas as pessoas convidadas podem acessar este canal',
+	Language: 'Idioma',
+	last_message: 'última mensagem',
+	Leave_channel: 'Sair do canal',
+	leaving_room: 'saindo do canal',
+	leave: 'sair',
+	Livechat: 'Livechat',
+	Login: 'Entrar',
+	Logout: 'Sair',
+	Members: 'Membros',
+	Mentioned_Messages: 'Mensagens mencionadas',
+	mentioned: 'mencionado',
+	Mentions: 'Menções',
+	Message_accessibility: 'Mensagem de {{user}} às {{time}}: {{message}}',
+	Message_actions: 'Ações',
+	Message_pinned: 'Fixou uma mensagem',
+	Message_removed: 'Mensagem removida',
+	Messages: 'Mensagens',
+	Microphone_Permission_Message: 'Rocket Chat precisa de acesso ao seu microfone para enviar mensagens de áudio.',
+	Microphone_Permission: 'Acesso ao Microfone',
+	Mute: 'Mudo',
+	muted: 'mudo',
+	N_online_members: '{{n}} membros online',
+	N_people_reacted: '{{n}} pessoas reagiram',
+	N_users: '{{n}} usuários',
+	name: 'nome',
+	Name: 'Nome',
+	New_in_RocketChat_question_mark: 'Novo no Rocket.Chat?',
+	New_Message: 'Nova Mensagem',
+	New_Password: 'Nova Senha',
+	Next: 'Próximo',
+	No_files: 'Não há arquivos',
+	No_mentioned_messages: 'Não há menções',
+	No_pinned_messages: 'Não há mensagens fixadas',
+	No_snippeted_messages: 'Não há trechos de mensagens',
+	No_starred_messages: 'Não há mensagens favoritas',
+	No_announcement_provided: 'Sem anúncio.',
+	No_description_provided: 'Sem descrição.',
+	No_topic_provided: 'Sem tópico.',
+	No_Message: 'Não há mensagens',
+	No_Reactions: 'Sem reações',
+	Nothing_to_save: 'Nada para salvar!',
+	Notify_active_in_this_room: 'Notificar usuários ativos nesta sala',
+	Notify_all_in_this_room: 'Notificar todos nesta sala',
+	Offline: 'Offline',
+	Oops: 'Ops!',
+	Online: 'Online',
+	Only_authorized_users_can_write_new_messages: 'Somente usuários autorizados podem escrever novas mensagens',
+	Open_emoji_selector: 'Abrir seletor de emoji',
+	Open_Source_Communication: 'Comunicação Open Source',
+	Or_continue_using_social_accounts: 'Ou continue usando redes sociais',
+	Password: 'Senha',
+	Permalink_copied_to_clipboard: 'Link-permanente copiado para a área de transferência!',
+	Pin: 'Fixar',
+	Pinned_Messages: 'Mensagens Fixadas',
+	pinned: 'fixada',
+	Pinned: 'Mensagens Fixadas',
+	Please_enter_your_password: 'Por favor, digite sua senha',
+	Preferences_saved: 'Preferências salvas!',
+	Privacy_Policy: ' Política de Privacidade',
+	Private_Channel: 'Canal Privado',
+	Private_Groups: 'Grupo Privado',
+	Private: 'Privado',
+	Profile_saved_successfully: 'Perfil salvo com sucesso!',
+	Profile: 'Perfil',
+	Public_Channel: 'Canal Público',
+	Public: 'Público',
+	Quote: 'Citar',
+	Reactions_are_disabled: 'Reagir está desabilitado',
+	Reactions_are_enabled: 'Reagir está habilitado',
+	Reactions: 'Reações',
+	Read_Only_Channel: 'Canal Somente Leitura',
+	Read_Only: 'Somente Leitura',
+	Register: 'Registrar',
+	Repeat_Password: 'Repetir Senha',
+	Reply: 'Responder',
+	Resend: 'Reenviar',
+	Reset_password: 'Resetar senha',
+	RESET: 'RESETAR',
+	Roles: 'Papéis',
+	Room_actions: 'Ações',
+	Room_changed_announcement: 'O anúncio da sala foi alterado para: {{announcement}} por {{userBy}}',
+	Room_changed_description: 'A descrição da sala foi alterada para: {{description}} por {{userBy}}',
+	Room_changed_privacy: 'Tipo da sala mudou para: {{type}} por {{userBy}}',
+	Room_changed_topic: 'Tópico da sala mudou para: {{topic}} por {{userBy}}',
+	Room_Files: 'Arquivos',
+	Room_Info_Edit: 'Editar',
+	Room_Info: 'Informações da Sala',
+	Room_Members: 'Membros',
+	Room_name_changed: 'Nome da sala alterado para: {{name}} por {{userBy}}',
+	SAVE: 'SALVAR',
+	Save_Changes: 'Salvar Alterações',
+	Save: 'Salvar',
+	saving_preferences: 'salvando preferências',
+	saving_profile: 'salvando perfil',
+	saving_settings: 'salvando configurações',
+	Search_Messages: 'Buscar Mensagens',
+	Search: 'Buscar',
+	Select_Avatar: 'Selecionar Avatar',
+	Select_Users: 'Selecionar Usuários',
+	Send: 'Enviar',
+	Send_audio_message: 'Enviar mensagem de áudio',
+	Send_message: 'Enviar mensagem',
+	Server: 'Servidor',
+	Settings: 'Configurações',
+	Settings_succesfully_changed: 'Configurações salvas com sucesso!',
+	Share_Message: 'Compartilhar Mensagem',
+	Share: 'Compartilhar',
+	Sign_in_your_server: 'Entrar no seu servidor',
+	Sign_Up: 'Registrar',
+	Snippet_Messages: 'Trecho de Mensagens',
+	snippeted: 'trecho de mensagem',
+	Snippets: 'Trecho de mensagem',
+	Some_field_is_invalid_or_empty: 'Algum campo está inválido ou vazio',
+	Sorting_by: 'Ordenando por {{key}}',
+	Star_room: 'Favoritar sala',
+	Star: 'Favorito',
+	Starred_Messages: 'Mensagens Favoritas',
+	starred: 'favoritou',
+	Starred: 'Mensagens Favoritas',
+	Start_of_conversation: 'Início da conversa',
+	Submit: 'Enviar',
+	Take_a_photo: 'Tirar uma foto',
+	Terms_of_Service: ' Termos de Serviço ',
+	The_URL_is_invalid: 'A URL fornecida é inválida ou não acessível. Por favor tente novamente, mas com uma url diferente.',
+	There_was_an_error_while_action: 'Acontece um erro {{action}}!',
+	This_room_is_blocked: 'Este quarto está bloqueado',
+	This_room_is_read_only: 'Este quarto é apenas de leitura',
+	Timezone: 'Fuso horário',
+	topic: 'tópico',
+	Topic: 'Tópico',
+	Try_again: 'Tentar novamente',
+	Type_the_channel_name_here: 'Digite o nome do canal',
+	unarchive: 'desarquivar',
+	UNARCHIVE: 'DESARQUIVAR',
+	Unblock_user: 'Desbloquear usuário',
+	Unmute: 'Permitir que o usuário fale',
+	unmuted: 'permitiu que o usuário fale',
+	Unpin: 'Desafixar Mensagem',
+	unread_messages: 'mensagens não lidas',
+	Unread: 'Não lidas',
+	Unread_on_top: 'Não lidas no topo',
+	Unstar: 'Remover favorito',
+	Uploading: 'Subindo arquivo',
+	User_added_by: 'Usuário {{userAdded}} adicionado por {{userBy}}',
+	User_has_been_key: 'Usuário foi {{key}}!',
+	User_is_no_longer_role_by_: '{{user}} não pertence mais à {{role}} por {{userBy}}',
+	User_muted_by: 'User {{userMuted}} muted por {{userBy}}',
+	User_removed_by: 'Usuário {{userRemoved}} removido por {{userBy}}',
+	User_unmuted_by: '{{userBy}} permitiu que {{userUnmuted}} fale na sala',
+	User_was_set_role_by_: '{{user}} foi definido como {{role}} por {{userBy}}',
+	Username_is_empty: 'Usuário está vazio',
+	Username: 'Usuário',
+	Video_call: 'Chamada de vídeo',
+	Voice_call: 'Chamada de voz',
+	Welcome: 'Bem vindo',
+	Welcome_title_pt_1: 'Prepare-se para decolar com',
+	Welcome_title_pt_2: 'a melhor plataforma de chat',
+	Welcome_to_RocketChat: 'Bem vindo ao Rocket.Chat',
+	Yes_action_it: 'Sim, {{action}}!',
+	Yesterday: 'Ontem',
+	You_are_in_preview_mode: 'Está é uma prévia do canal',
+	You_are_offline: 'Você está offline',
+	You_can_search_using_RegExp_eg: 'Você pode pesquisar usando expressões regulares, por exemplo `/^text$/i`',
+	You_colon: 'Você: ',
+	you_were_mentioned: 'você foi mencionado',
+	You_will_not_be_able_to_recover_this_message: 'Você não será capaz de recuperar essa mensagem!',
+	you: 'você'
+};
diff --git a/app/sagas/init.js b/app/sagas/init.js
index 8ed38b4f0..ccdddb332 100644
--- a/app/sagas/init.js
+++ b/app/sagas/init.js
@@ -8,6 +8,7 @@ import { setAllPreferences } from '../actions/sortPreferences';
 import { APP } from '../actions/actionsTypes';
 import RocketChat from '../lib/rocketchat';
 import log from '../utils/log';
+import I18n from '../i18n';
 
 const restore = function* restore() {
 	try {
@@ -22,9 +23,13 @@ const restore = function* restore() {
 		if (currentServer) {
 			yield put(selectServerRequest(currentServer));
 
-			const login = yield call([AsyncStorage, 'getItem'], `${ RocketChat.TOKEN_KEY }-${ currentServer }`);
-			if (login) {
-				yield put(setUser(JSON.parse(login)));
+			const user = yield call([AsyncStorage, 'getItem'], `${ RocketChat.TOKEN_KEY }-${ currentServer }`);
+			if (user) {
+				const userParsed = JSON.parse(user);
+				if (userParsed.language) {
+					I18n.locale = userParsed.language;
+				}
+				yield put(setUser(userParsed));
 			}
 		}
 
diff --git a/app/views/RoomMembersView/index.js b/app/views/RoomMembersView/index.js
index 2b6f4e6ba..84c893fbc 100644
--- a/app/views/RoomMembersView/index.js
+++ b/app/views/RoomMembersView/index.js
@@ -73,7 +73,7 @@ export default class RoomMembersView extends LoggedView {
 					this.setState({ allUsers, members });
 					this.props.navigator.setButtons({
 						rightButtons: [{
-							title: this.state.allUsers ? 'Online' : 'All',
+							title: this.state.allUsers ? I18n.t('Online') : I18n.t('All'),
 							id: 'toggleOnline',
 							testID: 'room-members-view-toggle-status'
 						}]
diff --git a/app/views/SettingsView/index.js b/app/views/SettingsView/index.js
index 2de1393d0..016e78952 100644
--- a/app/views/SettingsView/index.js
+++ b/app/views/SettingsView/index.js
@@ -38,6 +38,9 @@ export default class SettingsView extends LoggedView {
 			languages: [{
 				label: 'English',
 				value: 'en'
+			}, {
+				label: 'Português',
+				value: 'pt-BR'
 			}, {
 				label: 'Russian',
 				value: 'ru'
-- 
GitLab