Coder Social home page Coder Social logo

format-message / format-message Goto Github PK

View Code? Open in Web Editor NEW
203.0 5.0 40.0 1.99 MB

Internationalization Made Easy

Home Page: http://format-message.github.io/icu-message-format-for-translators/

License: MIT License

JavaScript 100.00%
internationalization javascript

format-message's Introduction

format-message

Internationalize text, numbers, and dates using ICU Message Format.

npm Version Build Status

JS Standard Style MIT License

LOOKING FOR MAINTAINERS

The current maintainers are looking for someone to take over the maintaince of this package. If you are interested please reach out to vanwagonet

Internationalization Made Easy

Start simple. Wrap any user-facing message with formatMessage(). Don't forget to import/require format-message.

var formatMessage = require('format-message');
// ...
formatMessage('My Account Preferences')

Don't concatenate message pieces, use placeholders instead.

formatMessage('Hello, { name }!', { name: user.name })

You can even pick plural and gender forms with placeholders.

formatMessage(`{
  gender, select,
    male {His inbox}
  female {Her inbox}
   other {Their inbox}
 }`, { gender: user.gender })

 formatMessage(`{
   count, plural,
      =0 {No unread messages}
     one {# unread message}
   other {# unread messages}
 }`, { count: messages.unreadCount })

Need to provide extra information to translators? Add a message description. Need 2 translations to the same English message? Add a message id.

formatMessage({
  id: 'update_action_button',
  default: 'Update',
  description: 'Text displayed on the update resource button to trigger the update process'
})
formatMessage({
  id: 'update_label',
  default: 'Update',
  description: 'Label on each item that is an update to another item'
})

Extract all of the messages you've used in your source code.

$ npm i format-message-cli
$ format-message extract "src/**/*.js" > ./locales/en/messages.json

Check that the translators preserved placeholders and proper message formatting.

$ format-message lint -t ./locales/index.js "src/**/*.js"

Use the translations at runtime.

formatMessage.setup({
  generateId: require('format-message-generate-id/underscored_crc32'),
  translations: require('./locales'),
  locale: 'pt'
})

Make a locale-specific build.

$ format-message transform --inline --locale pt "src/**/*.js" > bundle.pt.js

Need more details?

Check out the many ways you can use format-message in your project:

License

This software is free to use under the MIT license. See the LICENSE-MIT file for license text and copyright information.

format-message's People

Contributors

ashokkbhaskar avatar azure-pipelines[bot] avatar bjohn465 avatar brentropy avatar edwardscam avatar greenkeeper[bot] avatar greenkeeperio-bot avatar jamesplease avatar minimalmonkey avatar probertson avatar raybrownco avatar romms avatar ryanhair avatar sdb1228 avatar siddrc avatar straker avatar thorbenprimke avatar tsmmark avatar vanwagonet avatar yogu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

format-message's Issues

JSX Bug ?

I try this in my react app

            <p className="c-alerts__text">
              {formatChildren(
                formatMessage("You have {maxDashbaords, number} dashboards. Please __upgrade__ to add more.", {
                  maxDashbaords
                }),
                {
                  __: <a href="/Plans" />,
                }
              )}
            </p>

but i got YOU HAVE ONLY 1 DASHBOARDS LEFT __UPGRADE__ YOUR PLAN NOW!

An in-range update of karma is breaking the build 🚨

Version 1.5.0 of karma just got published.

Branch Build failing 🚨
Dependency karma
Current Version 1.4.1
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As karma is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪


Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details
Release Notes v1.5.0

Bug Fixes

  • filter browser logging by level of LOG (89a7a1c), closes #2228
  • make window.parent.karma available in debugged context (3e7eaeb)
  • client: don't crash if receive array-like results (e095411), closes #2061

Features

  • add an option to run the tests by dynamically loading test scripts without iframe (aa42c41)
  • add support for node@7 (eb407ab), closes #2559
Commits

The new version differs by 18 commits .

  • cc6accd chore: release v1.5.0
  • 8b78aa5 chore: update contributors
  • 153880f chore: upgrade dev dependencies
  • e095411 fix(client): don't crash if receive array-like results
  • 89a7a1c fix: filter browser logging by level of LOG
  • eaeffe9 docs(config): update note on config languages to include TypeScript
  • b40af7e docs(dev): fix browsers_ready event heading level
  • aa42c41 feat: add an option to run the tests by dynamically loading test scripts without iframe
  • eb407ab feat: add support for node@7
  • 18757e6 Merge pull request #2555 from karma-runner/greenkeeper-supertest-3.0.0
  • 01b35c4 docs(config): fix typescript comment syntax
  • e7dd612 Merge pull request #2564 from dryajov/master
  • 6a7a22f Merge pull request #2561 from danielcompton/docs-commit-msg-example
  • 3e7eaeb fix: make window.parent.karma available in debugged context
  • 7f55f4f docs(contributing): add sample commit message

There are 18 commits in total. See the full diff.

Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

Node only supports English by default

Test code:

let formatMessage = require("format-message")
formatMessage("{d, date, long}", {d: new Date()}, "ru-RU")

Expected Result: 25 июня 2017 г.
Actual Result (Node v8.0): 2017 M06 25

On Node v7.9.0 it gives wrong result too (but at least month is printed (in other language ofc)): June 25, 2017

Moment works fine meanwhile

> moment().locale('ru-RU').format('LL')
< '25 июня 2017 г.'

Seems it's nodejs problem, so may be use external library for a time?

It's awkward to quote spaces in argument style format

In argStyleText, every single ASCII apostrophe begins and ends quoted literal text, and unquoted {curly braces} must occur in matched pairs.

Normally the quote will be taken literally unless followed immediately by a special character like {}#. When parsing the style text though, you should be able to quote the entire style name so spaces and other special characters are escaped. {start, date, 'MMM d'}

As it is right now, you have to put the quotes only around spaces. {start, date, MMM' 'd}

Arbitrary currency argument

Hi,
maybe I've just missed it in the docs. Is it possible to insert arbitrary currency as parameter? Something along the lines

formatMessage(
  'This Hello to you costs {price, number, currency} Czech korunas!', 
  { price: {'type': 'currencyAmount', 'code': 'CZK', 'amount': 1.0 }}
)

=>
"This Hello to you costs 1.0 CZK"
(or perhaps
"This Hello to you costs 1,0 Kč"
depending on locale)

icu4java has a mechanism for it: http://icu-project.org/apiref/icu4j/com/ibm/icu/util/CurrencyAmount.html

Thanks, cheers

eslint plugin: Error in getSettings in ESLint 1.10

The context is deep frozen now, and so trying to replace a string path with the required object throws an error.

Cannot assign to read only property 'translations' of #<Object>
Cannot assign to read only property 'en' of #<Object>

An in-range update of mocha is breaking the build 🚨

Version 3.4.0 of mocha just got published.

Branch Build failing 🚨
Dependency mocha
Current Version 3.3.0
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As mocha is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪

Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details

Release Notes v3.4.0

Mocha is now moving to a quicker release schedule: when non-breaking changes are merged, a release should happen that week.

This week's highlights:

  • allowUncaught added to commandline as --allow-uncaught (and bugfixed)
  • warning-related Node flags

🎉 Enhancements

🐛 Fixes

🔩 Other

Commits

The new version differs by 9 commits0.

  • 7554b31 Add Changelog for v3.4.0
  • 9f7f7ed Add --trace-warnings flag
  • 92561c8 Add --no-warnings flag
  • ceee976 lint test/integration/fixtures/simple-reporter.js
  • dcfc094 Revert "use semistandard directly"
  • 93392dd no special case for macOS running Karma locally
  • 4d1d91d --allow-uncaught cli option
  • fb1e083 fix allowUncaught in browser
  • 4ed3fc5 Add license report and scan status

false

See the full diff

Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

An in-range update of async is breaking the build 🚨

Version 2.1.5 of async just got published.

Branch Build failing 🚨
Dependency async
Current Version 2.1.4
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As async is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪


Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details
Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

Date formatting bug

I've seen this bug on both the ICU editor and in my local dev environment.

screen shot 2016-12-15 at 2 40 10 pm

screen shot 2016-12-15 at 2 44 17 pm

I'm not exactly sure how it happens. I just start messing with the day/month values and it eventually becomes inconsistent.

An in-range update of inferno-create-element is breaking the build 🚨

Version 1.4.1 of inferno-create-element just got published.

Branch Build failing 🚨
Dependency inferno-create-element
Current Version 1.4.0
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As inferno-create-element is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪


Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details
Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

An in-range update of inferno is breaking the build 🚨

Version 1.4.1 of inferno just got published.

Branch Build failing 🚨
Dependency inferno
Current Version 1.4.0
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As inferno is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪


Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details
Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

An in-range update of rimraf is breaking the build 🚨

Version 2.6.0 of rimraf just got published.

Branch Build failing 🚨
Dependency rimraf
Current Version 2.5.4
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As rimraf is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪


Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details
Commits

The new version differs by 5 commits .

  • 5b661e4 v2.6.0
  • c09915f update tap
  • d53235d Make rimraf.sync 10000% more reliable on Windows
  • e8b10a7 Retry on EBUSY et al on non-windows platforms as well
  • 0fac5f7 Add --no-glob option to cli

See the full diff.

Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

Date and number formatting.

It seems like the following syntaxes should work:

{valid_to_date, date, MMMM} or {valid_to_date, date, yyyy} etc
{day, ordinal}

The ICU editor doesn't seem to do anything with the ordinal. And date formats only seem to support short, medium, or long.

Help?

Deprecate old NPM packages

Hello!

Could you remove or deprecate old package message-format from NPM ??

There are a lot of packages format-message-XXX and message-format-XXX, and it is hard to determine, which is actual (for newbie like me).

P.S.: As I understood, the format-message is the right package, yes?

Custom Format Support

I have a use case for custom number formats. Perhaps a customFormats config option?

formatMessage.setup({
  customFormats: {
    number: {
      'my-currency-override': { /* settings */ }
    }
  }
});
formatMessage.setup = function(opt) {
  if (opt.customFormats) {
    if (opts.customFormats.number) {
      number = {...number, ...opts.customFormats.number};
    }
  }
};

Allow for nested objects as data/keys

Firstly, thanks so much for this lib. It's really useful for a project I'm currently working on and the code is really easy to follow. Awesome work! 🙌

For my project I'm using nested data objects that I pass to the format method. Right now I have to flatten the object for it to work, for example this:

var data = {
  'user': 'Steve',
  'members': {
    'count': 10
  }
};

becomes:

var data = {
  'user': 'Steve',
  'members.count': 10
};

This works fine but when the data object is huge, with lots of nested data we don't care about, it becomes a bit of a performance issue.

A work around for this would be to update the interpretSimple function to be:

function interpretSimple (id) {
  return function format (args) {
    var parts = id.split('.');
    if (parts.length > 1) {
      var i = 0;
      var l = parts.length;
      var a = args;
      for (i; i < l; i++) {
        a = a[parts[i]];
        if (!a) return '' + args[id];
      }
      return '' + a;
    }
    return '' + args[id];
  }
}

This would look for nested variables in an object but would fallback to how things currently work, so would be a minor update / backwards compatible.

Is this something that could be consider? If yes I can put together a PR today along with updated unit tests etc.

Smallest docs tweak

From the first line of the README:

Wrap any user-facing with ...

Is this missing a noun there after "user-facing"? String? Message? :)

Add eslint rule to disallow formatMessage calls in top-level scope

formatMessage() calls made in the top-level (global or module) scope will not be reevaluated if the locale changes. If you are relying on runtime changes to the current locale, then you may want to guard against these kinds of calls.

The default rules assume you want a static locale, and that changing locales will involve reloading the page, so this rule would be disabled by default.

An in-range update of eslint-plugin-promise is breaking the build 🚨

Version 3.4.2 of eslint-plugin-promise just got published.

Branch Build failing 🚨
Dependency eslint-plugin-promise
Current Version 3.4.1
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As eslint-plugin-promise is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪


Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details
Commits

The new version differs by 5 commits .

See the full diff.

Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

eslint-plugin: Variable declaration without an initializer causes error

var foo
foo()
eslint-plugin-format-message/lib/util/ast.js:17
    node.init.type === 'CallExpression' &&
             ^

TypeError: Cannot read property 'type' of null
    at isRequireFormatMessage (eslint-plugin-format-message/lib/util/ast.js:17:14)
    at Object.isFormatMessage (eslint-plugin-format-message/lib/util/ast.js:42:5)
    at EventEmitter.CallExpression (eslint-plugin-format-message/lib/util/visit-format-call.js:8:19)

Question: Get message in multiple languages

Hi,
first of all this module looks awesome.
I wonder if there is option to get translation of message in multiple languages on the fly? Like passing locale as option or something ...

allow missingReplacement to be a function

I have a fallback storage for i18n strings.
In case of failing to find translation I need:

  • warn that translation is absent in console (using missingTranslation option)
  • provide translation from fallback storage

It could be achieved by providing function as missingReplacement option on setup.

An in-range update of babel-eslint is breaking the build 🚨

Version 7.2.0 of babel-eslint just got published.

Branch Build failing 🚨
Dependency babel-eslint
Current Version 7.1.1
Type devDependency

This version is covered by your current version range and after updating it in your project the build failed.

As babel-eslint is “only” a devDependency of this project it might not break production or downstream projects, but “only” your build or test tools – preventing new deploys or publishes.

I recommend you give this issue a high priority. I’m sure you can resolve this 💪


Status Details
  • continuous-integration/travis-ci/push The Travis CI build failed Details
Release Notes v7.2.0

New Feature

  • Add option to disable code frame. (#446) (Luís Couto)

Main change is just an option to disable the codeframe (added in v7.1.1) for html output and more (thanks to @Couto).

{
  "parser": "babel-eslint",
  "parserOptions": {
    "codeFrame": false
  },
  "extends": "eslint:recommended"
}

Bug Fix

  • [flow] Process polymorphic type bounds on functions (#444) (Alex Rattray)

Internal/Docs

  • Use lodash instead of lodash.pickby. (#435) (wtgtybhertgeghgtwtg)
  • Updates ESLint version/remove unnecessary config (Kai Cataldo)
  • Remove broken ESLint tests (Kai Cataldo)
  • Upgrade outdated dependencies (Kai Cataldo)
  • remove deprecated rule examples [skip ci] (Henry Zhu)
  • update readme [skip ci] (Henry Zhu)
  • chore(package): update eslint-config-babel to version 6.0.0 (#433) (Henry Zhu)
  • Update to use Node 4 features (#425) (Nazim Hajidin)
  • chore(package): update eslint-config-babel to version 4.0.0 (#430) (greenkeeper[bot])
  • add badges [skip ci] (Henry Zhu)
  • Revert "use *" (#426) (Henry Zhu)
  • use * (#421) (Henry Zhu)
  • chore(package): update eslint-config-babel to version 3.0.0 (#423) (greenkeeper[bot])
Commits

The new version differs by 17 commits .

  • 4db4db5 7.2.0
  • 4499412 Use lodash instead of lodash.pickby. (#435)
  • a2c3b30 [flow] Process polymorphic type bounds on functions (#444)
  • 515adef Add option to disable code frame. (#446)
  • ce66e73 Merge pull request #447 from kaicataldo/clean-up-eslint
  • b49ab20 Updates ESLint version/remove unnecessary config
  • 702d6b8 Remove broken ESLint tests
  • 6b4c4ca Upgrade outdated dependencies
  • bdeb86f remove deprecated rule examples [skip ci]
  • 52b4a13 update readme [skip ci]
  • 0e5aca3 chore(package): update eslint-config-babel to version 6.0.0 (#433)
  • 781dc77 Update to use Node 4 features (#425)
  • 265d219 chore(package): update eslint-config-babel to version 4.0.0 (#430)
  • e6af5c5 add badges [skip ci]
  • a91a9d0 Revert "use *" (#426)

There are 17 commits in total. See the full diff.

Not sure how things should work exactly?

There is a collection of frequently asked questions and of course you may always ask my humans.


Your Greenkeeper Bot 🌴

format-message extract doesn't order keys lexically

The extractor appears to sort keys in the order found while traversing the source. This makes the file change after refactoring, even when no messages were actually changed.

The extractor should make sure that the keys are sorted lexically, so even if the source order of messages changes, the extracted json stays the same.

Need a way to provide an explicit message id

Right now the translate function takes the default message in order to lookup a translation. The common practice is to derive a message id from the default message, but in some cases the same default message needs to translate to different things depending on context.

For example: Update in English can be a noun (This is an Update), and also a verb (Update this thing). Yet in Portuguese they need to be different (Atualização and Atualizar respectively).

Allowing the developer to pass in an additional identifier makes it so these can be differentiated by the translator.

How to use custom datetime format in strings?

Hello!

I have an ICU-string with ISO8601 format instruction for date:

Hello, {username}, it is {ts, date} (ISO-timestamp is {ts, date, YYYY-MM-DDThh:mm:ssZ})

And I want to get the ISO8601-formatted date in the resulting string (Hello, Barack Obama, it is Oct 25, 2016 (ISO-timestamp is 2016-10-25T01:01:15Z).

ICU describes the SimpleDateFormat, but seems, like this feature is not implemented.

More details on stackoverflow

clear workflow example

I am pretty sure I'm missing something basic here. But I don't understand how is supposed to work in a full development cycle.

From my understanding:

  1. Add strings to source code formatMessage('My Account Preferences')
  2. Extract the strings to a json, yaml to be passed to translators format-message extract "src/**/*.js" > ./locales/en/messages.json
  3. Load those strings into your code depending on your locale by formatMessage.setup(....

Now the problem is, if add a new string, the step2 will overwrite all the strings, how do I just add some? The same for removing?
Basically the problem is how to handle the evolution of strings and its translations.

JSX translate force id

There is a way to force the id of translate when you use JSX translate="yes".

Like:
<p translate="yes" translateId="test">Test</p>

Lint for missing arguments

If a pattern has arguments, but doesn't get an object, report an error, since this will cause a runtime error.

If a pattern has an argument, and the arguments are passed as a literal object that is missing the argument, report a warning since this will result in an unexpected undefined in the final string.

TypeError: Cannot read property 'source' of undefined

When using eslint-plugin-format-message I get the following error:

TypeError: Cannot read property 'source' of undefined
    at isImportFormatMessage (.../node_modules/eslint-plugin-format-message/lib/util/ast.js:8:16)
    at Object.isFormatMessage (.../node_modules/eslint-plugin-format-message/lib/util/ast.js:43:5)
    at EventEmitter.CallExpression (.../node_modules/eslint-plugin-format-message/lib/util/visit-format-call.js:8:19)
    at emitOne (events.js:101:20)
    at EventEmitter.emit (events.js:188:7)
    at NodeEventGenerator.enterNode (.../node_modules/eslint/lib/util/node-event-generator.js:40:22)
    at CodePathAnalyzer.enterNode (.../node_modules/eslint/lib/code-path-analysis/code-path-analyzer.js:607:23)
    at CommentEventGenerator.enterNode (.../node_modules/eslint/lib/util/comment-event-generator.js:97:23)
    at Controller.enter (.../node_modules/eslint/lib/eslint.js:905:36)
    at Controller.__execute (.../node_modules/estraverse/estraverse.js:397:31)

This error seems to happen when a ImportDefaultSpecifier node is missing the parent property. I have only ever observed this when using babel-parser, but it isn't consistently reproducible.

Auto wrap JSX text

There should be a flag that tells cli tools to treat literal text in JSX as inferred calls to formatMessage()

  • --auto-jsx-text
  • Should respect the translate attribute
  • Should handle complex messages with nested tags

Need a way to add message description

There is no way to annotate a message with a description that provides needed context to translators.

For example you could have a message "1" used as a label in a widget as an abbreviation for "Applies to 1st grade in elementary". Without that context it is really difficult to know that it is an ordinal number instead of cardinal, and asian languages might be able to give a more complete message with the same desired terseness.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.