React Redux Localization in the Class Component - reactjs

I am developing a React Application and I added React Redux Localization library from AlternativaPlatform for localization and text translation to my application. The library works fine for simple text because I will need to call <Translate value="hello" /> every time I want to translate the text and this component will return the string within the <span></span> tag. I am having trouble to translate all texts which are defined in the class component. I have done a research and read the documentation but I did not find a solution since yesterday.
What I have been trying to do, I created the following files in my project;
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { createStore, combineReducers } from 'redux';
import { Provider } from 'react-redux';
import { localeReducer } from 'react-redux-localization';
import App from './App';
import './index.css';
const rootReducer = combineReducers({ locale: localeReducer });
const store = createStore(rootReducer);
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
);
App.js
import React, { Component } from 'react';
import './App.css';
import { BrowserRouter, Route } from 'react-router-dom';
import Home from './components/Home';
class App extends Component {
render() {
return (
<BrowserRouter>
<div>
<Route exact path="/" component={Home} />
</div>
</BrowserRouter>
);
}
}
export default App;
Home.js
import React, { Component } from 'react';
import NavigationBar from './Navbar';
import Footer from './Footer';
/*
* Home component
*/
export default class Home extends Component {
render() {
return (
<div>
<NavigationBar />
<Footer />
</div>
);
}
}
Navbar.js
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { NavLink } from 'react-router-dom';
import { Nav, Navbar, NavItem, OverlayTrigger, Popover, InputGroup, Button, FormControl, Tooltip, Glyphicon } from 'react-bootstrap';
import { localize } from 'react-redux-localization';
import translations from './translation/data-translations.json';
import Switcher from './translation/Switcher';
import Translate from './translation/Translate';
/*
* Navigation bar Component
*/
class NavigationBar extends Component {
render() {
return (
<Navbar fixedTop>
<Navbar.Header>
<Navbar.Brand>
<NavLink to="/"><img alt="logo" src="/logo.png" className="cfn-logo" /></NavLink>
</Navbar.Brand>
<Navbar.Toggle />
</Navbar.Header>
<Navbar.Collapse>
<div className="top-navigation">
<Nav>
<NavItem eventKey={1} href="https://twitter.com/code4africa" target="_blank"><Translate value="Get_in_touch" /></NavItem>
<OverlayTrigger trigger="click" placement="bottom" overlay={<EmbedPopup />} rootClose={true}>
<NavItem eventKey={2} href="#"><Translate value="Embed_this" /> <i className="fa fa-caret-down" aria-hidden="true"></i></NavItem>
</OverlayTrigger>
<NavItem className="navitem-divider"></NavItem>
<NavItem eventKey={3} href=" https://facebook.com" target="_blank">
<i className="fa fa-facebook" aria-hidden="true"></i>
</NavItem>
<NavItem href="https://twitter.com" target="_blank">
<i className="fa fa-twitter" aria-hidden="true"></i>
</NavItem>
</Nav>
<div className="language-switcher-btns">
<Switcher />
</div>
</div>
</Navbar.Collapse>
</Navbar >
);
}
}
export default localize(translations)(NavigationBar);
And the Translate component as;
./traslation/Translate.js
import React from 'react';
import { localize } from 'react-redux-localization';
import translations from './data-translations.json';
const Translate = ({ l , value}) => (
<span>{l(value)}</span>
);
export default localize(translations)(Translate);
By calling the Translate component as <Translate value="hello" /> it will return the translated value based on the locale BUT inside <span></span> tag. I tried to remove the <span></span> in the Translate component but it does not compile.

Related

React NavLink does not render the components

I am working on a retirement calculator. It has a navigation component with links, I set a router with paths in App.js. But the navlinks do not work. I am not sure what is wrong with the code. Please help I am new to reactjs
App.js
import logo from './logo.svg';
import './App.css';
import InputForm from './InputForm';
import Navigation from './Navigation';
import 'bootstrap/dist/css/bootstrap.min.css';
import { BrowserRouter, Route, Switch } from 'react-router-dom';
import DisplayTable from './DisplayTable';
import RetirementComaparisionForm from './RetirementComparisionForm';
function App() {
return (
<BrowserRouter>
<div className="App">
<Navigation />
<Switch>
<Route exact path = "/" component = {InputForm}></Route>
<Route exact path = "/retirementcomaparisionform" component = {RetirementComaparisionForm}></Route>
</Switch>
</div>
</BrowserRouter>
);
}
export default App;
Navigation.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import DisplayTable from './DisplayTable';
import {NavLink} from 'react-router-dom';
import {Navbar, Nav} from 'react-bootstrap';
class Navigation extends React.Component{
render(){
return(
<Navbar bg="dark" expand="lg" variant = "dark">
<Navbar.Brand>Retirement Calculator</Navbar.Brand>
<Navbar.Toggle aria-controls="basic-navbar-nav" />
<Navbar.Collapse id="basic-navbar-nav">
<Nav className="mr-auto">
<Nav.Link to = "/">Home</Nav.Link>
<Nav.Link to = "/retirementcomaparisionform">Compare</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
)
}
}
export default Navigation;
Here is the working Example: StackBlitz
import React from "react";
import ReactDOM from "react-dom";
import reportWebVitals from "./reportWebVitals";
import DisplayTable from "./DisplayTable";
import { NavLink, Link } from "react-router-dom";
import { Navbar, Nav } from "react-bootstrap";
import "bootstrap/dist/css/bootstrap.min.css";
import { BrowserRouter, Route, Switch } from "react-router-dom";
function App() {
return (
<BrowserRouter>
<div className="App">
<Navigation />
<Switch>
<Route exact path="/" component={InputForm} />
<Route
path="/retirementcomaparisionform"
component={RetirementComaparisionForm}
/>
</Switch>
</div>
</BrowserRouter>
);
}
export default App;
class Navigation extends React.Component {
render() {
return (
<Navbar bg="dark" expand="lg" variant="dark">
<Navbar.Brand>Retirement Calculator</Navbar.Brand>
<Navbar.Toggle aria-controls="basic-navbar-nav" />
<Navbar.Collapse id="basic-navbar-nav">
<Nav className="mr-auto">
<Nav.Link href="/">Home</Nav.Link>
<Nav.Link href="/retirementcomaparisionform">Compare</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
}
}
//dummy InputForm and RetirementComaparisionForm components
const InputForm = () => {
return <h1>Input Form</h1>;
};
const RetirementComaparisionForm = () => {
return <h1>Retirement Comaparision Form</h1>;
};

React router not rendering components anymore except the default one

I took a break from my project for a day and today I come back to and suddenly i have an issue with my react router. I was messing around with adding more components but deleted them and now my Homepage, about, or gallery component dont render when I change the page with then navbar. The url still changes if i click on gallery to /gallery but the <h1>Gallery page</h1> does not show up anymore.
App.js
import React, { Component } from 'react';
import './App.css';
import NavigationBar from './components/navbar';
import About from './components/About';
import Home from './components/homepage';
import Gallery from './components/gallery';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
class App extends Component {
state = {};
render() {
return (
<Router>
<div className="App">
<NavigationBar />
<Switch>
<Route path="/" exact component={Home} />
<Route path="/about" component={About} />
<Route path="/gallery" component={Gallery} />
</Switch>
</div>
</Router>
);
}
}
export default App;
Homepage
import '../css/homepage.scss';
class Homepage extends Component {
state = {};
render() {
return (
<div>
<h1>Hello</h1>
</div>
);
}
}
export default Homepage;
About
class About extends Component {
state = {};
render() {
return <h1>About</h1>;
}
}
export default About;
Gallery
class gallery extends Component {
state = {};
render() {
return <h1>Gallery page</h1>;
}
}
export default gallery;
Nav code
import React, { Component } from 'react';
import Navbar from 'react-bootstrap/Navbar';
import Nav from 'react-bootstrap/Nav';
import { link } from 'react-router-dom';
import { NavLink } from 'react-router-dom';
import '../css/navbar.scss';
import $ from 'jquery';
import logo from '../images/logo.png';
class NavigationBar extends Component {
state = {};
render() {
return (
<Navbar fixed="top" className="navbarr" bg="light" expand="sm">
<Navbar.Brand
activeClassName="nav-link--active"
className="BrandLink"
href="/"
>
<img
alt=""
src={logo}
width="45"
height="30"
className="d-inline-block align-top"
/>
BRAND NAME HERE
</Navbar.Brand>
<Navbar.Toggle />
<Navbar.Collapse className="justify-content-end">
<Nav className="ml-auto">
<Nav.Link
className="NavLink"
activeClassName="nav-link--active"
href="/About"
>
About
</Nav.Link>
<Nav.Link
className="NavLink"
activeClassName="nav-link--active"
href="/Gallery"
>
Gallery
</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
}
}
export default NavigationBar;
Try moving your default route to the end of routes. i.e.
import React, { Component } from 'react';
import './App.css';
import NavigationBar from './components/navbar';
import About from './components/About';
import Home from './components/homepage';
import Gallery from './components/gallery';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
class App extends Component {
state = {};
render() {
return (
<Fragment>
<div className="App">
<NavigationBar />
</div>
<Router>
<Switch>
<Route path="/about" component={About} />
<Route path="/gallery" component={Gallery} />
<Route path="/" component={Home} />
</Switch>
</Router>
</Fragment>
);
}
}
export default App;
The problem is with you Navbar components. Try this one:
import React, { Component } from "react";
import Navbar from "react-bootstrap/Navbar";
import Nav from "react-bootstrap/Nav";
import { Link } from "react-router-dom";
import "../css/navbar.scss";
import $ from "jquery";
import logo from "../images/logo.png";
class NavigationBar extends Component {
state = {};
render() {
return (
<Navbar fixed="top" className="navbarr" bg="light" expand="sm">
<Navbar.Brand activeClassName="nav-link--active" className="BrandLink">
<Link to="/">
<img
alt=""
src={logo}
width="45"
height="30"
className="d-inline-block align-top"
/>
BRAND NAME HERE
</Link>
</Navbar.Brand>
<Navbar.Toggle />
<Navbar.Collapse className="justify-content-end">
<Nav className="ml-auto">
<Nav.Link className="NavLink" activeClassName="nav-link--active">
<Link to="/about">About</Link>
</Nav.Link>
<Nav.Link className="NavLink" activeClassName="nav-link--active">
<Link to="/gallery">Gallery</Link>
</Nav.Link>
</Nav>
</Navbar.Collapse>
</Navbar>
);
}
}
export default NavigationBar;

React JS Bootstrap not applied

I am building a new ReactJS app and tried to use react-bootstrap for the UI. I essentially installed yarn add react-bootstrap bootstrap yarn add jquery popper.js" to have everything installed. My index.js` looks as follows:
// Importing the Bootstrap CSS
import 'bootstrap/dist/css/bootstrap.css';
import $ from 'jquery';
import Popper from 'popper.js';
import React from 'react';
import ReactDOM from 'react-dom';
import App from './app/App';
import * as serviceWorker from './serviceWorker';
import './index.css';
ReactDOM.render(
<React.StrictMode>
<App />
</React.StrictMode>,
document.getElementById('root')
);
serviceWorker.unregister();
App.js is quite straightforward:
import React from 'react';
import AppHeader from "./layout/AppHeader";
import RouterOutlet from "../router/Router";
import AppFooter from "./layout/AppFooter";
function App() {
return (
<div>
<div className="wrap">
<AppHeader />
<div className="container">
<RouterOutlet />
</div>
</div>
<AppFooter />
</div>
);
}
export default App;
The interesting part now is the header not working as expected, its containing the NavBar
import React from 'react';
import NavDropdown from 'react-bootstrap/NavDropdown'
import Navbar from "react-bootstrap/Navbar";
class AppHeader extends React.Component {
render () {
return (
<Navbar variant="dark" sticky="top">
<Navbar.Brand>
<img
src="/logo192.png"
width="30"
height="30"
className="d-inline-block align-top"
alt=" "/>
</Navbar.Brand>
<NavDropdown bg="black" title="Menu" id="collasible-nav-dropdown" style={{color: "#5299d3"}}>
<NavDropdown.Item href="/">Home</NavDropdown.Item>
<NavDropdown.Item href="/time">Time</NavDropdown.Item>
<NavDropdown.Item href="/login">Login</NavDropdown.Item>
<NavDropdown.Item href="/logout">Logout</NavDropdown.Item>
</NavDropdown>
</Navbar>
);
}
}
export default AppHeader
This is the Footer
import * as React from 'react';
class AppFooter extends React.Component {
render() {
return (
<footer className="footer">
<div className="container">
<p className="pull-left">© My Company</p>
<p className="pull-right">asd</p>
</div>
</footer>
);
}
}
export default AppFooter;
However the bootstrap styles are not applied, the bar is white without any background at all. Also other things such as "pull-right" classes in the footer don't work. I can see in the browser though that the CSS is loaded as a inline CSS file.
Question: why are the styles not applied to my components so far?
To add background to Navbar, add 'bg="primary" ' to your code in AppHeader like this-
<Navbar bg="primary" variant="dark" sticky="top">
This will make you background blue.

I created a react project and I did routing. In routing I am struggling with syntax errors

I created React project, In that project I created one folder and named it as a Pages. In the Pages folder I have one folder and Named it as Home, in that that Home folder I have Home.js and Home.css files. Again in the Pages Folder I have another folder and named it as Registration, in that folder I have Registration.js and Registration.css. Once Again in Pages folder I have another folder and named it as Login in that folder I have Login.js and Login.css.
I created another folder and named it as Components in that folder I have another folder Navbar. In Navbar folder I have Navbar.js and Navbar.css files.
Now I install react-router-dom npm and did Routing but I am struggling with Syntax error please help me to solve this error.
The error is like this:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components) but got: object. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.
This is App.js
import React from 'react';
import './App.css';
import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';
import Navbar from './Components/Navbar/Navbar';
import Home from './Pages/Home/Home';
import Login from './Pages/Login/Login';
import Registration from './Pages/Registration/Registration'
function App() {
return (
<div className="App">
<Router>
<Navbar></Navbar>
<Switch>
<Route path=''><Home></Home></Route>
<Route path='/reg'><Registration></Registration></Route>
<Route path='/log'><Login></Login></Route>
</Switch>
</Router>
</div>
);
}
export default App;
This is Navbar.js
import React, { Component } from 'react';
import './Navbar.css';
import { Link } from 'react-router-dom';
class Navbar extends Component {
constructor(props) {
super(props)
this.state = {
}
}
render() {
return (
<nav className="navbar navbar-expand-lg navbar-light bg-light">
<a className="navbar-brand" href="www.facebook.com">Mern Stack</a>
<button className="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span className="navbar-toggler-icon"></span>
</button>
<div className="collapse navbar-collapse" id="navbarNav">
<ul className="navbar-nav">
<li className="nav-item active">
<Link to='' className='nav-link'>Home</Link>
</li>
<li className="nav-item">
<Link to='/reg' className='nav-link'>Registration</Link>
</li>
<li className="nav-item">
<Link to='/log' className='nav-link'>Login</Link>
</li>
</ul>
</div>
</nav>
)
}
}
export default Navbar
This is Index.js
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';
import '../node_modules/bootstrap/dist/css/bootstrap.min.css';
import '../node_modules/jquery/dist/jquery.min.js';
import '../node_modules/bootstrap/dist/js/bootstrap.bundle.min.js';
ReactDOM.render(<App />, document.getElementById('root'));
serviceWorker.unregister();
This is Home.js
import React, { Component } from 'react';
import './Home.css';
class Home extends Component {
render() {
return(
<div className='container'>
<div className='row'>
<h1>Home works</h1>
</div>
</div>
)
}
}
export default Home
This is Login.js
import React, { Component } from 'react';
import './Login.css';
class Login extends Component {
render() {
return(
<div className='container'>
<div className='row'>
<h1>Login works</h1>
</div>
</div>
)
}
}
export default Login
This is Registration.js
import React, { Component } from 'react';
import './Registration.css';
class Registration extends Component {
render() {
return(
<div className='container'>
<div className='row'>
<h1>Registration works</h1>
</div>
</div>
)
}
}
export default Registration
Dummy Home Component
import React, { Component } from 'react';
class Home extends Component {
constructor(props) {
super(props)
this.state = {
}
}
render() {
return (
<div>hai</div>
)
}
}
export Home
import this component in App component, Since this is not a default export, you need to specfic the name in the {} as follows
import {Home} from './Pages/Home/Home';

What component did I miss to export? Error type is invalid...error

I am sure I exported all my components, yet I keep getting the same error:
Element type is invalid: expected a string (for built-in components) or a class/function (for composite components)but got: undefined. You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports. Check the render method of CustomNavbar.
App.js
import React, { Component } from 'react';
import './App.css';
import { BrowserRouter as Router, Route } from 'react-router-dom';
import Home from './Home.js';
import Navbar from './CustomNavbar.js';
class App extends Component {
render() {
return (
<Router>
<div>
<Navbar />
<Route exact path="/" component={Home} />
</div>
</Router>
);
}
}
export default App;
CustomNavbar.js
import React, { Component } from 'react'
import { Navbar, Nav, NavItem } from 'react-bootstrap';
import { Link } from 'react-router-dom';
export default class CustomNavbar extends Component {
render() {
return (
<Navbar default collapseOnSelect>
<Navbar.Header>
<Navbar.Brand>
<Link to="/">My Page</Link>
</Navbar.Brand>
<Navbar.Toggle />
</Navbar.Header>
<Navbar.Collapse>
<Nav pullRight>
<NavItem eventKey={1} componentClass={Link} to="/">
Home
</NavItem>
</Nav>
</Navbar.Collapse>
</Navbar>
)
}
}
Home.js
import React, { Component } from 'react'
import { Link } from 'react-router-dom'
import { Jumbotron, Button } from 'react-bootstrap';
export default class Home extends Component {
render() {
return(
<div>
<Jumbotron>
<h1>Hello, this is my page</h1>
</Jumbotron>
<Link to="/about">
<Button bsStyle="primary">About</Button>
</Link>
</div>
)
}
}
Change this
import Navbar from './CustomNavbar.js';
to
import CustomNavbar from './CustomNavbar.js';
And
Change
<Navbar />
To
<CustomNavbar />
In App.js

Resources