Răsfoiți Sursa

[notebook] Move Notebook specific code out of Spark app

Romain Rigaux 10 ani în urmă
părinte
comite
5743aa9906
38 a modificat fișierele cu 5271 adăugiri și 1614 ștergeri
  1. 0 21
      apps/spark/src/spark/conf.py
  2. 0 115
      apps/spark/src/spark/design.py
  3. 0 521
      apps/spark/src/spark/models.py
  4. 1 32
      apps/spark/src/spark/urls.py
  5. 0 155
      apps/spark/src/spark/views.py
  6. 2 2
      desktop/core/src/desktop/models.py
  7. 2 2
      desktop/core/src/desktop/templates/common_header.mako
  8. 1 1
      desktop/core/src/desktop/views.py
  9. 3 3
      desktop/libs/notebook/src/notebook/api.py
  10. 27 0
      desktop/libs/notebook/src/notebook/conf.py
  11. 0 0
      desktop/libs/notebook/src/notebook/data_export.py
  12. 3 2
      desktop/libs/notebook/src/notebook/decorators.py
  13. 0 0
      desktop/libs/notebook/src/notebook/fixtures/initial_spark_examples.json
  14. 482 64
      desktop/libs/notebook/src/notebook/locale/de/LC_MESSAGES/django.po
  15. 300 63
      desktop/libs/notebook/src/notebook/locale/en/LC_MESSAGES/django.po
  16. 330 3
      desktop/libs/notebook/src/notebook/locale/en_US.pot
  17. 479 61
      desktop/libs/notebook/src/notebook/locale/es/LC_MESSAGES/django.po
  18. 481 63
      desktop/libs/notebook/src/notebook/locale/fr/LC_MESSAGES/django.po
  19. 481 63
      desktop/libs/notebook/src/notebook/locale/ja/LC_MESSAGES/django.po
  20. 480 62
      desktop/libs/notebook/src/notebook/locale/ko/LC_MESSAGES/django.po
  21. 480 62
      desktop/libs/notebook/src/notebook/locale/pt/LC_MESSAGES/django.po
  22. 481 63
      desktop/libs/notebook/src/notebook/locale/pt_BR/LC_MESSAGES/django.po
  23. 482 64
      desktop/libs/notebook/src/notebook/locale/zh_CN/LC_MESSAGES/django.po
  24. 0 0
      desktop/libs/notebook/src/notebook/management/commands/notebook_setup.py
  25. 20 0
      desktop/libs/notebook/src/notebook/migrations/0001_initial.py
  26. 0 0
      desktop/libs/notebook/src/notebook/migrations/__init__.py
  27. 523 0
      desktop/libs/notebook/src/notebook/models.py
  28. BIN
      desktop/libs/notebook/src/notebook/static/notebook/art/icon_notebook_24.png
  29. 0 167
      desktop/libs/notebook/src/notebook/static/notebook/css/admin.css
  30. 0 0
      desktop/libs/notebook/src/notebook/static/notebook/css/notebook.css
  31. 0 0
      desktop/libs/notebook/src/notebook/static/notebook/js/assist.js
  32. 11 11
      desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js
  33. 1 1
      desktop/libs/notebook/src/notebook/templates/editor.mako
  34. 8 8
      desktop/libs/notebook/src/notebook/templates/editor_components.mako
  35. 1 1
      desktop/libs/notebook/src/notebook/templates/notebook.mako
  36. 4 4
      desktop/libs/notebook/src/notebook/templates/notebooks.mako
  37. 32 0
      desktop/libs/notebook/src/notebook/urls.py
  38. 156 0
      desktop/libs/notebook/src/notebook/views.py

+ 0 - 21
apps/spark/src/spark/conf.py

@@ -15,7 +15,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-import json
 import logging
 import os
 import sys
@@ -29,26 +28,6 @@ from spark.settings import NICE_NAME
 LOG = logging.getLogger(__name__)
 
 
-def coerce_json(j):
-  return json.loads(j)
-
-
-LANGUAGES = Config(
-  key="languages",
-  help=_t("List of available types of snippets."),
-  type=coerce_json,
-  default="""[
-      {"name": "Scala", "type": "spark"},
-      {"name": "PySpark", "type": "pyspark"},
-      {"name": "R", "type": "r"},
-      {"name": "Impala", "type": "impala"},
-      {"name": "Hive", "type": "hive"},
-      {"name": "Jar", "type": "jar"},
-      {"name": "Python", "type": "py"},
-      {"name": "Text", "type": "text"}
-  ]"""
-)
-
 LIVY_ASSEMBLY_JAR = Config(
   key="livy_assembly_jar",
   help=_t("Path to livy-assembly.jar"),

+ 0 - 115
apps/spark/src/spark/design.py

@@ -1,115 +0,0 @@
-#!/usr/bin/env python
-# Licensed to Cloudera, Inc. under one
-# or more contributor license agreements.  See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership.  Cloudera, Inc. licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License.  You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import json
-import logging
-
-import django.http
-from django.utils.translation import ugettext as _
-
-from beeswax.design import normalize_form_dict, denormalize_form_dict
-
-
-LOG = logging.getLogger(__name__)
-
-SERIALIZATION_VERSION = "1.0"
-
-
-class SparkDesign(object):
-  _QUERY_ATTRS = ['type', 'appName', 'classPath', 'autoContext', 'context', 'params']
-
-  def __init__(self, form=None, query_type=None):
-    if form is not None:
-      self._data_dict = {'query': normalize_form_dict(form, SparkDesign._QUERY_ATTRS)}
-      if query_type is not None:
-        self._data_dict['query']['type'] = query_type
-
-  def dumps(self):
-    """Returns the serialized form of the design in a string"""
-    dic = self._data_dict.copy()
-    dic['VERSION'] = SERIALIZATION_VERSION
-    return json.dumps(dic)
-
-  @property
-  def query(self):
-    return self._data_dict['query'].copy()
-
-  @property
-  def appName(self):
-    return self._data_dict['query']['appName']
-
-  @property
-  def classPath(self):
-    return self._data_dict['query']['classPath']
-
-  @property
-  def autoContext(self):
-    return self._data_dict['query']['autoContext']
-
-  @property
-  def context(self):
-    return self._data_dict['query']['context']
-
-  @property
-  def params(self):
-    return self._data_dict['query']['params']
-
-  def get_query_dict(self):
-    # We construct the form to use its structure and prefix. We don't actually bind data to the forms.
-    from beeswax.forms import QueryForm
-    mform = QueryForm()
-    mform.bind()
-
-    res = django.http.QueryDict('', mutable=True)
-    res.update(denormalize_form_dict(self._data_dict['query'], mform.query, SparkDesign._QUERY_ATTRS))
-    return res
-
-  @staticmethod
-  def loads(data):
-    if data:
-      dic = json.loads(data)
-      dic = dict(map(lambda k: (str(k), dic.get(k)), dic.keys()))
-    else:
-      dic = {
-          'VERSION': SERIALIZATION_VERSION,
-          'query': {
-              'type': 3, 'appName': '', 'classPath': 'spark.jobserver.WordCountExample', 'autoContext': True, 'context': '',
-              'params': json.dumps([])
-          }
-      }
-
-    if dic['VERSION'] != SERIALIZATION_VERSION:
-      LOG.error('Design version mismatch. Found %s; expect %s' % (dic['VERSION'], SERIALIZATION_VERSION))
-
-    # Convert to latest version
-    del dic['VERSION']
-    if 'type' not in dic['query'] or dic['query']['type'] is None:
-      dic['query']['type'] = 0
-    if 'appName' not in dic['query']:
-      dic['query']['appName'] = ''
-    if 'classPath' not in dic['query']:
-      dic['query']['classPath'] = ''
-    if 'autoContext' not in dic['query']:
-      dic['query']['autoContext'] = True
-    if 'context' not in dic['query']:
-      dic['query']['context'] = ''
-    if 'params' not in dic['query']:
-      dic['query']['params'] = json.dumps([])
-
-    design = SparkDesign()
-    design._data_dict = dic
-    return design

+ 0 - 521
apps/spark/src/spark/models.py

@@ -14,524 +14,3 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
-import json
-import logging
-import re
-import time
-
-from django.utils.translation import ugettext as _
-
-from desktop.lib.exceptions_renderable import PopupException
-from desktop.lib.i18n import force_unicode
-
-from beeswax import data_export
-from beeswax.design import hql_query
-from beeswax import conf as beeswax_conf
-from beeswax.models import QUERY_TYPES, HiveServerQueryHandle, QueryHistory, HiveServerQueryHistory
-from beeswax.server import dbms
-from beeswax.server.dbms import get_query_server_config, QueryServerException
-from beeswax.views import _parse_out_hadoop_jobs
-
-from spark.job_server_api import get_api as get_spark_api
-from spark.data_export import download as spark_download
-from desktop.lib.rest.http_client import RestException
-
-
-LOG = logging.getLogger(__name__)
-
-
-# To move to Editor API
-class SessionExpired(Exception):
-  pass
-
-
-class QueryExpired(Exception):
-  pass
-
-
-class QueryError(Exception):
-  def __init__(self, message):
-    self.message = message
-
-  def __str__(self):
-    return force_unicode(str(self.message))
-
-
-class Notebook():
-
-  def __init__(self, document=None):
-    self.document = None
-
-    if document is not None:
-      self.data = document.data
-      self.document = document
-    else:
-      self.data = json.dumps({
-          'name': 'My Notebook',
-          'description': '',
-          'snippets': []
-      })
-
-  def get_json(self):
-    _data = self.get_data()
-
-    return json.dumps(_data)
-
-  def get_data(self):
-    _data = json.loads(self.data)
-
-    if self.document is not None:
-      _data['id'] = self.document.id
-
-    return _data
-
-  def get_str(self):
-    return '\n\n'.join([snippet['statement_raw'] for snippet in self.get_data()['snippets']])
-
-
-def get_api(user, snippet):
-  if snippet['type'] in ('hive', 'impala', 'spark-sql'):
-    return HS2Api(user)
-  elif snippet['type'] in ('jar', 'py'):
-    return SparkBatchApi(user)
-  elif snippet['type'] == 'text':
-    return TextApi(user)
-  else:
-    return SparkApi(user)
-
-
-def _get_snippet_session(notebook, snippet):
-  return [session for session in notebook['sessions'] if session['type'] == snippet['type']][0]
-
-
-# Base API
-
-class Api(object):
-
-  def __init__(self, user):
-    self.user = user
-
-  def create_session(self, lang, properties=None):
-    return {
-        'type': lang,
-        'id': None,
-        'properties': []
-    }
-
-  def close_session(self, session):
-    pass
-
-
-# Text
-
-class TextApi(Api):
-
-  pass
-
-
-# HS2
-
-def query_error_handler(func):
-  def decorator(*args, **kwargs):
-    try:
-      return func(*args, **kwargs)
-    except QueryServerException, e:
-      message = force_unicode(str(e))
-      if 'Invalid query handle' in message or 'Invalid OperationHandle' in message:
-        raise QueryExpired(e)
-      else:
-        raise QueryError(message)
-  return decorator
-
-
-class HS2Api(Api):
-
-  def _get_handle(self, snippet):
-    snippet['result']['handle']['secret'], snippet['result']['handle']['guid'] = HiveServerQueryHandle.get_decoded(snippet['result']['handle']['secret'], snippet['result']['handle']['guid'])
-    return HiveServerQueryHandle(**snippet['result']['handle'])
-
-  def _get_db(self, snippet):
-    if snippet['type'] == 'hive':
-      name = 'beeswax'
-    elif snippet['type'] == 'impala':
-      name = 'impala'
-    else:
-      name = 'spark-sql'
-
-    return dbms.get(self.user, query_server=get_query_server_config(name=name))
-
-  def execute(self, notebook, snippet):
-    db = self._get_db(snippet)
-    query = hql_query(snippet['statement'], QUERY_TYPES[0])
-
-    try:
-      handle = db.client.query(query)
-    except QueryServerException, ex:
-      raise QueryError(ex.message)
-
-    # All good
-    server_id, server_guid  = handle.get()
-    return {
-        'secret': server_id,
-        'guid': server_guid,
-        'operation_type': handle.operation_type,
-        'has_result_set': handle.has_result_set,
-        'modified_row_count': handle.modified_row_count,
-        'log_context': handle.log_context
-    }
-
-  @query_error_handler
-  def check_status(self, notebook, snippet):
-    response = {}
-    db = self._get_db(snippet)
-
-    handle = self._get_handle(snippet)
-    operation = db.get_operation_status(handle)
-    status = HiveServerQueryHistory.STATE_MAP[operation.operationState]
-
-    if status.index in (QueryHistory.STATE.failed.index, QueryHistory.STATE.expired.index):
-      raise QueryError(operation.errorMessage)
-
-    response['status'] = 'running' if status.index in (QueryHistory.STATE.running.index, QueryHistory.STATE.submitted.index) else 'available'
-
-    return response
-
-  @query_error_handler
-  def fetch_result(self, notebook, snippet, rows, start_over):
-    db = self._get_db(snippet)
-
-    handle = self._get_handle(snippet)
-    results = db.fetch(handle, start_over=start_over, rows=rows)
-
-    # No escaping...
-    return {
-        'has_more': results.has_more,
-        'data': list(results.rows()),
-        'meta': [{
-          'name': column.name,
-          'type': column.type,
-          'comment': column.comment
-        } for column in results.data_table.cols()],
-        'type': 'table'
-    }
-
-  @query_error_handler
-  def fetch_result_metadata(self):
-    pass
-
-  @query_error_handler
-  def cancel(self, notebook, snippet):
-    db = self._get_db(snippet)
-
-    handle = self._get_handle(snippet)
-    db.cancel_operation(handle)
-    return {'status': 0}
-
-  @query_error_handler
-  def get_log(self, notebook, snippet, startFrom=None, size=None):
-    db = self._get_db(snippet)
-
-    handle = self._get_handle(snippet)
-    return db.get_log(handle, start_over=startFrom == 0)
-
-  def download(self, notebook, snippet, format):
-    try:
-      db = self._get_db(snippet)
-      handle = self._get_handle(snippet)
-      return data_export.download(handle, format, db)
-    except Exception, e:
-      LOG.exception('error downloading notebook')
-
-      if not hasattr(e, 'message') or not e.message:
-        message = e
-      else:
-        message = e.message
-      raise PopupException(message, detail='')
-
-  def _progress(self, snippet, logs):
-    if snippet['type'] == 'hive':
-      match = re.search('Total jobs = (\d+)', logs, re.MULTILINE)
-      total = (int(match.group(1)) if match else 1) * 2
-
-      started = logs.count('Starting Job')
-      ended = logs.count('Ended Job')
-
-      return int((started + ended) * 100 / total)
-    elif snippet['type'] == 'impala':
-      match = re.search('(\d+)% Complete', logs, re.MULTILINE)
-      return int(match.group(1)) if match else 0
-    else:
-      return 50
-
-  @query_error_handler
-  def close_statement(self, snippet):
-    if snippet['type'] == 'impala':
-      from impala import conf as impala_conf
-
-    if (snippet['type'] == 'hive' and beeswax_conf.CLOSE_QUERIES.get()) or (snippet['type'] == 'impala' and impala_conf.CLOSE_QUERIES.get()):
-      db = self._get_db(snippet)
-
-      handle = self._get_handle(snippet)
-      db.close_operation(handle)
-      return {'status': 0}
-    else:
-      return {'status': -1}  # skipped
-
-  def _get_jobs(self, log):
-    return _parse_out_hadoop_jobs(log)
-
-
-# Spark
-
-class SparkApi(Api):
-  PROPERTIES = [
-    {'name': 'jars', 'nice_name': _('Jars'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': False},
-    {'name': 'files', 'nice_name': _('Files'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': False},
-    {'name': 'pyFiles', 'nice_name': _('pyFiles'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': False},
-
-    {'name': 'driverMemory', 'nice_name': _('Driver Memory'), 'default': '1', 'type': 'jvm', 'is_yarn': False},
-
-    {'name': 'driverCores', 'nice_name': _('Driver Cores'), 'default': '1', 'type': 'number', 'is_yarn': True},
-    {'name': 'executorCores', 'nice_name': _('Executor Cores'), 'default': '1', 'type': 'number', 'is_yarn': True},
-    {'name': 'queue', 'nice_name': _('Queue'), 'default': '1', 'type': 'string', 'is_yarn': True},
-    {'name': 'archives', 'nice_name': _('Archives'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': True},
-    {'name': 'numExecutors', 'nice_name': _('Executors Numbers'), 'default': '1', 'type': 'number', 'is_yarn': True},
-  ]
-
-  def create_session(self, lang='scala', properties=None):
-    properties = dict([(p['name'], p['value']) for p in properties]) if properties is not None else {}
-
-    properties['kind'] = lang
-
-    api = get_spark_api(self.user)
-
-    response = api.create_session(**properties)
-
-    status = api.get_session(response['id'])
-    count = 0
-
-    while status['state'] == 'starting' and count < 120:
-      status = api.get_session(response['id'])
-      count += 1
-      time.sleep(1)
-
-    if status['state'] != 'idle':
-      info = '\n'.join(status['log']) if status['log'] else 'timeout'
-      raise QueryError(_('The Spark session could not be created in the cluster: %s') % info)
-
-    return {
-        'type': lang,
-        'id': response['id'],
-        'properties': []
-    }
-
-  def execute(self, notebook, snippet):
-    api = get_spark_api(self.user)
-    session = _get_snippet_session(notebook, snippet)
-
-    try:
-      response = api.submit_statement(session['id'], snippet['statement'])
-      return {
-          'id': response['id'],
-          'has_result_set': True,
-      }
-    except Exception, e:
-      message = force_unicode(str(e)).lower()
-      if 'session not found' in message or 'connection refused' in message or 'session is in state busy' in message:
-        raise SessionExpired(e)
-      else:
-        raise e
-
-  def check_status(self, notebook, snippet):
-    api = get_spark_api(self.user)
-    session = _get_snippet_session(notebook, snippet)
-    cell = snippet['result']['handle']['id']
-
-    try:
-      response = api.fetch_data(session['id'], cell)
-      return {
-          'status': response['state'],
-      }
-    except Exception, e:
-      message = force_unicode(str(e)).lower()
-      if 'session not found' in message:
-        raise SessionExpired(e)
-      else:
-        raise e
-
-  def fetch_result(self, notebook, snippet, rows, start_over):
-    api = get_spark_api(self.user)
-    session = _get_snippet_session(notebook, snippet)
-    cell = snippet['result']['handle']['id']
-
-    try:
-      response = api.fetch_data(session['id'], cell)
-    except Exception, e:
-      message = force_unicode(str(e)).lower()
-      if 'session not found' in message:
-        raise SessionExpired(e)
-      else:
-        raise e
-
-    content = response['output']
-
-    if content['status'] == 'ok':
-      data = content['data']
-      images = []
-
-      try:
-        table = data['application/vnd.livy.table.v1+json']
-      except KeyError:
-        try:
-          images = [data['image/png']]
-        except KeyError:
-          images = []
-        data = [[data['text/plain']]]
-        meta = [{'name': 'Header', 'type': 'STRING_TYPE', 'comment': ''}]
-        type = 'text'
-      else:
-        data = table['data']
-        headers = table['headers']
-        meta = [{'name': h['name'], 'type': h['type'], 'comment': ''} for h in headers]
-        type = 'table'
-
-      # Non start_over not supported
-      if not start_over:
-        data = []
-
-      return {
-          'data': data,
-          'images': images,
-          'meta': meta,
-          'type': type
-      }
-    elif content['status'] == 'error':
-      tb = content.get('traceback', None)
-
-      if tb is None:
-        msg = content.get('ename', 'unknown error')
-
-        evalue = content.get('evalue')
-        if evalue is not None:
-          msg = '%s: %s' % (msg, evalue)
-      else:
-        msg = ''.join(tb)
-
-      raise QueryError(msg)
-
-  def download(self, notebook, snippet, format):
-    try:
-      api = get_spark_api(self.user)
-      session = _get_snippet_session(notebook, snippet)
-      cell = snippet['result']['handle']['id']
-
-      return spark_download(api, session['id'], cell, format)
-    except Exception, e:
-      raise PopupException(e)
-
-  def cancel(self, notebook, snippet):
-    api = get_spark_api(self.user)
-    session = _get_snippet_session(notebook, snippet)
-    response = api.cancel(session['id'])
-
-    return {'status': 0}
-
-  def get_log(self, notebook, snippet, startFrom=0, size=None):
-    api = get_spark_api(self.user)
-    session = _get_snippet_session(notebook, snippet)
-
-    return api.get_log(session['id'], startFrom=startFrom, size=size)
-
-  def _progress(self, snippet, logs):
-    return 50
-
-  def close_statement(self, snippet): # Individual statements cannot be closed
-    pass
-
-  def close_session(self, session):
-    api = get_spark_api(self.user)
-
-    if session['id'] is not None:
-      try:
-        api.close(session['id'])
-        return {
-          'session': session['id'],
-          'status': 0
-        }
-      except RestException, e:
-        if e.code == 404 or e.code == 500: # TODO remove the 500
-          raise SessionExpired(e)
-    else:
-      return {'status': -1}
-
-  def _get_jobs(self, log):
-    return []
-
-
-class SparkBatchApi(Api):
-
-  def create_session(self, lang, properties=None):
-    return {
-        'type': lang,
-        'id': None
-    }
-
-  def execute(self, notebook, snippet):
-    api = get_spark_api(self.user)
-
-    properties = {
-        'file': snippet['properties'].get('app_jar'),
-        'className': snippet['properties'].get('class'),
-        'args': snippet['properties'].get('arguments'),
-        'pyFiles': snippet['properties'].get('py_file'),
-        # files
-        # driverMemory
-        # driverCores
-        # executorMemory
-        # executorCores
-        # archives
-    }
-
-    response = api.submit_batch(properties)
-    return {
-        'id': response['id'],
-        'has_result_set': True,
-        'properties': []
-    }
-
-  def check_status(self, notebook, snippet):
-    api = get_spark_api(self.user)
-
-    state = api.get_batch_status(snippet['result']['handle']['id'])
-    return {
-        'status': state,
-    }
-
-  def get_log(self, notebook, snippet, startFrom=0, size=None):
-    api = get_spark_api(self.user)
-
-    return api.get_batch_log(snippet['result']['handle']['id'], startFrom=startFrom, size=size)
-
-  def close_statement(self, snippet):
-    api = get_spark_api(self.user)
-
-    session_id = snippet['result']['handle']['id']
-    if session_id is not None:
-      api.close_batch(session_id)
-      return {
-        'session': session_id,
-        'status': 0
-      }
-    else:
-      return {'status': -1}  # skipped
-
-  def cancel(self, notebook, snippet):
-    # Batch jobs do not support interruption, so close statement instead.
-    return self.close_statement(snippet)
-
-  def _progress(self, snippet, logs):
-    return 50
-
-  def _get_jobs(self, log):
-    return []

+ 1 - 32
apps/spark/src/spark/urls.py

@@ -15,7 +15,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from django.conf.urls import patterns, url
 
 # FIXME: This could be replaced with hooking into the `AppConfig.ready()`
 # signal in Django 1.7:
@@ -27,34 +26,4 @@ from django.conf.urls import patterns, url
 import spark.monkey_patches
 
 
-# Views
-urlpatterns = patterns('spark.views',
-  url(r'^$', 'notebook', name='index'),
-  url(r'^notebook$', 'notebook', name='notebook'),
-  url(r'^notebooks$', 'notebooks', name='notebooks'),
-  url(r'^new$', 'new', name='new'),
-  url(r'^download$', 'download', name='download'),
-  url(r'^install_examples$', 'install_examples', name='install_examples'),
-  url(r'^delete$', 'delete', name='delete'),
-  url(r'^copy$', 'copy', name='copy'),
-
-  url(r'^editor$', 'editor', name='editor'),
-)
-
-# APIs
-urlpatterns += patterns('spark.api',
-  url(r'^api/create_session$', 'create_session', name='create_session'),
-  url(r'^api/close_session$', 'close_session', name='close_session'),
-  url(r'^api/execute$', 'execute', name='execute'),
-  url(r'^api/check_status$', 'check_status', name='check_status'),
-  url(r'^api/fetch_result_data$', 'fetch_result_data', name='fetch_result_data'),
-  url(r'^api/fetch_result_metadata$', 'fetch_result_metadata', name='fetch_result_metadata'),
-  url(r'^api/cancel_statement', 'cancel_statement', name='cancel_statement'),
-  url(r'^api/close_statement', 'close_statement', name='close_statement'),
-  url(r'^api/get_logs', 'get_logs', name='get_logs'),
-
-  url(r'^api/notebook/save$', 'save_notebook', name='save_notebook'),
-  url(r'^api/notebook/open$', 'open_notebook', name='open_notebook'),
-  url(r'^api/notebook/close$', 'close_notebook', name='close_notebook'),
-)
-
+urlpatterns = ()

+ 0 - 155
apps/spark/src/spark/views.py

@@ -14,158 +14,3 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
-
-import json
-import logging
-
-from django.core.urlresolvers import reverse
-from django.utils.translation import ugettext as _
-
-from desktop.lib.django_util import render, JsonResponse
-from desktop.lib.json_utils import JSONEncoderForHTML
-from desktop.models import Document2, Document
-
-from spark.conf import LANGUAGES, LIVY_SERVER_SESSION_KIND
-from spark.decorators import check_document_access_permission,\
-  check_document_modify_permission
-from spark.models import Notebook, get_api, SparkApi
-from spark.management.commands.spark_setup import Command
-
-
-LOG = logging.getLogger(__name__)
-
-
-@check_document_access_permission()
-def notebook(request):
-  notebook_id = request.GET.get('notebook')
-
-  if notebook_id:
-    notebook = Notebook(document=Document2.objects.get(id=notebook_id))
-  else:
-    notebook = Notebook()
-
-  autocomplete_base_url = ''
-  try:
-    autocomplete_base_url = reverse('beeswax:api_autocomplete_databases', kwargs={})
-  except:
-    LOG.exception('failed to get autocomplete base url')
-
-  return render('notebook.mako', request, {
-      'notebooks_json': json.dumps([notebook.get_data()]),
-      'options_json': json.dumps({
-          'languages': LANGUAGES.get(),
-          'snippet_placeholders' : {
-              'spark': _('Example: 1 + 1, or press CTRL + space'),
-              'pyspark': _('Example: 1 + 1, or press CTRL + space'),
-              'impala': _('Example: SELECT * FROM tablename, or press CTRL + space'),
-              'hive': _('Example: SELECT * FROM tablename, or press CTRL + space'),
-              'r': _('Example: 1 + 1, or press CTRL + space')
-          },
-          'session_properties': SparkApi.PROPERTIES
-      }),
-      'autocomplete_base_url': autocomplete_base_url,
-      'is_yarn_mode': LIVY_SERVER_SESSION_KIND.get()
-  })
-
-
-@check_document_access_permission()
-def editor(request):
-  editor_id = request.GET.get('editor')
-
-  if editor_id:
-    editor = Notebook(document=Document2.objects.get(id=editor_id))
-  else:
-    editor = Notebook()
-    data = editor.get_data()
-    data['name'] = 'Hive SQL Editor'
-    data['snippets'] = json.loads('[{"id":"c111cbb4-f475-4050-c5a1-02df6c31e3d8","name":"","type":"hive","editorMode":"text/x-hiveql","statement_raw":"Example: SELECT * FROM tablename, or press CTRL + space","codemirrorSize":100,"status":"ready","properties":{"settings":[],"files":[]},"variables":[],"variableNames":[],"statement":"Example: SELECT * FROM tablename, or press CTRL + space","result":{"id":"149347d9-3ae7-8d06-4cc8-d4bce5e72dc8","type":"table","hasResultset":true,"handle":{},"meta":[],"cleanedMeta":[],"fetchedOnce":false,"startTime":"2015-07-17T20:38:21.970Z","endTime":"2015-07-17T20:38:21.970Z","executionTime":0,"cleanedNumericMeta":[],"cleanedStringMeta":[],"cleanedDateTimeMeta":[],"data":[],"logs":"","logLines":0,"errors":"","hasSomeResults":false},"showGrid":true,"showChart":false,"showLogs":false,"progress":0,"size":12,"offset":0,"isLoading":false,"klass":"snippet card card-widget","editorKlass":"editor span12","resultsKlass":"results hive","errorsKlass":"results hive alert alert-error","chartType":"bars","chartSorting":"none","chartYMulti":[],"chartData":[],"tempChartOptions":{},"isLeftPanelVisible":false,"codeVisible":true,"settingsVisible":false,"checkStatusTimeout":null}]')
-    editor.data = json.dumps(data)
-
-  autocomplete_base_url = ''
-  try:
-    autocomplete_base_url = reverse('beeswax:api_autocomplete_databases', kwargs={})
-  except:
-    LOG.exception('failed to get autocomplete base url')
-
-  return render('editor.mako', request, {
-      'notebooks_json': json.dumps([editor.get_data()]),
-      'options_json': json.dumps({
-          'languages': [{"name": "Hive SQL", "type": "hive"}],
-          'snippet_placeholders' : {
-              'scala': _('Example: 1 + 1, or press CTRL + space'),
-              'python': _('Example: 1 + 1, or press CTRL + space'),
-              'impala': _('Example: SELECT * FROM tablename, or press CTRL + space'),
-              'hive': _('Example: SELECT * FROM tablename, or press CTRL + space'),
-              'text': _('<h2>This is a text snippet</h2>Type your text here')
-          }
-      }),
-      'autocomplete_base_url': autocomplete_base_url,
-  })
-
-
-def new(request):
-  return notebook(request)
-
-
-def notebooks(request):
-  notebooks = [d.content_object.to_dict() for d in Document.objects.get_docs(request.user, Document2, extra='notebook')]
-
-  return render('notebooks.mako', request, {
-      'notebooks_json': json.dumps(notebooks, cls=JSONEncoderForHTML)
-  })
-
-
-@check_document_modify_permission()
-def delete(request):
-  notebooks = json.loads(request.POST.get('notebooks', '[]'))
-
-  for notebook in notebooks:
-    doc2 = Document2.objects.get(uuid=notebook['uuid'])
-    doc = doc2.doc.get()
-    doc.can_write_or_exception(request.user)
-
-    doc.delete()
-    doc2.delete()
-
-  return JsonResponse({})
-
-
-@check_document_access_permission()
-def copy(request):
-  notebooks = json.loads(request.POST.get('notebooks', '[]'))
-
-  for notebook in notebooks:
-    doc2 = Document2.objects.get(uuid=notebook['uuid'])
-    doc = doc2.doc.get()
-
-    name = doc2.name + '-copy'
-    doc2 = doc2.copy(name=name, owner=request.user)
-
-    doc.copy(content_object=doc2, name=name, owner=request.user)
-
-  return JsonResponse({})
-
-
-@check_document_access_permission()
-def download(request):
-  notebook = json.loads(request.POST.get('notebook', '{}'))
-  snippet = json.loads(request.POST.get('snippet', '{}'))
-  file_format = request.POST.get('format', 'csv')
-
-  return get_api(request.user, snippet).download(notebook, snippet, file_format)
-
-
-def install_examples(request):
-  response = {'status': -1, 'message': ''}
-
-  if request.method == 'POST':
-    try:
-      Command().handle(user=request.user)
-      response['status'] = 0
-    except Exception, err:
-      LOG.exception(err)
-      response['message'] = str(err)
-  else:
-    response['message'] = _('A POST request is required.')
-
-  return JsonResponse(response)

+ 2 - 2
desktop/core/src/desktop/models.py

@@ -569,7 +569,7 @@ class Document(models.Model):
       elif self.extra == 'bundle2':
         return staticfiles_storage.url('oozie/art/icon_oozie_bundle_48.png')
       elif self.extra == 'notebook':
-        return staticfiles_storage.url('spark/art/icon_spark_48.png')
+        return staticfiles_storage.url('notebook/art/icon_spark_48.png')
       elif self.extra.startswith('search'):
         return staticfiles_storage.url('search/art/icon_search_48.png')
       elif self.content_type.app_label == 'beeswax':
@@ -793,7 +793,7 @@ class Document2(models.Model):
     elif self.type == 'oozie-bundle2':
       return reverse('oozie:edit_bundle') + '?bundle=' + str(self.id)
     elif self.type == 'notebook':
-      return reverse('spark:notebook') + '?notebook=' + str(self.id)
+      return reverse('notebook:notebook') + '?notebook=' + str(self.id)
     elif self.type == 'search-dashboard':
       return reverse('search:index') + '?collection=' + str(self.id)
     else:

+ 2 - 2
desktop/core/src/desktop/templates/common_header.mako

@@ -431,8 +431,8 @@ from django.utils.translation import ugettext as _
              <li class="dropdown-submenu">
                <a href="/${apps['spark'].display_name}"><img src="${ static(apps['spark'].icon_path) }" class="app-icon"/> ${_('Spark (beta)')}</a>
                <ul class="dropdown-menu">
-                 <li><a href="${ url('spark:new') }"><i class="fa fa-fw fa-plus" style="vertical-align: middle"></i>${_('Notebook')}</a></li>
-                 <li><a href="${ url('spark:notebooks') }"><i class="fa fa-fw fa-tags" style="vertical-align: middle"></i>${_('Notebooks')}</a></li>
+                 <li><a href="${ url('notebook:new') }"><i class="fa fa-fw fa-plus" style="vertical-align: middle"></i>${_('Notebook')}</a></li>
+                 <li><a href="${ url('notebook:notebooks') }"><i class="fa fa-fw fa-tags" style="vertical-align: middle"></i>${_('Notebooks')}</a></li>
                </ul>
              </li>
            % endif

+ 1 - 1
desktop/core/src/desktop/views.py

@@ -365,7 +365,7 @@ def commonheader(title, section, user, padding="90px"):
     for app in apps:
       if app.display_name not in [
           'beeswax', 'impala', 'pig', 'jobsub', 'jobbrowser', 'metastore', 'hbase', 'sqoop', 'oozie', 'filebrowser',
-          'useradmin', 'search', 'help', 'about', 'zookeeper', 'proxy', 'rdbms', 'spark', 'indexer', 'security']:
+          'useradmin', 'search', 'help', 'about', 'zookeeper', 'proxy', 'rdbms', 'spark', 'indexer', 'security', 'notebook']:
         other_apps.append(app)
       if section == app.display_name:
         current_app = app

+ 3 - 3
apps/spark/src/spark/api.py → desktop/libs/notebook/src/notebook/api.py

@@ -24,10 +24,10 @@ from django.views.decorators.http import require_GET, require_POST
 
 from desktop.lib.django_util import JsonResponse
 from desktop.models import Document2, Document
+from oozie.decorators import check_document_access_permission # Bad dependency
 
-from spark.models import get_api, Notebook, QueryExpired
-from spark.decorators import api_error_handler, check_document_modify_permission
-from oozie.decorators import check_document_access_permission
+from notebook.models import get_api, Notebook, QueryExpired
+from notebook.decorators import api_error_handler, check_document_modify_permission
 
 
 LOG = logging.getLogger(__name__)

+ 27 - 0
desktop/libs/notebook/src/notebook/conf.py

@@ -14,3 +14,30 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import json
+
+from django.utils.translation import ugettext_lazy as _t
+
+from desktop.lib.conf import Config
+
+
+def coerce_json(j):
+  return json.loads(j)
+
+
+LANGUAGES = Config(
+  key="languages",
+  help=_t("List of available types of snippets."),
+  type=coerce_json,
+  default="""[
+      {"name": "Scala", "type": "spark"},
+      {"name": "PySpark", "type": "pyspark"},
+      {"name": "R", "type": "r"},
+      {"name": "Impala", "type": "impala"},
+      {"name": "Hive", "type": "hive"},
+      {"name": "Jar", "type": "jar"},
+      {"name": "Python", "type": "py"},
+      {"name": "Text", "type": "text"}
+  ]"""
+)

+ 0 - 0
apps/spark/src/spark/data_export.py → desktop/libs/notebook/src/notebook/data_export.py


+ 3 - 2
apps/spark/src/spark/decorators.py → desktop/libs/notebook/src/notebook/decorators.py

@@ -25,11 +25,12 @@ from django.utils.translation import ugettext as _
 from desktop.lib.django_util import JsonResponse
 from desktop.lib.exceptions_renderable import PopupException
 from desktop.lib.i18n import force_unicode
-
-from spark.models import QueryExpired, QueryError, SessionExpired
 from desktop.models import Document2, Document
 
 
+from notebook.models import QueryExpired, QueryError, SessionExpired
+
+
 LOG = logging.getLogger(__name__)
 
 

+ 0 - 0
apps/spark/src/spark/fixtures/initial_spark_examples.json → desktop/libs/notebook/src/notebook/fixtures/initial_spark_examples.json


+ 482 - 64
desktop/libs/notebook/src/notebook/locale/de/LC_MESSAGES/django.po

@@ -5,11 +5,11 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version:  PROJEKTVERSION\n"
-"Report-Msgid-Bugs-To: E-MAIL@ADRESSE\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"Project-Id-Version: 0PROJEKTVERSION\n"
+"Report-Msgid-Bugs-To: EMAIL@ADRESSE\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
-"Last-Translator: VOLLSTÄNDIGER NAME <E-MAIL@ADRESSE>\n"
+"Last-Translator: VOLLSTÄNDIGER NAME <EMAIL@ADRESSE>\n"
 "Language-Team: de <LL@li.org>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
@@ -17,93 +17,511 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "Indizes löschen"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "Notizbuch gesperrt!"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "Notizbuch geschlossen!"
 
-#~ msgid "Delete"
-#~ msgstr "Löschen"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "URL des Spark-Job-Servers."
 
-#~ msgid "Create index"
-#~ msgstr "Index löschen "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "Liste der verfügbaren Arten von Snippets"
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "Die Anwendung funktioniert nicht, wenn kein Job-Server aktiv ist"
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "Beispiel: 1 + 1 oder drücken Sie STRG + Leerzeichen"
 
-#~ msgid "Name"
-#~ msgstr "Name"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "Beispiel: \"SELECT * FROM Tabellenname\", oder STRG + Leerzeichen drücken"
 
-#~ msgid "Type"
-#~ msgstr "Typ"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>Dies ist ein Text-Snippet</h2>Geben Sie Ihren Text hier ein"
 
-#~ msgid "Collections"
-#~ msgstr "Sammlungen"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "Abfrage"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "Alle Snippets ausführen"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "Alle Ergebnisse entfernen"
 
-#~ msgid "Cancel"
-#~ msgstr "Abbrechen"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "Bearbeiten"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "Speichern"
 
-#~ msgid "Create"
-#~ msgstr "Erstellen"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "Es wird gespeichert..."
 
-#~ msgid "Path"
-#~ msgstr "Aktualisieren"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "Völlig neu"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "Notizbücher"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "Neues Notizbuch hinzufügen"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "Format der zu indizierenden ausgewählten Datei"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "Hilfe umschalten"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "Datenmuster für"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "OK"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "Tabellenliste manuell aktualisieren"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "Datenbank"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "Datenbank auswählen..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "Tabellenname..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "Die ausgewählte Datenbank enthält keine Tabellen."
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "Die Datenbankliste kann nicht geladen werden."
 
-#~ msgid "Next"
-#~ msgstr "Weiter"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "Snippet hinzufügen, um das neue Notizbuch zu starten"
 
-#~ msgid "Previous"
-#~ msgstr "Zurück"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "Neues Snippet hinzufügen"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "Text"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "Sitzung wird erstellt"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "STRG + EINGABETASTE"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "Abbrechen"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "Raster"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "Leisten"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "Zeilen"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "Kreis"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "Punkt"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Markierungskarte"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "Verlaufskarte"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "Protokolle anzeigen"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "Erste Zeilen als CSV herunterladen"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "Erste Zeilen als XLS herunterladen"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "Wird geladen..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "Erfolg."
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "Erfolg, aber leere Ergebnisse."
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "Spalten ausblenden"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "Spalten"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "Spalten anzeigen"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "Ausblenden"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "Einstellungen ausblenden"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "X-Achse"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "Region"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "Breite"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "Legende"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "Spalte auswählen..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "Y-Achse"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "Wert"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "Länge"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "Kennzeichnung"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "Punktgruppe"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "Punktgröße"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "Sortieren"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "Keine Sortierung"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "Aufsteigend sortieren"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "Absteigend sortieren"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "Einstellungen anzeigen"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "Link einfügen oder eingeben"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "In neuem Fenster öffnen"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "Keine Daten verfügbar"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "Keine übereinstimmenden Datensätze"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "Verteilung"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "Beim Laden der Tabellenvorschau ist ein Problem aufgetreten."
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Spark-Editor"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "Nach Namen, Beschreibung, usw. suchen"
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "Übermitteln"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "Freigeben"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "Kopieren"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "Löschen"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "Erstellen"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "Name"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "Beschreibung"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "Eigentümer"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "Zuletzt geändert"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "Ausgewählte Notizbücher löschen?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "Nein"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "Ja"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "_START_ bis _END_ von _TOTAL_ Einträge werden angezeigt"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "0 bis 0 von 0 Einträgen werden angezeigt"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(gefiltert von _MAX_ gesamten Einträgen)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "Erster"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "Letzter"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "Weiter"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "Zurück"
+
+#~ msgid "Requires a POST"
+#~ msgstr "Erfordert POST"
+#~ msgid "Requires a DELETE"
+#~ msgstr "Erfordert DELETE"
+#~ msgid "A POST request is required."
+#~ msgstr "Eine POST-Anforderung ist erforderlich."
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "Bei Ihrer Anfrage ist ein Fehler aufgetreten: %s"
+#~ msgid "A GET request is required."
+#~ msgstr "Eine GET-Anforderung ist erforderlich."
+#~ msgid "Missing application jar list."
+#~ msgstr "Anwendungs-JAR-Liste fehlt."
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Es ist ein Fehler mit dem Spark-Server aufgetreten."
+#~ msgid "Script parameters"
+#~ msgstr "Skriptparameter"
+#~ msgid "Class path"
+#~ msgstr "Klassenpfad"
+#~ msgid "Delete context(s)?"
+#~ msgstr "Kontext löschen?"
+#~ msgid "Applications"
+#~ msgstr "Anwendungen"
+#~ msgid "Dashboard"
+#~ msgstr "Dashboard"
+#~ msgid "Contexts"
+#~ msgstr "Kontexte"
+#~ msgid "Uploads"
+#~ msgstr "Uploads"
+#~ msgid "Create context"
+#~ msgstr "Kontext erstellen"
+#~ msgid "Num cpu cores"
+#~ msgstr "Num-CPU-Kerne"
+#~ msgid "Memory per node"
+#~ msgstr "Speicher pro Knoten"
+#~ msgid "Upload application"
+#~ msgstr "Upload-Anwendung"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "Eine Klasse der Jar-Datei muss Spark-Job implementieren."
+#~ msgid "Local jar file"
+#~ msgstr "Lokale Jar-Datei"
+#~ msgid "App name"
+#~ msgstr "Anwendungsname"
+#~ msgid "Upload"
+#~ msgstr "Hochladen"
+#~ msgid "Application name"
+#~ msgstr "Anwendungsname"
+#~ msgid "Application description"
+#~ msgstr "Anwendungsbeschreibung"
+#~ msgid "Upload app"
+#~ msgstr "Anwendung hochladen"
+#~ msgid "Missing, add one?"
+#~ msgstr "Fehlt, eine hinzufügen?"
+#~ msgid "Automatic"
+#~ msgstr "Automatisch"
+#~ msgid "Create one?"
+#~ msgstr "Neu erstellen?"
+#~ msgid "Parameters"
+#~ msgstr "Parameter"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "Ihre Anwendung enthält folgende(n) Fehler:"
+#~ msgid "No parameters defined yet."
+#~ msgstr "Noch keine Parameter definiert."
+#~ msgid "Add"
+#~ msgstr "Hinzufügen"
+#~ msgid "Executing..."
+#~ msgstr "Ausführung läuft..."
+#~ msgid "Execute"
+#~ msgstr "Ausführen"
+#~ msgid "or create a"
+#~ msgstr "oder erstellen Sie eine"
+#~ msgid "New application"
+#~ msgstr "Neue Anwendung"
+#~ msgid "Download"
+#~ msgstr "Herunterladen"
+#~ msgid "Key"
+#~ msgstr "Schlüssel"
+#~ msgid "The server returned no results."
+#~ msgstr "Der Server gab keine Ergebnisse aus."
+#~ msgid "Save your query"
+#~ msgstr "Abfrage speichern"
+#~ msgid "Choose a file"
+#~ msgstr "Datei auswählen"
+#~ msgid "Did you know?"
+#~ msgstr "Wussten Sie schon?"
+#~ msgid "This field is required."
+#~ msgstr "Dieses Feld ist erforderlich."
+#~ msgid "Empty description"
+#~ msgstr "Leere Beschreibung"
+#~ msgid "Application saved successfully!"
+#~ msgstr "Anwendung erfolgreich gespeichert!"
+#~ msgid "Server error occured: "
+#~ msgstr "Serverfehler aufgetreten: "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "Unlösbarer Serverfehler: "
+#~ msgid "Search for name"
+#~ msgstr "Nach Namen suchen"
+#~ msgid "Upload time"
+#~ msgstr "Zeit hochladen"
+#~ msgid "Click to open and execute"
+#~ msgstr "Zum Öffnen und Ausführen hier klicken"
+#~ msgid "Delete forever"
+#~ msgstr "Dauerhaft löschen"
+#~ msgid "Delete selected"
+#~ msgstr "Auswahl löschen"
+#~ msgid "Confirm action"
+#~ msgstr "Aktion bestätigen"
+#~ msgid "Jobs"
+#~ msgstr "Jobs"
+#~ msgid "Status"
+#~ msgstr "Status"
+#~ msgid "Job id"
+#~ msgstr "Job-ID"
+#~ msgid "Start time"
+#~ msgstr "Startzeit"
+#~ msgid "Duration"
+#~ msgstr "Dauer"
+#~ msgid "Click to open"
+#~ msgstr "Zum Öffnen hier klicken"

+ 300 - 63
desktop/libs/notebook/src/notebook/locale/en/LC_MESSAGES/django.po

@@ -1,13 +1,13 @@
 # English translations for Hue.
-# Copyright (C) 2012 Cloudera, Inc
+# Copyright (C) 2013 Cloudera, Inc
 # This file is distributed under the same license as the Hue project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2012.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2013.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Hue VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"POT-Creation-Date: 2014-01-16 13:47-0800\n"
 "PO-Revision-Date: 2013-10-28 10:31-0700\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: en <LL@li.org>\n"
@@ -17,93 +17,330 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr ""
+#: src/spark/api.py:61 src/spark/views.py:109
+msgid "Requires a POST"
+msgstr ""
+
+#: src/spark/api.py:84
+msgid "Requires a DELETE"
+msgstr ""
+
+#: src/spark/api.py:120 src/spark/api.py:175
+msgid "A POST request is required."
+msgstr ""
+
+#: src/spark/api.py:162
+#, python-format
+msgid "There was an error with your query: %s"
+msgstr ""
+
+#: src/spark/api.py:205
+msgid "A GET request is required."
+msgstr ""
+
+#: src/spark/api.py:234
+msgid "Missing application jar list."
+msgstr ""
+
+#: src/spark/conf.py:28
+msgid "URL of the Spark Job Server."
+msgstr ""
+
+#: src/spark/conf.py:56
+msgid "The app won't work without a running Job Server"
+msgstr ""
+
+#: src/spark/decorators.py:34
+msgid "An error happened with the Spark Server"
+msgstr ""
+
+#: src/spark/forms.py:25
+msgid "Script parameters"
+msgstr ""
+
+#: src/spark/forms.py:27 src/spark/templates/editor.mako:79
+#: src/spark/templates/list_jobs.mako:36
+msgid "Class path"
+msgstr ""
+
+#: src/spark/views.py:94
+msgid "Delete context(s)?"
+msgstr ""
+
+#: src/spark/templates/common.mako:38
+msgid "Spark Igniter"
+msgstr ""
+
+#: src/spark/templates/common.mako:41
+msgid "Editor"
+msgstr ""
+
+#: src/spark/templates/common.mako:43
+#: src/spark/templates/list_applications.mako:23
+#: src/spark/templates/list_applications.mako:29
+msgid "Applications"
+msgstr ""
+
+#: src/spark/templates/common.mako:45
+msgid "Dashboard"
+msgstr ""
+
+#: src/spark/templates/common.mako:46 src/spark/templates/list_contexts.mako:29
+msgid "Contexts"
+msgstr ""
+
+#: src/spark/templates/common.mako:47
+msgid "Uploads"
+msgstr ""
+
+#: src/spark/templates/common.mako:59 src/spark/templates/editor.mako:59
+#: src/spark/templates/list_contexts.mako:41
+msgid "Create context"
+msgstr ""
+
+#: src/spark/templates/common.mako:64 src/spark/templates/editor.mako:132
+#: src/spark/templates/editor.mako:220
+#: src/spark/templates/list_applications.mako:45
+#: src/spark/templates/list_contexts.mako:48
+msgid "Name"
+msgstr ""
+
+#: src/spark/templates/common.mako:70
+msgid "Num cpu cores"
+msgstr ""
+
+#: src/spark/templates/common.mako:76
+msgid "Memory per node"
+msgstr ""
+
+#: src/spark/templates/common.mako:84 src/spark/templates/common.mako:114
+#: src/spark/templates/editor.mako:234
+#: src/spark/templates/list_contexts.mako:85
+msgid "Cancel"
+msgstr ""
+
+#: src/spark/templates/common.mako:85
+msgid "Create"
+msgstr ""
+
+#: src/spark/templates/common.mako:96
+msgid "Upload application"
+msgstr ""
+
+#: src/spark/templates/common.mako:99
+msgid "One class of the jar should implement SparkJob."
+msgstr ""
+
+#: src/spark/templates/common.mako:101
+msgid "Local jar file"
+msgstr ""
+
+#: src/spark/templates/common.mako:107 src/spark/templates/editor.mako:63
+msgid "App name"
+msgstr ""
+
+#: src/spark/templates/common.mako:115
+msgid "Upload"
+msgstr ""
+
+#: src/spark/templates/editor.mako:23
+msgid "Query"
+msgstr ""
+
+#: src/spark/templates/editor.mako:39 src/spark/templates/editor.mako:486
+msgid "Application name"
+msgstr ""
+
+#: src/spark/templates/editor.mako:48
+msgid "Application description"
+msgstr ""
+
+#: src/spark/templates/editor.mako:58
+#: src/spark/templates/list_applications.mako:36
+msgid "Upload app"
+msgstr ""
+
+#: src/spark/templates/editor.mako:66
+msgid "Missing, add one?"
+msgstr ""
+
+#: src/spark/templates/editor.mako:83 src/spark/templates/list_contexts.mako:23
+#: src/spark/templates/list_jobs.mako:37
+msgid "Context"
+msgstr ""
+
+#: src/spark/templates/editor.mako:86
+msgid "Automatic"
+msgstr ""
+
+#: src/spark/templates/editor.mako:92
+msgid "Create one?"
+msgstr ""
+
+#: src/spark/templates/editor.mako:115
+msgid "Parameters"
+msgstr ""
+
+#: src/spark/templates/editor.mako:121
+msgid "Your application has the following error(s):"
+msgstr ""
+
+#: src/spark/templates/editor.mako:127
+msgid "No parameters defined yet."
+msgstr ""
+
+#: src/spark/templates/editor.mako:133 src/spark/templates/editor.mako:176
+msgid "Value"
+msgstr ""
+
+#: src/spark/templates/editor.mako:147
+msgid "Delete"
+msgstr ""
+
+#: src/spark/templates/editor.mako:153
+msgid "Add"
+msgstr ""
+
+#: src/spark/templates/editor.mako:159
+msgid "Executing..."
+msgstr ""
+
+#: src/spark/templates/editor.mako:160
+msgid "Execute"
+msgstr ""
+
+#: src/spark/templates/editor.mako:162 src/spark/templates/editor.mako:235
+msgid "Save"
+msgstr ""
+
+#: src/spark/templates/editor.mako:163
+msgid "Save as..."
+msgstr ""
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/templates/editor.mako:164
+msgid "or create a"
+msgstr ""
 
-#~ msgid "Delete"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:164
+msgid "New application"
+msgstr ""
 
-#~ msgid "Create index"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:166
+msgid "Download"
+msgstr ""
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:175
+msgid "Key"
+msgstr ""
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:188
+msgid "The server returned no results."
+msgstr ""
 
-#~ msgid "Name"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:215
+msgid "Save your query"
+msgstr ""
 
-#~ msgid "Type"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:226
+msgid "Description"
+msgstr ""
 
-#~ msgid "Collections"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "Choose a file"
+msgstr ""
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:378
+msgid "Did you know?"
+msgstr ""
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:480
+msgid "This field is required."
+msgstr ""
 
-#~ msgid "Cancel"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:493
+msgid "Empty description"
+msgstr ""
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:499
+msgid "Application saved successfully!"
+msgstr ""
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:527
+#: src/spark/templates/list_applications.mako:93
+#: src/spark/templates/list_contexts.mako:131
+#: src/spark/templates/list_jobs.mako:96
+msgid "No data available"
+msgstr ""
 
-#~ msgid "Create"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:528
+#: src/spark/templates/list_applications.mako:94
+#: src/spark/templates/list_contexts.mako:132
+#: src/spark/templates/list_jobs.mako:97
+msgid "No matching records"
+msgstr ""
 
-#~ msgid "Path"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:579
+msgid "Server error occured: "
+msgstr ""
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:582
+msgid "Unmanageable server error occured: "
+msgstr ""
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/list_applications.mako:33
+#: src/spark/templates/list_contexts.mako:33
+msgid "Search for name"
+msgstr ""
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr ""
+#: src/spark/templates/list_applications.mako:46
+msgid "Upload time"
+msgstr ""
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/list_applications.mako:53
+msgid "Click to open and execute"
+msgstr ""
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/list_contexts.mako:36
+msgid "Delete forever"
+msgstr ""
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/list_contexts.mako:37
+msgid "Delete selected"
+msgstr ""
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/list_contexts.mako:82
+msgid "Confirm action"
+msgstr ""
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/list_contexts.mako:86
+msgid "Yes"
+msgstr ""
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/list_contexts.mako:208
+msgid "Delete the selected contexts?"
+msgstr ""
 
-#~ msgid "No matching records"
-#~ msgstr ""
+#: src/spark/templates/list_jobs.mako:23 src/spark/templates/list_jobs.mako:29
+msgid "Jobs"
+msgstr ""
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/list_jobs.mako:34
+msgid "Status"
+msgstr ""
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/list_jobs.mako:35
+msgid "Job id"
+msgstr ""
 
-#~ msgid "Next"
-#~ msgstr ""
+#: src/spark/templates/list_jobs.mako:38
+msgid "Start time"
+msgstr ""
 
-#~ msgid "Previous"
-#~ msgstr ""
+#: src/spark/templates/list_jobs.mako:39
+msgid "Duration"
+msgstr ""
+
+#: src/spark/templates/list_jobs.mako:51
+msgid "Click to open"
+msgstr ""
 

+ 330 - 3
desktop/libs/notebook/src/notebook/locale/en_US.pot

@@ -1,14 +1,14 @@
 # Translations template for Hue.
-# Copyright (C) 2015 Cloudera, Inc
+# Copyright (C) 2014 Cloudera, Inc
 # This file is distributed under the same license as the Hue project.
-# FIRST AUTHOR <EMAIL@ADDRESS>, 2015.
+# FIRST AUTHOR <EMAIL@ADDRESS>, 2014.
 #
 #, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: Hue VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"POT-Creation-Date: 2014-01-16 13:47-0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,3 +17,330 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
+#: src/spark/api.py:61 src/spark/views.py:109
+msgid "Requires a POST"
+msgstr ""
+
+#: src/spark/api.py:84
+msgid "Requires a DELETE"
+msgstr ""
+
+#: src/spark/api.py:120 src/spark/api.py:175
+msgid "A POST request is required."
+msgstr ""
+
+#: src/spark/api.py:162
+#, python-format
+msgid "There was an error with your query: %s"
+msgstr ""
+
+#: src/spark/api.py:205
+msgid "A GET request is required."
+msgstr ""
+
+#: src/spark/api.py:234
+msgid "Missing application jar list."
+msgstr ""
+
+#: src/spark/conf.py:28
+msgid "URL of the Spark Job Server."
+msgstr ""
+
+#: src/spark/conf.py:56
+msgid "The app won't work without a running Job Server"
+msgstr ""
+
+#: src/spark/decorators.py:34
+msgid "An error happened with the Spark Server"
+msgstr ""
+
+#: src/spark/forms.py:25
+msgid "Script parameters"
+msgstr ""
+
+#: src/spark/forms.py:27 src/spark/templates/editor.mako:79
+#: src/spark/templates/list_jobs.mako:36
+msgid "Class path"
+msgstr ""
+
+#: src/spark/views.py:94
+msgid "Delete context(s)?"
+msgstr ""
+
+#: src/spark/templates/common.mako:38
+msgid "Spark Igniter"
+msgstr ""
+
+#: src/spark/templates/common.mako:41
+msgid "Editor"
+msgstr ""
+
+#: src/spark/templates/common.mako:43
+#: src/spark/templates/list_applications.mako:23
+#: src/spark/templates/list_applications.mako:29
+msgid "Applications"
+msgstr ""
+
+#: src/spark/templates/common.mako:45
+msgid "Dashboard"
+msgstr ""
+
+#: src/spark/templates/common.mako:46 src/spark/templates/list_contexts.mako:29
+msgid "Contexts"
+msgstr ""
+
+#: src/spark/templates/common.mako:47
+msgid "Uploads"
+msgstr ""
+
+#: src/spark/templates/common.mako:59 src/spark/templates/editor.mako:59
+#: src/spark/templates/list_contexts.mako:41
+msgid "Create context"
+msgstr ""
+
+#: src/spark/templates/common.mako:64 src/spark/templates/editor.mako:132
+#: src/spark/templates/editor.mako:220
+#: src/spark/templates/list_applications.mako:45
+#: src/spark/templates/list_contexts.mako:48
+msgid "Name"
+msgstr ""
+
+#: src/spark/templates/common.mako:70
+msgid "Num cpu cores"
+msgstr ""
+
+#: src/spark/templates/common.mako:76
+msgid "Memory per node"
+msgstr ""
+
+#: src/spark/templates/common.mako:84 src/spark/templates/common.mako:114
+#: src/spark/templates/editor.mako:234
+#: src/spark/templates/list_contexts.mako:85
+msgid "Cancel"
+msgstr ""
+
+#: src/spark/templates/common.mako:85
+msgid "Create"
+msgstr ""
+
+#: src/spark/templates/common.mako:96
+msgid "Upload application"
+msgstr ""
+
+#: src/spark/templates/common.mako:99
+msgid "One class of the jar should implement SparkJob."
+msgstr ""
+
+#: src/spark/templates/common.mako:101
+msgid "Local jar file"
+msgstr ""
+
+#: src/spark/templates/common.mako:107 src/spark/templates/editor.mako:63
+msgid "App name"
+msgstr ""
+
+#: src/spark/templates/common.mako:115
+msgid "Upload"
+msgstr ""
+
+#: src/spark/templates/editor.mako:23
+msgid "Query"
+msgstr ""
+
+#: src/spark/templates/editor.mako:39 src/spark/templates/editor.mako:486
+msgid "Application name"
+msgstr ""
+
+#: src/spark/templates/editor.mako:48
+msgid "Application description"
+msgstr ""
+
+#: src/spark/templates/editor.mako:58
+#: src/spark/templates/list_applications.mako:36
+msgid "Upload app"
+msgstr ""
+
+#: src/spark/templates/editor.mako:66
+msgid "Missing, add one?"
+msgstr ""
+
+#: src/spark/templates/editor.mako:83 src/spark/templates/list_contexts.mako:23
+#: src/spark/templates/list_jobs.mako:37
+msgid "Context"
+msgstr ""
+
+#: src/spark/templates/editor.mako:86
+msgid "Automatic"
+msgstr ""
+
+#: src/spark/templates/editor.mako:92
+msgid "Create one?"
+msgstr ""
+
+#: src/spark/templates/editor.mako:115
+msgid "Parameters"
+msgstr ""
+
+#: src/spark/templates/editor.mako:121
+msgid "Your application has the following error(s):"
+msgstr ""
+
+#: src/spark/templates/editor.mako:127
+msgid "No parameters defined yet."
+msgstr ""
+
+#: src/spark/templates/editor.mako:133 src/spark/templates/editor.mako:176
+msgid "Value"
+msgstr ""
+
+#: src/spark/templates/editor.mako:147
+msgid "Delete"
+msgstr ""
+
+#: src/spark/templates/editor.mako:153
+msgid "Add"
+msgstr ""
+
+#: src/spark/templates/editor.mako:159
+msgid "Executing..."
+msgstr ""
+
+#: src/spark/templates/editor.mako:160
+msgid "Execute"
+msgstr ""
+
+#: src/spark/templates/editor.mako:162 src/spark/templates/editor.mako:235
+msgid "Save"
+msgstr ""
+
+#: src/spark/templates/editor.mako:163
+msgid "Save as..."
+msgstr ""
+
+#: src/spark/templates/editor.mako:164
+msgid "or create a"
+msgstr ""
+
+#: src/spark/templates/editor.mako:164
+msgid "New application"
+msgstr ""
+
+#: src/spark/templates/editor.mako:166
+msgid "Download"
+msgstr ""
+
+#: src/spark/templates/editor.mako:175
+msgid "Key"
+msgstr ""
+
+#: src/spark/templates/editor.mako:188
+msgid "The server returned no results."
+msgstr ""
+
+#: src/spark/templates/editor.mako:215
+msgid "Save your query"
+msgstr ""
+
+#: src/spark/templates/editor.mako:226
+msgid "Description"
+msgstr ""
+
+#: src/spark/templates/editor.mako:242
+msgid "Choose a file"
+msgstr ""
+
+#: src/spark/templates/editor.mako:378
+msgid "Did you know?"
+msgstr ""
+
+#: src/spark/templates/editor.mako:480
+msgid "This field is required."
+msgstr ""
+
+#: src/spark/templates/editor.mako:493
+msgid "Empty description"
+msgstr ""
+
+#: src/spark/templates/editor.mako:499
+msgid "Application saved successfully!"
+msgstr ""
+
+#: src/spark/templates/editor.mako:527
+#: src/spark/templates/list_applications.mako:93
+#: src/spark/templates/list_contexts.mako:131
+#: src/spark/templates/list_jobs.mako:96
+msgid "No data available"
+msgstr ""
+
+#: src/spark/templates/editor.mako:528
+#: src/spark/templates/list_applications.mako:94
+#: src/spark/templates/list_contexts.mako:132
+#: src/spark/templates/list_jobs.mako:97
+msgid "No matching records"
+msgstr ""
+
+#: src/spark/templates/editor.mako:579
+msgid "Server error occured: "
+msgstr ""
+
+#: src/spark/templates/editor.mako:582
+msgid "Unmanageable server error occured: "
+msgstr ""
+
+#: src/spark/templates/list_applications.mako:33
+#: src/spark/templates/list_contexts.mako:33
+msgid "Search for name"
+msgstr ""
+
+#: src/spark/templates/list_applications.mako:46
+msgid "Upload time"
+msgstr ""
+
+#: src/spark/templates/list_applications.mako:53
+msgid "Click to open and execute"
+msgstr ""
+
+#: src/spark/templates/list_contexts.mako:36
+msgid "Delete forever"
+msgstr ""
+
+#: src/spark/templates/list_contexts.mako:37
+msgid "Delete selected"
+msgstr ""
+
+#: src/spark/templates/list_contexts.mako:82
+msgid "Confirm action"
+msgstr ""
+
+#: src/spark/templates/list_contexts.mako:86
+msgid "Yes"
+msgstr ""
+
+#: src/spark/templates/list_contexts.mako:208
+msgid "Delete the selected contexts?"
+msgstr ""
+
+#: src/spark/templates/list_jobs.mako:23 src/spark/templates/list_jobs.mako:29
+msgid "Jobs"
+msgstr ""
+
+#: src/spark/templates/list_jobs.mako:34
+msgid "Status"
+msgstr ""
+
+#: src/spark/templates/list_jobs.mako:35
+msgid "Job id"
+msgstr ""
+
+#: src/spark/templates/list_jobs.mako:38
+msgid "Start time"
+msgstr ""
+
+#: src/spark/templates/list_jobs.mako:39
+msgid "Duration"
+msgstr ""
+
+#: src/spark/templates/list_jobs.mako:51
+msgid "Click to open"
+msgstr ""
+

+ 479 - 61
desktop/libs/notebook/src/notebook/locale/es/LC_MESSAGES/django.po

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VERSIÓN DEL PROYECTO\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
 "Last-Translator: NOMBRE COMPLETO <EMAIL@ADDRESS>\n"
 "Language-Team: es <LL@li.org>\n"
@@ -17,93 +17,511 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "Eliminar índices"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "¡Bloc de notas guardado!"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "¡Bloc de notas cerrado!"
 
-#~ msgid "Delete"
-#~ msgstr "Eliminar"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "URL del servidor de jobs de Spark."
 
-#~ msgid "Create index"
-#~ msgstr "Eliminar índice "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "Lista de tipos de fragmentos de código disponibles."
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "La aplicación no funcionará sin un servidor de Job en ejecución"
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "Ejemplo: 1 + 1 o pulsar CTRL + Espacio"
 
-#~ msgid "Name"
-#~ msgstr "Nombre"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "Ejemplo: SELECT * FROM nombre de tabla o pulse CTRL + espacio"
 
-#~ msgid "Type"
-#~ msgstr "Tipo"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>Esto es un fragmento de texto</h2>Escriba el texto aquí"
 
-#~ msgid "Collections"
-#~ msgstr "Recopilaciones"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "Consulta"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "Ejecutar todos los fragmentos"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "Borrar todos los resultados"
 
-#~ msgid "Cancel"
-#~ msgstr "Cancelar"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "Editar"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "Guardar"
 
-#~ msgid "Create"
-#~ msgstr "Crear"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "Guardando..."
 
-#~ msgid "Path"
-#~ msgstr "Actualizar"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "Nuevo"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "Blocs de notas"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "Añadir un nuevo bloc de notas"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "Formato del archivo seleccionado para indexar"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "Activar/desactivar ayuda"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "Datos de muestra para"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "Aceptar"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "Actualizar manualmente la lista de tablas"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "base de datos"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "Seleccionar una base de datos..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "Nombre de tabla..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "La base de datos seleccionada no tiene tablas."
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "No se puede cargar la lista de base de datos."
 
-#~ msgid "Next"
-#~ msgstr "Siguiente"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "Añadir un fragmento para iniciar el nuevo bloc de notas"
 
-#~ msgid "Previous"
-#~ msgstr "Anterior"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "Añadir un nuevo fragmento"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "Texto"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "Creando sesión"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "CTRL + INTRO"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "Cuadrícula"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "Barras"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "Líneas"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "Circular"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "Dispersión"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Map de marcador"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "Map de gradiente"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "Mostrar los registros"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "Descargar primeras filas como CSV"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "Descargar primeras filas como XLS"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "Cargando..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "Correcto."
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "Correcto, pero resultados vacíos."
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "Ocultar columnas"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "columnas"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "Mostrar columnas"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "Ocultar"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "Ocultar ajustes"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "eje x"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "región"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "latitud"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "leyenda"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "Elegir una columna..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "eje y"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "valor"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "longitud"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "etiqueta"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "dispersar grupo"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "dispersar tamaño"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "clasificando"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "Sin clasificación"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "Clasificar en orden ascendente"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "Clasificar en orden descendente"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "Mostrar ajustes"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "Copiar o pegar un enlace"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "Abrir en una nueva ventana"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "No hay datos disponibles"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "No hay registros coincidentes"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "Distribución"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "Se ha producido un problema al cargar la vista previa de la tabla."
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Editor Spark"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "Buscar nombre, descripción, etc."
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "Enviar"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "Compartir"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "Copiar"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "Crear"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "Nombre"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "Descripción"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "Propietario"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "Última modificación"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "¿Eliminar los blocs de notas seleccionados?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "No"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "Sí"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "Mostrando de _START_ a _END_ entradas de _TOTAL_"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "Mostrando de 0 a 0 entradas de 0"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(filtrado de _MAX_ entradas totales)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "Primero"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "Último"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "Siguiente"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "Anterior"
+
+#~ msgid "Requires a POST"
+#~ msgstr "Se necesita una solicitud POST"
+#~ msgid "Requires a DELETE"
+#~ msgstr "Se necesita una solicitud DELETE"
+#~ msgid "A POST request is required."
+#~ msgstr "Se necesita una solicitud POST."
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "Se ha producido un error en la consulta: %s"
+#~ msgid "A GET request is required."
+#~ msgstr "Se necesita una solicitud GET."
+#~ msgid "Missing application jar list."
+#~ msgstr "Falta la lista de jar de la aplicación."
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Se ha producido un error con el servidor de Spark"
+#~ msgid "Script parameters"
+#~ msgstr "Parámetros de secuencia de comandos"
+#~ msgid "Class path"
+#~ msgstr "Ruta de clase"
+#~ msgid "Delete context(s)?"
+#~ msgstr "¿Eliminar contextos?"
+#~ msgid "Applications"
+#~ msgstr "Aplicaciones"
+#~ msgid "Dashboard"
+#~ msgstr "Panel"
+#~ msgid "Contexts"
+#~ msgstr "Contextos"
+#~ msgid "Uploads"
+#~ msgstr "Cargas"
+#~ msgid "Create context"
+#~ msgstr "Crear contexto"
+#~ msgid "Num cpu cores"
+#~ msgstr "Núm. núcleos de CPU"
+#~ msgid "Memory per node"
+#~ msgstr "Memoria por nodo"
+#~ msgid "Upload application"
+#~ msgstr "Cargar aplicación"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "Una clase de jar debe implementar un job de Spark."
+#~ msgid "Local jar file"
+#~ msgstr "Archivo jar local"
+#~ msgid "App name"
+#~ msgstr "Nombre de la aplicación"
+#~ msgid "Upload"
+#~ msgstr "Cargar"
+#~ msgid "Application name"
+#~ msgstr "Nombre de la aplicación"
+#~ msgid "Application description"
+#~ msgstr "Descripción de la aplicación"
+#~ msgid "Upload app"
+#~ msgstr "Cargar aplicación"
+#~ msgid "Missing, add one?"
+#~ msgstr "Faltan. ¿Agregar uno?"
+#~ msgid "Automatic"
+#~ msgstr "Automático"
+#~ msgid "Create one?"
+#~ msgstr "¿Crear uno?"
+#~ msgid "Parameters"
+#~ msgstr "Parámetros"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "La aplicación tiene los siguientes errores:"
+#~ msgid "No parameters defined yet."
+#~ msgstr "No se han definido parámetros todavía."
+#~ msgid "Add"
+#~ msgstr "Agregar"
+#~ msgid "Executing..."
+#~ msgstr "Ejecutando..."
+#~ msgid "Execute"
+#~ msgstr "Ejecutar"
+#~ msgid "or create a"
+#~ msgstr "o crear"
+#~ msgid "New application"
+#~ msgstr "Nueva aplicación"
+#~ msgid "Download"
+#~ msgstr "Descargar"
+#~ msgid "Key"
+#~ msgstr "Clave"
+#~ msgid "The server returned no results."
+#~ msgstr "El servidor no ha devuelto ningún resultado."
+#~ msgid "Save your query"
+#~ msgstr "Guardar la consulta"
+#~ msgid "Choose a file"
+#~ msgstr "Seleccionar un archivo"
+#~ msgid "Did you know?"
+#~ msgstr "¿Lo sabía?"
+#~ msgid "This field is required."
+#~ msgstr "Este campo es obligatorio."
+#~ msgid "Empty description"
+#~ msgstr "Descripción vacía"
+#~ msgid "Application saved successfully!"
+#~ msgstr "Aplicación guardada correctamente."
+#~ msgid "Server error occured: "
+#~ msgstr "Se ha producido un error del servidor: "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "Se ha producido un error de servidor que no se puede gestionar: "
+#~ msgid "Search for name"
+#~ msgstr "Buscar nombre"
+#~ msgid "Upload time"
+#~ msgstr "Momento de la carga"
+#~ msgid "Click to open and execute"
+#~ msgstr "Haga clic para abrir y ejecutar"
+#~ msgid "Delete forever"
+#~ msgstr "Eliminar permanentemente"
+#~ msgid "Delete selected"
+#~ msgstr "Eliminar selección"
+#~ msgid "Confirm action"
+#~ msgstr "Confirmar acción"
+#~ msgid "Jobs"
+#~ msgstr "Jobs"
+#~ msgid "Status"
+#~ msgstr "Estado"
+#~ msgid "Job id"
+#~ msgstr "ID de job"
+#~ msgid "Start time"
+#~ msgstr "Hora de inicio"
+#~ msgid "Duration"
+#~ msgstr "Duración"
+#~ msgid "Click to open"
+#~ msgstr "Haga clic para abrir"

+ 481 - 63
desktop/libs/notebook/src/notebook/locale/fr/LC_MESSAGES/django.po

@@ -6,10 +6,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: VERSION DU PROJET\n"
-"Report-Msgid-Bugs-To: ADRESSE@EMAIL\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"Report-Msgid-Bugs-To: ADRESSE@MAIL\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
-"Last-Translator: NOM COMPLET <ADRESSE@EMAIL>\n"
+"Last-Translator: NOM COMPLET <ADRESSE@MAIL>\n"
 "Language-Team: fr <LL@li.org>\n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 "MIME-Version: 1.0\n"
@@ -17,93 +17,511 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "Supprimer des index"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "Carnet enregistré !"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "Carnet fermé !"
 
-#~ msgid "Delete"
-#~ msgstr "Supprimer"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "URL du serveur de job Spark."
 
-#~ msgid "Create index"
-#~ msgstr "Supprimer l'index "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "Liste des types d'extrait disponibles."
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "Sans un serveur Job Server en cours d'exécution, l'application ne fonctionnera pas."
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "Exemple : 1 + 1, ou appuyer sur Ctrl + Espace"
 
-#~ msgid "Name"
-#~ msgstr "Nom"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "Exemple : SELECT * FROM nom_de_table ou appuyez sur CTRL + espace"
 
-#~ msgid "Type"
-#~ msgstr "Type"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>Voici un extrait de texte</h2>Saisir votre texte ici"
 
-#~ msgid "Collections"
-#~ msgstr "Collections"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "Requête"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "Exécuter tous les extraits"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "Effacer tous les résultats"
 
-#~ msgid "Cancel"
-#~ msgstr "Annuler"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "Modifier"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "Enregistrer"
 
-#~ msgid "Create"
-#~ msgstr "Créer"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "Enregistrement en cours..."
 
-#~ msgid "Path"
-#~ msgstr "Mettre à jour"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "Nouveau"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "Carnets"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "Ajouter un nouveau carnet"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "Format du fichier sélectionné à notebook"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "Activer/Désactiver l'aide"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "Echantillon de données pour"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "OK"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "Actualiser manuellement la liste de tables"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "base de données"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "Choisir une base de données..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "Nom de la table..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "La base de données sélectionnée n'a pas de tables."
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "La liste de bases de données ne peut pas être chargée."
 
-#~ msgid "Next"
-#~ msgstr "Suivant"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "Ajouter un extrait pour commencer votre nouveau carnet"
 
-#~ msgid "Previous"
-#~ msgstr "Précédent"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "Ajouter un nouvel extrait"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "Texte"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "Création d'une session"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "CTRL + ENTREE"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "Annuler"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "Grille"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "Barres"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "Lignes"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "Diagramme"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "Dispersion"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Map Marker"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "Carte de dégradés"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "Afficher les journaux"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "Télécharger les premières lignes au format CSV"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "Télécharger les premières lignes au format XLS"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "Chargement en cours..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "Réussite."
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "L'opération a réussi, mais les résultats sont vides."
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "Masquer les colonnes"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "colonnes"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "Afficher les colonnes"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "Masquer"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "Masquer les paramètres"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "Axe des abscisses"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "région"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "latitude"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "légende"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "Choisir une colonne..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "Axe des ordonnées"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "valeur"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "longitude"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "étiquette"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "groupe de dispersion"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "taille de dispersion"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "tri"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "Aucun tri"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "Tri ascendant"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "Tri descendant"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "Afficher les paramètres"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "Coller ou entrer un lien"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "Ouvrir dans une nouvelle fenêtre"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "Aucune donnée disponible"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "Aucun enregistrement correspondant"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "Distribution"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "Un problème est survenu lors du chargement de l'aperçu de la table."
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Editeur Spark"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "Rechercher un nom, une description, etc."
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "Envoyer"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "Partager"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "Copier"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "Supprimer"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "Créer"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "Nom"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "Description"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "Propriétaire"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "Dernière modification"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "Supprimer le ou les carnets sélectionnés ?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "Non"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "Oui"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "Affichage des entrées _START_ to _END_ of _TOTAL_"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "Affichage des entrées 0 à 0 sur 0"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(filtrées à partir des entrées totales _MAX_)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "Premier"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "Dernier"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "Suivant"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "Précédent"
+
+#~ msgid "Requires a POST"
+#~ msgstr "Nécessite une opération POST"
+#~ msgid "Requires a DELETE"
+#~ msgstr "Nécessite une opération DELETE"
+#~ msgid "A POST request is required."
+#~ msgstr "Requête POST requise."
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "Une erreur est survenue avec votre requête : %s"
+#~ msgid "A GET request is required."
+#~ msgstr "Requête GET requise."
+#~ msgid "Missing application jar list."
+#~ msgstr "Liste Jar d'applications manquante."
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Une erreur est survenue avec le serveur Spark"
+#~ msgid "Script parameters"
+#~ msgstr "Paramètres du script"
+#~ msgid "Class path"
+#~ msgstr "Chemin de classe"
+#~ msgid "Delete context(s)?"
+#~ msgstr "Supprimer le ou les contexte(s) ?"
+#~ msgid "Applications"
+#~ msgstr "Applications"
+#~ msgid "Dashboard"
+#~ msgstr "Tableau de bord"
+#~ msgid "Contexts"
+#~ msgstr "Contextes"
+#~ msgid "Uploads"
+#~ msgstr "Chargements"
+#~ msgid "Create context"
+#~ msgstr "Créer un contexte"
+#~ msgid "Num cpu cores"
+#~ msgstr "Nb cœurs processeur"
+#~ msgid "Memory per node"
+#~ msgstr "Mémoire par nœud"
+#~ msgid "Upload application"
+#~ msgstr "Charger une application"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "Une classe du fichier Jar doit implémenter le job Spark."
+#~ msgid "Local jar file"
+#~ msgstr "Fichier Jar local"
+#~ msgid "App name"
+#~ msgstr "Nom de l'application"
+#~ msgid "Upload"
+#~ msgstr "Charger"
+#~ msgid "Application name"
+#~ msgstr "Nom d'application"
+#~ msgid "Application description"
+#~ msgstr "Description d'application"
+#~ msgid "Upload app"
+#~ msgstr "Charger une application"
+#~ msgid "Missing, add one?"
+#~ msgstr "Manquant, en ajouter un ?"
+#~ msgid "Automatic"
+#~ msgstr "Automatique"
+#~ msgid "Create one?"
+#~ msgstr "En créer un ?"
+#~ msgid "Parameters"
+#~ msgstr "Paramètres"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "Votre application comporte les erreurs suivantes :"
+#~ msgid "No parameters defined yet."
+#~ msgstr "Aucun paramètre n'a encore été défini."
+#~ msgid "Add"
+#~ msgstr "Ajouter"
+#~ msgid "Executing..."
+#~ msgstr "Exécution en cours..."
+#~ msgid "Execute"
+#~ msgstr "Exécuter"
+#~ msgid "or create a"
+#~ msgstr "ou créer une"
+#~ msgid "New application"
+#~ msgstr "Nouvelle application"
+#~ msgid "Download"
+#~ msgstr "Télécharger"
+#~ msgid "Key"
+#~ msgstr "Clé"
+#~ msgid "The server returned no results."
+#~ msgstr "Le serveur n'a renvoyé aucun résultat."
+#~ msgid "Save your query"
+#~ msgstr "Enregistrer votre requête"
+#~ msgid "Choose a file"
+#~ msgstr "Choisir un fichier"
+#~ msgid "Did you know?"
+#~ msgstr "Le saviez-vous ?"
+#~ msgid "This field is required."
+#~ msgstr "Ce champ est obligatoire."
+#~ msgid "Empty description"
+#~ msgstr "Vider la description"
+#~ msgid "Application saved successfully!"
+#~ msgstr "Application enregistrée."
+#~ msgid "Server error occured: "
+#~ msgstr "Une erreur de serveur est survenue : "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "Une erreur de serveur non gérable est survenue : "
+#~ msgid "Search for name"
+#~ msgstr "Rechercher un nom"
+#~ msgid "Upload time"
+#~ msgstr "Date du chargement"
+#~ msgid "Click to open and execute"
+#~ msgstr "Cliquer pour ouvrir et exécuter"
+#~ msgid "Delete forever"
+#~ msgstr "Supprimer définitivement"
+#~ msgid "Delete selected"
+#~ msgstr "Supprimer les éléments sélectionnés"
+#~ msgid "Confirm action"
+#~ msgstr "Confirmer l'action"
+#~ msgid "Jobs"
+#~ msgstr "Jobs"
+#~ msgid "Status"
+#~ msgstr "Etat"
+#~ msgid "Job id"
+#~ msgstr "ID de job"
+#~ msgid "Start time"
+#~ msgstr "Heure de début"
+#~ msgid "Duration"
+#~ msgstr "Durée"
+#~ msgid "Click to open"
+#~ msgstr "Cliquer pour ouvrir"

+ 481 - 63
desktop/libs/notebook/src/notebook/locale/ja/LC_MESSAGES/django.po

@@ -5,11 +5,11 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version:  プロジェクトバージョン\n"
+"Project-Id-Version: PROJECT VERSION\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
-"Last-Translator: フルネーム <EMAIL@ADDRESS>\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: ja <LL@li.org>\n"
 "Plural-Forms: nplurals=1; plural=0\n"
 "MIME-Version: 1.0\n"
@@ -17,93 +17,511 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "インデックスを削除"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "ノートブックが保存されました"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "ノートブックが閉じられました"
 
-#~ msgid "Delete"
-#~ msgstr "削除"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "Spark Job Server の URL です。"
 
-#~ msgid "Create index"
-#~ msgstr "インデックスを削除 "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "使用可能なスニペットのタイプのリストです。"
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "実行中の Job Server が存在しない場合、アプリが機能しません"
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "例:1 + 1、または CTRL キーを押したまま Space キーを押します"
 
-#~ msgid "Name"
-#~ msgstr "名前"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "例:SELECT * FROM テーブル名、または CTRL キーを押したまま Space キーを押す"
 
-#~ msgid "Type"
-#~ msgstr "タイプ"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>これはテキストスニペットです</h2>ここにテキストを入力してください"
 
-#~ msgid "Collections"
-#~ msgstr "コレクション"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "クエリ"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "すべてのスニペットを実行"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "すべての結果をクリア"
 
-#~ msgid "Cancel"
-#~ msgstr "キャンセル"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "編集"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "保存"
 
-#~ msgid "Create"
-#~ msgstr "作成"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "保存中..."
 
-#~ msgid "Path"
-#~ msgstr "更新"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "新規"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "ノートブック"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "新しいノートブックを追加"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "インデックスを作成する選択済みファイルの形式"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "アシストを切り替え"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "データサンプルの対象"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "OK"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "テーブルリストを手動で更新"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "データベース"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "データベースを選択..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "テーブル名..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "選択したデータベースにテーブルがありません。"
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "データベースリストをロードできません。"
 
-#~ msgid "Next"
-#~ msgstr "次"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "スニペットを追加して、新しいノートブックを開始します"
 
-#~ msgid "Previous"
-#~ msgstr "前"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "新しいスニペットを追加"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "テキスト"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "セッションの作成"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "CTRL + ENTER"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "グリッド"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "棒"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "折れ線"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "円グラフ"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "散布図"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Marker Map"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "Gradient Map"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "ログを表示"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "最初の行を CSV としてダウンロード"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "最初の行を XLS としてダウンロード"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "読み込み中..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "成功しました。"
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "成功しましたが結果が空です。"
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "列を非表示"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "列"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "列を表示"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "非表示"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "設定を非表示"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "X 軸"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "地域"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "緯度"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "凡例"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "列を選択..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "Y 軸"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "値"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "経度"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "ラベル"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "散布図グループ"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "散布図サイズ"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "ソート"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "ソートなし"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "昇順でソート"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "降順でソート"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "設定を表示"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "リンクを貼り付けるか入力してください"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "新しいウィンドウで開く"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "利用可能なデータがありません"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "一致するレコードがありません"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "配布"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "テーブルプレビューをロード中に問題が発生しました。"
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Spark エディタ"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "名前、説明などを検索..."
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "サブミット"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "共有"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "コピー"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "削除"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "作成"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "名前"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "説明"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "所有者"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "前回の変更"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "選択したノートブックを削除しますか?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "いいえ"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "はい"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "_TOTAL_ 件のエントリの _START_ から _END_ までを表示"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "0 件のエントリの 0 から 0 までを表示"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(合計 _MAX_ 件のエントリからフィルタ処理)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "先頭"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "末尾"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "次"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "前"
+
+#~ msgid "Requires a POST"
+#~ msgstr "POST が必要"
+#~ msgid "Requires a DELETE"
+#~ msgstr "DELETE が必要"
+#~ msgid "A POST request is required."
+#~ msgstr "POST 要求が必要です。"
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "クエリでエラーが発生しました:%s"
+#~ msgid "A GET request is required."
+#~ msgstr "GET 要求が必要です。"
+#~ msgid "Missing application jar list."
+#~ msgstr "アプリケーションの jar リストがありません。"
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Spark Server でエラーが発生しました"
+#~ msgid "Script parameters"
+#~ msgstr "スクリプトパラメータ"
+#~ msgid "Class path"
+#~ msgstr "クラスパス"
+#~ msgid "Delete context(s)?"
+#~ msgstr "コンテキストを削除しますか?"
+#~ msgid "Applications"
+#~ msgstr "アプリケーション"
+#~ msgid "Dashboard"
+#~ msgstr "ダッシュボード"
+#~ msgid "Contexts"
+#~ msgstr "コンテキスト"
+#~ msgid "Uploads"
+#~ msgstr "アップロード"
+#~ msgid "Create context"
+#~ msgstr "コンテキストを作成"
+#~ msgid "Num cpu cores"
+#~ msgstr "CPU コア数"
+#~ msgid "Memory per node"
+#~ msgstr "ノードあたりのメモリ"
+#~ msgid "Upload application"
+#~ msgstr "アプリケーションをアップロード"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "jar の 1 つのクラスに Spark ジョブを実装する必要があります。"
+#~ msgid "Local jar file"
+#~ msgstr "ローカル jar ファイル"
+#~ msgid "App name"
+#~ msgstr "アプリ名"
+#~ msgid "Upload"
+#~ msgstr "アップロード"
+#~ msgid "Application name"
+#~ msgstr "アプリケーション名"
+#~ msgid "Application description"
+#~ msgstr "アプリケーションの説明"
+#~ msgid "Upload app"
+#~ msgstr "アプリをアップロード"
+#~ msgid "Missing, add one?"
+#~ msgstr "ありません。追加しますか?"
+#~ msgid "Automatic"
+#~ msgstr "自動"
+#~ msgid "Create one?"
+#~ msgstr "作成しますか?"
+#~ msgid "Parameters"
+#~ msgstr "パラメータ"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "アプリケーションに次のエラーがあります:"
+#~ msgid "No parameters defined yet."
+#~ msgstr "パラメータがまだ定義されていません。"
+#~ msgid "Add"
+#~ msgstr "追加"
+#~ msgid "Executing..."
+#~ msgstr "実行中..."
+#~ msgid "Execute"
+#~ msgstr "実行"
+#~ msgid "or create a"
+#~ msgstr "クエリを説明"
+#~ msgid "New application"
+#~ msgstr "新規アプリケーション"
+#~ msgid "Download"
+#~ msgstr "ダウンロード"
+#~ msgid "Key"
+#~ msgstr "キー"
+#~ msgid "The server returned no results."
+#~ msgstr "サーバーから結果が返されませんでした。"
+#~ msgid "Save your query"
+#~ msgstr "クエリを保存"
+#~ msgid "Choose a file"
+#~ msgstr "ファイルを選択"
+#~ msgid "Did you know?"
+#~ msgstr "便利な使い方"
+#~ msgid "This field is required."
+#~ msgstr "このフィールドは必須です。"
+#~ msgid "Empty description"
+#~ msgstr "空の説明"
+#~ msgid "Application saved successfully!"
+#~ msgstr "アプリケーションが正常に保存されました。"
+#~ msgid "Server error occured: "
+#~ msgstr "サーバーエラーが発生しました: "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "管理不能なサーバーエラーが発生しました: "
+#~ msgid "Search for name"
+#~ msgstr "名前を検索"
+#~ msgid "Upload time"
+#~ msgstr "アップロード時間"
+#~ msgid "Click to open and execute"
+#~ msgstr "クリックして、開いて実行"
+#~ msgid "Delete forever"
+#~ msgstr "完全に削除"
+#~ msgid "Delete selected"
+#~ msgstr "選択したものを削除"
+#~ msgid "Confirm action"
+#~ msgstr "アクションを確認"
+#~ msgid "Jobs"
+#~ msgstr "ジョブ"
+#~ msgid "Status"
+#~ msgstr "ステータス"
+#~ msgid "Job id"
+#~ msgstr "ジョブ ID"
+#~ msgid "Start time"
+#~ msgstr "開始時間"
+#~ msgid "Duration"
+#~ msgstr "期間"
+#~ msgid "Click to open"
+#~ msgstr "クリックして開く"

+ 480 - 62
desktop/libs/notebook/src/notebook/locale/ko/LC_MESSAGES/django.po

@@ -7,103 +7,521 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 프로젝트 버전\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
 "Last-Translator: 전체 이름 <EMAIL@ADDRESS>\n"
 "Language-Team: ko <LL@li.org>\n"
-"Plural-Forms: nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=1; plural=0\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=utf-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "인덱스 삭제"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "노트북이 저장되었습니다!"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "노트북이 닫혔습니다!"
 
-#~ msgid "Delete"
-#~ msgstr "삭제"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "Spark Job Server의 URL입니다."
 
-#~ msgid "Create index"
-#~ msgstr "인덱스 삭제 "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "사용 가능한 스니펫 유형 목록입니다."
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "Job Server를 실행하지 않으면 이 앱을 사용할 수 없습니다."
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "예: 1 + 1, 또는 CTRL + space를 누름"
 
-#~ msgid "Name"
-#~ msgstr "이름"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "예: SELECT * FROM 테이블 이름 또는 Ctrl + space 누르기"
 
-#~ msgid "Type"
-#~ msgstr "유형"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>텍스트 스니펫</h2>여기에 텍스트 입력"
 
-#~ msgid "Collections"
-#~ msgstr "컬렉션"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "쿼리"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "모든 스니펫 실행"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "모든 결과 지우기"
 
-#~ msgid "Cancel"
-#~ msgstr "취소"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "편집"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "저장"
 
-#~ msgid "Create"
-#~ msgstr "생성"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "저장하는 중..."
 
-#~ msgid "Path"
-#~ msgstr "업데이트"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "새로 만들기"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "노트북"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "새 노트북 추가"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "인덱스를 위해 선택한 파일 형식"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "지원 전환"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "데이터 샘플"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "확인"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "테이블 목록을 수동으로 새로 고침"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "데이터베이스"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "데이터베이스 선택..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "테이블 이름..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "선택한 데이터베이스에 테이블이 없습니다."
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "데이터베이스 목록을 로드할 수 없습니다."
 
-#~ msgid "Next"
-#~ msgstr "다음"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "스니펫을 추가하여 새 노트북 시작"
 
-#~ msgid "Previous"
-#~ msgstr "이전"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "새 스니펫 추가"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "텍스트"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "세션 생성 중"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "CTRL + ENTER"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "취소"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "눈금선"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "막대"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "줄"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "파이"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "분산"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Marker Map"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "경사도 Map"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "로그 표시"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "첫 번째 행을 CSV로 다운로드"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "첫 번째 행을 XLS로 다운로드"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "로드 중..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "성공."
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "성공했지만 결과가 없습니다."
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "열 숨기기"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "열"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "열 표시"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "숨기기"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "설정 숨기기"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "X축"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "영역"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "위도"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "범례"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "열 선택..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "Y축"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "값"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "경도"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "레이블"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "그룹 분산"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "크기 분산"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "정렬"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "정렬되지 않음"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "오름차순으로 정렬"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "내림차순으로 정렬"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "설정 표시"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "링크 붙여넣기 또는 입력"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "새 창에서 열기"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "데이터를 이용할 수 없음"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "일치하는 레코드가 없음"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "배포"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "테이블 미리 보기를 로드하는 중에 문제가 발생했습니다."
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Spark 편집기"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "이름, 설명 등을 검색합니다."
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "제출"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "공유"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "복사"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "삭제"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "생성"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "이름"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "설명"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "소유자"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "최종 수정 날짜"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "선택한 노트북을 삭제하시겠습니까?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "아니요"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "예"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "_START_ to _END_ of _TOTAL_ 항목 표시"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "0~0개(전체 0개 중) 항목 표시"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(총 _MAX_ 항목에서 필터링됨)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "처음"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "마지막"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "다음"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "이전"
+
+#~ msgid "Requires a POST"
+#~ msgstr "POST 필요"
+#~ msgid "Requires a DELETE"
+#~ msgstr "DELETE 필요"
+#~ msgid "A POST request is required."
+#~ msgstr "POST 요청이 필요합니다."
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "쿼리 %s에 오류가 있습니다."
+#~ msgid "A GET request is required."
+#~ msgstr "GET 요청이 필요합니다."
+#~ msgid "Missing application jar list."
+#~ msgstr "애플리케이션 jar 목록이 없습니다."
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Spark Server에 오류 발생"
+#~ msgid "Script parameters"
+#~ msgstr "스크립트 매개변수"
+#~ msgid "Class path"
+#~ msgstr "클래스 경로"
+#~ msgid "Delete context(s)?"
+#~ msgstr "컨텍스트를 삭제하시겠습니까?"
+#~ msgid "Applications"
+#~ msgstr "애플리케이션"
+#~ msgid "Dashboard"
+#~ msgstr "대시보드"
+#~ msgid "Contexts"
+#~ msgstr "컨텍스트"
+#~ msgid "Uploads"
+#~ msgstr "업로드"
+#~ msgid "Create context"
+#~ msgstr "컨텍스트 생성"
+#~ msgid "Num cpu cores"
+#~ msgstr "cpu 코어 수"
+#~ msgid "Memory per node"
+#~ msgstr "노드당 메모리"
+#~ msgid "Upload application"
+#~ msgstr "애플리케이션 업로드"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "jar의 한 개 클래스에서 SparkJob을 구현해야 합니다."
+#~ msgid "Local jar file"
+#~ msgstr "로컬 jar 파일"
+#~ msgid "App name"
+#~ msgstr "앱 이름"
+#~ msgid "Upload"
+#~ msgstr "업로드"
+#~ msgid "Application name"
+#~ msgstr "애플리케이션 이름"
+#~ msgid "Application description"
+#~ msgstr "애플리케이션 설명"
+#~ msgid "Upload app"
+#~ msgstr "앱 업로드"
+#~ msgid "Missing, add one?"
+#~ msgstr "누락되었습니다. 추가하시겠습니까?"
+#~ msgid "Automatic"
+#~ msgstr "자동"
+#~ msgid "Create one?"
+#~ msgstr "생성하시겠습니까?"
+#~ msgid "Parameters"
+#~ msgstr "매개변수"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "애플리케이션에 다음 오류가 있습니다."
+#~ msgid "No parameters defined yet."
+#~ msgstr "매개변수가 아직 정의되지 않았습니다."
+#~ msgid "Add"
+#~ msgstr "추가"
+#~ msgid "Executing..."
+#~ msgstr "실행 중..."
+#~ msgid "Execute"
+#~ msgstr "실행"
+#~ msgid "or create a"
+#~ msgstr "또는 생성"
+#~ msgid "New application"
+#~ msgstr "새 애플리케이션"
+#~ msgid "Download"
+#~ msgstr "다운로드"
+#~ msgid "Key"
+#~ msgstr "키"
+#~ msgid "The server returned no results."
+#~ msgstr "서버에서 반환된 결과가 없습니다."
+#~ msgid "Save your query"
+#~ msgstr "쿼리 저장"
+#~ msgid "Choose a file"
+#~ msgstr "파일 선택"
+#~ msgid "Did you know?"
+#~ msgstr "유용한 정보"
+#~ msgid "This field is required."
+#~ msgstr "이 필드는 필수 항목입니다."
+#~ msgid "Empty description"
+#~ msgstr "설명 없음"
+#~ msgid "Application saved successfully!"
+#~ msgstr "애플리케이션이 저장되었습니다!"
+#~ msgid "Server error occured: "
+#~ msgstr "서버 오류 발생: "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "관리할 수 없는 서버 오류 발생: "
+#~ msgid "Search for name"
+#~ msgstr "이름 검색"
+#~ msgid "Upload time"
+#~ msgstr "업로드 시간"
+#~ msgid "Click to open and execute"
+#~ msgstr "열어서 실행하려면 클릭"
+#~ msgid "Delete forever"
+#~ msgstr "영구적으로 삭제"
+#~ msgid "Delete selected"
+#~ msgstr "선택 항목 삭제"
+#~ msgid "Confirm action"
+#~ msgstr "작업 확인"
+#~ msgid "Jobs"
+#~ msgstr "Job"
+#~ msgid "Status"
+#~ msgstr "상태"
+#~ msgid "Job id"
+#~ msgstr "Job ID"
+#~ msgid "Start time"
+#~ msgstr "시작 시간"
+#~ msgid "Duration"
+#~ msgstr "소요 시간"
+#~ msgid "Click to open"
+#~ msgstr "열려면 클릭"

+ 480 - 62
desktop/libs/notebook/src/notebook/locale/pt/LC_MESSAGES/django.po

@@ -7,9 +7,9 @@ msgid ""
 msgstr ""
 "Project-Id-Version: VERSÃO DO PROJECTO\n"
 "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Last-Translator: NOME COMPLETO <EMAIL@ADDRESS>\n"
 "Language-Team: pt <LL@li.org>\n"
 "Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "MIME-Version: 1.0\n"
@@ -17,93 +17,511 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "Eliminar índices"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "Ficheiro de projecto guardado!"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "Ficheiro de projecto fechado!"
 
-#~ msgid "Delete"
-#~ msgstr "Eliminar"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "URL do servidor de trabalho Spark."
 
-#~ msgid "Create index"
-#~ msgstr "Eliminar índice "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "Lista de tipos de fragmentos disponíveis."
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "A aplicação não funciona sem um servidor Job em execução"
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "Exemplo: 1 + 1 ou prima CTRL + espaço"
 
-#~ msgid "Name"
-#~ msgstr "Nome"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "Exemplo: SELECT * FROM nome de tabela, ou prima CTRL + espaço"
 
-#~ msgid "Type"
-#~ msgstr "Tipo"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>Isto é um fragmento de texto</h2>Escreva o seu texto aqui"
 
-#~ msgid "Collections"
-#~ msgstr "Colecções"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "Consultar"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "Executar todos os fragmentos"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "Eliminar todos os resultados"
 
-#~ msgid "Cancel"
-#~ msgstr "Cancelar"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "Editar"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "Guardar"
 
-#~ msgid "Create"
-#~ msgstr "Criar"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "A guardar..."
 
-#~ msgid "Path"
-#~ msgstr "Actualizar"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "Completamente novo"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "Ficheiros de projecto"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "Adicionar um novo ficheiro de projecto"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "Formato do ficheiro seleccionado para índice"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "Activar/desactivar assistente"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "Amostra de dados para"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "Ok"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "Actualizar manualmente a lista da tabela"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "base de dados"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "Seleccione uma base de dados..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "Nome da tabela..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "A base de dados seleccionada não tem tabelas."
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "A lista da base de dados não pode ser carregada."
 
-#~ msgid "Next"
-#~ msgstr "Seguinte"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "Adicione um fragmento para começar a utilizar o seu novo ficheiro de projecto"
 
-#~ msgid "Previous"
-#~ msgstr "Anterior"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "Adicionar um novo fragmento"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "Texto"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "A criar sessão"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "CTRL + ENTER"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "Grelha"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "Barras"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "Linhas"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "Circular"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "Dispersão"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Marker Map"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "Gradient Map"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "Mostrar registos"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "Transferir filas iniciais como CSV"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "Transferir filas iniciais como XLS"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "A carregar..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "Sucesso."
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "Operação realizada com sucesso mas sem resultados."
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "Ocultar colunas"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "colunas"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "Mostrar colunas"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "Ocultar"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "Ocultar definições"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "eixo X"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "região"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "latitude"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "legenda"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "Seleccione uma coluna..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "eixo Y"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "valor"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "longitude"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "etiqueta"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "grupo de dispersão"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "tamanho da dispersão"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "a classificar"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "Sem classificação"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "Classificação ascendente"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "Classificação descendente"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "Mostrar definições"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "Colar ou escrever uma hiperligação"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "Abrir numa nova janela"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "Não existem dados disponíveis"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "Não existem registos correspondentes"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "Distribuição"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "Ocorreu um problema ao carregar a pré-visualização da tabela."
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Editor Spark"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "Pesquisar por nome, descrição, etc..."
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "Enviar"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "Partilhar"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "Copiar"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "Eliminar"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "Criar"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "Nome"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "Descrição"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "Proprietário"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "Última modificação"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "Eliminar o(s) ficheiro(s) de projecto seleccionado(s)?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "Não"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "Sim"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "A mostrar _START_ a _END_ de _TOTAL_ entradas"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "A mostrar 0 a 0 de 0 entradas"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(filtradas de um total de _MAX_ entradas)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "Primeiro"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "Último"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "Seguinte"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "Anterior"
+
+#~ msgid "Requires a POST"
+#~ msgstr "Necessita de um POST"
+#~ msgid "Requires a DELETE"
+#~ msgstr "Necessita de uma DELETE"
+#~ msgid "A POST request is required."
+#~ msgstr "É necessário um pedido POST."
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "Ocorreu um erro com a sua consulta: %s"
+#~ msgid "A GET request is required."
+#~ msgstr "É necessário um pedido GET."
+#~ msgid "Missing application jar list."
+#~ msgstr "Lista jar de aplicação em falta."
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Ocorreu um erro com o servidor Spark"
+#~ msgid "Script parameters"
+#~ msgstr "Parâmetros de script"
+#~ msgid "Class path"
+#~ msgstr "Caminho de classe"
+#~ msgid "Delete context(s)?"
+#~ msgstr "Eliminar contexto(s)?"
+#~ msgid "Applications"
+#~ msgstr "Aplicações"
+#~ msgid "Dashboard"
+#~ msgstr "Painel"
+#~ msgid "Contexts"
+#~ msgstr "Contextos"
+#~ msgid "Uploads"
+#~ msgstr "Carregamentos"
+#~ msgid "Create context"
+#~ msgstr "Criar contexto"
+#~ msgid "Num cpu cores"
+#~ msgstr "N.º de núcleos de cpu"
+#~ msgid "Memory per node"
+#~ msgstr "Memória por nó"
+#~ msgid "Upload application"
+#~ msgstr "Carregar aplicação"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "Uma classe do jar deve implementar trabalho Spark."
+#~ msgid "Local jar file"
+#~ msgstr "Ficheiro jar local"
+#~ msgid "App name"
+#~ msgstr "Nome da aplicação"
+#~ msgid "Upload"
+#~ msgstr "Carregar"
+#~ msgid "Application name"
+#~ msgstr "Nome da aplicação"
+#~ msgid "Application description"
+#~ msgstr "Descrição da aplicação"
+#~ msgid "Upload app"
+#~ msgstr "Carregar aplicação"
+#~ msgid "Missing, add one?"
+#~ msgstr "Em falta; adicionar um?"
+#~ msgid "Automatic"
+#~ msgstr "Automático"
+#~ msgid "Create one?"
+#~ msgstr "Criar um?"
+#~ msgid "Parameters"
+#~ msgstr "Parâmetros"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "A sua aplicação tem o(s) seguinte(s) erro(s):"
+#~ msgid "No parameters defined yet."
+#~ msgstr "Nenhum parâmetro ainda definido."
+#~ msgid "Add"
+#~ msgstr "Adicionar"
+#~ msgid "Executing..."
+#~ msgstr "A executar..."
+#~ msgid "Execute"
+#~ msgstr "Executar"
+#~ msgid "or create a"
+#~ msgstr "ou criar uma"
+#~ msgid "New application"
+#~ msgstr "Nova aplicação"
+#~ msgid "Download"
+#~ msgstr "Transferir"
+#~ msgid "Key"
+#~ msgstr "Chave"
+#~ msgid "The server returned no results."
+#~ msgstr "O servidor não devolveu resultados."
+#~ msgid "Save your query"
+#~ msgstr "Guarde a sua consulta"
+#~ msgid "Choose a file"
+#~ msgstr "Escolha um ficheiro"
+#~ msgid "Did you know?"
+#~ msgstr "Sabia?"
+#~ msgid "This field is required."
+#~ msgstr "Este campo é obrigatório."
+#~ msgid "Empty description"
+#~ msgstr "Descrição vazia"
+#~ msgid "Application saved successfully!"
+#~ msgstr "Aplicação guardada com êxito!"
+#~ msgid "Server error occured: "
+#~ msgstr "Ocorreu um erro no servidor: "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "Ocorreu um erro não gerível no servidor: "
+#~ msgid "Search for name"
+#~ msgstr "Pesquisar por nome"
+#~ msgid "Upload time"
+#~ msgstr "Data de carregamento"
+#~ msgid "Click to open and execute"
+#~ msgstr "Clique para abrir e executar"
+#~ msgid "Delete forever"
+#~ msgstr "Eliminar permanentemente"
+#~ msgid "Delete selected"
+#~ msgstr "Eliminar seleccionados"
+#~ msgid "Confirm action"
+#~ msgstr "Confirmar acção"
+#~ msgid "Jobs"
+#~ msgstr "Trabalhos"
+#~ msgid "Status"
+#~ msgstr "Estado"
+#~ msgid "Job id"
+#~ msgstr "ID de trabalho"
+#~ msgid "Start time"
+#~ msgstr "Hora de início"
+#~ msgid "Duration"
+#~ msgstr "Duração"
+#~ msgid "Click to open"
+#~ msgstr "Clique para abrir"

+ 481 - 63
desktop/libs/notebook/src/notebook/locale/pt_BR/LC_MESSAGES/django.po

@@ -6,10 +6,10 @@
 msgid ""
 msgstr ""
 "Project-Id-Version: VERSÃO DO PROJETO\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"Report-Msgid-Bugs-To: ENDEREÇO DE E-MAIL\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
-"Last-Translator: NOME COMPLETO <EMAIL@ADDRESS>\n"
+"Last-Translator: NOME COMPLETO <ENDEREÇO DE E-MAIL>\n"
 "Language-Team: pt_BR <LL@li.org>\n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 "MIME-Version: 1.0\n"
@@ -17,93 +17,511 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "Excluir índices"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "Bloco de anotações salvo!"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "Bloco de anotações fechado!"
 
-#~ msgid "Delete"
-#~ msgstr "Excluir"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "URL do servidor de jobs Spark."
 
-#~ msgid "Create index"
-#~ msgstr "Excluir índice "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "Lista de tipos de snippets disponíveis."
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "O aplicativo não funcionará sem um servidor Job em execução"
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "Exemplo: 1 + 1, ou pressione CTRL + espaço"
 
-#~ msgid "Name"
-#~ msgstr "Nome"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "Exemplo: SELECT * FROM tablename ou pressione CTRL + espaço"
 
-#~ msgid "Type"
-#~ msgstr "Tipo"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>Isto é um snippet de texto</h2>Digite seu texto aqui"
 
-#~ msgid "Collections"
-#~ msgstr "Coleções"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "Consulta"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "Executar todos os snippets"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "Apagar todos os resultados"
 
-#~ msgid "Cancel"
-#~ msgstr "Cancelar"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "Editar"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "Salvar"
 
-#~ msgid "Create"
-#~ msgstr "Criar"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "Salvando..."
 
-#~ msgid "Path"
-#~ msgstr "Atualizar"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "Novo"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "Blocos de anotações"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "Adicionar um novo bloco de anotações"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "Formato do arquivo selecionado para indexação"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "Ativar/desativar assistente"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "Amostra de dados para"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "Ok"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "Atualizar manualmente a lista da tabela"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "banco de dados"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "Escolha um banco de dados..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "Nome da tabela..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "O banco de dados selecionado não tem tabelas."
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "Não é possível carregar a lista de banco de dados."
 
-#~ msgid "Next"
-#~ msgstr "Próximo"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "Adicionar snippet para iniciar seu bloco de anotações"
 
-#~ msgid "Previous"
-#~ msgstr "Anterior"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "Adicionar um novo snippet"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "Texto"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "Criando sessão"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "CTRL + ENTER"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "Grade"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "Barras"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "Linhas"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "Pizza"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "Dispersão"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Marker Map"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "Gradient Map"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "Mostrar registros"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "Baixar primeiras linhas como CSV"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "Baixar primeiras linhas como XLS"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "Carregando..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "Êxito."
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "Êxito, mas com resultados em branco."
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "Ocultar colunas"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "colunas"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "Mostrar colunas"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "Ocultar"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "Ocultar configurações"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "eixo X"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "região"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "latitude"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "legenda"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "Escolha uma coluna..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "eixo Y"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "valor"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "longitude"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "rótulo"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "grupo de dispersão"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "tamanho da dispersão"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "classificação"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "Sem classificação"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "Classificar em ordem crescente"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "Classificar em ordem decrescente"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "Mostrar configurações"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "Cole ou digite um link"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "Abrir em nova janela"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "Nenhum dado disponível"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "Nenhum registro correspondente"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "Distribuição"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "Houve um problema ao carregar a visualização da tabela."
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Editor Spark"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "Pesquisar nome, descrição etc..."
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "Enviar"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "Compartilhar"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "Copiar"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "Excluir"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "Criar"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "Nome"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "Descrição"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "Proprietário"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "Última modificação"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "Excluir os blocos de anotações selecionados?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "Não"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "Sim"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "Exibindo _START_ ao _END_ do _TOTAL_ de entradas"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "Exibindo 0 a 0 de 0 entradas"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(filtrado de um total de _MAX_ entradas)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "Primeiro"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "Último"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "Próximo"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "Anterior"
+
+#~ msgid "Requires a POST"
+#~ msgstr "Requer um POST"
+#~ msgid "Requires a DELETE"
+#~ msgstr "Requer um DELETE"
+#~ msgid "A POST request is required."
+#~ msgstr "É necessária uma solicitação POST."
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "Ocorreu um problema com sua consulta: %s"
+#~ msgid "A GET request is required."
+#~ msgstr "É necessária uma solicitação GET."
+#~ msgid "Missing application jar list."
+#~ msgstr "Lista jar de aplicativos ausentes."
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Erro no servidor Spark"
+#~ msgid "Script parameters"
+#~ msgstr "Parâmetros do script"
+#~ msgid "Class path"
+#~ msgstr "Caminho da classe"
+#~ msgid "Delete context(s)?"
+#~ msgstr "Excluir contextos?"
+#~ msgid "Applications"
+#~ msgstr "Aplicativos"
+#~ msgid "Dashboard"
+#~ msgstr "Painel"
+#~ msgid "Contexts"
+#~ msgstr "Contextos"
+#~ msgid "Uploads"
+#~ msgstr "Uploads"
+#~ msgid "Create context"
+#~ msgstr "Criar contexto"
+#~ msgid "Num cpu cores"
+#~ msgstr "Núm. núcleos de CPU"
+#~ msgid "Memory per node"
+#~ msgstr "Memória por nó"
+#~ msgid "Upload application"
+#~ msgstr "Carregar aplicativo"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "Uma classe de jar deve implementar o Job do Spark."
+#~ msgid "Local jar file"
+#~ msgstr "Arquivo jar local"
+#~ msgid "App name"
+#~ msgstr "Nome do aplicativo"
+#~ msgid "Upload"
+#~ msgstr "Fazer upload"
+#~ msgid "Application name"
+#~ msgstr "Nome do aplicativo"
+#~ msgid "Application description"
+#~ msgstr "Descrição do aplicativo"
+#~ msgid "Upload app"
+#~ msgstr "Carregar aplicativo"
+#~ msgid "Missing, add one?"
+#~ msgstr "Faltando? Adicionar uma?"
+#~ msgid "Automatic"
+#~ msgstr "Automático"
+#~ msgid "Create one?"
+#~ msgstr "Criar um?"
+#~ msgid "Parameters"
+#~ msgstr "Parâmetros"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "Seu aplicativo tem os seguintes erros:"
+#~ msgid "No parameters defined yet."
+#~ msgstr "Nenhum parâmetro definido ainda."
+#~ msgid "Add"
+#~ msgstr "Adicionar"
+#~ msgid "Executing..."
+#~ msgstr "Executando..."
+#~ msgid "Execute"
+#~ msgstr "Executar"
+#~ msgid "or create a"
+#~ msgstr "ou criar uma"
+#~ msgid "New application"
+#~ msgstr "Novo aplicativo"
+#~ msgid "Download"
+#~ msgstr "Download"
+#~ msgid "Key"
+#~ msgstr "Chave"
+#~ msgid "The server returned no results."
+#~ msgstr "O servidor não retornou resultados."
+#~ msgid "Save your query"
+#~ msgstr "Salvar sua consulta"
+#~ msgid "Choose a file"
+#~ msgstr "Escolha um arquivo"
+#~ msgid "Did you know?"
+#~ msgstr "Você sabia?"
+#~ msgid "This field is required."
+#~ msgstr "Este campo é obrigatório."
+#~ msgid "Empty description"
+#~ msgstr "Descrição em branco"
+#~ msgid "Application saved successfully!"
+#~ msgstr "Aplicativo salvo com êxito!"
+#~ msgid "Server error occured: "
+#~ msgstr "Erro no servidor: "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "Erro de servidor não gerenciável: "
+#~ msgid "Search for name"
+#~ msgstr "Pesquisar nome"
+#~ msgid "Upload time"
+#~ msgstr "Tempo de upload"
+#~ msgid "Click to open and execute"
+#~ msgstr "Clique para abrir e executar"
+#~ msgid "Delete forever"
+#~ msgstr "Excluir permanentemente"
+#~ msgid "Delete selected"
+#~ msgstr "Excluir selecionados"
+#~ msgid "Confirm action"
+#~ msgstr "Confirmar ação"
+#~ msgid "Jobs"
+#~ msgstr "Jobs"
+#~ msgid "Status"
+#~ msgstr "Status"
+#~ msgid "Job id"
+#~ msgstr "ID de job"
+#~ msgid "Start time"
+#~ msgstr "Hora inicial"
+#~ msgid "Duration"
+#~ msgstr "Duração"
+#~ msgid "Click to open"
+#~ msgstr "Clique para abrir"

+ 482 - 64
desktop/libs/notebook/src/notebook/locale/zh_CN/LC_MESSAGES/django.po

@@ -5,11 +5,11 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version:  项目版本\n"
-"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
-"POT-Creation-Date: 2015-09-11 11:43-0400\n"
+"Project-Id-Version: 项目版本\n"
+"Report-Msgid-Bugs-To: 电子邮件地址\n"
+"POT-Creation-Date: 2015-02-04 18:48-0800\n"
 "PO-Revision-Date: 2012-07-30 18:50-0700\n"
-"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Last-Translator: 全名 <电子邮件地址>\n"
 "Language-Team: zh_CN <LL@li.org>\n"
 "Plural-Forms: nplurals=1; plural=0\n"
 "MIME-Version: 1.0\n"
@@ -17,93 +17,511 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 0.9.6\n"
 
-#~ msgid "Solr Indexes"
-#~ msgstr "删除索引"
+#: src/spark/api.py:152 src/spark/api.py:165
+msgid "Notebook saved !"
+msgstr "笔记本已保存!"
 
-#~ msgid "Search for name, description, etc..."
-#~ msgstr ""
+#: src/spark/api.py:182
+msgid "Notebook closed !"
+msgstr "笔记本已关闭!"
 
-#~ msgid "Delete"
-#~ msgstr "删除"
+#: src/spark/conf.py:34
+msgid "URL of the Spark Job Server."
+msgstr "Spark 作业服务器的 URL。"
 
-#~ msgid "Create index"
-#~ msgstr "删除索引 "
+#: src/spark/conf.py:40
+msgid "List of available types of snippets."
+msgstr "可用代码段类型列表"
 
-#~ msgid "Create index from a file"
-#~ msgstr ""
+#: src/spark/conf.py:73
+msgid "The app won't work without a running Job Server"
+msgstr "Job Server 不运行的情况下应用程序不工作"
 
-#~ msgid "Create alias"
-#~ msgstr ""
+#: src/spark/views.py:46 src/spark/views.py:47
+msgid "Example: 1 + 1, or press CTRL + space"
+msgstr "示例:1 + 1 或按 CTRL + 空格"
 
-#~ msgid "Name"
-#~ msgstr "名称"
+#: src/spark/views.py:48 src/spark/views.py:49
+msgid "Example: SELECT * FROM tablename, or press CTRL + space"
+msgstr "示例:SELECT * FROM 表名,或按 CTRL + 空格键"
 
-#~ msgid "Type"
-#~ msgstr "类型"
+#: src/spark/views.py:50
+msgid "<h2>This is a text snippet</h2>Type your text here"
+msgstr "<h2>这是文本代码段</h2>在此处键入您的文本"
 
-#~ msgid "Collections"
-#~ msgstr "集合"
+#: src/spark/templates/editor.mako:22
+msgid "Query"
+msgstr "查询"
 
-#~ msgid "Schema"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:122
+msgid "Execute all snippets"
+msgstr "执行所有代码段"
 
-#~ msgid "Edit"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:127
+msgid "Clear all results"
+msgstr "清除所有结果"
 
-#~ msgid "Cancel"
-#~ msgstr "取消"
+#: src/spark/templates/editor.mako:135
 
-#~ msgid "Create or edit"
-#~ msgstr ""
+msgid "Edit"
+msgstr "编辑"
 
-#~ msgid "Get Sample"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:141
+msgid "Save"
+msgstr "保存"
 
-#~ msgid "Create"
-#~ msgstr "创建"
+#: src/spark/templates/editor.mako:141
+msgid "Saving..."
+msgstr "正在保存..."
 
-#~ msgid "Path"
-#~ msgstr "更新"
+#: src/spark/templates/editor.mako:148
+msgid "Brand New"
+msgstr "全新"
 
-#~ msgid "Database"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:152 src/spark/templates/notebooks.mako:22
+msgid "Notebooks"
+msgstr "笔记本"
 
-#~ msgid "Table"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:165
+msgid "Add a new notebook"
+msgstr "添加新笔记本"
 
-#~ msgid "Delete the selected index(es)?"
-#~ msgstr "要索引的选定文件的格式"
+#: src/spark/templates/editor.mako:171 src/spark/templates/editor.mako:209
+msgid "Toggle Assist"
+msgstr "切换帮助"
 
-#~ msgid "No"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:190
+msgid "Data sample for"
+msgstr "数据示例"
 
-#~ msgid "Yes"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:200
+msgid "Ok"
+msgstr "确定"
 
-#~ msgid "No data available"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:212
+msgid "Manually refresh the table list"
+msgstr "手动刷新表列表"
 
-#~ msgid "Showing _START_ to _END_ of _TOTAL_ entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:216
+msgid "database"
+msgstr "数据库"
 
-#~ msgid "Showing 0 to 0 of 0 entries"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:219
+msgid "Choose a database..."
+msgstr "选择数据库..."
 
-#~ msgid "(filtered from _MAX_ total entries)"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:220
 
-#~ msgid "No matching records"
-#~ msgstr ""
+msgid "Table name..."
+msgstr "表名..."
 
-#~ msgid "First"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:221
+msgid "The selected database has no tables."
+msgstr "所选数据库没有表。"
 
-#~ msgid "Last"
-#~ msgstr ""
+#: src/spark/templates/editor.mako:242
+msgid "The database list cannot be loaded."
+msgstr "无法加载数据库列表。"
 
-#~ msgid "Next"
-#~ msgstr "下一页"
+#: src/spark/templates/editor.mako:255
+msgid "Add a snippet to start your new notebook"
+msgstr "添加代码段以启动您的新笔记本、"
 
-#~ msgid "Previous"
-#~ msgstr "上一页"
+#: src/spark/templates/editor.mako:261
+msgid "Add a new snippet"
+msgstr "添加新代码段"
 
+#: src/spark/templates/editor.mako:285
+
+msgid "Text"
+msgstr "文本"
+
+#: src/spark/templates/editor.mako:331
+msgid "Creating session"
+msgstr "创建会话"
+
+#: src/spark/templates/editor.mako:333
+msgid "CTRL + ENTER"
+msgstr "CTRL + ENTER"
+
+#: src/spark/templates/editor.mako:336
+msgid "Cancel"
+msgstr "取消"
+
+#: src/spark/templates/editor.mako:345
+msgid "Grid"
+msgstr "网格"
+
+#: src/spark/templates/editor.mako:363
+msgid "Bars"
+msgstr "条"
+
+#: src/spark/templates/editor.mako:368
+msgid "Lines"
+msgstr "线"
+
+#: src/spark/templates/editor.mako:373
+msgid "Pie"
+msgstr "圆形"
+
+#: src/spark/templates/editor.mako:378
+msgid "Scatter"
+msgstr "散点图"
+
+#: src/spark/templates/editor.mako:383
+msgid "Marker Map"
+msgstr "Marker Map"
+
+#: src/spark/templates/editor.mako:388
+msgid "Gradient Map"
+msgstr "Gradient Map"
+
+#: src/spark/templates/editor.mako:399
+msgid "Show Logs"
+msgstr "显示日志"
+
+#: src/spark/templates/editor.mako:418
+msgid "Download first rows as CSV"
+msgstr "以 CSV 格式下载第一行"
+
+#: src/spark/templates/editor.mako:419
+msgid "CSV"
+msgstr "CSV"
+
+#: src/spark/templates/editor.mako:423
+msgid "Download first rows as XLS"
+msgstr "以 XLS 格式下载第一行"
+
+#: src/spark/templates/editor.mako:424
+msgid "Excel"
+msgstr "Excel"
+
+#: src/spark/templates/editor.mako:435 src/spark/templates/editor.mako:452
+msgid "Loading..."
+msgstr "正在加载..."
+
+#: src/spark/templates/editor.mako:444
+msgid "Success."
+msgstr "成功。"
+
+#: src/spark/templates/editor.mako:448
+msgid "Success but empty results."
+msgstr "成功但结果为空。"
+
+#: src/spark/templates/editor.mako:465
+msgid "Hide columns"
+msgstr "隐藏列"
+
+#: src/spark/templates/editor.mako:465
+msgid "columns"
+msgstr "列"
+
+#: src/spark/templates/editor.mako:477
+msgid "Show columns"
+msgstr "显示列"
+
+#: src/spark/templates/editor.mako:480
+msgid "Hide"
+msgstr "隐藏"
+
+#: src/spark/templates/editor.mako:501
+msgid "Hide settings"
+msgstr "隐藏设置"
+
+#: src/spark/templates/editor.mako:507
+msgid "x-axis"
+msgstr "X 轴"
+
+#: src/spark/templates/editor.mako:508
+msgid "region"
+msgstr "区域"
+
+#: src/spark/templates/editor.mako:509
+msgid "latitude"
+msgstr "纬度"
+
+#: src/spark/templates/editor.mako:510
+msgid "legend"
+msgstr "图例"
+
+#: src/spark/templates/editor.mako:513 src/spark/templates/editor.mako:529
+#: src/spark/templates/editor.mako:536 src/spark/templates/editor.mako:543
+#: src/spark/templates/editor.mako:550
+msgid "Choose a column..."
+msgstr "选择列..."
+
+#: src/spark/templates/editor.mako:517
+msgid "y-axis"
+msgstr "Y 轴"
+
+#: src/spark/templates/editor.mako:518 src/spark/templates/editor.mako:520
+
+msgid "value"
+msgstr "值"
+
+#: src/spark/templates/editor.mako:519
+msgid "longitude"
+msgstr "经度"
+
+#: src/spark/templates/editor.mako:533
+msgid "label"
+msgstr "标签"
+
+#: src/spark/templates/editor.mako:540
+msgid "scatter group"
+msgstr "散点图组"
+
+#: src/spark/templates/editor.mako:547
+msgid "scatter size"
+msgstr "散点图大小"
+
+#: src/spark/templates/editor.mako:554
+msgid "sorting"
+msgstr "排序"
+
+#: src/spark/templates/editor.mako:557
+msgid "No sorting"
+msgstr "不排序"
+
+#: src/spark/templates/editor.mako:558
+msgid "Sort ascending"
+msgstr "升序"
+
+#: src/spark/templates/editor.mako:559
+msgid "Sort descending"
+msgstr "降序"
+
+#: src/spark/templates/editor.mako:566
+msgid "Show settings"
+msgstr "显示设置"
+
+#: src/spark/templates/editor.mako:651
+msgid "Paste or type a link"
+msgstr "粘贴或键入链接"
+
+#: src/spark/templates/editor.mako:652
+msgid "Open in new window"
+msgstr "在新窗口中打开"
+
+#: src/spark/templates/editor.mako:1168 src/spark/templates/notebooks.mako:228
+msgid "No data available"
+msgstr "没有可用数据"
+
+#: src/spark/templates/editor.mako:1169 src/spark/templates/notebooks.mako:232
+msgid "No matching records"
+msgstr "没有匹配记录"
+
+#: src/spark/templates/editor.mako:1484
+
+msgid "Distribution"
+msgstr "贡献"
+
+#: src/spark/templates/editor.mako:1511
+msgid "There was a problem loading the table preview."
+msgstr "加载表预览时出现问题。"
+
+#: src/spark/templates/notebooks.mako:28
+
+msgid "Spark Editor"
+msgstr "Spark Editor"
+
+#: src/spark/templates/notebooks.mako:33
+msgid "Search for name, description, etc..."
+msgstr "搜索名称、描述等..."
+
+#: src/spark/templates/notebooks.mako:39
+msgid "Submit"
+msgstr "提交"
+
+#: src/spark/templates/notebooks.mako:45 src/spark/templates/notebooks.mako:47
+msgid "Share"
+msgstr "共享"
+
+#: src/spark/templates/notebooks.mako:51
+msgid "Copy"
+msgstr "复制"
+
+#: src/spark/templates/notebooks.mako:55
+msgid "Delete"
+msgstr "删除"
+
+#: src/spark/templates/notebooks.mako:60
+msgid "Create"
+msgstr "创建"
+
+#: src/spark/templates/notebooks.mako:67
+msgid "Name"
+msgstr "名称"
+
+#: src/spark/templates/notebooks.mako:68
+msgid "Description"
+msgstr "描述"
+
+#: src/spark/templates/notebooks.mako:69
+msgid "Owner"
+msgstr "所有者"
+
+#: src/spark/templates/notebooks.mako:70
+msgid "Last Modified"
+msgstr "上次修改"
+
+#: src/spark/templates/notebooks.mako:107
+
+msgid "Delete the selected notebook(s)?"
+msgstr "删除所选笔记本?"
+
+#: src/spark/templates/notebooks.mako:110
+msgid "No"
+msgstr "否"
+
+#: src/spark/templates/notebooks.mako:111
+msgid "Yes"
+msgstr "是"
+
+#: src/spark/templates/notebooks.mako:229
+msgid "Showing _START_ to _END_ of _TOTAL_ entries"
+msgstr "显示 _START_ - _END_,共 _TOTAL_ 个条目"
+
+#: src/spark/templates/notebooks.mako:230
+msgid "Showing 0 to 0 of 0 entries"
+msgstr "显示 0-0,共 0 个条目"
+
+#: src/spark/templates/notebooks.mako:231
+msgid "(filtered from _MAX_ total entries)"
+msgstr "(已从 _MAX_ 个总条目中过滤)"
+
+#: src/spark/templates/notebooks.mako:234
+msgid "First"
+msgstr "第一个"
+
+#: src/spark/templates/notebooks.mako:235
+msgid "Last"
+msgstr "最后一个"
+
+#: src/spark/templates/notebooks.mako:236
+
+msgid "Next"
+msgstr "下一页"
+
+#: src/spark/templates/notebooks.mako:237
+msgid "Previous"
+msgstr "上一页"
+
+#~ msgid "Requires a POST"
+#~ msgstr "需要 POST"
+#~ msgid "Requires a DELETE"
+#~ msgstr "需要 DELETE"
+#~ msgid "A POST request is required."
+#~ msgstr "需要 POST 请求。"
+#~ msgid "There was an error with your query: %s"
+#~ msgstr "您的查询存在错误:%s"
+#~ msgid "A GET request is required."
+#~ msgstr "需要 GET 请求。"
+#~ msgid "Missing application jar list."
+#~ msgstr "缺少应用程序 jar 列表。"
+#~ msgid "An error happened with the Spark Server"
+#~ msgstr "Spark 服务器发生错误"
+#~ msgid "Script parameters"
+#~ msgstr "脚本参数"
+#~ msgid "Class path"
+#~ msgstr "类路径"
+#~ msgid "Delete context(s)?"
+#~ msgstr "删除上下文?"
+#~ msgid "Applications"
+#~ msgstr "应用程序"
+#~ msgid "Dashboard"
+#~ msgstr "控制面板"
+#~ msgid "Contexts"
+#~ msgstr "上下文"
+#~ msgid "Uploads"
+#~ msgstr "上传"
+#~ msgid "Create context"
+#~ msgstr "创建上下文"
+#~ msgid "Num cpu cores"
+#~ msgstr "CPU 核心数量"
+#~ msgid "Memory per node"
+#~ msgstr "每个节点的内存"
+#~ msgid "Upload application"
+#~ msgstr "上传应用程序"
+#~ msgid "One class of the jar should implement SparkJob."
+#~ msgstr "Jar 的其中一个类应实施 Spark 作业。"
+#~ msgid "Local jar file"
+#~ msgstr "本地 jar 文件"
+#~ msgid "App name"
+#~ msgstr "应用程序名称"
+#~ msgid "Upload"
+#~ msgstr "上传"
+#~ msgid "Application name"
+#~ msgstr "应用程序名称"
+#~ msgid "Application description"
+#~ msgstr "应用程序描述"
+#~ msgid "Upload app"
+#~ msgstr "上传应用程序"
+#~ msgid "Missing, add one?"
+#~ msgstr "缺少应用程序,添加一个?"
+#~ msgid "Automatic"
+#~ msgstr "自动"
+#~ msgid "Create one?"
+#~ msgstr "创建一个?"
+#~ msgid "Parameters"
+#~ msgstr "参数"
+#~ msgid "Your application has the following error(s):"
+#~ msgstr "您的应用程序存在以下错误:"
+#~ msgid "No parameters defined yet."
+#~ msgstr "尚未定义参数。"
+#~ msgid "Add"
+#~ msgstr "添加"
+#~ msgid "Executing..."
+#~ msgstr "正在执行..."
+#~ msgid "Execute"
+#~ msgstr "执行"
+#~ msgid "or create a"
+#~ msgstr "或创建一个"
+#~ msgid "New application"
+#~ msgstr "新建应用程序"
+#~ msgid "Download"
+#~ msgstr "下载"
+#~ msgid "Key"
+#~ msgstr "键"
+#~ msgid "The server returned no results."
+#~ msgstr "服务器未返回结果。"
+#~ msgid "Save your query"
+#~ msgstr "保存您的查询"
+#~ msgid "Choose a file"
+#~ msgstr "选择文件"
+#~ msgid "Did you know?"
+#~ msgstr "您知道吗?"
+#~ msgid "This field is required."
+#~ msgstr "此字段为必填字段。"
+#~ msgid "Empty description"
+#~ msgstr "空描述"
+#~ msgid "Application saved successfully!"
+#~ msgstr "应用程序已成功保存!"
+#~ msgid "Server error occured: "
+#~ msgstr "出现服务器错误: "
+#~ msgid "Unmanageable server error occured: "
+#~ msgstr "出现无法管理的服务器错误: "
+#~ msgid "Search for name"
+#~ msgstr "搜索名称"
+#~ msgid "Upload time"
+#~ msgstr "上传时间"
+#~ msgid "Click to open and execute"
+#~ msgstr "单击以打开并执行"
+#~ msgid "Delete forever"
+#~ msgstr "永久删除"
+#~ msgid "Delete selected"
+#~ msgstr "删除所选项"
+#~ msgid "Confirm action"
+#~ msgstr "确认操作"
+#~ msgid "Jobs"
+#~ msgstr "作业"
+#~ msgid "Status"
+#~ msgstr "状态"
+#~ msgid "Job id"
+#~ msgstr "作业 ID"
+#~ msgid "Start time"
+#~ msgstr "开始时间"
+#~ msgid "Duration"
+#~ msgstr "持续时间"
+#~ msgid "Click to open"
+#~ msgstr "单击以打开"

+ 0 - 0
apps/spark/src/spark/management/commands/spark_setup.py → desktop/libs/notebook/src/notebook/management/commands/notebook_setup.py


+ 20 - 0
desktop/libs/notebook/src/notebook/migrations/0001_initial.py

@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        pass
+
+    def backwards(self, orm):
+        pass
+
+    models = {
+        
+    }
+
+    complete_apps = ['notebook']

+ 0 - 0
desktop/libs/notebook/src/notebook/migrations/__init__.py


+ 523 - 0
desktop/libs/notebook/src/notebook/models.py

@@ -14,3 +14,526 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+
+import json
+import logging
+import re
+import time
+
+from django.utils.translation import ugettext as _
+
+from desktop.lib.exceptions_renderable import PopupException
+from desktop.lib.i18n import force_unicode
+from desktop.lib.rest.http_client import RestException
+
+from beeswax import data_export
+from beeswax.design import hql_query
+from beeswax import conf as beeswax_conf
+from beeswax.models import QUERY_TYPES, HiveServerQueryHandle, QueryHistory, HiveServerQueryHistory
+from beeswax.server import dbms
+from beeswax.server.dbms import get_query_server_config, QueryServerException
+from beeswax.views import _parse_out_hadoop_jobs
+
+from spark.job_server_api import get_api as get_spark_api
+
+from notebook.data_export import download as spark_download
+
+
+LOG = logging.getLogger(__name__)
+
+
+# To move to Editor API
+class SessionExpired(Exception):
+  pass
+
+
+class QueryExpired(Exception):
+  pass
+
+
+class QueryError(Exception):
+  def __init__(self, message):
+    self.message = message
+
+  def __str__(self):
+    return force_unicode(str(self.message))
+
+
+class Notebook():
+
+  def __init__(self, document=None):
+    self.document = None
+
+    if document is not None:
+      self.data = document.data
+      self.document = document
+    else:
+      self.data = json.dumps({
+          'name': 'My Notebook',
+          'description': '',
+          'snippets': []
+      })
+
+  def get_json(self):
+    _data = self.get_data()
+
+    return json.dumps(_data)
+
+  def get_data(self):
+    _data = json.loads(self.data)
+
+    if self.document is not None:
+      _data['id'] = self.document.id
+
+    return _data
+
+  def get_str(self):
+    return '\n\n'.join([snippet['statement_raw'] for snippet in self.get_data()['snippets']])
+
+
+def get_api(user, snippet):
+  if snippet['type'] in ('hive', 'impala', 'spark-sql'):
+    return HS2Api(user)
+  elif snippet['type'] in ('jar', 'py'):
+    return SparkBatchApi(user)
+  elif snippet['type'] == 'text':
+    return TextApi(user)
+  else:
+    return SparkApi(user)
+
+
+def _get_snippet_session(notebook, snippet):
+  return [session for session in notebook['sessions'] if session['type'] == snippet['type']][0]
+
+
+# Base API
+
+class Api(object):
+
+  def __init__(self, user):
+    self.user = user
+
+  def create_session(self, lang, properties=None):
+    return {
+        'type': lang,
+        'id': None,
+        'properties': []
+    }
+
+  def close_session(self, session):
+    pass
+
+
+# Text
+
+class TextApi(Api):
+
+  pass
+
+
+# HS2
+
+def query_error_handler(func):
+  def decorator(*args, **kwargs):
+    try:
+      return func(*args, **kwargs)
+    except QueryServerException, e:
+      message = force_unicode(str(e))
+      if 'Invalid query handle' in message or 'Invalid OperationHandle' in message:
+        raise QueryExpired(e)
+      else:
+        raise QueryError(message)
+  return decorator
+
+
+class HS2Api(Api):
+
+  def _get_handle(self, snippet):
+    snippet['result']['handle']['secret'], snippet['result']['handle']['guid'] = HiveServerQueryHandle.get_decoded(snippet['result']['handle']['secret'], snippet['result']['handle']['guid'])
+    return HiveServerQueryHandle(**snippet['result']['handle'])
+
+  def _get_db(self, snippet):
+    if snippet['type'] == 'hive':
+      name = 'beeswax'
+    elif snippet['type'] == 'impala':
+      name = 'impala'
+    else:
+      name = 'spark-sql'
+
+    return dbms.get(self.user, query_server=get_query_server_config(name=name))
+
+  def execute(self, notebook, snippet):
+    db = self._get_db(snippet)
+    query = hql_query(snippet['statement'], QUERY_TYPES[0])
+
+    try:
+      handle = db.client.query(query)
+    except QueryServerException, ex:
+      raise QueryError(ex.message)
+
+    # All good
+    server_id, server_guid  = handle.get()
+    return {
+        'secret': server_id,
+        'guid': server_guid,
+        'operation_type': handle.operation_type,
+        'has_result_set': handle.has_result_set,
+        'modified_row_count': handle.modified_row_count,
+        'log_context': handle.log_context
+    }
+
+  @query_error_handler
+  def check_status(self, notebook, snippet):
+    response = {}
+    db = self._get_db(snippet)
+
+    handle = self._get_handle(snippet)
+    operation = db.get_operation_status(handle)
+    status = HiveServerQueryHistory.STATE_MAP[operation.operationState]
+
+    if status.index in (QueryHistory.STATE.failed.index, QueryHistory.STATE.expired.index):
+      raise QueryError(operation.errorMessage)
+
+    response['status'] = 'running' if status.index in (QueryHistory.STATE.running.index, QueryHistory.STATE.submitted.index) else 'available'
+
+    return response
+
+  @query_error_handler
+  def fetch_result(self, notebook, snippet, rows, start_over):
+    db = self._get_db(snippet)
+
+    handle = self._get_handle(snippet)
+    results = db.fetch(handle, start_over=start_over, rows=rows)
+
+    # No escaping...
+    return {
+        'has_more': results.has_more,
+        'data': list(results.rows()),
+        'meta': [{
+          'name': column.name,
+          'type': column.type,
+          'comment': column.comment
+        } for column in results.data_table.cols()],
+        'type': 'table'
+    }
+
+  @query_error_handler
+  def fetch_result_metadata(self):
+    pass
+
+  @query_error_handler
+  def cancel(self, notebook, snippet):
+    db = self._get_db(snippet)
+
+    handle = self._get_handle(snippet)
+    db.cancel_operation(handle)
+    return {'status': 0}
+
+  @query_error_handler
+  def get_log(self, notebook, snippet, startFrom=None, size=None):
+    db = self._get_db(snippet)
+
+    handle = self._get_handle(snippet)
+    return db.get_log(handle, start_over=startFrom == 0)
+
+  def download(self, notebook, snippet, format):
+    try:
+      db = self._get_db(snippet)
+      handle = self._get_handle(snippet)
+      return data_export.download(handle, format, db)
+    except Exception, e:
+      LOG.exception('error downloading notebook')
+
+      if not hasattr(e, 'message') or not e.message:
+        message = e
+      else:
+        message = e.message
+      raise PopupException(message, detail='')
+
+  def _progress(self, snippet, logs):
+    if snippet['type'] == 'hive':
+      match = re.search('Total jobs = (\d+)', logs, re.MULTILINE)
+      total = (int(match.group(1)) if match else 1) * 2
+
+      started = logs.count('Starting Job')
+      ended = logs.count('Ended Job')
+
+      return int((started + ended) * 100 / total)
+    elif snippet['type'] == 'impala':
+      match = re.search('(\d+)% Complete', logs, re.MULTILINE)
+      return int(match.group(1)) if match else 0
+    else:
+      return 50
+
+  @query_error_handler
+  def close_statement(self, snippet):
+    if snippet['type'] == 'impala':
+      from impala import conf as impala_conf
+
+    if (snippet['type'] == 'hive' and beeswax_conf.CLOSE_QUERIES.get()) or (snippet['type'] == 'impala' and impala_conf.CLOSE_QUERIES.get()):
+      db = self._get_db(snippet)
+
+      handle = self._get_handle(snippet)
+      db.close_operation(handle)
+      return {'status': 0}
+    else:
+      return {'status': -1}  # skipped
+
+  def _get_jobs(self, log):
+    return _parse_out_hadoop_jobs(log)
+
+
+# Spark
+
+class SparkApi(Api):
+  PROPERTIES = [
+    {'name': 'jars', 'nice_name': _('Jars'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': False},
+    {'name': 'files', 'nice_name': _('Files'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': False},
+    {'name': 'pyFiles', 'nice_name': _('pyFiles'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': False},
+
+    {'name': 'driverMemory', 'nice_name': _('Driver Memory'), 'default': '1', 'type': 'jvm', 'is_yarn': False},
+
+    {'name': 'driverCores', 'nice_name': _('Driver Cores'), 'default': '1', 'type': 'number', 'is_yarn': True},
+    {'name': 'executorCores', 'nice_name': _('Executor Cores'), 'default': '1', 'type': 'number', 'is_yarn': True},
+    {'name': 'queue', 'nice_name': _('Queue'), 'default': '1', 'type': 'string', 'is_yarn': True},
+    {'name': 'archives', 'nice_name': _('Archives'), 'default': '', 'type': 'csv-hdfs-files', 'is_yarn': True},
+    {'name': 'numExecutors', 'nice_name': _('Executors Numbers'), 'default': '1', 'type': 'number', 'is_yarn': True},
+  ]
+
+  def create_session(self, lang='scala', properties=None):
+    properties = dict([(p['name'], p['value']) for p in properties]) if properties is not None else {}
+
+    properties['kind'] = lang
+
+    api = get_spark_api(self.user)
+
+    response = api.create_session(**properties)
+
+    status = api.get_session(response['id'])
+    count = 0
+
+    while status['state'] == 'starting' and count < 120:
+      status = api.get_session(response['id'])
+      count += 1
+      time.sleep(1)
+
+    if status['state'] != 'idle':
+      info = '\n'.join(status['log']) if status['log'] else 'timeout'
+      raise QueryError(_('The Spark session could not be created in the cluster: %s') % info)
+
+    return {
+        'type': lang,
+        'id': response['id'],
+        'properties': []
+    }
+
+  def execute(self, notebook, snippet):
+    api = get_spark_api(self.user)
+    session = _get_snippet_session(notebook, snippet)
+
+    try:
+      response = api.submit_statement(session['id'], snippet['statement'])
+      return {
+          'id': response['id'],
+          'has_result_set': True,
+      }
+    except Exception, e:
+      message = force_unicode(str(e)).lower()
+      if 'session not found' in message or 'connection refused' in message or 'session is in state busy' in message:
+        raise SessionExpired(e)
+      else:
+        raise e
+
+  def check_status(self, notebook, snippet):
+    api = get_spark_api(self.user)
+    session = _get_snippet_session(notebook, snippet)
+    cell = snippet['result']['handle']['id']
+
+    try:
+      response = api.fetch_data(session['id'], cell)
+      return {
+          'status': response['state'],
+      }
+    except Exception, e:
+      message = force_unicode(str(e)).lower()
+      if 'session not found' in message:
+        raise SessionExpired(e)
+      else:
+        raise e
+
+  def fetch_result(self, notebook, snippet, rows, start_over):
+    api = get_spark_api(self.user)
+    session = _get_snippet_session(notebook, snippet)
+    cell = snippet['result']['handle']['id']
+
+    try:
+      response = api.fetch_data(session['id'], cell)
+    except Exception, e:
+      message = force_unicode(str(e)).lower()
+      if 'session not found' in message:
+        raise SessionExpired(e)
+      else:
+        raise e
+
+    content = response['output']
+
+    if content['status'] == 'ok':
+      data = content['data']
+      images = []
+
+      try:
+        table = data['application/vnd.livy.table.v1+json']
+      except KeyError:
+        try:
+          images = [data['image/png']]
+        except KeyError:
+          images = []
+        data = [[data['text/plain']]]
+        meta = [{'name': 'Header', 'type': 'STRING_TYPE', 'comment': ''}]
+        type = 'text'
+      else:
+        data = table['data']
+        headers = table['headers']
+        meta = [{'name': h['name'], 'type': h['type'], 'comment': ''} for h in headers]
+        type = 'table'
+
+      # Non start_over not supported
+      if not start_over:
+        data = []
+
+      return {
+          'data': data,
+          'images': images,
+          'meta': meta,
+          'type': type
+      }
+    elif content['status'] == 'error':
+      tb = content.get('traceback', None)
+
+      if tb is None:
+        msg = content.get('ename', 'unknown error')
+
+        evalue = content.get('evalue')
+        if evalue is not None:
+          msg = '%s: %s' % (msg, evalue)
+      else:
+        msg = ''.join(tb)
+
+      raise QueryError(msg)
+
+  def download(self, notebook, snippet, format):
+    try:
+      api = get_spark_api(self.user)
+      session = _get_snippet_session(notebook, snippet)
+      cell = snippet['result']['handle']['id']
+
+      return spark_download(api, session['id'], cell, format)
+    except Exception, e:
+      raise PopupException(e)
+
+  def cancel(self, notebook, snippet):
+    api = get_spark_api(self.user)
+    session = _get_snippet_session(notebook, snippet)
+    response = api.cancel(session['id'])
+
+    return {'status': 0}
+
+  def get_log(self, notebook, snippet, startFrom=0, size=None):
+    api = get_spark_api(self.user)
+    session = _get_snippet_session(notebook, snippet)
+
+    return api.get_log(session['id'], startFrom=startFrom, size=size)
+
+  def _progress(self, snippet, logs):
+    return 50
+
+  def close_statement(self, snippet): # Individual statements cannot be closed
+    pass
+
+  def close_session(self, session):
+    api = get_spark_api(self.user)
+
+    if session['id'] is not None:
+      try:
+        api.close(session['id'])
+        return {
+          'session': session['id'],
+          'status': 0
+        }
+      except RestException, e:
+        if e.code == 404 or e.code == 500: # TODO remove the 500
+          raise SessionExpired(e)
+    else:
+      return {'status': -1}
+
+  def _get_jobs(self, log):
+    return []
+
+
+class SparkBatchApi(Api):
+
+  def create_session(self, lang, properties=None):
+    return {
+        'type': lang,
+        'id': None
+    }
+
+  def execute(self, notebook, snippet):
+    api = get_spark_api(self.user)
+
+    properties = {
+        'file': snippet['properties'].get('app_jar'),
+        'className': snippet['properties'].get('class'),
+        'args': snippet['properties'].get('arguments'),
+        'pyFiles': snippet['properties'].get('py_file'),
+        # files
+        # driverMemory
+        # driverCores
+        # executorMemory
+        # executorCores
+        # archives
+    }
+
+    response = api.submit_batch(properties)
+    return {
+        'id': response['id'],
+        'has_result_set': True,
+        'properties': []
+    }
+
+  def check_status(self, notebook, snippet):
+    api = get_spark_api(self.user)
+
+    state = api.get_batch_status(snippet['result']['handle']['id'])
+    return {
+        'status': state,
+    }
+
+  def get_log(self, notebook, snippet, startFrom=0, size=None):
+    api = get_spark_api(self.user)
+
+    return api.get_batch_log(snippet['result']['handle']['id'], startFrom=startFrom, size=size)
+
+  def close_statement(self, snippet):
+    api = get_spark_api(self.user)
+
+    session_id = snippet['result']['handle']['id']
+    if session_id is not None:
+      api.close_batch(session_id)
+      return {
+        'session': session_id,
+        'status': 0
+      }
+    else:
+      return {'status': -1}  # skipped
+
+  def cancel(self, notebook, snippet):
+    # Batch jobs do not support interruption, so close statement instead.
+    return self.close_statement(snippet)
+
+  def _progress(self, snippet, logs):
+    return 50
+
+  def _get_jobs(self, log):
+    return []

BIN
desktop/libs/notebook/src/notebook/static/notebook/art/icon_notebook_24.png


+ 0 - 167
desktop/libs/notebook/src/notebook/static/notebook/css/admin.css

@@ -1,167 +0,0 @@
-/*
- Licensed to Cloudera, Inc. under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  Cloudera, Inc. licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-     http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-h3 {
-  line-height: 24px;
-}
-
-.sidebar-nav {
-  padding: 9px 0;
-}
-
-#content-editor {
-  border: 1px dotted #DDD;
-}
-
-.available-fields {
-  padding: 0;
-  padding-left:10px;
-}
-
-.available-fields ul {
-  list-style: none outside none;
-  padding: 0;
-  margin: 0;
-  cursor: pointer;
-}
-
-.available-fields ul li {
-  cursor: pointer;
-  color: #666;
-}
-
-.form-actions {
-  padding-left: 0!important;
-}
-
-.bubble {
-  float: left;
-  background-color: #EEEEEE;
-  border: 1px solid #E0E0E0;
-  padding: 8px;
-  margin: 4px;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-
-.section {
-  background-color: #FAFAFA;
-  -webkit-border-radius: 4px;
-  -moz-border-radius: 4px;
-  border-radius: 4px;
-}
-
-.miniform {
-  margin-top: 20px;
-  background-color: #F3F3F3;
-  padding: 10px;
-  border-top: 1px solid #DDD;
-}
-
-.select-mini {
-  width: 100%;
-}
-
-.search-bar {
-  background-color: #fafafa;
-  border-bottom: 1px solid #e3e3e3;
-  -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-  -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-  box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-  margin: 0;
-  margin-bottom: 20px;
-  padding: 10px;
-  padding-left: 20px;
-  padding-right: 20px;
-  text-align: left;
-}
-
-.search-bar h4 {
-  font-size: 20px !important;
-  color: #338BB8 !important;
-  padding: 0 !important;
-  margin-top: 4px !important;
-  margin-left: 20px;
-  border: none !important;
-  max-width: none!important;
-}
-
-.waiting {
-  font-size: 196px;
-  color: #DDD;
-}
-
-h1.emptyMessage {
-  margin-top: 50px;
-  color: #BBB;
-  line-height: 60px;
-}
-
-.stepDetails {
-  padding: 5px;
-}
-
-.editable {
-  cursor: pointer;
-}
-
-.collectionRow {
-  cursor: pointer;
-  margin-bottom: 10px;
-  padding: 10px;
-  height: 40px;
-}
-
-.collectionRow:hover {
-  background-color: #EFEFEF;
-}
-
-.hue-colorchart {
-  width: 100%;
-}
-
-.hue-colorchart td {
-  padding: 4px;
-  cursor: pointer;
-}
-
-.cloud-tmpl {
-  border: 1px dashed #FFFFFF;
-  padding: 10px;
-  margin-bottom: 10px;
-  color: #666;
-  cursor: pointer;
-}
-
-.cloud-tmpl h4 {
-  margin-top: 0;
-}
-
-.cloud-tmpl.selected {
-  border: 1px dashed #338BB8;
-}
-
-.cloud-tmpl:hover, .cloud-tmpl.selected:hover  {
-  color: #000;
-  border: 1px dashed #CCCCCC;
-}
-
-.actionbar-actions {
-  min-height: 20px;
-}

+ 0 - 0
apps/spark/src/spark/static/spark/css/spark.css → desktop/libs/notebook/src/notebook/static/notebook/css/notebook.css


+ 0 - 0
apps/spark/src/spark/static/spark/js/assist.js → desktop/libs/notebook/src/notebook/static/notebook/js/assist.js


+ 11 - 11
apps/spark/src/spark/static/spark/js/spark.ko.js → desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -397,7 +397,7 @@ var Snippet = function (vm, notebook, snippet) {
       self.close();
     }
 
-    $.post("/spark/api/execute", {
+    $.post("/notebook/api/execute", {
       notebook: ko.mapping.toJSON(notebook.getContext()),
       snippet: ko.mapping.toJSON(self.getContext())
     }, function (data) {
@@ -424,7 +424,7 @@ var Snippet = function (vm, notebook, snippet) {
   };
 
   self.fetchResultData = function (rows, startOver) {
-    $.post("/spark/api/fetch_result_data", {
+    $.post("/notebook/api/fetch_result_data", {
       notebook: ko.mapping.toJSON(notebook.getContext()),
       snippet: ko.mapping.toJSON(self.getContext()),
       rows: rows,
@@ -469,7 +469,7 @@ var Snippet = function (vm, notebook, snippet) {
   };
 
   self.fetchResultMetadata = function () {
-    $.post("/spark/api/fetch_result_metadata", {
+    $.post("/notebook/api/fetch_result_metadata", {
       notebook: ko.mapping.toJSON(notebook.getContext()),
       snippet: ko.mapping.toJSON(self.getContext())
     }, function (data) {
@@ -485,7 +485,7 @@ var Snippet = function (vm, notebook, snippet) {
   };
 
   self.checkStatus = function () {
-    $.post("/spark/api/check_status", {
+    $.post("/notebook/api/check_status", {
       notebook: ko.mapping.toJSON(notebook.getContext()),
       snippet: ko.mapping.toJSON(self.getContext())
     }, function (data) {
@@ -519,7 +519,7 @@ var Snippet = function (vm, notebook, snippet) {
       self.checkStatusTimeout = null;
     }
 
-    $.post("/spark/api/cancel_statement", {
+    $.post("/notebook/api/cancel_statement", {
       notebook: ko.mapping.toJSON(notebook.getContext()),
       snippet: ko.mapping.toJSON(self.getContext())
     }, function (data) {
@@ -540,7 +540,7 @@ var Snippet = function (vm, notebook, snippet) {
       self.checkStatusTimeout = null;
     }
 
-    $.post("/spark/api/close_statement", {
+    $.post("/notebook/api/close_statement", {
       notebook: ko.mapping.toJSON(notebook.getContext()),
       snippet: ko.mapping.toJSON(self.getContext())
     }, function (data) {
@@ -556,7 +556,7 @@ var Snippet = function (vm, notebook, snippet) {
   };
 
   self.getLogs = function () {
-    $.post("/spark/api/get_logs", {
+    $.post("/notebook/api/get_logs", {
       notebook: ko.mapping.toJSON(notebook.getContext()),
       snippet: ko.mapping.toJSON(self.getContext()),
       from: self.result.logLines
@@ -732,7 +732,7 @@ var Notebook = function (vm, notebook) {
       }
     };
 
-    $.post("/spark/api/create_session", {
+    $.post("/notebook/api/create_session", {
       notebook: ko.mapping.toJSON(self.getContext()),
       session: ko.mapping.toJSON(session) // e.g. {'type': 'hive', 'properties': [{'driverCores': '2'}]}
     }, function (data) {
@@ -790,7 +790,7 @@ var Notebook = function (vm, notebook) {
   }
 
   self.save = function () {
-    $.post("/spark/api/notebook/save", {
+    $.post("/notebook/api/notebook/save", {
       "notebook": ko.mapping.toJSON(self, SPARK_MAPPING)
     }, function (data) {
       if (data.status == 0) {
@@ -809,7 +809,7 @@ var Notebook = function (vm, notebook) {
   };
 
   self.close = function () {
-    $.post("/spark/api/notebook/close", {
+    $.post("/notebook/api/notebook/close", {
       "notebook": ko.mapping.toJSON(self, SPARK_MAPPING)
     });
   };
@@ -828,7 +828,7 @@ var Notebook = function (vm, notebook) {
   };
 
   self.closeSession = function (session, silent, callback) {
-    $.post("/spark/api/close_session", {
+    $.post("/notebook/api/close_session", {
       session: ko.mapping.toJSON(session)
     }, function (data) {
       if (!silent && data.status != 0 && data.status != -2) {

+ 1 - 1
apps/spark/src/spark/templates/editor.mako → desktop/libs/notebook/src/notebook/templates/editor.mako

@@ -27,7 +27,7 @@ ${ commonheader(_('Editor'), app_name, user, "68px") | n,unicode }
 <script type="text/javascript">
   if (window.location.hash != "") {
     if (window.location.hash.indexOf("editor") > -1) {
-      location.href = "/spark/editor?" + window.location.hash.substr(1).replace(/(<([^>]+)>)/ig, "");
+      location.href = "/notebook/editor?" + window.location.hash.substr(1).replace(/(<([^>]+)>)/ig, "");
     }
   }
 </script>

+ 8 - 8
apps/spark/src/spark/templates/editor_components.mako → desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -23,7 +23,7 @@ from desktop.views import _ko
 
 <%def name="includes()">
 <link rel="stylesheet" href="${ static('desktop/css/common_dashboard.css') }">
-<link rel="stylesheet" href="${ static('spark/css/spark.css') }">
+<link rel="stylesheet" href="${ static('notebook/css/notebook.css') }">
 <link rel="stylesheet" href="${ static('desktop/ext/css/bootstrap-editable.css') }">
 <link rel="stylesheet" href="${ static('desktop/ext/chosen/chosen.min.css') }">
 <link rel="stylesheet" href="${ static('desktop/ext/css/hue-charts.css') }">
@@ -47,10 +47,10 @@ from desktop.views import _ko
 <script src="${ static('desktop/js/ko.editable.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/js/hue.utils.js') }"></script>
 <script src="${ static('desktop/js/ko.hue-bindings.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('spark/js/assist.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('spark/js/spark.ko.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/chosen/chosen.jquery.min.js') }" type="text/javascript" charset="utf-8"></script>
 
+<script src="${ static('notebook/js/assist.js') }" type="text/javascript" charset="utf-8"></script>
+<script src="${ static('notebook/js/notebook.ko.js') }" type="text/javascript" charset="utf-8"></script>
 
 <script src="${ static('desktop/js/hue.geo.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/js/hue.colors.js') }" type="text/javascript" charset="utf-8"></script>
@@ -157,11 +157,11 @@ from desktop.views import _ko
 
    &nbsp;&nbsp;&nbsp;
 
-   <a class="btn" href="${ url('spark:new') }" title="${ _('New Notebook') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}">
+   <a class="btn" href="${ url('notebook:new') }" title="${ _('New Notebook') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}">
      <i class="fa fa-file-o"></i>
    </a>
 
-   <a class="btn" href="${ url('spark:notebooks') }" title="${ _('Notebooks') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}">
+   <a class="btn" href="${ url('notebook:notebooks') }" title="${ _('Notebooks') }" rel="tooltip" data-placement="bottom" data-bind="css: {'btn': true}">
      <i class="fa fa-tags"></i>
    </a>
   </div>
@@ -224,9 +224,9 @@ from desktop.views import _ko
     <a title="${_('Toggle Assist')}" class="pointer hide-assist" data-bind="click: function() { $root.isLeftPanelVisible(false) }">
       <i class="fa fa-chevron-left"></i>
     </a>
-    <div class="assist" data-bind="component: { name: 'assist-panel', params: { assistHelper: assistHelper, appName: 'spark'  }}"></div>
+    <div class="assist" data-bind="component: { name: 'assist-panel', params: { assistHelper: assistHelper, appName: 'notebook'  }}"></div>
   </div>
-  <div class="resizer" data-bind="visible: $root.isLeftPanelVisible() && $root.assistAvailable, splitDraggable : { appName: 'spark', leftPanelVisible: $root.isLeftPanelVisible }"><div class="resize-bar">&nbsp;</div></div>
+  <div class="resizer" data-bind="visible: $root.isLeftPanelVisible() && $root.assistAvailable, splitDraggable : { appName: 'notebook', leftPanelVisible: $root.isLeftPanelVisible }"><div class="resize-bar">&nbsp;</div></div>
   <div class="right-panel" data-bind="event: { scroll: function(){ $(document).trigger('hideAutocomplete'); } }">
     <div>
       <div class="row-fluid row-container sortable-snippets" data-bind="css: {'is-editing': $root.isEditing},
@@ -737,7 +737,7 @@ from desktop.views import _ko
         <i class="fa fa-file-text-o"></i>
       </a>
 
-      <form method="POST" action="${ url('spark:download') }" class="download-form" style="display: inline">
+      <form method="POST" action="${ url('notebook:download') }" class="download-form" style="display: inline">
         ${ csrf_token(request) | n,unicode }
         <input type="hidden" name="notebook"/>
         <input type="hidden" name="snippet"/>

+ 1 - 1
apps/spark/src/spark/templates/notebook.mako → desktop/libs/notebook/src/notebook/templates/notebook.mako

@@ -27,7 +27,7 @@ ${ commonheader(_('Notebook'), app_name, user, "68px") | n,unicode }
 <script type="text/javascript">
   if (window.location.hash != "") {
     if (window.location.hash.indexOf("notebook") > -1) {
-      location.href = "/spark/notebook?" + window.location.hash.substr(1).replace(/(<([^>]+)>)/ig, "");
+      location.href = "/notebook/notebook?" + window.location.hash.substr(1).replace(/(<([^>]+)>)/ig, "");
     }
   }
 </script>

+ 4 - 4
apps/spark/src/spark/templates/notebooks.mako → desktop/libs/notebook/src/notebook/templates/notebooks.mako

@@ -56,7 +56,7 @@ ${ commonheader(_("Notebooks"), "spark", user, "60px") | n,unicode }
     </%def>
 
     <%def name="creation()">
-      <a href="${ url('spark:new') }" class="btn"><i class="fa fa-plus-circle"></i> ${ _('Create') }</a>
+      <a href="${ url('notebook:new') }" class="btn"><i class="fa fa-plus-circle"></i> ${ _('Create') }</a>
       <a data-bind="click: function() { $('#import-documents').modal('show'); }" class="btn">
         <i class="fa fa-upload"></i> ${ _('Import') }
       </a>
@@ -78,7 +78,7 @@ ${ commonheader(_("Notebooks"), "spark", user, "60px") | n,unicode }
       <tr>
         <td data-bind="click: $root.handleSelect" class="center" style="cursor: default" data-row-selector-exclude="true">
           <div class="hueCheckbox fa" data-bind="multiCheck: '#notebookTable', css: {'fa-check': isSelected }" data-row-selector-exclude="true"></div>
-          <a data-bind="attr: { 'href': '${ url('spark:notebook') }?notebook=' + id() }" data-row-selector="true"></a>
+          <a data-bind="attr: { 'href': '${ url('notebook:notebook') }?notebook=' + id() }" data-row-selector="true"></a>
         </td>
         <td data-bind="text: name"></td>
         <td data-bind="text: description"></td>
@@ -164,7 +164,7 @@ ${ commonshare() | n,unicode }
     self.datatable = null;
 
     self.delete2 = function() {
-      $.post("${ url('spark:delete') }", {
+      $.post("${ url('notebook:delete') }", {
         "notebooks": ko.mapping.toJSON(self.selectedJobs)
       }, function() {
         window.location.reload();
@@ -175,7 +175,7 @@ ${ commonshare() | n,unicode }
     };
 
     self.copy = function() {
-      $.post("${ url('spark:copy') }", {
+      $.post("${ url('notebook:copy') }", {
         "notebooks": ko.mapping.toJSON(self.selectedJobs)
       }, function(data) {
         window.location.reload();

+ 32 - 0
desktop/libs/notebook/src/notebook/urls.py

@@ -16,3 +16,35 @@
 # limitations under the License.
 
 from django.conf.urls import patterns, url
+
+
+# Views
+urlpatterns = patterns('notebook.views',
+  url(r'^$', 'notebook', name='index'),
+  url(r'^notebook$', 'notebook', name='notebook'),
+  url(r'^notebooks$', 'notebooks', name='notebooks'),
+  url(r'^new$', 'new', name='new'),
+  url(r'^download$', 'download', name='download'),
+  url(r'^install_examples$', 'install_examples', name='install_examples'),
+  url(r'^delete$', 'delete', name='delete'),
+  url(r'^copy$', 'copy', name='copy'),
+
+  url(r'^editor$', 'editor', name='editor'),
+)
+
+# APIs
+urlpatterns += patterns('notebook.api',
+  url(r'^api/create_session$', 'create_session', name='create_session'),
+  url(r'^api/close_session$', 'close_session', name='close_session'),
+  url(r'^api/execute$', 'execute', name='execute'),
+  url(r'^api/check_status$', 'check_status', name='check_status'),
+  url(r'^api/fetch_result_data$', 'fetch_result_data', name='fetch_result_data'),
+  url(r'^api/fetch_result_metadata$', 'fetch_result_metadata', name='fetch_result_metadata'),
+  url(r'^api/cancel_statement', 'cancel_statement', name='cancel_statement'),
+  url(r'^api/close_statement', 'close_statement', name='close_statement'),
+  url(r'^api/get_logs', 'get_logs', name='get_logs'),
+
+  url(r'^api/notebook/save$', 'save_notebook', name='save_notebook'),
+  url(r'^api/notebook/open$', 'open_notebook', name='open_notebook'),
+  url(r'^api/notebook/close$', 'close_notebook', name='close_notebook'),
+)

+ 156 - 0
desktop/libs/notebook/src/notebook/views.py

@@ -14,3 +14,159 @@
 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 # See the License for the specific language governing permissions and
 # limitations under the License.
+
+import json
+import logging
+
+from django.core.urlresolvers import reverse
+from django.utils.translation import ugettext as _
+
+from desktop.lib.django_util import render, JsonResponse
+from desktop.lib.json_utils import JSONEncoderForHTML
+from desktop.models import Document2, Document
+from spark.conf import LIVY_SERVER_SESSION_KIND
+
+from notebook.conf import LANGUAGES
+from notebook.decorators import check_document_access_permission, check_document_modify_permission
+from notebook.models import Notebook, get_api, SparkApi
+from notebook.management.commands.notebook_setup import Command
+
+
+LOG = logging.getLogger(__name__)
+
+
+@check_document_access_permission()
+def notebook(request):
+  notebook_id = request.GET.get('notebook')
+
+  if notebook_id:
+    notebook = Notebook(document=Document2.objects.get(id=notebook_id))
+  else:
+    notebook = Notebook()
+
+  autocomplete_base_url = ''
+  try:
+    autocomplete_base_url = reverse('beeswax:api_autocomplete_databases', kwargs={})
+  except:
+    LOG.exception('failed to get autocomplete base url')
+
+  return render('notebook.mako', request, {
+      'notebooks_json': json.dumps([notebook.get_data()]),
+      'options_json': json.dumps({
+          'languages': LANGUAGES.get(),
+          'snippet_placeholders' : {
+              'spark': _('Example: 1 + 1, or press CTRL + space'),
+              'pyspark': _('Example: 1 + 1, or press CTRL + space'),
+              'impala': _('Example: SELECT * FROM tablename, or press CTRL + space'),
+              'hive': _('Example: SELECT * FROM tablename, or press CTRL + space'),
+              'r': _('Example: 1 + 1, or press CTRL + space')
+          },
+          'session_properties': SparkApi.PROPERTIES
+      }),
+      'autocomplete_base_url': autocomplete_base_url,
+      'is_yarn_mode': LIVY_SERVER_SESSION_KIND.get()
+  })
+
+
+@check_document_access_permission()
+def editor(request):
+  editor_id = request.GET.get('editor')
+
+  if editor_id:
+    editor = Notebook(document=Document2.objects.get(id=editor_id))
+  else:
+    editor = Notebook()
+    data = editor.get_data()
+    data['name'] = 'Hive SQL Editor'
+    data['snippets'] = json.loads('[{"id":"c111cbb4-f475-4050-c5a1-02df6c31e3d8","name":"","type":"hive","editorMode":"text/x-hiveql","statement_raw":"Example: SELECT * FROM tablename, or press CTRL + space","codemirrorSize":100,"status":"ready","properties":{"settings":[],"files":[]},"variables":[],"variableNames":[],"statement":"Example: SELECT * FROM tablename, or press CTRL + space","result":{"id":"149347d9-3ae7-8d06-4cc8-d4bce5e72dc8","type":"table","hasResultset":true,"handle":{},"meta":[],"cleanedMeta":[],"fetchedOnce":false,"startTime":"2015-07-17T20:38:21.970Z","endTime":"2015-07-17T20:38:21.970Z","executionTime":0,"cleanedNumericMeta":[],"cleanedStringMeta":[],"cleanedDateTimeMeta":[],"data":[],"logs":"","logLines":0,"errors":"","hasSomeResults":false},"showGrid":true,"showChart":false,"showLogs":false,"progress":0,"size":12,"offset":0,"isLoading":false,"klass":"snippet card card-widget","editorKlass":"editor span12","resultsKlass":"results hive","errorsKlass":"results hive alert alert-error","chartType":"bars","chartSorting":"none","chartYMulti":[],"chartData":[],"tempChartOptions":{},"isLeftPanelVisible":false,"codeVisible":true,"settingsVisible":false,"checkStatusTimeout":null}]')
+    editor.data = json.dumps(data)
+
+  autocomplete_base_url = ''
+  try:
+    autocomplete_base_url = reverse('beeswax:api_autocomplete_databases', kwargs={})
+  except:
+    LOG.exception('failed to get autocomplete base url')
+
+  return render('editor.mako', request, {
+      'notebooks_json': json.dumps([editor.get_data()]),
+      'options_json': json.dumps({
+          'languages': [{"name": "Hive SQL", "type": "hive"}],
+          'snippet_placeholders' : {
+              'scala': _('Example: 1 + 1, or press CTRL + space'),
+              'python': _('Example: 1 + 1, or press CTRL + space'),
+              'impala': _('Example: SELECT * FROM tablename, or press CTRL + space'),
+              'hive': _('Example: SELECT * FROM tablename, or press CTRL + space'),
+              'text': _('<h2>This is a text snippet</h2>Type your text here')
+          }
+      }),
+      'autocomplete_base_url': autocomplete_base_url,
+  })
+
+
+def new(request):
+  return notebook(request)
+
+
+def notebooks(request):
+  notebooks = [d.content_object.to_dict() for d in Document.objects.get_docs(request.user, Document2, extra='notebook')]
+
+  return render('notebooks.mako', request, {
+      'notebooks_json': json.dumps(notebooks, cls=JSONEncoderForHTML)
+  })
+
+
+@check_document_modify_permission()
+def delete(request):
+  notebooks = json.loads(request.POST.get('notebooks', '[]'))
+
+  for notebook in notebooks:
+    doc2 = Document2.objects.get(uuid=notebook['uuid'])
+    doc = doc2.doc.get()
+    doc.can_write_or_exception(request.user)
+
+    doc.delete()
+    doc2.delete()
+
+  return JsonResponse({})
+
+
+@check_document_access_permission()
+def copy(request):
+  notebooks = json.loads(request.POST.get('notebooks', '[]'))
+
+  for notebook in notebooks:
+    doc2 = Document2.objects.get(uuid=notebook['uuid'])
+    doc = doc2.doc.get()
+
+    name = doc2.name + '-copy'
+    doc2 = doc2.copy(name=name, owner=request.user)
+
+    doc.copy(content_object=doc2, name=name, owner=request.user)
+
+  return JsonResponse({})
+
+
+@check_document_access_permission()
+def download(request):
+  notebook = json.loads(request.POST.get('notebook', '{}'))
+  snippet = json.loads(request.POST.get('snippet', '{}'))
+  file_format = request.POST.get('format', 'csv')
+
+  return get_api(request.user, snippet).download(notebook, snippet, file_format)
+
+
+def install_examples(request):
+  response = {'status': -1, 'message': ''}
+
+  if request.method == 'POST':
+    try:
+      Command().handle(user=request.user)
+      response['status'] = 0
+    except Exception, err:
+      LOG.exception(err)
+      response['message'] = str(err)
+  else:
+    response['message'] = _('A POST request is required.')
+
+  return JsonResponse(response)
+