From 0fcab30652f1b41104f1bc27c151ca34d2159583 Mon Sep 17 00:00:00 2001 From: Maxime Beauchemin Date: Mon, 23 May 2016 11:46:33 -0700 Subject: [PATCH] More translation instrumentation and some french to test (#502) --- babel/messages.pot | 388 ++++++++++++++-- caravel/assets/images/druid_agg.png | Bin 0 -> 104052 bytes .../translations/es/LC_MESSAGES/messages.mo | Bin 0 -> 5877 bytes .../translations/es/LC_MESSAGES/messages.po | 388 +++++++++++++++- .../translations/fr/LC_MESSAGES/messages.mo | Bin 2457 -> 5950 bytes .../translations/fr/LC_MESSAGES/messages.po | 396 +++++++++++++++-- .../translations/it/LC_MESSAGES/messages.mo | Bin 2553 -> 5975 bytes .../translations/it/LC_MESSAGES/messages.po | 418 ++++++++++++++++-- .../translations/zh/LC_MESSAGES/messages.mo | Bin 2392 -> 5798 bytes .../translations/zh/LC_MESSAGES/messages.po | 397 +++++++++++++++-- caravel/views.py | 137 +++++- caravel/viz.py | 51 +-- setup.py | 2 +- 13 files changed, 2000 insertions(+), 177 deletions(-) create mode 100644 caravel/assets/images/druid_agg.png create mode 100644 caravel/translations/es/LC_MESSAGES/messages.mo diff --git a/babel/messages.pot b/babel/messages.pot index 66280dee0..d5c7a1be7 100644 --- a/babel/messages.pot +++ b/babel/messages.pot @@ -1,14 +1,14 @@ -# Translations template for Caravel. +# Translations template for PROJECT. # Copyright (C) 2016 ORGANIZATION -# This file is distributed under the same license as the Caravel project. -# Maxime Beauchemin , 2016. +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR , 2016. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-05-02 00:21-0700\n" +"POT-Creation-Date: 2016-05-20 20:30-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,87 +17,423 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: caravel/models.py:564 +#: caravel/models.py:607 msgid "" "Datetime column not provided as part table configuration and is required " "by this type of chart" msgstr "" -#: caravel/models.py:1153 +#: caravel/models.py:1243 msgid "No data was returned." msgstr "" -#: caravel/views.py:116 +#: caravel/views.py:124 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" msgstr "" -#: caravel/views.py:215 +#: caravel/views.py:133 caravel/views.py:161 +msgid "Column" +msgstr "" + +#: caravel/views.py:134 caravel/views.py:194 caravel/views.py:223 +msgid "Verbose Name" +msgstr "" + +#: caravel/views.py:135 caravel/views.py:193 caravel/views.py:222 +#: caravel/views.py:400 caravel/views.py:535 +msgid "Description" +msgstr "" + +#: caravel/views.py:136 caravel/views.py:164 +msgid "Groupable" +msgstr "" + +#: caravel/views.py:137 caravel/views.py:165 +msgid "Filterable" +msgstr "" + +#: caravel/views.py:138 caravel/views.py:197 caravel/views.py:308 +#: caravel/views.py:406 +msgid "Table" +msgstr "" + +#: caravel/views.py:139 caravel/views.py:166 +msgid "Count Distinct" +msgstr "" + +#: caravel/views.py:140 caravel/views.py:167 +msgid "Sum" +msgstr "" + +#: caravel/views.py:141 caravel/views.py:168 +msgid "Min" +msgstr "" + +#: caravel/views.py:142 caravel/views.py:169 +msgid "Max" +msgstr "" + +#: caravel/views.py:143 +msgid "Expression" +msgstr "" + +#: caravel/views.py:144 +msgid "Is temporal" +msgstr "" + +#: caravel/views.py:162 caravel/views.py:195 caravel/views.py:224 +#: caravel/views.py:424 +msgid "Type" +msgstr "" + +#: caravel/views.py:163 caravel/views.py:399 +msgid "Datasource" +msgstr "" + +#: caravel/views.py:192 caravel/views.py:221 +msgid "Metric" +msgstr "" + +#: caravel/views.py:196 +msgid "SQL Expression" +msgstr "" + +#: caravel/views.py:225 caravel/views.py:503 +msgid "JSON" +msgstr "" + +#: caravel/views.py:226 +msgid "Druid Datasource" +msgstr "" + +#: caravel/views.py:257 caravel/views.py:310 +msgid "Database" +msgstr "" + +#: caravel/views.py:258 +msgid "SQL link" +msgstr "" + +#: caravel/views.py:259 caravel/views.py:397 caravel/views.py:459 +msgid "Creator" +msgstr "" + +#: caravel/views.py:260 caravel/views.py:311 +msgid "Last Changed" +msgstr "" + +#: caravel/views.py:261 +msgid "SQLAlchemy URI" +msgstr "" + +#: caravel/views.py:262 caravel/views.py:317 caravel/views.py:396 +#: caravel/views.py:541 +msgid "Cache Timeout" +msgstr "" + +#: caravel/views.py:263 +msgid "Extra" +msgstr "" + +#: caravel/views.py:279 msgid "Databases" msgstr "" -#: caravel/views.py:217 caravel/views.py:261 caravel/views.py:284 +#: caravel/views.py:281 caravel/views.py:337 caravel/views.py:369 msgid "Sources" msgstr "" -#: caravel/views.py:260 -msgid "Tables" +#: caravel/views.py:309 +msgid "Changed By" msgstr "" -#: caravel/views.py:282 -msgid "Druid Clusters" +#: caravel/views.py:312 +msgid "SQL Editor" msgstr "" -#: caravel/views.py:313 -msgid "Slices" +#: caravel/views.py:313 caravel/views.py:537 +msgid "Is Featured" msgstr "" -#: caravel/views.py:341 +#: caravel/views.py:314 +msgid "Schema" +msgstr "" + +#: caravel/views.py:315 caravel/views.py:539 +msgid "Default Endpoint" +msgstr "" + +#: caravel/views.py:316 +msgid "Offset" +msgstr "" + +#: caravel/views.py:354 caravel/views.py:534 +msgid "Cluster" +msgstr "" + +#: caravel/views.py:355 +msgid "Coordinator Host" +msgstr "" + +#: caravel/views.py:356 +msgid "Coordinator Port" +msgstr "" + +#: caravel/views.py:357 +msgid "Coordinator Endpoint" +msgstr "" + +#: caravel/views.py:358 +msgid "Broker Host" +msgstr "" + +#: caravel/views.py:359 +msgid "Borker Port" +msgstr "" + +#: caravel/views.py:360 +msgid "Broker Endpoint" +msgstr "" + +#: caravel/views.py:398 caravel/views.py:479 +msgid "Dashboards" +msgstr "" + +#: caravel/views.py:401 +msgid "Last Modified" +msgstr "" + +#: caravel/views.py:402 caravel/views.py:458 +msgid "Owners" +msgstr "" + +#: caravel/views.py:403 +msgid "Parameters" +msgstr "" + +#: caravel/views.py:404 caravel/views.py:425 +msgid "Slice" +msgstr "" + +#: caravel/views.py:405 +msgid "Name" +msgstr "" + +#: caravel/views.py:407 caravel/views.py:426 +msgid "Visualization Type" +msgstr "" + +#: caravel/views.py:441 msgid "" "This json object describes the positioning of the widgets in the " "dashboard. It is dynamically generated when adjusting the widgets size " "and positions by using drag & drop in the dashboard view" msgstr "" -#: caravel/views.py:346 +#: caravel/views.py:446 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: caravel/views.py:367 -msgid "Dashboards" +#: caravel/views.py:450 +msgid "To get a readable URL for your dashboard" msgstr "" -#: caravel/views.py:392 +#: caravel/views.py:454 +msgid "Dashboard" +msgstr "" + +#: caravel/views.py:455 +msgid "Title" +msgstr "" + +#: caravel/views.py:456 +msgid "Slug" +msgstr "" + +#: caravel/views.py:457 +msgid "Slices" +msgstr "" + +#: caravel/views.py:460 +msgid "Modified" +msgstr "" + +#: caravel/views.py:461 +msgid "Position JSON" +msgstr "" + +#: caravel/views.py:462 +msgid "CSS" +msgstr "" + +#: caravel/views.py:463 +msgid "JSON Metadata" +msgstr "" + +#: caravel/views.py:500 +msgid "User" +msgstr "" + +#: caravel/views.py:501 +msgid "Action" +msgstr "" + +#: caravel/views.py:502 +msgid "dttm" +msgstr "" + +#: caravel/views.py:509 msgid "Action Log" msgstr "" -#: caravel/views.py:393 +#: caravel/views.py:510 msgid "Security" msgstr "" -#: caravel/views.py:430 +#: caravel/views.py:527 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: caravel/views.py:533 +msgid "Data Source" +msgstr "" + +#: caravel/views.py:536 +msgid "Owner" +msgstr "" + +#: caravel/views.py:538 +msgid "Is Hidden" +msgstr "" + +#: caravel/views.py:540 +msgid "Time Offset" +msgstr "" + +#: caravel/views.py:555 msgid "Druid Datasources" msgstr "" -#: caravel/views.py:514 +#: caravel/views.py:639 msgid "The datasource seems to have been deleted" msgstr "" -#: caravel/views.py:522 +#: caravel/views.py:647 msgid "You don't seem to have access to this datasource" msgstr "" -#: caravel/views.py:843 +#: caravel/views.py:970 msgid "This view requires the `all_datasource_access` permission" msgstr "" -#: caravel/views.py:954 +#: caravel/views.py:1081 msgid "CSS Templates" msgstr "" +#: caravel/viz.py:324 +msgid "Table View" +msgstr "" + +#: caravel/viz.py:385 +msgid "Pivot Table" +msgstr "" + +#: caravel/viz.py:447 +msgid "Markup" +msgstr "" + +#: caravel/viz.py:475 +msgid "Word Cloud" +msgstr "" + +#: caravel/viz.py:507 +msgid "Treemap" +msgstr "" + +#: caravel/viz.py:551 +msgid "Calender Heatmap" +msgstr "" + +#: caravel/viz.py:622 +msgid "Box Plot" +msgstr "" + +#: caravel/viz.py:729 +msgid "Bubble Chart" +msgstr "" + +#: caravel/viz.py:797 +msgid "Big Number with Trendline" +msgstr "" + +#: caravel/viz.py:847 +msgid "Big Number" +msgstr "" + +#: caravel/viz.py:893 +msgid "Time Series - Line Chart" +msgstr "" + +#: caravel/viz.py:1045 +msgid "Time Series - Bar Chart" +msgstr "" + +#: caravel/viz.py:1063 +msgid "Time Series - Percent Change" +msgstr "" + +#: caravel/viz.py:1071 +msgid "Time Series - Stacked" +msgstr "" + +#: caravel/viz.py:1090 +msgid "Distribution - NVD3 - Pie Chart" +msgstr "" + +#: caravel/viz.py:1126 +msgid "Distribution - Bar Chart" +msgstr "" + +#: caravel/viz.py:1206 +msgid "Sunburst" +msgstr "" + +#: caravel/viz.py:1272 +msgid "Sankey" +msgstr "" + +#: caravel/viz.py:1336 +msgid "Directed Force Layout" +msgstr "" + +#: caravel/viz.py:1378 +msgid "World Map" +msgstr "" + +#: caravel/viz.py:1452 +msgid "Filters" +msgstr "" + +#: caravel/viz.py:1500 +msgid "iFrame" +msgstr "" + +#: caravel/viz.py:1518 +msgid "Parallel Coordinates" +msgstr "" + +#: caravel/viz.py:1554 +msgid "Heatmap" +msgstr "" + +#: caravel/viz.py:1622 +msgid "Horizon Charts" +msgstr "" + #: caravel/templates/appbuilder/navbar_right.html:34 msgid "Profile" msgstr "" diff --git a/caravel/assets/images/druid_agg.png b/caravel/assets/images/druid_agg.png new file mode 100644 index 0000000000000000000000000000000000000000..2d14e1e580a499c8b954dfe7b1a8746abca0b4fb GIT binary patch literal 104052 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

xyYkjyC<`)Fbb7x<^$$U0o)2hwZsU^z}bRP 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 literal 0 HcmV?d00001 diff --git a/caravel/translations/es/LC_MESSAGES/messages.mo b/caravel/translations/es/LC_MESSAGES/messages.mo new file mode 100644 index 0000000000000000000000000000000000000000..96bca730b584261edae8f417b2db8c849f0506a3 GIT binary patch literal 5877 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\n" "Language: es\n" @@ -18,87 +18,423 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: caravel/models.py:564 +#: caravel/models.py:607 msgid "" "Datetime column not provided as part table configuration and is required " "by this type of chart" msgstr "" -#: caravel/models.py:1153 +#: caravel/models.py:1243 msgid "No data was returned." msgstr "" -#: caravel/views.py:116 +#: caravel/views.py:124 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" msgstr "" -#: caravel/views.py:215 +#: caravel/views.py:133 caravel/views.py:161 +msgid "Column" +msgstr "" + +#: caravel/views.py:134 caravel/views.py:194 caravel/views.py:223 +msgid "Verbose Name" +msgstr "" + +#: caravel/views.py:135 caravel/views.py:193 caravel/views.py:222 +#: caravel/views.py:400 caravel/views.py:535 +msgid "Description" +msgstr "" + +#: caravel/views.py:136 caravel/views.py:164 +msgid "Groupable" +msgstr "" + +#: caravel/views.py:137 caravel/views.py:165 +msgid "Filterable" +msgstr "" + +#: caravel/views.py:138 caravel/views.py:197 caravel/views.py:308 +#: caravel/views.py:406 +msgid "Table" +msgstr "" + +#: caravel/views.py:139 caravel/views.py:166 +msgid "Count Distinct" +msgstr "" + +#: caravel/views.py:140 caravel/views.py:167 +msgid "Sum" +msgstr "" + +#: caravel/views.py:141 caravel/views.py:168 +msgid "Min" +msgstr "" + +#: caravel/views.py:142 caravel/views.py:169 +msgid "Max" +msgstr "" + +#: caravel/views.py:143 +msgid "Expression" +msgstr "" + +#: caravel/views.py:144 +msgid "Is temporal" +msgstr "" + +#: caravel/views.py:162 caravel/views.py:195 caravel/views.py:224 +#: caravel/views.py:424 +msgid "Type" +msgstr "" + +#: caravel/views.py:163 caravel/views.py:399 +msgid "Datasource" +msgstr "" + +#: caravel/views.py:192 caravel/views.py:221 +msgid "Metric" +msgstr "" + +#: caravel/views.py:196 +msgid "SQL Expression" +msgstr "" + +#: caravel/views.py:225 caravel/views.py:503 +msgid "JSON" +msgstr "" + +#: caravel/views.py:226 +msgid "Druid Datasource" +msgstr "" + +#: caravel/views.py:257 caravel/views.py:310 +msgid "Database" +msgstr "" + +#: caravel/views.py:258 +msgid "SQL link" +msgstr "" + +#: caravel/views.py:259 caravel/views.py:397 caravel/views.py:459 +msgid "Creator" +msgstr "" + +#: caravel/views.py:260 caravel/views.py:311 +msgid "Last Changed" +msgstr "" + +#: caravel/views.py:261 +msgid "SQLAlchemy URI" +msgstr "" + +#: caravel/views.py:262 caravel/views.py:317 caravel/views.py:396 +#: caravel/views.py:541 +msgid "Cache Timeout" +msgstr "" + +#: caravel/views.py:263 +msgid "Extra" +msgstr "" + +#: caravel/views.py:279 msgid "Databases" msgstr "" -#: caravel/views.py:217 caravel/views.py:261 caravel/views.py:284 +#: caravel/views.py:281 caravel/views.py:337 caravel/views.py:369 msgid "Sources" msgstr "" -#: caravel/views.py:260 -msgid "Tables" +#: caravel/views.py:309 +msgid "Changed By" msgstr "" -#: caravel/views.py:282 -msgid "Druid Clusters" +#: caravel/views.py:312 +msgid "SQL Editor" msgstr "" -#: caravel/views.py:313 -msgid "Slices" +#: caravel/views.py:313 caravel/views.py:537 +msgid "Is Featured" msgstr "" -#: caravel/views.py:341 +#: caravel/views.py:314 +msgid "Schema" +msgstr "" + +#: caravel/views.py:315 caravel/views.py:539 +msgid "Default Endpoint" +msgstr "" + +#: caravel/views.py:316 +msgid "Offset" +msgstr "" + +#: caravel/views.py:354 caravel/views.py:534 +msgid "Cluster" +msgstr "" + +#: caravel/views.py:355 +msgid "Coordinator Host" +msgstr "" + +#: caravel/views.py:356 +msgid "Coordinator Port" +msgstr "" + +#: caravel/views.py:357 +msgid "Coordinator Endpoint" +msgstr "" + +#: caravel/views.py:358 +msgid "Broker Host" +msgstr "" + +#: caravel/views.py:359 +msgid "Borker Port" +msgstr "" + +#: caravel/views.py:360 +msgid "Broker Endpoint" +msgstr "" + +#: caravel/views.py:398 caravel/views.py:479 +msgid "Dashboards" +msgstr "" + +#: caravel/views.py:401 +msgid "Last Modified" +msgstr "" + +#: caravel/views.py:402 caravel/views.py:458 +msgid "Owners" +msgstr "" + +#: caravel/views.py:403 +msgid "Parameters" +msgstr "" + +#: caravel/views.py:404 caravel/views.py:425 +msgid "Slice" +msgstr "" + +#: caravel/views.py:405 +msgid "Name" +msgstr "" + +#: caravel/views.py:407 caravel/views.py:426 +msgid "Visualization Type" +msgstr "" + +#: caravel/views.py:441 msgid "" "This json object describes the positioning of the widgets in the " "dashboard. It is dynamically generated when adjusting the widgets size " "and positions by using drag & drop in the dashboard view" msgstr "" -#: caravel/views.py:346 +#: caravel/views.py:446 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: caravel/views.py:367 -msgid "Dashboards" +#: caravel/views.py:450 +msgid "To get a readable URL for your dashboard" msgstr "" -#: caravel/views.py:392 +#: caravel/views.py:454 +msgid "Dashboard" +msgstr "" + +#: caravel/views.py:455 +msgid "Title" +msgstr "" + +#: caravel/views.py:456 +msgid "Slug" +msgstr "" + +#: caravel/views.py:457 +msgid "Slices" +msgstr "" + +#: caravel/views.py:460 +msgid "Modified" +msgstr "" + +#: caravel/views.py:461 +msgid "Position JSON" +msgstr "" + +#: caravel/views.py:462 +msgid "CSS" +msgstr "" + +#: caravel/views.py:463 +msgid "JSON Metadata" +msgstr "" + +#: caravel/views.py:500 +msgid "User" +msgstr "" + +#: caravel/views.py:501 +msgid "Action" +msgstr "" + +#: caravel/views.py:502 +msgid "dttm" +msgstr "" + +#: caravel/views.py:509 msgid "Action Log" msgstr "" -#: caravel/views.py:393 +#: caravel/views.py:510 msgid "Security" msgstr "" -#: caravel/views.py:430 +#: caravel/views.py:527 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: caravel/views.py:533 +msgid "Data Source" +msgstr "" + +#: caravel/views.py:536 +msgid "Owner" +msgstr "" + +#: caravel/views.py:538 +msgid "Is Hidden" +msgstr "" + +#: caravel/views.py:540 +msgid "Time Offset" +msgstr "" + +#: caravel/views.py:555 msgid "Druid Datasources" msgstr "" -#: caravel/views.py:514 +#: caravel/views.py:639 msgid "The datasource seems to have been deleted" msgstr "" -#: caravel/views.py:522 +#: caravel/views.py:647 msgid "You don't seem to have access to this datasource" msgstr "" -#: caravel/views.py:843 +#: caravel/views.py:970 msgid "This view requires the `all_datasource_access` permission" msgstr "" -#: caravel/views.py:954 +#: caravel/views.py:1081 msgid "CSS Templates" msgstr "" +#: caravel/viz.py:324 +msgid "Table View" +msgstr "" + +#: caravel/viz.py:385 +msgid "Pivot Table" +msgstr "" + +#: caravel/viz.py:447 +msgid "Markup" +msgstr "" + +#: caravel/viz.py:475 +msgid "Word Cloud" +msgstr "" + +#: caravel/viz.py:507 +msgid "Treemap" +msgstr "" + +#: caravel/viz.py:551 +msgid "Calender Heatmap" +msgstr "" + +#: caravel/viz.py:622 +msgid "Box Plot" +msgstr "" + +#: caravel/viz.py:729 +msgid "Bubble Chart" +msgstr "" + +#: caravel/viz.py:797 +msgid "Big Number with Trendline" +msgstr "" + +#: caravel/viz.py:847 +msgid "Big Number" +msgstr "" + +#: caravel/viz.py:893 +msgid "Time Series - Line Chart" +msgstr "" + +#: caravel/viz.py:1045 +msgid "Time Series - Bar Chart" +msgstr "" + +#: caravel/viz.py:1063 +msgid "Time Series - Percent Change" +msgstr "" + +#: caravel/viz.py:1071 +msgid "Time Series - Stacked" +msgstr "" + +#: caravel/viz.py:1090 +msgid "Distribution - NVD3 - Pie Chart" +msgstr "" + +#: caravel/viz.py:1126 +msgid "Distribution - Bar Chart" +msgstr "" + +#: caravel/viz.py:1206 +msgid "Sunburst" +msgstr "" + +#: caravel/viz.py:1272 +msgid "Sankey" +msgstr "" + +#: caravel/viz.py:1336 +msgid "Directed Force Layout" +msgstr "" + +#: caravel/viz.py:1378 +msgid "World Map" +msgstr "" + +#: caravel/viz.py:1452 +msgid "Filters" +msgstr "" + +#: caravel/viz.py:1500 +msgid "iFrame" +msgstr "" + +#: caravel/viz.py:1518 +msgid "Parallel Coordinates" +msgstr "" + +#: caravel/viz.py:1554 +msgid "Heatmap" +msgstr "" + +#: caravel/viz.py:1622 +msgid "Horizon Charts" +msgstr "" + #: caravel/templates/appbuilder/navbar_right.html:34 msgid "Profile" msgstr "" @@ -116,3 +452,9 @@ msgstr "" msgid "Welcome!" msgstr "" +#~ msgid "Tables" +#~ msgstr "" + +#~ msgid "Druid Clusters" +#~ msgstr "" + diff --git a/caravel/translations/fr/LC_MESSAGES/messages.mo b/caravel/translations/fr/LC_MESSAGES/messages.mo index 5a7c0e9bf19d22e7318e16bbe821dac28be9ed2b..4fdcc9a62a1e4bcb7a38a759123f941551c62dfe 100644 GIT binary patch literal 5950 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 I^|{jD0Zt%Dr2qf` delta 722 zcmcJ}KS%;$7{~F)GE+%GC5>pf#Y%`!w{kKYA{vSlY7)-#%!AX@`x69~Q%yA;K}B;= zTRBD{G&Ho<+E!Cb5Hz&(d*X&@XiK>JypQkQd*7SsqgdxD>OCO*61c{2J@D}3x91@W zV%~=#c<9cjFo5|2mf#f(!_hvX2u#5Nn1eo;hr@6I4#E=j6LqNSKA^iB8}7UfZ9KRG zQ}7e^V6vZR2EITXK!TU32~#i)k0D3jLk?fV*Ew8`!Nfbb228H5J<0#;ocPswd-g}DqsH4@_yxc7l4t+` diff --git a/caravel/translations/fr/LC_MESSAGES/messages.po b/caravel/translations/fr/LC_MESSAGES/messages.po index 4fad2485e..f7556c9c1 100644 --- a/caravel/translations/fr/LC_MESSAGES/messages.po +++ b/caravel/translations/fr/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-05-02 00:21-0700\n" +"POT-Creation-Date: 2016-05-20 20:30-0700\n" "PO-Revision-Date: 2016-05-01 23:07-0700\n" "Last-Translator: FULL NAME \n" "Language: fr\n" @@ -18,87 +18,423 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: caravel/models.py:564 +#: caravel/models.py:607 msgid "" "Datetime column not provided as part table configuration and is required " "by this type of chart" msgstr "" -#: caravel/models.py:1153 +#: caravel/models.py:1243 msgid "No data was returned." msgstr "" -#: caravel/views.py:116 +#: caravel/views.py:124 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" msgstr "" -#: caravel/views.py:215 -msgid "Databases" +#: caravel/views.py:133 caravel/views.py:161 +msgid "Column" +msgstr "Colonne" + +#: caravel/views.py:134 caravel/views.py:194 caravel/views.py:223 +msgid "Verbose Name" +msgstr "Nom Complet" + +#: caravel/views.py:135 caravel/views.py:193 caravel/views.py:222 +#: caravel/views.py:400 caravel/views.py:535 +msgid "Description" msgstr "" -#: caravel/views.py:217 caravel/views.py:261 caravel/views.py:284 +#: caravel/views.py:136 caravel/views.py:164 +msgid "Groupable" +msgstr "" + +#: caravel/views.py:137 caravel/views.py:165 +msgid "Filterable" +msgstr "Filtrable" + +#: caravel/views.py:138 caravel/views.py:197 caravel/views.py:308 +#: caravel/views.py:406 +msgid "Table" +msgstr "" + +#: caravel/views.py:139 caravel/views.py:166 +msgid "Count Distinct" +msgstr "" + +#: caravel/views.py:140 caravel/views.py:167 +msgid "Sum" +msgstr "Somme" + +#: caravel/views.py:141 caravel/views.py:168 +msgid "Min" +msgstr "" + +#: caravel/views.py:142 caravel/views.py:169 +msgid "Max" +msgstr "" + +#: caravel/views.py:143 +msgid "Expression" +msgstr "" + +#: caravel/views.py:144 +msgid "Is temporal" +msgstr "Est temporel" + +#: caravel/views.py:162 caravel/views.py:195 caravel/views.py:224 +#: caravel/views.py:424 +msgid "Type" +msgstr "" + +#: caravel/views.py:163 caravel/views.py:399 +msgid "Datasource" +msgstr "Source de données" + +#: caravel/views.py:192 caravel/views.py:221 +msgid "Metric" +msgstr "" + +#: caravel/views.py:196 +msgid "SQL Expression" +msgstr "" + +#: caravel/views.py:225 caravel/views.py:503 +msgid "JSON" +msgstr "" + +#: caravel/views.py:226 +msgid "Druid Datasource" +msgstr "Source de données Druid" + +#: caravel/views.py:257 caravel/views.py:310 +msgid "Database" +msgstr "Base de données" + +#: caravel/views.py:258 +msgid "SQL link" +msgstr "Lien SQL" + +#: caravel/views.py:259 caravel/views.py:397 caravel/views.py:459 +msgid "Creator" +msgstr "Createur" + +#: caravel/views.py:260 caravel/views.py:311 +msgid "Last Changed" +msgstr "Modifié" + +#: caravel/views.py:261 +msgid "SQLAlchemy URI" +msgstr "" + +#: caravel/views.py:262 caravel/views.py:317 caravel/views.py:396 +#: caravel/views.py:541 +msgid "Cache Timeout" +msgstr "" + +#: caravel/views.py:263 +msgid "Extra" +msgstr "" + +#: caravel/views.py:279 +msgid "Databases" +msgstr "Base de Données" + +#: caravel/views.py:281 caravel/views.py:337 caravel/views.py:369 msgid "Sources" msgstr "" -#: caravel/views.py:260 -msgid "Tables" +#: caravel/views.py:309 +msgid "Changed By" msgstr "" -#: caravel/views.py:282 -msgid "Druid Clusters" +#: caravel/views.py:312 +msgid "SQL Editor" msgstr "" -#: caravel/views.py:313 -msgid "Slices" +#: caravel/views.py:313 caravel/views.py:537 +msgid "Is Featured" msgstr "" -#: caravel/views.py:341 +#: caravel/views.py:314 +msgid "Schema" +msgstr "" + +#: caravel/views.py:315 caravel/views.py:539 +msgid "Default Endpoint" +msgstr "" + +#: caravel/views.py:316 +msgid "Offset" +msgstr "" + +#: caravel/views.py:354 caravel/views.py:534 +msgid "Cluster" +msgstr "" + +#: caravel/views.py:355 +msgid "Coordinator Host" +msgstr "" + +#: caravel/views.py:356 +msgid "Coordinator Port" +msgstr "" + +#: caravel/views.py:357 +msgid "Coordinator Endpoint" +msgstr "" + +#: caravel/views.py:358 +msgid "Broker Host" +msgstr "" + +#: caravel/views.py:359 +msgid "Borker Port" +msgstr "" + +#: caravel/views.py:360 +msgid "Broker Endpoint" +msgstr "" + +#: caravel/views.py:398 caravel/views.py:479 +msgid "Dashboards" +msgstr "" + +#: caravel/views.py:401 +msgid "Last Modified" +msgstr "" + +#: caravel/views.py:402 caravel/views.py:458 +msgid "Owners" +msgstr "" + +#: caravel/views.py:403 +msgid "Parameters" +msgstr "" + +#: caravel/views.py:404 caravel/views.py:425 +msgid "Slice" +msgstr "Graphique" + +#: caravel/views.py:405 +msgid "Name" +msgstr "Nom" + +#: caravel/views.py:407 caravel/views.py:426 +msgid "Visualization Type" +msgstr "Type de visualization" + +#: caravel/views.py:441 msgid "" "This json object describes the positioning of the widgets in the " "dashboard. It is dynamically generated when adjusting the widgets size " "and positions by using drag & drop in the dashboard view" msgstr "" -#: caravel/views.py:346 +#: caravel/views.py:446 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: caravel/views.py:367 -msgid "Dashboards" +#: caravel/views.py:450 +msgid "To get a readable URL for your dashboard" msgstr "" -#: caravel/views.py:392 +#: caravel/views.py:454 +msgid "Dashboard" +msgstr "Tableau de Bord" + +#: caravel/views.py:455 +msgid "Title" +msgstr "Titre" + +#: caravel/views.py:456 +msgid "Slug" +msgstr "" + +#: caravel/views.py:457 +msgid "Slices" +msgstr "Graphiques" + +#: caravel/views.py:460 +msgid "Modified" +msgstr "Modifié" + +#: caravel/views.py:461 +msgid "Position JSON" +msgstr "" + +#: caravel/views.py:462 +msgid "CSS" +msgstr "" + +#: caravel/views.py:463 +msgid "JSON Metadata" +msgstr "" + +#: caravel/views.py:500 +msgid "User" +msgstr "Utilisateur" + +#: caravel/views.py:501 +msgid "Action" +msgstr "" + +#: caravel/views.py:502 +msgid "dttm" +msgstr "" + +#: caravel/views.py:509 msgid "Action Log" msgstr "" -#: caravel/views.py:393 +#: caravel/views.py:510 msgid "Security" msgstr "Securité" -#: caravel/views.py:430 +#: caravel/views.py:527 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: caravel/views.py:533 +msgid "Data Source" +msgstr "Source de Données" + +#: caravel/views.py:536 +msgid "Owner" +msgstr "Propriétair" + +#: caravel/views.py:538 +msgid "Is Hidden" +msgstr "Caché" + +#: caravel/views.py:540 +msgid "Time Offset" +msgstr "" + +#: caravel/views.py:555 msgid "Druid Datasources" -msgstr "" +msgstr "Source de données Druid" -#: caravel/views.py:514 +#: caravel/views.py:639 msgid "The datasource seems to have been deleted" -msgstr "" +msgstr "Cette source semble seche" -#: caravel/views.py:522 +#: caravel/views.py:647 msgid "You don't seem to have access to this datasource" -msgstr "" +msgstr "Vous n'avez pas acces a cette source de donnees" -#: caravel/views.py:843 +#: caravel/views.py:970 msgid "This view requires the `all_datasource_access` permission" msgstr "" -#: caravel/views.py:954 +#: caravel/views.py:1081 msgid "CSS Templates" msgstr "" +#: caravel/viz.py:324 +msgid "Table View" +msgstr "" + +#: caravel/viz.py:385 +msgid "Pivot Table" +msgstr "" + +#: caravel/viz.py:447 +msgid "Markup" +msgstr "" + +#: caravel/viz.py:475 +msgid "Word Cloud" +msgstr "Nuage de Mots" + +#: caravel/viz.py:507 +msgid "Treemap" +msgstr "" + +#: caravel/viz.py:551 +msgid "Calender Heatmap" +msgstr "" + +#: caravel/viz.py:622 +msgid "Box Plot" +msgstr "" + +#: caravel/viz.py:729 +msgid "Bubble Chart" +msgstr "Graphique en Bulles" + +#: caravel/viz.py:797 +msgid "Big Number with Trendline" +msgstr "" + +#: caravel/viz.py:847 +msgid "Big Number" +msgstr "Gros Chiffre" + +#: caravel/viz.py:893 +msgid "Time Series - Line Chart" +msgstr "" + +#: caravel/viz.py:1045 +msgid "Time Series - Bar Chart" +msgstr "" + +#: caravel/viz.py:1063 +msgid "Time Series - Percent Change" +msgstr "" + +#: caravel/viz.py:1071 +msgid "Time Series - Stacked" +msgstr "" + +#: caravel/viz.py:1090 +msgid "Distribution - NVD3 - Pie Chart" +msgstr "" + +#: caravel/viz.py:1126 +msgid "Distribution - Bar Chart" +msgstr "" + +#: caravel/viz.py:1206 +msgid "Sunburst" +msgstr "" + +#: caravel/viz.py:1272 +msgid "Sankey" +msgstr "" + +#: caravel/viz.py:1336 +msgid "Directed Force Layout" +msgstr "" + +#: caravel/viz.py:1378 +msgid "World Map" +msgstr "Carte du monde" + +#: caravel/viz.py:1452 +msgid "Filters" +msgstr "Filtres" + +#: caravel/viz.py:1500 +msgid "iFrame" +msgstr "" + +#: caravel/viz.py:1518 +msgid "Parallel Coordinates" +msgstr "" + +#: caravel/viz.py:1554 +msgid "Heatmap" +msgstr "" + +#: caravel/viz.py:1622 +msgid "Horizon Charts" +msgstr "" + #: caravel/templates/appbuilder/navbar_right.html:34 msgid "Profile" msgstr "" @@ -116,3 +452,9 @@ msgstr "" msgid "Welcome!" msgstr "Bienvenue!" +#~ msgid "Tables" +#~ msgstr "" + +#~ msgid "Druid Clusters" +#~ msgstr "" + diff --git a/caravel/translations/it/LC_MESSAGES/messages.mo b/caravel/translations/it/LC_MESSAGES/messages.mo index c17ff465d692741af01c60451761fcd17dfdff89..034d5c86e1d5b786cbce880c51da60d86a84016f 100644 GIT binary patch literal 5975 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 A\n" +"Last-Translator: Riccardo Magliocchetti " +"\n" "Language: it\n" "Language-Team: it \n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" @@ -18,95 +19,432 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: caravel/models.py:564 +#: caravel/models.py:607 msgid "" "Datetime column not provided as part table configuration and is required " "by this type of chart" msgstr "" -"La colonna di tipo datetime non è stata fornita nella configurazione della tabella " -"ma richiesta da questo tipo di grafico" +"La colonna di tipo datetime non è stata fornita nella configurazione " +"della tabella ma richiesta da questo tipo di grafico" -#: caravel/models.py:1153 +#: caravel/models.py:1243 msgid "No data was returned." msgstr "Nessun dato disponibile." -#: caravel/views.py:116 +#: caravel/views.py:124 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" -msgstr "Rendi questa colonna disponibile come una opzione [Time Granularity]," -" la colonna deve essere DATATIME o DATETIME-like" +msgstr "" +"Rendi questa colonna disponibile come una opzione [Time Granularity], la " +"colonna deve essere DATATIME o DATETIME-like" -#: caravel/views.py:215 +#: caravel/views.py:133 caravel/views.py:161 +msgid "Column" +msgstr "" + +#: caravel/views.py:134 caravel/views.py:194 caravel/views.py:223 +msgid "Verbose Name" +msgstr "" + +#: caravel/views.py:135 caravel/views.py:193 caravel/views.py:222 +#: caravel/views.py:400 caravel/views.py:535 +msgid "Description" +msgstr "" + +#: caravel/views.py:136 caravel/views.py:164 +msgid "Groupable" +msgstr "" + +#: caravel/views.py:137 caravel/views.py:165 +msgid "Filterable" +msgstr "" + +#: caravel/views.py:138 caravel/views.py:197 caravel/views.py:308 +#: caravel/views.py:406 +msgid "Table" +msgstr "" + +#: caravel/views.py:139 caravel/views.py:166 +msgid "Count Distinct" +msgstr "" + +#: caravel/views.py:140 caravel/views.py:167 +msgid "Sum" +msgstr "" + +#: caravel/views.py:141 caravel/views.py:168 +msgid "Min" +msgstr "" + +#: caravel/views.py:142 caravel/views.py:169 +msgid "Max" +msgstr "" + +#: caravel/views.py:143 +msgid "Expression" +msgstr "" + +#: caravel/views.py:144 +msgid "Is temporal" +msgstr "" + +#: caravel/views.py:162 caravel/views.py:195 caravel/views.py:224 +#: caravel/views.py:424 +msgid "Type" +msgstr "" + +#: caravel/views.py:163 caravel/views.py:399 +msgid "Datasource" +msgstr "" + +#: caravel/views.py:192 caravel/views.py:221 +msgid "Metric" +msgstr "" + +#: caravel/views.py:196 +msgid "SQL Expression" +msgstr "" + +#: caravel/views.py:225 caravel/views.py:503 +msgid "JSON" +msgstr "" + +#: caravel/views.py:226 +msgid "Druid Datasource" +msgstr "" + +#: caravel/views.py:257 caravel/views.py:310 +msgid "Database" +msgstr "" + +#: caravel/views.py:258 +msgid "SQL link" +msgstr "" + +#: caravel/views.py:259 caravel/views.py:397 caravel/views.py:459 +msgid "Creator" +msgstr "" + +#: caravel/views.py:260 caravel/views.py:311 +msgid "Last Changed" +msgstr "" + +#: caravel/views.py:261 +msgid "SQLAlchemy URI" +msgstr "" + +#: caravel/views.py:262 caravel/views.py:317 caravel/views.py:396 +#: caravel/views.py:541 +msgid "Cache Timeout" +msgstr "" + +#: caravel/views.py:263 +msgid "Extra" +msgstr "" + +#: caravel/views.py:279 msgid "Databases" msgstr "Database" -#: caravel/views.py:217 caravel/views.py:261 caravel/views.py:284 +#: caravel/views.py:281 caravel/views.py:337 caravel/views.py:369 msgid "Sources" msgstr "Sorgenti" -#: caravel/views.py:260 -msgid "Tables" -msgstr "Tabelle" +#: caravel/views.py:309 +msgid "Changed By" +msgstr "" -#: caravel/views.py:282 -msgid "Druid Clusters" -msgstr "Cluster Druid" +#: caravel/views.py:312 +msgid "SQL Editor" +msgstr "" -#: caravel/views.py:313 -msgid "Slices" -msgstr "Slice" +#: caravel/views.py:313 caravel/views.py:537 +msgid "Is Featured" +msgstr "" -#: caravel/views.py:341 +#: caravel/views.py:314 +msgid "Schema" +msgstr "" + +#: caravel/views.py:315 caravel/views.py:539 +msgid "Default Endpoint" +msgstr "" + +#: caravel/views.py:316 +msgid "Offset" +msgstr "" + +#: caravel/views.py:354 caravel/views.py:534 +msgid "Cluster" +msgstr "" + +#: caravel/views.py:355 +msgid "Coordinator Host" +msgstr "" + +#: caravel/views.py:356 +msgid "Coordinator Port" +msgstr "" + +#: caravel/views.py:357 +msgid "Coordinator Endpoint" +msgstr "" + +#: caravel/views.py:358 +msgid "Broker Host" +msgstr "" + +#: caravel/views.py:359 +msgid "Borker Port" +msgstr "" + +#: caravel/views.py:360 +msgid "Broker Endpoint" +msgstr "" + +#: caravel/views.py:398 caravel/views.py:479 +msgid "Dashboards" +msgstr "Dashboard" + +#: caravel/views.py:401 +msgid "Last Modified" +msgstr "" + +#: caravel/views.py:402 caravel/views.py:458 +msgid "Owners" +msgstr "" + +#: caravel/views.py:403 +msgid "Parameters" +msgstr "" + +#: caravel/views.py:404 caravel/views.py:425 +msgid "Slice" +msgstr "" + +#: caravel/views.py:405 +msgid "Name" +msgstr "" + +#: caravel/views.py:407 caravel/views.py:426 +msgid "Visualization Type" +msgstr "" + +#: caravel/views.py:441 msgid "" "This json object describes the positioning of the widgets in the " "dashboard. It is dynamically generated when adjusting the widgets size " "and positions by using drag & drop in the dashboard view" msgstr "" -"Questo oggetto json descrive il posizionamento dei widget nella dashboard." -"E` generata dinamicamente quando vengono cambiate la dimensioni dei widget o la" -"posizione tramite il drag&drop nella vista dashboard." +"Questo oggetto json descrive il posizionamento dei widget nella " +"dashboard.E` generata dinamicamente quando vengono cambiate la dimensioni" +" dei widget o laposizione tramite il drag&drop nella vista dashboard." -#: caravel/views.py:346 +#: caravel/views.py:446 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -"Il css per ogni dashboard può essere modificato qui o nella vista -"dashboard dove i cambiamenti sono visibili immediatamente" +"Il css per ogni dashboard può essere modificato qui o nella vistdashboard" +" dove i cambiamenti sono visibili immediatamente" -#: caravel/views.py:367 -msgid "Dashboards" -msgstr "Dashboard" +#: caravel/views.py:450 +msgid "To get a readable URL for your dashboard" +msgstr "" -#: caravel/views.py:392 +#: caravel/views.py:454 +msgid "Dashboard" +msgstr "" + +#: caravel/views.py:455 +msgid "Title" +msgstr "" + +#: caravel/views.py:456 +msgid "Slug" +msgstr "" + +#: caravel/views.py:457 +msgid "Slices" +msgstr "Slice" + +#: caravel/views.py:460 +msgid "Modified" +msgstr "" + +#: caravel/views.py:461 +msgid "Position JSON" +msgstr "" + +#: caravel/views.py:462 +msgid "CSS" +msgstr "" + +#: caravel/views.py:463 +msgid "JSON Metadata" +msgstr "" + +#: caravel/views.py:500 +msgid "User" +msgstr "" + +#: caravel/views.py:501 +msgid "Action" +msgstr "" + +#: caravel/views.py:502 +msgid "dttm" +msgstr "" + +#: caravel/views.py:509 msgid "Action Log" msgstr "Log delle azioni" -#: caravel/views.py:393 +#: caravel/views.py:510 msgid "Security" msgstr "Sicurezza" -#: caravel/views.py:430 +#: caravel/views.py:527 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: caravel/views.py:533 +msgid "Data Source" +msgstr "" + +#: caravel/views.py:536 +msgid "Owner" +msgstr "" + +#: caravel/views.py:538 +msgid "Is Hidden" +msgstr "" + +#: caravel/views.py:540 +msgid "Time Offset" +msgstr "" + +#: caravel/views.py:555 msgid "Druid Datasources" msgstr "Datasource Druid" -#: caravel/views.py:514 +#: caravel/views.py:639 msgid "The datasource seems to have been deleted" msgstr "Sembra che il datasource sia stato eliminato" -#: caravel/views.py:522 +#: caravel/views.py:647 msgid "You don't seem to have access to this datasource" msgstr "Non hai i permessi per accedere a questo datasource" -#: caravel/views.py:843 +#: caravel/views.py:970 msgid "This view requires the `all_datasource_access` permission" msgstr "Questa vista richiede il permesso `all_datasource_access`" -#: caravel/views.py:954 +#: caravel/views.py:1081 msgid "CSS Templates" msgstr "Template CSS" +#: caravel/viz.py:324 +msgid "Table View" +msgstr "" + +#: caravel/viz.py:385 +msgid "Pivot Table" +msgstr "" + +#: caravel/viz.py:447 +msgid "Markup" +msgstr "" + +#: caravel/viz.py:475 +msgid "Word Cloud" +msgstr "" + +#: caravel/viz.py:507 +msgid "Treemap" +msgstr "" + +#: caravel/viz.py:551 +msgid "Calender Heatmap" +msgstr "" + +#: caravel/viz.py:622 +msgid "Box Plot" +msgstr "" + +#: caravel/viz.py:729 +msgid "Bubble Chart" +msgstr "" + +#: caravel/viz.py:797 +msgid "Big Number with Trendline" +msgstr "" + +#: caravel/viz.py:847 +msgid "Big Number" +msgstr "" + +#: caravel/viz.py:893 +msgid "Time Series - Line Chart" +msgstr "" + +#: caravel/viz.py:1045 +msgid "Time Series - Bar Chart" +msgstr "" + +#: caravel/viz.py:1063 +msgid "Time Series - Percent Change" +msgstr "" + +#: caravel/viz.py:1071 +msgid "Time Series - Stacked" +msgstr "" + +#: caravel/viz.py:1090 +msgid "Distribution - NVD3 - Pie Chart" +msgstr "" + +#: caravel/viz.py:1126 +msgid "Distribution - Bar Chart" +msgstr "" + +#: caravel/viz.py:1206 +msgid "Sunburst" +msgstr "" + +#: caravel/viz.py:1272 +msgid "Sankey" +msgstr "" + +#: caravel/viz.py:1336 +msgid "Directed Force Layout" +msgstr "" + +#: caravel/viz.py:1378 +msgid "World Map" +msgstr "" + +#: caravel/viz.py:1452 +msgid "Filters" +msgstr "" + +#: caravel/viz.py:1500 +msgid "iFrame" +msgstr "" + +#: caravel/viz.py:1518 +msgid "Parallel Coordinates" +msgstr "" + +#: caravel/viz.py:1554 +msgid "Heatmap" +msgstr "" + +#: caravel/viz.py:1622 +msgid "Horizon Charts" +msgstr "" + #: caravel/templates/appbuilder/navbar_right.html:34 msgid "Profile" msgstr "Profilo" @@ -124,3 +462,9 @@ msgstr "Login" msgid "Welcome!" msgstr "Benvenuto!" +#~ msgid "Tables" +#~ msgstr "Tabelle" + +#~ msgid "Druid Clusters" +#~ msgstr "Cluster Druid" + diff --git a/caravel/translations/zh/LC_MESSAGES/messages.mo b/caravel/translations/zh/LC_MESSAGES/messages.mo index 397a1eee9f858dd550d503e75720acf48b8e480d..c0d8b095ba6aae0fcee7773df94df075ffa1d18e 100644 GIT binary patch literal 5798 zcmd^>e{56N702&H*Os(fY0G|8Lgg}TlukG^p}*!fU6a@$VRquh1~jpbUi)3!H+g=~ zeLs>oQdKrqDBUQm70^Hs(3Ot9qrVA*q*sA7e+2vt zxEcIBI0h~T-vnviS@34C3eq|sgP#QFVR4e@gHX*Df@IGkEiVPh-e!>2X$A3P-C9n8 z*FfF?QhW@M;^t`iagf&822xy})!YM8Tn}pbkd|KsVH!IIlHL;_`E?4U_umIe-*2@1 zJCNdB1IdqzAlZ361hQu#NPc|*r13A~LH^tg(mGKsCqUBwEzPVR?+0l;SNE4evTGwq zdY=Hvk8L37`yoj4_kj4Z19yADhE(Eb8 zyB)-jEysiOwu0nW7f5y_LE7haAb!l$d<=wX>}inZ?*mEiARAxgY-NDlHH?P-VaioUj)golOWmkE=cyg2a-J>>hV8<16Y&wy~1eE^bw7r+wuXOQg6 zezv~f7PtiRFi3j#fHZ$U$l9`=vMmiBxAUxB<#~@^%t&WWlMgAcz|)Sj3{zQ>wcE~s zba>KsJhX>-(zMZVZ0d|zM#)yztlVY0X#1IrDS1ah;Ej${ivD?87E7k^q{}))wjg<0 z6{YQCT$or0s=B1`ilW5unw6IZZ!fbB(|0}C)?u4|(E@D8P?qrQISbG23|61p5!l>e z`6Y@latbR`e*q?*~H zsN*Yxlj}3SUDn~U*l@{_u1o0?8}=N*I+cl?A@_9CWvd+9F9kg_TiInhY6LC^nc%W+ zmvQrw}@ZbsQ2?G|fxNtpEKsiwt61JgoiX=O)EP9gn z3E>R*C19B0T}NeE0)w-2dqh#P9-EU+K7{>oBn+{n(ad^tIahkDcgRAj1y7eH1-tC1G3Cg)FW6*W_?F_kWGbT44y9F=UF{JA^1i7TN&R$(ba7Uo_wv6LoAIV z%epSlp<0w>C}gHDOawruz00%0;u*;W?Ie<^fah`^%tl7a#!Nm4eSC<2tuQ4xo-F)Sbsw!1RF#)i^_R~m!wlv z^%A19kL$Dx+9~NM_&v91FYS-xAlB7<=|EEA1ikT| zS}UE5?MfaL-CE@$@6<^B^b01flV;W~$|Y=FL1I4~N|2%$kk}k-qdri@pipM8E~-`V z^?_@v9AWvUpu%{V+reqLeCCA$=0OoMI@*?wrMnX`O6Hk%$W#N8t-}|DcbK+sP}4Mc z0)~In_PJqOcX&a%&Sq=G+!I* zOLh15H1$awZ(bo%1HR$`aC)~Lutgz#b?)cBD`}=JkERC z5S9lnS^B}IIBMD#c`P|nm=!{4DT>s?ABe{vGF7wfZiHKZfuQ89T&PgW} zv$8nst$c*vmr-8Rs+pn=wU;CKz-4eiw=}P8zN=~GZc{t>gUVBfYe$b&CU?%c(#&c8 zM{YOO!w0MT-oE;7Hd7~Gt{pr)z4y7`GIPbnrn>W3b=%R(#IwP${`gn7ZalwnD_*M} zcM^xSH=$O(I>V|PaduA+A?+W_|*83>gxxqV_R#_ zzf#@4W9rmi_TRt4)cvbY?6^AbFVmwZDNPAmCjO}lOnqbZ)p&WS9(iFlWh#dzE1R}ge)2jJ zy7J_K^P?~P@84M9U+u@6D|=7X>-rzuRP?q5-`oG=OG@?C=WB02eU)5MrpLZt-FK+^ a-NRGk+iII8YpRY&-gWi!E zQU{iBKTTu8jebD>gAn4SztTO($vY668=iu^-X|?UWT6YvOOS&P!833J?!Ygw0AJ!V zKK~I`u43{DlOA}HV-9PsVNK?4Sa)eeQF5dDM8#BH-Jxr$bFXZv_83oHwX8b2BNB17 zV0*?`Zp8E)SGTeDujCz$<=GkzqLnepU(0hvE75iCrfrQIrcR2kdA8v`B*ip%qaqKC zs%2Am8ujFIEPh)zHETle5r49__?8+FnY0!!4(5u*D}w`#>2!DOeE7@{TFcSG`*3@K zGe`bP^lqDiX8q@i-+sGDQEfe%UkkSc$34sW+UwPWpa)CQ)(dLCX@;#DMGgPgtH&I( vH`o-x=2G;!8ZB`w&$wE2hd#9lMfoZCsHx-J3A$&PWJ8t2biy3 diff --git a/caravel/translations/zh/LC_MESSAGES/messages.po b/caravel/translations/zh/LC_MESSAGES/messages.po index 3a9bdece3..e351b93cc 100644 --- a/caravel/translations/zh/LC_MESSAGES/messages.po +++ b/caravel/translations/zh/LC_MESSAGES/messages.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2016-05-02 00:21-0700\n" +"POT-Creation-Date: 2016-05-20 20:30-0700\n" "PO-Revision-Date: 2016-05-01 23:07-0700\n" "Last-Translator: FULL NAME \n" "Language: zh\n" @@ -18,87 +18,423 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.3.4\n" -#: caravel/models.py:564 +#: caravel/models.py:607 msgid "" "Datetime column not provided as part table configuration and is required " "by this type of chart" msgstr "所选表格需要日期时间但在表格配置文件中没有被提供" -#: caravel/models.py:1153 +#: caravel/models.py:1243 msgid "No data was returned." msgstr "所选数据为空" -#: caravel/views.py:116 +#: caravel/views.py:124 msgid "" "Whether to make this column available as a [Time Granularity] option, " "column has to be DATETIME or DATETIME-like" msgstr "" -#: caravel/views.py:215 +#: caravel/views.py:133 caravel/views.py:161 +msgid "Column" +msgstr "" + +#: caravel/views.py:134 caravel/views.py:194 caravel/views.py:223 +msgid "Verbose Name" +msgstr "" + +#: caravel/views.py:135 caravel/views.py:193 caravel/views.py:222 +#: caravel/views.py:400 caravel/views.py:535 +msgid "Description" +msgstr "" + +#: caravel/views.py:136 caravel/views.py:164 +msgid "Groupable" +msgstr "" + +#: caravel/views.py:137 caravel/views.py:165 +msgid "Filterable" +msgstr "" + +#: caravel/views.py:138 caravel/views.py:197 caravel/views.py:308 +#: caravel/views.py:406 +msgid "Table" +msgstr "" + +#: caravel/views.py:139 caravel/views.py:166 +msgid "Count Distinct" +msgstr "" + +#: caravel/views.py:140 caravel/views.py:167 +msgid "Sum" +msgstr "" + +#: caravel/views.py:141 caravel/views.py:168 +msgid "Min" +msgstr "" + +#: caravel/views.py:142 caravel/views.py:169 +msgid "Max" +msgstr "" + +#: caravel/views.py:143 +msgid "Expression" +msgstr "" + +#: caravel/views.py:144 +msgid "Is temporal" +msgstr "" + +#: caravel/views.py:162 caravel/views.py:195 caravel/views.py:224 +#: caravel/views.py:424 +msgid "Type" +msgstr "" + +#: caravel/views.py:163 caravel/views.py:399 +msgid "Datasource" +msgstr "" + +#: caravel/views.py:192 caravel/views.py:221 +msgid "Metric" +msgstr "" + +#: caravel/views.py:196 +msgid "SQL Expression" +msgstr "" + +#: caravel/views.py:225 caravel/views.py:503 +msgid "JSON" +msgstr "" + +#: caravel/views.py:226 +msgid "Druid Datasource" +msgstr "" + +#: caravel/views.py:257 caravel/views.py:310 +msgid "Database" +msgstr "" + +#: caravel/views.py:258 +msgid "SQL link" +msgstr "" + +#: caravel/views.py:259 caravel/views.py:397 caravel/views.py:459 +msgid "Creator" +msgstr "" + +#: caravel/views.py:260 caravel/views.py:311 +msgid "Last Changed" +msgstr "" + +#: caravel/views.py:261 +msgid "SQLAlchemy URI" +msgstr "" + +#: caravel/views.py:262 caravel/views.py:317 caravel/views.py:396 +#: caravel/views.py:541 +msgid "Cache Timeout" +msgstr "" + +#: caravel/views.py:263 +msgid "Extra" +msgstr "" + +#: caravel/views.py:279 msgid "Databases" msgstr "数据库" -#: caravel/views.py:217 caravel/views.py:261 caravel/views.py:284 +#: caravel/views.py:281 caravel/views.py:337 caravel/views.py:369 msgid "Sources" msgstr "源" -#: caravel/views.py:260 -msgid "Tables" -msgstr "表格" +#: caravel/views.py:309 +msgid "Changed By" +msgstr "" -#: caravel/views.py:282 -msgid "Druid Clusters" -msgstr "Druid簇" +#: caravel/views.py:312 +msgid "SQL Editor" +msgstr "" -#: caravel/views.py:313 -msgid "Slices" -msgstr "切片" +#: caravel/views.py:313 caravel/views.py:537 +msgid "Is Featured" +msgstr "" -#: caravel/views.py:341 +#: caravel/views.py:314 +msgid "Schema" +msgstr "" + +#: caravel/views.py:315 caravel/views.py:539 +msgid "Default Endpoint" +msgstr "" + +#: caravel/views.py:316 +msgid "Offset" +msgstr "" + +#: caravel/views.py:354 caravel/views.py:534 +msgid "Cluster" +msgstr "" + +#: caravel/views.py:355 +msgid "Coordinator Host" +msgstr "" + +#: caravel/views.py:356 +msgid "Coordinator Port" +msgstr "" + +#: caravel/views.py:357 +msgid "Coordinator Endpoint" +msgstr "" + +#: caravel/views.py:358 +msgid "Broker Host" +msgstr "" + +#: caravel/views.py:359 +msgid "Borker Port" +msgstr "" + +#: caravel/views.py:360 +msgid "Broker Endpoint" +msgstr "" + +#: caravel/views.py:398 caravel/views.py:479 +msgid "Dashboards" +msgstr "仪表盘" + +#: caravel/views.py:401 +msgid "Last Modified" +msgstr "" + +#: caravel/views.py:402 caravel/views.py:458 +msgid "Owners" +msgstr "" + +#: caravel/views.py:403 +msgid "Parameters" +msgstr "" + +#: caravel/views.py:404 caravel/views.py:425 +msgid "Slice" +msgstr "" + +#: caravel/views.py:405 +msgid "Name" +msgstr "" + +#: caravel/views.py:407 caravel/views.py:426 +msgid "Visualization Type" +msgstr "" + +#: caravel/views.py:441 msgid "" "This json object describes the positioning of the widgets in the " "dashboard. It is dynamically generated when adjusting the widgets size " "and positions by using drag & drop in the dashboard view" msgstr "" -#: caravel/views.py:346 +#: caravel/views.py:446 msgid "" "The css for individual dashboards can be altered here, or in the " "dashboard view where changes are immediately visible" msgstr "" -#: caravel/views.py:367 -msgid "Dashboards" -msgstr "仪表盘" +#: caravel/views.py:450 +msgid "To get a readable URL for your dashboard" +msgstr "" -#: caravel/views.py:392 +#: caravel/views.py:454 +msgid "Dashboard" +msgstr "" + +#: caravel/views.py:455 +msgid "Title" +msgstr "" + +#: caravel/views.py:456 +msgid "Slug" +msgstr "" + +#: caravel/views.py:457 +msgid "Slices" +msgstr "切片" + +#: caravel/views.py:460 +msgid "Modified" +msgstr "" + +#: caravel/views.py:461 +msgid "Position JSON" +msgstr "" + +#: caravel/views.py:462 +msgid "CSS" +msgstr "" + +#: caravel/views.py:463 +msgid "JSON Metadata" +msgstr "" + +#: caravel/views.py:500 +msgid "User" +msgstr "" + +#: caravel/views.py:501 +msgid "Action" +msgstr "" + +#: caravel/views.py:502 +msgid "dttm" +msgstr "" + +#: caravel/views.py:509 msgid "Action Log" msgstr "行动记录" -#: caravel/views.py:393 +#: caravel/views.py:510 msgid "Security" msgstr "权限" -#: caravel/views.py:430 +#: caravel/views.py:527 +msgid "Timezone offset (in hours) for this datasource" +msgstr "" + +#: caravel/views.py:533 +msgid "Data Source" +msgstr "" + +#: caravel/views.py:536 +msgid "Owner" +msgstr "" + +#: caravel/views.py:538 +msgid "Is Hidden" +msgstr "" + +#: caravel/views.py:540 +msgid "Time Offset" +msgstr "" + +#: caravel/views.py:555 msgid "Druid Datasources" msgstr "Druid数据源" -#: caravel/views.py:514 +#: caravel/views.py:639 msgid "The datasource seems to have been deleted" msgstr "此数据源好像已被删除" -#: caravel/views.py:522 +#: caravel/views.py:647 msgid "You don't seem to have access to this datasource" msgstr "看来您不能读取此数据源" -#: caravel/views.py:843 +#: caravel/views.py:970 msgid "This view requires the `all_datasource_access` permission" msgstr "此视图需要`all_datasource_access`权限" -#: caravel/views.py:954 +#: caravel/views.py:1081 msgid "CSS Templates" msgstr "CSS模板" +#: caravel/viz.py:324 +msgid "Table View" +msgstr "" + +#: caravel/viz.py:385 +msgid "Pivot Table" +msgstr "" + +#: caravel/viz.py:447 +msgid "Markup" +msgstr "" + +#: caravel/viz.py:475 +msgid "Word Cloud" +msgstr "" + +#: caravel/viz.py:507 +msgid "Treemap" +msgstr "" + +#: caravel/viz.py:551 +msgid "Calender Heatmap" +msgstr "" + +#: caravel/viz.py:622 +msgid "Box Plot" +msgstr "" + +#: caravel/viz.py:729 +msgid "Bubble Chart" +msgstr "" + +#: caravel/viz.py:797 +msgid "Big Number with Trendline" +msgstr "" + +#: caravel/viz.py:847 +msgid "Big Number" +msgstr "" + +#: caravel/viz.py:893 +msgid "Time Series - Line Chart" +msgstr "" + +#: caravel/viz.py:1045 +msgid "Time Series - Bar Chart" +msgstr "" + +#: caravel/viz.py:1063 +msgid "Time Series - Percent Change" +msgstr "" + +#: caravel/viz.py:1071 +msgid "Time Series - Stacked" +msgstr "" + +#: caravel/viz.py:1090 +msgid "Distribution - NVD3 - Pie Chart" +msgstr "" + +#: caravel/viz.py:1126 +msgid "Distribution - Bar Chart" +msgstr "" + +#: caravel/viz.py:1206 +msgid "Sunburst" +msgstr "" + +#: caravel/viz.py:1272 +msgid "Sankey" +msgstr "" + +#: caravel/viz.py:1336 +msgid "Directed Force Layout" +msgstr "" + +#: caravel/viz.py:1378 +msgid "World Map" +msgstr "" + +#: caravel/viz.py:1452 +msgid "Filters" +msgstr "" + +#: caravel/viz.py:1500 +msgid "iFrame" +msgstr "" + +#: caravel/viz.py:1518 +msgid "Parallel Coordinates" +msgstr "" + +#: caravel/viz.py:1554 +msgid "Heatmap" +msgstr "" + +#: caravel/viz.py:1622 +msgid "Horizon Charts" +msgstr "" + #: caravel/templates/appbuilder/navbar_right.html:34 msgid "Profile" msgstr "个人资料" @@ -115,3 +451,10 @@ msgstr "登录" #: caravel/templates/caravel/welcome.html:13 msgid "Welcome!" msgstr "欢迎" + +#~ msgid "Tables" +#~ msgstr "表格" + +#~ msgid "Druid Clusters" +#~ msgstr "Druid簇" + diff --git a/caravel/views.py b/caravel/views.py index f451695ba..749282cbf 100644 --- a/caravel/views.py +++ b/caravel/views.py @@ -20,7 +20,8 @@ from flask.ext.appbuilder import ModelView, CompactCRUDMixin, BaseView, expose from flask.ext.appbuilder.actions import action from flask.ext.appbuilder.models.sqla.interface import SQLAInterface from flask.ext.appbuilder.security.decorators import has_access -from flask.ext.babelpkg import gettext as _ +from flask.ext.babelpkg import gettext as __ +from flask.ext.babelpkg import lazy_gettext as _ from flask_appbuilder.models.sqla.filters import BaseFilter from pydruid.client import doublesum @@ -128,6 +129,20 @@ class TableColumnInlineView(CompactCRUDMixin, CaravelModelView): # noqa "a valid SQL expression as supported by the underlying backend. " "Example: `substr(name, 1, 1)`", True), } + label_columns = { + 'column_name': _("Column"), + 'verbose_name': _("Verbose Name"), + 'description': _("Description"), + 'groupby': _("Groupable"), + 'filterable': _("Filterable"), + 'table': _("Table"), + 'count_distinct': _("Count Distinct"), + 'sum': _("Sum"), + 'min': _("Min"), + 'max': _("Max"), + 'expression': _("Expression"), + 'is_dttm': _("Is temporal"), + } appbuilder.add_view_no_menu(TableColumnInlineView) @@ -142,6 +157,17 @@ class DruidColumnInlineView(CompactCRUDMixin, CaravelModelView): # noqa 'sum', 'min', 'max'] can_delete = False page_size = 500 + label_columns = { + 'column_name': _("Column"), + 'type': _("Type"), + 'datasource': _("Datasource"), + 'groupby': _("Groupable"), + 'filterable': _("Filterable"), + 'count_distinct': _("Count Distinct"), + 'sum': _("Sum"), + 'min': _("Min"), + 'max': _("Max"), + } def post_update(self, col): col.generate_metrics() @@ -162,6 +188,14 @@ class SqlMetricInlineView(CompactCRUDMixin, CaravelModelView): # noqa } add_columns = edit_columns page_size = 500 + label_columns = { + 'metric_name': _("Metric"), + 'description': _("Description"), + 'verbose_name': _("Verbose Name"), + 'metric_type': _("Type"), + 'expression': _("SQL Expression"), + 'table': _("Table"), + } appbuilder.add_view_no_menu(SqlMetricInlineView) @@ -183,6 +217,14 @@ class DruidMetricInlineView(CompactCRUDMixin, CaravelModelView): # noqa "(http://druid.io/docs/latest/querying/post-aggregations.html)", True), } + label_columns = { + 'metric_name': _("Metric"), + 'description': _("Description"), + 'verbose_name': _("Verbose Name"), + 'metric_type': _("Type"), + 'json': _("JSON"), + 'datasource': _("Druid Datasource"), + } appbuilder.add_view_no_menu(DruidMetricInlineView) @@ -211,6 +253,15 @@ class DatabaseView(CaravelModelView, DeleteMixin): # noqa "(http://docs.sqlalchemy.org/en/rel_1_0/core/metadata.html" "#sqlalchemy.schema.MetaData) call. ", True), } + label_columns = { + 'database_name': _("Database"), + 'sql_link': _("SQL link"), + 'creator': _("Creator"), + 'changed_on_': _("Last Changed"), + 'sqlalchemy_uri': _("SQLAlchemy URI"), + 'cache_timeout': _("Cache Timeout"), + 'extra': _("Extra"), + } def pre_add(self, db): conn = sqla.engine.url.make_url(db.sqlalchemy_uri) @@ -253,6 +304,18 @@ class TableModelView(CaravelModelView, DeleteMixin): # noqa "Supports " "markdown"), } + label_columns = { + 'table_link': _("Table"), + 'changed_by_': _("Changed By"), + 'database': _("Database"), + 'changed_on_': _("Last Changed"), + 'sql_link': _("SQL Editor"), + 'is_featured': _("Is Featured"), + 'schema': _("Schema"), + 'default_endpoint': _("Default Endpoint"), + 'offset': _("Offset"), + 'cache_timeout': _("Cache Timeout"), + } def post_add(self, table): try: @@ -270,7 +333,7 @@ class TableModelView(CaravelModelView, DeleteMixin): # noqa appbuilder.add_view( TableModelView, - _("Tables"), + __("Tables"), category=_("Sources"), icon='fa-table',) @@ -287,12 +350,21 @@ class DruidClusterModelView(CaravelModelView, DeleteMixin): # noqa ] edit_columns = add_columns list_columns = ['cluster_name', 'metadata_last_refreshed'] + label_columns = { + 'cluster_name': _("Cluster"), + 'coordinator_host': _("Coordinator Host"), + 'coordinator_port': _("Coordinator Port"), + 'coordinator_endpoint': _("Coordinator Endpoint"), + 'broker_host': _("Broker Host"), + 'broker_port': _("Borker Port"), + 'broker_endpoint': _("Broker Endpoint"), + } if config['DRUID_IS_ACTIVE']: appbuilder.add_view( DruidClusterModelView, - _("Druid Clusters"), + __("Druid Clusters"), icon="fa-cubes", category=_("Sources"), category_icon='fa-database',) @@ -320,10 +392,24 @@ class SliceModelView(CaravelModelView, DeleteMixin): # noqa "markdown"), } base_filters = [['id', FilterSlice, lambda: []]] + label_columns = { + 'cache_timeout': _("Cache Timeout"), + 'creator': _("Creator"), + 'dashboards': _("Dashboards"), + 'datasource_link': _("Datasource"), + 'description': _("Description"), + 'modified': _("Last Modified"), + 'owners': _("Owners"), + 'params': _("Parameters"), + 'slice_link': _("Slice"), + 'slice_name': _("Name"), + 'table': _("Table"), + 'viz_type': _("Visualization Type"), + } appbuilder.add_view( SliceModelView, - _("Slices"), + __("Slices"), icon="fa-bar-chart", category="", category_icon='',) @@ -335,8 +421,9 @@ class SliceAsync(SliceModelView): # noqa 'creator', 'modified', 'icons'] label_columns = { 'icons': ' ', - 'viz_type': 'Type', - 'slice_link': 'Slice', + 'viz_type': _('Type'), + 'slice_link': _('Slice'), + 'viz_type': _('Visualization Type'), } appbuilder.add_view_no_menu(SliceAsync) @@ -360,9 +447,21 @@ class DashboardModelView(CaravelModelView, DeleteMixin): # noqa "The css for individual dashboards can be altered here, or " "in the dashboard view where changes are immediately " "visible"), - 'slug': "To get a readable URL for your dashboard", + 'slug': _("To get a readable URL for your dashboard"), } base_filters = [['slice', FilterDashboard, lambda: []]] + label_columns = { + 'dashboard_link': _("Dashboard"), + 'dashboard_title': _("Title"), + 'slug': _("Slug"), + 'slices': _("Slices"), + 'owners': _("Owners"), + 'creator': _("Creator"), + 'modified': _("Modified"), + 'position_json': _("Position JSON"), + 'css': _("CSS"), + 'json_metadata': _("JSON Metadata"), + } def pre_add(self, obj): obj.slug = obj.slug.strip() or None @@ -379,7 +478,6 @@ appbuilder.add_view( "Dashboards", label=_("Dashboards"), icon="fa-dashboard", - category="", category_icon='',) @@ -398,6 +496,12 @@ class LogModelView(CaravelModelView): list_columns = ('user', 'action', 'dttm') edit_columns = ('user', 'action', 'dttm', 'json') base_order = ('dttm', 'desc') + label_columns = { + 'user': _("User"), + 'action': _("Action"), + 'dttm': _("dttm"), + 'json': _("JSON"), + } appbuilder.add_view( LogModelView, @@ -420,11 +524,22 @@ class DruidDatasourceModelView(CaravelModelView, DeleteMixin): # noqa page_size = 500 base_order = ('datasource_name', 'asc') description_columns = { - 'offset': "Timezone offset (in hours) for this datasource", + 'offset': _("Timezone offset (in hours) for this datasource"), 'description': Markup( "Supports markdown"), } + label_columns = { + 'datasource_name': _("Data Source"), + 'cluster': _("Cluster"), + 'description': _("Description"), + 'owner': _("Owner"), + 'is_featured': _("Is Featured"), + 'is_hidden': _("Is Hidden"), + 'default_endpoint': _("Default Endpoint"), + 'offset': _("Time Offset"), + 'cache_timeout': _("Cache Timeout"), + } def post_add(self, datasource): datasource.generate_metrics() @@ -521,7 +636,7 @@ class Caravel(BaseView): .first() ) if not datasource: - flash(_("The datasource seems to have been deleted"), "alert") + flash(__("The datasource seems to have been deleted"), "alert") return redirect(error_redirect) all_datasource_access = self.appbuilder.sm.has_access( @@ -529,7 +644,7 @@ class Caravel(BaseView): datasource_access = self.appbuilder.sm.has_access( 'datasource_access', datasource.perm) if not (all_datasource_access or datasource_access): - flash(_("You don't seem to have access to this datasource"), "danger") + flash(__("You don't seem to have access to this datasource"), "danger") return redirect(error_redirect) action = request.args.get('action') diff --git a/caravel/viz.py b/caravel/viz.py index 3e15b1163..c5f4a2fc4 100644 --- a/caravel/viz.py +++ b/caravel/viz.py @@ -18,6 +18,7 @@ from datetime import datetime, timedelta import pandas as pd import numpy as np from flask import request, Markup +from flask.ext.babelpkg import lazy_gettext as _ from markdown import markdown from pandas.io.json import dumps from six import string_types @@ -320,7 +321,7 @@ class TableViz(BaseViz): """A basic html table that is sortable and searchable""" viz_type = "table" - verbose_name = "Table View" + verbose_name = _("Table View") credits = 'a Caravel original' fieldsets = ({ 'label': "GROUP BY", @@ -381,7 +382,7 @@ class PivotTableViz(BaseViz): """A pivot table view, define your rows, columns and metrics""" viz_type = "pivot_table" - verbose_name = "Pivot Table" + verbose_name = _("Pivot Table") credits = 'a Caravel original' is_timeseries = False fieldsets = ({ @@ -443,7 +444,7 @@ class MarkupViz(BaseViz): """Use html or markdown to create a free form widget""" viz_type = "markup" - verbose_name = "Markup Widget" + verbose_name = _("Markup") fieldsets = ({ 'label': None, 'fields': ('markup_type', 'code') @@ -471,7 +472,7 @@ class WordCloudViz(BaseViz): """ viz_type = "word_cloud" - verbose_name = "Word Cloud" + verbose_name = _("Word Cloud") is_timeseries = False fieldsets = ({ 'label': None, @@ -503,7 +504,7 @@ class TreemapViz(BaseViz): """Tree map visualisation for hierarchical data.""" viz_type = "treemap" - verbose_name = "Treemap" + verbose_name = _("Treemap") credits = 'd3.js' is_timeseries = False fieldsets = ({ @@ -547,7 +548,7 @@ class CalHeatmapViz(BaseViz): """Calendar heatmap.""" viz_type = "cal_heatmap" - verbose_name = "Calender Heatmap" + verbose_name = _("Calender Heatmap") credits = ( 'cal-heatmap') is_timeseries = True @@ -618,7 +619,7 @@ class BoxPlotViz(NVD3Viz): """Box plot viz from ND3""" viz_type = "box_plot" - verbose_name = "Box Plot" + verbose_name = _("Box Plot") sort_series = False is_timeseries = True fieldsets = ({ @@ -725,7 +726,7 @@ class BubbleViz(NVD3Viz): """Based on the NVD3 bubble chart""" viz_type = "bubble" - verbose_name = "Bubble Chart" + verbose_name = _("Bubble Chart") is_timeseries = False fieldsets = ({ 'label': None, @@ -793,7 +794,7 @@ class BigNumberViz(BaseViz): """Put emphasis on a single metric with this big number viz""" viz_type = "big_number" - verbose_name = "Big Number with Trendline" + verbose_name = _("Big Number with Trendline") credits = 'a Caravel original' is_timeseries = True fieldsets = ({ @@ -843,7 +844,7 @@ class BigNumberTotalViz(BaseViz): """Put emphasis on a single metric with this big number viz""" viz_type = "big_number_total" - verbose_name = "Big Number" + verbose_name = _("Big Number") credits = 'a Caravel original' is_timeseries = False fieldsets = ({ @@ -889,7 +890,7 @@ class NVD3TimeSeriesViz(NVD3Viz): """A rich line chart component with tons of options""" viz_type = "line" - verbose_name = "Time Series - Line Chart" + verbose_name = _("Time Series - Line Chart") sort_series = False is_timeseries = True fieldsets = ({ @@ -1041,7 +1042,7 @@ class NVD3TimeSeriesBarViz(NVD3TimeSeriesViz): viz_type = "bar" sort_series = True - verbose_name = "Time Series - Bar Chart" + verbose_name = _("Time Series - Bar Chart") fieldsets = [NVD3TimeSeriesViz.fieldsets[0]] + [{ 'label': 'Chart Options', 'fields': ( @@ -1059,7 +1060,7 @@ class NVD3CompareTimeSeriesViz(NVD3TimeSeriesViz): """A line chart component where you can compare the % change over time""" viz_type = 'compare' - verbose_name = "Time Series - Percent Change" + verbose_name = _("Time Series - Percent Change") class NVD3TimeSeriesStackedViz(NVD3TimeSeriesViz): @@ -1067,7 +1068,7 @@ class NVD3TimeSeriesStackedViz(NVD3TimeSeriesViz): """A rich stack area chart""" viz_type = "area" - verbose_name = "Time Series - Stacked" + verbose_name = _("Time Series - Stacked") sort_series = True fieldsets = [NVD3TimeSeriesViz.fieldsets[0]] + [{ 'label': 'Chart Options', @@ -1086,7 +1087,7 @@ class DistributionPieViz(NVD3Viz): """Annoy visualization snobs with this controversial pie chart""" viz_type = "pie" - verbose_name = "Distribution - NVD3 - Pie Chart" + verbose_name = _("Distribution - NVD3 - Pie Chart") is_timeseries = False fieldsets = ({ 'label': None, @@ -1122,7 +1123,7 @@ class DistributionBarViz(DistributionPieViz): """A good old bar chart""" viz_type = "dist_bar" - verbose_name = "Distribution - Bar Chart" + verbose_name = _("Distribution - Bar Chart") is_timeseries = False fieldsets = ({ 'label': 'Chart Options', @@ -1202,7 +1203,7 @@ class SunburstViz(BaseViz): """A multi level sunburst chart""" viz_type = "sunburst" - verbose_name = "Sunburst" + verbose_name = _("Sunburst") is_timeseries = False credits = ( 'Kerry Rodden ' @@ -1268,7 +1269,7 @@ class SankeyViz(BaseViz): """A Sankey diagram that requires a parent-child dataset""" viz_type = "sankey" - verbose_name = "Sankey" + verbose_name = _("Sankey") is_timeseries = False credits = 'd3-sankey on npm' fieldsets = ({ @@ -1332,7 +1333,7 @@ class DirectedForceViz(BaseViz): """An animated directed force layout graph visualization""" viz_type = "directed_force" - verbose_name = "Directed Force Layout" + verbose_name = _("Directed Force Layout") credits = 'd3noob @bl.ocks.org' is_timeseries = False fieldsets = ({ @@ -1374,7 +1375,7 @@ class WorldMapViz(BaseViz): """A country centric world map""" viz_type = "world_map" - verbose_name = "World Map" + verbose_name = _("World Map") is_timeseries = False credits = 'datamaps on npm' fieldsets = ({ @@ -1448,7 +1449,7 @@ class FilterBoxViz(BaseViz): """A multi filter, multi-choice filter box to make dashboards interactive""" viz_type = "filter_box" - verbose_name = "Filters" + verbose_name = _("Filters") is_timeseries = False credits = 'a Caravel original' fieldsets = ({ @@ -1496,7 +1497,7 @@ class IFrameViz(BaseViz): """You can squeeze just about anything in this iFrame component""" viz_type = "iframe" - verbose_name = "iFrame" + verbose_name = _("iFrame") credits = 'a Caravel original' is_timeseries = False fieldsets = ({ @@ -1514,7 +1515,7 @@ class ParallelCoordinatesViz(BaseViz): """ viz_type = "para" - verbose_name = "Parallel Coordinates" + verbose_name = _("Parallel Coordinates") credits = ( '' 'Syntagmatic\'s library') @@ -1550,7 +1551,7 @@ class HeatmapViz(BaseViz): """A nice heatmap visualization that support high density through canvas""" viz_type = "heatmap" - verbose_name = "Heatmap" + verbose_name = _("Heatmap") is_timeseries = False credits = ( 'inspired from mbostock @' @@ -1618,7 +1619,7 @@ class HorizonViz(NVD3TimeSeriesViz): """ viz_type = "horizon" - verbose_name = "Horizon Charts" + verbose_name = _("Horizon Charts") credits = ( '' 'd3-horizon-chart') diff --git a/setup.py b/setup.py index 61cd097ed..9a96d4841 100644 --- a/setup.py +++ b/setup.py @@ -18,7 +18,7 @@ setup( 'alembic>=0.8.5, <0.9.0', 'babel==2.3.4', 'cryptography>=1.1.1, <2.0.0', - 'flask-appbuilder>=1.6.0, <2.0.0', + 'flask-appbuilder>=1.6.2, <2.0.0', 'Flask-BabelPkg==0.9.6', 'flask-cache>=0.13.1, <0.14.0', 'flask-migrate>=1.5.1, <2.0.0',