0.0.6 • Published 1 year ago

@llelievr.dev/solid-fluent v0.0.6

Weekly downloads
-
License
MIT
Repository
github
Last release
1 year ago

@llelievr.dev/solid-fluent

npm version

@llelievr.dev/solid-fluent provides the Solidjs bindings for Project Fluent.

This code is hightly inspired by @fluent/react as a matter of fact this usage is almost the same.

Quick start

Install it:

npm i @llelievr.dev/solid-fluent @fluent/bundle
# or
yarn add @llelievr.dev/solid-fluent @fluent/bundle
# or
pnpm add @llelievr.dev/solid-fluent @fluent/bundle

Use it:

import { createSignal, ParentComponent, type Component } from 'solid-js'
import { FluentProvider, Localized, useFluent } from '@llelievr.dev/solid-fluent'
import { FluentBundle, FluentResource } from '@fluent/bundle'

const DirectString: Component = () => {
  // you can access fluent translations from the useFluent hook
  const fluent = useFluent()

  return <>{fluent.getString('welcome', { name: 'Test' })()}</>
}

const Bold: ParentComponent = props => (
  <div style={{ background: 'red', display: 'inline-block' }}>{props.children}</div>
)

const App: Component = () => {
  // Load your resources, using @fluent/bundle
  let resource = new FluentResource(`
-brand-name = Foo 3000
welcome = Welcome, {$name}, to {-brand-name}!
elements =
    .placeholder = I am a placehoder
    .alt = I am a alt
markups = <b>I am bold</b> WOW
  `)

  let resourceFR = new FluentResource(`
-brand-name = Foo 3000
welcome = bienvenue {$name}, sur {-brand-name}!
elements =
    .placeholder = Je suis un example
    .alt = I suis une indication
markups = <b>je suis en gras</b> WOW
`)

  let bundle = new FluentBundle('en-US')
  // Attach the resource to a bundle
  bundle.addResource(resource)

  let bundleFR = new FluentBundle('fr-FR')
  bundleFR.addResource(resourceFR)

  let [currentBundle, setBundle] = createSignal<FluentBundle>(bundle)

  let lang = 0
  const randomLang = () => {
    const bundles = [bundle, bundleFR]
    setBundle(bundles.at(lang++ % bundles.length) ?? bundle)
  }

  return (
    /* provide the a bundle to the fluent provider */
    <FluentProvider bundle={currentBundle()}>
      <button onClick={() => randomLang()}>Random lang</button>
      <DirectString></DirectString>
      {/* use the Localized to directly replace attributes or div content with your translation keys */}
      <Localized id="elements" vars={{ name: 'test' }} attrs={{ placeholder: true }}>
        <input type="text" placeholder="temp" alt="super alt" />
      </Localized>
      <Localized id="markups" elems={{ b: <Bold></Bold> }}></Localized>

      <Localized id="markups" elems={{ b: <Bold></Bold> }}>
        <div>placeholder that will be replace by the markups content</div>
      </Localized>
    </FluentProvider>
  )
}

export default App
0.0.6

1 year ago

0.0.5

1 year ago

0.0.4

1 year ago

0.0.0

1 year ago