| import Translate from "./Translate"; |
| import { useState } from "react"; |
| import Translator from "./ai/Translator.ts"; |
| import Initialize from "./Initialize.tsx"; |
|
|
| function App() { |
| const [translator, setTranslator] = useState<Translator>(null); |
| const [progress, setProgress] = useState<number>(0); |
| const [isInitializing, setIsInitializing] = useState<boolean>(false); |
|
|
| const init = async () => { |
| setIsInitializing(true); |
| const t = Translator.getInstance(); |
| await t.init(setProgress); |
| setTranslator(t); |
| setIsInitializing(false); |
| }; |
|
|
| return ( |
| <div className="min-h-screen bg-neutral-100 flex flex-col justify-between gap-2"> |
| <header className="bg-white border-b border-border shadow-sm p-4"> |
| <h1 className="text-md md:text-3xl font-sans text-center flex justify-center items-center gap-2 md:gap-6"> |
| <span className="font-bold flex items-center justify-center gap-1"> |
| <img |
| src="gemma.svg" |
| alt="Gemma Logo" |
| className="block" |
| style={{ |
| width: "1.2em", |
| height: "1.2em", |
| }} |
| /> |
| <span> |
| Translate<span className="text-primary">Gemma</span> |
| </span> |
| </span> |
| <span>//</span> |
| <span className="font-bold flex items-center justify-center gap-1"> |
| <img |
| src="hf-logo.svg" |
| alt="Transformers.js Logo" |
| className="block" |
| style={{ |
| width: "1.2em", |
| height: "1.2em", |
| }} |
| /> |
| Transformers.js |
| </span> |
| </h1> |
| </header> |
| {translator ? ( |
| <Translate className="w-full" translator={translator} /> |
| ) : ( |
| <Initialize |
| onInitialize={init} |
| progress={progress} |
| isInitializing={isInitializing} |
| /> |
| )} |
| <footer |
| className="p-8 pt-0 text-center text-muted-foreground text-xs md:text-sm animate-fade-in" |
| style={{ animationDelay: "0.5s", opacity: 0 }} |
| > |
| <p> |
| High-quality translations across 56 languages powered by{" "} |
| <a |
| href="https://blog.google/technology/developers/gemma-open-models/" |
| target="_blank" |
| rel="noopener noreferrer" |
| className="text-primary hover:underline underline-offset-2 transition-all hover:underline-offset-4" |
| > |
| Google's TranslateGemma |
| </a>{" "} |
| model, running entirely in your browser with{" "} |
| <a |
| href="https://huggingface.co/docs/transformers.js" |
| target="_blank" |
| rel="noopener noreferrer" |
| className="text-primary hover:underline underline-offset-2 transition-all hover:underline-offset-4" |
| > |
| Transformers.js |
| </a>{" "} |
| and complete privacy. |
| </p> |
| </footer> |
| </div> |
| ); |
| } |
|
|
| export default App; |
|
|