← Back to team overview

dhis2-devs team mailing list archive

[Branch ~dhis2-devs-core/dhis2/trunk] Rev 10602: (PT) i18n + (GIS) Facility layer buffer fix + Legend bug fixed + Layer order changed.

 

Merge authors:
  Jan Henrik Øverland (janhenrik-overland)
------------------------------------------------------------
revno: 10602 [merge]
committer: Jan Henrik Overland <janhenrik.overland@xxxxxxxxx>
branch nick: dhis2
timestamp: Wed 2013-04-17 13:55:58 +0200
message:
  (PT) i18n + (GIS) Facility layer buffer fix + Legend bug fixed + Layer order changed.
added:
  dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/
  dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/
  dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis/
  dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis/pivot/
  dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis/pivot/i18n_module.properties
  dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/i18n.vm
modified:
  dhis-2/dhis-web/dhis-web-mapping/src/main/resources/org/hisp/dhis/mapping/i18n_module.properties
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/index.html
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/core.js
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic1.js
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic2.js
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic3.js
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic4.js
  dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/i18n.vm
  dhis-2/dhis-web/dhis-web-pivot/src/main/resources/struts.xml
  dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/index.html
  dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js
  dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js


--
lp:dhis2
https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk

Your team DHIS 2 developers is subscribed to branch lp:dhis2.
To unsubscribe from this branch go to https://code.launchpad.net/~dhis2-devs-core/dhis2/trunk/+edit-subscription
=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/resources/org/hisp/dhis/mapping/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/resources/org/hisp/dhis/mapping/i18n_module.properties	2013-04-16 14:57:39 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/resources/org/hisp/dhis/mapping/i18n_module.properties	2013-04-17 10:38:34 +0000
@@ -361,4 +361,8 @@
 link_=Link
 level_not_higher_than_parent_level=Organisation unit level cannot not be higher than parent level
 information=Information
-parent_unit=Parent unit
\ No newline at end of file
+parent_unit=Parent unit
+home=Home
+google_streets=Google Streets
+google_hybrid=Google Hybrid
+openstreetmap=OpenStreetMap
\ No newline at end of file

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/index.html'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/index.html	2013-04-16 10:46:17 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/index.html	2013-04-16 17:47:28 +0000
@@ -23,7 +23,7 @@
 		window.google = null;
 	</script>
 
-    <script type="text/javascript" src="https://maps.google.com/maps/api/js?sensor=false";></script>
+    <script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3.2&sensor=false";></script>
 
     <script type="text/javascript" src="../../dhis-web-commons/javascripts/ext/ext-all.js"></script>
     <script type="text/javascript" src="scripts/ext-ux/ext-ux-custom.js"></script>

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js	2013-04-16 10:46:17 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/app.js	2013-04-17 10:38:34 +0000
@@ -576,6 +576,10 @@
 				if (value && this.layer.layerType === gis.conf.finals.layer.type_base) {
 					gis.olmap.setBaseLayer(this.layer);
 				}
+
+				if (this.layer.circleLayer) {
+					this.layer.circleLayer.setVisibility(value);
+				}
 			},
 			initComponent: function() {
 				var that = this,
@@ -879,18 +883,10 @@
 			item,
 			panel,
 			visibleLayer = window.google ? layers.googleStreets : layers.openStreetMap,
-			reversedLayers = [];
-
-		for (var key in gis.layer) {
-			if (gis.layer.hasOwnProperty(key)) {
-				reversedLayers.push(gis.layer[key]);
-			}
-		}
-
-		reversedLayers = reversedLayers.reverse();
-
-		for (var i = 0; i < reversedLayers.length; i++) {
-			layer = reversedLayers[i];
+			orderedLayers = gis.olmap.layers.reverse();
+
+		for (var i = 0; i < orderedLayers.length; i++) {
+			layer = orderedLayers[i];
 
 			item = Ext.create('Ext.ux.panel.LayerItemPanel', {
 				cls: 'gis-container-inner',
@@ -4759,6 +4755,11 @@
 					items: function() {
 						var a = [];
 						a.push({
+							iconCls: 'gis-btn-icon-' + gis.layer.facility.id,
+							menu: gis.layer.facility.menu,
+							width: 26
+						});
+						a.push({
 							iconCls: 'gis-btn-icon-' + gis.layer.boundary.id,
 							menu: gis.layer.boundary.menu,
 							width: 26
@@ -4784,11 +4785,6 @@
 							width: 26
 						});
 						a.push({
-							iconCls: 'gis-btn-icon-' + gis.layer.facility.id,
-							menu: gis.layer.facility.menu,
-							width: 26
-						});
-						a.push({
 							text: GIS.i18n.favorites,
 							menu: {},
 							handler: function() {
@@ -4895,7 +4891,7 @@
 
                         a.push({
                             xtype: 'button',
-                            text: 'Home',
+                            text: GIS.i18n.home,
                             handler: function() {
                                 window.location.href = '../../dhis-web-commons-about/redirect.action';
                             }
@@ -5078,8 +5074,14 @@
 			gis.util = GIS.app.getUtils();
 			gis.store = GIS.app.getStores();
 
+			layer = gis.layer.facility;
+			layer.menu = GIS.app.LayerMenu(layer, 'gis-toolbar-btn-menu-first');
+			layer.widget = GIS.app.LayerWidgetFacility(layer);
+			layer.window = GIS.app.WidgetWindow(layer);
+			GIS.core.createSelectHandlers(gis, layer);
+
 			layer = gis.layer.boundary;
-			layer.menu = GIS.app.LayerMenu(layer, 'gis-toolbar-btn-menu-first');
+			layer.menu = GIS.app.LayerMenu(layer);
 			layer.widget = GIS.app.LayerWidgetBoundary(layer);
 			layer.window = GIS.app.WidgetWindow(layer);
 			GIS.core.createSelectHandlers(gis, layer);
@@ -5108,12 +5110,6 @@
 			layer.window = GIS.app.WidgetWindow(layer);
 			GIS.core.createSelectHandlers(gis, layer);
 
-			layer = gis.layer.facility;
-			layer.menu = GIS.app.LayerMenu(layer);
-			layer.widget = GIS.app.LayerWidgetFacility(layer);
-			layer.window = GIS.app.WidgetWindow(layer);
-			GIS.core.createSelectHandlers(gis, layer);
-
 			gis.viewport = createViewport();
 			gis.viewport.gis = gis;
 		}();

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/core.js'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/core.js	2013-04-16 14:52:11 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/core.js	2013-04-17 10:38:34 +0000
@@ -318,42 +318,42 @@
     });
     layers.openStreetMap.id = 'openStreetMap';
 
-	layers.boundary = GIS.core.VectorLayer(gis, 'boundary', 'Boundary layer', {opacity: 0.8});
+	layers.facility = GIS.core.VectorLayer(gis, 'facility', GIS.i18n.facility_layer, {opacity: 0.8});
+	layers.facility.core = new mapfish.GeoStat.Facility(gis.olmap, {
+		layer: layers.facility,
+		gis: gis
+	});
+
+	layers.boundary = GIS.core.VectorLayer(gis, 'boundary', GIS.i18n.boundary_layer, {opacity: 0.8});
 	layers.boundary.core = new mapfish.GeoStat.Boundary(gis.olmap, {
 		layer: layers.boundary,
 		gis: gis
 	});
 
-	layers.thematic1 = GIS.core.VectorLayer(gis, 'thematic1', 'Thematic layer 1', {opacity: 0.8});
+	layers.thematic1 = GIS.core.VectorLayer(gis, 'thematic1', GIS.i18n.thematic_layer + ' 1', {opacity: 0.8});
 	layers.thematic1.core = new mapfish.GeoStat.Thematic1(gis.olmap, {
 		layer: layers.thematic1,
 		gis: gis
 	});
 
-	layers.thematic2 = GIS.core.VectorLayer(gis, 'thematic2', 'Thematic layer 2', {opacity: 0.8});
+	layers.thematic2 = GIS.core.VectorLayer(gis, 'thematic2', GIS.i18n.thematic_layer + ' 2', {opacity: 0.8});
 	layers.thematic2.core = new mapfish.GeoStat.Thematic2(gis.olmap, {
 		layer: layers.thematic2,
 		gis: gis
 	});
 
-	layers.thematic3 = GIS.core.VectorLayer(gis, 'thematic3', 'Thematic layer 3', {opacity: 0.8});
+	layers.thematic3 = GIS.core.VectorLayer(gis, 'thematic3', GIS.i18n.thematic_layer + ' 3', {opacity: 0.8});
 	layers.thematic3.core = new mapfish.GeoStat.Thematic3(gis.olmap, {
 		layer: layers.thematic3,
 		gis: gis
 	});
 
-	layers.thematic4 = GIS.core.VectorLayer(gis, 'thematic4', 'Thematic layer 4', {opacity: 0.8});
+	layers.thematic4 = GIS.core.VectorLayer(gis, 'thematic4', GIS.i18n.thematic_layer + ' 4', {opacity: 0.8});
 	layers.thematic4.core = new mapfish.GeoStat.Thematic4(gis.olmap, {
 		layer: layers.thematic4,
 		gis: gis
 	});
 
-	layers.facility = GIS.core.VectorLayer(gis, 'facility', 'Facility layer', {opacity: 0.8});
-	layers.facility.core = new mapfish.GeoStat.Facility(gis.olmap, {
-		layer: layers.facility,
-		gis: gis
-	});
-
 	return layers;
 };
 
@@ -809,10 +809,8 @@
 	}
 
 	return new OpenLayers.StyleMap({
-		'default': new OpenLayers.Style(
-			OpenLayers.Util.applyDefaults(defaults),
-			OpenLayers.Feature.Vector.style['default']),
-		select: new OpenLayers.Style(select)
+		'default': defaults,
+		select: select
 	});
 };
 
@@ -1077,7 +1075,7 @@
 
     loadData = function(view, features) {
 		view = view || layer.core.view;
-		features = features || layer.features.slice(0);;
+		features = features || layer.features.slice(0);
 
 		for (var i = 0; i < features.length; i++) {
 			features[i].attributes.label = features[i].attributes.name;
@@ -1631,6 +1629,7 @@
 		}
 		if (Ext.isDefined(radius) && radius) {
 			layer.circleLayer = GIS.app.CircleLayer(layer.features, radius);
+			nissa = layer.circleLayer;
 		}
 	};
 
@@ -1708,11 +1707,17 @@
 	gis.olmap = GIS.core.getOLMap(gis);
 	gis.layer = GIS.core.getLayers(gis);
 
-	for (var key in gis.layer) {
-		if (gis.layer.hasOwnProperty(key)) {
-			gis.olmap.addLayer(gis.layer[key]);
-		}
-	}
+	gis.olmap.addLayers([
+		gis.layer.googleStreets,
+		gis.layer.googleHybrid,
+		gis.layer.openStreetMap,
+		gis.layer.thematic4,
+		gis.layer.thematic3,
+		gis.layer.thematic2,
+		gis.layer.thematic1,
+		gis.layer.boundary,
+		gis.layer.facility
+	]);
 
 	return gis;
 };

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic1.js'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic1.js	2013-04-04 13:58:55 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic1.js	2013-04-17 09:47:01 +0000
@@ -117,7 +117,7 @@
 			orgUnitLevel = this.view.organisationUnitLevel,
 			parent = orgUnit ? orgUnit.name : '',
 			level = orgUnitLevel ? orgUnitLevel.name : '',
-			what = indicator ? indicator.name : (dataElement ? dataElement.name : ''),
+			what = this.view.valueType === this.gis.conf.finals.dimension.indicator.id ? indicator.name : dataElement.name,
 			when = period ? period.id : '',
 			where = parent + ' / ' + level;
 

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic2.js'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic2.js	2013-02-05 20:19:14 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic2.js	2013-04-17 09:47:01 +0000
@@ -117,7 +117,7 @@
 			orgUnitLevel = this.view.organisationUnitLevel,
 			parent = orgUnit ? orgUnit.name : '',
 			level = orgUnitLevel ? orgUnitLevel.name : '',
-			what = indicator ? indicator.name : (dataElement ? dataElement.name : ''),
+			what = this.view.valueType === this.gis.conf.finals.dimension.indicator.id ? indicator.name : dataElement.name,
 			when = period ? period.id : '',
 			where = parent + ' / ' + level;
 

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic3.js'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic3.js	2013-04-16 10:02:32 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic3.js	2013-04-17 09:47:01 +0000
@@ -117,7 +117,7 @@
 			orgUnitLevel = this.view.organisationUnitLevel,
 			parent = orgUnit ? orgUnit.name : '',
 			level = orgUnitLevel ? orgUnitLevel.name : '',
-			what = indicator ? indicator.name : (dataElement ? dataElement.name : ''),
+			what = this.view.valueType === this.gis.conf.finals.dimension.indicator.id ? indicator.name : dataElement.name,
 			when = period ? period.id : '',
 			where = parent + ' / ' + level;
 

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic4.js'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic4.js	2013-04-16 10:02:32 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/app/scripts/mapfish/core/GeoStat/Thematic4.js	2013-04-17 09:47:01 +0000
@@ -117,7 +117,7 @@
 			orgUnitLevel = this.view.organisationUnitLevel,
 			parent = orgUnit ? orgUnit.name : '',
 			level = orgUnitLevel ? orgUnitLevel.name : '',
-			what = indicator ? indicator.name : (dataElement ? dataElement.name : ''),
+			what = this.view.valueType === this.gis.conf.finals.dimension.indicator.id ? indicator.name : dataElement.name,
 			when = period ? period.id : '',
 			where = parent + ' / ' + level;
 

=== modified file 'dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/i18n.vm'
--- dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/i18n.vm	2013-04-16 14:52:11 +0000
+++ dhis-2/dhis-web/dhis-web-mapping/src/main/webapp/dhis-web-mapping/i18n.vm	2013-04-17 10:38:34 +0000
@@ -314,15 +314,15 @@
     legend_options: '$encoder.jsEscape($i18n.getString( 'legend_options' ) , "'")',
     parent_organisation_unit:  '$encoder.jsEscape($i18n.getString( 'parent_organisation_unit' ) , "'")',
     resize:  '$encoder.jsEscape($i18n.getString( 'resize' ) , "'")',
-    facility_layer:    '$encoder.jsEscape($i18n.getString( 'facility_layer' ) , "'")',
-    open_which_layer:   '$encoder.jsEscape($i18n.getString( 'open_which_layer' ) , "'")',
+    facility_layer: '$encoder.jsEscape($i18n.getString( 'facility_layer' ) , "'")',
+    open_which_layer: '$encoder.jsEscape($i18n.getString( 'open_which_layer' ) , "'")',
     organisationunit_search: '$encoder.jsEscape($i18n.getString( 'organisationunit_search' ) , "'")',
     no_features_rendered:   '$encoder.jsEscape($i18n.getString( 'no_features_rendered' ) , "'")',
-    wms_overlays:  '$encoder.jsEscape($i18n.getString( 'wms_overlays' ) , "'")',
-    file_overlays:  '$encoder.jsEscape($i18n.getString( 'file_overlays' ) , "'")' ,
-    symbol_layer:    '$encoder.jsEscape($i18n.getString( 'symbol_layer' ) , "'")',
-    centroid_layer:    '$encoder.jsEscape($i18n.getString( 'centroid_layer' ) , "'")',
-    no_values_found:    '$encoder.jsEscape($i18n.getString( 'no_values_found' ) , "'")',
+    wms_overlays: '$encoder.jsEscape($i18n.getString( 'wms_overlays' ) , "'")',
+    file_overlays: '$encoder.jsEscape($i18n.getString( 'file_overlays' ) , "'")' ,
+    symbol_layer: '$encoder.jsEscape($i18n.getString( 'symbol_layer' ) , "'")',
+    centroid_layer: '$encoder.jsEscape($i18n.getString( 'centroid_layer' ) , "'")',
+    no_values_found: '$encoder.jsEscape($i18n.getString( 'no_values_found' ) , "'")',
     close: '$encoder.jsEscape($i18n.getString( 'close' ) , "'")',
     boundary_layer: '$encoder.jsEscape($i18n.getString( 'boundary_layer' ) , "'")',
     register_new_wms_overlay: '$encoder.jsEscape($i18n.getString( 'register_new_wms_overlay' ) , "'")',
@@ -385,5 +385,9 @@
     link_: '$encoder.jsEscape($i18n.getString( 'link_' ) , "'")',
     level_not_higher_than_parent_level: '$encoder.jsEscape($i18n.getString( 'level_not_higher_than_parent_level' ) , "'")',
     information: '$encoder.jsEscape($i18n.getString( 'information' ) , "'")',
-    parent_unit: '$encoder.jsEscape($i18n.getString( 'parent_unit' ) , "'")'
+    parent_unit: '$encoder.jsEscape($i18n.getString( 'parent_unit' ) , "'")',
+    home: '$encoder.jsEscape($i18n.getString( 'home' ) , "'")',
+    google_streets: '$encoder.jsEscape($i18n.getString( 'google_streets' ) , "'")',
+    google_hybrid: '$encoder.jsEscape($i18n.getString( 'google_hybrid' ) , "'")',
+    openstreetmap: '$encoder.jsEscape($i18n.getString( 'openstreetmap' ) , "'")'
 };
\ No newline at end of file

=== added directory 'dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org'
=== added directory 'dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp'
=== added directory 'dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis'
=== added directory 'dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis/pivot'
=== added file 'dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis/pivot/i18n_module.properties'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis/pivot/i18n_module.properties	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/resources/org/hisp/dhis/pivot/i18n_module.properties	2013-04-17 11:52:56 +0000
@@ -0,0 +1,96 @@
+dimensions=Dimensions
+row=Row
+column=Column
+filter=Filter
+table_layout=Table layout
+show_totals=Show totals
+show_subtotals=Show sub-totals
+hide_empty_rows=Hide empty rows
+display_density=Display density
+font_size=Font size
+digit_group_separator=Digit group separator
+reporting_period=Reporting period
+organisation_unit=Organisation unit
+organisation_units=Organisation units
+parent_organisation_unit=Parent organisation unit
+user_organisation_unit=User organisation unit
+user_organisation_unit_children=User organisation unit children
+table_options=Table options
+create=Create
+update=Update
+cancel=Cancel
+delete_=Delete
+add_new=Add new
+search_for_favorites=Search for favorites
+prev=Prev
+next=Next
+rename=Rename
+overwrite=Overwrite
+share_with_other_people=Share with other people
+can_view=Can view
+can_edit_and_view=Can edit and view
+none=None
+public_access=Public access
+search_for_user_groups=Search for user groups
+available=Available
+selected=Selected
+indicators=Indicators
+all_indicator_groups=All indicator groups
+data_elements=Data elements
+all_data_element_groups=All data element groups
+data_sets=Data sets
+reporting_rates=Reporting rates
+periods=Periods
+weeks=Weeks
+last_week=Last week
+last_4_weeks=Last 4 weeks
+last_12_weeks=Last 12 weeks
+months=Months
+last_month=Last month
+last_3_months=Last 3 months
+last_12_months=Last 12 months
+bimonths=Bi-months
+last_bimonth=Last bi-month
+last_6_bimonths=Last 6 bi-months
+quarters=Quarters
+last_quarter=Last quarter
+last_4_quarters=Last 4 quarters
+sixmonths=Six-months
+last_sixmonth=Last six-month
+last_2_sixmonths=Last 2 six-months
+years=Years
+this_year=This year
+last_year=Last year
+last_5_years=Last 5 years
+financial_years=Financial years
+last_financial_year=Last financial year
+last_5_financial_years=Last 5 financial years
+prev_year=Prev year
+next_year=Next year
+select_all_children=Select all children
+table=Table
+chart=Chart
+map=Map
+home=Home
+data=Data
+categories=Categories
+please_create_a_table_first=Please create a table first
+indicators_cannot_be_specified_as_filter=Indicators cannot be specified as filter
+categories_cannot_be_specified_as_filter=Categories cannot be specified as filter
+data_element_group_sets_cannot_be_specified_together_with_data_sets=Data element group sets cannot be specified together with data sets
+at_least_one_dimension_must_be_specified_as_row_or_column=At least one dimension must be specified as row or column
+at_least_one_period_must_be_specified_as_column_row_or_filter=At least one period must be specified as column, row or filter
+
+
+
+
+
+
+
+
+
+
+
+
+
+

=== modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/resources/struts.xml'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/resources/struts.xml	2013-01-17 15:43:51 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/resources/struts.xml	2013-04-17 11:52:56 +0000
@@ -27,6 +27,12 @@
 			<result name="success" type="velocity-json">
 				/dhis-web-pivot/jsonminOrganisationUnitChildren.vm</result>
 		</action>
-
-	</package>
+	
+	    <!-- i18n -->
+	
+	    <action name="i18n" class="org.hisp.dhis.pivot.action.NoAction">
+			<result name="success" type="velocity-javascript">/dhis-web-pivot/i18n.vm</result>
+	    </action>
+	
+		</package>
 </struts>

=== modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/index.html'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/index.html	2013-03-07 21:00:55 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/index.html	2013-04-17 11:52:56 +0000
@@ -11,10 +11,13 @@
 </head>
 
 <body>
+	<script>var PT = {};</script>
+
     <script src="../../dhis-web-commons/javascripts/ext/ext-all.js"></script>
     <script src="../../dhis-web-commons/javascripts/ext-ux/layout/component/form/MultiSelect.js"></script>
     <script src="../../dhis-web-commons/javascripts/ext-ux/form/MultiSelect.js"></script>
 
+	<script src="i18n.action"></script>
     <script src="../../dhis-web-commons/javascripts/periodTypeNoDep.js"></script>
 	<script src="scripts/core.js"></script>
 	<script src="scripts/app.js"></script>

=== modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js	2013-04-16 10:02:32 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/app.js	2013-04-17 11:52:56 +0000
@@ -527,15 +527,15 @@
 
 		rowStore = getStore();
 		pt.viewport.rowStore = rowStore;
-		rowStore.add({id: dimConf.period.dimensionName, name: dimConf.period.name}); //i18n
+		rowStore.add({id: dimConf.period.dimensionName, name: dimConf.period.name});
 
 		colStore = getStore();
 		pt.viewport.colStore = colStore;
-		colStore.add({id: dimConf.data.dimensionName, name: dimConf.data.name}); //i18n
+		colStore.add({id: dimConf.data.dimensionName, name: dimConf.data.name});
 
 		filterStore = getStore();
 		pt.viewport.filterStore = filterStore;
-		filterStore.add({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.name}); //i18n
+		filterStore.add({id: dimConf.organisationUnit.dimensionName, name: dimConf.organisationUnit.name});
 
 		getCmpHeight = function() {
 			var size = dimensionStore.totalCount,
@@ -568,7 +568,7 @@
 				height: 25,
 				items: {
 					xtype: 'label',
-					text: 'Dimensions', //i18n
+					text: PT.i18n.dimensions,
 					cls: 'pt-toolbar-multiselect-leftright-label'
 				}
 			},
@@ -597,7 +597,7 @@
 				height: 25,
 				items: {
 					xtype: 'label',
-					text: 'Row', //i18n
+					text: PT.i18n.row,
 					cls: 'pt-toolbar-multiselect-leftright-label'
 				}
 			},
@@ -631,7 +631,7 @@
 				height: 25,
 				items: {
 					xtype: 'label',
-					text: 'Column', //i18n
+					text: PT.i18n.column,
 					cls: 'pt-toolbar-multiselect-leftright-label'
 				}
 			},
@@ -665,7 +665,7 @@
 				height: 25,
 				items: {
 					xtype: 'label',
-					text: 'Filter', //i18n
+					text: PT.i18n.filter,
 					cls: 'pt-toolbar-multiselect-leftright-label'
 				}
 			},
@@ -715,7 +715,7 @@
 		};
 
 		window = Ext.create('Ext.window.Window', {
-			title: 'Table layout', //i18n
+			title: PT.i18n.table_layout,
 			bodyStyle: 'background-color:#fff; padding:2px',
 			closeAction: 'hide',
 			autoShow: true,
@@ -791,21 +791,21 @@
 			window;
 
 		showTotals = Ext.create('Ext.form.field.Checkbox', {
-			boxLabel: 'Show totals', //i18n
+			boxLabel: PT.i18n.show_totals,
 			style: 'margin-bottom:4px',
 			checked: true
 		});
 		pt.viewport.showTotals = showTotals;
 
 		showSubTotals = Ext.create('Ext.form.field.Checkbox', {
-			boxLabel: 'Show sub-totals', //i18n
+			boxLabel: PT.i18n.show_subtotals,
 			style: 'margin-bottom:4px',
 			checked: true
 		});
 		pt.viewport.showSubTotals = showSubTotals;
 
 		hideEmptyRows = Ext.create('Ext.form.field.Checkbox', {
-			boxLabel: 'Hide empty rows', //i18n
+			boxLabel: PT.i18n.hide_empty_rows,
 			style: 'margin-bottom:4px'
 		});
 		pt.viewport.hideEmptyRows = hideEmptyRows;
@@ -815,7 +815,7 @@
 			style: 'margin-bottom:3px',
 			width: 250,
 			labelWidth: 130,
-			fieldLabel: 'Display density', //i18n
+			fieldLabel: PT.i18n.display_density,
 			labelStyle: 'color:#333',
 			queryMode: 'local',
 			valueField: 'id',
@@ -837,7 +837,7 @@
 			style: 'margin-bottom:3px',
 			width: 250,
 			labelWidth: 130,
-			fieldLabel: 'Font size', //i18n
+			fieldLabel: PT.i18n.font_size,
 			labelStyle: 'color:#333',
 			queryMode: 'local',
 			valueField: 'id',
@@ -860,7 +860,7 @@
 			style: 'margin-bottom:3px',
 			width: 250,
 			labelWidth: 130,
-			fieldLabel: 'Digit group separator', //i18n
+			fieldLabel: PT.i18n.digit_group_separator,
 			queryMode: 'local',
 			valueField: 'id',
 			editable: false,
@@ -877,19 +877,19 @@
 		pt.viewport.digitGroupSeparator = digitGroupSeparator;
 
 		reportingPeriod = Ext.create('Ext.form.field.Checkbox', {
-			boxLabel: 'Reporting period', //i18n
+			boxLabel: PT.i18n.reporting_period,
 			style: 'margin-bottom:4px',
 		});
 		pt.viewport.reportingPeriod = reportingPeriod;
 
 		organisationUnit = Ext.create('Ext.form.field.Checkbox', {
-			boxLabel: 'Organisation unit', //i18n
+			boxLabel: PT.i18n.organisation_unit,
 			style: 'margin-bottom:4px',
 		});
 		pt.viewport.organisationUnit = organisationUnit;
 
 		parentOrganisationUnit = Ext.create('Ext.form.field.Checkbox', {
-			boxLabel: 'Parent organisation unit', //i18n
+			boxLabel: PT.i18n.parent_organisation_unit,
 			style: 'margin-bottom:4px',
 		});
 		pt.viewport.parentOrganisationUnit = parentOrganisationUnit;
@@ -925,7 +925,7 @@
 		};
 
 		window = Ext.create('Ext.window.Window', {
-			title: 'Table options', //i18n
+			title: PT.i18n.table_options,
 			bodyStyle: 'background-color:#fff; padding:8px 8px 8px',
 			closeAction: 'hide',
 			autoShow: true,
@@ -1191,7 +1191,7 @@
 			});
 
 			createButton = Ext.create('Ext.button.Button', {
-				text: 'Create', //i18n
+				text: PT.i18n.create,
 				handler: function() {
 					var favorite = getBody();
 					favorite.name = nameTextfield.getValue	();
@@ -1223,7 +1223,7 @@
 			});
 
 			updateButton = Ext.create('Ext.button.Button', {
-				text: 'Update', //i18n
+				text: PT.i18n.update,
 				handler: function() {
 					var name = nameTextfield.getValue(),
 						reportTable;
@@ -1261,7 +1261,7 @@
 			});
 
 			cancelButton = Ext.create('Ext.button.Button', {
-				text: 'Cancel', //i18n
+				text: PT.i18n.cancel,
 				handler: function() {
 					window.destroy();
 				}
@@ -1300,7 +1300,7 @@
 		};
 
 		addButton = Ext.create('Ext.button.Button', {
-			text: 'Add new', //i18n
+			text: PT.i18n.add_new,
 			width: 67,
 			height: 26,
 			style: 'border-radius: 1px;',
@@ -1316,7 +1316,7 @@
 			width: windowCmpWidth - addButton.width - 11,
 			height: 26,
 			fieldStyle: 'padding-right: 0; padding-left: 6px; border-radius: 1px; border-color: #bbb; font-size:11px',
-			emptyText: 'Search for favorites', //i18n
+			emptyText: PT.i18n.search_for_favorites,
 			enableKeyEvents: true,
 			currentValue: '',
 			listeners: {
@@ -1336,7 +1336,7 @@
 		});
 
 		prevButton = Ext.create('Ext.button.Button', {
-			text: 'Prev', //i18n
+			text: PT.i18n.prev,
 			handler: function() {
 				var value = searchTextfield.getValue(),
 					url = value ? pt.baseUrl + '/api/reportTables/query/' + value + '.json?links=false' : null,
@@ -1348,7 +1348,7 @@
 		});
 
 		nextButton = Ext.create('Ext.button.Button', {
-			text: 'Next', //i18n
+			text: PT.i18n.next,
 			handler: function() {
 				var value = searchTextfield.getValue(),
 					url = value ? pt.baseUrl + '/api/reportTables/query/' + value + '.json?links=false' : null,
@@ -1445,7 +1445,7 @@
 										}
 									}
 									else {
-										alert('Please create a table first'); //i18n
+										alert(PT.i18n.please_create_a_table_first);
 									}
 								}
 							}
@@ -1542,7 +1542,7 @@
 							var el = editArray[i];
 							Ext.create('Ext.tip.ToolTip', {
 								target: el,
-								html: 'Rename', //i18n
+								html: PT.i18n.rename,
 								'anchor': 'bottom',
 								anchorOffset: -14,
 								showDelay: 1000
@@ -1553,7 +1553,7 @@
 							el = overwriteArray[i];
 							Ext.create('Ext.tip.ToolTip', {
 								target: el,
-								html: 'Overwrite', //i18n
+								html: PT.i18n.overwrite,
 								'anchor': 'bottom',
 								anchorOffset: -14,
 								showDelay: 1000
@@ -1564,7 +1564,7 @@
 							el = sharingArray[i];
 							Ext.create('Ext.tip.ToolTip', {
 								target: el,
-								html: 'Share with other people', //i18n
+								html: PT.i18n.share_with_other_people,
 								'anchor': 'bottom',
 								anchorOffset: -14,
 								showDelay: 1000
@@ -1575,7 +1575,7 @@
 							el = deleteArray[i];
 							Ext.create('Ext.tip.ToolTip', {
 								target: el,
-								html: 'Delete', //i18n
+								html: PT.i18n.delete_,
 								'anchor': 'bottom',
 								anchorOffset: -14,
 								showDelay: 1000
@@ -1664,12 +1664,12 @@
 
 			getData = function() {
 				var data = [
-					{id: 'r-------', name: 'Can view'}, //i18n
-					{id: 'rw------', name: 'Can edit and view'}
+					{id: 'r-------', name: PT.i18n.can_view},
+					{id: 'rw------', name: PT.i18n.can_edit_and_view}
 				];
 
 				if (isPublicAccess) {
-					data.unshift({id: '-------', name: 'None'});
+					data.unshift({id: '-------', name: PT.i18n.none});
 				}
 
 				return data;
@@ -1684,7 +1684,7 @@
 				var items = [];
 
 				combo = Ext.create('Ext.form.field.ComboBox', {
-					fieldLabel: isPublicAccess ? 'Public access' : obj.name, //i18n
+					fieldLabel: isPublicAccess ? PT.i18n.public_access : obj.name,
 					labelStyle: 'color:#333',
 					cls: 'pt-combo',
 					width: 380,
@@ -1780,7 +1780,7 @@
 		userGroupField = Ext.create('Ext.form.field.ComboBox', {
 			valueField: 'id',
 			displayField: 'name',
-			emptyText: 'Search for user groups', //i18n
+			emptyText: PT.i18n.search_for_user_groups,
 			queryParam: 'key',
 			queryDelay: 200,
 			minChars: 1,
@@ -1949,7 +1949,7 @@
 				tbar: [
 					{
 						xtype: 'label',
-						text: 'Available', //i18n pt.i18n.available
+						text: PT.i18n.available,
 						cls: 'pt-toolbar-multiselect-left-label'
 					},
 					'->',
@@ -2006,7 +2006,7 @@
 					'->',
 					{
 						xtype: 'label',
-						text: 'Selected', //i18n pt.i18n.selected,
+						text: PT.i18n.selected,
 						cls: 'pt-toolbar-multiselect-right-label'
 					}
 				],
@@ -2021,7 +2021,7 @@
 
 			indicator = {
 				xtype: 'panel',
-				title: '<div class="pt-panel-title-data">Indicators</div>', //i18n
+				title: '<div class="pt-panel-title-data">' + PT.i18n.indicators + '</div>',
 				hideCollapseTool: true,
 				getData: function() {
 					var data = {
@@ -2071,7 +2071,7 @@
 								load: function(s) {
 									s.add({
 										id: 0,
-										name: 'All indicator groups', //i18n pt.i18n.all_indicator_groups
+										name: PT.i18n.all_indicator_groups,
 										index: -1
 									});
 									s.sort([
@@ -2138,7 +2138,7 @@
 				tbar: [
 					{
 						xtype: 'label',
-						text: 'Available', //i18n pt.i18n.available
+						text: PT.i18n.available,
 						cls: 'pt-toolbar-multiselect-left-label'
 					},
 					'->',
@@ -2195,7 +2195,7 @@
 					'->',
 					{
 						xtype: 'label',
-						text: 'Selected', //i18n pt.i18n.selected,
+						text: PT.i18n.selected,
 						cls: 'pt-toolbar-multiselect-right-label'
 					}
 				],
@@ -2210,7 +2210,7 @@
 
 			dataElement = {
 				xtype: 'panel',
-				title: '<div class="pt-panel-title-data">Data elements</div>', //i18n
+				title: '<div class="pt-panel-title-data">' + PT.i18n.data_elements + '</div>',
 				hideCollapseTool: true,
 				getData: function() {
 					var data = {
@@ -2260,7 +2260,7 @@
 								load: function(s) {
 									s.add({
 										id: 0,
-										name: 'All data element groups', //i18n pt.i18n.all_indicator_groups
+										name: PT.i18n.all_data_element_groups,
 										index: -1
 									});
 									s.sort([
@@ -2327,7 +2327,7 @@
 				tbar: [
 					{
 						xtype: 'label',
-						text: 'Available', //i18n pt.i18n.available
+						text: PT.i18n.available,
 						cls: 'pt-toolbar-multiselect-left-label'
 					},
 					'->',
@@ -2384,7 +2384,7 @@
 					'->',
 					{
 						xtype: 'label',
-						text: 'Selected', //i18n pt.i18n.selected,
+						text: PT.i18n.selected,
 						cls: 'pt-toolbar-multiselect-right-label'
 					}
 				],
@@ -2399,7 +2399,7 @@
 
 			dataSet = {
 				xtype: 'panel',
-				title: '<div class="pt-panel-title-data">Reporting rates</div>', //i18n
+				title: '<div class="pt-panel-title-data">' + PT.i18n.reporting_rates + '</div>',
 				hideCollapseTool: true,
 				getData: function() {
 					var data = {
@@ -2491,23 +2491,23 @@
 								items: [
 									{
 										xtype: 'label',
-										text: 'Weeks', //i18n pt.i18n.months,
+										text: PT.i18n.weeks,
 										cls: 'pt-label-period-heading'
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_WEEK',
-										boxLabel: 'Last week', //i18n pt.i18n.last_month
+										boxLabel: PT.i18n.last_week
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_4_WEEKS',
-										boxLabel: 'Last 4 weeks', //i18n pt.i18n.last_3_months
+										boxLabel: PT.i18n.last_4_weeks
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_12_WEEKS',
-										boxLabel: 'Last 12 weeks' //i18n pt.i18n.last_12_months,
+										boxLabel: PT.i18n.last_12_weeks
 									}
 								]
 							},
@@ -2533,23 +2533,23 @@
 								items: [
 									{
 										xtype: 'label',
-										text: 'Months', //i18n pt.i18n.months,
+										text: PT.i18n.months,
 										cls: 'pt-label-period-heading'
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_MONTH',
-										boxLabel: 'Last month', //i18n pt.i18n.last_month
+										boxLabel: PT.i18n.last_month
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_3_MONTHS',
-										boxLabel: 'Last 3 months', //i18n pt.i18n.last_3_months
+										boxLabel: PT.i18n.last_3_months
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_12_MONTHS',
-										boxLabel: 'Last 12 months', //i18n pt.i18n.last_12_months,
+										boxLabel: PT.i18n.last_12_months,
 										checked: true
 									}
 								]
@@ -2576,18 +2576,18 @@
 								items: [
 									{
 										xtype: 'label',
-										text: 'Bi-months', //i18n
+										text: PT.i18n.bimonths,
 										cls: 'pt-label-period-heading'
 									},
 									{
 										xtype: 'checkbox',
-										relativePeriodId: 'LAST_BIMONTH',
-										boxLabel: 'Last bi-month', //i18n
+										relativePeriodId: PT.i18n.last_bimonth,
+										boxLabel: PT.i18n.last_bimonth
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_6_BIMONTHS',
-										boxLabel: 'Last 6 bi-months' //i18n
+										boxLabel: PT.i18n.last_6_bimonths
 									}
 								]
 							}
@@ -2620,18 +2620,18 @@
 								items: [
 									{
 										xtype: 'label',
-										text: 'Quarters', //i18n pt.i18n.quarters,
+										text: PT.i18n.quarters,
 										cls: 'pt-label-period-heading'
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_QUARTER',
-										boxLabel: 'Last quarter', //i18n pt.i18n.last_quarter
+										boxLabel: PT.i18n.last_quarter
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_4_QUARTERS',
-										boxLabel: 'Last 4 quarters' //i18n pt.i18n.last_4_quarters
+										boxLabel: PT.i18n.last_4_quarters
 									}
 								]
 							},
@@ -2657,18 +2657,18 @@
 								items: [
 									{
 										xtype: 'label',
-										text: 'Six-months', //i18n pt.i18n.six_months,
+										text: PT.i18n.sixmonths,
 										cls: 'pt-label-period-heading'
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_SIX_MONTH',
-										boxLabel: 'Last six-month', //i18n pt.i18n.last_six_month
+										boxLabel: PT.i18n.last_sixmonth
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_2_SIXMONTHS',
-										boxLabel: 'Last 2 six-months' //i18n pt.i18n.last_two_six_month
+										boxLabel: PT.i18n.last_2_sixmonths
 									}
 								]
 							},
@@ -2694,18 +2694,18 @@
 								items: [
 									{
 										xtype: 'label',
-										text: 'Financial years',
+										text: PT.i18n.financial_years,
 										cls: 'pt-label-period-heading'
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_FINANCIAL_YEAR',
-										boxLabel: 'Last financial year',
+										boxLabel: PT.i18n.last_financial_year
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_5_FINANCIAL_YEARS',
-										boxLabel: 'Last 5 financial years'
+										boxLabel: PT.i18n.last_5_financial_years
 									}
 								]
 							}
@@ -2756,23 +2756,23 @@
 								items: [
 									{
 										xtype: 'label',
-										text: 'Years', //i18n pt.i18n.years,
+										text: PT.i18n.years,
 										cls: 'pt-label-period-heading'
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'THIS_YEAR',
-										boxLabel: 'This year', //i18n pt.i18n.this_year
+										boxLabel: PT.i18n.this_year
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_YEAR',
-										boxLabel: 'Last year', //i18n pt.i18n.last_year
+										boxLabel: PT.i18n.last_year
 									},
 									{
 										xtype: 'checkbox',
 										relativePeriodId: 'LAST_5_YEARS',
-										boxLabel: 'Last 5 years' //i18n pt.i18n.last_5_years
+										boxLabel: PT.i18n.last_5_years
 									}
 								]
 							}
@@ -2791,7 +2791,7 @@
 				tbar: [
 					{
 						xtype: 'label',
-						text: 'Available', //i18n pt.i18n.available,
+						text: PT.i18n.available,
 						cls: 'pt-toolbar-multiselect-left-label'
 					},
 					'->',
@@ -2851,7 +2851,7 @@
 					'->',
 					{
 						xtype: 'label',
-						text: 'Selected', //i18n pt.i18n.selected,
+						text: PT.i18n.selected,
 						cls: 'pt-toolbar-multiselect-right-label'
 					}
 				],
@@ -2936,7 +2936,7 @@
 							},
 							{
 								xtype: 'button',
-								text: 'Prev year', //i18n
+								text: PT.i18n.prev_year,
 								style: 'margin-left:2px; border-radius:2px',
 								height: 24,
 								handler: function() {
@@ -2949,7 +2949,7 @@
 							},
 							{
 								xtype: 'button',
-								text: 'Next year', //i18n
+								text: PT.i18n.next_year,
 								style: 'margin-left:2px; border-radius:2px',
 								height: 24,
 								handler: function() {
@@ -3120,7 +3120,7 @@
 						if (!r.data.leaf) {
 							v.menu.add({
 								id: 'treepanel-contextmenu-item',
-								text: 'Select all children', //i18n pt.i18n.select_all_children,
+								text: PT.i18n.select_all_children,
 								icon: 'images/node-select-child.png',
 								handler: function() {
 									r.expand(false, function() {
@@ -3141,7 +3141,7 @@
 
 			userOrganisationUnit = Ext.create('Ext.form.field.Checkbox', {
 				columnWidth: 0.5,
-				boxLabel: 'User organisation unit', //i18n pt.i18n.user_orgunit,
+				boxLabel: PT.i18n.user_organisation_unit,
 				labelWidth: pt.conf.layout.form_label_width,
 				handler: function(chb, checked) {
 					treePanel.xable(checked, userOrganisationUnitChildren.getValue());
@@ -3150,7 +3150,7 @@
 
 			userOrganisationUnitChildren = Ext.create('Ext.form.field.Checkbox', {
 				columnWidth: 0.5,
-				boxLabel: 'User organisation unit children', //i18n pt.i18n.user_orgunit_children,
+				boxLabel: PT.i18n.user_organisation_unit_children,
 				labelWidth: pt.conf.layout.form_label_width,
 				handler: function(chb, checked) {
 					treePanel.xable(checked, userOrganisationUnit.getValue());
@@ -3159,7 +3159,7 @@
 
 			organisationUnit = {
 				xtype: 'panel',
-				title: '<div class="pt-panel-title-organisationunit">Organisation units</div>', //i18n pt.i18n.organisation_units
+				title: '<div class="pt-panel-title-organisationunit">' + PT.i18n.organisation_units + '</div>',
 				bodyStyle: 'padding-top:5px',
 				hideCollapseTool: true,
 				collapsed: false,
@@ -3265,7 +3265,7 @@
 							tbar: [
 								{
 									xtype: 'label',
-									text: 'Available', //i18n pt.i18n.available
+									text: PT.i18n.available,
 									cls: 'pt-toolbar-multiselect-left-label'
 								},
 								'->',
@@ -3324,7 +3324,7 @@
 								'->',
 								{
 									xtype: 'label',
-									text: 'Selected', //i18n pt.i18n.selected,
+									text: PT.i18n.selected,
 									cls: 'pt-toolbar-multiselect-right-label'
 								}
 							],
@@ -3353,7 +3353,7 @@
 
 					panel = {
 						xtype: 'panel',
-						title: '<div class="' + iconCls + '">' + groupSet.name + '</div>', //i18n
+						title: '<div class="' + iconCls + '">' + groupSet.name + '</div>',
 						hideCollapseTool: true,
 						getData: function() {
 							var data = {
@@ -3440,7 +3440,7 @@
 				if (layout.filter && pt.store.indicatorSelected.data.length) {
 					for (var i = 0; i < layout.filter.length; i++) {
 						if (layout.filter[i].dimensionName === dimConf.data.dimensionName) {
-							alert('Indicators cannot be specified as filter'); //i18n
+							alert(PT.i18n.indicators_cannot_be_specified_as_filter);
 							return;
 						}
 					}
@@ -3448,7 +3448,7 @@
 
 				// Categories as filter
 				if (layout.filter && pt.viewport.layoutWindow.filterStore.getById(dimConf.category.dimensionName)) {
-					alert('Categories cannot be specified as filter');
+					alert(PT.i18n.categories_cannot_be_specified_as_filter);
 					return;
 				}
 
@@ -3456,7 +3456,7 @@
 				if (Ext.Array.contains(dimensionNames, dimConf.data.dimensionName) && pt.store.dataSetSelected.data.length) {
 					for (var i = 0; i < pt.init.degs.length; i++) {
 						if (Ext.Array.contains(dimensionNames, pt.init.degs[i].id)) {
-							alert('Data element group sets cannot be specified together with data sets');
+							alert(PT.i18n.data_element_group_sets_cannot_be_specified_together_with_data_sets);
 							return;
 						}
 					}
@@ -3667,19 +3667,19 @@
 						downloadButton,
                         '->',
 						{
-							text: 'Table', //i18n
+							text: PT.i18n.table,
                             toggleGroup: 'module',
 							pressed: true
 						},
 						{
-							text: 'Chart', //i18n
+							text: PT.i18n.chart,
                             toggleGroup: 'module',
 							handler: function(b) {
                                 window.location.href = '../../dhis-web-visualizer/app/index.html';
 							}
 						},
 						{
-							text: 'Map', //i18n
+							text: PT.i18n.map,
                             toggleGroup: 'module',
 							handler: function(b) {
                                 window.location.href = '../../dhis-web-mapping/app/index.html';
@@ -3692,7 +3692,7 @@
 						},
                         {
                             xtype: 'button',
-                            text: 'Home',
+                            text: PT.i18n.home,
                             handler: function() {
                                 window.location.href = '../../dhis-web-commons-about/redirect.action';
                             }

=== modified file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js	2013-04-15 20:44:56 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/app/scripts/core.js	2013-04-17 11:52:56 +0000
@@ -1,5 +1,3 @@
-PT = {};
-
 PT.core = {};
 
 Ext.onReady( function() {
@@ -43,7 +41,7 @@
         dimension: {
             data: {
                 value: 'data',
-                name: 'Data', //i18n PT.i18n.data,
+                name: PT.i18n.data,
                 dimensionName: 'dx',
                 objectName: 'dx',
                 warning: {
@@ -51,31 +49,31 @@
 				}
             },
             category: {
-				name: 'Categories',
+				name: PT.i18n.categories,
 				dimensionName: 'co',
                 objectName: 'co',
 			},
             indicator: {
                 value: 'indicators',
-                name: 'Indicators', //i18n PT.i18n.indicator,
+                name: PT.i18n.indicators,
                 dimensionName: 'dx',
                 objectName: 'in'
             },
             dataElement: {
                 value: 'dataElements',
-                name: 'Data elements', //i18n PT.i18n.data_element,
+                name: PT.i18n.data_elements,
                 dimensionName: 'dx',
                 objectName: 'de'
             },
             dataSet: {
 				value: 'dataSets',
-                name: 'Data sets', //i18n PT.i18n.dataset,
+                name: PT.i18n.data_sets,
                 dimensionName: 'dx',
                 objectName: 'ds'
 			},
             period: {
                 value: 'period',
-                name: 'Periods', //i18n PT.i18n.period,
+                name: PT.i18n.periods,
                 dimensionName: 'pe',
                 objectName: 'pe',
                 warning: {
@@ -90,11 +88,9 @@
 			},
             organisationUnit: {
                 value: 'organisationUnits',
-                name: 'Organisation units', //i18n PT.i18n.organisation_unit,
+                name: PT.i18n.organisation_units,
                 dimensionName: 'ou',
                 objectName: 'ou',
-                userOrganisationUnit: 'USER_ORGUNIT',
-                userOrganisationUnitChildren: 'USER_ORGUNIT_CHILDREN',
                 warning: {
 					filter: '...'//PT.i18n.wm_multiple_filter_orgunit
 				}
@@ -1041,7 +1037,7 @@
 					if (!(config && Ext.isObject(config))) {
 						return '';
 					}
-					
+
 					cls = config.cls ? config.cls : '';
 					cls += config.hidden ? ' td-hidden' : '';
 					cls += config.collapsed ? ' td-collapsed' : '';
@@ -1779,7 +1775,7 @@
 				dimConf = pt.conf.finals.dimension;
 
 			if (!(col || row)) {
-				alert('At least one dimension must be specified as row or column'); //i18n
+				alert(PT.i18n.at_least_one_dimension_must_be_specified_as_row_or_column);
 				return;
 			}
 
@@ -1791,7 +1787,7 @@
 			}
 
 			if (!Ext.Array.contains(dimensionNames, dimConf.period.dimensionName)) {
-				alert('At least one period must be specified as column, row or filter');
+				alert(PT.i18n.at_least_one_period_must_be_specified_as_column_row_or_filter);
 				return;
 			}
 
@@ -1802,7 +1798,7 @@
 			var obj = {};
 
 			if (!(config && Ext.isObject(config))) {
-				alert('Layout config is not an object'); //i18n
+				console.log('Layout config is not an object');
 				return;
 			}
 

=== added file 'dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/i18n.vm'
--- dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/i18n.vm	1970-01-01 00:00:00 +0000
+++ dhis-2/dhis-web/dhis-web-pivot/src/main/webapp/dhis-web-pivot/i18n.vm	2013-04-17 11:52:56 +0000
@@ -0,0 +1,83 @@
+PT.i18n = {
+    dimensions: '$encoder.jsEscape($i18n.getString( 'dimensions' ) , "'")',
+    row: '$encoder.jsEscape($i18n.getString( 'row' ) , "'")',
+    column: '$encoder.jsEscape($i18n.getString( 'column' ) , "'")',
+    filter: '$encoder.jsEscape($i18n.getString( 'filter' ) , "'")',
+    table_layout: '$encoder.jsEscape($i18n.getString( 'table_layout' ) , "'")',
+    show_totals: '$encoder.jsEscape($i18n.getString( 'show_totals' ) , "'")',
+    show_subtotals: '$encoder.jsEscape($i18n.getString( 'show_subtotals' ) , "'")',
+    hide_empty_rows: '$encoder.jsEscape($i18n.getString( 'hide_empty_rows' ) , "'")',
+    display_density: '$encoder.jsEscape($i18n.getString( 'display_density' ) , "'")',
+    font_size: '$encoder.jsEscape($i18n.getString( 'font_size' ) , "'")',
+    digit_group_separator: '$encoder.jsEscape($i18n.getString( 'digit_group_separator' ) , "'")',
+    reporting_period: '$encoder.jsEscape($i18n.getString( 'reporting_period' ) , "'")',
+    organisation_unit: '$encoder.jsEscape($i18n.getString( 'organisation_unit' ) , "'")',
+    organisation_units: '$encoder.jsEscape($i18n.getString( 'organisation_units' ) , "'")',
+    parent_organisation_unit: '$encoder.jsEscape($i18n.getString( 'parent_organisation_unit' ) , "'")',
+    user_organisation_unit: '$encoder.jsEscape($i18n.getString( 'user_organisation_unit' ) , "'")',
+    user_organisation_unit_children: '$encoder.jsEscape($i18n.getString( 'user_organisation_unit_children' ) , "'")',
+    table_options: '$encoder.jsEscape($i18n.getString( 'table_options' ) , "'")',
+    create: '$encoder.jsEscape($i18n.getString( 'create' ) , "'")',
+    update: '$encoder.jsEscape($i18n.getString( 'update' ) , "'")',
+    cancel: '$encoder.jsEscape($i18n.getString( 'cancel' ) , "'")',
+    delete_: '$encoder.jsEscape($i18n.getString( 'del' ) , "'")',
+    add_new: '$encoder.jsEscape($i18n.getString( 'add_new' ) , "'")',
+    search_for_favorites: '$encoder.jsEscape($i18n.getString( 'search_for_favorites' ) , "'")',
+    prev: '$encoder.jsEscape($i18n.getString( 'prev' ) , "'")',
+    next: '$encoder.jsEscape($i18n.getString( 'next' ) , "'")',
+    rename: '$encoder.jsEscape($i18n.getString( 'rename' ) , "'")',
+    overwrite: '$encoder.jsEscape($i18n.getString( 'overwrite' ) , "'")',
+    share_with_other_people: '$encoder.jsEscape($i18n.getString( 'share_with_other_people' ) , "'")',
+    can_view: '$encoder.jsEscape($i18n.getString( 'can_view' ) , "'")',
+    can_edit_and_view: '$encoder.jsEscape($i18n.getString( 'can_edit_and_view' ) , "'")',
+    none: '$encoder.jsEscape($i18n.getString( 'none' ) , "'")',
+    public_access: '$encoder.jsEscape($i18n.getString( 'public_access' ) , "'")',
+    search_for_user_groups: '$encoder.jsEscape($i18n.getString( 'search_for_user_groups' ) , "'")',
+    available: '$encoder.jsEscape($i18n.getString( 'available' ) , "'")',
+    selected: '$encoder.jsEscape($i18n.getString( 'selected' ) , "'")',
+    indicators: '$encoder.jsEscape($i18n.getString( 'indicators' ) , "'")',
+    all_indicator_groups: '$encoder.jsEscape($i18n.getString( 'all_indicator_groups' ) , "'")',
+    data_elements: '$encoder.jsEscape($i18n.getString( 'data_elements' ) , "'")',
+    all_data_element_groups: '$encoder.jsEscape($i18n.getString( 'all_data_element_groups' ) , "'")',
+    data_sets: '$encoder.jsEscape($i18n.getString( 'data_sets' ) , "'")',
+    reporting_rates: '$encoder.jsEscape($i18n.getString( 'reporting_rates' ) , "'")',
+    periods: '$encoder.jsEscape($i18n.getString( 'periods' ) , "'")',
+    weeks: '$encoder.jsEscape($i18n.getString( 'weeks' ) , "'")',
+    last_week: '$encoder.jsEscape($i18n.getString( 'last_week' ) , "'")',
+    last_4_weeks: '$encoder.jsEscape($i18n.getString( 'last_4_weeks' ) , "'")',
+    last_12_weeks: '$encoder.jsEscape($i18n.getString( 'last_12_weeks' ) , "'")',
+    months: '$encoder.jsEscape($i18n.getString( 'months' ) , "'")',
+    last_month: '$encoder.jsEscape($i18n.getString( 'last_month' ) , "'")',
+    last_3_months: '$encoder.jsEscape($i18n.getString( 'last_3_months' ) , "'")',
+    last_12_months: '$encoder.jsEscape($i18n.getString( 'last_12_months' ) , "'")',
+    bimonths: '$encoder.jsEscape($i18n.getString( 'bimonths' ) , "'")',
+    last_bimonth: '$encoder.jsEscape($i18n.getString( 'last_bimonth' ) , "'")',
+    last_6_bimonths: '$encoder.jsEscape($i18n.getString( 'last_6_bimonths' ) , "'")',
+    quarters: '$encoder.jsEscape($i18n.getString( 'quarters' ) , "'")',
+    last_quarter: '$encoder.jsEscape($i18n.getString( 'last_quarter' ) , "'")',
+    last_4_quarters: '$encoder.jsEscape($i18n.getString( 'last_4_quarters' ) , "'")',
+    sixmonths: '$encoder.jsEscape($i18n.getString( 'sixmonths' ) , "'")',
+    last_sixmonth: '$encoder.jsEscape($i18n.getString( 'last_sixmonth' ) , "'")',
+    last_2_sixmonths: '$encoder.jsEscape($i18n.getString( 'last_2_sixmonths' ) , "'")',
+    years: '$encoder.jsEscape($i18n.getString( 'years' ) , "'")',
+    this_year: '$encoder.jsEscape($i18n.getString( 'this_year' ) , "'")',
+    last_year: '$encoder.jsEscape($i18n.getString( 'last_year' ) , "'")',
+    last_5_years: '$encoder.jsEscape($i18n.getString( 'last_5_years' ) , "'")',
+    financial_years: '$encoder.jsEscape($i18n.getString( 'financial_years' ) , "'")',
+    last_financial_year: '$encoder.jsEscape($i18n.getString( 'last_financial_year' ) , "'")',
+    last_5_financial_years: '$encoder.jsEscape($i18n.getString( 'last_5_financial_years' ) , "'")',
+    prev_year: '$encoder.jsEscape($i18n.getString( 'prev_year' ) , "'")',
+    next_year: '$encoder.jsEscape($i18n.getString( 'next_year' ) , "'")',
+    select_all_children: '$encoder.jsEscape($i18n.getString( 'select_all_children' ) , "'")',
+    table: '$encoder.jsEscape($i18n.getString( 'table' ) , "'")',
+    chart: '$encoder.jsEscape($i18n.getString( 'chart' ) , "'")',
+    map: '$encoder.jsEscape($i18n.getString( 'map' ) , "'")',
+    home: '$encoder.jsEscape($i18n.getString( 'home' ) , "'")',
+    categories: '$encoder.jsEscape($i18n.getString( 'categories' ) , "'")',
+    please_create_a_table_first: '$encoder.jsEscape($i18n.getString( 'please_create_a_table_first' ) , "'")',
+    indicators_cannot_be_specified_as_filter: '$encoder.jsEscape($i18n.getString( 'indicators_cannot_be_specified_as_filter' ) , "'")',
+    categories_cannot_be_specified_as_filter: '$encoder.jsEscape($i18n.getString( 'categories_cannot_be_specified_as_filter' ) , "'")',
+    data_element_group_sets_cannot_be_specified_together_with_data_sets: '$encoder.jsEscape($i18n.getString( 'data_element_group_sets_cannot_be_specified_together_with_data_sets' ) , "'")',
+    at_least_one_dimension_must_be_specified_as_row_or_column: '$encoder.jsEscape($i18n.getString( 'at_least_one_dimension_must_be_specified_as_row_or_column' ) , "'")',
+    at_least_one_period_must_be_specified_as_column_row_or_filter: '$encoder.jsEscape($i18n.getString( 'at_least_one_period_must_be_specified_as_column_row_or_filter' ) , "'")'
+};