Browse Source

[notebook] Move Notebook specific code out of Spark app

Romain Rigaux 10 năm trước cách đây
mục cha
commit
5743aa9906
38 tập tin đã thay đổi với 5271 bổ sung1614 xóa
  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)
+