Skip to main content
Glama
LanguageContext.jsx3.65 kB
import React, { createContext, useContext, useState, useEffect } from 'react'; import { getTranslation, translations } from './translations'; const LanguageContext = createContext(); export const useLanguage = () => { const context = useContext(LanguageContext); if (!context) { throw new Error('useLanguage must be used within a LanguageProvider'); } return context; }; export const LanguageProvider = ({ children }) => { // Get initial language from URL, localStorage or default to 'en' const [currentLanguage, setCurrentLanguage] = useState(() => { // Check URL first const params = new URLSearchParams(window.location.search); const urlLang = params.get('lang'); const supportedLanguages = ['en', 'zh', 'es', 'ko', 'ja', 'th', 'vi', 'pt', 'tr', 'hi', 'it', 'fr', 'de', 'ru']; if (urlLang && supportedLanguages.includes(urlLang)) { return urlLang; } // Fall back to localStorage const saved = localStorage.getItem('shrimpTaskViewerLanguage'); // Ensure we have a valid language from localStorage if (saved && supportedLanguages.includes(saved)) { return saved; } // Default to English return 'en'; }); // Save language preference when it changes useEffect(() => { console.log('Saving language to localStorage:', currentLanguage); localStorage.setItem('shrimpTaskViewerLanguage', currentLanguage); // Update URL when language changes const params = new URLSearchParams(window.location.search); if (currentLanguage === 'en') { params.delete('lang'); // Don't include default language in URL } else { params.set('lang', currentLanguage); } const hash = window.location.hash || '#projects'; const queryString = params.toString(); const newUrl = `${window.location.pathname}${queryString ? `?${queryString}` : ''}${hash}`; window.history.replaceState({}, '', newUrl); }, [currentLanguage]); const t = (key, params) => { // Ensure currentLanguage is never null/undefined const safeLang = currentLanguage || 'en'; return getTranslation(safeLang, key, params); }; const changeLanguage = (lang) => { console.log('changeLanguage called with:', lang); console.log('Available translations:', Object.keys(translations)); // Only set valid languages, default to 'en' if invalid const supportedLanguages = ['en', 'zh', 'es', 'ko', 'ja', 'th', 'vi', 'pt', 'tr', 'hi', 'it', 'fr', 'de', 'ru']; const validLang = lang && supportedLanguages.includes(lang) ? lang : 'en'; setCurrentLanguage(validLang); }; const value = { currentLanguage, changeLanguage, t, availableLanguages: [ { code: 'en', name: 'English', flag: '🇺🇸' }, { code: 'zh', name: '中文', flag: '🇨🇳' }, { code: 'es', name: 'Español', flag: '🇪🇸' }, { code: 'ko', name: '한국어', flag: '🇰🇷' }, { code: 'ja', name: '日本語', flag: '🇯🇵' }, { code: 'th', name: 'ไทย', flag: '🇹🇭' }, { code: 'vi', name: 'Tiếng Việt', flag: '🇻🇳' }, { code: 'pt', name: 'Português', flag: '🇵🇹' }, { code: 'tr', name: 'Türkçe', flag: '🇹🇷' }, { code: 'hi', name: 'हिंदी', flag: '🇮🇳' }, { code: 'it', name: 'Italiano', flag: '🇮🇹' }, { code: 'fr', name: 'Français', flag: '🇫🇷' }, { code: 'de', name: 'Deutsch', flag: '🇩🇪' }, { code: 'ru', name: 'Русский', flag: '🇷🇺' } ] }; return ( <LanguageContext.Provider value={value}> {children} </LanguageContext.Provider> ); };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/cjo4m06/mcp-shrimp-task-manager'

If you have feedback or need assistance with the MCP directory API, please join our Discord server