Learnitweb

Loading different theme CSS files based on locale in React Application

1. Introduction

For a Vite-based React application, loading different theme CSS files based on locale dynamically is a bit different than in Create React App, especially because Vite doesn’t automatically copy files from public/ unless explicitly referenced.

Use dynamic import() to load CSS modules from src/ instead of relying on public folder.

2. Directory Structure

src/
  themes/
    en.css
    ar.css
  App.jsx
  main.jsx

3. src/themes/en.css

body {
  direction: ltr;
  background-color: #e6f7ff;
  color: #111;
  font-family: sans-serif;
}

4. src/themes/ar.css

body {
  direction: rtl;
  background-color: #fff5e6;
  color: #111;
  font-family: 'Tahoma', sans-serif;
}

5. src/App.jsx

import { useEffect, useState } from 'react';

const App = () => {
  const [locale, setLocale] = useState('en');

  useEffect(() => {
    async function loadTheme() {
      if (locale === 'ar') {
        await import('./themes/ar.css');
      } else {
        await import('./themes/en.css');
      }
    }
    loadTheme();
  }, [locale]);

  return (
    <div>
      <h1>{locale === 'ar' ? 'مرحبًا' : 'Hello'}</h1>
      <p>{locale === 'ar' ? 'اختر اللغة' : 'Choose a language'}</p>
      <button onClick={() => setLocale('en')}>English</button>
      <button onClick={() => setLocale('ar')}>العربية</button>
    </div>
  );
};

export default App;

6. src/main.jsx

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';

ReactDOM.createRoot(document.getElementById('root')).render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);