angular-gettext
Advanced tools
Comparing version 0.0.2 to 0.0.3
@@ -22,3 +22,5 @@ angular.module('gettext', []); | ||
var key, val, _results; | ||
this.strings[language] = {}; | ||
if (!this.strings[language]) { | ||
this.strings[language] = {}; | ||
} | ||
_results = []; | ||
@@ -25,0 +27,0 @@ for (key in strings) { |
@@ -1,1 +0,1 @@ | ||
angular.module("gettext",[]),angular.module("gettext").factory("gettextCatalog",["gettextPlurals",function(a){var b;return b=function(){function b(){this.debug=!1,this.strings={},this.currentLanguage="en"}var c;return c=function(a,b){return a?"[MISSING]: "+b:b},b.prototype.setStrings=function(a,b){var c,d,e;this.strings[a]={},e=[];for(c in b)d=b[c],"string"==typeof d?e.push(this.strings[a][c]=[d]):e.push(this.strings[a][c]=d);return e},b.prototype.getString=function(a){var b,d;return(null!=(b=this.strings[this.currentLanguage])?null!=(d=b[a])?d[0]:void 0:void 0)||c(this.debug,a)},b.prototype.getPlural=function(b,d,e){var f,g,h;return f=a(this.currentLanguage,b),g=(null!=(h=this.strings[this.currentLanguage])?h[d]:void 0)||[],g[f]||c(this.debug,1===b?d:e)},b}(),new b}]),angular.module("gettext").directive("translate",["gettextCatalog","$interpolate","$parse",function(a,b,c){return{compile:function(d,e){var f,g;return f=function(a,b){throw new Error("You should add a "+a+" attribute whenever you add a "+b+" attribute.")},e.translatePlural&&!e.translateN&&f("translate-n","translate-plural"),e.translateN&&!e.translatePlural&&f("translate-plural","translate-n"),g=d.html(),function(f){var h,i;return h=c(e.translateN),i=function(){var c,i,j;return i=d.html(),j=e.translatePlural?a.getPlural(h(f),g,e.translatePlural):a.getString(g),c=b(j)(f),i!==c?d.html(c):void 0},f.$watch(i)}}}}]),angular.module("gettext").factory("gettextPlurals",function(){return function(a,b){switch(a){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return 1!=b%10||11==b%100?1:0;case"jv":return 0!=b?1:0;case"mk":return 1==b||1==b%10?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return b>1?1:0;case"lv":return 1==b%10&&11!=b%100?0:0!=b?1:2;case"lt":return 1==b%10&&11!=b%100?0:b%10>=2&&(10>b%100||b%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return 1==b%10&&11!=b%100?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"mnk":return 0==b?0:1==b?1:2;case"ro":return 1==b?0:0==b||b%100>0&&20>b%100?1:2;case"pl":return 1==b?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"cs":case"sk":return 1==b?0:b>=2&&4>=b?1:2;case"sl":return 1==b%100?1:2==b%100?2:3==b%100||4==b%100?3:0;case"mt":return 1==b?0:0==b||b%100>1&&11>b%100?1:b%100>10&&20>b%100?2:3;case"gd":return 1==b||11==b?0:2==b||12==b?1:b>2&&20>b?2:3;case"cy":return 1==b?0:2==b?1:8!=b&&11!=b?2:3;case"kw":return 1==b?0:2==b?1:3==b?2:3;case"ga":return 1==b?0:2==b?1:7>b?2:11>b?3:4;case"ar":return 0==b?0:1==b?1:2==b?2:b%100>=3&&10>=b%100?3:b%100>=11?4:5;default:return 1!=b?1:0}}}); | ||
angular.module("gettext",[]),angular.module("gettext").factory("gettextCatalog",["gettextPlurals",function(a){var b;return b=function(){function b(){this.debug=!1,this.strings={},this.currentLanguage="en"}var c;return c=function(a,b){return a?"[MISSING]: "+b:b},b.prototype.setStrings=function(a,b){var c,d,e;this.strings[a]||(this.strings[a]={}),e=[];for(c in b)d=b[c],"string"==typeof d?e.push(this.strings[a][c]=[d]):e.push(this.strings[a][c]=d);return e},b.prototype.getString=function(a){var b,d;return(null!=(b=this.strings[this.currentLanguage])?null!=(d=b[a])?d[0]:void 0:void 0)||c(this.debug,a)},b.prototype.getPlural=function(b,d,e){var f,g,h;return f=a(this.currentLanguage,b),g=(null!=(h=this.strings[this.currentLanguage])?h[d]:void 0)||[],g[f]||c(this.debug,1===b?d:e)},b}(),new b}]),angular.module("gettext").directive("translate",["gettextCatalog","$interpolate","$parse",function(a,b,c){return{compile:function(d,e){var f,g;return f=function(a,b){throw new Error("You should add a "+a+" attribute whenever you add a "+b+" attribute.")},e.translatePlural&&!e.translateN&&f("translate-n","translate-plural"),e.translateN&&!e.translatePlural&&f("translate-plural","translate-n"),g=d.html(),function(f){var h,i;return h=c(e.translateN),i=function(){var c,i,j;return i=d.html(),j=e.translatePlural?a.getPlural(h(f),g,e.translatePlural):a.getString(g),c=b(j)(f),i!==c?d.html(c):void 0},f.$watch(i)}}}}]),angular.module("gettext").factory("gettextPlurals",function(){return function(a,b){switch(a){case"ay":case"bo":case"cgg":case"dz":case"fa":case"id":case"ja":case"jbo":case"ka":case"kk":case"km":case"ko":case"ky":case"lo":case"ms":case"my":case"sah":case"su":case"th":case"tt":case"ug":case"vi":case"wo":case"zh":return 0;case"is":return 1!=b%10||11==b%100?1:0;case"jv":return 0!=b?1:0;case"mk":return 1==b||1==b%10?0:1;case"ach":case"ak":case"am":case"arn":case"br":case"fil":case"fr":case"gun":case"ln":case"mfe":case"mg":case"mi":case"oc":case"tg":case"ti":case"tr":case"uz":case"wa":case"zh":return b>1?1:0;case"lv":return 1==b%10&&11!=b%100?0:0!=b?1:2;case"lt":return 1==b%10&&11!=b%100?0:b%10>=2&&(10>b%100||b%100>=20)?1:2;case"be":case"bs":case"hr":case"ru":case"sr":case"uk":return 1==b%10&&11!=b%100?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"mnk":return 0==b?0:1==b?1:2;case"ro":return 1==b?0:0==b||b%100>0&&20>b%100?1:2;case"pl":return 1==b?0:b%10>=2&&4>=b%10&&(10>b%100||b%100>=20)?1:2;case"cs":case"sk":return 1==b?0:b>=2&&4>=b?1:2;case"sl":return 1==b%100?1:2==b%100?2:3==b%100||4==b%100?3:0;case"mt":return 1==b?0:0==b||b%100>1&&11>b%100?1:b%100>10&&20>b%100?2:3;case"gd":return 1==b||11==b?0:2==b||12==b?1:b>2&&20>b?2:3;case"cy":return 1==b?0:2==b?1:8!=b&&11!=b?2:3;case"kw":return 1==b?0:2==b?1:3==b?2:3;case"ga":return 1==b?0:2==b?1:7>b?2:11>b?3:4;case"ar":return 0==b?0:1==b?1:2==b?2:b%100>=3&&10>=b%100?3:b%100>=11?4:5;default:return 1!=b?1:0}}}); |
{ | ||
"name": "angular-gettext", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"description": "Gettext support for Angular.js", | ||
@@ -33,3 +33,7 @@ "main": "index.js", | ||
"grunt-contrib-concat": "~0.3.0" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/rubenv/angular-gettext.git" | ||
} | ||
} |
@@ -7,4 +7,101 @@ # angular-gettext - gettext utilities for angular.js | ||
Documentation: TODO | ||
## Getting started | ||
Add angular-gettext to your project: | ||
1. Grab the files, either by copying the files from the `dist` folder or (preferably) through bower: `bower install --save angular-gettext`. | ||
2. Include the angular-gettext source files in your app: | ||
```html | ||
<script src="bower_components/angular-gettext/dist/angular-gettext.min.js"></script> | ||
``` | ||
3. Add a dependency to angular-gettext in your Angular app: | ||
```js | ||
angular.module('myApp', ['gettext']); | ||
``` | ||
You can now start using the `translate` directive to mark strings as translatable. | ||
Next steps: | ||
* Annotate strings with the `translate` directive. | ||
* Extract strings from the source code. | ||
* Translate strings | ||
* Integrate translated strings back into the application. | ||
* Set the correct language for translations. | ||
## Using the `translate` directive | ||
Strings are marked as translatable using the `translate` directive. Here's a simple example: | ||
```html | ||
<h1 translate>Hello!</h1> | ||
``` | ||
This div will automatically be translated using the translated strings (which we'll define later on). For instance, in Dutch, it might read `Hallo!`. | ||
### Plurals | ||
Plural strings can be annotated using two extra attributes: `translate-n` and `translate-plural`: | ||
```html | ||
<div translate translate-n="count" translate-plural="{{count}} boats">One boat</div> | ||
``` | ||
The general format is: | ||
```html | ||
<div translate translate-n="COUNTEXPR" translate-plural="PLURALSTR">SINGULARSTR</div> | ||
``` | ||
Depending on the value of `COUNTEXPR`, either the singular string or the plural string will be selected. | ||
### Interpolation | ||
Full interpolation support is available in translated strings, so the following will work as expected: | ||
```html | ||
<div translate>Hello {{name}}!</div> | ||
``` | ||
## Extracting strings | ||
Use [`grunt-angular-gettext`](https://github.com/rubenv/grunt-angular-gettext) to extract strings from your HTML templates into a `.pot` catalog. | ||
## Translate strings | ||
Use a tool like [poedit](http://www.poedit.net/), [Pootle](http://pootle.translatehouse.org/) or [Transifex](https://www.transifex.com/) to translate the strings. | ||
## Setting translated strings | ||
You can set translated strings by injecting the `gettextCatalog` and using the `setStrings` method. | ||
As an example, you may have the following code in your application: | ||
```js | ||
angular.module('myApp').run(function (gettextCatalog) { | ||
// Load the strings automatically during initialization. | ||
gettextCatalog.setStrings('nl', { | ||
'Hello': 'Hallo', | ||
'One boat': ['Een boot', '{{count}} boats'] | ||
}); | ||
}); | ||
``` | ||
Converting translated `.po` files into angular-compatible JavaScript files can be done automatically using the [`grunt-angular-gettext`](https://github.com/rubenv/grunt-angular-gettext) module. | ||
## Setting the language | ||
Set the language by setting a language code on the catalog: | ||
```js | ||
angular.module('myApp').run(function (gettextCatalog) { | ||
gettextCatalog.currentLanguage = 'nl'; | ||
}); | ||
``` | ||
You can do this anywhere in your application, the use of a `run` block above is just an example. | ||
## Contributing | ||
@@ -11,0 +108,0 @@ All code lives in the `src` folder and is written in CoffeeScript. Try to stick to the style conventions used in existing code. |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No repository
Supply chain riskPackage does not have a linked source code repository. Without this field, a package will have no reference to the location of the source code use to generate the package.
Found 1 instance in 1 package
38422
311
134
0