• This repository has been archived on 08/Jun/2019
  • Stars
    star
    115
  • Rank 294,951 (Top 6 %)
  • Language
    JavaScript
  • License
    Other
  • Created almost 10 years ago
  • Updated almost 5 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

[MIGRATED] Parses ICU message strings to an AST that can be used to format the messages for a person's locale.

Code has been moved to the FormatJS monorepo.

Intl MessageFormat Parser

Parses ICU Message strings into an AST via JavaScript.

npm Version Build Status Dependency Status

Overview

This package implements a parser in JavaScript that parses the industry standard ICU Message strings — used for internationalization — into an AST. The produced AST can then be used by a compiler, like intl-messageformat, to produce localized formatted strings for display to users.

This parser is written in PEG.js, a parser generator for JavaScript. This parser's implementation was inspired by and derived from Alex Sexton's messageformat.js project. The differences from Alex's implementation are:

  • This project is standalone.
  • It's authored as ES6 modules compiled to CommonJS and the Bundle format for the browser.
  • The produced AST is more descriptive and uses recursive structures.
  • The keywords used in the AST match the ICU Message "spec".

Usage

Loading in the Browser

The dist/ folder contains the version of this package for use in the browser, and it can be loaded and used like this:

<script src="intl-messageformat-parser/dist/parser.min.js"></script>
<script>
    IntlMessageFormatParser.parse('...');
</script>

Loading in Node.js

This package can also be require()-ed in Node.js:

var parser = require('intl-messageformat-parser');
parser.parse('...');

Example

Given an ICU Message string like this:

On {takenDate, date, short} {name} took {numPhotos, plural,
    =0 {no photos.}
    =1 {one photo.}
    other {# photos.}
}
// Assume `msg` is the string above.
parser.parse(msg);

This parser will produce this AST:

{
    "type": "messageFormatPattern",
    "elements": [
        {
            "type": "messageTextElement",
            "value": "On "
        },
        {
            "type": "argumentElement",
            "id": "takenDate",
            "format": {
                "type": "dateFormat",
                "style": "short"
            }
        },
        {
            "type": "messageTextElement",
            "value": " "
        },
        {
            "type": "argumentElement",
            "id": "name",
            "format": null
        },
        {
            "type": "messageTextElement",
            "value": " took "
        },
        {
            "type": "argumentElement",
            "id": "numPhotos",
            "format": {
                "type": "pluralFormat",
                "offset": 0,
                "options": [
                    {
                        "type": "optionalFormatPattern",
                        "selector": "=0",
                        "value": {
                            "type": "messageFormatPattern",
                            "elements": [
                                {
                                    "type": "messageTextElement",
                                    "value": "no photos."
                                }
                            ]
                        }
                    },
                    {
                        "type": "optionalFormatPattern",
                        "selector": "=1",
                        "value": {
                            "type": "messageFormatPattern",
                            "elements": [
                                {
                                    "type": "messageTextElement",
                                    "value": "one photo."
                                }
                            ]
                        }
                    },
                    {
                        "type": "optionalFormatPattern",
                        "selector": "other",
                        "value": {
                            "type": "messageFormatPattern",
                            "elements": [
                                {
                                    "type": "messageTextElement",
                                    "value": "# photos."
                                }
                            ]
                        }
                    }
                ]
            }
        }
    ]
}

License

This software is free to use under the Yahoo! Inc. BSD license. See the LICENSE file for license text and copyright information.

More Repositories

1

formatjs

The monorepo home to all of the FormatJS related libraries, most notably react-intl.
TypeScript
14,054
star
2

intl-messageformat

[MIGRATED] Format a string with placeholders, including plural and select support to create localized messages.
TypeScript
528
star
3

babel-plugin-react-intl

Extracts string messages from React components that use React Intl.
JavaScript
420
star
4

formatjs-site

Documentation for client/server internationalization in JavaScript.
HTML
315
star
5

handlebars-intl

Handlebars helpers for internationalization.
JavaScript
265
star
6

intl-relativeformat

Formats JavaScript dates to relative time strings (e.g., "3 hours ago").
TypeScript
212
star
7

formatjs-old

The monorepo home to all of the FormatJS related libraries.
TypeScript
156
star
8

date-time-format-timezone

Surgically polyfills timezone support in Intl.DateTimeFormat API
JavaScript
108
star
9

intl-locales-supported

[MIGRATED] Utility to help you polyfill the Node.js runtime when the Intl APIs are missing, or if the built-in Intl is missing locale data that you need.
JavaScript
67
star
10

intl-format-cache

Produces instances of JavaScript `Intl` formats, and caches them for reuse.
TypeScript
54
star
11

dust-intl

Dust helpers for internationalization.
JavaScript
48
star
12

js-module-formats

Detect different types of javascript modules formats
JavaScript
13
star
13

input-data-formatter

JavaScript
11
star
14

formatjs-extract-cldr-data

[MIGRATED] Utility library that extracts the CLDR data that's needed by the FormatJS libraries.
JavaScript
11
star
15

grunt-extract-cldr-data

Extract CLDR data and transform it for use in JavaScript.
JavaScript
7
star
16

broccoli-js-module-formats

Broccoli plugin for obtaining files that use a particular module system
JavaScript
2
star
17

formatjs.github.io

Website for formatjs.io
HTML
1
star