npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

quasalang

v1.1.1

Published

Generate Quasar i18n language files from a CSV file

Downloads

56

Readme

Quasalang CLI

Generate all the i18n language files your Quasar Framework app needs - from a CSV file

Quasalang is a global CLI tool (for Quasar Framework projects) that allows you to generate all your i18n language files (including the main index.js file) instantly from a single, easy to update CSV file.

It will also generate a sample CSV file for you, so you can easily get started.

You can also:

  • Organise your phrases with empty lines & comments
  • Generate your language switcher array code
  • Search & list i18n locale codes easily

Contents

Getting Started

Step 1: Install globally

$ npm install -g quasalang

Once installed, get yourself to the root of a Quasar project

$ cd my-quasar-project

Step 2: Generate a Sample CSV file

$ quasalang create-csv

This will generate a CSV file at /translations.csv that looks like this:

| Key | English, en-US | French, fr | German, de | |---------|----------------|------------|-----------------| | hello | Hello | Bonjour | Hallo | | goodbye | Goodbye | Au revoir | Auf Wiedersehen | | thanks | Thanks | Merci | Danke |

Key,"English, en-US","French, fr","German, de"
hello,"Hello","Bonjour","Hallo"
goodbye,"Goodbye","Au revoir","Auf Wiedersehen"
thanks,"Thanks","Merci","Danke"

Step 3: Add your own languages and translations

Use a CSV editor (such as the VSCode Extension "Edit csv") to add your own languages & phrases.

Be sure to use the format Language, code in the header row e.g. Russian, ru:

| Key | English, en-US | French, fr | German, de | Russian, ru | |----------|----------------|---------------------|-----------------|-----------------| | hello | Hello | Bonjour | Hallo | Привет | | goodbye | Goodbye | Au revoir | Auf Wiedersehen | До свидания | | thanks | Thanks | Merci | Danke | Спасибо | | buttHair | Butt hair | Cheveux bout à bout | Hintern Haare | стыковые волосы |

Key,"English, en-US","French, fr","German, de","Russian, ru"
hello,"Hello","Bonjour","Hallo",Привет
goodbye,"Goodbye","Au revoir","Auf Wiedersehen",До свидания
thanks,"Thanks","Merci","Danke",Спасибо
buttHair,"Butt hair","Cheveux bout à bout","Hintern Haare",стыковые волосы

Step 4: Generate your language files

Generate all the language files you need based on your CSV:

$ quasalang generate

By default, this will generate (or overwrite) your /src/i18n folder, generating all the files and folders you need:

src/
├─ i18n/
│  ├─ de/
│  │  ├─ index.js
│  ├─ en-US/
│  │  ├─ index.js
│  ├─ fr/
│  │  ├─ index.js
│  ├─ ru/
│  │  ├─ index.js
│  ├─ index.js

Your main index file /src/i18n/index.js will look like this:

// This file was auto-generated by Quasalang

import enUS from './en-US'
import fr from './fr'
import de from './de'
import ru from './ru'

export default { 
  'en-US': enUS, // English
  'fr': fr, // French
  'de': de, // German
  'ru': ru, // Russian
}

And your language files, e.g. /src/i18n/ru/index.js will look like this:

// Russian, ru
// This file was auto-generated by Quasalang

export default {
  hello: `Привет`,
  goodbye: `До свидания`,
  thanks: `Спасибо`,
  buttHair: `стыковые волосы`,
}

Options

Input Path

The default input path is /translations.csv but you can change it if you like:

$ quasalang generate --input /files/my-translations.csv

# or the shorthand...

$ quasalang g -i /files/my-translations.csv

Output Path

The default output path is /src/i18n but you can change it if you like:

$ quasalang generate --output /src/my-translations

# or the shorthand...

$ quasalang g -o /src/my-translations

Force Write

By default, if the output folder exists, you'll be prompted to overwrite it:

? Folder src/i18n exists. Overwrite it? (Y/n) 

You can skip this prompt if you like:

$ quasalang generate --force

# or the shorthand...

$ quasalang g -f

No Watermark

By default, Quasalang will add a watermark to your files:

// This file was auto-generated by Quasalang

You can disable this if you like:

$ quasalang generate --nowatermark

# or the shorthand...

$ quasalang g -nw

Language Switcher Array Code

You also generate the array code for your language switcher:

$ quasalang generate --lang-switcher

# or the shorthand...

$ quasalang g -ls

See Generate language switcher array code for more info.

Watch for changes

You can watch for changes to your translation file and auto-regenerate your language files. You can then just leave it running in the background and forget about it:

$ quasalang generate --watch

# or the shorthand...

$ quasalang g -w

Advanced Features

Use Empty Rows to Split Up Your Phrases

You can leave empty rows in your CSV file, like this:

| Key | English, en-US | French, fr | German, de | Russian, ru | |----------|----------------|---------------------|-----------------|-----------------| |   | | | | | | hello | Hello | Bonjour | Hallo | Привет | | goodbye | Goodbye | Au revoir | Auf Wiedersehen | До свидания | | thanks | Thanks | Merci | Danke | Спасибо | |   | | | | | | buttHair | Butt hair | Cheveux bout à bout | Hintern Haare | стыковые волосы | |   | | | | |

Key,"English, en-US","French, fr","German, de","Russian, ru"
,,,,
hello,"Hello","Bonjour","Hallo",Привет
goodbye,"Goodbye","Au revoir","Auf Wiedersehen",До свидания
thanks,"Thanks","Merci","Danke",Спасибо
,,,,
buttHair,"Butt hair","Cheveux bout à bout","Hintern Haare",стыковые волосы
,,,,

And this will generate equivalent empty lines in your generated language files:

// Russian, ru
// This file was auto-generated by Quasalang

export default {

  hello: `Привет`,
  goodbye: `До свидания`,
  thanks: `Спасибо`,
  
  buttHair: `стыковые волосы`,

}

Use Comments to Organise your Phrases

You can add comments to your CSV file to create sections like this:

| Key | English, en-US | French, fr | German, de | Russian, ru | |----------------|----------------|---------------------|-----------------|-----------------| |   | | | | | | # Greetings | | | | | | hello | Hello | Bonjour | Hallo | Привет | | goodbye | Goodbye | Au revoir | Auf Wiedersehen | До свидания | | thanks | Thanks | Merci | Danke | Спасибо | |   | | | | | | # Hair Related | | | | | | buttHair | Butt hair | Cheveux bout à bout | Hintern Haare | стыковые волосы | |   | | | | |

Key,"English, en-US","French, fr","German, de","Russian, ru"
,,,,
# Greetings
hello,"Hello","Bonjour","Hallo",Привет
goodbye,"Goodbye","Au revoir","Auf Wiedersehen",До свидания
thanks,"Thanks","Merci","Danke",Спасибо
,,,,
# Hair Related
buttHair,"Butt hair","Cheveux bout à bout","Hintern Haare",стыковые волосы
,,,,

And this will add equivalent comments to your generated files:

// Russian, ru
// This file was auto-generated by Quasalang

export default {

  // Greetings
  hello: `Привет`,
  goodbye: `До свидания`,
  thanks: `Спасибо`,
  
  // Hair Related
  buttHair: `стыковые волосы`,

}

Use Strings as Your Keys

If you want to use strings as your keys, just surround your keys in double quotes:

| Key | English, en-US | French, fr | German, de | |---------------|----------------|------------|-----------------| | "Hello" | Hello | Bonjour | Hallo | | "Goodbye" | Goodbye | Au revoir | Auf Wiedersehen | | "Thanks" | Thanks | Merci | Danke |

Key,"English, en-US","French, fr","German, de"
"""Hello""","Hello","Bonjour","Hallo"
"""Goodbye""","Goodbye","Au revoir","Auf Wiedersehen"
"""Thanks""","Thanks","Merci","Danke"

This will generate language files like this:

// French, fr
// This file was auto-generated by Quasalang

export default {
  "Hello": `Bonjour`,
  "Goodbye": `Au revoir`,
  "Thanks": `Merci`,
}

Add Multi-Line Phrases

You can add multi-line phrases, like in the last row here:

| Key | English, en-US | French, fr | German, de | |---------|--------------------------------------------------------|----------------------------------------------------------------|----------------------------------------------------------| | hello | Hello | Bonjour | Hallo | | goodbye | Goodbye | Au revoir | Auf Wiedersehen | | thanks | Thanks | Merci | Danke | | welcome | Hey there...Welcome to the app!...Hope you like it! | Salut...Bienvenue dans l'appli! ...J'espère que vous aimez! | Sie da...Willkommen in der App! ...Hoffe du magst es! |

Key,"English, en-US","French, fr","German, de"
hello,"Hello","Bonjour","Hallo"
goodbye,"Goodbye","Au revoir","Auf Wiedersehen"
thanks,"Thanks","Merci","Danke"
welcome,"Hey there...
Welcome to the app!...

Hope you like it!","Salut...
Bienvenue dans l'appli! ...

J'espère que vous aimez!","Sie da...
Willkommen in der App! ...

Hoffe du magst es!"

This will generate language files like this:

// English, en-US
// This file was auto-generated by Quasalang

export default {
  hello: `Hello`,
  goodbye: `Goodbye`,
  thanks: `Thanks`,
  welcome: `Hey there...
Welcome to the app!...

Hope you like it!`,
}

Extra Tools

Generate language switcher array code

You can generate the code for your language switcher array (based on your CSV):

$ quasalang lang-switcher

# or the shorthand...

$ quasalang ls

This will output something like this to the console:

Your language switcher options array:

[
  { label: 'English', value: 'en-US' },
  { label: 'French', value: 'fr' },
  { label: 'German', value: 'de' }
]

You can also run this command automatically when you use the generate command to generate your language files:

$ quasalang generate --lang-switcher

# or the shorthand...

$ quasalang g -ls

The output will be something like this

Wrote 4 files:
┌─────────┬───────────────────┬─────────┬───────────────────────────┐
│ (index) │       File        │  Code   │           Path            │
├─────────┼───────────────────┼─────────┼───────────────────────────┤
│    0    │ 'Main index file' │   ''    │    'src/i18n/index.js'    │
│    1    │     'English'     │ 'en-US' │ 'src/i18n/en-US/index.js' │
│    2    │     'French'      │  'fr'   │  'src/i18n/fr/index.js'   │
│    3    │     'German'      │  'de'   │  'src/i18n/de/index.js'   │
└─────────┴───────────────────┴─────────┴───────────────────────────┘

Your language switcher options array:

[
  { label: 'English', value: 'en-US' },
  { label: 'French', value: 'fr' },
  { label: 'German', value: 'de' }
]

Search and List i18n Locale Codes

Don't know the locale code for a language? Just search for it:

$ quasalang list-codes

? Enter a search query (e.g. "russian") or hit Enter to list all codes: italian


  _____ 
 |_   _|
   | |  
   | |  
  _| |_ 
 |_____|
        
        
Italian, it
Italian (Italy), it_IT
Italian (Switzerland), it_CH

Or just hit enter to list them all:

           
     /\    
    /  \   
   / /\ \  
  / ____ \ 
 /_/    \_\
           
           
Afrikaans, af
Afrikaans (Namibia), af_NA
Afrikaans (South Africa), af_ZA
Akan, ak
Akan (Ghana), ak_GH
Albanian, sq
Albanian (Albania), sq_AL
Amharic, am
Amharic (Ethiopia), am_ET
Arabic, ar
Arabic (Algeria), ar_DZ
Arabic (Bahrain), ar_BH
Arabic (Egypt), ar_EG
Arabic (Iraq), ar_IQ
Arabic (Jordan), ar_JO
Arabic (Kuwait), ar_KW
Arabic (Lebanon), ar_LB
Arabic (Libya), ar_LY
Arabic (Morocco), ar_MA
Arabic (Oman), ar_OM
Arabic (Qatar), ar_QA
Arabic (Saudi Arabia), ar_SA
Arabic (Sudan), ar_SD
Arabic (Syria), ar_SY
Arabic (Tunisia), ar_TN
Arabic (United Arab Emirates), ar_AE
Arabic (Yemen), ar_YE
Armenian, hy
Armenian (Armenia), hy_AM
Assamese (India), as_IN
Assamese, as
Asu, asa
Asu (Tanzania), asa_TZ
Azerbaijani, az
Azerbaijani (Cyrillic), az_Cyrl
Azerbaijani (Cyrillic, Azerbaijan), az_Cyrl_AZ
Azerbaijani (Latin), az_Latn
Azerbaijani (Latin, Azerbaijan), az_Latn_AZ


  ____  
 |  _ \ 
 | |_) |
 |  _ < 
 | |_) |
 |____/ 
        
        
Bambara, bm
Bambara (Mali), bm_ML
Basque, eu
Basque (Spain), eu_ES

... etc ...

You can then copy and paste your language name and code straight into your CSV column header.

Commands

generate

Usage: quasalang generate|g [options]

Generate your i18n folder & all language files based on a CSV file

Options:
  -i, --input <mode>    Path to input CSV (default: "translations.csv")
  -o, --output <mode>   Path to i18n output folder (default: "src/i18n")
  -f, --force           Force write files (without prompt) (default: false)
  -nw, --nowatermark    Disable the watermark ("This file was auto-generated..")  (default:
                        false)
  -ls, --lang-switcher  Generate language switcher options array & output to console i.e. [{
                        label: 'English', value: 'en-US'}, ..] (default: false)
  -w, --watch           Watch CSV file for changes & regenerate files (default: false)
  -h, --help            display help for command

create-csv

Usage: quasalang create-csv|c [options]

Create a sample CSV file (/translations.csv)

Options:
  -f, --force  Force overwrite translations file (without prompt) (default: false)
  -h, --help   display help for command

lang-switcher

Usage: quasalang lang-switcher|ls [options]

Generate language switcher options array & output to console i.e. [{ label: 'English', value: 'en-US'}, ..]

Options:
  -i, --input <mode>  Path to input CSV (default: "translations.csv")
  -h, --help          display help for command

list-codes

Usage: quasalang list-codes|lc [options]

Search & list i18n locale codes

Options:
  -h, --help  display help for command