1.0.1 • Published 3 years ago

@kekalma/language-selector v1.0.1

Weekly downloads
-
License
MIT
Repository
github
Last release
3 years ago

Language selector menu for React

A flexible language selector component for React, where you can change the format and the look with many options. The actual state is stored in a context, whose value can be used in other parts of the project.
Part of the @kekalma component family.

Usage examples

The following simple code example demonstrates the use of the language selector, with separate (optional) context and an event handler function.
You should use at least one of context or onLanguageChange properties.

simple

App.tsx

The <LanguageSelector> component can be placed into an <ul> element, as it produces a list item.

import React,{useState} from 'react'
import {LanguageSelector as Language, emptyLanguage} from '@kekalma/language-selector'
import type { languageType } from '@kekalma/language-selector'
import { languageContext } from './context'
import Info from './Info'
import { languages } from './languageList'

export default function App() {
  const [selectedLanguage, setSelectedLanguage] = useState<languageType>(emptyLanguage);
  const changeHandler = (newLang: languageType, oldLang: languageType) => {
    console.log("The language has been changed: ", oldLang.name, " -> ", newLang.flag)
  }
  return (
    <languageContext.Provider value={{language: selectedLanguage, setLanguage: setSelectedLanguage}}>
    <Info context={languageContext}/>
    <ul>
      <Language
          languages={languages}
          selectedLanguageFlag="us"   
          context={languageContext}
          onLanguageChange={changeHandler}
      />
    </ul>
      <Info/>
    </languageContext.Provider>
  )
}

languageList.ts

import React from 'react'
import type { languageType } from '@kekalma/language-selector'

export const languages: languageType[] = [
  { "code": "hu","name": "Hungarian" },
  { "code": "de","name": "German" },
  { "code": "en","name": "US English","flag": "us" },
  { "code": "en","name": "British English","flag": "gb" },
  { "code": "fr","name": "French" }
]

Note the use of the 'flag' property. It is only necessary, if the same language may be used with a different flag from country to country. The flag is the key, it should be unique!

context.ts

import React, {createContext} from 'react'
import type {languageType, languageContextType } from '@kekalma/language-selector'
import {emptyLanguage } from '@kekalma/language-selector'

export const languageContext = createContext<languageContextType>({
  language: emptyLanguage,
  setLanguage: (value: languageType):void =>{}
})

info.tsx

In this component you get an example, how to use the value from the context.

import React, {useContext} from 'react'
import { languageContext } from './context'
import {languageContextType} from '@kekalma/language-selector'

type myProps = { context: React.Context<languageContextType> }

export default function Info(props : myProps) {
  const { language : selectedLanguage } = useContext(props.context)
  return (
    <span style={{margin: "0 5px"}}>Selected language: {selectedLanguage.name} ({selectedLanguage.code}_{selectedLanguage.flag})</span>
  )
}

The currently selected value is stored in the following format (languageType):

{
  code: string,   // ISO language code (2 chars)
  name: string,   // Language name
  flag: string    // Flag code (2 chars)
}

Property parameters

_Only the bold properties are obligatory, all others are optional, but you should use one of context or onLanguageChange._

propertyformatDescription
languageslanguageType (Required) The JSON list of the languages, defined in the example file above.
selectedLanguageFlagflagCodeTypeThe initialy selected language. Default: first item.flagCodeType: The string literal values of useable flag codes.
contextReact.Context\Required. The context, to store the state and the handler. See the above example for the format.
onLanguageChangeFunction(newLanguage: languageType, oldLanguage: languageType)The callback function for the change event. It is called with two parameters, holding the new and the old language objects.
titleFormatstringA definition of the freely formatted label text, put together with \|Flag\| \|Name\| \|Code\| \|FlagCode\| placeholder, where Flag represents the flag icon.
menuFormatstring- same as the above -
alignleft - left alignedright - right alignedcenter - centeredauto - automaticaly aligned right if it is the last item in the listcenter auto - center aligned, but automaticaly aligned right if it is the last item in the list
formatdropdown : classic dropdown menudropdown-ordered : dropdown, but the currently selected item is not listed flat : the selectable items appear in a row, under the title flat-reverse : same as the previous, but right alignedlinear : the items are shown permanently in a rowlinear-ordered : same as before, but the selected item comes first in the listhorizontal : same as the previous, but the list is shown only upon hoverhorizontal-reverse : same as the previous, but right aligned
titleFontstringCSS font type, like "1rem bold Verdana"
titleFontColorstringCSS font color, like "#11F"
titleFontColorHoverstringCSS font color during hover
titleBgColorstringCSS background color
titleBgColorHoverstringCSS background color during hover
titleFlagSizenumberThe size of the flag icon in pixels (without any dimension)
menuFontstringCSS font type for the menu items
menuFontColorstringCSS font color
menuFontColorHoverstringCSS font color during hover
menuFontColorSelectedstringCSS font color of the currently selected item
menuBgColorstringCSS background color for the menu items
menuBgColorHoverstringCSS background color for the menu items during hover
menuBgColorSelectedstringCSS background color for the currently selected menu item
menuFlagSizenumberThe size of the flag icon in pixels (without any dimension)
menuStyleSelectedCSSPropertiesInline CSS definition for the currently selected menu item
titleStyleCSSPropertiesInline CSS definition for the title
menuStyleCSSPropertiesInline CSS definition for the list items
styleCSSPropertiesGlobal inline CSS definiton object

Exported items:

exported itemtypedescription
languagePropstypeAll the properties listed above.
languageContextTypetypeContext type definition.
languageTypetypeType holding the language properties: code, name, flag.
flagCodeTypetypeThe string literal values of useable flag codes.
emptyLanguageobjectThe type languageType with empty values.
getLanguageByCodefunctionUsage: getLanguageByCode(languages: languageType[], code: flagCodeType): languageTypeInput: Use the array from props.languages and the 2 character language or flag ISO code as flagCodeType.Return: An object of type languageType or if the code is not found, the emptyLanguage.

Format examples with property code samples:

dropdown:

Dropdown

titleFormat="|Flag| |Name|"
menuFormat="|Flag| |Name| (|Code|_|FlagCode|)"
format="dropdown"
align="left"

dropdown-ordered:

dropdown-ordered

titleFormat="|Flag| |Name|"
menuFormat="|Flag| |Name|"
format="dropdown-ordered"

flat:

dropdown-ordered

titleFormat="|Flag| |Name|"
menuFormat="|Flag| |Name|"
format="flat"

dropdown-ordered

titleFormat="|Flag| |Name|"
menuFormat="|Flag| |Name|"
format="flat-reverse"
align="right"

dropdown-ordered

titleFormat="|Flag| |Name|"
menuFormat="|Flag| |Name|"
format="flat"
align="center"

linear:

dropdown-ordered

titleFormat="|Flag| |Name|"
menuFormat="|Flag| |Name|"
format="linear-ordered"
VersionWhat's new, description
1.0.0First official, working release.
1.0.1Exporting the function getLanguageByCode and the type flagCodeType

License

MIT © kissato70

Support the project >>> Donation

1.0.1

3 years ago

1.0.0

3 years ago

0.0.9

3 years ago

0.0.8

3 years ago

0.0.7

3 years ago

0.0.6

3 years ago

0.0.5

3 years ago

0.0.4

3 years ago

0.0.3

3 years ago

0.0.2

3 years ago

0.0.1

3 years ago