diff --git a/3rdparty/MDB2/Driver/Datatype/oci8.php b/3rdparty/MDB2/Driver/Datatype/oci8.php new file mode 100644 index 0000000000..4d2e792a80 --- /dev/null +++ b/3rdparty/MDB2/Driver/Datatype/oci8.php @@ -0,0 +1,499 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Datatype/Common.php'; + +/** + * MDB2 OCI8 driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Datatype_oci8 extends MDB2_Driver_Datatype_Common +{ + // {{{ _baseConvertResult() + + /** + * general type conversion method + * + * @param mixed $value refernce to a value to be converted + * @param string $type specifies which type to convert to + * @param boolean $rtrim [optional] when TRUE [default], apply rtrim() to text + * @return object a MDB2 error on failure + * @access protected + */ + function _baseConvertResult($value, $type, $rtrim = true) + { + if (null === $value) { + return null; + } + switch ($type) { + case 'text': + if (is_object($value) && is_a($value, 'OCI-Lob')) { + //LOB => fetch into variable + $clob = $this->_baseConvertResult($value, 'clob', $rtrim); + if (!PEAR::isError($clob) && is_resource($clob)) { + $clob_value = ''; + while (!feof($clob)) { + $clob_value .= fread($clob, 8192); + } + $this->destroyLOB($clob); + } + $value = $clob_value; + } + if ($rtrim) { + $value = rtrim($value); + } + return $value; + case 'date': + return substr($value, 0, strlen('YYYY-MM-DD')); + case 'time': + return substr($value, strlen('YYYY-MM-DD '), strlen('HH:MI:SS')); + } + return parent::_baseConvertResult($value, $type, $rtrim); + } + + // }}} + // {{{ getTypeDeclaration() + + /** + * Obtain DBMS specific SQL code portion needed to declare an text type + * field to be used in statements like CREATE TABLE. + * + * @param array $field associative array with the name of the properties + * of the field being declared as array indexes. Currently, the types + * of supported field properties are as follows: + * + * length + * Integer value that determines the maximum length of the text + * field. If this argument is missing the field should be + * declared to have the longest length allowed by the DBMS. + * + * default + * Text value to be used as default for this field. + * + * notnull + * Boolean flag that indicates whether this field is constrained + * to not be set to null. + * @return string DBMS specific SQL code portion that should be used to + * declare the specified field. + * @access public + */ + function getTypeDeclaration($field) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + switch ($field['type']) { + case 'text': + $length = !empty($field['length']) + ? $field['length'] : $db->options['default_text_field_length']; + $fixed = !empty($field['fixed']) ? $field['fixed'] : false; + return $fixed ? 'CHAR('.$length.')' : 'VARCHAR2('.$length.')'; + case 'clob': + return 'CLOB'; + case 'blob': + return 'BLOB'; + case 'integer': + if (!empty($field['length'])) { + switch((int)$field['length']) { + case 1: $digit = 3; break; + case 2: $digit = 5; break; + case 3: $digit = 8; break; + case 4: $digit = 10; break; + case 5: $digit = 13; break; + case 6: $digit = 15; break; + case 7: $digit = 17; break; + case 8: $digit = 20; break; + default: $digit = 10; + } + return 'NUMBER('.$digit.')'; + } + return 'INT'; + case 'boolean': + return 'NUMBER(1)'; + case 'date': + case 'time': + case 'timestamp': + return 'DATE'; + case 'float': + return 'NUMBER'; + case 'decimal': + $scale = !empty($field['scale']) ? $field['scale'] : $db->options['decimal_places']; + return 'NUMBER(*,'.$scale.')'; + } + } + + // }}} + // {{{ _quoteCLOB() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteCLOB($value, $quote, $escape_wildcards) + { + return 'EMPTY_CLOB()'; + } + + // }}} + // {{{ _quoteBLOB() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteBLOB($value, $quote, $escape_wildcards) + { + return 'EMPTY_BLOB()'; + } + + // }}} + // {{{ _quoteDate() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteDate($value, $quote, $escape_wildcards) + { + return $this->_quoteText("$value 00:00:00", $quote, $escape_wildcards); + } + + // }}} + // {{{ _quoteTimestamp() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + //function _quoteTimestamp($value, $quote, $escape_wildcards) + //{ + // return $this->_quoteText($value, $quote, $escape_wildcards); + //} + + // }}} + // {{{ _quoteTime() + + /** + * Convert a text value into a DBMS specific format that is suitable to + * compose query statements. + * + * @param string $value text string value that is intended to be converted. + * @param bool $quote determines if the value should be quoted and escaped + * @param bool $escape_wildcards if to escape escape wildcards + * @return string text string that represents the given argument value in + * a DBMS specific format. + * @access protected + */ + function _quoteTime($value, $quote, $escape_wildcards) + { + return $this->_quoteText("0001-01-01 $value", $quote, $escape_wildcards); + } + + // }}} + // {{{ writeLOBToFile() + + /** + * retrieve LOB from the database + * + * @param array $lob array + * @param string $file name of the file into which the LOb should be fetched + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access protected + */ + function writeLOBToFile($lob, $file) + { + if (preg_match('/^(\w+:\/\/)(.*)$/', $file, $match)) { + if ($match[1] == 'file://') { + $file = $match[2]; + } + } + $lob_data = stream_get_meta_data($lob); + $lob_index = $lob_data['wrapper_data']->lob_index; + $result = $this->lobs[$lob_index]['resource']->writetofile($file); + $this->lobs[$lob_index]['resource']->seek(0); + if (!$result) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(null, null, null, + 'Unable to write LOB to file', __FUNCTION__); + } + return MDB2_OK; + } + + // }}} + // {{{ _retrieveLOB() + + /** + * retrieve LOB from the database + * + * @param array $lob array + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access protected + */ + function _retrieveLOB(&$lob) + { + if (!is_object($lob['resource'])) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); + } + + if (!$lob['loaded'] +# && !method_exists($lob['resource'], 'read') + ) { + $lob['value'] = $lob['resource']->load(); + $lob['resource']->seek(0); + } + $lob['loaded'] = true; + return MDB2_OK; + } + + // }}} + // {{{ _readLOB() + + /** + * Read data from large object input stream. + * + * @param array $lob array + * @param blob $data reference to a variable that will hold data to be + * read from the large object input stream + * @param int $length integer value that indicates the largest ammount of + * data to be read from the large object input stream. + * @return mixed length on success, a MDB2 error on failure + * @access protected + */ + function _readLOB($lob, $length) + { + if ($lob['loaded']) { + return parent::_readLOB($lob, $length); + } + + if (!is_object($lob['resource'])) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'attemped to retrieve LOB from non existing or NULL column', __FUNCTION__); + } + + $data = $lob['resource']->read($length); + if (!is_string($data)) { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(null, null, null, + 'Unable to read LOB', __FUNCTION__); + } + return $data; + } + + // }}} + // {{{ patternEscapeString() + + /** + * build string to define escape pattern string + * + * @access public + * + * + * @return string define escape pattern + */ + function patternEscapeString() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + return " ESCAPE '". $db->string_quoting['escape_pattern'] ."'"; + } + + // }}} + // {{{ _mapNativeDatatype() + + /** + * Maps a native array description of a field to a MDB2 datatype and length + * + * @param array $field native field description + * @return array containing the various possible types, length, sign, fixed + * @access public + */ + function _mapNativeDatatype($field) + { + $db_type = strtolower($field['type']); + $type = array(); + $length = $unsigned = $fixed = null; + if (!empty($field['length'])) { + $length = $field['length']; + } + switch ($db_type) { + case 'integer': + case 'pls_integer': + case 'binary_integer': + $type[] = 'integer'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + break; + case 'varchar': + case 'varchar2': + case 'nvarchar2': + $fixed = false; + case 'char': + case 'nchar': + $type[] = 'text'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + if ($fixed !== false) { + $fixed = true; + } + break; + case 'date': + case 'timestamp': + $type[] = 'timestamp'; + $length = null; + break; + case 'float': + $type[] = 'float'; + break; + case 'number': + if (!empty($field['scale'])) { + $type[] = 'decimal'; + $length = $length.','.$field['scale']; + } else { + $type[] = 'integer'; + if ($length == '1') { + $type[] = 'boolean'; + if (preg_match('/^(is|has)/', $field['name'])) { + $type = array_reverse($type); + } + } + } + break; + case 'long': + $type[] = 'text'; + case 'clob': + case 'nclob': + $type[] = 'clob'; + break; + case 'blob': + case 'raw': + case 'long raw': + case 'bfile': + $type[] = 'blob'; + $length = null; + break; + case 'rowid': + case 'urowid': + default: + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'unknown database attribute type: '.$db_type, __FUNCTION__); + } + + if ((int)$length <= 0) { + $length = null; + } + + return array($type, $length, $unsigned, $fixed); + } +} + +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Function/oci8.php b/3rdparty/MDB2/Driver/Function/oci8.php new file mode 100644 index 0000000000..757d17fcb8 --- /dev/null +++ b/3rdparty/MDB2/Driver/Function/oci8.php @@ -0,0 +1,187 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Function/Common.php'; + +/** + * MDB2 oci8 driver for the function modules + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Function_oci8 extends MDB2_Driver_Function_Common +{ + // {{{ executeStoredProc() + + /** + * Execute a stored procedure and return any results + * + * @param string $name string that identifies the function to execute + * @param mixed $params array that contains the paramaters to pass the stored proc + * @param mixed $types array that contains the types of the columns in + * the result set + * @param mixed $result_class string which specifies which result class to use + * @param mixed $result_wrap_class string which specifies which class to wrap results in + * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $query = 'EXEC '.$name; + $query .= $params ? '('.implode(', ', $params).')' : '()'; + return $db->query($query, $types, $result_class, $result_wrap_class); + } + + // }}} + // {{{ functionTable() + + /** + * return string for internal table used when calling only a function + * + * @return string for internal table used when calling only a function + * @access public + */ + function functionTable() + { + return ' FROM dual'; + } + + // }}} + // {{{ now() + + /** + * Return string to call a variable with the current timestamp inside an SQL statement + * There are three special variables for current date and time: + * - CURRENT_TIMESTAMP (date and time, TIMESTAMP type) + * - CURRENT_DATE (date, DATE type) + * - CURRENT_TIME (time, TIME type) + * + * @return string to call a variable with the current timestamp + * @access public + */ + function now($type = 'timestamp') + { + switch ($type) { + case 'date': + case 'time': + case 'timestamp': + default: + return 'TO_CHAR(CURRENT_TIMESTAMP, \'YYYY-MM-DD HH24:MI:SS\')'; + } + } + + // }}} + // {{{ unixtimestamp() + + /** + * return string to call a function to get the unix timestamp from a iso timestamp + * + * @param string $expression + * + * @return string to call a variable with the timestamp + * @access public + */ + function unixtimestamp($expression) + { + $utc_offset = 'CAST(SYS_EXTRACT_UTC(SYSTIMESTAMP) AS DATE) - CAST(SYSTIMESTAMP AS DATE)'; + $epoch_date = 'to_date(\'19700101\', \'YYYYMMDD\')'; + return '(CAST('.$expression.' AS DATE) - '.$epoch_date.' + '.$utc_offset.') * 86400 seconds'; + } + + // }}} + // {{{ substring() + + /** + * return string to call a function to get a substring inside an SQL statement + * + * @return string to call a function to get a substring + * @access public + */ + function substring($value, $position = 1, $length = null) + { + if (null !== $length) { + return "SUBSTR($value, $position, $length)"; + } + return "SUBSTR($value, $position)"; + } + + // }}} + // {{{ random() + + /** + * return string to call a function to get random value inside an SQL statement + * + * @return return string to generate float between 0 and 1 + * @access public + */ + function random() + { + return 'dbms_random.value'; + } + + // }}}} + // {{{ guid() + + /** + * Returns global unique identifier + * + * @return string to get global unique identifier + * @access public + */ + function guid() + { + return 'SYS_GUID()'; + } + + // }}}} +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Manager/oci8.php b/3rdparty/MDB2/Driver/Manager/oci8.php new file mode 100644 index 0000000000..90ae8eb230 --- /dev/null +++ b/3rdparty/MDB2/Driver/Manager/oci8.php @@ -0,0 +1,1340 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +require_once 'MDB2/Driver/Manager/Common.php'; + +/** + * MDB2 oci8 driver for the management modules + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Manager_oci8 extends MDB2_Driver_Manager_Common +{ + // {{{ createDatabase() + + /** + * create a new database + * + * @param string $name name of the database that should be created + * @param array $options array with charset, collation info + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createDatabase($name, $options = array()) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $username = $db->options['database_name_prefix'].$name; + $password = $db->dsn['password'] ? $db->dsn['password'] : $name; + $tablespace = $db->options['default_tablespace'] + ? ' DEFAULT TABLESPACE '.$db->options['default_tablespace'] : ''; + + $query = 'CREATE USER '.$username.' IDENTIFIED BY '.$password.$tablespace; + $result = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result)) { + return $result; + } + $query = 'GRANT CREATE SESSION, CREATE TABLE, UNLIMITED TABLESPACE, CREATE SEQUENCE, CREATE TRIGGER TO '.$username; + $result = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result)) { + $query = 'DROP USER '.$username.' CASCADE'; + $result2 = $db->standaloneQuery($query, null, true); + if (PEAR::isError($result2)) { + return $db->raiseError($result2, null, null, + 'could not setup the database user', __FUNCTION__); + } + return $result; + } + return MDB2_OK; + } + + // }}} + // {{{ alterDatabase() + + /** + * alter an existing database + * + * IMPORTANT: the safe way to change the db charset is to do a full import/export! + * If - and only if - the new character set is a strict superset of the current + * character set, it is possible to use the ALTER DATABASE CHARACTER SET to + * expedite the change in the database character set. + * + * @param string $name name of the database that is intended to be changed + * @param array $options array with name, charset info + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function alterDatabase($name, $options = array()) + { + //disabled + //return parent::alterDatabase($name, $options); + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (!empty($options['name'])) { + $query = 'ALTER DATABASE ' . $db->quoteIdentifier($name, true) + .' RENAME GLOBAL_NAME TO ' . $db->quoteIdentifier($options['name'], true); + $result = $db->standaloneQuery($query); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($options['charset'])) { + $queries = array(); + $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL + $queries[] = 'STARTUP MOUNT'; + $queries[] = 'ALTER SYSTEM ENABLE RESTRICTED SESSION'; + $queries[] = 'ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0'; + $queries[] = 'ALTER DATABASE OPEN'; + $queries[] = 'ALTER DATABASE CHARACTER SET ' . $options['charset']; + $queries[] = 'ALTER DATABASE NATIONAL CHARACTER SET ' . $options['charset']; + $queries[] = 'SHUTDOWN IMMEDIATE'; //or NORMAL + $queries[] = 'STARTUP'; + + foreach ($queries as $query) { + $result = $db->standaloneQuery($query); + if (PEAR::isError($result)) { + return $result; + } + } + } + + return MDB2_OK; + } + + // }}} + // {{{ dropDatabase() + + /** + * drop an existing database + * + * @param object $db database object that is extended by this class + * @param string $name name of the database that should be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropDatabase($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $username = $db->options['database_name_prefix'].$name; + return $db->standaloneQuery('DROP USER '.$username.' CASCADE', null, true); + } + + + // }}} + // {{{ _makeAutoincrement() + + /** + * add an autoincrement sequence + trigger + * + * @param string $name name of the PK field + * @param string $table name of the table + * @param string $start start value for the sequence + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _makeAutoincrement($name, $table, $start = 1) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $table_uppercase = strtoupper($table); + $index_name = $table_uppercase . '_AI_PK'; + $definition = array( + 'primary' => true, + 'fields' => array($name => true), + ); + $idxname_format = $db->getOption('idxname_format'); + $db->setOption('idxname_format', '%s'); + $result = $this->createConstraint($table, $index_name, $definition); + $db->setOption('idxname_format', $idxname_format); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'primary key for autoincrement PK could not be created', __FUNCTION__); + } + + if (null === $start) { + $db->beginTransaction(); + $query = 'SELECT MAX(' . $db->quoteIdentifier($name, true) . ') FROM ' . $db->quoteIdentifier($table, true); + $start = $this->db->queryOne($query, 'integer'); + if (PEAR::isError($start)) { + return $start; + } + ++$start; + $result = $this->createSequence($table, $start); + $db->commit(); + } else { + $result = $this->createSequence($table, $start); + } + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'sequence for autoincrement PK could not be created', __FUNCTION__); + } + $seq_name = $db->getSequenceName($table); + $trigger_name = $db->quoteIdentifier($table_uppercase . '_AI_PK', true); + $seq_name_quoted = $db->quoteIdentifier($seq_name, true); + $table = $db->quoteIdentifier($table, true); + $name = $db->quoteIdentifier($name, true); + $trigger_sql = ' +CREATE TRIGGER '.$trigger_name.' + BEFORE INSERT + ON '.$table.' + FOR EACH ROW +DECLARE + last_Sequence NUMBER; + last_InsertID NUMBER; +BEGIN + SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; + IF (:NEW.'.$name.' IS NULL OR :NEW.'.$name.' = 0) THEN + SELECT '.$seq_name_quoted.'.NEXTVAL INTO :NEW.'.$name.' FROM DUAL; + ELSE + SELECT NVL(Last_Number, 0) INTO last_Sequence + FROM User_Sequences + WHERE UPPER(Sequence_Name) = UPPER(\''.$seq_name.'\'); + SELECT :NEW.'.$name.' INTO last_InsertID FROM DUAL; + WHILE (last_InsertID > last_Sequence) LOOP + SELECT '.$seq_name_quoted.'.NEXTVAL INTO last_Sequence FROM DUAL; + END LOOP; + END IF; +END; +'; + $result = $db->exec($trigger_sql); + if (PEAR::isError($result)) { + return $result; + } + return MDB2_OK; + } + + // }}} + // {{{ _dropAutoincrement() + + /** + * drop an existing autoincrement sequence + trigger + * + * @param string $table name of the table + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _dropAutoincrement($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $table = strtoupper($table); + $trigger_name = $table . '_AI_PK'; + $trigger_name_quoted = $db->quote($trigger_name, 'text'); + $query = 'SELECT trigger_name FROM user_triggers'; + $query.= ' WHERE trigger_name='.$trigger_name_quoted.' OR trigger_name='.strtoupper($trigger_name_quoted); + $trigger = $db->queryOne($query); + if (PEAR::isError($trigger)) { + return $trigger; + } + + if ($trigger) { + $trigger_name = $db->quoteIdentifier($table . '_AI_PK', true); + $trigger_sql = 'DROP TRIGGER ' . $trigger_name; + $result = $db->exec($trigger_sql); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'trigger for autoincrement PK could not be dropped', __FUNCTION__); + } + + $result = $this->dropSequence($table); + if (PEAR::isError($result)) { + return $db->raiseError($result, null, null, + 'sequence for autoincrement PK could not be dropped', __FUNCTION__); + } + + $index_name = $table . '_AI_PK'; + $idxname_format = $db->getOption('idxname_format'); + $db->setOption('idxname_format', '%s'); + $result1 = $this->dropConstraint($table, $index_name); + $db->setOption('idxname_format', $idxname_format); + $result2 = $this->dropConstraint($table, $index_name); + if (PEAR::isError($result1) && PEAR::isError($result2)) { + return $db->raiseError($result1, null, null, + 'primary key for autoincrement PK could not be dropped', __FUNCTION__); + } + } + + return MDB2_OK; + } + + // }}} + // {{{ _getTemporaryTableQuery() + + /** + * A method to return the required SQL string that fits between CREATE ... TABLE + * to create the table as a temporary table. + * + * @return string The string required to be placed between "CREATE" and "TABLE" + * to generate a temporary table, if possible. + */ + function _getTemporaryTableQuery() + { + return 'GLOBAL TEMPORARY'; + } + + // }}} + // {{{ _getAdvancedFKOptions() + + /** + * Return the FOREIGN KEY query section dealing with non-standard options + * as MATCH, INITIALLY DEFERRED, ON UPDATE, ... + * + * @param array $definition + * @return string + * @access protected + */ + function _getAdvancedFKOptions($definition) + { + $query = ''; + if (!empty($definition['ondelete']) && (strtoupper($definition['ondelete']) != 'NO ACTION')) { + $query .= ' ON DELETE '.$definition['ondelete']; + } + if (!empty($definition['deferrable'])) { + $query .= ' DEFERRABLE'; + } else { + $query .= ' NOT DEFERRABLE'; + } + if (!empty($definition['initiallydeferred'])) { + $query .= ' INITIALLY DEFERRED'; + } else { + $query .= ' INITIALLY IMMEDIATE'; + } + return $query; + } + + // }}} + // {{{ createTable() + + /** + * create a new table + * + * @param string $name Name of the database that should be created + * @param array $fields Associative array that contains the definition of each field of the new table + * The indexes of the array entries are the names of the fields of the table an + * the array entry values are associative arrays like those that are meant to be + * passed with the field definitions to get[Type]Declaration() functions. + * + * Example + * array( + * + * 'id' => array( + * 'type' => 'integer', + * 'unsigned' => 1 + * 'notnull' => 1 + * 'default' => 0 + * ), + * 'name' => array( + * 'type' => 'text', + * 'length' => 12 + * ), + * 'password' => array( + * 'type' => 'text', + * 'length' => 12 + * ) + * ); + * @param array $options An associative array of table options: + * array( + * 'comment' => 'Foo', + * 'temporary' => true|false, + * ); + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createTable($name, $fields, $options = array()) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $db->beginNestedTransaction(); + $result = parent::createTable($name, $fields, $options); + if (!PEAR::isError($result)) { + foreach ($fields as $field_name => $field) { + if (!empty($field['autoincrement'])) { + $result = $this->_makeAutoincrement($field_name, $name); + } + } + } + $db->completeNestedTransaction(); + return $result; + } + + // }}} + // {{{ dropTable() + + /** + * drop an existing table + * + * @param string $name name of the table that should be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropTable($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + $db->beginNestedTransaction(); + $result = $this->_dropAutoincrement($name); + if (!PEAR::isError($result)) { + $result = parent::dropTable($name); + } + $db->completeNestedTransaction(); + return $result; + } + + // }}} + // {{{ truncateTable() + + /** + * Truncate an existing table (if the TRUNCATE TABLE syntax is not supported, + * it falls back to a DELETE FROM TABLE query) + * + * @param string $name name of the table that should be truncated + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function truncateTable($name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $name = $db->quoteIdentifier($name, true); + return $db->exec("TRUNCATE TABLE $name"); + } + + // }}} + // {{{ vacuum() + + /** + * Optimize (vacuum) all the tables in the db (or only the specified table) + * and optionally run ANALYZE. + * + * @param string $table table name (all the tables if empty) + * @param array $options an array with driver-specific options: + * - timeout [int] (in seconds) [mssql-only] + * - analyze [boolean] [pgsql and mysql] + * - full [boolean] [pgsql-only] + * - freeze [boolean] [pgsql-only] + * + * @return mixed MDB2_OK success, a MDB2 error on failure + * @access public + */ + function vacuum($table = null, $options = array()) + { + // not needed in Oracle + return MDB2_OK; + } + + // }}} + // {{{ alterTable() + + /** + * alter an existing table + * + * @param string $name name of the table that is intended to be changed. + * @param array $changes associative array that contains the details of each type + * of change that is intended to be performed. The types of + * changes that are currently supported are defined as follows: + * + * name + * + * New name for the table. + * + * add + * + * Associative array with the names of fields to be added as + * indexes of the array. The value of each entry of the array + * should be set to another associative array with the properties + * of the fields to be added. The properties of the fields should + * be the same as defined by the MDB2 parser. + * + * + * remove + * + * Associative array with the names of fields to be removed as indexes + * of the array. Currently the values assigned to each entry are ignored. + * An empty array should be used for future compatibility. + * + * rename + * + * Associative array with the names of fields to be renamed as indexes + * of the array. The value of each entry of the array should be set to + * another associative array with the entry named name with the new + * field name and the entry named Declaration that is expected to contain + * the portion of the field declaration already in DBMS specific SQL code + * as it is used in the CREATE TABLE statement. + * + * change + * + * Associative array with the names of the fields to be changed as indexes + * of the array. Keep in mind that if it is intended to change either the + * name of a field and any other properties, the change array entries + * should have the new names of the fields as array indexes. + * + * The value of each entry of the array should be set to another associative + * array with the properties of the fields to that are meant to be changed as + * array entries. These entries should be assigned to the new values of the + * respective properties. The properties of the fields should be the same + * as defined by the MDB2 parser. + * + * Example + * array( + * 'name' => 'userlist', + * 'add' => array( + * 'quota' => array( + * 'type' => 'integer', + * 'unsigned' => 1 + * ) + * ), + * 'remove' => array( + * 'file_limit' => array(), + * 'time_limit' => array() + * ), + * 'change' => array( + * 'name' => array( + * 'length' => '20', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 20, + * ), + * ) + * ), + * 'rename' => array( + * 'sex' => array( + * 'name' => 'gender', + * 'definition' => array( + * 'type' => 'text', + * 'length' => 1, + * 'default' => 'M', + * ), + * ) + * ) + * ) + * + * @param boolean $check indicates whether the function should just check if the DBMS driver + * can perform the requested table alterations if the value is true or + * actually perform them otherwise. + * @access public + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + */ + function alterTable($name, $changes, $check) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + foreach ($changes as $change_name => $change) { + switch ($change_name) { + case 'add': + case 'remove': + case 'change': + case 'name': + case 'rename': + break; + default: + return $db->raiseError(MDB2_ERROR_CANNOT_ALTER, null, null, + 'change type "'.$change_name.'" not yet supported', __FUNCTION__); + } + } + + if ($check) { + return MDB2_OK; + } + + $name = $db->quoteIdentifier($name, true); + + if (!empty($changes['add']) && is_array($changes['add'])) { + $fields = array(); + foreach ($changes['add'] as $field_name => $field) { + $fields[] = $db->getDeclaration($field['type'], $field_name, $field); + } + $result = $db->exec("ALTER TABLE $name ADD (". implode(', ', $fields).')'); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['change']) && is_array($changes['change'])) { + $fields = array(); + foreach ($changes['change'] as $field_name => $field) { + //fix error "column to be modified to NOT NULL is already NOT NULL" + if (!array_key_exists('notnull', $field)) { + unset($field['definition']['notnull']); + } + $fields[] = $db->getDeclaration($field['definition']['type'], $field_name, $field['definition']); + } + $result = $db->exec("ALTER TABLE $name MODIFY (". implode(', ', $fields).')'); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['rename']) && is_array($changes['rename'])) { + foreach ($changes['rename'] as $field_name => $field) { + $field_name = $db->quoteIdentifier($field_name, true); + $query = "ALTER TABLE $name RENAME COLUMN $field_name TO ".$db->quoteIdentifier($field['name']); + $result = $db->exec($query); + if (PEAR::isError($result)) { + return $result; + } + } + } + + if (!empty($changes['remove']) && is_array($changes['remove'])) { + $fields = array(); + foreach ($changes['remove'] as $field_name => $field) { + $fields[] = $db->quoteIdentifier($field_name, true); + } + $result = $db->exec("ALTER TABLE $name DROP COLUMN ". implode(', ', $fields)); + if (PEAR::isError($result)) { + return $result; + } + } + + if (!empty($changes['name'])) { + $change_name = $db->quoteIdentifier($changes['name'], true); + $result = $db->exec("ALTER TABLE $name RENAME TO ".$change_name); + if (PEAR::isError($result)) { + return $result; + } + } + + return MDB2_OK; + } + + // }}} + // {{{ _fetchCol() + + /** + * Utility method to fetch and format a column from a resultset + * + * @param resource $result + * @param boolean $fixname (used when listing indices or constraints) + * @return mixed array of names on success, a MDB2 error on failure + * @access private + */ + function _fetchCol($result, $fixname = false) + { + if (PEAR::isError($result)) { + return $result; + } + $col = $result->fetchCol(); + if (PEAR::isError($col)) { + return $col; + } + $result->free(); + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if ($fixname) { + foreach ($col as $k => $v) { + $col[$k] = $this->_fixIndexName($v); + } + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + && $db->options['field_case'] == CASE_LOWER + ) { + $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); + } + return $col; + } + + // }}} + // {{{ listDatabases() + + /** + * list all databases + * + * @return mixed array of database names on success, a MDB2 error on failure + * @access public + */ + function listDatabases() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (!$db->options['emulate_database']) { + return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'database listing is only supported if the "emulate_database" option is enabled', __FUNCTION__); + } + + if ($db->options['database_name_prefix']) { + $query = 'SELECT SUBSTR(username, '; + $query.= (strlen($db->options['database_name_prefix'])+1); + $query.= ") FROM sys.dba_users WHERE username LIKE '"; + $query.= $db->options['database_name_prefix']."%'"; + } else { + $query = 'SELECT username FROM sys.dba_users'; + } + $result = $db->standaloneQuery($query, array('text'), false); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listUsers() + + /** + * list all users + * + * @return mixed array of user names on success, a MDB2 error on failure + * @access public + */ + function listUsers() + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if ($db->options['emulate_database'] && $db->options['database_name_prefix']) { + $query = 'SELECT SUBSTR(username, '; + $query.= (strlen($db->options['database_name_prefix'])+1); + $query.= ") FROM sys.dba_users WHERE username NOT LIKE '"; + $query.= $db->options['database_name_prefix']."%'"; + } else { + $query = 'SELECT username FROM sys.dba_users'; + } + return $db->queryCol($query); + } + + // }}} + // {{{ listViews() + + /** + * list all views in the current database + * + * @param string owner, the current is default + * @return mixed array of view names on success, a MDB2 error on failure + * @access public + */ + function listViews($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT view_name + FROM sys.all_views + WHERE owner=? OR owner=?'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listFunctions() + + /** + * list all functions in the current database + * + * @param string owner, the current is default + * @return mixed array of function names on success, a MDB2 error on failure + * @access public + */ + function listFunctions($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = "SELECT name + FROM sys.all_source + WHERE line = 1 + AND type = 'FUNCTION' + AND (owner=? OR owner=?)"; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableTriggers() + + /** + * list all triggers in the database that reference a given table + * + * @param string table for which all referenced triggers should be found + * @return mixed array of trigger names on success, a MDB2 error on failure + * @access public + */ + function listTableTriggers($table = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = "SELECT trigger_name + FROM sys.all_triggers + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?)"; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTables() + + /** + * list all tables in the database + * + * @param string owner, the current is default + * @return mixed array of table names on success, a MDB2 error on failure + * @access public + */ + function listTables($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT table_name + FROM sys.all_tables + WHERE owner=? OR owner=?'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableFields() + + /** + * list all fields in a table in the current database + * + * @param string $table name of table that should be used in method + * @return mixed array of field names on success, a MDB2 error on failure + * @access public + */ + function listTableFields($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT column_name + FROM all_tab_columns + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?) + ORDER BY column_id'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result); + } + + // }}} + // {{{ listTableIndexes() + + /** + * list all indexes in a table + * + * @param string $table name of table that should be used in method + * @return mixed array of index names on success, a MDB2 error on failure + * @access public + */ + function listTableIndexes($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT i.index_name name + FROM all_indexes i + LEFT JOIN all_constraints c + ON c.index_name = i.index_name + AND c.owner = i.owner + AND c.table_name = i.table_name + WHERE (i.table_name=? OR i.table_name=?) + AND (i.owner=? OR i.owner=?) + AND c.index_name IS NULL + AND i.generated=' .$db->quote('N', 'text'); + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result, true); + } + + // }}} + // {{{ createConstraint() + + /** + * create a constraint on a table + * + * @param string $table name of the table on which the constraint is to be created + * @param string $name name of the constraint to be created + * @param array $definition associative array that defines properties of the constraint to be created. + * Currently, only one property named FIELDS is supported. This property + * is also an associative with the names of the constraint fields as array + * constraints. Each entry of this array is set to another type of associative + * array that specifies properties of the constraint that are specific to + * each field. + * + * Example + * array( + * 'fields' => array( + * 'user_name' => array(), + * 'last_login' => array() + * ) + * ) + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createConstraint($table, $name, $definition) + { + $result = parent::createConstraint($table, $name, $definition); + if (PEAR::isError($result)) { + return $result; + } + if (!empty($definition['foreign'])) { + return $this->_createFKTriggers($table, array($name => $definition)); + } + return MDB2_OK; + } + + // }}} + // {{{ dropConstraint() + + /** + * drop existing constraint + * + * @param string $table name of table that should be used in method + * @param string $name name of the constraint to be dropped + * @param string $primary hint if the constraint is primary + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropConstraint($table, $name, $primary = false) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + //is it a FK constraint? If so, also delete the associated triggers + $db->loadModule('Reverse', null, true); + $definition = $db->reverse->getTableConstraintDefinition($table, $name); + if (!PEAR::isError($definition) && !empty($definition['foreign'])) { + //first drop the FK enforcing triggers + $result = $this->_dropFKTriggers($table, $name, $definition['references']['table']); + if (PEAR::isError($result)) { + return $result; + } + } + + return parent::dropConstraint($table, $name, $primary); + } + + // }}} + // {{{ _createFKTriggers() + + /** + * Create triggers to enforce the FOREIGN KEY constraint on the table + * + * @param string $table table name + * @param array $foreign_keys FOREIGN KEY definitions + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _createFKTriggers($table, $foreign_keys) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + // create triggers to enforce FOREIGN KEY constraints + if ($db->supports('triggers') && !empty($foreign_keys)) { + $table = $db->quoteIdentifier($table, true); + foreach ($foreign_keys as $fkname => $fkdef) { + if (empty($fkdef)) { + continue; + } + $fkdef['onupdate'] = empty($fkdef['onupdate']) ? $db->options['default_fk_action_onupdate'] : strtoupper($fkdef['onupdate']); + if ('RESTRICT' == $fkdef['onupdate'] || 'NO ACTION' == $fkdef['onupdate']) { + // already handled by default + continue; + } + + $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); + $table_fields = array_keys($fkdef['fields']); + $referenced_fields = array_keys($fkdef['references']['fields']); + + //create the ON UPDATE trigger on the primary table + $restrict_action = ' IF (SELECT '; + $aliased_fields = array(); + foreach ($table_fields as $field) { + $aliased_fields[] = $table .'.'.$field .' AS '.$field; + } + $restrict_action .= implode(',', $aliased_fields) + .' FROM '.$table + .' WHERE '; + $conditions = array(); + $new_values = array(); + $null_values = array(); + for ($i=0; $iloadModule('Reverse', null, true); + $default_values = array(); + foreach ($table_fields as $table_field) { + $field_definition = $db->reverse->getTableFieldDefinition($table, $field); + if (PEAR::isError($field_definition)) { + return $field_definition; + } + $default_values[] = $table_field .' = '. $field_definition[0]['default']; + } + $setdefault_action = 'UPDATE '.$table.' SET '.implode(', ', $default_values).' WHERE '.implode(' AND ', $conditions). ';'; + } + + $query = 'CREATE TRIGGER %s' + .' %s ON '.$fkdef['references']['table'] + .' FOR EACH ROW ' + .' BEGIN '; + + if ('CASCADE' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $cascade_action; + } elseif ('SET NULL' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setnull_action; + } elseif ('SET DEFAULT' == $fkdef['onupdate']) { + $sql_update = sprintf($query, $trigger_name, 'BEFORE UPDATE', 'update') . $setdefault_action; + } + $sql_update .= ' END;'; + $result = $db->exec($sql_update); + if (PEAR::isError($result)) { + if ($result->getCode() === MDB2_ERROR_ALREADY_EXISTS) { + return MDB2_OK; + } + return $result; + } + } + } + return MDB2_OK; + } + + // }}} + // {{{ _dropFKTriggers() + + /** + * Drop the triggers created to enforce the FOREIGN KEY constraint on the table + * + * @param string $table table name + * @param string $fkname FOREIGN KEY constraint name + * @param string $referenced_table referenced table name + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access private + */ + function _dropFKTriggers($table, $fkname, $referenced_table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $triggers = $this->listTableTriggers($table); + $triggers2 = $this->listTableTriggers($referenced_table); + if (!PEAR::isError($triggers2) && !PEAR::isError($triggers)) { + $triggers = array_merge($triggers, $triggers2); + $trigger_name = substr(strtolower($fkname.'_pk_upd_trg'), 0, $db->options['max_identifiers_length']); + $pattern = '/^'.$trigger_name.'$/i'; + foreach ($triggers as $trigger) { + if (preg_match($pattern, $trigger)) { + $result = $db->exec('DROP TRIGGER '.$trigger); + if (PEAR::isError($result)) { + return $result; + } + } + } + } + return MDB2_OK; + } + + // }}} + // {{{ listTableConstraints() + + /** + * list all constraints in a table + * + * @param string $table name of table that should be used in method + * @return mixed array of constraint names on success, a MDB2 error on failure + * @access public + */ + function listTableConstraints($table) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT constraint_name + FROM all_constraints + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?)'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + ); + $result = $stmt->execute($args); + return $this->_fetchCol($result, true); + } + + // }}} + // {{{ createSequence() + + /** + * create sequence + * + * @param object $db database object that is extended by this class + * @param string $seq_name name of the sequence to be created + * @param string $start start value of the sequence; default is 1 + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function createSequence($seq_name, $start = 1) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); + $query = "CREATE SEQUENCE $sequence_name START WITH $start INCREMENT BY 1 NOCACHE"; + $query.= ($start < 1 ? " MINVALUE $start" : ''); + return $db->exec($query); + } + + // }}} + // {{{ dropSequence() + + /** + * drop existing sequence + * + * @param object $db database object that is extended by this class + * @param string $seq_name name of the sequence to be dropped + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function dropSequence($seq_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->quoteIdentifier($db->getSequenceName($seq_name), true); + return $db->exec("DROP SEQUENCE $sequence_name"); + } + + // }}} + // {{{ listSequences() + + /** + * list all sequences in the current database + * + * @param string owner, the current is default + * @return mixed array of sequence names on success, a MDB2 error on failure + * @access public + */ + function listSequences($owner = null) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT sequence_name + FROM sys.all_sequences + WHERE (sequence_owner=? OR sequence_owner=?)'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(array($owner, strtoupper($owner))); + if (PEAR::isError($result)) { + return $result; + } + $col = $result->fetchCol(); + if (PEAR::isError($col)) { + return $col; + } + $result->free(); + + foreach ($col as $k => $v) { + $col[$k] = $this->_fixSequenceName($v); + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + && $db->options['field_case'] == CASE_LOWER + ) { + $col = array_map(($db->options['field_case'] == CASE_LOWER ? 'strtolower' : 'strtoupper'), $col); + } + return $col; + } +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Native/oci8.php b/3rdparty/MDB2/Driver/Native/oci8.php new file mode 100644 index 0000000000..d198f9687a --- /dev/null +++ b/3rdparty/MDB2/Driver/Native/oci8.php @@ -0,0 +1,60 @@ + | +// +----------------------------------------------------------------------+ +// +// $Id: oci8.php 215004 2006-06-18 21:59:05Z lsmith $ +// + +require_once 'MDB2/Driver/Native/Common.php'; + +/** + * MDB2 Oracle driver for the native module + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Native_oci8 extends MDB2_Driver_Native_Common +{ +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/Reverse/oci8.php b/3rdparty/MDB2/Driver/Reverse/oci8.php new file mode 100644 index 0000000000..c86847fa6b --- /dev/null +++ b/3rdparty/MDB2/Driver/Reverse/oci8.php @@ -0,0 +1,621 @@ + | +// | Lorenzo Alberton | +// +----------------------------------------------------------------------+ +// +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ +// + +require_once 'MDB2/Driver/Reverse/Common.php'; + +/** + * MDB2 Oracle driver for the schema reverse engineering module + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_Reverse_oci8 extends MDB2_Driver_Reverse_Common +{ + // {{{ getTableFieldDefinition() + + /** + * Get the structure of a field into an array + * + * @param string $table_name name of table that should be used in method + * @param string $field_name name of field that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableFieldDefinition($table_name, $field_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $result = $db->loadModule('Datatype', null, true); + if (PEAR::isError($result)) { + return $result; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT column_name name, + data_type "type", + nullable, + data_default "default", + COALESCE(data_precision, data_length) "length", + data_scale "scale" + FROM all_tab_columns + WHERE (table_name=? OR table_name=?) + AND (owner=? OR owner=?) + AND (column_name=? OR column_name=?) + ORDER BY column_id'; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $args = array( + $table, + strtoupper($table), + $owner, + strtoupper($owner), + $field_name, + strtoupper($field_name) + ); + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $column = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($column)) { + return $column; + } + $stmt->free(); + $result->free(); + + if (empty($column)) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $field_name . ' is not a column in table ' . $table_name, __FUNCTION__); + } + + $column = array_change_key_case($column, CASE_LOWER); + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column['name'] = strtolower($column['name']); + } else { + $column['name'] = strtoupper($column['name']); + } + } + $mapped_datatype = $db->datatype->mapNativeDatatype($column); + if (PEAR::isError($mapped_datatype)) { + return $mapped_datatype; + } + list($types, $length, $unsigned, $fixed) = $mapped_datatype; + $notnull = false; + if (!empty($column['nullable']) && $column['nullable'] == 'N') { + $notnull = true; + } + $default = false; + if (array_key_exists('default', $column)) { + $default = $column['default']; + if ($default === 'NULL') { + $default = null; + } + if ((null === $default) && $notnull) { + $default = ''; + } + } + + $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']); + if (null !== $length) { + $definition[0]['length'] = $length; + } + if (null !== $unsigned) { + $definition[0]['unsigned'] = $unsigned; + } + if (null !== $fixed) { + $definition[0]['fixed'] = $fixed; + } + if ($default !== false) { + $definition[0]['default'] = $default; + } + foreach ($types as $key => $type) { + $definition[$key] = $definition[0]; + if ($type == 'clob' || $type == 'blob') { + unset($definition[$key]['default']); + } + $definition[$key]['type'] = $type; + $definition[$key]['mdb2type'] = $type; + } + if ($type == 'integer') { + $query= "SELECT trigger_body + FROM all_triggers + WHERE table_name=? + AND triggering_event='INSERT' + AND trigger_type='BEFORE EACH ROW'"; + // ^^ pretty reasonable mimic for "auto_increment" in oracle? + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $result = $stmt->execute(strtoupper($table)); + if (PEAR::isError($result)) { + return $result; + } + while ($triggerstr = $result->fetchOne()) { + if (preg_match('/.*SELECT\W+(.+)\.nextval +into +\:NEW\.'.$field_name.' +FROM +dual/im', $triggerstr, $matches)) { + $definition[0]['autoincrement'] = $matches[1]; + } + } + $stmt->free(); + $result->free(); + } + return $definition; + } + + // }}} + // {{{ getTableIndexDefinition() + + /** + * Get the structure of an index into an array + * + * @param string $table_name name of table that should be used in method + * @param string $index_name name of index that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableIndexDefinition($table_name, $index_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = "SELECT aic.column_name, + aic.column_position, + aic.descend, + aic.table_owner, + alc.constraint_type + FROM all_ind_columns aic + LEFT JOIN all_constraints alc + ON aic.index_name = alc.constraint_name + AND aic.table_name = alc.table_name + AND aic.table_owner = alc.owner + WHERE (aic.table_name=? OR aic.table_name=?) + AND (aic.index_name=? OR aic.index_name=?) + AND (aic.table_owner=? OR aic.table_owner=?) + ORDER BY column_position"; + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + $indexnames = array_unique(array($db->getIndexName($index_name), $index_name)); + $i = 0; + $row = null; + while ((null === $row) && array_key_exists($i, $indexnames)) { + $args = array( + $table, + strtoupper($table), + $indexnames[$i], + strtoupper($indexnames[$i]), + $owner, + strtoupper($owner) + ); + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($row)) { + return $row; + } + $i++; + } + if (null === $row) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is not an index on table '. $table_name, __FUNCTION__); + } + if ($row['constraint_type'] == 'U' || $row['constraint_type'] == 'P') { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is a constraint, not an index on table '. $table_name, __FUNCTION__); + } + + $definition = array(); + while (null !== $row) { + $row = array_change_key_case($row, CASE_LOWER); + $column_name = $row['column_name']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column_name = strtolower($column_name); + } else { + $column_name = strtoupper($column_name); + } + } + $definition['fields'][$column_name] = array( + 'position' => (int)$row['column_position'], + ); + if (!empty($row['descend'])) { + $definition['fields'][$column_name]['sorting'] = + ($row['descend'] == 'ASC' ? 'ascending' : 'descending'); + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + } + $result->free(); + if (empty($definition['fields'])) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $index_name. ' is not an index on table '. $table_name, __FUNCTION__); + } + return $definition; + } + + // }}} + // {{{ getTableConstraintDefinition() + + /** + * Get the structure of a constraint into an array + * + * @param string $table_name name of table that should be used in method + * @param string $constraint_name name of constraint that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTableConstraintDefinition($table_name, $constraint_name) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + list($owner, $table) = $this->splitTableSchema($table_name); + if (empty($owner)) { + $owner = $db->dsn['username']; + } + + $query = 'SELECT alc.constraint_name, + CASE alc.constraint_type WHEN \'P\' THEN 1 ELSE 0 END "primary", + CASE alc.constraint_type WHEN \'R\' THEN 1 ELSE 0 END "foreign", + CASE alc.constraint_type WHEN \'U\' THEN 1 ELSE 0 END "unique", + CASE alc.constraint_type WHEN \'C\' THEN 1 ELSE 0 END "check", + alc.DELETE_RULE "ondelete", + \'NO ACTION\' "onupdate", + \'SIMPLE\' "match", + CASE alc.deferrable WHEN \'NOT DEFERRABLE\' THEN 0 ELSE 1 END "deferrable", + CASE alc.deferred WHEN \'IMMEDIATE\' THEN 0 ELSE 1 END "initiallydeferred", + alc.search_condition, + alc.table_name, + cols.column_name, + cols.position, + r_alc.table_name "references_table", + r_cols.column_name "references_field", + r_cols.position "references_field_position" + FROM all_cons_columns cols + LEFT JOIN all_constraints alc + ON alc.constraint_name = cols.constraint_name + AND alc.owner = cols.owner + LEFT JOIN all_constraints r_alc + ON alc.r_constraint_name = r_alc.constraint_name + AND alc.r_owner = r_alc.owner + LEFT JOIN all_cons_columns r_cols + ON r_alc.constraint_name = r_cols.constraint_name + AND r_alc.owner = r_cols.owner + AND cols.position = r_cols.position + WHERE (alc.constraint_name=? OR alc.constraint_name=?) + AND alc.constraint_name = cols.constraint_name + AND (alc.owner=? OR alc.owner=?)'; + $tablenames = array(); + if (!empty($table)) { + $query.= ' AND (alc.table_name=? OR alc.table_name=?)'; + $tablenames = array($table, strtoupper($table)); + } + $stmt = $db->prepare($query); + if (PEAR::isError($stmt)) { + return $stmt; + } + + $constraintnames = array_unique(array($db->getIndexName($constraint_name), $constraint_name)); + $c = 0; + $row = null; + while ((null === $row) && array_key_exists($c, $constraintnames)) { + $args = array( + $constraintnames[$c], + strtoupper($constraintnames[$c]), + $owner, + strtoupper($owner) + ); + if (!empty($table)) { + $args = array_merge($args, $tablenames); + } + $result = $stmt->execute($args); + if (PEAR::isError($result)) { + return $result; + } + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($row)) { + return $row; + } + $c++; + } + + $definition = array( + 'primary' => (boolean)$row['primary'], + 'unique' => (boolean)$row['unique'], + 'foreign' => (boolean)$row['foreign'], + 'check' => (boolean)$row['check'], + 'deferrable' => (boolean)$row['deferrable'], + 'initiallydeferred' => (boolean)$row['initiallydeferred'], + 'ondelete' => $row['ondelete'], + 'onupdate' => $row['onupdate'], + 'match' => $row['match'], + ); + + if ($definition['check']) { + // pattern match constraint for check constraint values into enum-style output: + $enumregex = '/'.$row['column_name'].' in \((.+?)\)/i'; + if (preg_match($enumregex, $row['search_condition'], $rangestr)) { + $definition['fields'][$column_name] = array(); + $allowed = explode(',', $rangestr[1]); + foreach ($allowed as $val) { + $val = trim($val); + $val = preg_replace('/^\'/', '', $val); + $val = preg_replace('/\'$/', '', $val); + array_push($definition['fields'][$column_name], $val); + } + } + } + + while (null !== $row) { + $row = array_change_key_case($row, CASE_LOWER); + $column_name = $row['column_name']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $column_name = strtolower($column_name); + } else { + $column_name = strtoupper($column_name); + } + } + $definition['fields'][$column_name] = array( + 'position' => (int)$row['position'] + ); + if ($row['foreign']) { + $ref_column_name = $row['references_field']; + $ref_table_name = $row['references_table']; + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $ref_column_name = strtolower($ref_column_name); + $ref_table_name = strtolower($ref_table_name); + } else { + $ref_column_name = strtoupper($ref_column_name); + $ref_table_name = strtoupper($ref_table_name); + } + } + $definition['references']['table'] = $ref_table_name; + $definition['references']['fields'][$ref_column_name] = array( + 'position' => (int)$row['references_field_position'] + ); + } + $lastrow = $row; + $row = $result->fetchRow(MDB2_FETCHMODE_ASSOC); + } + $result->free(); + if (empty($definition['fields'])) { + return $db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + $constraint_name . ' is not a constraint on table '. $table_name, __FUNCTION__); + } + + return $definition; + } + + // }}} + // {{{ getSequenceDefinition() + + /** + * Get the structure of a sequence into an array + * + * @param string $sequence name of sequence that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getSequenceDefinition($sequence) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $sequence_name = $db->getSequenceName($sequence); + $query = 'SELECT last_number FROM user_sequences'; + $query.= ' WHERE sequence_name='.$db->quote($sequence_name, 'text'); + $query.= ' OR sequence_name='.$db->quote(strtoupper($sequence_name), 'text'); + $start = $db->queryOne($query, 'integer'); + if (PEAR::isError($start)) { + return $start; + } + $definition = array(); + if ($start != 1) { + $definition = array('start' => $start); + } + return $definition; + } + + // }}} + // {{{ getTriggerDefinition() + + /** + * Get the structure of a trigger into an array + * + * EXPERIMENTAL + * + * WARNING: this function is experimental and may change the returned value + * at any time until labelled as non-experimental + * + * @param string $trigger name of trigger that should be used in method + * @return mixed data array on success, a MDB2 error on failure + * @access public + */ + function getTriggerDefinition($trigger) + { + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $query = 'SELECT trigger_name, + table_name, + trigger_body, + trigger_type, + triggering_event trigger_event, + description trigger_comment, + 1 trigger_enabled, + when_clause + FROM user_triggers + WHERE trigger_name = \''. strtoupper($trigger).'\''; + $types = array( + 'trigger_name' => 'text', + 'table_name' => 'text', + 'trigger_body' => 'text', + 'trigger_type' => 'text', + 'trigger_event' => 'text', + 'trigger_comment' => 'text', + 'trigger_enabled' => 'boolean', + 'when_clause' => 'text', + ); + $result = $db->queryRow($query, $types, MDB2_FETCHMODE_ASSOC); + if (PEAR::isError($result)) { + return $result; + } + if (!empty($result['trigger_type'])) { + //$result['trigger_type'] = array_shift(explode(' ', $result['trigger_type'])); + $result['trigger_type'] = preg_replace('/(\S+).*/', '\\1', $result['trigger_type']); + } + return $result; + } + + // }}} + // {{{ tableInfo() + + /** + * Returns information about a table or a result set + * + * NOTE: only supports 'table' and 'flags' if $result + * is a table name. + * + * NOTE: flags won't contain index information. + * + * @param object|string $result MDB2_result object from a query or a + * string containing the name of a table. + * While this also accepts a query result + * resource identifier, this behavior is + * deprecated. + * @param int $mode a valid tableInfo mode + * + * @return array an associative array with the information requested. + * A MDB2_Error object on failure. + * + * @see MDB2_Driver_Common::tableInfo() + */ + function tableInfo($result, $mode = null) + { + if (is_string($result)) { + return parent::tableInfo($result, $mode); + } + + $db = $this->getDBInstance(); + if (PEAR::isError($db)) { + return $db; + } + + $resource = MDB2::isResultCommon($result) ? $result->getResource() : $result; + if (!is_resource($resource)) { + return $db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'Could not generate result resource', __FUNCTION__); + } + + if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + if ($db->options['field_case'] == CASE_LOWER) { + $case_func = 'strtolower'; + } else { + $case_func = 'strtoupper'; + } + } else { + $case_func = 'strval'; + } + + $count = @OCINumCols($resource); + $res = array(); + + if ($mode) { + $res['num_fields'] = $count; + } + + $db->loadModule('Datatype', null, true); + for ($i = 0; $i < $count; $i++) { + $column = array( + 'table' => '', + 'name' => $case_func(@OCIColumnName($resource, $i+1)), + 'type' => @OCIColumnType($resource, $i+1), + 'length' => @OCIColumnSize($resource, $i+1), + 'flags' => '', + ); + $res[$i] = $column; + $res[$i]['mdb2type'] = $db->datatype->mapNativeDatatype($res[$i]); + if ($mode & MDB2_TABLEINFO_ORDER) { + $res['order'][$res[$i]['name']] = $i; + } + if ($mode & MDB2_TABLEINFO_ORDERTABLE) { + $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; + } + } + return $res; + } +} +?> \ No newline at end of file diff --git a/3rdparty/MDB2/Driver/oci8.php b/3rdparty/MDB2/Driver/oci8.php new file mode 100644 index 0000000000..9f4137d610 --- /dev/null +++ b/3rdparty/MDB2/Driver/oci8.php @@ -0,0 +1,1647 @@ + | +// +----------------------------------------------------------------------+ + +// $Id: oci8.php 295587 2010-02-28 17:16:38Z quipo $ + +/** + * MDB2 OCI8 driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Driver_oci8 extends MDB2_Driver_Common +{ + // {{{ properties + var $string_quoting = array('start' => "'", 'end' => "'", 'escape' => "'", 'escape_pattern' => '@'); + + var $identifier_quoting = array('start' => '"', 'end' => '"', 'escape' => '"'); + + var $uncommitedqueries = 0; + // }}} + // {{{ constructor + + /** + * Constructor + */ + function __construct() + { + parent::__construct(); + + $this->phptype = 'oci8'; + $this->dbsyntax = 'oci8'; + + $this->supported['sequences'] = true; + $this->supported['indexes'] = true; + $this->supported['summary_functions'] = true; + $this->supported['order_by_text'] = true; + $this->supported['current_id'] = true; + $this->supported['affected_rows'] = true; + $this->supported['transactions'] = true; + $this->supported['savepoints'] = true; + $this->supported['limit_queries'] = true; + $this->supported['LOBs'] = true; + $this->supported['replace'] = 'emulated'; + $this->supported['sub_selects'] = true; + $this->supported['triggers'] = true; + $this->supported['auto_increment'] = false; // implementation is broken + $this->supported['primary_key'] = true; + $this->supported['result_introspection'] = true; + $this->supported['prepared_statements'] = true; + $this->supported['identifier_quoting'] = true; + $this->supported['pattern_escaping'] = true; + $this->supported['new_link'] = true; + + $this->options['DBA_username'] = false; + $this->options['DBA_password'] = false; + $this->options['database_name_prefix'] = false; + $this->options['emulate_database'] = true; + $this->options['default_tablespace'] = false; + $this->options['default_text_field_length'] = 2000; + $this->options['lob_allow_url_include'] = false; + $this->options['result_prefetching'] = false; + $this->options['max_identifiers_length'] = 30; + } + + // }}} + // {{{ errorInfo() + + /** + * This method is used to collect information about an error + * + * @param integer $error + * @return array + * @access public + */ + function errorInfo($error = null) + { + if (is_resource($error)) { + $error_data = @OCIError($error); + $error = null; + } elseif ($this->connection) { + $error_data = @OCIError($this->connection); + } else { + $error_data = @OCIError(); + } + $native_code = $error_data['code']; + $native_msg = $error_data['message']; + if (null === $error) { + static $ecode_map; + if (empty($ecode_map)) { + $ecode_map = array( + 1 => MDB2_ERROR_CONSTRAINT, + 900 => MDB2_ERROR_SYNTAX, + 904 => MDB2_ERROR_NOSUCHFIELD, + 911 => MDB2_ERROR_SYNTAX, //invalid character + 913 => MDB2_ERROR_VALUE_COUNT_ON_ROW, + 921 => MDB2_ERROR_SYNTAX, + 923 => MDB2_ERROR_SYNTAX, + 942 => MDB2_ERROR_NOSUCHTABLE, + 955 => MDB2_ERROR_ALREADY_EXISTS, + 1400 => MDB2_ERROR_CONSTRAINT_NOT_NULL, + 1401 => MDB2_ERROR_INVALID, + 1407 => MDB2_ERROR_CONSTRAINT_NOT_NULL, + 1418 => MDB2_ERROR_NOT_FOUND, + 1435 => MDB2_ERROR_NOT_FOUND, + 1476 => MDB2_ERROR_DIVZERO, + 1722 => MDB2_ERROR_INVALID_NUMBER, + 2289 => MDB2_ERROR_NOSUCHTABLE, + 2291 => MDB2_ERROR_CONSTRAINT, + 2292 => MDB2_ERROR_CONSTRAINT, + 2449 => MDB2_ERROR_CONSTRAINT, + 4081 => MDB2_ERROR_ALREADY_EXISTS, //trigger already exists + 24344 => MDB2_ERROR_SYNTAX, //success with compilation error + ); + } + if (isset($ecode_map[$native_code])) { + $error = $ecode_map[$native_code]; + } + } + return array($error, $native_code, $native_msg); + } + + // }}} + // {{{ beginTransaction() + + /** + * Start a transaction or set a savepoint. + * + * @param string name of a savepoint to set + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function beginTransaction($savepoint = null) + { + $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (null !== $savepoint) { + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'savepoint cannot be released when changes are auto committed', __FUNCTION__); + } + $query = 'SAVEPOINT '.$savepoint; + return $this->_doQuery($query, true); + } + if ($this->in_transaction) { + return MDB2_OK; //nothing to do + } + if (!$this->destructor_registered && $this->opened_persistent) { + $this->destructor_registered = true; + register_shutdown_function('MDB2_closeOpenTransactions'); + } + $this->in_transaction = true; + ++$this->uncommitedqueries; + return MDB2_OK; + } + + // }}} + // {{{ commit() + + /** + * Commit the database changes done during a transaction that is in + * progress or release a savepoint. This function may only be called when + * auto-committing is disabled, otherwise it will fail. Therefore, a new + * transaction is implicitly started after committing the pending changes. + * + * @param string name of a savepoint to release + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function commit($savepoint = null) + { + $this->debug('Committing transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); + } + if (null !== $savepoint) { + return MDB2_OK; + } + + if ($this->uncommitedqueries) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if (!@OCICommit($connection)) { + return $this->raiseError(null, null, null, + 'Unable to commit transaction', __FUNCTION__); + } + $this->uncommitedqueries = 0; + } + $this->in_transaction = false; + return MDB2_OK; + } + + // }}} + // {{{ rollback() + + /** + * Cancel any database changes done during a transaction or since a specific + * savepoint that is in progress. This function may only be called when + * auto-committing is disabled, otherwise it will fail. Therefore, a new + * transaction is implicitly started after canceling the pending changes. + * + * @param string name of a savepoint to rollback to + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function rollback($savepoint = null) + { + $this->debug('Rolling back transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); + if (!$this->in_transaction) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'rollback cannot be done changes are auto committed', __FUNCTION__); + } + if (null !== $savepoint) { + $query = 'ROLLBACK TO SAVEPOINT '.$savepoint; + return $this->_doQuery($query, true); + } + + if ($this->uncommitedqueries) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if (!@OCIRollback($connection)) { + return $this->raiseError(null, null, null, + 'Unable to rollback transaction', __FUNCTION__); + } + $this->uncommitedqueries = 0; + } + $this->in_transaction = false; + return MDB2_OK; + } + + // }}} + // {{{ function setTransactionIsolation() + + /** + * Set the transacton isolation level. + * + * @param string standard isolation level + * READ UNCOMMITTED (allows dirty reads) + * READ COMMITTED (prevents dirty reads) + * REPEATABLE READ (prevents nonrepeatable reads) + * SERIALIZABLE (prevents phantom reads) + * @param array some transaction options: + * 'wait' => 'WAIT' | 'NO WAIT' + * 'rw' => 'READ WRITE' | 'READ ONLY' + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + * @since 2.1.1 + */ + function setTransactionIsolation($isolation, $options = array()) + { + $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); + switch ($isolation) { + case 'READ UNCOMMITTED': + $isolation = 'READ COMMITTED'; + case 'READ COMMITTED': + case 'REPEATABLE READ': + $isolation = 'SERIALIZABLE'; + case 'SERIALIZABLE': + break; + default: + return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, + 'isolation level is not supported: '.$isolation, __FUNCTION__); + } + + $query = "ALTER SESSION ISOLATION LEVEL $isolation"; + return $this->_doQuery($query, true); + } + + // }}} + // {{{ _doConnect() + + /** + * do the grunt work of the connect + * + * @return connection on success or MDB2 Error Object on failure + * @access protected + */ + function _doConnect($username, $password, $persistent = false) + { + if (!PEAR::loadExtension($this->phptype)) { + return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'extension '.$this->phptype.' is not compiled into PHP', __FUNCTION__); + } + + $sid = ''; + + if (!empty($this->dsn['service']) && $this->dsn['hostspec']) { + //oci8://username:password@foo.example.com[:port]/?service=service + // service name is given, it is assumed that hostspec is really a + // hostname, we try to construct an oracle connection string from this + $port = $this->dsn['port'] ? $this->dsn['port'] : 1521; + $sid = sprintf("(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP) + (HOST=%s) (PORT=%s))) + (CONNECT_DATA=(SERVICE_NAME=%s)))", + $this->dsn['hostspec'], + $port, + $this->dsn['service'] + ); + } elseif ($this->dsn['hostspec']) { + // we are given something like 'oci8://username:password@foo/' + // we have hostspec but not a service name, now we assume that + // hostspec is a tnsname defined in tnsnames.ora + $sid = $this->dsn['hostspec']; + if (isset($this->dsn['port']) && $this->dsn['port']) { + $sid = $sid.':'.$this->dsn['port']; + } + } else { + // oci://username:password@ + // if everything fails, we have to rely on environment variables + // not before a check to 'emulate_database' + if (!$this->options['emulate_database'] && $this->database_name) { + $sid = $this->database_name; + } elseif (getenv('ORACLE_SID')) { + $sid = getenv('ORACLE_SID'); + } elseif ($sid = getenv('TWO_TASK')) { + $sid = getenv('TWO_TASK'); + } else { + return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'not a valid connection string or environment variable [ORACLE_SID|TWO_TASK] not set', + __FUNCTION__); + } + } + + if (function_exists('oci_connect')) { + if ($this->_isNewLinkSet()) { + $connect_function = 'oci_new_connect'; + } else { + $connect_function = $persistent ? 'oci_pconnect' : 'oci_connect'; + } + + $charset = empty($this->dsn['charset']) ? null : $this->dsn['charset']; + $session_mode = empty($this->dsn['session_mode']) ? null : $this->dsn['session_mode']; + $connection = @$connect_function($username, $password, $sid, $charset, $session_mode); + $error = @OCIError(); + if (isset($error['code']) && $error['code'] == 12541) { + // Couldn't find TNS listener. Try direct connection. + $connection = @$connect_function($username, $password, null, $charset); + } + } else { + $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; + $connection = @$connect_function($username, $password, $sid); + + if (!empty($this->dsn['charset'])) { + $result = $this->setCharset($this->dsn['charset'], $connection); + if (PEAR::isError($result)) { + return $result; + } + } + } + + if (!$connection) { + return $this->raiseError(MDB2_ERROR_CONNECT_FAILED, null, null, + 'unable to establish a connection', __FUNCTION__); + } + + if (empty($this->dsn['disable_iso_date'])) { + $query = "ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'"; + $err = $this->_doQuery($query, true, $connection); + if (PEAR::isError($err)) { + $this->disconnect(false); + return $err; + } + } + + $query = "ALTER SESSION SET NLS_NUMERIC_CHARACTERS='. '"; + $err = $this->_doQuery($query, true, $connection); + if (PEAR::isError($err)) { + $this->disconnect(false); + return $err; + } + + return $connection; + } + + // }}} + // {{{ connect() + + /** + * Connect to the database + * + * @return MDB2_OK on success, MDB2 Error Object on failure + * @access public + */ + function connect() + { + if (is_resource($this->connection)) { + //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 + if (MDB2::areEquals($this->connected_dsn, $this->dsn) + && $this->opened_persistent == $this->options['persistent'] + ) { + return MDB2_OK; + } + $this->disconnect(false); + } + + if ($this->database_name && $this->options['emulate_database']) { + $this->dsn['username'] = $this->options['database_name_prefix'].$this->database_name; + } + + $connection = $this->_doConnect($this->dsn['username'], + $this->dsn['password'], + $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + $this->connection = $connection; + $this->connected_dsn = $this->dsn; + $this->connected_database_name = ''; + $this->opened_persistent = $this->options['persistent']; + $this->dbsyntax = $this->dsn['dbsyntax'] ? $this->dsn['dbsyntax'] : $this->phptype; + + if ($this->database_name) { + if ($this->database_name != $this->connected_database_name) { + $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($this->database_name) .'"'; + $result = $this->_doQuery($query); + if (PEAR::isError($result)) { + $err = $this->raiseError($result, null, null, + 'Could not select the database: '.$this->database_name, __FUNCTION__); + return $err; + } + $this->connected_database_name = $this->database_name; + } + } + + $this->as_keyword = ' '; + $server_info = $this->getServerVersion(); + if (is_array($server_info)) { + if ($server_info['major'] >= '10') { + $this->as_keyword = ' AS '; + } + } + return MDB2_OK; + } + + // }}} + // {{{ databaseExists() + + /** + * check if given database name is exists? + * + * @param string $name name of the database that should be checked + * + * @return mixed true/false on success, a MDB2 error on failure + * @access public + */ + function databaseExists($name) + { + $connection = $this->_doConnect($this->dsn['username'], + $this->dsn['password'], + $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + + $query = 'ALTER SESSION SET CURRENT_SCHEMA = "' .strtoupper($name) .'"'; + $result = $this->_doQuery($query, true, $connection, false); + if (PEAR::isError($result)) { + if (!MDB2::isError($result, MDB2_ERROR_NOT_FOUND)) { + return $result; + } + return false; + } + return true; + } + + // }}} + // {{{ disconnect() + + /** + * Log out and disconnect from the database. + * + * @param boolean $force if the disconnect should be forced even if the + * connection is opened persistently + * @return mixed true on success, false if not connected and error + * object on error + * @access public + */ + function disconnect($force = true) + { + if (is_resource($this->connection)) { + if ($this->in_transaction) { + $dsn = $this->dsn; + $database_name = $this->database_name; + $persistent = $this->options['persistent']; + $this->dsn = $this->connected_dsn; + $this->database_name = $this->connected_database_name; + $this->options['persistent'] = $this->opened_persistent; + $this->rollback(); + $this->dsn = $dsn; + $this->database_name = $database_name; + $this->options['persistent'] = $persistent; + } + + if (!$this->opened_persistent || $force) { + $ok = false; + if (function_exists('oci_close')) { + $ok = @oci_close($this->connection); + } else { + $ok = @OCILogOff($this->connection); + } + if (!$ok) { + return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED, + null, null, null, __FUNCTION__); + } + } + $this->uncommitedqueries = 0; + } else { + return false; + } + return parent::disconnect($force); + } + + // }}} + // {{{ standaloneQuery() + + /** + * execute a query as DBA + * + * @param string $query the SQL query + * @param mixed $types array containing the types of the columns in + * the result set + * @param boolean $is_manip if the query is a manipulation query + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function standaloneQuery($query, $types = null, $is_manip = false) + { + $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; + $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; + $connection = $this->_doConnect($user, $pass, $this->options['persistent']); + if (PEAR::isError($connection)) { + return $connection; + } + + $offset = $this->offset; + $limit = $this->limit; + $this->offset = $this->limit = 0; + $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); + + $result = $this->_doQuery($query, $is_manip, $connection, false); + if (!PEAR::isError($result)) { + if ($is_manip) { + $result = $this->_affectedRows($connection, $result); + } else { + $result = $this->_wrapResult($result, $types, true, false, $limit, $offset); + } + } + + @OCILogOff($connection); + return $result; + } + + // }}} + // {{{ _modifyQuery() + + /** + * Changes a query string for various DBMS specific reasons + * + * @param string $query query to modify + * @param boolean $is_manip if it is a DML query + * @param integer $limit limit the number of rows + * @param integer $offset start reading from given offset + * @return string modified query + * @access protected + */ + function _modifyQuery($query, $is_manip, $limit, $offset) + { + if (preg_match('/^\s*SELECT/i', $query)) { + if (!preg_match('/\sFROM\s/i', $query)) { + $query.= " FROM dual"; + } + if ($limit > 0) { + // taken from http://svn.ez.no/svn/ezcomponents/packages/Database + $max = $offset + $limit; + if ($offset > 0) { + $min = $offset + 1; + $query = "SELECT * FROM (SELECT a.*, ROWNUM mdb2rn FROM ($query) a WHERE ROWNUM <= $max) WHERE mdb2rn >= $min"; + } else { + $query = "SELECT a.* FROM ($query) a WHERE ROWNUM <= $max"; + } + } + } + return $query; + } + + // }}} + // {{{ _doQuery() + + /** + * Execute a query + * @param string $query query + * @param boolean $is_manip if the query is a manipulation query + * @param resource $connection + * @param string $database_name + * @return result or error object + * @access protected + */ + function _doQuery($query, $is_manip = false, $connection = null, $database_name = null) + { + $this->last_query = $query; + $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); + if ($result) { + if (PEAR::isError($result)) { + return $result; + } + $query = $result; + } + if ($this->getOption('disable_query')) { + if ($is_manip) { + return 0; + } + return null; + } + + if (null === $connection) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + } + + $query = str_replace("\r\n", "\n", $query); //for fixing end-of-line character in the PL/SQL in windows + $result = @OCIParse($connection, $query); + if (!$result) { + $err = $this->raiseError(null, null, null, + 'Could not create statement', __FUNCTION__); + return $err; + } + + $mode = $this->in_transaction ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; + if (!@OCIExecute($result, $mode)) { + $err = $this->raiseError($result, null, null, + 'Could not execute statement', __FUNCTION__); + return $err; + } + + if (is_numeric($this->options['result_prefetching'])) { + @ocisetprefetch($result, $this->options['result_prefetching']); + } + + $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'post', 'result' => $result)); + return $result; + } + + // }}} + // {{{ _affectedRows() + + /** + * Returns the number of rows affected + * + * @param resource $result + * @param resource $connection + * @return mixed MDB2 Error Object or the number of rows affected + * @access private + */ + function _affectedRows($connection, $result = null) + { + if (null === $connection) { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + } + return @OCIRowCount($result); + } + + // }}} + // {{{ getServerVersion() + + /** + * return version information about the server + * + * @param bool $native determines if the raw version string should be returned + * @return mixed array/string with version information or MDB2 error object + * @access public + */ + function getServerVersion($native = false) + { + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if ($this->connected_server_info) { + $server_info = $this->connected_server_info; + } else { + $server_info = @ociserverversion($connection); + } + if (!$server_info) { + return $this->raiseError(null, null, null, + 'Could not get server information', __FUNCTION__); + } + // cache server_info + $this->connected_server_info = $server_info; + if (!$native) { + if (!preg_match('/ (\d+)\.(\d+)\.(\d+)\.([\d\.]+) /', $server_info, $tmp)) { + return $this->raiseError(MDB2_ERROR_INVALID, null, null, + 'Could not parse version information:'.$server_info, __FUNCTION__); + } + $server_info = array( + 'major' => $tmp[1], + 'minor' => $tmp[2], + 'patch' => $tmp[3], + 'extra' => $tmp[4], + 'native' => $server_info, + ); + } + return $server_info; + } + + // }}} + // {{{ prepare() + + /** + * Prepares a query for multiple execution with execute(). + * With some database backends, this is emulated. + * prepare() requires a generic query as string like + * 'INSERT INTO numbers VALUES(?,?)' or + * 'INSERT INTO numbers VALUES(:foo,:bar)'. + * The ? and :name and are placeholders which can be set using + * bindParam() and the query can be sent off using the execute() method. + * The allowed format for :name can be set with the 'bindname_format' option. + * + * @param string $query the query to prepare + * @param mixed $types array that contains the types of the placeholders + * @param mixed $result_types array that contains the types of the columns in + * the result set or MDB2_PREPARE_RESULT, if set to + * MDB2_PREPARE_MANIP the query is handled as a manipulation query + * @param mixed $lobs key (field) value (parameter) pair for all lob placeholders + * @return mixed resource handle for the prepared query on success, a MDB2 + * error on failure + * @access public + * @see bindParam, execute + */ + function prepare($query, $types = null, $result_types = null, $lobs = array()) + { + if ($this->options['emulate_prepared']) { + return parent::prepare($query, $types, $result_types, $lobs); + } + $is_manip = ($result_types === MDB2_PREPARE_MANIP); + $offset = $this->offset; + $limit = $this->limit; + $this->offset = $this->limit = 0; + $result = $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'pre')); + if ($result) { + if (PEAR::isError($result)) { + return $result; + } + $query = $result; + } + $query = $this->_modifyQuery($query, $is_manip, $limit, $offset); + $placeholder_type_guess = $placeholder_type = null; + $question = '?'; + $colon = ':'; + $positions = array(); + $position = 0; + $parameter = -1; + while ($position < strlen($query)) { + $q_position = strpos($query, $question, $position); + $c_position = strpos($query, $colon, $position); + if ($q_position && $c_position) { + $p_position = min($q_position, $c_position); + } elseif ($q_position) { + $p_position = $q_position; + } elseif ($c_position) { + $p_position = $c_position; + } else { + break; + } + if (null === $placeholder_type) { + $placeholder_type_guess = $query[$p_position]; + } + + $new_pos = $this->_skipDelimitedStrings($query, $position, $p_position); + if (PEAR::isError($new_pos)) { + return $new_pos; + } + if ($new_pos != $position) { + $position = $new_pos; + continue; //evaluate again starting from the new position + } + + if ($query[$position] == $placeholder_type_guess) { + if (null === $placeholder_type) { + $placeholder_type = $query[$p_position]; + $question = $colon = $placeholder_type; + if (!empty($types) && is_array($types)) { + if ($placeholder_type == ':') { + if (is_int(key($types))) { + $types_tmp = $types; + $types = array(); + $count = -1; + } + } else { + $types = array_values($types); + } + } + } + if ($placeholder_type == ':') { + $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; + $parameter = preg_replace($regexp, '\\1', $query); + if ($parameter === '') { + $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null, + 'named parameter name must match "bindname_format" option', __FUNCTION__); + return $err; + } + // use parameter name in type array + if (isset($count) && isset($types_tmp[++$count])) { + $types[$parameter] = $types_tmp[$count]; + } + $length = strlen($parameter) + 1; + } else { + ++$parameter; + //$length = strlen($parameter); + $length = 1; // strlen('?') + } + if (!in_array($parameter, $positions)) { + $positions[] = $parameter; + } + if (isset($types[$parameter]) + && ($types[$parameter] == 'clob' || $types[$parameter] == 'blob') + ) { + if (!isset($lobs[$parameter])) { + $lobs[$parameter] = $parameter; + } + $value = $this->quote(true, $types[$parameter]); + if (PEAR::isError($value)) { + return $value; + } + $query = substr_replace($query, $value, $p_position, $length); + $position = $p_position + strlen($value) - 1; + } elseif ($placeholder_type == '?') { + $query = substr_replace($query, ':'.$parameter, $p_position, 1); + $position = $p_position + $length; + } else { + $position = $p_position + 1; + } + } else { + $position = $p_position; + } + } + if (is_array($lobs)) { + $columns = $variables = ''; + foreach ($lobs as $parameter => $field) { + $columns.= ($columns ? ', ' : ' RETURNING ').$field; + $variables.= ($variables ? ', ' : ' INTO ').':'.$parameter; + } + $query.= $columns.$variables; + } + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + $statement = @OCIParse($connection, $query); + if (!$statement) { + $err = $this->raiseError(null, null, null, + 'Could not create statement', __FUNCTION__); + return $err; + } + + $class_name = 'MDB2_Statement_'.$this->phptype; + $obj = new $class_name($this, $statement, $positions, $query, $types, $result_types, $is_manip, $limit, $offset); + $this->debug($query, __FUNCTION__, array('is_manip' => $is_manip, 'when' => 'post', 'result' => $obj)); + return $obj; + } + + // }}} + // {{{ nextID() + + /** + * Returns the next free id of a sequence + * + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true the sequence is + * automatic created, if it + * not exists + * @return mixed MDB2 Error Object or id + * @access public + */ + function nextID($seq_name, $ondemand = true) + { + $sequence_name = $this->quoteIdentifier($this->getSequenceName($seq_name), true); + $query = "SELECT $sequence_name.nextval FROM DUAL"; + $this->pushErrorHandling(PEAR_ERROR_RETURN); + $this->expectError(MDB2_ERROR_NOSUCHTABLE); + $result = $this->queryOne($query, 'integer'); + $this->popExpect(); + $this->popErrorHandling(); + if (PEAR::isError($result)) { + if ($ondemand && $result->getCode() == MDB2_ERROR_NOSUCHTABLE) { + $this->loadModule('Manager', null, true); + $result = $this->manager->createSequence($seq_name); + if (PEAR::isError($result)) { + return $result; + } + return $this->nextId($seq_name, false); + } + } + return $result; + } + + // }}} + // {{{ lastInsertID() + + /** + * Returns the autoincrement ID if supported or $id or fetches the current + * ID in a sequence called: $table.(empty($field) ? '' : '_'.$field) + * + * @param string $table name of the table into which a new row was inserted + * @param string $field name of the field into which a new row was inserted + * @return mixed MDB2 Error Object or id + * @access public + */ + function lastInsertID($table = null, $field = null) + { + $old_seq = $table.(empty($field) ? '' : '_'.$field); + $sequence_name = $this->quoteIdentifier($this->getSequenceName($table), true); + $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); + if (PEAR::isError($result)) { + $sequence_name = $this->quoteIdentifier($this->getSequenceName($old_seq), true); + $result = $this->queryOne("SELECT $sequence_name.currval", 'integer'); + } + + return $result; + } + + // }}} + // {{{ currId() + + /** + * Returns the current id of a sequence + * + * @param string $seq_name name of the sequence + * @return mixed MDB2_Error or id + * @access public + */ + function currId($seq_name) + { + $sequence_name = $this->getSequenceName($seq_name); + $query = 'SELECT (last_number-1) FROM all_sequences'; + $query.= ' WHERE sequence_name='.$this->quote($sequence_name, 'text'); + $query.= ' OR sequence_name='.$this->quote(strtoupper($sequence_name), 'text'); + return $this->queryOne($query, 'integer'); + } +} + +/** + * MDB2 OCI8 result driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Result_oci8 extends MDB2_Result_Common +{ + // }}} + // {{{ fetchRow() + + /** + * Fetch a row and insert the data into an existing array. + * + * @param int $fetchmode how the array data should be indexed + * @param int $rownum number of the row where the data can be found + * @return int data array on success, a MDB2 error on failure + * @access public + */ + function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) + { + if (null !== $rownum) { + $seek = $this->seek($rownum); + if (PEAR::isError($seek)) { + return $seek; + } + } + if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { + $fetchmode = $this->db->fetchmode; + } + if ($fetchmode & MDB2_FETCHMODE_ASSOC) { + @OCIFetchInto($this->result, $row, OCI_ASSOC+OCI_RETURN_NULLS); + if (is_array($row) + && $this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE + ) { + $row = array_change_key_case($row, $this->db->options['field_case']); + } + } else { + @OCIFetchInto($this->result, $row, OCI_RETURN_NULLS); + } + if (!$row) { + if (false === $this->result) { + $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + return $err; + } + return null; + } + // remove additional column at the end + if ($this->offset > 0) { + array_pop($row); + } + $mode = 0; + $rtrim = false; + if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { + if (empty($this->types)) { + $mode += MDB2_PORTABILITY_RTRIM; + } else { + $rtrim = true; + } + } + if ($mode) { + $this->db->_fixResultArrayValues($row, $mode); + } + if (!empty($this->types)) { + $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); + } + if (!empty($this->values)) { + $this->_assignBindColumns($row); + } + if ($fetchmode === MDB2_FETCHMODE_OBJECT) { + $object_class = $this->db->options['fetch_class']; + if ($object_class == 'stdClass') { + $row = (object) $row; + } else { + $rowObj = new $object_class($row); + $row = $rowObj; + } + } + ++$this->rownum; + return $row; + } + + // }}} + // {{{ _getColumnNames() + + /** + * Retrieve the names of columns returned by the DBMS in a query result. + * + * @return mixed Array variable that holds the names of columns as keys + * or an MDB2 error on failure. + * Some DBMS may not return any columns when the result set + * does not contain any rows. + * @access private + */ + function _getColumnNames() + { + $columns = array(); + $numcols = $this->numCols(); + if (PEAR::isError($numcols)) { + return $numcols; + } + for ($column = 0; $column < $numcols; $column++) { + $column_name = @OCIColumnName($this->result, $column + 1); + $columns[$column_name] = $column; + } + if ($this->db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { + $columns = array_change_key_case($columns, $this->db->options['field_case']); + } + return $columns; + } + + // }}} + // {{{ numCols() + + /** + * Count the number of columns returned by the DBMS in a query result. + * + * @return mixed integer value with the number of columns, a MDB2 error + * on failure + * @access public + */ + function numCols() + { + $cols = @OCINumCols($this->result); + if (null === $cols) { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return count($this->types); + } + return $this->db->raiseError(null, null, null, + 'Could not get column count', __FUNCTION__); + } + if ($this->offset > 0) { + --$cols; + } + return $cols; + } + + // }}} + // {{{ free() + + /** + * Free the internal resources associated with $result. + * + * @return boolean true on success, false if $result is invalid + * @access public + */ + function free() + { + if (is_resource($this->result) && $this->db->connection) { + $free = @OCIFreeCursor($this->result); + if (false === $free) { + return $this->db->raiseError(null, null, null, + 'Could not free result', __FUNCTION__); + } + } + $this->result = false; + return MDB2_OK; + + } +} + +/** + * MDB2 OCI8 buffered result driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_BufferedResult_oci8 extends MDB2_Result_oci8 +{ + var $buffer; + var $buffer_rownum = - 1; + + // {{{ _fillBuffer() + + /** + * Fill the row buffer + * + * @param int $rownum row number upto which the buffer should be filled + if the row number is null all rows are ready into the buffer + * @return boolean true on success, false on failure + * @access protected + */ + function _fillBuffer($rownum = null) + { + if (isset($this->buffer) && is_array($this->buffer)) { + if (null === $rownum) { + if (!end($this->buffer)) { + return false; + } + } elseif (isset($this->buffer[$rownum])) { + return (bool)$this->buffer[$rownum]; + } + } + + $row = true; + while (((null === $rownum) || $this->buffer_rownum < $rownum) + && ($row = @OCIFetchInto($this->result, $buffer, OCI_RETURN_NULLS)) + ) { + ++$this->buffer_rownum; + // remove additional column at the end + if ($this->offset > 0) { + array_pop($buffer); + } + if (empty($this->types)) { + foreach (array_keys($buffer) as $key) { + if (is_a($buffer[$key], 'oci-lob')) { + $buffer[$key] = $buffer[$key]->load(); + } + } + } + $this->buffer[$this->buffer_rownum] = $buffer; + } + + if (!$row) { + ++$this->buffer_rownum; + $this->buffer[$this->buffer_rownum] = false; + return false; + } + return true; + } + + // }}} + // {{{ fetchRow() + + /** + * Fetch a row and insert the data into an existing array. + * + * @param int $fetchmode how the array data should be indexed + * @param int $rownum number of the row where the data can be found + * @return int data array on success, a MDB2 error on failure + * @access public + */ + function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) + { + if (false === $this->result) { + $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + return $err; + } + if (null === $this->result) { + return null; + } + if (null !== $rownum) { + $seek = $this->seek($rownum); + if (PEAR::isError($seek)) { + return $seek; + } + } + $target_rownum = $this->rownum + 1; + if ($fetchmode == MDB2_FETCHMODE_DEFAULT) { + $fetchmode = $this->db->fetchmode; + } + if (!$this->_fillBuffer($target_rownum)) { + return null; + } + $row = $this->buffer[$target_rownum]; + if ($fetchmode & MDB2_FETCHMODE_ASSOC) { + $column_names = $this->getColumnNames(); + foreach ($column_names as $name => $i) { + $column_names[$name] = $row[$i]; + } + $row = $column_names; + } + $mode = 0; + $rtrim = false; + if ($this->db->options['portability'] & MDB2_PORTABILITY_RTRIM) { + if (empty($this->types)) { + $mode += MDB2_PORTABILITY_RTRIM; + } else { + $rtrim = true; + } + } + if ($mode) { + $this->db->_fixResultArrayValues($row, $mode); + } + if (!empty($this->types)) { + $row = $this->db->datatype->convertResultRow($this->types, $row, $rtrim); + } + if (!empty($this->values)) { + $this->_assignBindColumns($row); + } + if ($fetchmode === MDB2_FETCHMODE_OBJECT) { + $object_class = $this->db->options['fetch_class']; + if ($object_class == 'stdClass') { + $row = (object) $row; + } else { + $rowObj = new $object_class($row); + $row = $rowObj; + } + } + ++$this->rownum; + return $row; + } + + // }}} + // {{{ seek() + + /** + * Seek to a specific row in a result set + * + * @param int $rownum number of the row where the data can be found + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function seek($rownum = 0) + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + $this->rownum = $rownum - 1; + return MDB2_OK; + } + + // }}} + // {{{ valid() + + /** + * Check if the end of the result set has been reached + * + * @return mixed true or false on sucess, a MDB2 error on failure + * @access public + */ + function valid() + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return true; + } + if ($this->_fillBuffer($this->rownum + 1)) { + return true; + } + return false; + } + + // }}} + // {{{ numRows() + + /** + * Returns the number of rows in a result object + * + * @return mixed MDB2 Error Object or the number of rows + * @access public + */ + function numRows() + { + if (false === $this->result) { + return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, + 'resultset has already been freed', __FUNCTION__); + } + if (null === $this->result) { + return 0; + } + $this->_fillBuffer(); + return $this->buffer_rownum; + } + + // }}} + // {{{ free() + + /** + * Free the internal resources associated with $result. + * + * @return boolean true on success, false if $result is invalid + * @access public + */ + function free() + { + $this->buffer = null; + $this->buffer_rownum = null; + return parent::free(); + } +} + +/** + * MDB2 OCI8 statement driver + * + * @package MDB2 + * @category Database + * @author Lukas Smith + */ +class MDB2_Statement_oci8 extends MDB2_Statement_Common +{ + // {{{ Variables (Properties) + + var $type_maxlengths = array(); + + // }}} + // {{{ bindParam() + + /** + * Bind a variable to a parameter of a prepared query. + * + * @param int $parameter the order number of the parameter in the query + * statement. The order number of the first parameter is 1. + * @param mixed &$value variable that is meant to be bound to specified + * parameter. The type of the value depends on the $type argument. + * @param string $type specifies the type of the field + * @param int $maxlength specifies the maximum length of the field; if set to -1, the + * current length of $value is used + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * + * @access public + */ + function bindParam($parameter, &$value, $type = null, $maxlength = -1) + { + if (!is_numeric($parameter)) { + $parameter = preg_replace('/^:(.*)$/', '\\1', $parameter); + } + if (MDB2_OK === ($ret = parent::bindParam($parameter, $value, $type))) { + $this->type_maxlengths[$parameter] = $maxlength; + } + + return $ret; + } + + // }}} + // {{{ _execute() + + /** + * Execute a prepared query statement helper method. + * + * @param mixed $result_class string which specifies which result class to use + * @param mixed $result_wrap_class string which specifies which class to wrap results in + * + * @return mixed MDB2_Result or integer (affected rows) on success, + * a MDB2 error on failure + * @access private + */ + function _execute($result_class = true, $result_wrap_class = false) + { + if (null === $this->statement) { + return parent::_execute($result_class, $result_wrap_class); + } + $this->db->last_query = $this->query; + $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values)); + if ($this->db->getOption('disable_query')) { + $result = $this->is_manip ? 0 : null; + return $result; + } + + $connection = $this->db->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + + $result = MDB2_OK; + $lobs = $quoted_values = array(); + $i = 0; + foreach ($this->positions as $parameter) { + if (!array_key_exists($parameter, $this->values)) { + return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, + 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); + } + $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null; + if ($type == 'clob' || $type == 'blob') { + $lobs[$i]['file'] = false; + if (is_resource($this->values[$parameter])) { + $fp = $this->values[$parameter]; + $this->values[$parameter] = ''; + while (!feof($fp)) { + $this->values[$parameter] .= fread($fp, 8192); + } + } elseif (is_a($this->values[$parameter], 'OCI-Lob')) { + //do nothing + } elseif ($this->db->getOption('lob_allow_url_include') + && preg_match('/^(\w+:\/\/)(.*)$/', $this->values[$parameter], $match) + ) { + $lobs[$i]['file'] = true; + if ($match[1] == 'file://') { + $this->values[$parameter] = $match[2]; + } + } + $lobs[$i]['value'] = $this->values[$parameter]; + $lobs[$i]['descriptor'] =& $this->values[$parameter]; + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], 'OCI-Lob')) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_LOB); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for LOB in parameter: '.$parameter, __FUNCTION__); + break; + } + } + $lob_type = ($type == 'blob' ? OCI_B_BLOB : OCI_B_CLOB); + if (!@OCIBindByName($this->statement, ':'.$parameter, $lobs[$i]['descriptor'], -1, $lob_type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'could not bind LOB parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_BFILE) { + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], "OCI-Lob")) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_FILE); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for BFILE in parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind BFILE parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_ROWID) { + // Test to see if descriptor has already been created for this + // variable (i.e. if it has been bound more than once): + if (!is_a($this->values[$parameter], "OCI-Lob")) { + $this->values[$parameter] = @OCINewDescriptor($connection, OCI_D_ROWID); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to create descriptor for ROWID in parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind ROWID parameter', __FUNCTION__); + break; + } + } else if ($type == OCI_B_CURSOR) { + // Test to see if cursor has already been allocated for this + // variable (i.e. if it has been bound more than once): + if (!is_resource($this->values[$parameter]) || !get_resource_type($this->values[$parameter]) == "oci8 statement") { + $this->values[$parameter] = @OCINewCursor($connection); + if (false === $this->values[$parameter]) { + $result = $this->db->raiseError(null, null, null, + 'Unable to allocate cursor for parameter: '.$parameter, __FUNCTION__); + break; + } + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $this->values[$parameter], -1, $type)) { + $result = $this->db->raiseError($this->statement, null, null, + 'Could not bind CURSOR parameter', __FUNCTION__); + break; + } + } else { + $maxlength = array_key_exists($parameter, $this->type_maxlengths) ? $this->type_maxlengths[$parameter] : -1; + $this->values[$parameter] = $this->db->quote($this->values[$parameter], $type, false); + $quoted_values[$i] =& $this->values[$parameter]; + if (PEAR::isError($quoted_values[$i])) { + return $quoted_values[$i]; + } + if (!@OCIBindByName($this->statement, ':'.$parameter, $quoted_values[$i], $maxlength)) { + $result = $this->db->raiseError($this->statement, null, null, + 'could not bind non-abstract parameter', __FUNCTION__); + break; + } + } + ++$i; + } + + $lob_keys = array_keys($lobs); + if (!PEAR::isError($result)) { + $mode = (!empty($lobs) || $this->db->in_transaction) ? OCI_DEFAULT : OCI_COMMIT_ON_SUCCESS; + if (!@OCIExecute($this->statement, $mode)) { + $err = $this->db->raiseError($this->statement, null, null, + 'could not execute statement', __FUNCTION__); + return $err; + } + + if (!empty($lobs)) { + foreach ($lob_keys as $i) { + if ((null !== $lobs[$i]['value']) && $lobs[$i]['value'] !== '') { + if (is_object($lobs[$i]['value'])) { + // Probably a NULL LOB + // @see http://bugs.php.net/bug.php?id=27485 + continue; + } + if ($lobs[$i]['file']) { + $result = $lobs[$i]['descriptor']->savefile($lobs[$i]['value']); + } else { + $result = $lobs[$i]['descriptor']->save($lobs[$i]['value']); + } + if (!$result) { + $result = $this->db->raiseError(null, null, null, + 'Unable to save descriptor contents', __FUNCTION__); + break; + } + } + } + + if (!PEAR::isError($result)) { + if (!$this->db->in_transaction) { + if (!@OCICommit($connection)) { + $result = $this->db->raiseError(null, null, null, + 'Unable to commit transaction', __FUNCTION__); + } + } else { + ++$this->db->uncommitedqueries; + } + } + } + } + + if (PEAR::isError($result)) { + return $result; + } + + if ($this->is_manip) { + $affected_rows = $this->db->_affectedRows($connection, $this->statement); + return $affected_rows; + } + + $result = $this->db->_wrapResult($this->statement, $this->result_types, + $result_class, $result_wrap_class, $this->limit, $this->offset); + $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); + return $result; + } + + // }}} + // {{{ free() + + /** + * Release resources allocated for the specified prepared query. + * + * @return mixed MDB2_OK on success, a MDB2 error on failure + * @access public + */ + function free() + { + if (null === $this->positions) { + return $this->db->raiseError(MDB2_ERROR, null, null, + 'Prepared statement has already been freed', __FUNCTION__); + } + $result = MDB2_OK; + + if ((null !== $this->statement) && !@OCIFreeStatement($this->statement)) { + $result = $this->db->raiseError(null, null, null, + 'Could not free statement', __FUNCTION__); + } + + parent::free(); + return $result; + } +} +?> \ No newline at end of file diff --git a/3rdparty/smb4php/smb.php b/3rdparty/smb4php/smb.php index 12c5890723..c50b26b935 100644 --- a/3rdparty/smb4php/smb.php +++ b/3rdparty/smb4php/smb.php @@ -166,6 +166,8 @@ class smb { return false; }elseif(substr($regs[0],0,31)=='NT_STATUS_OBJECT_PATH_NOT_FOUND'){ return false; + }elseif(substr($regs[0],0,29)=='NT_STATUS_FILE_IS_A_DIRECTORY'){ + return false; } trigger_error($regs[0].' params('.$params.')', E_USER_ERROR); } diff --git a/apps/admin_audit/appinfo/app.php b/apps/admin_audit/appinfo/app.php index e52f633cf1..2cbed5bf57 100644 --- a/apps/admin_audit/appinfo/app.php +++ b/apps/admin_audit/appinfo/app.php @@ -13,6 +13,9 @@ OCP\Util::connectHook(OC_Filesystem::CLASSNAME, OC_Filesystem::signal_write, 'OC OCP\Util::connectHook(OC_Filesystem::CLASSNAME, OC_Filesystem::signal_read, 'OC_Admin_Audit_Hooks_Handlers', 'read'); OCP\Util::connectHook(OC_Filesystem::CLASSNAME, OC_Filesystem::signal_delete, 'OC_Admin_Audit_Hooks_Handlers', 'delete'); +//FIXME OC_Share does no longer exist +/* OCP\Util::connectHook('OC_Share', 'public', 'OC_Admin_Audit_Hooks_Handlers', 'share_public'); OCP\Util::connectHook('OC_Share', 'public-download', 'OC_Admin_Audit_Hooks_Handlers', 'share_public_download'); OCP\Util::connectHook('OC_Share', 'user', 'OC_Admin_Audit_Hooks_Handlers', 'share_user'); +*/ \ No newline at end of file diff --git a/apps/admin_audit/lib/hooks_handlers.php b/apps/admin_audit/lib/hooks_handlers.php index c5aec97d93..17a553837d 100644 --- a/apps/admin_audit/lib/hooks_handlers.php +++ b/apps/admin_audit/lib/hooks_handlers.php @@ -63,7 +63,8 @@ class OC_Admin_Audit_Hooks_Handlers { $permissions = $params['permissions']; $with = $params['with']; $user = OCP\User::getUser(); - $rw = $permissions & OC_Share::WRITE ? 'w' : 'o'; + //$rw = $permissions & OC_Share::WRITE ? 'w' : 'o'; //FIXME OC_Share no longer exists, hack to check permissions + $rw = $permissions & 1 ? 'w' : 'o'; self::log('Shared "'.$path.'" (r'.$rw.') with user "'.$with.'" by '.$user); } static protected function log($msg) { diff --git a/apps/admin_dependencies_chk/l10n/cs_CZ.php b/apps/admin_dependencies_chk/l10n/cs_CZ.php new file mode 100644 index 0000000000..f750f13aef --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/cs_CZ.php @@ -0,0 +1,14 @@ + "Modul php-json je třeba pro vzájemnou komunikaci mnoha aplikací", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modul php-curl je třeba pro zobrazení titulu strany v okamžiku přidání záložky", +"The php-gd module is needed to create thumbnails of your images" => "Modul php-gd je třeba pro tvorbu náhledů Vašich obrázků", +"The php-ldap module is needed connect to your ldap server" => "Modul php-ldap je třeba pro připojení na Váš ldap server", +"The php-zip module is needed download multiple files at once" => "Modul php-zip je třeba pro souběžné stahování souborů", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "Modul php-mb_multibyte je třeba pro správnou funkci kódování.", +"The php-ctype module is needed validate data." => "Modul php-ctype je třeba k ověřování dat.", +"The php-xml module is needed to share files with webdav." => "Modul php-xml je třeba ke sdílení souborů prostřednictvím WebDAV.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Příkaz allow_url_fopen ve Vašem php.ini souboru by měl být nastaven na 1 kvůli získávání informací z OCS serverů", +"The php-pdo module is needed to store owncloud data into a database." => "Modul php-pdo je třeba pro ukládání dat ownCloud do databáze", +"Dependencies status" => "Status závislostí", +"Used by :" => "Používáno:" +); diff --git a/apps/admin_dependencies_chk/l10n/de.php b/apps/admin_dependencies_chk/l10n/de.php index 0160916809..7877e7d679 100644 --- a/apps/admin_dependencies_chk/l10n/de.php +++ b/apps/admin_dependencies_chk/l10n/de.php @@ -1,10 +1,10 @@ "Das Modul php-json wird von vielen Anwendungen zur internen Kommunikation benötigt.", +"The php-json module is needed by the many applications for inter communications" => "Das Modul php-json wird von vielen Anwendungen zur internen Kommunikation benötigt.", "The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Das Modul php-curl wird benötigt, um den Titel der Seite für die Lesezeichen hinzuzufügen.", -"The php-gd module is needed to create thumbnails of your images" => "Das Modul php-gd wird für die Erzeugung der Vorschaubilder benötigt.", -"The php-ldap module is needed connect to your ldap server" => "Das Modul php-ldap wird für die Verbindung mit dem LDAP-Server benötigt.", +"The php-gd module is needed to create thumbnails of your images" => "Das Modul php-gd wird für die Erzeugung der Vorschaubilder benötigt.", +"The php-ldap module is needed connect to your ldap server" => "Das Modul php-ldap wird für die Verbindung mit dem LDAP-Server benötigt.", "The php-zip module is needed download multiple files at once" => "Das Modul php-zip wird für den gleichzeitigen Download mehrerer Dateien benötigt.", -"The php-mb_multibyte module is needed to manage correctly the encoding." => "Das Modul php_mb_multibyte wird benötigt, um das Encoding richtig zu handhaben.", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "Das Modul php_mb_multibyte wird benötigt, um das Encoding richtig zu handhaben.", "The php-ctype module is needed validate data." => "Das Modul php-ctype wird benötigt, um Daten zu prüfen.", "The php-xml module is needed to share files with webdav." => "Das Modul php-xml wird benötigt, um Dateien über WebDAV zu teilen.", "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Die Richtlinie allow_url_fopen in Ihrer php.ini sollte auf 1 gesetzt werden, um die Wissensbasis vom OCS-Server abrufen.", diff --git a/apps/admin_dependencies_chk/l10n/el.php b/apps/admin_dependencies_chk/l10n/el.php new file mode 100644 index 0000000000..9dd455b670 --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/el.php @@ -0,0 +1,4 @@ + "Κατάσταση εξαρτήσεων", +"Used by :" => "Χρησιμοποιήθηκε από:" +); diff --git a/apps/admin_dependencies_chk/l10n/eo.php b/apps/admin_dependencies_chk/l10n/eo.php new file mode 100644 index 0000000000..65896831f7 --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/eo.php @@ -0,0 +1,14 @@ + "La modulo php-json necesas por komuniko inter la multaj aplikaĵoj", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "La modulo php-curl necesas por venigi la paĝotitolon dum aldono de legosigno", +"The php-gd module is needed to create thumbnails of your images" => "La modulo php-gd necesas por krei bildetojn.", +"The php-ldap module is needed connect to your ldap server" => "La modulo php-ldap necesas por konekti al via LDAP-servilo.", +"The php-zip module is needed download multiple files at once" => "La modulo php-zip necesas por elŝuti plurajn dosierojn per unu fojo.", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "La modulo php-mb_multibyte necesas por ĝuste administri la kodprezenton.", +"The php-ctype module is needed validate data." => "La modulo php-ctype necesas por validkontroli datumojn.", +"The php-xml module is needed to share files with webdav." => "La modulo php-xml necesas por kunhavigi dosierojn per WebDAV.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "La ordono allow_url_fopen de via php.ini devus valori 1 por ricevi scibazon el OCS-serviloj", +"The php-pdo module is needed to store owncloud data into a database." => "La modulo php-pdo necesas por konservi datumojn de ownCloud en datumbazo.", +"Dependencies status" => "Stato de dependoj", +"Used by :" => "Uzata de:" +); diff --git a/apps/admin_dependencies_chk/l10n/es.php b/apps/admin_dependencies_chk/l10n/es.php new file mode 100644 index 0000000000..cbf13951ac --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/es.php @@ -0,0 +1,4 @@ + "Estado de las dependencias", +"Used by :" => "Usado por:" +); diff --git a/apps/admin_dependencies_chk/l10n/et_EE.php b/apps/admin_dependencies_chk/l10n/et_EE.php new file mode 100644 index 0000000000..529c8e78d1 --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/et_EE.php @@ -0,0 +1,14 @@ + "php-json moodul on vajalik paljude rakenduse poolt omvahelise suhtlemise jaoks", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "php-curl moodul on vajalik lehe pealkirja tõmbamiseks järjehoidja lisamisel", +"The php-gd module is needed to create thumbnails of your images" => "php-gd moodul on vajalik sinu piltidest pisipiltide loomiseks", +"The php-ldap module is needed connect to your ldap server" => "php-ldap moodul on vajalik sinu ldap serveriga ühendumiseks", +"The php-zip module is needed download multiple files at once" => "php-zip moodul on vajalik mitme faili korraga alla laadimiseks", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "php-mb_multibyte moodul on vajalik kodeerimise korrektseks haldamiseks.", +"The php-ctype module is needed validate data." => "php-ctype moodul on vajalik andmete kontrollimiseks.", +"The php-xml module is needed to share files with webdav." => "php-xml moodul on vajalik failide jagamiseks webdav-iga.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Sinu php.ini failis oleva direktiivi allow_url_fopen väärtuseks peaks määrama 1, et saaks tõmmata teadmistebaasi OCS-i serveritest", +"The php-pdo module is needed to store owncloud data into a database." => "php-pdo moodul on vajalik owncloudi andmete salvestamiseks andmebaasi.", +"Dependencies status" => "Sõltuvuse staatus", +"Used by :" => "Kasutab :" +); diff --git a/apps/admin_dependencies_chk/l10n/fi_FI.php b/apps/admin_dependencies_chk/l10n/fi_FI.php new file mode 100644 index 0000000000..85e33cfe8c --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/fi_FI.php @@ -0,0 +1,9 @@ + "php-gd-moduuli vaaditaan, jotta kuvista on mahdollista luoda esikatselukuvia", +"The php-ldap module is needed connect to your ldap server" => "php-ldap-moduuli vaaditaan, jotta yhteys ldap-palvelimeen on mahdollista", +"The php-zip module is needed download multiple files at once" => "php-zip-moduuli vaaditaan, jotta useiden tiedostojen samanaikainen lataus on mahdollista", +"The php-xml module is needed to share files with webdav." => "php-xml-moduuli vaaditaan, jotta tiedostojen jako webdavia käyttäen on mahdollista", +"The php-pdo module is needed to store owncloud data into a database." => "php-pdo-moduuli tarvitaan, jotta ownCloud-tietojen tallennus tietokantaan on mahdollista", +"Dependencies status" => "Riippuvuuksien tila", +"Used by :" => "Käyttökohde:" +); diff --git a/apps/admin_dependencies_chk/l10n/it.php b/apps/admin_dependencies_chk/l10n/it.php index 00aeae205b..f51286966e 100644 --- a/apps/admin_dependencies_chk/l10n/it.php +++ b/apps/admin_dependencies_chk/l10n/it.php @@ -7,6 +7,7 @@ "The php-mb_multibyte module is needed to manage correctly the encoding." => "Il modulo php-mb_multibyte è richiesto per gestire correttamente la codifica.", "The php-ctype module is needed validate data." => "Il modulo php-ctype è richiesto per la validazione dei dati.", "The php-xml module is needed to share files with webdav." => "Il modulo php-xml è richiesto per condividere i file con webdav.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "La direttiva allow_url_fopen del tuo php.ini deve essere impostata a 1 per recuperare la base di conoscenza dai server di OCS", "The php-pdo module is needed to store owncloud data into a database." => "Il modulo php-pdo è richiesto per archiviare i dati di ownCloud in un database.", "Dependencies status" => "Stato delle dipendenze", "Used by :" => "Usato da:" diff --git a/apps/admin_dependencies_chk/l10n/ja_JP.php b/apps/admin_dependencies_chk/l10n/ja_JP.php new file mode 100644 index 0000000000..0770b92db1 --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/ja_JP.php @@ -0,0 +1,14 @@ + "php-jsonモジュールはアプリケーション間の内部通信に必要です", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "php-curlモジュールはブックマーク追加時のページタイトル取得に必要です", +"The php-gd module is needed to create thumbnails of your images" => "php-gdモジュールはサムネイル画像の生成に必要です", +"The php-ldap module is needed connect to your ldap server" => "php-ldapモジュールはLDAPサーバへの接続に必要です", +"The php-zip module is needed download multiple files at once" => "php-zipモジュールは複数ファイルの同時ダウンロードに必要です", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "php-mb_multibyteモジュールはエンコードを正しく扱うために必要です", +"The php-ctype module is needed validate data." => "php-ctypeモジュールはデータのバリデーションに必要です", +"The php-xml module is needed to share files with webdav." => "php-xmlモジュールはWebDAVでのファイル共有に必要です", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "php.iniのallow_url_fopenはOCSサーバから知識ベースを取得するために1に設定しなくてはなりません", +"The php-pdo module is needed to store owncloud data into a database." => "php-pdoモジュールはデータベースにownCloudのデータを格納するために必要です", +"Dependencies status" => "依存関係の状況", +"Used by :" => "利用先 :" +); diff --git a/apps/admin_dependencies_chk/l10n/lt_LT.php b/apps/admin_dependencies_chk/l10n/lt_LT.php new file mode 100644 index 0000000000..4fed2ab93d --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/lt_LT.php @@ -0,0 +1,14 @@ + "Php-json modulis yra reikalingas duomenų keitimuisi tarp programų", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Php-curl modulis automatiškai nuskaito tinklapio pavadinimą kuomet išsaugoma žymelė.", +"The php-gd module is needed to create thumbnails of your images" => "Php-gd modulis yra naudojamas paveikslėlių miniatiūroms kurti.", +"The php-ldap module is needed connect to your ldap server" => "Php-ldap modulis yra reikalingas prisijungimui prie jūsų ldap serverio", +"The php-zip module is needed download multiple files at once" => "Php-zip modulis yra reikalingas kelių failų atsiuntimui iš karto.", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "Php-mb_multibyte modulis yra naudojamas apdoroti įvairius teksto kodavimo formatus.", +"The php-ctype module is needed validate data." => "Php-ctype modulis yra reikalingas duomenų tikrinimui.", +"The php-xml module is needed to share files with webdav." => "Php-xml modulis yra reikalingas failų dalinimuisi naudojant webdav.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "allow_url_fopen direktyva turėtų būti nustatyta į \"1\" jei norite automatiškai gauti žinių bazės informaciją iš OCS serverių.", +"The php-pdo module is needed to store owncloud data into a database." => "Php-pdo modulis yra reikalingas duomenų saugojimui į owncloud duomenų bazę.", +"Dependencies status" => "Priklausomybės", +"Used by :" => "Naudojama:" +); diff --git a/apps/admin_dependencies_chk/l10n/pl.php b/apps/admin_dependencies_chk/l10n/pl.php new file mode 100644 index 0000000000..e40d23cb7e --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/pl.php @@ -0,0 +1,14 @@ + "Moduł php-json jest wymagane przez wiele aplikacji do wewnętrznej łączności", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modude php-curl jest wymagany do pobrania tytułu strony podczas dodawania zakładki", +"The php-gd module is needed to create thumbnails of your images" => "Moduł php-gd jest wymagany do tworzenia miniatury obrazów", +"The php-ldap module is needed connect to your ldap server" => "Moduł php-ldap jest wymagany aby połączyć się z serwerem ldap", +"The php-zip module is needed download multiple files at once" => "Moduł php-zip jest wymagany aby pobrać wiele plików na raz", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "Moduł php-mb_multibyte jest wymagany do poprawnego zarządzania kodowaniem.", +"The php-ctype module is needed validate data." => "Moduł php-ctype jest wymagany do sprawdzania poprawności danych.", +"The php-xml module is needed to share files with webdav." => "Moduł php-xml jest wymagany do udostępniania plików przy użyciu protokołu webdav.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Dyrektywy allow_url_fopen użytkownika php.ini powinna być ustawiona na 1 do pobierania bazy wiedzy z serwerów OCS", +"The php-pdo module is needed to store owncloud data into a database." => "Moduł php-pdo jest wymagany do przechowywania danych owncloud w bazie danych.", +"Dependencies status" => "Stan zależności", +"Used by :" => "Używane przez:" +); diff --git a/apps/admin_dependencies_chk/l10n/ru.php b/apps/admin_dependencies_chk/l10n/ru.php new file mode 100644 index 0000000000..58e699cb48 --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/ru.php @@ -0,0 +1,14 @@ + "Модуль php-json необходим многим приложениям для внутренних связей", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Модуль php-curl необходим для получения заголовка страницы при добавлении закладок", +"The php-gd module is needed to create thumbnails of your images" => "Модуль php-gd необходим для создания уменьшенной копии для предпросмотра ваших картинок.", +"The php-ldap module is needed connect to your ldap server" => "Модуль php-ldap необходим для соединения с вашим ldap сервером", +"The php-zip module is needed download multiple files at once" => "Модуль php-zip необходим для загрузки нескольких файлов за раз", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "Модуль php-mb_multibyte необходим для корректного управления кодировками.", +"The php-ctype module is needed validate data." => "Модуль php-ctype необходим для проверки данных.", +"The php-xml module is needed to share files with webdav." => "Модуль php-xml необходим для открытия файлов через webdav.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Директива allow_url_fopen в файле php.ini должна быть установлена в 1 для получения базы знаний с серверов OCS", +"The php-pdo module is needed to store owncloud data into a database." => "Модуль php-pdo необходим для хранения данных ownСloud в базе данных.", +"Dependencies status" => "Статус зависимостей", +"Used by :" => "Используется:" +); diff --git a/apps/admin_dependencies_chk/l10n/sl.php b/apps/admin_dependencies_chk/l10n/sl.php new file mode 100644 index 0000000000..0d36aa379c --- /dev/null +++ b/apps/admin_dependencies_chk/l10n/sl.php @@ -0,0 +1,14 @@ + "Modul php-json je potreben za medsebojno komunikacijo veliko aplikacij.", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "Modul php-curl je potreben za pridobivanje naslova strani pri dodajanju zaznamkov.", +"The php-gd module is needed to create thumbnails of your images" => "Modul php-gd je potreben za ustvarjanje sličic za predogled.", +"The php-ldap module is needed connect to your ldap server" => "Modul php-ldap je potreben za povezavo z vašim ldap strežnikom.", +"The php-zip module is needed download multiple files at once" => "Modul php-zip je potreben za prenašanje večih datotek hkrati.", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "Modul php-mb_multibyte je potreben za pravilno upravljanje kodiranja.", +"The php-ctype module is needed validate data." => "Modul php-ctype je potreben za preverjanje veljavnosti podatkov.", +"The php-xml module is needed to share files with webdav." => "Modul php-xml je potreben za izmenjavo datotek preko protokola WebDAV.", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "Direktiva allow_url_fopen v vaši php.ini datoteki mora biti nastavljena na 1, če želite omogočiti dostop do zbirke znanja na strežnikih OCS.", +"The php-pdo module is needed to store owncloud data into a database." => "Modul php-pdo je potreben za shranjevanje ownCloud podatkov v podatkovno zbirko.", +"Dependencies status" => "Stanje odvisnosti", +"Used by :" => "Uporablja:" +); diff --git a/apps/admin_dependencies_chk/l10n/th_TH.php b/apps/admin_dependencies_chk/l10n/th_TH.php index 338397cb57..01d5c36366 100644 --- a/apps/admin_dependencies_chk/l10n/th_TH.php +++ b/apps/admin_dependencies_chk/l10n/th_TH.php @@ -1,3 +1,14 @@ "โมดูล php-json จำเป็นต้องใช้สำหรับแอพพลิเคชั่นหลายๆตัวเพื่อการเชื่อมต่อสากล", +"The php-curl modude is needed to fetch the page title when adding a bookmarks" => "โมดูล php-curl จำเป็นต้องใช้สำหรับดึงข้อมูลชื่อหัวเว็บเมื่อเพิ่มเข้าไปยังรายการโปรด", +"The php-gd module is needed to create thumbnails of your images" => "โมดูล php-gd จำเป็นต้องใช้สำหรับสร้างรูปภาพขนาดย่อของรูปภาพของคุณ", +"The php-ldap module is needed connect to your ldap server" => "โมดูล php-ldap จำเป็นต้องใช้สำหรับการเชื่อมต่อกับเซิร์ฟเวอร์ ldap ของคุณ", +"The php-zip module is needed download multiple files at once" => "โมดูล php-zip จำเป็นต้องใช้สำหรับดาวน์โหลดไฟล์พร้อมกันหลายๆไฟล์ในครั้งเดียว", +"The php-mb_multibyte module is needed to manage correctly the encoding." => "โมดูล php-mb_multibyte จำเป็นต้องใช้สำหรับการจัดการการแปลงรหัสไฟล์อย่างถูกต้อง", +"The php-ctype module is needed validate data." => "โมดูล php-ctype จำเป็นต้องใช้สำหรับตรวจสอบความถูกต้องของข้อมูล", +"The php-xml module is needed to share files with webdav." => "โมดูล php-xml จำเป็นต้องใช้สำหรับแชร์ไฟล์ด้วย webdav", +"The allow_url_fopen directive of your php.ini should be set to 1 to retrieve knowledge base from OCS servers" => "คำสั่ง allow_url_fopen ที่อยู่ในไฟล์ php.ini ของคุณ ควรกำหนดเป็น 1 เพื่อดึงข้อมูลของฐานความรู้ต่างๆจากเซิร์ฟเวอร์ของ OCS", +"The php-pdo module is needed to store owncloud data into a database." => "โมดูล php-pdo จำเป็นต้องใช้สำหรับจัดเก็บข้อมูลใน owncloud เข้าไปไว้ยังฐานข้อมูล", +"Dependencies status" => "สถานะการอ้างอิง", "Used by :" => "ใช้งานโดย:" ); diff --git a/apps/admin_migrate/l10n/cs_CZ.php b/apps/admin_migrate/l10n/cs_CZ.php new file mode 100644 index 0000000000..0dc1a61d5d --- /dev/null +++ b/apps/admin_migrate/l10n/cs_CZ.php @@ -0,0 +1,5 @@ + "Export této instance ownCloud", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Bude vytvořen komprimovaný soubor obsahující data této instance ownCloud.⏎ Zvolte typ exportu:", +"Export" => "Export" +); diff --git a/apps/admin_migrate/l10n/da.php b/apps/admin_migrate/l10n/da.php new file mode 100644 index 0000000000..a33635cdc1 --- /dev/null +++ b/apps/admin_migrate/l10n/da.php @@ -0,0 +1,4 @@ + "Eksporter ownCloud instans", +"Export" => "Eksporter" +); diff --git a/apps/admin_migrate/l10n/el.php b/apps/admin_migrate/l10n/el.php new file mode 100644 index 0000000000..95034c46a4 --- /dev/null +++ b/apps/admin_migrate/l10n/el.php @@ -0,0 +1,4 @@ + "Αυτό θα δημιουργήσει ένα συμπιεσμένο αρχείο που θα περιέχει τα δεδομένα από αυτό το ownCloud.\n Παρακαλώ επιλέξτε τον τύπο εξαγωγής:", +"Export" => "Εξαγωγή" +); diff --git a/apps/admin_migrate/l10n/eo.php b/apps/admin_migrate/l10n/eo.php new file mode 100644 index 0000000000..a37be76425 --- /dev/null +++ b/apps/admin_migrate/l10n/eo.php @@ -0,0 +1,5 @@ + "Malenporti ĉi tiun aperon de ownCloud", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Ĉi tio kreos densigitan dosieron, kiu enhavos la datumojn de ĉi tiu apero de ownCloud.\nBonvolu elekti la tipon de malenportado:", +"Export" => "Malenporti" +); diff --git a/apps/admin_migrate/l10n/et_EE.php b/apps/admin_migrate/l10n/et_EE.php new file mode 100644 index 0000000000..ee92f9fe21 --- /dev/null +++ b/apps/admin_migrate/l10n/et_EE.php @@ -0,0 +1,5 @@ + "Ekspordi see ownCloudi paigaldus", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "See loob pakitud faili, milles on sinu owncloudi paigalduse andmed.\n Palun vali eksporditava faili tüüp:", +"Export" => "Ekspordi" +); diff --git a/apps/admin_migrate/l10n/fi_FI.php b/apps/admin_migrate/l10n/fi_FI.php new file mode 100644 index 0000000000..2484eab7d3 --- /dev/null +++ b/apps/admin_migrate/l10n/fi_FI.php @@ -0,0 +1,4 @@ + "Vie tämä ownCloud-istanssi", +"Export" => "Vie" +); diff --git a/apps/admin_migrate/l10n/it.php b/apps/admin_migrate/l10n/it.php index 78d2074bca..94ba191ba6 100644 --- a/apps/admin_migrate/l10n/it.php +++ b/apps/admin_migrate/l10n/it.php @@ -1,5 +1,5 @@ "Esporta questa istanza di ownClou", +"Export this ownCloud instance" => "Esporta questa istanza di ownCloud", "This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Questa operazione creerà un file compresso che contiene i dati dell'istanza di ownCloud. Scegli il tipo di esportazione:", "Export" => "Esporta" ); diff --git a/apps/admin_migrate/l10n/ja_JP.php b/apps/admin_migrate/l10n/ja_JP.php new file mode 100644 index 0000000000..f8e5944a6a --- /dev/null +++ b/apps/admin_migrate/l10n/ja_JP.php @@ -0,0 +1,5 @@ + "ownCloudをエクスポート", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "このownCloudのデータを含む圧縮ファイルを生成します。\nエクスポートの種類を選択してください:", +"Export" => "エクスポート" +); diff --git a/apps/admin_migrate/l10n/lt_LT.php b/apps/admin_migrate/l10n/lt_LT.php new file mode 100644 index 0000000000..f78263da75 --- /dev/null +++ b/apps/admin_migrate/l10n/lt_LT.php @@ -0,0 +1,5 @@ + "Eksportuoti šią ownCloud instaliaciją", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Bus sukurtas archyvas su visais owncloud duomenimis ir failais.\n Pasirinkite eksportavimo tipą:", +"Export" => "Eksportuoti" +); diff --git a/apps/admin_migrate/l10n/nb_NO.php b/apps/admin_migrate/l10n/nb_NO.php new file mode 100644 index 0000000000..31f4c030bd --- /dev/null +++ b/apps/admin_migrate/l10n/nb_NO.php @@ -0,0 +1,5 @@ + "Eksporter denne ownCloud forekomsten", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Dette vil opprette en komprimert fil som inneholder dataene fra denne ownCloud forekomsten.⏎ Vennligst velg eksporttype:", +"Export" => "Eksport" +); diff --git a/apps/admin_migrate/l10n/nl.php b/apps/admin_migrate/l10n/nl.php new file mode 100644 index 0000000000..d1a7372c10 --- /dev/null +++ b/apps/admin_migrate/l10n/nl.php @@ -0,0 +1,5 @@ + "Exporteer deze ownCloud instantie", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Dit maakt een gecomprimeerd bestand, met de inhoud van deze ownCloud instantie. Kies het export type:", +"Export" => "Exporteer" +); diff --git a/apps/admin_migrate/l10n/ru.php b/apps/admin_migrate/l10n/ru.php new file mode 100644 index 0000000000..c862657580 --- /dev/null +++ b/apps/admin_migrate/l10n/ru.php @@ -0,0 +1,5 @@ + "Экспортировать этот экземпляр ownCloud", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Будет создан сжатый файл, содержащий данные этого экземпляра owncloud.\n Выберите тип экспорта:", +"Export" => "Экспорт" +); diff --git a/apps/admin_migrate/l10n/sl.php b/apps/admin_migrate/l10n/sl.php new file mode 100644 index 0000000000..b8d1118bfe --- /dev/null +++ b/apps/admin_migrate/l10n/sl.php @@ -0,0 +1,5 @@ + "Izvozi to ownCloud namestitev", +"This will create a compressed file that contains the data of this owncloud instance.\n Please choose the export type:" => "Ustvarjena bo stisnjena datoteka s podatki te ownCloud namestitve.\n Prosimo, če izberete vrsto izvoza:", +"Export" => "Izvozi" +); diff --git a/apps/bookmarks/ajax/addBookmark.php b/apps/bookmarks/ajax/addBookmark.php index c8a64d531c..baf3a288c1 100644 --- a/apps/bookmarks/ajax/addBookmark.php +++ b/apps/bookmarks/ajax/addBookmark.php @@ -21,6 +21,11 @@ * */ +//no apps or filesystem +$RUNTIME_NOSETUPFS=true; + + + // Check if we are a user OCP\JSON::checkLoggedIn(); OCP\JSON::callCheck(); diff --git a/apps/bookmarks/ajax/delBookmark.php b/apps/bookmarks/ajax/delBookmark.php index ba1dfff3be..26437ea0c8 100644 --- a/apps/bookmarks/ajax/delBookmark.php +++ b/apps/bookmarks/ajax/delBookmark.php @@ -26,6 +26,7 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::callCheck(); OCP\JSON::checkAppEnabled('bookmarks'); +OCP\JSON::callCheck(); $id = $_POST['id']; if (!OC_Bookmarks_Bookmarks::deleteUrl($id)){ diff --git a/apps/bookmarks/ajax/editBookmark.php b/apps/bookmarks/ajax/editBookmark.php index ad43be064f..617021e412 100644 --- a/apps/bookmarks/ajax/editBookmark.php +++ b/apps/bookmarks/ajax/editBookmark.php @@ -32,6 +32,8 @@ if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ $_ut = "strftime('%s','now')"; } elseif($CONFIG_DBTYPE == 'pgsql') { $_ut = 'date_part(\'epoch\',now())::integer'; +} elseif($CONFIG_DBTYPE == 'oci') { + $_ut = '(oracletime - to_date(\'19700101\',\'YYYYMMDD\')) * 86400'; } else { $_ut = "UNIX_TIMESTAMP()"; } @@ -39,12 +41,13 @@ if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ){ $bookmark_id = (int)$_POST["id"]; $user_id = OCP\USER::getUser(); -$query = OCP\DB::prepare(" - UPDATE *PREFIX*bookmarks - SET url = ?, title =?, lastmodified = $_ut - WHERE id = ? - AND user_id = ? - "); +//TODO check using CURRENT_TIMESTAMP? prepare already does magic when using now() +$query = OCP\DB::prepare(' + UPDATE `*PREFIX*bookmarks` + SET `url` = ?, `title` = ?, `lastmodified` = '.$_ut.' + WHERE `id` = ? + AND `user_id` = ? + '); $params=array( htmlspecialchars_decode($_POST["url"]), @@ -59,18 +62,22 @@ $result = $query->execute($params); if ($result->numRows() == 0) exit(); # Remove old tags and insert new ones. -$query = OCP\DB::prepare(" - DELETE FROM *PREFIX*bookmarks_tags - WHERE bookmark_id = $bookmark_id - "); +$query = OCP\DB::prepare(' + DELETE FROM `*PREFIX*bookmarks_tags` + WHERE `bookmark_id` = ? + '); -$query->execute(); +$params=array( + $bookmark_id + ); -$query = OCP\DB::prepare(" - INSERT INTO *PREFIX*bookmarks_tags - (bookmark_id, tag) +$query->execute($params); + +$query = OCP\DB::prepare(' + INSERT INTO `*PREFIX*bookmarks_tags` + (`bookmark_id`, `tag`) VALUES (?, ?) - "); + '); $tags = explode(' ', urldecode($_POST["tags"])); foreach ($tags as $tag) { diff --git a/apps/bookmarks/ajax/recordClick.php b/apps/bookmarks/ajax/recordClick.php index 0283f09f60..785056dc11 100644 --- a/apps/bookmarks/ajax/recordClick.php +++ b/apps/bookmarks/ajax/recordClick.php @@ -25,12 +25,12 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('bookmarks'); -$query = OCP\DB::prepare(" - UPDATE *PREFIX*bookmarks - SET clickcount = clickcount + 1 - WHERE user_id = ? - AND url LIKE ? - "); +$query = OCP\DB::prepare(' + UPDATE `*PREFIX*bookmarks` + SET `clickcount` = `clickcount` + 1 + WHERE `user_id` = ? + AND `url` LIKE ? + '); $params=array(OCP\USER::getUser(), htmlspecialchars_decode($_POST["url"])); $bookmarks = $query->execute($params); diff --git a/apps/bookmarks/appinfo/database.xml b/apps/bookmarks/appinfo/database.xml index b03c1fb2c8..d28857b075 100644 --- a/apps/bookmarks/appinfo/database.xml +++ b/apps/bookmarks/appinfo/database.xml @@ -109,4 +109,4 @@ - \ No newline at end of file + diff --git a/apps/bookmarks/appinfo/migrate.php b/apps/bookmarks/appinfo/migrate.php index f1353f1887..f14469269a 100644 --- a/apps/bookmarks/appinfo/migrate.php +++ b/apps/bookmarks/appinfo/migrate.php @@ -35,24 +35,24 @@ class OC_Migration_Provider_Bookmarks extends OC_Migration_Provider{ switch( $this->appinfo->version ){ default: // All versions of the app have had the same db structure, so all can use the same import function - $query = $this->content->prepare( "SELECT * FROM bookmarks WHERE user_id LIKE ?" ); + $query = $this->content->prepare( "SELECT * FROM `bookmarks` WHERE `user_id` LIKE ?" ); $results = $query->execute( array( $this->olduid ) ); $idmap = array(); while( $row = $results->fetchRow() ){ // Import each bookmark, saving its id into the map - $bookmarkquery = OCP\DB::prepare( "INSERT INTO *PREFIX*bookmarks(url, title, user_id, public, added, lastmodified) VALUES (?, ?, ?, ?, ?, ?)" ); - $bookmarkquery->execute( array( $row['url'], $row['title'], $this->uid, $row['public'], $row['added'], $row['lastmodified'] ) ); + $query = OCP\DB::prepare( "INSERT INTO `*PREFIX*bookmarks`(`url`, `title`, `user_id`, `public`, `added`, `lastmodified`) VALUES (?, ?, ?, ?, ?, ?)" ); + $query->execute( array( $row['url'], $row['title'], $this->uid, $row['public'], $row['added'], $row['lastmodified'] ) ); // Map the id $idmap[$row['id']] = OCP\DB::insertid(); } // Now tags foreach($idmap as $oldid => $newid){ - $query = $this->content->prepare( "SELECT * FROM bookmarks_tags WHERE bookmark_id LIKE ?" ); + $query = $this->content->prepare( "SELECT * FROM `bookmarks_tags` WHERE `bookmark_id` LIKE ?" ); $results = $query->execute( array( $oldid ) ); while( $row = $results->fetchRow() ){ // Import the tags for this bookmark, using the new bookmark id - $tagquery = OCP\DB::prepare( "INSERT INTO *PREFIX*bookmarks_tags(bookmark_id, tag) VALUES (?, ?)" ); - $tagquery->execute( array( $newid, $row['tag'] ) ); + $query = OCP\DB::prepare( "INSERT INTO `*PREFIX*bookmarks_tags`(`bookmark_id`, `tag`) VALUES (?, ?)" ); + $query->execute( array( $newid, $row['tag'] ) ); } } // All done! diff --git a/apps/bookmarks/bookmarksHelper.php b/apps/bookmarks/bookmarksHelper.php index 92baac2f51..988042fc0e 100644 --- a/apps/bookmarks/bookmarksHelper.php +++ b/apps/bookmarks/bookmarksHelper.php @@ -83,8 +83,8 @@ function addBookmark($url, $title, $tags='') { //FIXME: Detect when user adds a known URL $query = OCP\DB::prepare(" - INSERT INTO *PREFIX*bookmarks - (url, title, user_id, public, added, lastmodified) + INSERT INTO `*PREFIX*bookmarks` + (`url`, `title`, `user_id`, `public`, `added`, `lastmodified`) VALUES (?, ?, ?, 0, $_ut, $_ut) "); @@ -110,8 +110,8 @@ function addBookmark($url, $title, $tags='') { if($b_id !== false) { $query = OCP\DB::prepare(" - INSERT INTO *PREFIX*bookmarks_tags - (bookmark_id, tag) + INSERT INTO `*PREFIX*bookmarks_tags` + (`bookmark_id`, `tag`) VALUES (?, ?) "); @@ -127,4 +127,4 @@ function addBookmark($url, $title, $tags='') { return $b_id; } -} \ No newline at end of file +} diff --git a/apps/bookmarks/img/bookmarks.png b/apps/bookmarks/img/bookmarks.png index b92e4f50a4..3e8eed2380 100644 Binary files a/apps/bookmarks/img/bookmarks.png and b/apps/bookmarks/img/bookmarks.png differ diff --git a/apps/bookmarks/l10n/cs_CZ.php b/apps/bookmarks/l10n/cs_CZ.php new file mode 100644 index 0000000000..2251969a26 --- /dev/null +++ b/apps/bookmarks/l10n/cs_CZ.php @@ -0,0 +1,12 @@ + "Záložky", +"unnamed" => "nepojmenovaný", +"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Přetáhněte do Vašeho prohlížeče a kliněte, pokud si přejete rychle uložit stranu do záložek:", +"Read later" => "Přečíst později", +"Address" => "Adresa", +"Title" => "Název", +"Tags" => "Tagy", +"Save bookmark" => "Uložit záložku", +"You have no bookmarks" => "Nemáte žádné záložky", +"Bookmarklet
" => "Záložky
" +); diff --git a/apps/bookmarks/l10n/de.php b/apps/bookmarks/l10n/de.php index 9e0f137382..14a54f1cce 100644 --- a/apps/bookmarks/l10n/de.php +++ b/apps/bookmarks/l10n/de.php @@ -1,12 +1,12 @@ "Lesezeichen", "unnamed" => "unbenannt", -"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Ziehe dies zu deinen Browser-Lesezeichen und klicke es, wenn du eine Website schnell den Lesezeichen hinzufügen willst.", +"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Ziehen Sie dies zu Ihren Browser-Lesezeichen und klicken Sie darauf, wenn Sie eine Website schnell den Lesezeichen hinzufügen wollen.", "Read later" => "Später lesen", "Address" => "Adresse", -"Title" => "Title", +"Title" => "Titel", "Tags" => "Tags", "Save bookmark" => "Lesezeichen speichern", -"You have no bookmarks" => "Du hast keine Lesezeichen", +"You have no bookmarks" => "Sie haben keine Lesezeichen", "Bookmarklet
" => "Bookmarklet
" ); diff --git a/apps/bookmarks/l10n/fa.php b/apps/bookmarks/l10n/fa.php new file mode 100644 index 0000000000..b46ce911d4 --- /dev/null +++ b/apps/bookmarks/l10n/fa.php @@ -0,0 +1,8 @@ + "نشانک‌ها", +"unnamed" => "بدون‌نام", +"Address" => "آدرس", +"Title" => "عنوان", +"Save bookmark" => "ذخیره نشانک", +"You have no bookmarks" => "شما هیچ نشانکی ندارید" +); diff --git a/apps/bookmarks/l10n/lt_LT.php b/apps/bookmarks/l10n/lt_LT.php new file mode 100644 index 0000000000..58faddc233 --- /dev/null +++ b/apps/bookmarks/l10n/lt_LT.php @@ -0,0 +1,3 @@ + "be pavadinimo" +); diff --git a/apps/bookmarks/l10n/nb_NO.php b/apps/bookmarks/l10n/nb_NO.php new file mode 100644 index 0000000000..12e63887d2 --- /dev/null +++ b/apps/bookmarks/l10n/nb_NO.php @@ -0,0 +1,11 @@ + "Bokmerker", +"unnamed" => "uten navn", +"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Dra denne over din nettlesers bokmerker og klikk den, hvis du ønsker å hurtig legge til bokmerke for en nettside", +"Read later" => "Les senere", +"Address" => "Adresse", +"Title" => "Tittel", +"Tags" => "Etikett", +"Save bookmark" => "Lagre bokmerke", +"You have no bookmarks" => "Du har ingen bokmerker" +); diff --git a/apps/bookmarks/l10n/nl.php b/apps/bookmarks/l10n/nl.php new file mode 100644 index 0000000000..e5e0894b51 --- /dev/null +++ b/apps/bookmarks/l10n/nl.php @@ -0,0 +1,11 @@ + "Bladwijzers", +"unnamed" => "geen naam", +"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Sleep dit naar uw browser bladwijzers en klik erop, wanneer u een webpagina snel wilt voorzien van een bladwijzer:", +"Read later" => "Lees later", +"Address" => "Adres", +"Title" => "Titel", +"Tags" => "Tags", +"Save bookmark" => "Bewaar bookmark", +"You have no bookmarks" => "U heeft geen bookmarks" +); diff --git a/apps/bookmarks/l10n/ru.php b/apps/bookmarks/l10n/ru.php new file mode 100644 index 0000000000..3abc089e3f --- /dev/null +++ b/apps/bookmarks/l10n/ru.php @@ -0,0 +1,11 @@ + "Закладки", +"unnamed" => "без имени", +"Read later" => "Прочитать позже", +"Address" => "Адрес", +"Title" => "Заголовок", +"Tags" => "Метки", +"Save bookmark" => "Сохранить закладки", +"You have no bookmarks" => "У вас нет закладок", +"Bookmarklet
" => "Букмарклет
" +); diff --git a/apps/bookmarks/l10n/zh_CN.php b/apps/bookmarks/l10n/zh_CN.php new file mode 100644 index 0000000000..0510738c97 --- /dev/null +++ b/apps/bookmarks/l10n/zh_CN.php @@ -0,0 +1,12 @@ + "书签", +"unnamed" => "未命名", +"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "拖曳此处到您的浏览器书签处,点击可以将网页快速添加到书签中。", +"Read later" => "稍后阅读", +"Address" => "地址", +"Title" => "标题", +"Tags" => "标签", +"Save bookmark" => "保存书签", +"You have no bookmarks" => "您暂无书签", +"Bookmarklet
" => "书签应用" +); diff --git a/apps/bookmarks/lib/bookmarks.php b/apps/bookmarks/lib/bookmarks.php index 86fba45a50..e1e1338890 100644 --- a/apps/bookmarks/lib/bookmarks.php +++ b/apps/bookmarks/lib/bookmarks.php @@ -71,16 +71,15 @@ class OC_Bookmarks_Bookmarks{ if($CONFIG_DBTYPE == 'pgsql' ){ $query = OCP\DB::prepare(' - SELECT id, url, title, '.($filterTagOnly?'':'url || title ||').' array_to_string(array_agg(tag), \' \') as tags - FROM *PREFIX*bookmarks - LEFT JOIN *PREFIX*bookmarks_tags ON *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id + SELECT `id`, `url`, `title`, '.($filterTagOnly?'':'`url` || `title` ||').' array_to_string(array_agg(`tag`), \' \') as `tags` + FROM `*PREFIX*bookmarks` + LEFT JOIN `*PREFIX*bookmarks_tags` ON `*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id` WHERE - *PREFIX*bookmarks.user_id = ? - GROUP BY id, url, title + `*PREFIX*bookmarks`.`user_id` = ? + GROUP BY `id`, `url`, `title` '.$sqlFilterTag.' - ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC - LIMIT 10 - OFFSET '. $offset); + ORDER BY `*PREFIX*bookmarks`.`'.$sqlSortColumn.'` DESC', + 10,$offset); } else { if( $CONFIG_DBTYPE == 'sqlite' or $CONFIG_DBTYPE == 'sqlite3' ) $concatFunction = '(url || title || '; @@ -88,26 +87,26 @@ class OC_Bookmarks_Bookmarks{ $concatFunction = 'Concat(Concat( url, title), '; $query = OCP\DB::prepare(' - SELECT id, url, title, ' + SELECT `id`, `url`, `title`, ' .($filterTagOnly?'':$concatFunction). - 'CASE WHEN *PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - THEN GROUP_CONCAT( tag ' .$_gc_separator. ' ) + 'CASE WHEN `*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id` + THEN GROUP_CONCAT( `tag` ' .$_gc_separator. ' ) ELSE \' \' END ' .($filterTagOnly?'':')').' - AS tags - FROM *PREFIX*bookmarks - LEFT JOIN *PREFIX*bookmarks_tags ON 1=1 - WHERE (*PREFIX*bookmarks.id = *PREFIX*bookmarks_tags.bookmark_id - OR *PREFIX*bookmarks.id NOT IN ( - SELECT *PREFIX*bookmarks_tags.bookmark_id FROM *PREFIX*bookmarks_tags + AS `tags` + FROM `*PREFIX*bookmarks` + LEFT JOIN `*PREFIX*bookmarks_tags` ON 1=1 + WHERE (`*PREFIX*bookmarks`.`id` = `*PREFIX*bookmarks_tags`.`bookmark_id` + OR `*PREFIX*bookmarks`.`id` NOT IN ( + SELECT `*PREFIX*bookmarks_tags`.`bookmark_id` FROM `*PREFIX*bookmarks_tags` ) ) - AND *PREFIX*bookmarks.user_id = ? - GROUP BY url + AND `*PREFIX*bookmarks`.`user_id` = ? + GROUP BY `url` '.$sqlFilterTag.' - ORDER BY *PREFIX*bookmarks.'.$sqlSortColumn.' DESC - LIMIT '.$offset.', 10'); + ORDER BY `*PREFIX*bookmarks`.`'.$sqlSortColumn.'` DESC', + 10, $offset); } $bookmarks = $query->execute($params)->fetchAll(); @@ -119,9 +118,9 @@ class OC_Bookmarks_Bookmarks{ $user = OCP\USER::getUser(); $query = OCP\DB::prepare(" - SELECT id FROM *PREFIX*bookmarks - WHERE id = ? - AND user_id = ? + SELECT `id` FROM `*PREFIX*bookmarks` + WHERE `id` = ? + AND `user_id` = ? "); $result = $query->execute(array($id, $user)); @@ -131,18 +130,18 @@ class OC_Bookmarks_Bookmarks{ } $query = OCP\DB::prepare(" - DELETE FROM *PREFIX*bookmarks - WHERE id = $id + DELETE FROM `*PREFIX*bookmarks` + WHERE `id` = $id "); $result = $query->execute(); $query = OCP\DB::prepare(" - DELETE FROM *PREFIX*bookmarks_tags - WHERE bookmark_id = $id + DELETE FROM `*PREFIX*bookmarks_tags` + WHERE `bookmark_id` = $id "); $result = $query->execute(); return true; } -} \ No newline at end of file +} diff --git a/apps/calendar/ajax/calendar/edit.php b/apps/calendar/ajax/calendar/edit.php index 82f18fe7f4..3f69666b58 100644 --- a/apps/calendar/ajax/calendar/edit.php +++ b/apps/calendar/ajax/calendar/edit.php @@ -9,6 +9,7 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('calendar'); +OCP\JSON::callCheck(); $calendarcolor_options = OC_Calendar_Calendar::getCalendarColorOptions(); $calendar = OC_Calendar_App::getCalendar($_GET['calendarid'], true); diff --git a/apps/calendar/ajax/changeview.php b/apps/calendar/ajax/changeview.php index 47e690f329..819025543a 100644 --- a/apps/calendar/ajax/changeview.php +++ b/apps/calendar/ajax/changeview.php @@ -14,7 +14,7 @@ switch($view){ case 'list': break; default: - OCP\JSON::error(array('message'=>'unexspected parameter: ' . $view)); + OCP\JSON::error(array('message'=>'unexpected parameter: ' . $view)); exit; } OCP\Config::setUserValue(OCP\USER::getUser(), 'calendar', 'currentview', $view); diff --git a/apps/calendar/ajax/event/edit.form.php b/apps/calendar/ajax/event/edit.form.php index 86dff7b75a..2751248153 100644 --- a/apps/calendar/ajax/event/edit.form.php +++ b/apps/calendar/ajax/event/edit.form.php @@ -269,4 +269,4 @@ if($repeat['repeat'] != 'doesnotrepeat'){ $tmpl->assign('repeat_date', ''); $tmpl->assign('repeat_year', 'bydate'); } -$tmpl->printpage(); \ No newline at end of file +$tmpl->printpage(); diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php index 5c05c57bca..0078705578 100644 --- a/apps/calendar/appinfo/app.php +++ b/apps/calendar/appinfo/app.php @@ -4,12 +4,18 @@ OC::$CLASSPATH['OC_Calendar_App'] = 'apps/calendar/lib/app.php'; OC::$CLASSPATH['OC_Calendar_Calendar'] = 'apps/calendar/lib/calendar.php'; OC::$CLASSPATH['OC_Calendar_Object'] = 'apps/calendar/lib/object.php'; OC::$CLASSPATH['OC_Calendar_Hooks'] = 'apps/calendar/lib/hooks.php'; -OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/connector_sabre.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV'] = 'apps/calendar/lib/sabre/backend.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_CalendarRoot'] = 'apps/calendar/lib/sabre/calendarroot.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_UserCalendars'] = 'apps/calendar/lib/sabre/usercalendars.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_Calendar'] = 'apps/calendar/lib/sabre/calendar.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CalDAV_CalendarObject'] = 'apps/calendar/lib/sabre/object.php'; OC::$CLASSPATH['OC_Calendar_Repeat'] = 'apps/calendar/lib/repeat.php'; OC::$CLASSPATH['OC_Calendar_Share'] = 'apps/calendar/lib/share.php'; OC::$CLASSPATH['OC_Search_Provider_Calendar'] = 'apps/calendar/lib/search.php'; OC::$CLASSPATH['OC_Calendar_Export'] = 'apps/calendar/lib/export.php'; OC::$CLASSPATH['OC_Calendar_Import'] = 'apps/calendar/lib/import.php'; +OC::$CLASSPATH['OC_Share_Backend_Calendar'] = 'apps/calendar/lib/share/calendar.php'; +OC::$CLASSPATH['OC_Share_Backend_Event'] = 'apps/calendar/lib/share/event.php'; //General Hooks OCP\Util::connectHook('OC_User', 'post_createUser', 'OC_Calendar_Hooks', 'createUser'); OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OC_Calendar_Hooks', 'deleteUser'); @@ -34,3 +40,5 @@ OCP\App::addNavigationEntry( array( 'icon' => OCP\Util::imagePath( 'calendar', 'icon.svg' ), 'name' => $l->t('Calendar'))); OC_Search::registerProvider('OC_Search_Provider_Calendar'); +OCP\Share::registerBackend('calendar', 'OC_Share_Backend_Calendar'); +OCP\Share::registerBackend('event', 'OC_Share_Backend_Event'); diff --git a/apps/calendar/appinfo/database.xml b/apps/calendar/appinfo/database.xml index 73457e6c6c..16e10010d5 100644 --- a/apps/calendar/appinfo/database.xml +++ b/apps/calendar/appinfo/database.xml @@ -43,14 +43,14 @@ startdate timestamp - 0000-00-00 00:00:00 + CURRENT_TIMESTAMP false enddate timestamp - 0000-00-00 00:00:00 + CURRENT_TIMESTAMP false @@ -72,7 +72,7 @@ calendardata - clob + text false @@ -172,7 +172,7 @@ timezone - clob + text false diff --git a/apps/calendar/appinfo/remote.php b/apps/calendar/appinfo/remote.php index dd605072ce..f499d90966 100644 --- a/apps/calendar/appinfo/remote.php +++ b/apps/calendar/appinfo/remote.php @@ -21,15 +21,15 @@ $principalBackend = new OC_Connector_Sabre_Principal(); $caldavBackend = new OC_Connector_Sabre_CalDAV(); // Root nodes -$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); +$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); $Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening -$Sabre_CalDAV_CalendarRootNode = new Sabre_CalDAV_CalendarRootNode($principalBackend, $caldavBackend); -$Sabre_CalDAV_CalendarRootNode->disableListing = true; // Disable listening +$calendarRoot = new OC_Connector_Sabre_CalDAV_CalendarRoot($principalBackend, $caldavBackend); +$calendarRoot->disableListing = true; // Disable listening -$nodes = array( - $Sabre_CalDAV_Principal_Collection, - $Sabre_CalDAV_CalendarRootNode, +$nodes = array( + $Sabre_CalDAV_Principal_Collection, + $calendarRoot, ); // Fire up server diff --git a/apps/calendar/appinfo/update.php b/apps/calendar/appinfo/update.php index 98159c3383..0e11c99884 100644 --- a/apps/calendar/appinfo/update.php +++ b/apps/calendar/appinfo/update.php @@ -2,7 +2,7 @@ $installedVersion=OCP\Config::getAppValue('calendar', 'installed_version'); if (version_compare($installedVersion, '0.2.1', '<')) { - $stmt = OCP\DB::prepare( 'SELECT id, calendarcolor FROM *PREFIX*calendar_calendars WHERE calendarcolor IS NOT NULL' ); + $stmt = OCP\DB::prepare( 'SELECT `id`, `calendarcolor` FROM `*PREFIX*calendar_calendars` WHERE `calendarcolor` IS NOT NULL' ); $result = $stmt->execute(); while( $row = $result->fetchRow()) { $id = $row['id']; @@ -11,7 +11,7 @@ if (version_compare($installedVersion, '0.2.1', '<')) { continue; } $color = '#' .$color; - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET calendarcolor=? WHERE id=?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `calendarcolor`=? WHERE `id`=?' ); $r = $stmt->execute(array($color,$id)); } } diff --git a/apps/calendar/css/import.css b/apps/calendar/css/import.css index 8abdc3aecd..fd82006072 100644 --- a/apps/calendar/css/import.css +++ b/apps/calendar/css/import.css @@ -11,4 +11,4 @@ #calendar_import_mergewarning{clear: both;} #calendar_import_defaultcolors{clear:both;margin: 0 auto;text-align: center;} .calendar_import_warning{border-color: #fc3333;} -.calendar-colorpicker-color{display:inline-block;width:20px;height:5px;margin: 0 auto;cursor:pointer;border:2px solid transparent;} \ No newline at end of file +.calendar-colorpicker-color{display:inline-block;width:20px;height:5px;margin: 0 auto;cursor:pointer;border:2px solid transparent;margin-top: 5px;} \ No newline at end of file diff --git a/apps/calendar/img/icon.png b/apps/calendar/img/icon.png index eb9e07cbb1..267efd997f 100644 Binary files a/apps/calendar/img/icon.png and b/apps/calendar/img/icon.png differ diff --git a/apps/calendar/js/loader.js b/apps/calendar/js/loader.js index b28d19ab00..253abafc42 100644 --- a/apps/calendar/js/loader.js +++ b/apps/calendar/js/loader.js @@ -173,7 +173,7 @@ Calendar_Import={ } $(document).ready(function(){ if(typeof FileActions !== 'undefined'){ - FileActions.register('text/calendar','importCalendar', '', Calendar_Import.Dialog.open); + FileActions.register('text/calendar','importCalendar', FileActions.PERMISSION_READ, '', Calendar_Import.Dialog.open); FileActions.setDefault('text/calendar','importCalendar'); }; }); diff --git a/apps/calendar/l10n/ar.php b/apps/calendar/l10n/ar.php index 524def22f7..1ca5e0ead5 100644 --- a/apps/calendar/l10n/ar.php +++ b/apps/calendar/l10n/ar.php @@ -1,9 +1,19 @@ "ليس جميع الجداول الزمنيه محفوضه مؤقة", +"Everything seems to be completely cached" => "كل شيء محفوض مؤقة", +"No calendars found." => "لم يتم العثور على جدول الزمني", +"No events found." => "لم يتم العثور على احداث", "Wrong calendar" => "جدول زمني خاطئ", "New Timezone:" => "التوقيت الجديد", "Timezone changed" => "تم تغيير المنطقة الزمنية", "Invalid request" => "طلب غير مفهوم", "Calendar" => "الجدول الزمني", +"ddd" => "ddd", +"ddd M/d" => "ddd M/d", +"dddd M/d" => "ddd M/d", +"MMMM yyyy" => "ddd M/d", +"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", +"dddd, MMM d, yyyy" => "dddd, MMM d, yyyy", "Birthday" => "عيد ميلاد", "Business" => "عمل", "Call" => "إتصال", @@ -19,6 +29,8 @@ "Projects" => "مشاريع", "Questions" => "اسئلة", "Work" => "العمل", +"by" => "من قبل", +"unnamed" => "غير مسمى", "New Calendar" => "جدول زمني جديد", "Does not repeat" => "لا يعاد", "Daily" => "يومي", @@ -64,6 +76,18 @@ "by day and month" => "حسب اليوم و الشهر", "Date" => "تاريخ", "Cal." => "تقويم", +"Sun." => "أحد", +"Mon." => "أثن.", +"Tue." => "ثلا.", +"Wed." => "أرب.", +"Thu." => "خمي.", +"Fri." => "جمع.", +"Sat." => "سبت", +"Jan." => "ك2", +"Feb." => "شبا.", +"Mar." => "آذا.", +"Apr." => "نيس.", +"May." => "أيا.", "All day" => "كل النهار", "Missing fields" => "خانات خالية من المعلومات", "Title" => "عنوان", @@ -77,10 +101,15 @@ "Month" => "شهر", "List" => "قائمة", "Today" => "اليوم", +"Your calendars" => "جداولك الزمنيه", "CalDav Link" => "وصلة CalDav", +"Shared calendars" => "جداول زمنيه مشتركه", +"No shared calendars" => "لا يوجد جداول زمنيه مشتركه", +"Share Calendar" => "شارك الجدول الزمني", "Download" => "تحميل", "Edit" => "تعديل", "Delete" => "حذف", +"shared with you by" => "مشاركه من قبل", "New calendar" => "جدول زمني جديد", "Edit calendar" => "عادل الجدول الزمني", "Displayname" => "الاسم المرئي", @@ -91,8 +120,15 @@ "Cancel" => "إلغاء", "Edit an event" => "عادل حدث", "Export" => "تصدير المعلومات", +"Eventinfo" => "تفاصيل الحدث", +"Repeating" => "يعاد", +"Alarm" => "تنبيه", +"Attendees" => "الحضور", +"Share" => "شارك", "Title of the Event" => "عنوان الحدث", "Category" => "فئة", +"Separate categories with commas" => "افصل الفئات بالفواصل", +"Edit categories" => "عدل الفئات", "All Day Event" => "حدث في يوم كامل", "From" => "من", "To" => "إلى", @@ -119,7 +155,17 @@ "Import" => "إدخال", "Close Dialog" => "أغلق الحوار", "Create a new event" => "إضافة حدث جديد", +"View an event" => "شاهد الحدث", +"No categories selected" => "لم يتم اختيار الفئات", +"of" => "من", +"at" => "في", "Timezone" => "المنطقة الزمنية", "24h" => "24 ساعة", -"12h" => "12 ساعة" +"12h" => "12 ساعة", +"Users" => "المستخدمين", +"select users" => "اختر المستخدمين", +"Editable" => "يمكن تعديله", +"Groups" => "مجموعات", +"select groups" => "اختر المجموعات", +"make public" => "حدث عام" ); diff --git a/apps/calendar/l10n/cs_CZ.php b/apps/calendar/l10n/cs_CZ.php index fcc31613c7..ab76cc49d1 100644 --- a/apps/calendar/l10n/cs_CZ.php +++ b/apps/calendar/l10n/cs_CZ.php @@ -1,7 +1,13 @@ "V paměti nejsou uloženy kompletně všechny kalendáře", +"Everything seems to be completely cached" => "Zdá se, že vše je kompletně uloženo v paměti", "No calendars found." => "Žádné kalendáře nenalezeny.", "No events found." => "Žádné události nenalezeny.", "Wrong calendar" => "Nesprávný kalendář", +"The file contained either no events or all events are already saved in your calendar." => "Soubor, obsahující všechny záznamy nebo je prázdný, je již uložen ve Vašem kalendáři.", +"events has been saved in the new calendar" => "Záznam byl uložen v novém kalendáři", +"Import failed" => "Import selhal", +"events has been saved in your calendar" => "záznamů bylo uloženo ve Vašem kalendáři", "New Timezone:" => "Nová časová zóna:", "Timezone changed" => "Časová zóna byla změněna", "Invalid request" => "Chybný požadavek", @@ -27,6 +33,7 @@ "Projects" => "Projekty", "Questions" => "Dotazy", "Work" => "Pracovní", +"by" => "od", "unnamed" => "nepojmenováno", "New Calendar" => "Nový kalendář", "Does not repeat" => "Neopakuje se", @@ -73,6 +80,25 @@ "by day and month" => "podle dne a měsíce", "Date" => "Datum", "Cal." => "Kal.", +"Sun." => "Ne", +"Mon." => "Po", +"Tue." => "Út", +"Wed." => "St", +"Thu." => "Čt", +"Fri." => "Pá", +"Sat." => "So", +"Jan." => "Ne", +"Feb." => "únor", +"Mar." => "březen", +"Apr." => "duben", +"May." => "květen", +"Jun." => "červen", +"Jul." => "červenec", +"Aug." => "srpen", +"Sep." => "září", +"Oct." => "říjen", +"Nov." => "listopad", +"Dec." => "prosinec", "All day" => "Celý den", "Missing fields" => "Chybějící pole", "Title" => "Název", @@ -86,6 +112,7 @@ "Month" => "měsíc", "List" => "Seznam", "Today" => "dnes", +"Settings" => "Nastavení", "Your calendars" => "Vaše kalendáře", "CalDav Link" => "CalDav odkaz", "Shared calendars" => "Sdílené kalendáře", @@ -136,7 +163,10 @@ "occurrences" => "výskyty", "create a new calendar" => "vytvořit nový kalendář", "Import a calendar file" => "Importovat soubor kalendáře", +"Please choose a calendar" => "Vyberte prosím kalendář", "Name of new calendar" => "Název nového kalendáře", +"Take an available name!" => "Použijte volné jméno!", +"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Kalendář s trímto názvem již existuje. Pokud název použijete, stejnojmenné kalendáře budou sloučeny.", "Import" => "Import", "Close Dialog" => "Zavřít dialog", "Create a new event" => "Vytvořit novou událost", @@ -144,9 +174,21 @@ "No categories selected" => "Žádné kategorie nevybrány", "of" => "z", "at" => "v", +"General" => "Hlavní", "Timezone" => "Časové pásmo", +"Update timezone automatically" => "Obnovit auronaricky časovou zónu.", +"Time format" => "Formát času", "24h" => "24h", "12h" => "12h", +"Start week on" => "Týden začína v", +"Cache" => "Paměť", +"Clear cache for repeating events" => "Vymazat paměť pro opakuijísí se záznamy", +"URLs" => "URLs", +"Calendar CalDAV syncing addresses" => "Kalendář CalDAV synchronizuje adresy", +"more info" => "podrobnosti", +"Primary address (Kontact et al)" => "Primární adresa (veřejná)", +"iOS/OS X" => "iOS/OS X", +"Read only iCalendar link(s)" => "Odkaz(y) kalendáře pouze pro čtení", "Users" => "Uživatelé", "select users" => "vybrat uživatele", "Editable" => "Upravovatelné", diff --git a/apps/calendar/l10n/da.php b/apps/calendar/l10n/da.php index 789765fec4..a193d5e156 100644 --- a/apps/calendar/l10n/da.php +++ b/apps/calendar/l10n/da.php @@ -1,7 +1,12 @@ "Ikke alle kalendere er fuldstændig cached", "No calendars found." => "Der blev ikke fundet nogen kalendere.", "No events found." => "Der blev ikke fundet nogen begivenheder.", "Wrong calendar" => "Forkert kalender", +"The file contained either no events or all events are already saved in your calendar." => "Filen indeholdt enten ingen begivenheder eller alle begivenheder er allerede gemt i din kalender.", +"events has been saved in the new calendar" => "begivenheder er gemt i den nye kalender", +"Import failed" => "import mislykkedes", +"events has been saved in your calendar" => "begivenheder er gemt i din kalender", "New Timezone:" => "Ny tidszone:", "Timezone changed" => "Tidszone ændret", "Invalid request" => "Ugyldig forespørgsel", @@ -106,6 +111,7 @@ "Month" => "Måned", "List" => "Liste", "Today" => "I dag", +"Settings" => "Indstillinger", "Your calendars" => "Dine kalendere", "CalDav Link" => "CalDav-link", "Shared calendars" => "Delte kalendere", @@ -158,14 +164,19 @@ "Import a calendar file" => "Importer en kalenderfil", "Please choose a calendar" => "Vælg en kalender", "Name of new calendar" => "Navn på ny kalender", +"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "En kalender med dette navn findes allerede. Hvis du fortsætter alligevel, vil disse kalendere blive sammenlagt.", "Import" => "Importer", +"Importing calendar" => "Importerer kalender", +"Calendar imported successfully" => "Kalender importeret korrekt", "Close Dialog" => "Luk dialog", "Create a new event" => "Opret en ny begivenhed", "View an event" => "Vis en begivenhed", "No categories selected" => "Ingen categorier valgt", "of" => "fra", "at" => "kl.", +"General" => "Generel", "Timezone" => "Tidszone", +"Update timezone automatically" => "Opdater tidszone automatisk", "24h" => "24T", "12h" => "12T", "more info" => "flere oplysninger", diff --git a/apps/calendar/l10n/de.php b/apps/calendar/l10n/de.php index cd148d757f..d91753ff74 100644 --- a/apps/calendar/l10n/de.php +++ b/apps/calendar/l10n/de.php @@ -1,10 +1,10 @@ "Noch sind nicht alle Kalender zwischengespeichert.", "Everything seems to be completely cached" => "Es sieht so aus, als wäre alles vollständig zwischengespeichert.", -"No calendars found." => "Keine Kalender gefunden", -"No events found." => "Keine Termine gefunden", +"No calendars found." => "Keine Kalender gefunden.", +"No events found." => "Keine Termine gefunden.", "Wrong calendar" => "Falscher Kalender", -"The file contained either no events or all events are already saved in your calendar." => "Entweder enthielt die Datei keine Termine oder alle Termine waren schon im Kalender gespeichert.", +"The file contained either no events or all events are already saved in your calendar." => "Entweder enthielt die Datei keine Termine oder alle Termine waren bereits im Kalender gespeichert.", "events has been saved in the new calendar" => "Der Termin wurde im neuen Kalender gespeichert.", "Import failed" => "Import fehlgeschlagen", "events has been saved in your calendar" => "Der Termin wurde im Kalender gespeichert.", @@ -115,7 +115,7 @@ "Settings" => "Einstellungen", "Your calendars" => "Deine Kalender", "CalDav Link" => "CalDAV-Link", -"Shared calendars" => "geteilte Kalender", +"Shared calendars" => "Geteilte Kalender", "No shared calendars" => "Keine geteilten Kalender", "Share Calendar" => "Kalender teilen", "Download" => "Herunterladen", @@ -162,24 +162,27 @@ "End" => "Ende", "occurrences" => "Termine", "create a new calendar" => "Neuen Kalender anlegen", -"Import a calendar file" => "Kalenderdatei Importieren", +"Import a calendar file" => "Kalenderdatei importieren", "Please choose a calendar" => "Wählen Sie bitte einen Kalender.", "Name of new calendar" => "Kalendername", "Take an available name!" => "Wählen Sie einen verfügbaren Namen.", -"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ein Kalender mit diesem Namen existiert schon. Sollten Sie fortfahren, werden die beiden Kalender zusammengeführt.", +"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Ein Kalender mit diesem Namen existiert bereits. Sollten Sie fortfahren, werden die beiden Kalender zusammengeführt.", "Import" => "Importieren", +"Importing calendar" => "Kalender wird importiert.", +"Calendar imported successfully" => "Kalender erfolgreich importiert", "Close Dialog" => "Dialog schließen", "Create a new event" => "Neues Ereignis", "View an event" => "Termin öffnen", "No categories selected" => "Keine Kategorie ausgewählt", +"Select category" => "Kategorie auswählen", "of" => "von", "at" => "um", "General" => "Allgemein", "Timezone" => "Zeitzone", "Update timezone automatically" => "Zeitzone automatisch aktualisieren", "Time format" => "Zeitformat", -"24h" => "24h", -"12h" => "12h", +"24h" => "24 Stunden", +"12h" => "12 Stunden", "Start week on" => "Erster Wochentag", "Cache" => "Zwischenspeicher", "Clear cache for repeating events" => "Lösche den Zwischenspeicher für wiederholende Veranstaltungen", diff --git a/apps/calendar/l10n/eo.php b/apps/calendar/l10n/eo.php index 1a01bb713f..be3db9bfae 100644 --- a/apps/calendar/l10n/eo.php +++ b/apps/calendar/l10n/eo.php @@ -8,7 +8,7 @@ "events has been saved in the new calendar" => "okazaĵoj estas konservitaj en la nova kalendaro", "Import failed" => "Enporto malsukcesis", "events has been saved in your calendar" => "okazaĵoj estas konservitaj en via kalendaro", -"New Timezone:" => "Nova horzono:", +"New Timezone:" => "Nova horozono:", "Timezone changed" => "La horozono estas ŝanĝita", "Invalid request" => "Nevalida peto", "Calendar" => "Kalendaro", @@ -112,6 +112,7 @@ "Month" => "Monato", "List" => "Listo", "Today" => "Hodiaŭ", +"Settings" => "Agordo", "Your calendars" => "Viaj kalendaroj", "CalDav Link" => "CalDav-a ligilo", "Shared calendars" => "Kunhavigitaj kalendaroj", @@ -173,11 +174,16 @@ "No categories selected" => "Neniu kategorio elektita", "of" => "de", "at" => "ĉe", +"General" => "Ĝenerala", "Timezone" => "Horozono", +"Update timezone automatically" => "Aŭtomate ĝisdatigi la horozonon", +"Time format" => "Horoformo", "24h" => "24h", "12h" => "12h", +"Start week on" => "Komenci semajnon je", "Cache" => "Kaŝmemoro", "Clear cache for repeating events" => "Forviŝi kaŝmemoron por ripeto de okazaĵoj", +"URLs" => "URL-oj", "Calendar CalDAV syncing addresses" => "sinkronigaj adresoj por CalDAV-kalendaroj", "more info" => "pli da informo", "Primary address (Kontact et al)" => "Ĉefa adreso (Kontact kaj aliaj)", diff --git a/apps/calendar/l10n/fi_FI.php b/apps/calendar/l10n/fi_FI.php index 1faa161e65..c4c9df3588 100644 --- a/apps/calendar/l10n/fi_FI.php +++ b/apps/calendar/l10n/fi_FI.php @@ -87,6 +87,7 @@ "Month" => "Kuukausi", "List" => "Lista", "Today" => "Tänään", +"Settings" => "Asetukset", "Your calendars" => "Omat kalenterisi", "CalDav Link" => "CalDav-linkki", "Shared calendars" => "Jaetut kalenterit", @@ -139,10 +140,15 @@ "Create a new event" => "Luo uusi tapahtuma", "View an event" => "Avaa tapahtuma", "No categories selected" => "Luokkia ei ole valittu", +"General" => "Yleiset", "Timezone" => "Aikavyöhyke", +"Update timezone automatically" => "Päivitä aikavyöhykkeet automaattisesti", +"Time format" => "Ajan näyttömuoto", "24h" => "24 tuntia", "12h" => "12 tuntia", +"Start week on" => "Viikon alkamispäivä", "Calendar CalDAV syncing addresses" => "Kalenterin CalDAV-synkronointiosoitteet", +"Primary address (Kontact et al)" => "Ensisijainen osoite (Kontact ja muut vastaavat)", "iOS/OS X" => "iOS/OS X", "Users" => "Käyttäjät", "select users" => "valitse käyttäjät", diff --git a/apps/calendar/l10n/gl.php b/apps/calendar/l10n/gl.php index ff7e4833ad..00a28cc70f 100644 --- a/apps/calendar/l10n/gl.php +++ b/apps/calendar/l10n/gl.php @@ -86,6 +86,9 @@ "Month" => "Mes", "List" => "Lista", "Today" => "Hoxe", +"Calendars" => "Calendarios", +"There was a fail, while parsing the file." => "Produciuse un erro ao procesar o ficheiro", +"Choose active calendars" => "Escolla os calendarios activos", "Your calendars" => "Os seus calendarios", "CalDav Link" => "Ligazón CalDav", "Shared calendars" => "Calendarios compartidos", @@ -136,8 +139,12 @@ "occurrences" => "acontecementos", "create a new calendar" => "crear un novo calendario", "Import a calendar file" => "Importar un ficheiro de calendario", +"Please choose the calendar" => "Por favor, seleccione o calendario", +"create a new calendar" => "crear un novo calendario", "Name of new calendar" => "Nome do novo calendario", "Import" => "Importar", +"Importing calendar" => "Importar calendario", +"Calendar imported successfully" => "Calendario importado correctamente", "Close Dialog" => "Pechar diálogo", "Create a new event" => "Crear un novo evento", "View an event" => "Ver un evento", @@ -145,6 +152,8 @@ "of" => "de", "at" => "a", "Timezone" => "Fuso horario", +"Check always for changes of the timezone" => "Comprobar sempre cambios de fuso horario", +"Timeformat" => "Formato de hora", "24h" => "24h", "12h" => "12h", "Users" => "Usuarios", diff --git a/apps/calendar/l10n/hr.php b/apps/calendar/l10n/hr.php index 4ab5b95518..07512b9605 100644 --- a/apps/calendar/l10n/hr.php +++ b/apps/calendar/l10n/hr.php @@ -136,6 +136,7 @@ "of" => "od", "at" => "na", "Timezone" => "Vremenska zona", +"Timeformat" => "Format vremena", "24h" => "24h", "12h" => "12h", "Users" => "Korisnici", diff --git a/apps/calendar/l10n/ja_JP.php b/apps/calendar/l10n/ja_JP.php index f49aef73d5..e59f186a0b 100644 --- a/apps/calendar/l10n/ja_JP.php +++ b/apps/calendar/l10n/ja_JP.php @@ -33,6 +33,7 @@ "Projects" => "プロジェクト", "Questions" => "質問事項", "Work" => "週の始まり", +"by" => "による", "unnamed" => "無名", "New Calendar" => "新しくカレンダーを作成", "Does not repeat" => "繰り返さない", @@ -99,6 +100,7 @@ "Nov." => "11月", "Dec." => "12月", "All day" => "終日", +"New Calendar" => "新しくカレンダーを作成する", "Missing fields" => "項目がありません", "Title" => "タイトル", "From Date" => "開始日", @@ -109,8 +111,9 @@ "There was a database fail" => "データベースのエラーがありました", "Week" => "週", "Month" => "月", -"List" => "リスト", +"List" => "予定リスト", "Today" => "今日", +"Settings" => "設定", "Your calendars" => "あなたのカレンダー", "CalDav Link" => "CalDavへのリンク", "Shared calendars" => "共有カレンダー", @@ -172,11 +175,16 @@ "No categories selected" => "カテゴリが選択されていません", "of" => "of", "at" => "at", +"General" => "一般", "Timezone" => "タイムゾーン", +"Update timezone automatically" => "自動的にタイムゾーンを更新", +"Time format" => "時刻の表示形式", "24h" => "24h", "12h" => "12h", +"Start week on" => "1週間の初めの曜日", "Cache" => "キャッシュ", -"Clear cache for repeating events" => "イベントを繰り返すためにキャッシュをクリアしてください", +"Clear cache for repeating events" => "繰り返しイベントのキャッシュをクリア", +"URLs" => "URL", "Calendar CalDAV syncing addresses" => "CalDAVカレンダーの同期用アドレス", "more info" => "さらに", "Primary address (Kontact et al)" => "プライマリアドレス(コンタクト等)", diff --git a/apps/calendar/l10n/lb.php b/apps/calendar/l10n/lb.php index 1ef05b048c..6e96b5df18 100644 --- a/apps/calendar/l10n/lb.php +++ b/apps/calendar/l10n/lb.php @@ -111,13 +111,19 @@ "Interval" => "Intervall", "End" => "Enn", "occurrences" => "Virkommes", -"create a new calendar" => "E neie Kalenner uleeën", "Import a calendar file" => "E Kalenner Fichier importéieren", +"Please choose the calendar" => "Wiel den Kalenner aus", +"create a new calendar" => "E neie Kalenner uleeën", "Name of new calendar" => "Numm vum neie Kalenner", "Import" => "Import", +"Importing calendar" => "Importéiert Kalenner", +"Calendar imported successfully" => "Kalenner erfollegräich importéiert", "Close Dialog" => "Dialog zoumaachen", "Create a new event" => "En Evenement maachen", +"Select category" => "Kategorie auswielen", "Timezone" => "Zäitzon", +"Timeformat" => "Zäit Format", "24h" => "24h", -"12h" => "12h" +"12h" => "12h", +"Calendar CalDAV syncing address:" => "CalDAV Kalenner Synchronisatioun's Adress:" ); diff --git a/apps/calendar/l10n/lt_LT.php b/apps/calendar/l10n/lt_LT.php index feb8618897..408718071e 100644 --- a/apps/calendar/l10n/lt_LT.php +++ b/apps/calendar/l10n/lt_LT.php @@ -113,13 +113,19 @@ "End" => "Pabaiga", "create a new calendar" => "sukurti naują kalendorių", "Import a calendar file" => "Importuoti kalendoriaus failą", +"Please choose the calendar" => "Pasirinkite kalendorių", +"create a new calendar" => "sukurti naują kalendorių", "Name of new calendar" => "Naujo kalendoriaus pavadinimas", "Import" => "Importuoti", +"Importing calendar" => "Importuojamas kalendorius", +"Calendar imported successfully" => "Kalendorius sėkmingai importuotas", "Close Dialog" => "Uždaryti", "Create a new event" => "Sukurti naują įvykį", "View an event" => "Peržiūrėti įvykį", "No categories selected" => "Nepasirinktos jokios katagorijos", "Timezone" => "Laiko juosta", +"Check always for changes of the timezone" => "Visada tikrinti laiko zonos pasikeitimus", +"Timeformat" => "Laiko formatas", "24h" => "24val", "12h" => "12val", "Users" => "Vartotojai", diff --git a/apps/calendar/l10n/nb_NO.php b/apps/calendar/l10n/nb_NO.php index e4b859c737..8f736869de 100644 --- a/apps/calendar/l10n/nb_NO.php +++ b/apps/calendar/l10n/nb_NO.php @@ -67,6 +67,7 @@ "Date" => "Dato", "Cal." => "Kal.", "All day" => "Hele dagen ", +"New Calendar" => "Ny kalender", "Missing fields" => "Manglende felt", "Title" => "Tittel", "From Date" => "Fra dato", @@ -79,6 +80,9 @@ "Month" => "ned", "List" => "Liste", "Today" => "I dag", +"Calendars" => "Kalendre", +"There was a fail, while parsing the file." => "Det oppstod en feil under åpningen av filen.", +"Choose active calendars" => "Velg en aktiv kalender", "Your calendars" => "Dine kalendere", "CalDav Link" => "CalDav-lenke", "Shared calendars" => "Delte kalendere", @@ -129,15 +133,24 @@ "occurrences" => "forekomster", "create a new calendar" => "Lag en ny kalender", "Import a calendar file" => "Importer en kalenderfil", +"Please choose the calendar" => "Vennligst velg kalenderen", +"create a new calendar" => "Lag en ny kalender", "Name of new calendar" => "Navn på ny kalender:", "Import" => "Importer", +"Importing calendar" => "Importerer kalender", +"Calendar imported successfully" => "Kalenderen ble importert uten feil", "Close Dialog" => "Lukk dialog", "Create a new event" => "Opprett en ny hendelse", "View an event" => "Se på hendelse", "No categories selected" => "Ingen kategorier valgt", +"Select category" => "Velg kategori", "Timezone" => "Tidssone", +"Check always for changes of the timezone" => "Se alltid etter endringer i tidssone", +"Timeformat" => "Tidsformat:", "24h" => "24 t", "12h" => "12 t", +"First day of the week" => "Ukens første dag", +"Calendar CalDAV syncing address:" => "Kalender CalDAV synkroniseringsadresse", "Users" => "Brukere", "select users" => "valgte brukere", "Editable" => "Redigerbar", diff --git a/apps/calendar/l10n/nl.php b/apps/calendar/l10n/nl.php index 834c0ad905..bc0954abe2 100644 --- a/apps/calendar/l10n/nl.php +++ b/apps/calendar/l10n/nl.php @@ -1,7 +1,13 @@ "Niet alle agenda's zijn volledig gecached", +"Everything seems to be completely cached" => "Alles lijkt volledig gecached te zijn", "No calendars found." => "Geen kalenders gevonden.", "No events found." => "Geen gebeurtenissen gevonden.", "Wrong calendar" => "Verkeerde kalender", +"The file contained either no events or all events are already saved in your calendar." => "Het bestand bevat geen gebeurtenissen of alle gebeurtenissen worden al in uw agenda bewaard.", +"events has been saved in the new calendar" => "De gebeurtenissen worden in de nieuwe agenda bewaard", +"Import failed" => "import is gefaald", +"events has been saved in your calendar" => "de gebeurtenissen zijn in uw agenda opgeslagen ", "New Timezone:" => "Nieuwe tijdszone:", "Timezone changed" => "Tijdzone is veranderd", "Invalid request" => "Ongeldige aanvraag", @@ -27,6 +33,7 @@ "Projects" => "Projecten", "Questions" => "Vragen", "Work" => "Werk", +"by" => "door", "unnamed" => "onbekend", "New Calendar" => "Nieuwe Kalender", "Does not repeat" => "Wordt niet herhaald", @@ -73,6 +80,25 @@ "by day and month" => "per dag en maand", "Date" => "Datum", "Cal." => "Cal.", +"Sun." => "Zon.", +"Mon." => "Maa.", +"Tue." => "Din.", +"Wed." => "Woe.", +"Thu." => "Don.", +"Fri." => "Vrij.", +"Sat." => "Zat.", +"Jan." => "Jan.", +"Feb." => "Feb.", +"Mar." => "Maa.", +"Apr." => "Apr.", +"May." => "Mei.", +"Jun." => "Jun.", +"Jul." => "Jul.", +"Aug." => "Aug.", +"Sep." => "Sep.", +"Oct." => "Okt.", +"Nov." => "Nov.", +"Dec." => "Dec.", "All day" => "Hele dag", "Missing fields" => "missende velden", "Title" => "Titel", @@ -86,6 +112,7 @@ "Month" => "Maand", "List" => "Lijst", "Today" => "Vandaag", +"Settings" => "Instellingen", "Your calendars" => "Je kalenders", "CalDav Link" => "CalDav Link", "Shared calendars" => "Gedeelde kalenders", @@ -136,7 +163,10 @@ "occurrences" => "gebeurtenissen", "create a new calendar" => "Maak een nieuw agenda", "Import a calendar file" => "Importeer een agenda bestand", +"Please choose a calendar" => "Kies een agenda", "Name of new calendar" => "Naam van de nieuwe agenda", +"Take an available name!" => "Kies een beschikbare naam!", +"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Een agenda met deze naam bestaat al. Als u doorgaat, worden deze agenda's samengevoegd", "Import" => "Importeer", "Close Dialog" => "Sluit venster", "Create a new event" => "Maak een nieuwe afspraak", @@ -144,9 +174,21 @@ "No categories selected" => "Geen categorieën geselecteerd", "of" => "van", "at" => "op", +"General" => "Algemeen", "Timezone" => "Tijdzone", +"Update timezone automatically" => "Werk de tijdzone automatisch bij", +"Time format" => "Tijd formaat", "24h" => "24uur", "12h" => "12uur", +"Start week on" => "Begin de week op", +"Cache" => "Cache", +"Clear cache for repeating events" => "Leeg cache voor repeterende gebeurtenissen", +"URLs" => "URLs", +"Calendar CalDAV syncing addresses" => "Agenda CalDAV synchronisatie adres", +"more info" => "meer informatie", +"Primary address (Kontact et al)" => "Primary adres (voor Kontact en dergelijke)", +"iOS/OS X" => "iOS/OS X", +"Read only iCalendar link(s)" => "Alleen lezen iCalendar link(en)", "Users" => "Gebruikers", "select users" => "kies gebruikers", "Editable" => "Te wijzigen", diff --git a/apps/calendar/l10n/pl.php b/apps/calendar/l10n/pl.php index 8fd1c3c2b4..0174bef6fc 100644 --- a/apps/calendar/l10n/pl.php +++ b/apps/calendar/l10n/pl.php @@ -161,6 +161,8 @@ "Please choose a calendar" => "Proszę wybierz kalendarz", "Name of new calendar" => "Nazwa kalendarza", "Import" => "Import", +"Importing calendar" => "Importuje kalendarz", +"Calendar imported successfully" => "Zaimportowano kalendarz", "Close Dialog" => "Zamknij okno", "Create a new event" => "Tworzenie nowego wydarzenia", "View an event" => "Zobacz wydarzenie", @@ -168,6 +170,8 @@ "of" => "z", "at" => "w", "Timezone" => "Strefa czasowa", +"Check always for changes of the timezone" => "Zawsze sprawdzaj zmiany strefy czasowej", +"Timeformat" => "Format czasu", "24h" => "24h", "12h" => "12h", "more info" => "więcej informacji", diff --git a/apps/calendar/l10n/pt_PT.php b/apps/calendar/l10n/pt_PT.php index cf816d8b34..81bab52e59 100644 --- a/apps/calendar/l10n/pt_PT.php +++ b/apps/calendar/l10n/pt_PT.php @@ -1,7 +1,13 @@ "Nem todos os calendários estão completamente pré-carregados", +"Everything seems to be completely cached" => "Parece que tudo está completamente pré-carregado", "No calendars found." => "Nenhum calendário encontrado.", "No events found." => "Nenhum evento encontrado.", "Wrong calendar" => "Calendário errado", +"The file contained either no events or all events are already saved in your calendar." => "O ficheiro não continha nenhuns eventos ou então todos os eventos já estavam carregados no seu calendário", +"events has been saved in the new calendar" => "Os eventos foram guardados no novo calendário", +"Import failed" => "Falha na importação", +"events has been saved in your calendar" => "Os eventos foram guardados no seu calendário", "New Timezone:" => "Nova zona horária", "Timezone changed" => "Zona horária alterada", "Invalid request" => "Pedido inválido", @@ -27,6 +33,7 @@ "Projects" => "Projetos", "Questions" => "Perguntas", "Work" => "Trabalho", +"by" => "por", "unnamed" => "não definido", "New Calendar" => "Novo calendário", "Does not repeat" => "Não repete", @@ -73,6 +80,25 @@ "by day and month" => "por dia e mês", "Date" => "Data", "Cal." => "Cal.", +"Sun." => "Dom.", +"Mon." => "Seg.", +"Tue." => "ter.", +"Wed." => "Qua.", +"Thu." => "Qui.", +"Fri." => "Sex.", +"Sat." => "Sáb.", +"Jan." => "Jan.", +"Feb." => "Fev,", +"Mar." => "Mar.", +"Apr." => "Abr.", +"May." => "Mai.", +"Jun." => "Jun.", +"Jul." => "Jul.", +"Aug." => "Ago.", +"Sep." => "Set.", +"Oct." => "Out.", +"Nov." => "Nov.", +"Dec." => "Dez.", "All day" => "Todo o dia", "Missing fields" => "Falta campos", "Title" => "Título", @@ -86,6 +112,7 @@ "Month" => "Mês", "List" => "Lista", "Today" => "Hoje", +"Settings" => "Configurações", "Your calendars" => "Os seus calendários", "CalDav Link" => "Endereço CalDav", "Shared calendars" => "Calendários partilhados", @@ -136,17 +163,34 @@ "occurrences" => "ocorrências", "create a new calendar" => "criar novo calendário", "Import a calendar file" => "Importar um ficheiro de calendário", +"Please choose a calendar" => "Escolha um calendário por favor", "Name of new calendar" => "Nome do novo calendário", +"Take an available name!" => "Escolha um nome disponível!", +"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Já existe um Calendário com esse nome. Se mesmo assim continuar, esses calendários serão fundidos.", "Import" => "Importar", +"Importing calendar" => "A importar calendário", +"Calendar imported successfully" => "Calendário importado com sucesso", "Close Dialog" => "Fechar diálogo", "Create a new event" => "Criar novo evento", "View an event" => "Ver um evento", "No categories selected" => "Nenhuma categoria seleccionada", "of" => "de", "at" => "em", +"General" => "Geral", "Timezone" => "Zona horária", +"Update timezone automatically" => "Actualizar automaticamente o fuso horário", +"Time format" => "Formato da hora", "24h" => "24h", "12h" => "12h", +"Start week on" => "Começar semana em", +"Cache" => "Memória de pré-carregamento", +"Clear cache for repeating events" => "Limpar a memória de pré carregamento para eventos recorrentes", +"URLs" => "Endereço(s) web", +"Calendar CalDAV syncing addresses" => "Endereços de sincronização de calendários CalDAV", +"more info" => "mais informação", +"Primary address (Kontact et al)" => "Endereço principal (contactos et al.)", +"iOS/OS X" => "iOS/OS X", +"Read only iCalendar link(s)" => "Ligaç(ão/ões) só de leitura do iCalendar", "Users" => "Utilizadores", "select users" => "Selecione utilizadores", "Editable" => "Editavel", diff --git a/apps/calendar/l10n/ro.php b/apps/calendar/l10n/ro.php index 528d9ae108..696322dd73 100644 --- a/apps/calendar/l10n/ro.php +++ b/apps/calendar/l10n/ro.php @@ -131,8 +131,12 @@ "occurrences" => "repetiții", "create a new calendar" => "crează un calendar nou", "Import a calendar file" => "Importă un calendar", +"Please choose the calendar" => "Alegeți calendarul", +"create a new calendar" => "crează un calendar nou", "Name of new calendar" => "Numele noului calendar", "Import" => "Importă", +"Importing calendar" => "Importă calendar", +"Calendar imported successfully" => "Calendarul a fost importat cu succes", "Close Dialog" => "Închide", "Create a new event" => "Crează un eveniment nou", "View an event" => "Vizualizează un eveniment", @@ -140,6 +144,8 @@ "of" => "din", "at" => "la", "Timezone" => "Fus orar", +"Check always for changes of the timezone" => "Verifică mereu pentru schimbări ale fusului orar", +"Timeformat" => "Forma de afișare a orei", "24h" => "24h", "12h" => "12h", "Users" => "Utilizatori", diff --git a/apps/calendar/l10n/ru.php b/apps/calendar/l10n/ru.php index 9c27d367da..ba0be30df1 100644 --- a/apps/calendar/l10n/ru.php +++ b/apps/calendar/l10n/ru.php @@ -22,7 +22,7 @@ "Business" => "Бизнес", "Call" => "Звонить", "Clients" => "Клиенты", -"Deliverer" => "Доставщик", +"Deliverer" => "Посыльный", "Holidays" => "Праздники", "Ideas" => "Идеи", "Journey" => "Поездка", @@ -33,6 +33,7 @@ "Projects" => "Проекты", "Questions" => "Вопросы", "Work" => "Работа", +"by" => "до свидания", "unnamed" => "без имени", "New Calendar" => "Новый Календарь", "Does not repeat" => "Не повторяется", @@ -111,15 +112,16 @@ "Month" => "Месяц", "List" => "Список", "Today" => "Сегодня", +"Settings" => "Параметры", "Your calendars" => "Ваши календари", "CalDav Link" => "Ссылка для CalDav", -"Shared calendars" => "Общие календари", -"No shared calendars" => "Нет общих календарей", -"Share Calendar" => "Сделать календарь общим", +"Shared calendars" => "Опубликованные", +"No shared calendars" => "Нет опубликованных календарей", +"Share Calendar" => "Опубликовать", "Download" => "Скачать", "Edit" => "Редактировать", "Delete" => "Удалить", -"shared with you by" => "с вами поделился", +"shared with you by" => "опубликовал для вас", "New calendar" => "Новый календарь", "Edit calendar" => "Редактировать календарь", "Displayname" => "Отображаемое имя", @@ -134,7 +136,7 @@ "Repeating" => "Повторение", "Alarm" => "Сигнал", "Attendees" => "Участники", -"Share" => "Поделиться", +"Share" => "Опубликовать", "Title of the Event" => "Название событие", "Category" => "Категория", "Separate categories with commas" => "Разделяйте категории запятыми", @@ -163,17 +165,32 @@ "Import a calendar file" => "Импортировать календарь из файла", "Please choose a calendar" => "Пожалуйста, выберите календарь", "Name of new calendar" => "Название нового календаря", +"Take an available name!" => "Возьмите разрешенное имя!", +"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Календарь с таким именем уже существует. Если вы продолжите, одноименный календарь будет удален.", "Import" => "Импортировать", +"Importing calendar" => "Импортируется календарь", +"Calendar imported successfully" => "Календарь успешно импортирован", "Close Dialog" => "Закрыть Сообщение", "Create a new event" => "Создать новое событие", "View an event" => "Показать событие", "No categories selected" => "Категории не выбраны", "of" => "из", "at" => "на", +"General" => "Основные", "Timezone" => "Часовой пояс", +"Update timezone automatically" => "Автоматическое обновление временной зоны", +"Time format" => "Формат времени", "24h" => "24ч", "12h" => "12ч", +"Start week on" => "Начало недели", +"Cache" => "Кэш", +"Clear cache for repeating events" => "Очистить кэш повторяющихся событий", +"URLs" => "URLs", +"Calendar CalDAV syncing addresses" => "Адрес синхронизации CalDAV", "more info" => "подробнее", +"Primary address (Kontact et al)" => "Основной адрес (Контакта)", +"iOS/OS X" => "iOS/OS X", +"Read only iCalendar link(s)" => "Читать только ссылки iCalendar", "Users" => "Пользователи", "select users" => "выбрать пользователей", "Editable" => "Редактируемо", diff --git a/apps/calendar/l10n/sl.php b/apps/calendar/l10n/sl.php index 7a488751c4..585132314b 100644 --- a/apps/calendar/l10n/sl.php +++ b/apps/calendar/l10n/sl.php @@ -1,7 +1,13 @@ "Vsi koledarji niso povsem predpomnjeni", +"Everything seems to be completely cached" => "Izgleda, da je vse v predpomnilniku", "No calendars found." => "Ni bilo najdenih koledarjev.", "No events found." => "Ni bilo najdenih dogodkov.", "Wrong calendar" => "Napačen koledar", +"The file contained either no events or all events are already saved in your calendar." => "Datoteka ni vsebovala dogodkov ali pa so vsi dogodki že shranjeni v koledarju.", +"events has been saved in the new calendar" => "dogodki so bili shranjeni v nov koledar", +"Import failed" => "Uvoz je spodletel", +"events has been saved in your calendar" => "dogodki so bili shranjeni v vaš koledar", "New Timezone:" => "Nov časovni pas:", "Timezone changed" => "Časovni pas je bil spremenjen", "Invalid request" => "Neveljaven zahtevek", @@ -27,6 +33,7 @@ "Projects" => "Projekt", "Questions" => "Vprašanja", "Work" => "Delo", +"by" => "od", "unnamed" => "neimenovan", "New Calendar" => "Nov koledar", "Does not repeat" => "Se ne ponavlja", @@ -73,6 +80,25 @@ "by day and month" => "po dnevu in mesecu", "Date" => "Datum", "Cal." => "Kol.", +"Sun." => "ned.", +"Mon." => "pon.", +"Tue." => "tor.", +"Wed." => "sre.", +"Thu." => "čet.", +"Fri." => "pet.", +"Sat." => "sob.", +"Jan." => "jan.", +"Feb." => "feb.", +"Mar." => "mar.", +"Apr." => "apr.", +"May." => "maj", +"Jun." => "jun.", +"Jul." => "jul.", +"Aug." => "avg.", +"Sep." => "sep.", +"Oct." => "okt.", +"Nov." => "nov.", +"Dec." => "dec.", "All day" => "Cel dan", "Missing fields" => "Mankajoča polja", "Title" => "Naslov", @@ -86,6 +112,7 @@ "Month" => "Mesec", "List" => "Seznam", "Today" => "Danes", +"Settings" => "Nastavitve", "Your calendars" => "Vaši koledarji", "CalDav Link" => "CalDav povezava", "Shared calendars" => "Koledarji v souporabi", @@ -136,7 +163,10 @@ "occurrences" => "ponovitev", "create a new calendar" => "Ustvari nov koledar", "Import a calendar file" => "Uvozi datoteko koledarja", +"Please choose a calendar" => "Prosimo, če izberete koledar", "Name of new calendar" => "Ime novega koledarja", +"Take an available name!" => "Izberite prosto ime!", +"A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "Koledar s tem imenom že obstaja. Če nadaljujete, bosta koledarja združena.", "Import" => "Uvozi", "Close Dialog" => "Zapri dialog", "Create a new event" => "Ustvari nov dogodek", @@ -144,9 +174,21 @@ "No categories selected" => "Nobena kategorija ni izbrana", "of" => "od", "at" => "pri", +"General" => "Splošno", "Timezone" => "Časovni pas", +"Update timezone automatically" => "Samodejno posodobi časovni pas", +"Time format" => "Oblika zapisa časa", "24h" => "24ur", "12h" => "12ur", +"Start week on" => "Začni teden z", +"Cache" => "Predpomnilnik", +"Clear cache for repeating events" => "Počisti predpomnilnik za ponavljajoče dogodke", +"URLs" => "URLji", +"Calendar CalDAV syncing addresses" => "CalDAV naslov za usklajevanje koledarjev", +"more info" => "dodatne informacije", +"Primary address (Kontact et al)" => "Glavni naslov (Kontakt et al)", +"iOS/OS X" => "iOS/OS X", +"Read only iCalendar link(s)" => "iCalendar povezava/e samo za branje", "Users" => "Uporabniki", "select users" => "izberite uporabnike", "Editable" => "Možno urejanje", diff --git a/apps/calendar/l10n/sv.php b/apps/calendar/l10n/sv.php index 7baa0309a6..4cea9073a2 100644 --- a/apps/calendar/l10n/sv.php +++ b/apps/calendar/l10n/sv.php @@ -167,6 +167,8 @@ "Take an available name!" => "Ta ett ledigt namn!", "A Calendar with this name already exists. If you continue anyhow, these calendars will be merged." => "En kalender med detta namn finns redan. Om du fortsätter ändå så kommer dessa kalendrar att slås samman.", "Import" => "Importera", +"Importing calendar" => "Importerar kalender", +"Calendar imported successfully" => "Kalender importerades utan problem", "Close Dialog" => "Stäng ", "Create a new event" => "Skapa en ny händelse", "View an event" => "Visa en händelse", @@ -174,6 +176,8 @@ "of" => "av", "at" => "på", "Timezone" => "Tidszon", +"Check always for changes of the timezone" => "Kontrollera alltid ändringar i tidszon.", +"Timeformat" => "Tidsformat", "24h" => "24h", "12h" => "12h", "Cache" => "Cache", diff --git a/apps/calendar/l10n/zh_CN.php b/apps/calendar/l10n/zh_CN.php index 48d00d02d5..add84588d3 100644 --- a/apps/calendar/l10n/zh_CN.php +++ b/apps/calendar/l10n/zh_CN.php @@ -82,6 +82,9 @@ "Month" => "月", "List" => "列表", "Today" => "今天", +"Calendars" => "日历", +"There was a fail, while parsing the file." => "解析文件失败", +"Choose active calendars" => "选择活动日历", "Your calendars" => "您的日历", "CalDav Link" => "CalDav 链接", "Shared calendars" => "共享的日历", @@ -132,8 +135,12 @@ "occurrences" => "次", "create a new calendar" => "创建新日历", "Import a calendar file" => "导入日历文件", +"Please choose the calendar" => "请选择日历", +"create a new calendar" => "创建新日历", "Name of new calendar" => "新日历名称", "Import" => "导入", +"Importing calendar" => "导入日历", +"Calendar imported successfully" => "导入日历成功", "Close Dialog" => "关闭对话框", "Create a new event" => "创建新事件", "View an event" => "查看事件", @@ -141,8 +148,12 @@ "of" => "在", "at" => "在", "Timezone" => "时区", +"Check always for changes of the timezone" => "选中则总是按照时区变化", +"Timeformat" => "时间格式", "24h" => "24小时", "12h" => "12小时", +"First day of the week" => "每周的第一天", +"Calendar CalDAV syncing address:" => "日历CalDAV 同步地址:", "Users" => "用户", "select users" => "选中用户", "Editable" => "可编辑", diff --git a/apps/calendar/l10n/zh_TW.php b/apps/calendar/l10n/zh_TW.php index c2c03a4d44..48897b8ca0 100644 --- a/apps/calendar/l10n/zh_TW.php +++ b/apps/calendar/l10n/zh_TW.php @@ -131,8 +131,12 @@ "occurrences" => "事件", "create a new calendar" => "建立新日曆", "Import a calendar file" => "匯入日曆檔案", +"Please choose the calendar" => "請選擇日曆", +"create a new calendar" => "建立新日曆", "Name of new calendar" => "新日曆名稱", "Import" => "匯入", +"Importing calendar" => "匯入日曆", +"Calendar imported successfully" => "已成功匯入日曆", "Close Dialog" => "關閉對話", "Create a new event" => "建立一個新事件", "View an event" => "觀看一個活動", @@ -140,8 +144,11 @@ "of" => "於", "at" => "於", "Timezone" => "時區", +"Check always for changes of the timezone" => "總是檢查是否變更了時區", +"Timeformat" => "日期格式", "24h" => "24小時制", "12h" => "12小時制", +"Calendar CalDAV syncing address:" => "CalDAV 的日曆同步地址:", "Users" => "使用者", "select users" => "選擇使用者", "Editable" => "可編輯", diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php index 7778242464..f8f5aab363 100644 --- a/apps/calendar/lib/calendar.php +++ b/apps/calendar/lib/calendar.php @@ -38,11 +38,11 @@ class OC_Calendar_Calendar{ public static function allCalendars($uid, $active=false){ $values = array($uid); $active_where = ''; - if ($active){ - $active_where = ' AND active = ?'; + if (!is_null($active) && $active){ + $active_where = ' AND `active` = ?'; $values[] = $active; } - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE userid = ?' . $active_where ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_calendars` WHERE `userid` = ?' . $active_where ); $result = $stmt->execute($values); $calendars = array(); @@ -69,7 +69,7 @@ class OC_Calendar_Calendar{ * @return associative array */ public static function find($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_calendars WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_calendars` WHERE `id` = ?' ); $result = $stmt->execute(array($id)); return $result->fetchRow(); @@ -94,7 +94,7 @@ class OC_Calendar_Calendar{ $uri = self::createURI($name, $uris ); - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?)' ); + $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_calendars` (`userid`,`displayname`,`uri`,`ctag`,`calendarorder`,`calendarcolor`,`timezone`,`components`) VALUES(?,?,?,?,?,?,?,?)' ); $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components)); $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars'); @@ -117,7 +117,7 @@ class OC_Calendar_Calendar{ public static function addCalendarFromDAVData($principaluri,$uri,$name,$components,$timezone,$order,$color){ $userid = self::extractUserID($principaluri); - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_calendars (userid,displayname,uri,ctag,calendarorder,calendarcolor,timezone,components) VALUES(?,?,?,?,?,?,?,?)' ); + $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_calendars` (`userid`,`displayname`,`uri`,`ctag`,`calendarorder`,`calendarcolor`,`timezone`,`components`) VALUES(?,?,?,?,?,?,?,?)' ); $result = $stmt->execute(array($userid,$name,$uri,1,$order,$color,$timezone,$components)); $insertid = OCP\DB::insertid('*PREFIX*calendar_calendars'); @@ -149,7 +149,7 @@ class OC_Calendar_Calendar{ if(is_null($order)) $order = $calendar['calendarorder']; if(is_null($color)) $color = $calendar['calendarcolor']; - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET displayname=?,calendarorder=?,calendarcolor=?,timezone=?,components=?,ctag=ctag+1 WHERE id=?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `displayname`=?,`calendarorder`=?,`calendarcolor`=?,`timezone`=?,`components`=?,`ctag`=`ctag`+1 WHERE `id`=?' ); $result = $stmt->execute(array($name,$order,$color,$timezone,$components,$id)); OCP\Util::emitHook('OC_Calendar', 'editCalendar', $id); @@ -163,7 +163,7 @@ class OC_Calendar_Calendar{ * @return boolean */ public static function setCalendarActive($id,$active){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET active = ? WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `active` = ? WHERE `id` = ?' ); $stmt->execute(array($active, $id)); return true; @@ -175,7 +175,7 @@ class OC_Calendar_Calendar{ * @return boolean */ public static function touchCalendar($id){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_calendars SET ctag = ctag + 1 WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_calendars` SET `ctag` = `ctag` + 1 WHERE `id` = ?' ); $stmt->execute(array($id)); return true; @@ -187,10 +187,10 @@ class OC_Calendar_Calendar{ * @return boolean */ public static function deleteCalendar($id){ - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_calendars WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_calendars` WHERE `id` = ?' ); $stmt->execute(array($id)); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ?' ); + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?' ); $stmt->execute(array($id)); OCP\Util::emitHook('OC_Calendar', 'deleteCalendar', $id); @@ -208,7 +208,7 @@ class OC_Calendar_Calendar{ * @return boolean */ public static function mergeCalendar($id1, $id2){ - $stmt = OCP\DB::prepare('UPDATE *PREFIX*calendar_objects SET calendarid = ? WHERE calendarid = ?'); + $stmt = OCP\DB::prepare('UPDATE `*PREFIX*calendar_objects` SET `calendarid` = ? WHERE `calendarid` = ?'); $stmt->execute(array($id1, $id2)); self::touchCalendar($id1); self::deleteCalendar($id2); diff --git a/apps/calendar/lib/import.php b/apps/calendar/lib/import.php index d36891cb2b..2e3a729e0c 100644 --- a/apps/calendar/lib/import.php +++ b/apps/calendar/lib/import.php @@ -273,8 +273,10 @@ class OC_Calendar_Import{ */ private function isDuplicate($insertid){ $newobject = OC_Calendar_Object::find($insertid); - $stmt = OCP\DB::prepare('SELECT COUNT(*) as count FROM *PREFIX*calendar_objects WHERE objecttype=? AND startdate=? AND enddate=? AND repeating=? AND summary=? AND calendardata=?'); - $result = $stmt->execute(array($newobject['objecttype'],$newobject['startdate'],$newobject['enddate'],$newobject['repeating'],$newobject['summary'],$newobject['calendardata'])); + $stmt = OCP\DB::prepare('SELECT COUNT(*) AS `count` FROM `*PREFIX*calendar_objects` + INNER JOIN `*PREFIX*calendar_calendars` ON `calendarid`=`*PREFIX*calendar_calendars`.`id` + WHERE `objecttype`=? AND `startdate`=? AND `enddate`=? AND `repeating`=? AND `summary`=? AND `calendardata`=? AND `userid` = ?'); + $result = $stmt->execute(array($newobject['objecttype'],$newobject['startdate'],$newobject['enddate'],$newobject['repeating'],$newobject['summary'],$newobject['calendardata'], $this->userid)); $result = $result->fetchRow(); if($result['count'] >= 2){ return true; diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php index 3467683020..8020d7c2e5 100644 --- a/apps/calendar/lib/object.php +++ b/apps/calendar/lib/object.php @@ -40,7 +40,7 @@ class OC_Calendar_Object{ * ['calendardata'] */ public static function all($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?' ); $result = $stmt->execute(array($id)); $calendarobjects = array(); @@ -62,10 +62,10 @@ class OC_Calendar_Object{ * in ['calendardata'] */ public static function allInPeriod($id, $start, $end){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' - .' AND ((startdate >= ? AND startdate <= ? AND repeating = 0)' - .' OR (enddate >= ? AND enddate <= ? AND repeating = 0)' - .' OR (startdate <= ? AND repeating = 1))' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?' + .' AND ((`startdate` >= ? AND `startdate` <= ? AND `repeating` = 0)' + .' OR (`enddate` >= ? AND `enddate` <= ? AND `repeating` = 0)' + .' OR (`startdate` <= ? AND `repeating` = 1))' ); $start = self::getUTCforMDB($start); $end = self::getUTCforMDB($end); $result = $stmt->execute(array($id, @@ -87,7 +87,7 @@ class OC_Calendar_Object{ * @return associative array */ public static function find($id){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `id` = ?' ); $result = $stmt->execute(array($id)); return $result->fetchRow(); @@ -100,7 +100,7 @@ class OC_Calendar_Object{ * @return associative array */ public static function findWhereDAVDataIs($cid,$uri){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ? AND `uri` = ?' ); $result = $stmt->execute(array($cid,$uri)); return $result->fetchRow(); @@ -124,7 +124,7 @@ class OC_Calendar_Object{ $uri = 'owncloud-'.md5($data.rand().time()).'.ics'; - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); + $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_objects` (`calendarid`,`objecttype`,`startdate`,`enddate`,`repeating`,`summary`,`calendardata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?,?,?,?,?)' ); $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); $object_id = OCP\DB::insertid('*PREFIX*calendar_objects'); @@ -144,7 +144,7 @@ class OC_Calendar_Object{ $object = OC_VObject::parse($data); list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*calendar_objects (calendarid,objecttype,startdate,enddate,repeating,summary,calendardata,uri,lastmodified) VALUES(?,?,?,?,?,?,?,?,?)' ); + $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*calendar_objects` (`calendarid`,`objecttype`,`startdate`,`enddate`,`repeating`,`summary`,`calendardata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?,?,?,?,?)' ); $stmt->execute(array($id,$type,$startdate,$enddate,$repeating,$summary,$data,$uri,time())); $object_id = OCP\DB::insertid('*PREFIX*calendar_objects'); @@ -166,7 +166,7 @@ class OC_Calendar_Object{ OC_Calendar_App::loadCategoriesFromVCalendar($object); list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_objects` SET `objecttype`=?,`startdate`=?,`enddate`=?,`repeating`=?,`summary`=?,`calendardata`=?,`lastmodified`= ? WHERE `id` = ?' ); $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$id)); OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); @@ -188,7 +188,7 @@ class OC_Calendar_Object{ $object = OC_VObject::parse($data); list($type,$startdate,$enddate,$summary,$repeating,$uid) = self::extractData($object); - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_objects SET objecttype=?,startdate=?,enddate=?,repeating=?,summary=?,calendardata=?, lastmodified = ? WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_objects` SET `objecttype`=?,`startdate`=?,`enddate`=?,`repeating`=?,`summary`=?,`calendardata`=?,`lastmodified`= ? WHERE `id` = ?' ); $stmt->execute(array($type,$startdate,$enddate,$repeating,$summary,$data,time(),$oldobject['id'])); OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); @@ -204,7 +204,7 @@ class OC_Calendar_Object{ */ public static function delete($id){ $oldobject = self::find($id); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `id` = ?' ); $stmt->execute(array($id)); OC_Calendar_Calendar::touchCalendar($oldobject['calendarid']); OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $id); @@ -220,7 +220,7 @@ class OC_Calendar_Object{ */ public static function deleteFromDAVData($cid,$uri){ $oldobject = self::findWhereDAVDataIs($cid, $uri); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*calendar_objects WHERE calendarid = ? AND uri=?' ); + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*calendar_objects` WHERE `calendarid`= ? AND `uri`=?' ); $stmt->execute(array($cid,$uri)); OC_Calendar_Calendar::touchCalendar($cid); OCP\Util::emitHook('OC_Calendar', 'deleteEvent', $oldobject['id']); @@ -229,7 +229,7 @@ class OC_Calendar_Object{ } public static function moveToCalendar($id, $calendarid){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*calendar_objects SET calendarid=? WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*calendar_objects` SET `calendarid`=? WHERE `id`=?' ); $stmt->execute(array($calendarid,$id)); OC_Calendar_Calendar::touchCalendar($id); @@ -869,7 +869,7 @@ class OC_Calendar_Object{ $vevent->setString('DESCRIPTION', $description); $vevent->setString('CATEGORIES', $categories); - /**if($repeat == "true"){ + /*if($repeat == "true"){ $vevent->RRULE = $repeat; }*/ diff --git a/apps/calendar/lib/repeat.php b/apps/calendar/lib/repeat.php index b9fbee8fe0..27f1e0481a 100644 --- a/apps/calendar/lib/repeat.php +++ b/apps/calendar/lib/repeat.php @@ -16,7 +16,7 @@ class OC_Calendar_Repeat{ * @return (array) */ public static function get($id){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_repeat WHERE eventid = ?'); + $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_repeat` WHERE `eventid` = ?'); $result = $stmt->execute(array($id)); $return = array(); while($row = $result->fetchRow()){ @@ -32,9 +32,9 @@ class OC_Calendar_Repeat{ * @return (array) */ public static function get_inperiod($id, $from, $until){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_repeat WHERE eventid = ?' - .' AND ((startdate >= ? AND startdate <= ?)' - .' OR (enddate >= ? AND enddate <= ?))'); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_repeat` WHERE `eventid` = ?' + .' AND ((`startdate` >= ? AND `startdate` <= ?)' + .' OR (`enddate` >= ? AND `enddate` <= ?))'); $result = $stmt->execute(array($id, OC_Calendar_Object::getUTCforMDB($from), OC_Calendar_Object::getUTCforMDB($until), OC_Calendar_Object::getUTCforMDB($from), OC_Calendar_Object::getUTCforMDB($until))); @@ -50,7 +50,7 @@ class OC_Calendar_Repeat{ * @return (array) */ public static function getCalendar($id){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_repeat WHERE calid = ?'); + $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_repeat` WHERE `calid` = ?'); $result = $stmt->execute(array($id)); $return = array(); while($row = $result->fetchRow()){ @@ -66,9 +66,9 @@ class OC_Calendar_Repeat{ * @return (array) */ public static function getCalendar_inperiod($id, $from, $until){ - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*calendar_repeat WHERE calid = ?' - .' AND ((startdate >= ? AND startdate <= ?)' - .' OR (enddate >= ? AND enddate <= ?))'); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*calendar_repeat` WHERE `calid` = ?' + .' AND ((`startdate` >= ? AND `startdate` <= ?)' + .' OR (`enddate` >= ? AND `enddate` <= ?))'); $result = $stmt->execute(array($id, $from, $until, $from, $until)); @@ -99,7 +99,7 @@ class OC_Calendar_Repeat{ continue; } $startenddate = OC_Calendar_Object::generateStartEndDate($vevent->DTSTART, OC_Calendar_Object::getDTEndFromVEvent($vevent), ($vevent->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE)?true:false, 'UTC'); - $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*calendar_repeat (eventid,calid,startdate,enddate) VALUES(?,?,?,?)'); + $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*calendar_repeat` (`eventid`,`calid`,`startdate`,`enddate`) VALUES(?,?,?,?)'); $stmt->execute(array($id,OC_Calendar_Object::getCalendarid($id),$startenddate['start'],$startenddate['end'])); } return true; @@ -189,7 +189,7 @@ class OC_Calendar_Repeat{ * @return (bool) */ public static function clean($id){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_repeat WHERE eventid = ?'); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_repeat` WHERE `eventid` = ?'); $stmt->execute(array($id)); } /** @@ -198,7 +198,7 @@ class OC_Calendar_Repeat{ * @return (bool) */ public static function cleanCalendar($id){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_repeat WHERE calid = ?'); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_repeat` WHERE `calid` = ?'); $stmt->execute(array($id)); } } \ No newline at end of file diff --git a/apps/calendar/lib/connector_sabre.php b/apps/calendar/lib/sabre/backend.php similarity index 100% rename from apps/calendar/lib/connector_sabre.php rename to apps/calendar/lib/sabre/backend.php diff --git a/apps/calendar/lib/sabre/calendar.php b/apps/calendar/lib/sabre/calendar.php new file mode 100644 index 0000000000..179be1b281 --- /dev/null +++ b/apps/calendar/lib/sabre/calendar.php @@ -0,0 +1,127 @@ +. + * + */ + +/** + * This class overrides Sabre_CalDAV_Calendar::getACL() to return read/write + * permissions based on user and shared state and it overrides + * Sabre_CalDAV_Calendar::getChild() and Sabre_CalDAV_Calendar::getChildren() + * to instantiate OC_Connector_Sabre_CalDAV_CalendarObjects. +*/ +class OC_Connector_Sabre_CalDAV_Calendar extends Sabre_CalDAV_Calendar { + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Calendar_Calendar::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedCalendar = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-read', + 'protected' => true, + ), + array( + 'privilege' => '{' . Sabre_CalDAV_Plugin::NS_CALDAV . '}read-free-busy', + 'principal' => '{DAV:}authenticated', + 'protected' => true, + ), + + ); + + } + + /** + * Returns a calendar object + * + * The contained calendar objects are for example Events or Todo's. + * + * @param string $name + * @return Sabre_DAV_ICalendarObject + */ + public function getChild($name) { + + $obj = $this->caldavBackend->getCalendarObject($this->calendarInfo['id'],$name); + if (!$obj) throw new Sabre_DAV_Exception_NotFound('Calendar object not found'); + return new OC_Connector_Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); + + } + + /** + * Returns the full list of calendar objects + * + * @return array + */ + public function getChildren() { + + $objs = $this->caldavBackend->getCalendarObjects($this->calendarInfo['id']); + $children = array(); + foreach($objs as $obj) { + $children[] = new OC_Connector_Sabre_CalDAV_CalendarObject($this->caldavBackend,$this->calendarInfo,$obj); + } + return $children; + + } + +} \ No newline at end of file diff --git a/apps/calendar/lib/sabre/calendarroot.php b/apps/calendar/lib/sabre/calendarroot.php new file mode 100644 index 0000000000..e09731c95b --- /dev/null +++ b/apps/calendar/lib/sabre/calendarroot.php @@ -0,0 +1,45 @@ +. + * + */ + +/** + * This class overrides Sabre_CalDAV_CalendarRootNode::getChildForPrincipal() + * to instantiate OC_Connector_Sabre_CalDAV_UserCalendars. +*/ +class OC_Connector_Sabre_CalDAV_CalendarRoot extends Sabre_CalDAV_CalendarRootNode { + + /** + * This method returns a node for a principal. + * + * The passed array contains principal information, and is guaranteed to + * at least contain a uri item. Other properties may or may not be + * supplied by the authentication backend. + * + * @param array $principal + * @return Sabre_DAV_INode + */ + public function getChildForPrincipal(array $principal) { + + return new OC_Connector_Sabre_CalDAV_UserCalendars($this->principalBackend, $this->caldavBackend, $principal['uri']); + + } + +} \ No newline at end of file diff --git a/apps/calendar/lib/sabre/object.php b/apps/calendar/lib/sabre/object.php new file mode 100644 index 0000000000..0d1bfa397c --- /dev/null +++ b/apps/calendar/lib/sabre/object.php @@ -0,0 +1,87 @@ +. + * + */ + +/** + * This class overrides Sabre_CalDAV_CalendarObject::getACL() + * to return read/write permissions based on user and shared state. +*/ +class OC_Connector_Sabre_CalDAV_CalendarObject extends Sabre_CalDAV_CalendarObject { + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Calendar_Calendar::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedCalendar = OCP\Share::getItemSharedWithBySource('calendar', $this->$calendarInfo['id']); + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedCalendar && ($sharedCalendar['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal . '/calendar-proxy-write', + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal . '/calendar-proxy-read', + 'protected' => true, + ), + ); + + } + +} \ No newline at end of file diff --git a/apps/calendar/lib/sabre/usercalendars.php b/apps/calendar/lib/sabre/usercalendars.php new file mode 100644 index 0000000000..919f6b27e1 --- /dev/null +++ b/apps/calendar/lib/sabre/usercalendars.php @@ -0,0 +1,46 @@ +. + * + */ + +/** + * This class overrides Sabre_CalDAV_UserCalendars::getChildren() + * to instantiate OC_Connector_Sabre_CalDAV_Calendars. +*/ +class OC_Connector_Sabre_CalDAV_UserCalendars extends Sabre_CalDAV_UserCalendars { + + /** + * Returns a list of calendars + * + * @return array + */ + public function getChildren() { + + $calendars = $this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']); + $objs = array(); + foreach($calendars as $calendar) { + $objs[] = new OC_Connector_Sabre_CalDAV_Calendar($this->principalBackend, $this->caldavBackend, $calendar); + } + $objs[] = new Sabre_CalDAV_Schedule_Outbox($this->principalInfo['uri']); + return $objs; + + } + +} \ No newline at end of file diff --git a/apps/calendar/lib/share.php b/apps/calendar/lib/share.php index 4fe8817140..bad1082c33 100644 --- a/apps/calendar/lib/share.php +++ b/apps/calendar/lib/share.php @@ -18,19 +18,16 @@ class OC_Calendar_Share{ * @return: array $return - information about calendars */ public static function allSharedwithuser($userid, $type, $active=null, $permission=null){ - $group_where = self::group_sql(OC_Group::getUserGroups($userid)); - $permission_where = self::permission_sql($permission); - if($type == self::CALENDAR){ - $active_where = self::active_sql($active); - }else{ - $active_where = ''; - } - $stmt = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . $type . " WHERE ((share = ? AND sharetype = 'user') " . $group_where . ") AND owner <> ? " . $permission_where . " " . $active_where); - $result = $stmt->execute(array($userid, $userid)); - $return = array(); - while( $row = $result->fetchRow()){ - $return[] = $row; + $format = OC_Share_Backend_Calendar::FORMAT_CALENDAR; + if ($type == self::EVENT) { + $format = OC_Share_Backend_Event::FORMAT_EVENT; } + $return = OCP\Share::getItemsSharedWith($type, + $format, + array( + 'active' => $active, + 'permissions' => $permission, + )); return $return; } /** @@ -40,7 +37,7 @@ class OC_Calendar_Share{ * @return: array $users - information about users a calendar / event is shared with */ public static function allUsersSharedwith($id, $type){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_share_' . $type . ' WHERE ' . $type . 'id = ? ORDER BY share'); + $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE `' . $type . 'id` = ? ORDER BY `share`'); $result = $stmt->execute(array($id)); $users = array(); while( $row = $result->fetchRow()){ @@ -72,7 +69,7 @@ class OC_Calendar_Share{ if($sharetype == 'public'){ $share = self::generate_token($id, $type); } - $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*calendar_share_' . $type . ' (owner,share,sharetype,' . $type . 'id,permissions' . (($type == self::CALENDAR)?', active':'') . ') VALUES(?,?,?,?,0' . (($type == self::CALENDAR)?', 1':'') . ')' ); + $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*calendar_share_' . $type . '` (`owner`,`share`,`sharetype`,`' . $type . 'id`,`permissions`' . (($type == self::CALENDAR)?',`active`':'') . ') VALUES(?,?,?,?,0' . (($type == self::CALENDAR)?', 1':'') . ')' ); $result = $stmt->execute(array($owner,$share,$sharetype,$id)); if($sharetype == 'public'){ return $share; @@ -90,7 +87,7 @@ class OC_Calendar_Share{ * @return boolean */ public static function unshare($owner, $share, $sharetype, $id, $type){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_' . $type . ' WHERE owner = ? ' . (($sharetype != 'public')?'AND share = ?':'') . ' AND sharetype = ? AND ' . $type . 'id = ?'); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_' . $type . '` WHERE `owner` = ? ' . (($sharetype != 'public')?'AND `share` = ?':'') . ' AND `sharetype` = ? AND `' . $type . 'id` = ?'); if($sharetype != 'public'){ $stmt->execute(array($owner,$share,$sharetype,$id)); }else{ @@ -111,7 +108,7 @@ class OC_Calendar_Share{ if($sharetype == 'public' && $permission == 1){ $permission = 0; } - $stmt = OCP\DB::prepare('UPDATE *PREFIX*calendar_share_' . $type . ' SET permissions = ? WHERE share = ? AND sharetype = ? AND ' . $type . 'id = ?'); + $stmt = OCP\DB::prepare('UPDATE `*PREFIX*calendar_share_' . $type . '` SET `permissions` = ? WHERE `share` = ? AND `sharetype` = ? AND `' . $type . 'id` = ?'); $stmt->execute(array($permission, $share, $sharetype, $id)); return true; } @@ -148,7 +145,7 @@ class OC_Calendar_Share{ * @return boolean */ public static function is_already_shared($owner, $share, $sharetype, $id, $type){ - $stmt = OCP\DB::prepare('SELECT * FROM *PREFIX*calendar_share_' . $type . ' WHERE owner = ? AND share = ? AND sharetype = ? AND ' . $type . 'id = ?'); + $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE `owner` = ? AND `share` = ? AND `sharetype` = ? AND `' . $type . 'id` = ?'); $result = $stmt->execute(array($owner, $share, $sharetype, $id)); if($result->numRows() > 0){ return true; @@ -160,7 +157,7 @@ class OC_Calendar_Share{ $i = 0; foreach($groups as $group){ $group_where .= ' OR '; - $group_where .= " (share = '" . $group . "' AND sharetype = 'group') "; + $group_where .= ' (`share` = \'' . $group . '\' AND `sharetype` = \'group\') '; $i++; } return $group_where; @@ -168,7 +165,7 @@ class OC_Calendar_Share{ private static function permission_sql($permission = null){ $permission_where = ''; if(!is_null($permission)){ - $permission_where = ' AND permissions = '; + $permission_where = ' AND `permissions` = '; $permission_where .= ($permission=='rw')?"'1'":"'0'"; } return $permission_where; @@ -176,7 +173,7 @@ class OC_Calendar_Share{ private static function active_sql($active = null){ $active_where = ''; if(!is_null($active)){ - $active_where = 'AND active = '; + $active_where = 'AND `active` = '; $active_where .= (!is_null($active) && $active)?'1':'0'; } return $active_where; @@ -191,7 +188,7 @@ class OC_Calendar_Share{ public static function is_editing_allowed($share, $id, $type){ $group_where = self::group_sql(OC_Group::getUserGroups($share)); $permission_where = self::permission_sql('rw'); - $stmt = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . $type . " WHERE ((share = ? AND sharetype = 'user') " . $group_where . ") " . $permission_where); + $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE ((`share` = ? AND `sharetype` = \'user\') ' . $group_where . ') ' . $permission_where); $result = $stmt->execute(array($share)); if($result->numRows() == 1){ return true; @@ -211,7 +208,7 @@ class OC_Calendar_Share{ */ public static function check_access($share, $id, $type){ $group_where = self::group_sql(OC_Group::getUserGroups($share)); - $stmt = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . $type . " WHERE (" . $type . "id = ? AND (share = ? AND sharetype = 'user') " . $group_where . ")"); + $stmt = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . $type . '` WHERE (`' . $type . 'id` = ? AND (`share` = ? AND `sharetype` = \'user\') ' . $group_where . ')'); $result = $stmt->execute(array($id,$share)); $rows = $result->numRows(); if($rows > 0){ @@ -229,9 +226,9 @@ class OC_Calendar_Share{ * @return: mixed - bool if false, array with type and id if true */ public static function getElementByToken($token){ - $stmt_calendar = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . OC_Calendar_Share::CALENDAR . " WHERE sharetype = 'public' AND share = ?"); + $stmt_calendar = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . OC_Calendar_Share::CALENDAR . '` WHERE `sharetype` = \'public\' AND `share` = ?'); $result_calendar = $stmt_calendar->execute(array($token)); - $stmt_event = OCP\DB::prepare("SELECT * FROM *PREFIX*calendar_share_" . OC_Calendar_Share::EVENT . " WHERE sharetype = 'public' AND share = ?"); + $stmt_event = OCP\DB::prepare('SELECT * FROM `*PREFIX*calendar_share_' . OC_Calendar_Share::EVENT . '` WHERE `sharetype` = \'public\' AND `share` = ?'); $result_event = $stmt_event->execute(array($token)); $return = array(); if($result_calendar->numRows() == 0 && $result_event->numRows() == 0){ @@ -253,7 +250,7 @@ class OC_Calendar_Share{ * @param string */ public static function set_active($share, $id, $active){ - $stmt = OCP\DB::prepare("UPDATE *PREFIX*calendar_share_calendar SET active = ? WHERE share = ? AND sharetype = 'user' AND calendarid = ?"); + $stmt = OCP\DB::prepare("UPDATE `*PREFIX*calendar_share_calendar` SET `active` = ? WHERE `share` = ? AND `sharetype` = 'user' AND `calendarid` = ?"); $stmt->execute(array($active, $share, $id)); } @@ -263,13 +260,13 @@ class OC_Calendar_Share{ * @return boolean */ public static function post_userdelete($userid){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_calendar WHERE owner = ?'); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `owner` = ?'); $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_event WHERE owner = ?'); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_event` WHERE `owner` = ?'); $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_calendar WHERE share = ? AND sharetype = 'user'"); + $stmt = OCP\DB::prepare("DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `share` = ? AND `sharetype` = 'user'"); $stmt->execute(array($userid)); - $stmt = OCP\DB::prepare("DELETE FROM *PREFIX*calendar_share_event WHERE share = ? AND sharetype = 'user'"); + $stmt = OCP\DB::prepare("DELETE FROM `*PREFIX*calendar_share_event` WHERE `share` = ? AND `sharetype` = 'user'"); $stmt->execute(array($userid)); return true; } @@ -280,7 +277,7 @@ class OC_Calendar_Share{ * @return boolean */ public static function post_caldelete($calid){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_calendar WHERE calendarid = ?'); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_calendar` WHERE `calendarid` = ?'); $stmt->execute(array($calid)); return true; } @@ -291,7 +288,7 @@ class OC_Calendar_Share{ * @return boolean */ public static function post_eventdelete($eventid){ - $stmt = OCP\DB::prepare('DELETE FROM *PREFIX*calendar_share_event WHERE eventid = ?'); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*calendar_share_event` WHERE `eventid` = ?'); $stmt->execute(array($eventid)); return true; } diff --git a/apps/calendar/lib/share/calendar.php b/apps/calendar/lib/share/calendar.php new file mode 100644 index 0000000000..bbc43fcca0 --- /dev/null +++ b/apps/calendar/lib/share/calendar.php @@ -0,0 +1,111 @@ + +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Affero General Public +* License along with this library. If not, see . +*/ + +class OC_Share_Backend_Calendar implements OCP\Share_Backend_Collection { + const FORMAT_CALENDAR = 1; + + /** + * @brief Get the source of the item to be stored in the database + * @param string Item + * @param string Owner of the item + * @return mixed|array|false Source + * + * Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' + * Return false if the item does not exist for the user + * + * The formatItems() function will translate the source returned back into the item + */ + public function isValidSource($itemSource, $uidOwner) { + $calendar = OC_Calendar_App::getCalendar( $itemSource ); + if ($calendar || $calendar['userid'] != $uidOwner) { + return false; + } + return true; + } + + /** + * @brief Get a unique name of the item for the specified user + * @param string Item + * @param string|false User the item is being shared with + * @param array|null List of similar item names already existing as shared items + * @return string Target name + * + * This function needs to verify that the user does not already have an item with this name. + * If it does generate a new name e.g. name_# + */ + public function generateTarget($itemSource, $shareWith, $exclude = null) { + $calendar = OC_Calendar_App::getCalendar( $itemSource ); + $user_calendars = array(); + foreach(OC_Contacts_Addressbook::all($uid) as $user_calendar) { + $user_calendars[] = $user_calendar['displayname']; + } + $name = $calendar['userid']."'s ".$calendar['displayname']; + $suffix = ''; + while (in_array($name.$suffix, $user_calendars)) { + $suffix++; + } + + return $name.$suffix; + } + + /** + * @brief Converts the shared item sources back into the item in the specified format + * @param array Shared items + * @param int Format + * @return ? + * + * The items array is a 3-dimensional array with the item_source as the first key and the share id as the second key to an array with the share info. + * The key/value pairs included in the share info depend on the function originally called: + * If called by getItem(s)Shared: id, item_type, item, item_source, share_type, share_with, permissions, stime, file_source + * If called by getItem(s)SharedWith: id, item_type, item, item_source, item_target, share_type, share_with, permissions, stime, file_source, file_target + * This function allows the backend to control the output of shared items with custom formats. + * It is only called through calls to the public getItem(s)Shared(With) functions. + */ + public function formatItems($items, $format, $parameters = null) { + $calendars = array(); + if ($format == self::FORMAT_CALENDAR) { + foreach ($items as $item) { + $calendar = OC_Calendar_App::getCalendar($item['item_source'], false); + // TODO: really check $parameters['permissions'] == 'rw'/'r' + if ($parameters['permissions'] == 'rw') { + continue; // TODO + } + $calendar['displaynamename'] = $item['item_target']; + $calendar['calendarid'] = $calendar['id']; + $calendar['owner'] = $calendar['userid']; + $calendars[] = $calendar; + } + } + return $calendars; + } + + public function getChildren($itemSource) { + $query = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*calendar_objects` WHERE `calendarid` = ?'); + $result = $query->execute(array($itemSource)); + $sources = array(); + while ($object = $result->fetchRow()) { + $sources[] = $object['id']; + } + return $sources; + } + +} \ No newline at end of file diff --git a/apps/calendar/lib/share/event.php b/apps/calendar/lib/share/event.php new file mode 100644 index 0000000000..5bb72ee6c9 --- /dev/null +++ b/apps/calendar/lib/share/event.php @@ -0,0 +1,40 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class OC_Share_Backend_Event implements OCP\Share_Backend { + + const FORMAT_EVENT = 0; + + private static $event; + + public function isValidSource($itemSource, $uidOwner) { + self::$event = OC_Calendar_Object::find($itemSource); + if (self::$event) { + return true; + } + return false; + } + + public function generateTarget($itemSource, $shareWith, $exclude = null) { + // TODO Get default calendar and check for conflicts + return self::$event['summary']; + } + + public function formatItems($items, $format, $parameters = null) { + $events = array(); + if ($format == self::FORMAT_EVENT) { + foreach ($items as $item) { + $event = OC_Calendar_Object::find($item['item_source']); + $event['summary'] = $item['item_target']; + $events[] = $event; + } + } + return $events; + } + +} diff --git a/apps/calendar/lib/share_backend.php b/apps/calendar/lib/share_backend.php new file mode 100644 index 0000000000..1ea58ac270 --- /dev/null +++ b/apps/calendar/lib/share_backend.php @@ -0,0 +1,44 @@ +. +*/ + +class OC_Share_Backend_Calendar extends OCP\Share_Backend { + + public function getSource($item, $uid) { + $query = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*calendar_calendars` WHERE `userid` = ? AND `displayname` = ?',1); + return $query->execute(array($uid, $item))->fetchAll(); + } + + public function generateTarget($item, $uid) { + + } + + public function getItems($sources) { + + } + +} + +class OC_Share_Backend_Event extends OCP\Share_Backend { + +} + + +?> \ No newline at end of file diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.php b/apps/calendar/templates/part.choosecalendar.rowfields.php index d29113c9a6..64aaa79719 100644 --- a/apps/calendar/templates/part.choosecalendar.rowfields.php +++ b/apps/calendar/templates/part.choosecalendar.rowfields.php @@ -5,7 +5,7 @@ - + diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.shared.php b/apps/calendar/templates/part.choosecalendar.rowfields.shared.php index a23266da0c..6a212858a2 100644 --- a/apps/calendar/templates/part.choosecalendar.rowfields.shared.php +++ b/apps/calendar/templates/part.choosecalendar.rowfields.shared.php @@ -1,4 +1,4 @@ '; -echo ''; +echo ''; echo '' . $l->t('shared with you by') . ' ' . $_['share']['owner'] . ''; \ No newline at end of file diff --git a/apps/contacts/ajax/contact/addproperty.php b/apps/contacts/ajax/contact/addproperty.php index 1412cad1cb..2b80ebd58b 100644 --- a/apps/contacts/ajax/contact/addproperty.php +++ b/apps/contacts/ajax/contact/addproperty.php @@ -108,7 +108,17 @@ switch($name) { $value = strtolower($value); break; case 'TEL': - case 'ADR': // should I delete the property if empty or throw an error? + case 'ADR': + break; + case 'IMPP': + if(is_null($parameters) || !isset($parameters['X-SERVICE-TYPE'])) { + bailOut(OC_Contacts_App::$l10n->t('Missing IM parameter.')); + } + $impp = OC_Contacts_App::getIMOptions($parameters['X-SERVICE-TYPE']); + if(is_null($impp)) { + bailOut(OC_Contacts_App::$l10n->t('Unknown IM: '.$parameters['X-SERVICE-TYPE'])); + } + $value = $impp['protocol'] . ':' . $value; break; } @@ -126,22 +136,28 @@ $line = count($vcard->children) - 1; // Apparently Sabre_VObject_Parameter doesn't do well with // multiple values or I don't know how to do it. Tanghus. foreach ($parameters as $key=>$element) { - if(is_array($element) && strtoupper($key) == 'TYPE') { + if(is_array($element) /*&& strtoupper($key) == 'TYPE'*/) { // NOTE: Maybe this doesn't only apply for TYPE? // And it probably shouldn't be done here anyways :-/ foreach($element as $e) { if($e != '' && !is_null($e)) { - $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $e); + if(trim($e)) { + $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $e); + } } } } else { + if(trim($element)) { $vcard->children[$line]->parameters[] = new Sabre_VObject_Parameter($key, $element); + } } } $checksum = md5($vcard->children[$line]->serialize()); -if(!OC_Contacts_VCard::edit($id, $vcard)) { - bailOut($l10n->t('Error adding contact property: '.$name)); +try { + OC_Contacts_VCard::edit($id, $vcard); +} catch(Exception $e) { + bailOut($e->getMessage()); } OCP\JSON::success(array( diff --git a/apps/contacts/ajax/contact/delete.php b/apps/contacts/ajax/contact/delete.php index def98b3670..e73f34f898 100644 --- a/apps/contacts/ajax/contact/delete.php +++ b/apps/contacts/ajax/contact/delete.php @@ -4,6 +4,7 @@ * * @author Jakob Sack * @copyright 2011 Jakob Sack mail@jakobsack.de + * @copyright 2012 Thomas Tanghus (thomas@tanghus.net) * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE @@ -30,7 +31,14 @@ $id = isset($_POST['id'])?$_POST['id']:null; if(!$id) { bailOut(OC_Contacts_App::$l10n->t('id is not set.')); } -$card = OC_Contacts_App::getContactObject( $id ); -OC_Contacts_VCard::delete($id); +try { + OC_Contacts_VCard::delete($id); +} catch(Exception $e) { + $msg = $e->getMessage(); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$msg, + OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', id'.$id, OCP\Util::DEBUG); + bailOut($msg); +} OCP\JSON::success(array('data' => array( 'id' => $id ))); diff --git a/apps/contacts/ajax/contact/deleteproperty.php b/apps/contacts/ajax/contact/deleteproperty.php index b76eb19462..b76b6e55ed 100644 --- a/apps/contacts/ajax/contact/deleteproperty.php +++ b/apps/contacts/ajax/contact/deleteproperty.php @@ -40,8 +40,10 @@ if(is_null($line)) { unset($vcard->children[$line]); -if(!OC_Contacts_VCard::edit($id, $vcard)) { - bailOut($l10n->t('Error deleting contact property.')); +try { + OC_Contacts_VCard::edit($id, $vcard); +} catch(Exception $e) { + bailOut($e->getMessage()); } OCP\JSON::success(array( diff --git a/apps/contacts/ajax/contact/list.php b/apps/contacts/ajax/contact/list.php index c5eca292f1..4e2509d8d5 100644 --- a/apps/contacts/ajax/contact/list.php +++ b/apps/contacts/ajax/contact/list.php @@ -41,6 +41,10 @@ foreach($active_addressbooks as $addressbook) { = array('contacts' => array('type' => 'book',)); $contacts_addressbook[$addressbook['id']]['displayname'] = $addressbook['displayname']; + $contacts_addressbook[$addressbook['id']]['permissions'] + = isset($addressbook['permissions']) + ? $addressbook['permissions'] + : '0'; } } @@ -75,10 +79,14 @@ if($contacts_alphabet) { } } $contacts_addressbook[$contact['addressbookid']]['contacts'][] = array( - 'type' => 'contact', - 'id' => $contact['id'], - 'addressbookid' => $contact['addressbookid'], - 'displayname' => htmlspecialchars($display) + 'type' => 'contact', + 'id' => $contact['id'], + 'addressbookid' => $contact['addressbookid'], + 'displayname' => htmlspecialchars($display), + 'permissions' => + isset($contacts_addressbook[$contact['addressbookid']]['permissions']) + ? $contacts_addressbook[$contact['addressbookid']]['permissions'] + : '0', ); } } diff --git a/apps/contacts/ajax/contact/move.php b/apps/contacts/ajax/contact/move.php index a3336c3cb6..053343c47e 100644 --- a/apps/contacts/ajax/contact/move.php +++ b/apps/contacts/ajax/contact/move.php @@ -7,35 +7,23 @@ * later. * See the COPYING-README file. */ - + OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); OCP\JSON::callCheck(); -$ids = $_POST['ids']; +$id = intval($_POST['id']); $aid = intval($_POST['aid']); +$isaddressbook = isset($_POST['isaddressbook']) ? true: false; + +// Ownership checking OC_Contacts_App::getAddressbook($aid); - -if(!is_array($ids)) { - $ids = array($ids,); -} -$goodids = array(); -foreach ($ids as $id){ - try { - $card = OC_Contacts_App::getContactObject( intval($id) ); - if($card) { - $goodids[] = $id; - } - } catch (Exception $e) { - OCP\Util::writeLog('contacts', 'Error moving contact "'.$id.'" to addressbook "'.$aid.'"'.$e->getMessage(), OCP\Util::ERROR); - } -} try { - OC_Contacts_VCard::moveToAddressBook($aid, $ids); + OC_Contacts_VCard::moveToAddressBook($aid, $id, $isaddressbook); } catch (Exception $e) { $msg = $e->getMessage(); - OCP\Util::writeLog('contacts', 'Error moving contacts "'.implode(',', $ids).'" to addressbook "'.$aid.'"'.$msg, OCP\Util::ERROR); + OCP\Util::writeLog('contacts', 'Error moving contacts "'.implode(',', $id).'" to addressbook "'.$aid.'"'.$msg, OCP\Util::ERROR); OC_JSON::error(array('data' => array('message' => $msg,))); } - -OC_JSON::success(array('data' => array('ids' => $goodids,))); \ No newline at end of file + +OC_JSON::success(array('data' => array('ids' => $id,))); \ No newline at end of file diff --git a/apps/contacts/ajax/contact/saveproperty.php b/apps/contacts/ajax/contact/saveproperty.php index fd541b7361..7ae183538b 100644 --- a/apps/contacts/ajax/contact/saveproperty.php +++ b/apps/contacts/ajax/contact/saveproperty.php @@ -88,6 +88,16 @@ switch($element) { case 'EMAIL': $value = strtolower($value); break; + case 'IMPP': + if(is_null($parameters) || !isset($parameters['X-SERVICE-TYPE'])) { + bailOut(OC_Contacts_App::$l10n->t('Missing IM parameter.')); + } + $impp = OC_Contacts_App::getIMOptions($parameters['X-SERVICE-TYPE']); + if(is_null($impp)) { + bailOut(OC_Contacts_App::$l10n->t('Unknown IM: '.$parameters['X-SERVICE-TYPE'])); + } + $value = $impp['protocol'] . ':' . $value; + break; } if(!$value) { @@ -112,7 +122,8 @@ if(!$value) { break; case 'EMAIL': case 'TEL': - case 'ADR': // should I delete the property if empty or throw an error? + case 'ADR': + case 'IMPP': debug('Setting element: (EMAIL/TEL/ADR)'.$element); $vcard->children[$line]->setValue($value); $vcard->children[$line]->parameters = array(); @@ -120,12 +131,23 @@ if(!$value) { debug('Setting parameters: '.$parameters); foreach($parameters as $key => $parameter) { debug('Adding parameter: '.$key); - foreach($parameter as $val) { - debug('Adding parameter: '.$key.'=>'.$val); - $vcard->children[$line]->add(new Sabre_VObject_Parameter( - $key, - strtoupper(strip_tags($val))) - ); + if(is_array($parameter)) { + foreach($parameter as $val) { + if(trim($val)) { + debug('Adding parameter: '.$key.'=>'.$val); + $vcard->children[$line]->add(new Sabre_VObject_Parameter( + $key, + strtoupper(strip_tags($val))) + ); + } + } + } else { + if(trim($parameter)) { + $vcard->children[$line]->add(new Sabre_VObject_Parameter( + $key, + strtoupper(strip_tags($parameter))) + ); + } } } } @@ -140,9 +162,10 @@ if(!$value) { } //debug('New checksum: '.$checksum); -if(!OC_Contacts_VCard::edit($id, $vcard)) { - bailOut(OC_Contacts_App::$l10n->t('Error updating contact property.')); - exit(); +try { + OC_Contacts_VCard::edit($id, $vcard); +} catch(Exception $e) { + bailOut($e->getMessage()); } OCP\JSON::success(array('data' => array( diff --git a/apps/contacts/ajax/loadcard.php b/apps/contacts/ajax/loadcard.php index 75fe33ada6..82501ffd2f 100644 --- a/apps/contacts/ajax/loadcard.php +++ b/apps/contacts/ajax/loadcard.php @@ -35,13 +35,22 @@ $maxUploadFilesize = min($maxUploadFilesize, $freeSpace); $adr_types = OC_Contacts_App::getTypesOfProperty('ADR'); $phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); $email_types = OC_Contacts_App::getTypesOfProperty('EMAIL'); +$impp_types = OC_Contacts_App::getTypesOfProperty('IMPP'); +$ims = OC_Contacts_App::getIMOptions(); +$im_protocols = array(); +foreach($ims as $name => $values) { + $im_protocols[$name] = $values['displayname']; +} $tmpl = new OCP\Template('contacts', 'part.contact'); $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize); +$tmpl->assign('requesttoken', $_SERVER['HTTP_REQUESTTOKEN']); $tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); $tmpl->assign('adr_types', $adr_types); $tmpl->assign('phone_types', $phone_types); $tmpl->assign('email_types', $email_types); +$tmpl->assign('impp_types', $impp_types, false); +$tmpl->assign('im_protocols', $im_protocols, false); $tmpl->assign('requesttoken', $requesttoken); $tmpl->assign('id', ''); $page = $tmpl->fetchPage(); diff --git a/apps/contacts/ajax/selectaddressbook.php b/apps/contacts/ajax/selectaddressbook.php index 6c35d08c82..e5527c8e5f 100644 --- a/apps/contacts/ajax/selectaddressbook.php +++ b/apps/contacts/ajax/selectaddressbook.php @@ -9,8 +9,16 @@ OCP\JSON::checkLoggedIn(); OCP\JSON::checkAppEnabled('contacts'); -$addressbooks = OC_Contacts_Addressbook::all(OCP\USER::getUser()); -$tmpl = new OCP\Template("contacts", "part.selectaddressbook"); -$tmpl->assign('addressbooks', $addressbooks); -$page = $tmpl->fetchPage(); -OCP\JSON::success(array('data' => array('page' => $page ))); +$books = OC_Contacts_Addressbook::all(OCP\USER::getUser()); +if(count($books) > 1) { + $addressbooks = array(); + foreach($books as $book) { + $addressbooks[] = array('id' => $book['id'], 'name' => $book['displayname']); + } + $tmpl = new OCP\Template("contacts", "part.selectaddressbook"); + $tmpl->assign('addressbooks', $addressbooks); + $page = $tmpl->fetchPage(); + OCP\JSON::success(array('data' => array( 'type' => 'dialog', 'page' => $page ))); +} else { + OCP\JSON::success(array('data' => array( 'type' => 'result', 'id' => $books[0]['id'] ))); +} \ No newline at end of file diff --git a/apps/contacts/appinfo/app.php b/apps/contacts/appinfo/app.php index 7e73f315dd..102c04705a 100644 --- a/apps/contacts/appinfo/app.php +++ b/apps/contacts/appinfo/app.php @@ -3,8 +3,14 @@ OC::$CLASSPATH['OC_Contacts_App'] = 'apps/contacts/lib/app.php'; OC::$CLASSPATH['OC_Contacts_Addressbook'] = 'apps/contacts/lib/addressbook.php'; OC::$CLASSPATH['OC_Contacts_VCard'] = 'apps/contacts/lib/vcard.php'; OC::$CLASSPATH['OC_Contacts_Hooks'] = 'apps/contacts/lib/hooks.php'; -OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/connector_sabre.php'; -OC::$CLASSPATH['Sabre_CardDAV_VCFExportPlugin'] = 'apps/contacts/lib/VCFExportPlugin.php'; +OC::$CLASSPATH['OC_Share_Backend_Contact'] = 'apps/contacts/lib/share/contact.php'; +OC::$CLASSPATH['OC_Share_Backend_Addressbook'] = 'apps/contacts/lib/share/addressbook.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV'] = 'apps/contacts/lib/sabre/backend.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBookRoot'] = 'apps/contacts/lib/sabre/addressbookroot.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_UserAddressBooks'] = 'apps/contacts/lib/sabre/useraddressbooks.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_AddressBook'] = 'apps/contacts/lib/sabre/addressbook.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_Card'] = 'apps/contacts/lib/sabre/card.php'; +OC::$CLASSPATH['OC_Connector_Sabre_CardDAV_VCFExportPlugin'] = 'apps/contacts/lib/sabre/vcfexportplugin.php'; OC::$CLASSPATH['OC_Search_Provider_Contacts'] = 'apps/contacts/lib/search.php'; OCP\Util::connectHook('OC_User', 'post_createUser', 'OC_Contacts_Hooks', 'createUser'); OCP\Util::connectHook('OC_User', 'post_deleteUser', 'OC_Contacts_Hooks', 'deleteUser'); @@ -20,3 +26,6 @@ OCP\App::addNavigationEntry( array( OCP\Util::addscript('contacts', 'loader'); OC_Search::registerProvider('OC_Search_Provider_Contacts'); +OCP\Share::registerBackend('contact', 'OC_Share_Backend_Contact'); +OCP\Share::registerBackend('addressbook', 'OC_Share_Backend_Addressbook', 'contact'); + diff --git a/apps/contacts/appinfo/database.xml b/apps/contacts/appinfo/database.xml index b814b0f151..1e2e097e49 100644 --- a/apps/contacts/appinfo/database.xml +++ b/apps/contacts/appinfo/database.xml @@ -49,7 +49,7 @@ description - clob + text false @@ -109,7 +109,7 @@ carddata - clob + text false diff --git a/apps/contacts/appinfo/migrate.php b/apps/contacts/appinfo/migrate.php index 2559b4ea45..19c960c75a 100644 --- a/apps/contacts/appinfo/migrate.php +++ b/apps/contacts/appinfo/migrate.php @@ -34,12 +34,12 @@ class OC_Migration_Provider_Contacts extends OC_Migration_Provider{ switch( $this->appinfo->version ) { default: // All versions of the app have had the same db structure, so all can use the same import function - $query = $this->content->prepare( "SELECT * FROM contacts_addressbooks WHERE userid LIKE ?" ); + $query = $this->content->prepare( 'SELECT * FROM `contacts_addressbooks` WHERE `userid` LIKE ?' ); $results = $query->execute( array( $this->olduid ) ); $idmap = array(); while( $row = $results->fetchRow() ) { // Import each addressbook - $addressbookquery = OCP\DB::prepare( "INSERT INTO *PREFIX*contacts_addressbooks (`userid`, `displayname`, `uri`, `description`, `ctag`) VALUES (?, ?, ?, ?, ?)" ); + $addressbookquery = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`, `displayname`, `uri`, `description`, `ctag`) VALUES (?, ?, ?, ?, ?)' ); $addressbookquery->execute( array( $this->uid, $row['displayname'], $row['uri'], $row['description'], $row['ctag'] ) ); // Map the id $idmap[$row['id']] = OCP\DB::insertid('*PREFIX*contacts_addressbooks'); @@ -49,11 +49,11 @@ class OC_Migration_Provider_Contacts extends OC_Migration_Provider{ // Now tags foreach($idmap as $oldid => $newid) { - $query = $this->content->prepare( "SELECT * FROM contacts_cards WHERE addressbookid LIKE ?" ); + $query = $this->content->prepare( 'SELECT * FROM `contacts_cards` WHERE `addressbookid` LIKE ?' ); $results = $query->execute( array( $oldid ) ); while( $row = $results->fetchRow() ){ // Import the contacts - $contactquery = OCP\DB::prepare( "INSERT INTO *PREFIX*contacts_cards (`addressbookid`, `fullname`, `carddata`, `uri`, `lastmodified`) VALUES (?, ?, ?, ?, ?)" ); + $contactquery = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_cards` (`addressbookid`, `fullname`, `carddata`, `uri`, `lastmodified`) VALUES (?, ?, ?, ?, ?)' ); $contactquery->execute( array( $newid, $row['fullname'], $row['carddata'], $row['uri'], $row['lastmodified'] ) ); } } diff --git a/apps/contacts/appinfo/remote.php b/apps/contacts/appinfo/remote.php index 6cb5b59525..d8677d7f73 100644 --- a/apps/contacts/appinfo/remote.php +++ b/apps/contacts/appinfo/remote.php @@ -36,15 +36,15 @@ $principalBackend = new OC_Connector_Sabre_Principal(); $carddavBackend = new OC_Connector_Sabre_CardDAV(); // Root nodes -$Sabre_CalDAV_Principal_Collection = new Sabre_CalDAV_Principal_Collection($principalBackend); -$Sabre_CalDAV_Principal_Collection->disableListing = true; // Disable listening +$principalCollection = new Sabre_CalDAV_Principal_Collection($principalBackend); +$principalCollection->disableListing = true; // Disable listening -$Sabre_CardDAV_AddressBookRoot = new Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend); -$Sabre_CardDAV_AddressBookRoot->disableListing = true; // Disable listening +$addressBookRoot = new OC_Connector_Sabre_CardDAV_AddressBookRoot($principalBackend, $carddavBackend); +$addressBookRoot->disableListing = true; // Disable listening -$nodes = array( - $Sabre_CalDAV_Principal_Collection, - $Sabre_CardDAV_AddressBookRoot, +$nodes = array( + $principalCollection, + $addressBookRoot, ); // Fire up server @@ -55,7 +55,7 @@ $server->addPlugin(new Sabre_DAV_Auth_Plugin($authBackend, 'ownCloud')); $server->addPlugin(new Sabre_CardDAV_Plugin()); $server->addPlugin(new Sabre_DAVACL_Plugin()); $server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload -$server->addPlugin(new Sabre_CardDAV_VCFExportPlugin()); +$server->addPlugin(new OC_Connector_Sabre_CardDAV_VCFExportPlugin()); // And off we go! $server->exec(); diff --git a/apps/contacts/appinfo/update.php b/apps/contacts/appinfo/update.php index 21e736bb44..cc00b325e1 100644 --- a/apps/contacts/appinfo/update.php +++ b/apps/contacts/appinfo/update.php @@ -3,15 +3,15 @@ $installedVersion=OCP\Config::getAppValue('contacts', 'installed_version'); if (version_compare($installedVersion, '0.2.3', '<')) { // First set all address books in-active. - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET active=0' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `active`=0' ); $result = $stmt->execute(array()); // Then get all the active address books. - $stmt = OCP\DB::prepare( 'SELECT userid,configvalue FROM *PREFIX*preferences WHERE appid=\'contacts\' AND configkey=\'openaddressbooks\'' ); + $stmt = OCP\DB::prepare( 'SELECT `userid`,`configvalue` FROM `*PREFIX*preferences` WHERE `appid`=\'contacts\' AND `configkey`=\'openaddressbooks\'' ); $result = $stmt->execute(array()); // Prepare statement for updating the new 'active' field. - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET active=? WHERE id=? AND userid=?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `active`=? WHERE `id`=? AND `userid`=?' ); while( $row = $result->fetchRow()) { $ids = explode(';', $row['configvalue']); foreach($ids as $id) { @@ -20,6 +20,6 @@ if (version_compare($installedVersion, '0.2.3', '<')) { } // Remove the old preferences. - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*preferences WHERE appid=\'contacts\' AND configkey=\'openaddressbooks\'' ); + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*preferences` WHERE `appid`=\'contacts\' AND `configkey`=\'openaddressbooks\'' ); $result = $stmt->execute(array()); } diff --git a/apps/contacts/css/contacts.css b/apps/contacts/css/contacts.css index c5308c4d25..bc1a57756a 100644 --- a/apps/contacts/css/contacts.css +++ b/apps/contacts/css/contacts.css @@ -26,15 +26,15 @@ #contacts_propertymenu li a { padding: 3px; display: block } #contacts_propertymenu li:hover { background-color: #1d2d44; } #contacts_propertymenu li a:hover { color: #fff } -#card { width: auto;/*max-width: 70em; border: thin solid lightgray; display: block;*/ } +#card { width: auto; font-size: 10px; /*max-width: 70em; border: thin solid lightgray; display: block;*/ } #firstrun { width: 100%; position: absolute; top: 5em; left: 0; text-align: center; font-weight:bold; font-size:1.5em; color:#777; } #firstrun #selections { font-size:0.8em; margin: 2em auto auto auto; clear: both; } #card input[type="text"].contacts_property,input[type="email"].contacts_property,input[type="url"].contacts_property { width: 14em; float: left; font-weight: bold; } .categories { float: left; width: 16em; } -#card input[type="text"],input[type="email"],input[type="url"],input[type="tel"],input[type="date"], select, textarea { background-color: #fefefe; border: 0 !important; -webkit-appearance:none !important; -moz-appearance:none !important; -webkit-box-sizing:none !important; -moz-box-sizing:none !important; box-sizing:none !important; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; float: left; } -#card input[type="text"]:hover, input[type="text"]:focus, input[type="text"]:active,input[type="email"]:hover,input[type="url"]:hover,input[type="tel"]:hover,input[type="date"]:hover,input[type="date"],input[type="date"]:hover,input[type="date"]:active,input[type="date"]:active,input[type="date"]:active,input[type="email"]:active,input[type="url"]:active,input[type="tel"]:active, select:hover, select:focus, select:active, textarea:focus, textarea:hover { border: 0 !important; -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #ddd, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; outline:none; float: left; } -textarea { width: 80%; min-height: 5em; min-width: 30em; margin: 0 !important; padding: 0 !important; outline: 0 !important;} +#card input[type="checkbox"].contacts_property, #card input[type="text"], #card input[type="email"], #card input[type="url"], #card input[type="tel"], #card input[type="date"], #card select, #card textarea { background-color: #fefefe; border: 0 !important; -moz-appearance:none !important; -webkit-box-sizing:none !important; -moz-box-sizing:none !important; box-sizing:none !important; -moz-box-shadow: none; -webkit-box-shadow: none; box-shadow: none; -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; float: left; } +#card input[type="text"]:hover, #card input[type="text"]:focus, #card input[type="text"]:active, input[type="email"]:hover, #card input[type="url"]:hover, #card input[type="tel"]:hover, #card input[type="date"]:hover, #card input[type="date"], #card input[type="date"]:hover, #card input[type="date"]:active, #card input[type="date"]:active, #card input[type="date"]:active, #card input[type="email"]:active, #card input[type="url"]:active, #card input[type="tel"]:active, #card textarea:focus, #card textarea:hover { border: 0 !important; -webkit-appearance:textfield; -moz-appearance:textfield; -webkit-box-sizing:content-box; -moz-box-sizing:content-box; box-sizing:content-box; background:#fff; color:#333; border:1px solid #ddd; -moz-box-shadow:0 1px 1px #ddd, 0 2px 0 #bbb inset; -webkit-box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; box-shadow:0 1px 1px #ddd, 0 1px 0 #bbb inset; -moz-border-radius:.5em; -webkit-border-radius:.5em; border-radius:.5em; outline:none; float: left; } +#card textarea { width: 80%; min-height: 5em; min-width: 30em; margin: 0 !important; padding: 0 !important; outline: 0 !important;} dl.form { width: 100%; float: left; clear: right; margin: 0; padding: 0; cursor: normal; } .form dt { display: table-cell; clear: left; float: left; width: 7em; margin: 0; padding: 0.8em 0.5em 0 0; text-align:right; text-overflow:ellipsis; o-text-overflow: ellipsis; vertical-align: text-bottom; color: #bbb;/* white-space: pre-wrap; white-space: -moz-pre-wrap !important; white-space: -pre-wrap; white-space: -o-pre-wrap;*/ } .form dd { display: table-cell; clear: right; float: left; margin: 0; padding: 0px; white-space: nowrap; vertical-align: text-bottom; } @@ -50,11 +50,12 @@ label:hover, dt:hover { color: #333; } .float { float: left; } .svg { border: inherit; background: inherit; } .listactions { height: 1em; width:60px; float: left; clear: right; } -.add,.edit,.delete,.mail, .globe, .upload, .download, .cloud { cursor: pointer; width: 20px; height: 20px; margin: 0; float: left; position:relative; opacity: 0.1; } +.add,.edit,.delete,.mail, .globe, .upload, .download, .cloud, .share { cursor: pointer; width: 20px; height: 20px; margin: 0; float: left; position:relative; opacity: 0.1; } .add:hover,.edit:hover,.delete:hover,.mail:hover, .globe:hover, .upload:hover, .download:hover .cloud:hover { opacity: 1.0 } .add { background:url('%webroot%/core/img/actions/add.svg') no-repeat center; clear: both; } .delete { background:url('%webroot%/core/img/actions/delete.svg') no-repeat center; } .edit { background:url('%webroot%/core/img/actions/rename.svg') no-repeat center; } +.share { background:url('%webroot%/core/img/actions/share.svg') no-repeat center; } .mail { background:url('%webroot%/core/img/actions/mail.svg') no-repeat center; } .upload { background:url('%webroot%/core/img/actions/upload.svg') no-repeat center; } .download { background:url('%webroot%/core/img/actions/download.svg') no-repeat center; } @@ -70,12 +71,12 @@ label:hover, dt:hover { color: #333; } #fn { float: left !important; width: 18em !important; } #name { /*position: absolute; top: 0px; left: 0px;*/ min-width: 25em; height: 2em; clear: right; display: block; } #identityprops { /*position: absolute; top: 2.5em; left: 0px;*/ } -/*#contact_photo { max-width: 250px; }*/ -#contact_identity { min-width: 30em; } -.contactsection { position: relative; float: left; padding: 0.5em; height: auto; } +#contact_photo { float: left; margin: 1em; } +#contact_identity { min-width: 30em; padding: 0.5em;} +.contactsection { position: relative; float: left; width: 35em; padding: 0.5em; height: auto; } #cropbox { margin: auto; } -#contacts_details_photo_wrapper { width: 200px; } +#contacts_details_photo_wrapper { width: 150px; } #contacts_details_photo_wrapper.wait { opacity: 0.6; filter:alpha(opacity=0.6); z-index:1000; background: url('%webroot%/core/img/loading.gif') no-repeat center center; cursor: wait; } .contacts_details_photo { border-radius: 0.5em; border: thin solid #bbb; margin: 0.3em; background: url('%webroot%/core/img/loading.gif') no-repeat center center; -moz-box-shadow: 0 1px 3px #777; -webkit-box-shadow: 0 1px 3px #777; box-shadow: 0 1px 3px #777; opacity: 1; } .contacts_details_photo:hover { background: #fff; cursor: default; } @@ -116,13 +117,21 @@ input[type="checkbox"] { width: 20px; height: 20px; vertical-align: bottom; } .big { font-weight:bold; font-size:1.2em; } .huge { font-weight:bold; font-size:1.5em; } .propertycontainer dd { float: left; width: 25em; } -.propertylist { clear: none; max-width: 28em; } -.propertylist li.propertycontainer { white-space: nowrap; min-width: 35em; /*max-width: 30em;*/ display: block; clear: right; } -.propertycontainer[data-element="EMAIL"] > input[type="email"] { min-width: 19em !important; float: left; } -.propertycontainer[data-element="TEL"] > input[type="text"] { width: 10em !important; float: left; } -.propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 20px; height: 20px; vertical-align: middle; } +/*.propertylist { clear: none; max-width: 33em; }*/ +.propertylist li.propertycontainer { white-space: nowrap; min-width: 35em; display: block; clear: both; } +.propertycontainer[data-element="EMAIL"] > input[type="email"],.propertycontainer[data-element="TEL"] > input[type="text"] { min-width: 12em !important; float: left; } +.propertylist li > input[type="checkbox"],input[type="radio"] { float: left; clear: left; width: 16px; height: 16px; vertical-align: middle; padding: 0; } .propertylist li > select { float: left; max-width: 8em; } -.typelist[type="button"] { float: left; max-width: 10em; border: 0; background-color: #fff; color: #bbb} /* for multiselect */ +.propertylist li > .select_wrapper { float: left; overflow: hidden; color: #bbb; font-size: 0.8em; } +.propertylist li > .select_wrapper select { float: left; overflow: hidden; color: #bbb; } +.propertylist li > .select_wrapper select option { color: #777; } +.propertylist li > .select_wrapper select:hover,.propertylist li > select:focus,.propertylist li > select:active { color: #777; } +.propertylist li > .select_wrapper select.impp { margin-left: -23px; direction: rtl; } +.propertylist li > .select_wrapper select.types { margin-right: -23px; } +.propertylist li > input[type="checkbox"].impp { clear: none; } +.propertylist li > label.xab { display: block; color: #bbb; float:left; clear: both; padding: 0.5em 0 0 2.5em; } +.propertylist li > label.xab:hover { color: #777; } +.typelist[type="button"] { float: left; max-width: 8em; border: 0; background-color: #fff; color: #bbb; box-shadow: none; } /* for multiselect */ .typelist[type="button"]:hover { color: #777; } /* for multiselect */ .addresslist { clear: both; font-weight: bold; } #ninjahelp { position: absolute; bottom: 0; left: 0; right: 0; padding: 1em; margin: 1em; opacity: 0.9; } diff --git a/apps/contacts/img/contact-new.png b/apps/contacts/img/contact-new.png index 087ad9ab2d..a91f2e620f 100644 Binary files a/apps/contacts/img/contact-new.png and b/apps/contacts/img/contact-new.png differ diff --git a/apps/contacts/img/person.png b/apps/contacts/img/person.png index 17e7919654..e88bb5653a 100644 Binary files a/apps/contacts/img/person.png and b/apps/contacts/img/person.png differ diff --git a/apps/contacts/img/person_large.png b/apps/contacts/img/person_large.png index 4edba0c548..8293df6182 100644 Binary files a/apps/contacts/img/person_large.png and b/apps/contacts/img/person_large.png differ diff --git a/apps/contacts/index.php b/apps/contacts/index.php index c35e1b85d4..f16d6f5641 100644 --- a/apps/contacts/index.php +++ b/apps/contacts/index.php @@ -14,12 +14,12 @@ OCP\App::checkAppEnabled('contacts'); // Get active address books. This creates a default one if none exists. $ids = OC_Contacts_Addressbook::activeIds(OCP\USER::getUser()); -$has_contacts = (count(OC_Contacts_VCard::all($ids, 0, 1)) > 0 - ? true +$has_contacts = (count(OC_Contacts_VCard::all($ids, 0, 1)) > 0 + ? true : false); // just to check if there are any contacts. if($has_contacts === false) { - OCP\Util::writeLog('contacts', - 'index.html: No contacts found.', + OCP\Util::writeLog('contacts', + 'index.html: No contacts found.', OCP\Util::DEBUG); } @@ -28,9 +28,14 @@ OCP\App::setActiveNavigationEntry('contacts_index'); // Load a specific user? $id = isset( $_GET['id'] ) ? $_GET['id'] : null; -$property_types = OC_Contacts_App::getAddPropertyOptions(); +$impp_types = OC_Contacts_App::getTypesOfProperty('IMPP'); $phone_types = OC_Contacts_App::getTypesOfProperty('TEL'); $email_types = OC_Contacts_App::getTypesOfProperty('EMAIL'); +$ims = OC_Contacts_App::getIMOptions(); +$im_protocols = array(); +foreach($ims as $name => $values) { + $im_protocols[$name] = $values['displayname']; +} $categories = OC_Contacts_App::getCategories(); $upload_max_filesize = OCP\Util::computerFileSize(ini_get('upload_max_filesize')); @@ -57,12 +62,13 @@ OCP\Util::addStyle('contacts', 'contacts'); $tmpl = new OCP\Template( "contacts", "index", "user" ); $tmpl->assign('uploadMaxFilesize', $maxUploadFilesize, false); -$tmpl->assign('uploadMaxHumanFilesize', +$tmpl->assign('uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize), false); -$tmpl->assign('property_types', $property_types, false); $tmpl->assign('phone_types', $phone_types, false); $tmpl->assign('email_types', $email_types, false); +$tmpl->assign('impp_types', $impp_types, false); $tmpl->assign('categories', $categories, false); +$tmpl->assign('im_protocols', $im_protocols, false); $tmpl->assign('has_contacts', $has_contacts, false); $tmpl->assign('id', $id, false); $tmpl->printPage(); diff --git a/apps/contacts/js/contacts.js b/apps/contacts/js/contacts.js index 2e62b5cf13..b209acadaa 100644 --- a/apps/contacts/js/contacts.js +++ b/apps/contacts/js/contacts.js @@ -398,12 +398,32 @@ OC.Contacts={ localLoadContact(newid, bookid); } }, + setEnabled:function(enabled) { + console.log('setEnabled', enabled); + $('.contacts_property,.action').each(function () { + $(this).prop('disabled', !enabled); + OC.Contacts.Card.enabled = enabled; + }); + }, doExport:function() { document.location.href = OC.linkTo('contacts', 'export.php') + '?contactid=' + this.id; }, editNew:function(){ // add a new contact - this.id = ''; this.fn = ''; this.fullname = ''; this.givname = ''; this.famname = ''; this.addname = ''; this.honpre = ''; this.honsuf = ''; - OC.Contacts.Card.add(';;;;;', '', '', true); + var book = $('#contacts h3.active'); + var permissions = parseInt(book.data('permissions')); + if(permissions == 0 + || permissions & OC.Share.PERMISSION_UPDATE + || permissions & OC.Share.PERMISSION_DELETE) { + with(this) { + delete id; delete fn; delete fullname; delete givname; delete famname; + delete addname; delete honpre; delete honsuf; + } + this.bookid = book.data('id'); + OC.Contacts.Card.add(';;;;;', '', '', true); + } else { + OC.dialogs.alert(t('contacts', 'You do not have permission to add contacts to ') + + book.text() + '. ' + t('contacts', 'Please select one of your own address books.'), t('contacts', 'Permission error')); + } return false; }, add:function(n, fn, aid, isnew){ // add a new contact @@ -471,7 +491,7 @@ OC.Contacts={ } $('#rightcontent').data('id', newid); - OC.Contacts.Contacts.deletionQueue.push(this.id); + OC.Contacts.Contacts.deletionQueue.push(parseInt(this.id)); if(!window.onbeforeunload) { window.onbeforeunload = OC.Contacts.Contacts.warnNotDeleted; } @@ -497,9 +517,16 @@ OC.Contacts={ OC.Contacts.notify({ data:curlistitem, message:t('contacts','Click to undo deletion of "') + curlistitem.find('a').text() + '"', + //timeout:5, timeouthandler:function(contact) { - OC.Contacts.Card.doDelete(contact.data('id'), true); - delete contact; + console.log('timeout'); + OC.Contacts.Card.doDelete(contact.data('id'), true, function(res) { + if(!res) { + OC.Contacts.Contacts.insertContact({contact:contact}); + } else { + delete contact; + } + }); }, clickhandler:function(contact) { OC.Contacts.Contacts.insertContact({contact:contact}); @@ -508,21 +535,36 @@ OC.Contacts={ } }); }, - doDelete:function(id, removeFromQueue) { - if(OC.Contacts.Contacts.deletionQueue.indexOf(id) == -1 && removeFromQueue) { - return; - } - $.post(OC.filePath('contacts', 'ajax', 'contact/delete.php'),{'id':id},function(jsondata) { - if(jsondata.status == 'error'){ - OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); - } + doDelete:function(id, removeFromQueue, cb) { + var updateQueue = function(id, remove) { if(removeFromQueue) { - OC.Contacts.Contacts.deletionQueue.splice(OC.Contacts.Contacts.deletionQueue.indexOf(id), 1); + OC.Contacts.Contacts.deletionQueue.splice(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)), 1); } if(OC.Contacts.Contacts.deletionQueue.length == 0) { window.onbeforeunload = null; } + } + + if(OC.Contacts.Contacts.deletionQueue.indexOf(parseInt(id)) == -1 && removeFromQueue) { + console.log('returning'); + updateQueue(id, removeFromQueue); + if(typeof cb == 'function') { + cb(true); + } + return; + } + $.post(OC.filePath('contacts', 'ajax', 'contact/delete.php'), {'id':id},function(jsondata) { + if(jsondata.status == 'error'){ + OC.Contacts.notify({message:jsondata.data.message}); + if(typeof cb == 'function') { + cb(false); + } + } + updateQueue(id, removeFromQueue); }); + if(typeof cb == 'function') { + cb(true); + } }, loadContact:function(jsondata, bookid){ this.data = jsondata; @@ -533,6 +575,7 @@ OC.Contacts={ this.loadPhoto(); this.loadMails(); this.loadPhones(); + this.loadIMs(); this.loadAddresses(); this.loadSingleProperties(); OC.Contacts.loadListHandlers(); @@ -545,15 +588,20 @@ OC.Contacts={ textarea.css('min-height', nheight+'em'); textarea.attr('rows', nheight); textarea.val(txt); - note.show(); + $('#contact_note').show(); textarea.expandingTextarea(); $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().hide(); } else { note.removeData('checksum'); note.find('textarea').val(''); - note.hide(); + $('#contact_note').hide(); $('#contacts_propertymenu_dropdown a[data-type="NOTE"]').parent().show(); } + var permissions = OC.Contacts.Card.permissions = parseInt($('#contacts ul[data-id="' + bookid + '"]').data('permissions')); + console.log('permissions', permissions); + this.setEnabled(permissions == 0 + || permissions & OC.Share.PERMISSION_UPDATE + || permissions & OC.Share.PERMISSION_DELETE); }, loadSingleProperties:function() { var props = ['BDAY', 'NICKNAME', 'ORG', 'URL', 'CATEGORIES']; @@ -748,6 +796,13 @@ OC.Contacts={ console.log('Saving: ' + q); $(obj).attr('disabled', 'disabled'); $.post(OC.filePath('contacts', 'ajax', 'contact/saveproperty.php'),q,function(jsondata){ + if(!jsondata) { + OC.dialogs.alert(t('contacts', 'Unknown error. Please check logs.'), t('contacts', 'Error')); + OC.Contacts.loading(obj, false); + $(obj).removeAttr('disabled'); + OC.Contacts.Card.update({cid:OC.Contacts.Card.id}); + return false; + } if(jsondata.status == 'success'){ container.data('checksum', jsondata.data.checksum); OC.Contacts.Card.savePropertyInternal(name, fields, checksum, jsondata.data.checksum); @@ -759,6 +814,7 @@ OC.Contacts={ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); OC.Contacts.loading(obj, false); $(obj).removeAttr('disabled'); + OC.Contacts.Card.update({cid:OC.Contacts.Card.id}); return false; } },'json'); @@ -778,16 +834,21 @@ OC.Contacts={ OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); OC.Contacts.loading(obj, false); $(obj).removeAttr('disabled'); + OC.Contacts.Card.update({cid:OC.Contacts.Card.id}); return false; } },'json'); } }, addProperty:function(type) { + if(!this.enabled) { + return; + } switch (type) { case 'NOTE': $('#contacts_propertymenu_dropdown a[data-type="'+type+'"]').parent().hide(); $('#note').find('textarea').expandingTextarea().show().focus(); + $('#contact_note').show(); break; case 'EMAIL': if($('#emaillist>li').length == 1) { @@ -801,8 +862,14 @@ OC.Contacts={ } OC.Contacts.Card.addPhone(); break; + case 'IMPP': + if($('#imlist>li').length == 1) { + $('#ims').show(); + } + OC.Contacts.Card.addIM(); + break; case 'ADR': - if($('#addressdisplay>dl').length == 1) { + if($('addresses>dl').length == 1) { $('#addresses').show(); } OC.Contacts.Card.editAddress('new', true); @@ -820,6 +887,9 @@ OC.Contacts={ }, deleteProperty:function(obj, type) { console.log('deleteProperty'); + if(!this.enabled) { + return; + } OC.Contacts.loading(obj, true); var checksum = OC.Contacts.checksumFor(obj); if(checksum) { @@ -838,6 +908,7 @@ OC.Contacts={ OC.Contacts.Card.loadPhoto(); } else if(proptype == 'NOTE') { $('#note').find('textarea').val(''); + $('#contact_note').hide(); OC.Contacts.propertyContainerFor(obj).hide(); } } else { @@ -870,6 +941,9 @@ OC.Contacts={ } }, editName:function() { + if(!this.enabled) { + return; + } var params = {id: this.id}; /* Initialize the name edit dialog */ if($('#edit_name_dialog').dialog('isOpen') == true) { @@ -905,6 +979,9 @@ OC.Contacts={ } }, saveName:function(dlg) { + if(!this.enabled) { + return; + } //console.log('saveName, id: ' + this.id); var n = new Array($(dlg).find('#fam').val().strip_tags(),$(dlg).find('#giv').val().strip_tags(),$(dlg).find('#add').val().strip_tags(),$(dlg).find('#pre').val().strip_tags(),$(dlg).find('#suf').val().strip_tags()); this.famname = n[0]; @@ -947,10 +1024,10 @@ OC.Contacts={ }, loadAddresses:function() { $('#addresses').hide(); - $('#addressdisplay dl.propertycontainer').remove(); - var addresscontainer = $('#addressdisplay'); + $('#addresses dl.propertycontainer').remove(); + var addresscontainer = $('#addresses'); for(var adr in this.data.ADR) { - addresscontainer.find('dl').first().clone().insertAfter($('#addressdisplay dl').last()).show(); + addresscontainer.find('dl').first().clone().insertAfter($('#addresses dl').last()).show(); addresscontainer.find('dl').last().removeClass('template').addClass('propertycontainer'); addresscontainer.find('dl').last().data('checksum', this.data.ADR[adr]['checksum']); var adrarray = this.data.ADR[adr]['value']; @@ -989,17 +1066,19 @@ OC.Contacts={ } if(addresscontainer.find('dl').length > 1) { $('#addresses').show(); - $('#contact_communication').show(); } return false; }, editAddress:function(obj, isnew){ + if(!this.enabled) { + return; + } var container = undefined; var params = {id: this.id}; if(obj === 'new') { isnew = true; - $('#addressdisplay dl').first().clone(true).insertAfter($('#addressdisplay dl').last()).show(); - container = $('#addressdisplay dl').last(); + $('#addresses dl').first().clone(true).insertAfter($('#addresses dl').last()).show(); + container = $('#addresses dl').last(); container.removeClass('template').addClass('propertycontainer'); } else { params['checksum'] = OC.Contacts.checksumFor(obj); @@ -1016,7 +1095,7 @@ OC.Contacts={ buttons: { 'Ok':function() { if(isnew) { - OC.Contacts.Card.saveAddress(this, $('#addressdisplay dl:last-child').find('input').first(), isnew); + OC.Contacts.Card.saveAddress(this, $('#addresses dl:last-child').find('input').first(), isnew); } else { OC.Contacts.Card.saveAddress(this, obj, isnew); } @@ -1119,8 +1198,11 @@ OC.Contacts={ } }, saveAddress:function(dlg, obj, isnew){ + if(!this.enabled) { + return; + } if(isnew) { - container = $('#addressdisplay dl').last(); + container = $('#addresses dl').last(); obj = container.find('input').first(); } else { checksum = OC.Contacts.checksumFor(obj); @@ -1161,6 +1243,9 @@ OC.Contacts={ container.find('.addresslist').html(adrtxt); }, uploadPhoto:function(filelist) { + if(!this.enabled) { + return; + } if(!filelist) { OC.dialogs.alert(t('contacts','No files selected for upload.'), t('contacts', 'Error')); return; @@ -1229,6 +1314,7 @@ OC.Contacts={ $(this.photo).load(function () { $('img.contacts_details_photo').remove() $(this).addClass('contacts_details_photo'); + wrapper.css('width', $(this).get(0).width + 10); wrapper.removeClass('loading').removeClass('wait'); $(this).insertAfter($('#phototools')).fadeIn(); }).error(function () { @@ -1238,6 +1324,9 @@ OC.Contacts={ this.loadPhotoHandlers() }, editCurrentPhoto:function(){ + if(!this.enabled) { + return; + } $.getJSON(OC.filePath('contacts', 'ajax', 'currentphoto.php'),{'id':this.id},function(jsondata){ if(jsondata.status == 'success'){ //alert(jsondata.data.page); @@ -1251,6 +1340,9 @@ OC.Contacts={ }); }, editPhoto:function(id, tmpkey){ + if(!this.enabled) { + return; + } //alert('editPhoto: ' + tmpkey); $.getJSON(OC.filePath('contacts', 'ajax', 'cropphoto.php'),{'tmpkey':tmpkey,'id':this.id, 'requesttoken':requesttoken},function(jsondata){ if(jsondata.status == 'success'){ @@ -1267,7 +1359,10 @@ OC.Contacts={ $('#edit_photo_dialog').dialog('open'); } }, - savePhoto:function(){ + savePhoto:function() { + if(!this.enabled) { + return; + } var target = $('#crop_target'); var form = $('#cropform'); var wrapper = $('#contacts_details_photo_wrapper'); @@ -1287,42 +1382,127 @@ OC.Contacts={ }); OC.Contacts.Contacts.refreshThumbnail(this.id); }, - addMail:function() { + addIM:function() { //alert('addMail'); + var imlist = $('#imlist'); + imlist.find('li.template:first-child').clone(true).appendTo(imlist).show().find('a .tip').tipsy(); + imlist.find('li.template:last-child').find('select').addClass('contacts_property'); + imlist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); + imlist.find('li:last-child').find('input[type="text"]').focus(); + return false; + }, + loadIMs:function() { + //console.log('loadIMs'); + $('#ims').hide(); + $('#imlist li.propertycontainer').remove(); + var imlist = $('#imlist'); + for(var im in this.data.IMPP) { + this.addIM(); + var curim = imlist.find('li.propertycontainer:last-child'); + if(typeof this.data.IMPP[im].label != 'undefined') { + curim.prepend(''); + } + curim.data('checksum', this.data.IMPP[im]['checksum']) + curim.find('input[type="text"]').val(this.data.IMPP[im]['value'].split(':').pop()); + for(var param in this.data.IMPP[im]['parameters']) { + if(param.toUpperCase() == 'PREF') { + curim.find('input[type="checkbox"]').attr('checked', 'checked') + } + else if(param.toUpperCase() == 'TYPE') { + if(typeof this.data.IMPP[im]['parameters'][param] == 'string') { + var found = false; + var imt = this.data.IMPP[im]['parameters'][param]; + curim.find('select.types option').each(function(){ + if($(this).val().toUpperCase() == imt.toUpperCase()) { + $(this).attr('selected', 'selected'); + found = true; + } + }); + if(!found) { + curim.find('select.type option:last-child').after(''); + } + } else if(typeof this.data.IMPP[im]['parameters'][param] == 'object') { + for(imtype in this.data.IMPP[im]['parameters'][param]) { + var found = false; + var imt = this.data.IMPP[im]['parameters'][param][imtype]; + curim.find('select.types option').each(function(){ + if($(this).val().toUpperCase() == imt.toUpperCase().split(',')) { + $(this).attr('selected', 'selected'); + found = true; + } + }); + if(!found) { + curim.find('select.type option:last-child').after(''); + } + } + } + } + else if(param.toUpperCase() == 'X-SERVICE-TYPE') { + curim.find('select.impp').val(this.data.IMPP[im]['parameters'][param].toLowerCase()); + } + } + } + if($('#imlist li').length > 1) { + $('#ims').show(); + } + return false; + }, + addMail:function() { var emaillist = $('#emaillist'); emaillist.find('li.template:first-child').clone(true).appendTo(emaillist).show().find('a .tip').tipsy(); emaillist.find('li.template:last-child').find('select').addClass('contacts_property'); emaillist.find('li.template:last-child').removeClass('template').addClass('propertycontainer'); emaillist.find('li:last-child').find('input[type="email"]').focus(); + emaillist.find('li:last-child').find('select').multiselect({ + noneSelectedText: t('contacts', 'Select type'), + header: false, + selectedList: 4, + classes: 'typelist' + }); return false; }, loadMails:function() { $('#emails').hide(); $('#emaillist li.propertycontainer').remove(); + var emaillist = $('#emaillist'); for(var mail in this.data.EMAIL) { this.addMail(); - //$('#emaillist li:first-child').clone().appendTo($('#emaillist')).show(); - $('#emaillist li:last-child').data('checksum', this.data.EMAIL[mail]['checksum']) - $('#emaillist li:last-child').find('input[type="email"]').val(this.data.EMAIL[mail]['value']); + emaillist.find('li:last-child').find('select').multiselect('destroy'); + var curemail = emaillist.find('li.propertycontainer:last-child'); + if(typeof this.data.EMAIL[mail].label != 'undefined') { + curemail.prepend(''); + } + curemail.data('checksum', this.data.EMAIL[mail]['checksum']) + curemail.find('input[type="email"]').val(this.data.EMAIL[mail]['value']); for(var param in this.data.EMAIL[mail]['parameters']) { if(param.toUpperCase() == 'PREF') { - $('#emaillist li:last-child').find('input[type="checkbox"]').attr('checked', 'checked') + curemail.find('input[type="checkbox"]').attr('checked', 'checked') } else if(param.toUpperCase() == 'TYPE') { for(etype in this.data.EMAIL[mail]['parameters'][param]) { + var found = false; var et = this.data.EMAIL[mail]['parameters'][param][etype]; - $('#emaillist li:last-child').find('select option').each(function(){ + curemail.find('select option').each(function(){ if($.inArray($(this).val().toUpperCase(), et.toUpperCase().split(',')) > -1) { $(this).attr('selected', 'selected'); + found = true; } }); + if(!found) { + curemail.find('select option:last-child').after(''); + } } } } + curemail.find('select').multiselect({ + noneSelectedText: t('contacts', 'Select type'), + header: false, + selectedList: 4, + classes: 'typelist' + }); } if($('#emaillist li').length > 1) { $('#emails').show(); - $('#contact_communication').show(); } $('#emaillist li:last-child').find('input[type="text"]').focus(); return false; @@ -1348,26 +1528,35 @@ OC.Contacts={ var phonelist = $('#phonelist'); for(var phone in this.data.TEL) { this.addPhone(); - phonelist.find('li:last-child').find('select').multiselect('destroy'); - phonelist.find('li:last-child').data('checksum', this.data.TEL[phone]['checksum']) - phonelist.find('li:last-child').find('input[type="text"]').val(this.data.TEL[phone]['value']); + var curphone = phonelist.find('li.propertycontainer:last-child'); + if(typeof this.data.TEL[phone].label != 'undefined') { + curphone.prepend(''); + } + curphone.find('select').multiselect('destroy'); + curphone.data('checksum', this.data.TEL[phone]['checksum']) + curphone.find('input[type="text"]').val(this.data.TEL[phone]['value']); for(var param in this.data.TEL[phone]['parameters']) { if(param.toUpperCase() == 'PREF') { - phonelist.find('li:last-child').find('input[type="checkbox"]').attr('checked', 'checked'); + curphone.find('input[type="checkbox"]').attr('checked', 'checked'); } else if(param.toUpperCase() == 'TYPE') { for(ptype in this.data.TEL[phone]['parameters'][param]) { + var found = false; var pt = this.data.TEL[phone]['parameters'][param][ptype]; - phonelist.find('li:last-child').find('select option').each(function(){ + curphone.find('select option').each(function() { //if ($(this).val().toUpperCase() == pt.toUpperCase()) { if ($.inArray($(this).val().toUpperCase(), pt.toUpperCase().split(',')) > -1) { $(this).attr('selected', 'selected'); + found = true; } }); + if(!found) { + curphone.find('select option:last-child').after(''); + } } } } - phonelist.find('li:last-child').find('select').multiselect({ + curphone.find('select').multiselect({ noneSelectedText: t('contacts', 'Select type'), header: false, selectedList: 4, @@ -1376,7 +1565,6 @@ OC.Contacts={ } if(phonelist.find('li').length > 1) { $('#phones').show(); - $('#contact_communication').show(); } return false; }, @@ -1437,8 +1625,12 @@ OC.Contacts={ if(dragitem.data('bookid') == droptarget.data('id')) { return false; } - var droplist = (droptarget.is('ul'))?droptarget:droptarget.next(); - $.post(OC.filePath('contacts', 'ajax', 'contact/move.php'), { ids: dragitem.data('id'), aid: droptarget.data('id') }, + var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next(); + $.post(OC.filePath('contacts', 'ajax', 'contact/move.php'), + { + id: dragitem.data('id'), + aid: droptarget.data('id') + }, function(jsondata){ if(jsondata.status == 'success'){ dragitem.attr('data-bookid', droptarget.data('id')) @@ -1454,7 +1646,27 @@ OC.Contacts={ }); }, dropAddressbook:function(event, dragitem, droptarget) { - alert('Dropping address books not implemented yet'); + if(confirm(t('contacts', 'Do you want to merge these address books?'))) { + if(dragitem.data('bookid') == droptarget.data('id')) { + return false; + } + var droplist = (droptarget.is('ul')) ? droptarget : droptarget.next(); + $.post(OC.filePath('contacts', 'ajax', 'contact/move.php'), + { + id: dragitem.data('id'), + aid: droptarget.data('id'), + isaddressbook: 1 + }, + function(jsondata){ + if(jsondata.status == 'success'){ + OC.Contacts.Contacts.update(); // Easier to refresh the whole bunch. + } else { + OC.dialogs.alert(jsondata.data.message, t('contacts', 'Error')); + } + }); + } else { + return false; + } }, /** * @params params An object with the properties 'contactlist':a jquery object of the ul to insert into, @@ -1585,11 +1797,15 @@ OC.Contacts={ firstrun = true; if($('#contacts h3').length == 0) { $('#contacts').html('

'+book.displayname+'

'); + + b + '" data-permissions="' + book.permissions + '">' + book.displayname + + ''); } else { - if(!$('#contacts h3[data-id="'+b+'"]').length) { - var item = $('

' - + book.displayname+'

') + if(!$('#contacts h3[data-id="' + b + '"]').length) { + var item = $('

' + + book.displayname+'

'); var added = false; $('#contacts h3').each(function(){ if ($(this).text().toLowerCase() > book.displayname.toLowerCase()) { diff --git a/apps/contacts/js/loader.js b/apps/contacts/js/loader.js index 5bca0ab723..3b1f407048 100644 --- a/apps/contacts/js/loader.js +++ b/apps/contacts/js/loader.js @@ -78,9 +78,9 @@ Contacts_Import={ } $(document).ready(function(){ if(typeof FileActions !== 'undefined'){ - FileActions.register('text/vcard','importaddressbook', '', Contacts_Import.importdialog); + FileActions.register('text/vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog); FileActions.setDefault('text/vcard','importaddressbook'); - FileActions.register('text/x-vcard','importaddressbook', '', Contacts_Import.importdialog); + FileActions.register('text/x-vcard','importaddressbook', FileActions.PERMISSION_READ, '', Contacts_Import.importdialog); FileActions.setDefault('text/x-vcard','importaddressbook'); }; }); \ No newline at end of file diff --git a/apps/contacts/js/settings.js b/apps/contacts/js/settings.js index 67aaa5b5f8..69cf473e06 100644 --- a/apps/contacts/js/settings.js +++ b/apps/contacts/js/settings.js @@ -4,6 +4,7 @@ OC.Contacts.Settings = OC.Contacts.Settings || { this.Addressbook.adrsettings = $('.addressbooks-settings').first(); this.Addressbook.adractions = $('#contacts-settings').find('div.actions'); console.log('actions: ' + this.Addressbook.adractions.length); + OC.Share.loadIcons('addressbook'); }, Addressbook:{ showActions:function(act) { diff --git a/apps/contacts/l10n/ar.php b/apps/contacts/l10n/ar.php index cd57b69a89..2b28d6ca6d 100644 --- a/apps/contacts/l10n/ar.php +++ b/apps/contacts/l10n/ar.php @@ -5,15 +5,9 @@ "Cannot add empty property." => "لا يمكنك اضافه صفه خاليه.", "At least one of the address fields has to be filled out." => "يجب ملء على الاقل خانه واحده من العنوان.", "Information about vCard is incorrect. Please reload the page." => "المعلومات الموجودة في ال vCard غير صحيحة. الرجاء إعادة تحديث الصفحة.", -"Error deleting contact property." => "خطء خلال محي الصفه.", -"Error updating contact property." => "خطء خلال تعديل الصفه.", "Contacts" => "المعارف", "This is not your addressbook." => "هذا ليس دفتر عناوينك.", "Contact could not be found." => "لم يتم العثور على الشخص.", -"Address" => "عنوان", -"Telephone" => "الهاتف", -"Email" => "البريد الالكتروني", -"Organization" => "المؤسسة", "Work" => "الوظيفة", "Home" => "البيت", "Mobile" => "الهاتف المحمول", @@ -26,9 +20,12 @@ "Contact" => "معرفه", "Add Contact" => "أضف شخص ", "Addressbooks" => "كتب العناوين", +"Organization" => "المؤسسة", "Delete" => "حذف", "Preferred" => "مفضل", "Phone" => "الهاتف", +"Email" => "البريد الالكتروني", +"Address" => "عنوان", "Download contact" => "انزال المعرفه", "Delete contact" => "امحي المعرفه", "Type" => "نوع", diff --git a/apps/contacts/l10n/ca.php b/apps/contacts/l10n/ca.php index 72550522d5..7ce9d6d456 100644 --- a/apps/contacts/l10n/ca.php +++ b/apps/contacts/l10n/ca.php @@ -14,15 +14,14 @@ "Cannot add empty property." => "No es pot afegir una propietat buida.", "At least one of the address fields has to be filled out." => "Almenys heu d'omplir un dels camps d'adreça.", "Trying to add duplicate property: " => "Esteu intentant afegir una propietat duplicada:", -"Error adding contact property: " => "Error en afegir la propietat del contacte:", +"Missing IM parameter." => "Falta el paràmetre IM.", +"Unknown IM: " => "IM desconegut:", "Information about vCard is incorrect. Please reload the page." => "La informació de la vCard és incorrecta. Carregueu la pàgina de nou.", -"Error deleting contact property." => "Error en eliminar la propietat del contacte.", "Missing ID" => "Falta la ID", "Error parsing VCard for ID: \"" => "Error en analitzar la ID de la VCard: \"", "checksum is not set." => "no s'ha establert la suma de verificació.", "Information about vCard is incorrect. Please reload the page: " => "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:", "Something went FUBAR. " => "Alguna cosa ha anat FUBAR.", -"Error updating contact property." => "Error en actualitzar la propietat del contacte.", "No contact ID was submitted." => "No s'ha tramès cap ID de contacte.", "Error reading contact photo." => "Error en llegir la foto del contacte.", "Error saving temporary file." => "Error en desar el fitxer temporal.", @@ -53,6 +52,9 @@ "Not implemented" => "No implementada", "Couldn't get a valid address." => "No s'ha pogut obtenir una adreça vàlida.", "Error" => "Error", +"You do not have permission to add contacts to " => "No teniu permisos per afegir contactes a ", +"Please select one of your own address books." => "Seleccioneu una de les vostres llibretes d'adreces", +"Permission error" => "Error de permisos", "This property has to be non-empty." => "Aquesta propietat no pot ser buida.", "Couldn't serialize elements." => "No s'han pogut serialitzar els elements.", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' s'ha cridat sense argument de tipus. Informeu-ne a bugs.owncloud.org", @@ -62,6 +64,7 @@ "Error loading profile picture." => "Error en carregar la imatge de perfil.", "Select type" => "Seleccioneu un tipus", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Heu marcat eliminar alguns contactes, però encara no s'han eliminat. Espereu mentre s'esborren.", +"Do you want to merge these address books?" => "Voleu fusionar aquestes llibretes d'adreces?", "Result: " => "Resultat: ", " imported, " => " importat, ", " failed." => " fallada.", @@ -69,12 +72,21 @@ "Addressbook not found: " => "No s'ha trobat la llibreta d'adreces: ", "This is not your addressbook." => "Aquesta no és la vostra llibreta d'adreces", "Contact could not be found." => "No s'ha trobat el contacte.", -"Address" => "Adreça", -"Telephone" => "Telèfon", -"Email" => "Correu electrònic", -"Organization" => "Organització", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Feina", "Home" => "Casa", +"Other" => "Altres", "Mobile" => "Mòbil", "Text" => "Text", "Voice" => "Veu", @@ -93,12 +105,13 @@ "Journey" => "Viatge", "Jubilee" => "Aniversari", "Meeting" => "Reunió", -"Other" => "Altres", "Personal" => "Personal", "Projects" => "Projectes", "Questions" => "Preguntes", "{name}'s Birthday" => "Aniversari de {name}", "Contact" => "Contacte", +"You do not have the permissions to edit this contact." => "No teniu permisos per editar aquest contacte", +"You do not have the permissions to delete this contact." => "No teniu permisos per esborrar aquest contacte", "Add Contact" => "Afegeix un contacte", "Import" => "Importa", "Settings" => "Configuració", @@ -123,6 +136,7 @@ "Select photo from ownCloud" => "Selecciona una foto de ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma", "Edit name details" => "Edita detalls del nom", +"Organization" => "Organització", "Delete" => "Suprimeix", "Nickname" => "Sobrenom", "Enter nickname" => "Escriviu el sobrenom", @@ -140,11 +154,16 @@ "Delete email address" => "Elimina l'adreça de correu electrònic", "Enter phone number" => "Escriviu el número de telèfon", "Delete phone number" => "Elimina el número de telèfon", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "Elimina IM", "View on map" => "Visualitza al mapa", "Edit address details" => "Edita els detalls de l'adreça", "Add notes here." => "Afegiu notes aquí.", "Add field" => "Afegeix un camp", "Phone" => "Telèfon", +"Email" => "Correu electrònic", +"Instant Messaging" => "Missatgeria instantània", +"Address" => "Adreça", "Note" => "Nota", "Download contact" => "Baixa el contacte", "Delete contact" => "Suprimeix el contacte", @@ -187,9 +206,14 @@ "create a new addressbook" => "crea una llibreta d'adreces nova", "Name of new addressbook" => "Nom de la nova llibreta d'adreces", "Importing contacts" => "S'estan important contactes", +"Contacts imported successfully" => "Els contactes s'han importat correctament", +"Close Dialog" => "Tanca el diàleg", +"Import Addressbook" => "Importa la llibreta d'adreces", +"Select address book to import to:" => "Seleccioneu la llibreta d'adreces a la que voleu importar:", +"Drop a VCF file to import contacts." => "Elimina un fitxer VCF per importar contactes.", +"Select from HD" => "Selecciona de HD", "You have no contacts in your addressbook." => "No teniu contactes a la llibreta d'adreces.", "Add contact" => "Afegeix un contacte", -"Configure addressbooks" => "Configura les llibretes d'adreces", "Select Address Books" => "Selecccioneu llibretes d'adreces", "Enter name" => "Escriviu un nom", "Enter description" => "Escriviu una descripció", @@ -199,6 +223,7 @@ "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "Mostra l'enllaç CardDav", "Show read-only VCF link" => "Mostra l'enllaç VCF només de lectura", +"Share" => "Comparteix", "Download" => "Baixa", "Edit" => "Edita", "New Address Book" => "Nova llibreta d'adreces", diff --git a/apps/contacts/l10n/cs_CZ.php b/apps/contacts/l10n/cs_CZ.php index 9b342328ac..5065fd2938 100644 --- a/apps/contacts/l10n/cs_CZ.php +++ b/apps/contacts/l10n/cs_CZ.php @@ -10,17 +10,18 @@ "No contacts found." => "Žádné kontakty nenalezeny.", "There was an error adding the contact." => "Během přidávání kontaktu nastala chyba.", "element name is not set." => "jméno elementu není nastaveno.", +"Could not parse contact: " => "Nelze analyzovat kontakty", "Cannot add empty property." => "Nelze přidat prazdný údaj.", "At least one of the address fields has to be filled out." => "Musí být uveden nejméně jeden z adresních údajů", "Trying to add duplicate property: " => "Pokoušíte se přidat duplicitní atribut: ", +"Missing IM parameter." => "Chybějící parametr IM", +"Unknown IM: " => "Neznámý IM:", "Information about vCard is incorrect. Please reload the page." => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", -"Error deleting contact property." => "Chyba při odstraňování údaje kontaktu.", "Missing ID" => "Chybí ID", "Error parsing VCard for ID: \"" => "Chyba při parsování VCard pro ID: \"", "checksum is not set." => "kontrolní součet není nastaven.", "Information about vCard is incorrect. Please reload the page: " => "Informace o vCard je nesprávná. Obnovte stránku, prosím.", "Something went FUBAR. " => "Něco se pokazilo. ", -"Error updating contact property." => "Chyba při aktualizaci údaje kontaktu.", "No contact ID was submitted." => "Nebylo nastaveno ID kontaktu.", "Error reading contact photo." => "Chyba při načítání fotky kontaktu.", "Error saving temporary file." => "Chyba při ukládání dočasného souboru.", @@ -51,24 +52,41 @@ "Not implemented" => "Neimplementováno", "Couldn't get a valid address." => "Nelze získat platnou adresu.", "Error" => "Chyba", +"You do not have permission to add contacts to " => "Nemáte práva přidat kontakt do", +"Please select one of your own address books." => "Prosím vyberte jeden z vašich adresářů", +"Permission error" => "Chyba přístupových práv", "This property has to be non-empty." => "Tento parametr nemuže zůstat nevyplněn.", "Couldn't serialize elements." => "Prvky nelze převést..", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' voláno bez argumentu. Prosím oznamte chybu na bugs.owncloud.org", "Edit name" => "Upravit jméno", "No files selected for upload." => "Žádné soubory nebyly vybrány k nahrání.", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "Soubor, který se pokoušíte odeslat, přesahuje maximální povolenou velikost.", +"Error loading profile picture." => "Chyba při otevírání obrázku profilu", "Select type" => "Vybrat typ", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Některé kontakty jsou označeny ke smazání. Počkete prosím na dokončení operace.", +"Do you want to merge these address books?" => "Chcete spojit tyto adresáře?", "Result: " => "Výsledek: ", " imported, " => "importováno v pořádku,", " failed." => "neimportováno.", +"Displayname cannot be empty." => "Zobrazované jméno nemůže zůstat prázdné.", +"Addressbook not found: " => "Adresář nenalezen:", "This is not your addressbook." => "Toto není Váš adresář.", "Contact could not be found." => "Kontakt nebyl nalezen.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organizace", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Pracovní", "Home" => "Domácí", +"Other" => "Ostatní", "Mobile" => "Mobil", "Text" => "Text", "Voice" => "Hlas", @@ -78,12 +96,39 @@ "Pager" => "Pager", "Internet" => "Internet", "Birthday" => "Narozeniny", +"Business" => "Pracovní", +"Call" => "Volat", +"Clients" => "Klienti", +"Deliverer" => "Dodavatel", +"Holidays" => "Prázdniny", +"Ideas" => "Nápady", +"Journey" => "Cestování", +"Jubilee" => "Jubileum", +"Meeting" => "Schůzka", +"Personal" => "Osobní", +"Projects" => "Projekty", +"Questions" => "Dotazy", "{name}'s Birthday" => "Narozeniny {name}", "Contact" => "Kontakt", +"You do not have the permissions to edit this contact." => "Nemáte práva editovat tento kontakt", +"You do not have the permissions to delete this contact." => "Nemáte práva smazat tento kontakt", "Add Contact" => "Přidat kontakt", "Import" => "Import", +"Settings" => "Nastavení", "Addressbooks" => "Adresáře", "Close" => "Zavřít", +"Keyboard shortcuts" => "Klávesoví zkratky", +"Navigation" => "Navigace", +"Next contact in list" => "Následující kontakt v seznamu", +"Previous contact in list" => "Předchozí kontakt v seznamu", +"Expand/collapse current addressbook" => "Rozbalit/sbalit aktuální Adresář", +"Next addressbook" => "Následující Adresář", +"Previous addressbook" => "Předchozí Adresář", +"Actions" => "Akce", +"Refresh contacts list" => "Občerstvit seznam kontaktů", +"Add new contact" => "Přidat kontakt", +"Add new addressbook" => "Předat nový Adresář", +"Delete current contact" => "Odstranit aktuální kontakt", "Drop photo to upload" => "Přetáhněte sem fotku pro její nahrání", "Delete current photo" => "Smazat současnou fotku", "Edit current photo" => "Upravit současnou fotku", @@ -91,9 +136,13 @@ "Select photo from ownCloud" => "Vybrat fotku z ownCloudu", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastní, křestní, celé jméno, obráceně nebo obráceně oddelené čárkami", "Edit name details" => "Upravit podrobnosti jména", +"Organization" => "Organizace", "Delete" => "Odstranit", "Nickname" => "Přezdívka", "Enter nickname" => "Zadejte přezdívku", +"Web site" => "Web", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Přejít na web", "dd-mm-yyyy" => "dd. mm. yyyy", "Groups" => "Skupiny", "Separate groups with commas" => "Oddělte skupiny čárkami", @@ -105,11 +154,16 @@ "Delete email address" => "Smazat e-mail", "Enter phone number" => "Zadat telefoní číslo", "Delete phone number" => "Smazat telefoní číslo", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "Smazat IM", "View on map" => "Zobrazit na mapě", "Edit address details" => "Upravit podrobnosti adresy", "Add notes here." => "Zde můžete připsat poznámky.", "Add field" => "Přidat políčko", "Phone" => "Telefon", +"Email" => "Email", +"Instant Messaging" => "Instant Messaging", +"Address" => "Adresa", "Note" => "Poznámka", "Download contact" => "Stáhnout kontakt", "Delete contact" => "Odstranit kontakt", @@ -117,10 +171,15 @@ "Edit address" => "Upravit adresu", "Type" => "Typ", "PO Box" => "PO box", +"Street address" => "Ulice", +"Street and number" => "Ulice a číslo", "Extended" => "Rozšířené", +"Apartment number etc." => "Byt číslo atd.", "City" => "Město", "Region" => "Kraj", +"E.g. state or province" => "Např. stát nebo okres", "Zipcode" => "PSČ", +"Postal code" => "PSČ", "Country" => "Země", "Addressbook" => "Adresář", "Hon. prefixes" => "Tituly před", @@ -147,16 +206,30 @@ "create a new addressbook" => "vytvořit nový adresář", "Name of new addressbook" => "Jméno nového adresáře", "Importing contacts" => "Importování kontaktů", +"Contacts imported successfully" => "Kontakty úspěšně importovány", +"Close Dialog" => "Zavírací dialog", +"Import Addressbook" => "Importovat adresář", +"Select address book to import to:" => "Vyberte adresář do kterého chcete importovat:", +"Drop a VCF file to import contacts." => "Pro import kontaktů sem přetáhněte soubor VCF", +"Select from HD" => "Vybrat z disku", "You have no contacts in your addressbook." => "Nemáte žádné kontakty v adresáři.", "Add contact" => "Přidat kontakt", -"Configure addressbooks" => "Nastavit adresář", +"Select Address Books" => "Vybrat Adresář", +"Enter name" => "Vložte jméno", +"Enter description" => "Vložte popis", "CardDAV syncing addresses" => "Adresa pro synchronizaci pomocí CardDAV:", "more info" => "víc informací", "Primary address (Kontact et al)" => "Hlavní adresa (Kontakt etc)", "iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Zobrazit odklaz CardDAV:", +"Show read-only VCF link" => "Zobrazit odkaz VCF pouze pro čtení", +"Share" => "Sdílet", "Download" => "Stažení", "Edit" => "Editovat", "New Address Book" => "Nový adresář", +"Name" => "Název", +"Description" => "Popis", "Save" => "Uložit", -"Cancel" => "Storno" +"Cancel" => "Storno", +"More..." => "Více..." ); diff --git a/apps/contacts/l10n/da.php b/apps/contacts/l10n/da.php index 7d98c339f5..97c5f1307c 100644 --- a/apps/contacts/l10n/da.php +++ b/apps/contacts/l10n/da.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Der skal udfyldes mindst et adressefelt.", "Trying to add duplicate property: " => "Kan ikke tilføje overlappende element.", "Information about vCard is incorrect. Please reload the page." => "Informationen om vCard er forkert. Genindlæs siden.", -"Error deleting contact property." => "Fejl ved sletning af egenskab for kontaktperson.", "Missing ID" => "Manglende ID", "Error parsing VCard for ID: \"" => "Kunne ikke indlæse VCard med ID'et: \"", "checksum is not set." => "Checksum er ikke medsendt.", "Information about vCard is incorrect. Please reload the page: " => "Informationen om dette VCard stemmer ikke. Genindlæs venligst siden: ", "Something went FUBAR. " => "Noget gik grueligt galt. ", -"Error updating contact property." => "Fejl ved opdatering af egenskab for kontaktperson.", "No contact ID was submitted." => "Ingen ID for kontakperson medsendt.", "Error reading contact photo." => "Kunne ikke indlæse foto for kontakperson.", "Error saving temporary file." => "Kunne ikke gemme midlertidig fil.", @@ -63,10 +61,6 @@ " failed." => " fejl.", "This is not your addressbook." => "Dette er ikke din adressebog.", "Contact could not be found." => "Kontaktperson kunne ikke findes.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organisation", "Work" => "Arbejde", "Home" => "Hjemme", "Mobile" => "Mobil", @@ -91,6 +85,7 @@ "Select photo from ownCloud" => "Vælg foto fra ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatter som valgfrit, fuldt navn, efternavn først eller efternavn først med komma", "Edit name details" => "Rediger navnedetaljer.", +"Organization" => "Organisation", "Delete" => "Slet", "Nickname" => "Kaldenavn", "Enter nickname" => "Indtast kaldenavn", @@ -110,6 +105,8 @@ "Add notes here." => "Tilføj noter her.", "Add field" => "Tilføj element", "Phone" => "Telefon", +"Email" => "Email", +"Address" => "Adresse", "Note" => "Note", "Download contact" => "Download kontaktperson", "Delete contact" => "Slet kontaktperson", @@ -149,7 +146,6 @@ "Importing contacts" => "Importerer kontaktpersoner", "You have no contacts in your addressbook." => "Du har ingen kontaktpersoner i din adressebog.", "Add contact" => "Tilføj kontaktpeson.", -"Configure addressbooks" => "Konfigurer adressebøger", "CardDAV syncing addresses" => "CardDAV synkroniserings adresse", "more info" => "mere info", "Primary address (Kontact et al)" => "Primær adresse (Kontak m. fl.)", diff --git a/apps/contacts/l10n/de.php b/apps/contacts/l10n/de.php index a47b61d507..c2e8884fc2 100644 --- a/apps/contacts/l10n/de.php +++ b/apps/contacts/l10n/de.php @@ -13,16 +13,15 @@ "Could not parse contact: " => "Konnte folgenden Kontakt nicht verarbeiten:", "Cannot add empty property." => "Feld darf nicht leer sein.", "At least one of the address fields has to be filled out." => "Mindestens eines der Adressfelder muss ausgefüllt werden.", -"Trying to add duplicate property: " => "Versuche, doppelte Eigenschaft hinzuzufügen: ", -"Error adding contact property: " => "Fehler beim Hinzufügen der Kontakteigenschaft:", -"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite.", -"Error deleting contact property." => "Kontakteigenschaft löschen fehlgeschlagen.", +"Trying to add duplicate property: " => "Versuche doppelte Eigenschaft hinzuzufügen: ", +"Missing IM parameter." => "IM-Parameter fehlt.", +"Unknown IM: " => "IM unbekannt:", +"Information about vCard is incorrect. Please reload the page." => "Die Information der vCard ist fehlerhaft. Bitte aktualisieren Sie die Seite.", "Missing ID" => "Fehlende ID", "Error parsing VCard for ID: \"" => "Fehler beim Einlesen der VCard für die ID: \"", "checksum is not set." => "Keine Prüfsumme angegeben.", "Information about vCard is incorrect. Please reload the page: " => "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: ", "Something went FUBAR. " => "Irgendwas ist hier so richtig schief gelaufen. ", -"Error updating contact property." => "Kontakteigenschaft aktualisieren fehlgeschlagen", "No contact ID was submitted." => "Es wurde keine Kontakt-ID übermittelt.", "Error reading contact photo." => "Fehler beim Auslesen des Kontaktfotos.", "Error saving temporary file." => "Fehler beim Speichern der temporären Datei.", @@ -32,13 +31,13 @@ "File doesn't exist:" => "Datei existiert nicht: ", "Error loading image." => "Fehler beim Laden des Bildes.", "Error getting contact object." => "Fehler beim Abruf des Kontakt-Objektes.", -"Error getting PHOTO property." => "Fehler beim Abrufen der PHOTO Eigenschaft.", +"Error getting PHOTO property." => "Fehler beim Abrufen der PHOTO-Eigenschaft.", "Error saving contact." => "Fehler beim Speichern des Kontaktes.", "Error resizing image" => "Fehler bei der Größenänderung des Bildes", "Error cropping image" => "Fehler beim Zuschneiden des Bildes", -"Error creating temporary image" => "Fehler beim erstellen des temporären Bildes", +"Error creating temporary image" => "Fehler beim Erstellen des temporären Bildes", "Error finding image: " => "Fehler beim Suchen des Bildes: ", -"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen", +"Error uploading contacts to storage." => "Übertragen der Kontakte fehlgeschlagen.", "There is no error, the file uploaded with success" => "Alles bestens, Datei erfolgreich übertragen.", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Datei größer, als durch die upload_max_filesize Direktive in php.ini erlaubt", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form" => "Datei größer, als die MAX_FILE_SIZE Direktive erlaubt, die im HTML Formular spezifiziert ist", @@ -51,30 +50,43 @@ "Contacts" => "Kontakte", "Sorry, this functionality has not been implemented yet" => "Diese Funktion steht leider noch nicht zur Verfügung", "Not implemented" => "Nicht verfügbar", -"Couldn't get a valid address." => "Konnte keine gültige Adresse abrufen", +"Couldn't get a valid address." => "Konnte keine gültige Adresse abrufen.", "Error" => "Fehler", +"You do not have permission to add contacts to " => "Sie besitzen nicht die erforderlichen Rechte, um Kontakte hinzuzufügen", +"Please select one of your own address books." => "Bitte wählen Sie eines Ihrer Adressbücher aus.", +"Permission error" => "Berechtigungsfehler", "This property has to be non-empty." => "Dieses Feld darf nicht leer sein.", "Couldn't serialize elements." => "Konnte Elemente nicht serialisieren", -"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' wurde ohne Argumente aufgerufen, bitte melde dies auf bugs.owncloud.org", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' wurde ohne Argumente aufgerufen. Bitte melden Sie dies auf bugs.owncloud.org", "Edit name" => "Name ändern", -"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die du hochladen willst, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.", +"No files selected for upload." => "Keine Datei(en) zum Hochladen ausgewählt.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Die Datei, die Sie hochladen möchten, überschreitet die maximale Größe für Datei-Uploads auf diesem Server.", "Error loading profile picture." => "Fehler beim Laden des Profilbildes.", "Select type" => "Wähle Typ", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Einige zum Löschen markiert Kontakte wurden noch nicht gelöscht. Bitte warten.", +"Do you want to merge these address books?" => "Möchten Sie diese Adressbücher zusammenführen?", "Result: " => "Ergebnis: ", " imported, " => " importiert, ", " failed." => " fehlgeschlagen.", "Displayname cannot be empty." => "Der Anzeigename darf nicht leer sein.", "Addressbook not found: " => "Adressbuch nicht gefunden:", -"This is not your addressbook." => "Dies ist nicht dein Adressbuch.", +"This is not your addressbook." => "Dies ist nicht Ihr Adressbuch.", "Contact could not be found." => "Kontakt konnte nicht gefunden werden.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "E-Mail", -"Organization" => "Organisation", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Arbeit", "Home" => "Zuhause", +"Other" => "Andere", "Mobile" => "Mobil", "Text" => "Text", "Voice" => "Anruf", @@ -93,12 +105,13 @@ "Journey" => "Reise", "Jubilee" => "Jubiläum", "Meeting" => "Besprechung", -"Other" => "Andere", "Personal" => "Persönlich", "Projects" => "Projekte", "Questions" => "Fragen", "{name}'s Birthday" => "Geburtstag von {name}", "Contact" => "Kontakt", +"You do not have the permissions to edit this contact." => "Sie besitzen nicht die erforderlichen Rechte, um diesen Kontakt zu bearbeiten.", +"You do not have the permissions to delete this contact." => "Sie besitzen nicht die erforderlichen Rechte, um diesen Kontakte zu löschen.", "Add Contact" => "Kontakt hinzufügen", "Import" => "Importieren", "Settings" => "Einstellungen", @@ -116,13 +129,14 @@ "Add new contact" => "Neuen Kontakt hinzufügen", "Add new addressbook" => "Neues Adressbuch hinzufügen", "Delete current contact" => "Aktuellen Kontakt löschen", -"Drop photo to upload" => "Zieh' ein Foto hierher zum Hochladen", +"Drop photo to upload" => "Ziehen Sie ein Foto zum Hochladen hierher", "Delete current photo" => "Derzeitiges Foto löschen", "Edit current photo" => "Foto ändern", "Upload new photo" => "Neues Foto hochladen", "Select photo from ownCloud" => "Foto aus der ownCloud auswählen", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts oder Rückwärts mit Komma", "Edit name details" => "Name ändern", +"Organization" => "Organisation", "Delete" => "Löschen", "Nickname" => "Spitzname", "Enter nickname" => "Spitzname angeben", @@ -140,11 +154,16 @@ "Delete email address" => "E-Mail-Adresse löschen", "Enter phone number" => "Telefonnummer angeben", "Delete phone number" => "Telefonnummer löschen", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "IM löschen", "View on map" => "Auf Karte anzeigen", "Edit address details" => "Adressinformationen ändern", "Add notes here." => "Füge hier Notizen ein.", "Add field" => "Feld hinzufügen", "Phone" => "Telefon", +"Email" => "E-Mail", +"Instant Messaging" => "Instant Messaging", +"Address" => "Adresse", "Note" => "Notiz", "Download contact" => "Kontakt herunterladen", "Delete contact" => "Kontakt löschen", @@ -169,12 +188,12 @@ "Mr" => "Herr", "Sir" => "Herr", "Mrs" => "Frau", -"Dr" => "Dr", +"Dr" => "Dr.", "Given name" => "Vorname", "Additional names" => "Zusätzliche Namen", "Family name" => "Familienname", "Hon. suffixes" => "Höflichkeitssuffixe", -"J.D." => "Dr. Jur", +"J.D." => "Dr. Jur.", "M.D." => "Dr. med.", "D.O." => "DGOM", "D.C." => "MChiro", @@ -187,18 +206,18 @@ "create a new addressbook" => "Neues Adressbuch erstellen", "Name of new addressbook" => "Name des neuen Adressbuchs", "Importing contacts" => "Kontakte werden importiert", -"You have no contacts in your addressbook." => "Du hast keine Kontakte im Adressbuch.", +"You have no contacts in your addressbook." => "Sie haben keine Kontakte im Adressbuch.", "Add contact" => "Kontakt hinzufügen", -"Configure addressbooks" => "Adressbücher konfigurieren", "Select Address Books" => "Wähle Adressbuch", "Enter name" => "Name eingeben", "Enter description" => "Beschreibung eingeben", "CardDAV syncing addresses" => "CardDAV Sync-Adressen", -"more info" => "mehr Info", -"Primary address (Kontact et al)" => "primäre Adresse (für Kontakt o.ä. Programme)", +"more info" => "mehr Informationen", +"Primary address (Kontact et al)" => "Primäre Adresse (für Kontakt o.ä.)", "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "CardDav-Link anzeigen", "Show read-only VCF link" => "Schreibgeschützten VCF-Link anzeigen", +"Share" => "Teilen", "Download" => "Herunterladen", "Edit" => "Bearbeiten", "New Address Book" => "Neues Adressbuch", diff --git a/apps/contacts/l10n/el.php b/apps/contacts/l10n/el.php index 2f31bccbf2..edca7d7b96 100644 --- a/apps/contacts/l10n/el.php +++ b/apps/contacts/l10n/el.php @@ -14,15 +14,14 @@ "Cannot add empty property." => "Αδύνατη προσθήκη κενής ιδιότητας.", "At least one of the address fields has to be filled out." => "Πρέπει να συμπληρωθεί τουλάχιστον ένα από τα παιδία διεύθυνσης.", "Trying to add duplicate property: " => "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:", -"Error adding contact property: " => "Σφάλμα στη προσθήκη ιδιότητας επαφής", +"Missing IM parameter." => "Λείπει IM παράμετρος.", +"Unknown IM: " => "Άγνωστο IM:", "Information about vCard is incorrect. Please reload the page." => "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα.", -"Error deleting contact property." => "Σφάλμα διαγραφής ιδιότητας επαφής.", "Missing ID" => "Λείπει ID", "Error parsing VCard for ID: \"" => "Σφάλμα κατά την ανάγνωση του VCard για το ID:\"", "checksum is not set." => "δε ορίστηκε checksum ", "Information about vCard is incorrect. Please reload the page: " => "Οι πληροφορίες για τη vCard είναι λανθασμένες.Παρακαλώ ξαναφορτώστε τη σελίδα: ", "Something went FUBAR. " => "Κάτι χάθηκε στο άγνωστο. ", -"Error updating contact property." => "Σφάλμα ενημέρωσης ιδιότητας επαφής.", "No contact ID was submitted." => "Δε υπεβλήθει ID επαφής", "Error reading contact photo." => "Σφάλμα ανάγνωσης εικόνας επαφής", "Error saving temporary file." => "Σφάλμα αποθήκευσης προσωρινού αρχείου", @@ -53,25 +52,41 @@ "Not implemented" => "Δεν έχει υλοποιηθεί", "Couldn't get a valid address." => "Αδυναμία λήψης έγκυρης διεύθυνσης", "Error" => "Σφάλμα", +"You do not have permission to add contacts to " => "Δεν έχετε επαρκή δικαιώματα για προσθέσετε επαφές στο ", +"Please select one of your own address books." => "Παρακαλούμε επιλέξτε ένα από τα δικάς σας βιβλία διευθύνσεων.", +"Permission error" => "Σφάλμα δικαιωμάτων", "This property has to be non-empty." => "Το πεδίο δεν πρέπει να είναι άδειο.", "Couldn't serialize elements." => "Αδύνατο να μπουν σε σειρά τα στοιχεία", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "το 'deleteProperty' καλέστηκε χωρίς without type argument. Παρακαλώ αναφέρατε στο bugs.owncloud.org", "Edit name" => "Αλλαγή ονόματος", "No files selected for upload." => "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server.", +"Error loading profile picture." => "Σφάλμα στην φόρτωση εικόνας προφίλ.", "Select type" => "Επιλογή τύπου", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Κάποιες επαφές σημειώθηκαν προς διαγραφή,δεν έχουν διαγραφεί ακόμα. Παρακαλώ περιμένετε μέχρι να διαγραφούν.", +"Do you want to merge these address books?" => "Επιθυμείτε να συγχωνεύσετε αυτά τα δύο βιβλία διευθύνσεων?", "Result: " => "Αποτέλεσμα: ", " imported, " => " εισάγεται,", " failed." => " απέτυχε.", +"Displayname cannot be empty." => "Το όνομα προβολής δεν μπορεί να είναι κενό. ", +"Addressbook not found: " => "Το βιβλίο διευθύνσεων δεν βρέθηκε:", "This is not your addressbook." => "Αυτό δεν είναι το βιβλίο διευθύνσεων σας.", "Contact could not be found." => "Η επαφή δεν μπόρεσε να βρεθεί.", -"Address" => "Διεύθυνση", -"Telephone" => "Τηλέφωνο", -"Email" => "Email", -"Organization" => "Οργανισμός", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Εργασία", "Home" => "Σπίτι", +"Other" => "Άλλο", "Mobile" => "Κινητό", "Text" => "Κείμενο", "Voice" => "Ομιλία", @@ -90,12 +105,13 @@ "Journey" => "Ταξίδι", "Jubilee" => "Ιωβηλαίο", "Meeting" => "Συνάντηση", -"Other" => "Άλλο", "Personal" => "Προσωπικό", "Projects" => "Έργα", "Questions" => "Ερωτήσεις", "{name}'s Birthday" => "{name} έχει Γενέθλια", "Contact" => "Επαφή", +"You do not have the permissions to edit this contact." => "Δεν διαθέτε επαρκή δικαιώματα για την επεξεργασία αυτής της επαφής.", +"You do not have the permissions to delete this contact." => "Δεν διαθέτε επαρκή δικαιώματα για την διαγραφή αυτής της επαφής.", "Add Contact" => "Προσθήκη επαφής", "Import" => "Εισαγωγή", "Settings" => "Ρυθμίσεις", @@ -106,6 +122,8 @@ "Next contact in list" => "Επόμενη επαφή στη λίστα", "Previous contact in list" => "Προηγούμενη επαφή στη λίστα", "Expand/collapse current addressbook" => "Ανάπτυξη/σύμπτυξη τρέχοντος βιβλίου διευθύνσεων", +"Next addressbook" => "Επόμενο βιβλίο διευθύνσεων", +"Previous addressbook" => "Προηγούμενο βιβλίο διευθύνσεων", "Actions" => "Ενέργειες", "Refresh contacts list" => "Ανανέωσε τη λίστα επαφών", "Add new contact" => "Προσθήκη νέας επαφής", @@ -118,6 +136,7 @@ "Select photo from ownCloud" => "Επέλεξε φωτογραφία από το ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αντίστροφο με κόμμα", "Edit name details" => "Αλλάξτε τις λεπτομέρειες ονόματος", +"Organization" => "Οργανισμός", "Delete" => "Διαγραφή", "Nickname" => "Παρατσούκλι", "Enter nickname" => "Εισάγετε παρατσούκλι", @@ -135,11 +154,16 @@ "Delete email address" => "Διαγραφή διεύθυνση email", "Enter phone number" => "Εισήγαγε αριθμό τηλεφώνου", "Delete phone number" => "Διέγραψε αριθμό τηλεφώνου", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "Διαγραφή IM", "View on map" => "Προβολή στο χάρτη", "Edit address details" => "Επεξεργασία λεπτομερειών διεύθυνσης", "Add notes here." => "Πρόσθεσε τις σημειώσεις εδώ", "Add field" => "Προσθήκη πεδίου", "Phone" => "Τηλέφωνο", +"Email" => "Email", +"Instant Messaging" => "Άμεσα μυνήματα", +"Address" => "Διεύθυνση", "Note" => "Σημείωση", "Download contact" => "Λήψη επαφής", "Delete contact" => "Διαγραφή επαφής", @@ -182,9 +206,14 @@ "create a new addressbook" => "Δημιουργία νέου βιβλίου διευθύνσεων", "Name of new addressbook" => "Όνομα νέου βιβλίου διευθύνσεων", "Importing contacts" => "Εισαγωγή επαφών", +"Contacts imported successfully" => "Οι επαφές εισήχθησαν επιτυχώς", +"Close Dialog" => "Κλείσιμο διαλόγου", +"Import Addressbook" => "Εισαγωγή βιβλίου διευθύνσεων", +"Select address book to import to:" => "Επέλεξε σε ποιο βιβλίο διευθύνσεων για εισαγωγή:", +"Drop a VCF file to import contacts." => "Εισάγεται ένα VCF αρχείο για εισαγωγή επαφών", +"Select from HD" => "Επιλογή από HD", "You have no contacts in your addressbook." => "Δεν έχεις επαφές στο βιβλίο διευθύνσεων", "Add contact" => "Προσθήκη επαφής", -"Configure addressbooks" => "Ρύθμισε το βιβλίο διευθύνσεων", "Select Address Books" => "Επέλεξε βιβλίο διευθύνσεων", "Enter name" => "Εισαγωγή ονόματος", "Enter description" => "Εισαγωγή περιγραφής", @@ -192,6 +221,9 @@ "more info" => "περισσότερες πληροφορίες", "Primary address (Kontact et al)" => "Κύρια διεύθυνση", "iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Εμφάνιση συνδέσμου CardDav", +"Show read-only VCF link" => "Εμφάνιση συνδέσμου VCF μόνο για ανάγνωση", +"Share" => "Μοιράσου", "Download" => "Λήψη", "Edit" => "Επεξεργασία", "New Address Book" => "Νέο βιβλίο διευθύνσεων", diff --git a/apps/contacts/l10n/eo.php b/apps/contacts/l10n/eo.php index 33c0106d5a..e4eb06db2a 100644 --- a/apps/contacts/l10n/eo.php +++ b/apps/contacts/l10n/eo.php @@ -10,18 +10,16 @@ "No contacts found." => "Neniu kontakto troviĝis.", "There was an error adding the contact." => "Eraro okazis dum aldono de kontakto.", "element name is not set." => "eronomo ne agordiĝis.", +"Could not parse contact: " => "Ne eblis analizi kontakton:", "Cannot add empty property." => "Ne eblas aldoni malplenan propraĵon.", "At least one of the address fields has to be filled out." => "Almenaŭ unu el la adreskampoj necesas pleniĝi.", "Trying to add duplicate property: " => "Provante aldoni duobligitan propraĵon:", -"Error adding contact property: " => "Eraro aldonante kontakta propraĵo:", "Information about vCard is incorrect. Please reload the page." => "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon.", -"Error deleting contact property." => "Eraro dum forigo de kontaktopropraĵo.", "Missing ID" => "Mankas identigilo", "Error parsing VCard for ID: \"" => "Eraro dum analizo de VCard por identigilo:", "checksum is not set." => "kontrolsumo ne agordiĝis.", "Information about vCard is incorrect. Please reload the page: " => "Informo pri vCard malĝustas. Bonvolu reŝargi la paĝon:", "Something went FUBAR. " => "Io FUBAR-is.", -"Error updating contact property." => "Eraro dum ĝisdatigo de kontaktopropraĵo.", "No contact ID was submitted." => "Neniu kontaktidentigilo sendiĝis.", "Error reading contact photo." => "Eraro dum lego de kontakta foto.", "Error saving temporary file." => "Eraro dum konservado de provizora dosiero.", @@ -53,6 +51,7 @@ "Couldn't get a valid address." => "Ne eblis ekhavi validan adreson.", "Error" => "Eraro", "This property has to be non-empty." => "Ĉi tiu propraĵo devas ne esti malplena.", +"Couldn't serialize elements." => "Ne eblis seriigi erojn.", "Edit name" => "Redakti nomon", "No files selected for upload." => "Neniu dosiero elektita por alŝuto.", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "La dosiero, kiun vi provas alŝuti, transpasas la maksimuman grandon por dosieraj alŝutoj en ĉi tiu servilo.", @@ -63,12 +62,9 @@ "Addressbook not found: " => "Adresaro ne troviĝis:", "This is not your addressbook." => "Ĉi tiu ne estas via adresaro.", "Contact could not be found." => "Ne eblis trovi la kontakton.", -"Address" => "Adreso", -"Telephone" => "Telefono", -"Email" => "Retpoŝtadreso", -"Organization" => "Organizaĵo", "Work" => "Laboro", "Home" => "Hejmo", +"Other" => "Alia", "Mobile" => "Poŝtelefono", "Text" => "Teksto", "Voice" => "Voĉo", @@ -81,10 +77,12 @@ "Business" => "Negoco", "Call" => "Voko", "Clients" => "Klientoj", +"Deliverer" => "Liveranto", "Holidays" => "Ferioj", "Ideas" => "Ideoj", +"Journey" => "Vojaĝo", +"Jubilee" => "Jubileo", "Meeting" => "Kunveno", -"Other" => "Alia", "Personal" => "Persona", "Projects" => "Projektoj", "Questions" => "Demandoj", @@ -97,10 +95,10 @@ "Close" => "Fermi", "Keyboard shortcuts" => "Fulmoklavoj", "Navigation" => "Navigado", -"Next contact in list" => "Sekva kontakto en la listo", -"Previous contact in list" => "Malsekva kontakto en la listo", -"Next addressbook" => "Sekva adresaro", -"Previous addressbook" => "Malsekva adresaro", +"Next contact in list" => "Jena kontakto en la listo", +"Previous contact in list" => "Maljena kontakto en la listo", +"Next addressbook" => "Jena adresaro", +"Previous addressbook" => "Maljena adresaro", "Actions" => "Agoj", "Refresh contacts list" => "Refreŝigi la kontaktoliston", "Add new contact" => "Aldoni novan kontakton", @@ -113,6 +111,7 @@ "Select photo from ownCloud" => "Elekti foton el ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo", "Edit name details" => "Redakti detalojn de nomo", +"Organization" => "Organizaĵo", "Delete" => "Forigi", "Nickname" => "Kromnomo", "Enter nickname" => "Enigu kromnomon", @@ -135,6 +134,8 @@ "Add notes here." => "Aldoni notojn ĉi tie.", "Add field" => "Aldoni kampon", "Phone" => "Telefono", +"Email" => "Retpoŝtadreso", +"Address" => "Adreso", "Note" => "Noto", "Download contact" => "Elŝuti kontakton", "Delete contact" => "Forigi kontakton", @@ -169,7 +170,6 @@ "Importing contacts" => "Enportante kontaktojn", "You have no contacts in your addressbook." => "Vi ne havas kontaktojn en via adresaro", "Add contact" => "Aldoni kontakton", -"Configure addressbooks" => "Agordi adresarojn", "Select Address Books" => "Elektu adresarojn", "Enter name" => "Enigu nomon", "Enter description" => "Enigu priskribon", diff --git a/apps/contacts/l10n/es.php b/apps/contacts/l10n/es.php index ebc38dfb3e..c80c2987e1 100644 --- a/apps/contacts/l10n/es.php +++ b/apps/contacts/l10n/es.php @@ -13,14 +13,14 @@ "Cannot add empty property." => "No se puede añadir una propiedad vacía.", "At least one of the address fields has to be filled out." => "Al menos uno de los campos de direcciones se tiene que rellenar.", "Trying to add duplicate property: " => "Intentando añadir una propiedad duplicada: ", +"Missing IM parameter." => "Falta un parámetro del MI.", +"Unknown IM: " => "MI desconocido:", "Information about vCard is incorrect. Please reload the page." => "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página.", -"Error deleting contact property." => "Error al borrar una propiedad del contacto.", "Missing ID" => "Falta la ID", "Error parsing VCard for ID: \"" => "Error al analizar el VCard para la ID: \"", "checksum is not set." => "no se ha puesto ninguna suma de comprobación.", "Information about vCard is incorrect. Please reload the page: " => "La información sobre la vCard es incorrecta. Por favor, recarga la página:", "Something went FUBAR. " => "Plof. Algo ha fallado.", -"Error updating contact property." => "Error al actualizar una propiedad del contacto.", "No contact ID was submitted." => "No se ha mandado ninguna ID de contacto.", "Error reading contact photo." => "Error leyendo fotografía del contacto.", "Error saving temporary file." => "Error al guardar archivo temporal.", @@ -63,12 +63,21 @@ " failed." => "Fallo.", "This is not your addressbook." => "Esta no es tu agenda de contactos.", "Contact could not be found." => "No se ha podido encontrar el contacto.", -"Address" => "Dirección", -"Telephone" => "Teléfono", -"Email" => "Correo electrónico", -"Organization" => "Organización", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "Google Talk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Trabajo", "Home" => "Particular", +"Other" => "Otro", "Mobile" => "Móvil", "Text" => "Texto", "Voice" => "Voz", @@ -85,7 +94,6 @@ "Ideas" => "Ideas", "Journey" => "Jornada", "Meeting" => "Reunión", -"Other" => "Otro", "Personal" => "Personal", "Projects" => "Proyectos", "Questions" => "Preguntas", @@ -103,6 +111,7 @@ "Actions" => "Acciones", "Refresh contacts list" => "Refrescar la lista de contactos", "Add new contact" => "Añadir un nuevo contacto", +"Add new addressbook" => "Añadir nueva libreta de direcciones", "Delete current contact" => "Eliminar contacto actual", "Drop photo to upload" => "Suelta una foto para subirla", "Delete current photo" => "Eliminar fotografía actual", @@ -111,10 +120,13 @@ "Select photo from ownCloud" => "Seleccionar fotografía desde ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, nombre abreviado, nombre completo, al revés o al revés con coma", "Edit name details" => "Editar los detalles del nombre", +"Organization" => "Organización", "Delete" => "Borrar", "Nickname" => "Alias", "Enter nickname" => "Introduce un alias", "Web site" => "Sitio Web", +"http://www.somesite.com" => "http://www.unsitio.com", +"Go to web site" => "Ir al sitio Web", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Grupos", "Separate groups with commas" => "Separa los grupos con comas", @@ -126,11 +138,15 @@ "Delete email address" => "Eliminar dirección de correo electrónico", "Enter phone number" => "Introduce un número de teléfono", "Delete phone number" => "Eliminar número de teléfono", +"Instant Messenger" => "Mensajero instantáneo", "View on map" => "Ver en el mapa", "Edit address details" => "Editar detalles de la dirección", "Add notes here." => "Añade notas aquí.", "Add field" => "Añadir campo", "Phone" => "Teléfono", +"Email" => "Correo electrónico", +"Instant Messaging" => "Mensajería instantánea", +"Address" => "Dirección", "Note" => "Nota", "Download contact" => "Descargar contacto", "Delete contact" => "Eliminar contacto", @@ -138,9 +154,12 @@ "Edit address" => "Editar dirección", "Type" => "Tipo", "PO Box" => "Código postal", +"Street and number" => "Calle y número", "Extended" => "Extendido", +"Apartment number etc." => "Número del apartamento, etc.", "City" => "Ciudad", "Region" => "Región", +"E.g. state or province" => "Ej: región o provincia", "Zipcode" => "Código postal", "Postal code" => "Código postal", "Country" => "País", @@ -169,15 +188,21 @@ "create a new addressbook" => "crear una nueva agenda", "Name of new addressbook" => "Nombre de la nueva agenda", "Importing contacts" => "Importando contactos", +"Contacts imported successfully" => "Contactos importados correctamente", +"Close Dialog" => "Cerrar Diálogo", +"Import Addressbook" => "Importar agenda", +"Select address book to import to:" => "Selecciona una agenda para importar a:", +"Drop a VCF file to import contacts." => "Suelta un archivo VCF para importar contactos.", +"Select from HD" => "Seleccionar del disco duro", "You have no contacts in your addressbook." => "No hay contactos en tu agenda.", "Add contact" => "Añadir contacto", -"Configure addressbooks" => "Configurar agenda", "Enter name" => "Introducir nombre", "Enter description" => "Introducir descripción", "CardDAV syncing addresses" => "Sincronizando direcciones", "more info" => "más información", "Primary address (Kontact et al)" => "Dirección primaria (Kontact et al)", "iOS/OS X" => "iOS/OS X", +"Share" => "Compartir", "Download" => "Descargar", "Edit" => "Editar", "New Address Book" => "Nueva libreta de direcciones", diff --git a/apps/contacts/l10n/et_EE.php b/apps/contacts/l10n/et_EE.php index c11ea6d838..e15ea0c10b 100644 --- a/apps/contacts/l10n/et_EE.php +++ b/apps/contacts/l10n/et_EE.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Vähemalt üks aadressiväljadest peab olema täidetud.", "Trying to add duplicate property: " => "Proovitakse lisada topeltomadust: ", "Information about vCard is incorrect. Please reload the page." => "Visiitkaardi info pole korrektne. Palun lae leht uuesti.", -"Error deleting contact property." => "Viga konktaki korralikul kustutamisel.", "Missing ID" => "Puudub ID", "Error parsing VCard for ID: \"" => "Viga VCard-ist ID parsimisel: \"", "checksum is not set." => "kontrollsummat pole määratud.", "Information about vCard is incorrect. Please reload the page: " => "vCard info pole korrektne. Palun lae lehekülg uuesti: ", "Something went FUBAR. " => "Midagi läks tõsiselt metsa.", -"Error updating contact property." => "Viga konktaki korralikul uuendamisel.", "No contact ID was submitted." => "Kontakti ID-d pole sisestatud.", "Error reading contact photo." => "Viga kontakti foto lugemisel.", "Error saving temporary file." => "Viga ajutise faili salvestamisel.", @@ -60,10 +58,6 @@ " failed." => " ebaõnnestus.", "This is not your addressbook." => "See pole sinu aadressiraamat.", "Contact could not be found." => "Kontakti ei leitud.", -"Address" => "Aadress", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisatsioon", "Work" => "Töö", "Home" => "Kodu", "Mobile" => "Mobiil", @@ -88,6 +82,7 @@ "Select photo from ownCloud" => "Vali foto ownCloudist", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastupidine komadega", "Edit name details" => "Muuda nime üksikasju", +"Organization" => "Organisatsioon", "Delete" => "Kustuta", "Nickname" => "Hüüdnimi", "Enter nickname" => "Sisesta hüüdnimi", @@ -107,6 +102,8 @@ "Add notes here." => "Lisa märkmed siia.", "Add field" => "Lisa väli", "Phone" => "Telefon", +"Email" => "E-post", +"Address" => "Aadress", "Note" => "Märkus", "Download contact" => "Lae kontakt alla", "Delete contact" => "Kustuta kontakt", @@ -144,9 +141,14 @@ "create a new addressbook" => "loo uus aadressiraamat", "Name of new addressbook" => "Uue aadressiraamatu nimi", "Importing contacts" => "Kontaktide importimine", +"Contacts imported successfully" => "Kontaktid on imporditud", +"Close Dialog" => "Sulge dialoog", +"Import Addressbook" => "Impordi aadressiraamat", +"Select address book to import to:" => "Vali aadressiraamat, millesse importida:", +"Drop a VCF file to import contacts." => "Lohista siia VCF-fail, millest kontakte importida.", +"Select from HD" => "Vali kõvakettalt", "You have no contacts in your addressbook." => "Sinu aadressiraamatus pole ühtegi kontakti.", "Add contact" => "Lisa kontakt", -"Configure addressbooks" => "Seadista aadressiraamatuid", "CardDAV syncing addresses" => "CardDAV sünkroniseerimise aadressid", "more info" => "lisainfo", "Primary address (Kontact et al)" => "Peamine aadress", diff --git a/apps/contacts/l10n/eu.php b/apps/contacts/l10n/eu.php index 7a0b2ce38b..b676b45c0f 100644 --- a/apps/contacts/l10n/eu.php +++ b/apps/contacts/l10n/eu.php @@ -14,14 +14,11 @@ "Cannot add empty property." => "Ezin da propieta hutsa gehitu.", "At least one of the address fields has to be filled out." => "Behintzat helbide eremuetako bat bete behar da.", "Trying to add duplicate property: " => "Propietate bikoiztuta gehitzen saiatzen ari zara:", -"Error adding contact property: " => "Errore bat egon da kontaktuaren propietatea gehitzean:", "Information about vCard is incorrect. Please reload the page." => "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea.", -"Error deleting contact property." => "Errorea kontaktu propietatea ezabatzean.", "Missing ID" => "ID falta da", "Error parsing VCard for ID: \"" => "Errorea VCard analizatzean hurrengo IDrako: \"", "checksum is not set." => "Kontrol-batura ezarri gabe dago.", "Information about vCard is incorrect. Please reload the page: " => "vCard honen informazioa ez da zuzena.Mezedez birkargatu orria:", -"Error updating contact property." => "Errorea kontaktu propietatea eguneratzean.", "No contact ID was submitted." => "Ez da kontaktuaren IDrik eman.", "Error reading contact photo." => "Errore bat izan da kontaktuaren argazkia igotzerakoan.", "Error saving temporary file." => "Errore bat izan da aldi bateko fitxategia gordetzerakoan.", @@ -64,12 +61,9 @@ " failed." => "huts egin du.", "This is not your addressbook." => "Hau ez da zure helbide liburua.", "Contact could not be found." => "Ezin izan da kontaktua aurkitu.", -"Address" => "Helbidea", -"Telephone" => "Telefonoa", -"Email" => "Eposta", -"Organization" => "Erakundea", "Work" => "Lana", "Home" => "Etxea", +"Other" => "Bestelakoa", "Mobile" => "Mugikorra", "Text" => "Testua", "Voice" => "Ahotsa", @@ -85,7 +79,6 @@ "Ideas" => "Ideiak", "Journey" => "Bidaia", "Meeting" => "Bilera", -"Other" => "Bestelakoa", "Personal" => "Pertsonala", "Projects" => "Proiektuak", "Questions" => "Galderak", @@ -112,6 +105,7 @@ "Upload new photo" => "Igo argazki berria", "Select photo from ownCloud" => "Hautatu argazki bat ownCloudetik", "Edit name details" => "Editatu izenaren zehaztasunak", +"Organization" => "Erakundea", "Delete" => "Ezabatu", "Nickname" => "Ezizena", "Enter nickname" => "Sartu ezizena", @@ -134,6 +128,8 @@ "Add notes here." => "Gehitu oharrak hemen.", "Add field" => "Gehitu eremua", "Phone" => "Telefonoa", +"Email" => "Eposta", +"Address" => "Helbidea", "Note" => "Oharra", "Download contact" => "Deskargatu kontaktua", "Delete contact" => "Ezabatu kontaktua", @@ -156,9 +152,14 @@ "create a new addressbook" => "sortu helbide liburu berria", "Name of new addressbook" => "Helbide liburuaren izena", "Importing contacts" => "Kontaktuak inportatzen", +"Contacts imported successfully" => "Kontaktuak ongi inportatu dira", +"Close Dialog" => "Dialogoa itxi", +"Import Addressbook" => "Inporatu helbide liburua", +"Select address book to import to:" => "Hautau helburuko helbide liburua:", +"Drop a VCF file to import contacts." => "Askatu VCF fitxategia kontaktuak inportatzeko.", +"Select from HD" => "Hautatu disko gogorretik", "You have no contacts in your addressbook." => "Ez duzu kontakturik zure helbide liburuan.", "Add contact" => "Gehitu kontaktua", -"Configure addressbooks" => "Konfiguratu helbide liburuak", "Select Address Books" => "Hautatu helbide-liburuak", "Enter name" => "Sartu izena", "Enter description" => "Sartu deskribapena", diff --git a/apps/contacts/l10n/fa.php b/apps/contacts/l10n/fa.php index c959979857..9ee6ee5466 100644 --- a/apps/contacts/l10n/fa.php +++ b/apps/contacts/l10n/fa.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "At least one of the address fields has to be filled out. ", "Trying to add duplicate property: " => "امتحان کردن برای وارد کردن مشخصات تکراری", "Information about vCard is incorrect. Please reload the page." => "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید", -"Error deleting contact property." => "خطا در هنگام پاک کرد ویژگی", "Missing ID" => "نشانی گم شده", "Error parsing VCard for ID: \"" => "خطا در تجزیه کارت ویزا برای شناسه:", "checksum is not set." => "checksum تنظیم شده نیست", "Information about vCard is incorrect. Please reload the page: " => "اطلاعات کارت ویزا شما غلط است لطفا صفحه را دوباره بارگزاری کنید", "Something went FUBAR. " => "چند چیز به FUBAR رفتند", -"Error updating contact property." => "خطا در هنگام بروزرسانی اطلاعات شخص مورد نظر", "No contact ID was submitted." => "هیچ اطلاعاتی راجع به شناسه ارسال نشده", "Error reading contact photo." => "خطا در خواندن اطلاعات تصویر", "Error saving temporary file." => "خطا در ذخیره پرونده موقت", @@ -63,10 +61,6 @@ " failed." => "ناموفق", "This is not your addressbook." => "این کتابچه ی نشانه های شما نیست", "Contact could not be found." => "اتصال ویا تماسی یافت نشد", -"Address" => "نشانی", -"Telephone" => "تلفن", -"Email" => "نشانی پست الکترنیک", -"Organization" => "نهاد(ارگان)", "Work" => "کار", "Home" => "خانه", "Mobile" => "موبایل", @@ -91,6 +85,7 @@ "Select photo from ownCloud" => "انتخاب یک تصویر از ابر های شما", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma", "Edit name details" => "ویرایش نام جزئیات", +"Organization" => "نهاد(ارگان)", "Delete" => "پاک کردن", "Nickname" => "نام مستعار", "Enter nickname" => "یک نام مستعار وارد کنید", @@ -110,6 +105,8 @@ "Add notes here." => "اینجا یادداشت ها را بیافزایید", "Add field" => "اضافه کردن فیلد", "Phone" => "شماره تلفن", +"Email" => "نشانی پست الکترنیک", +"Address" => "نشانی", "Note" => "یادداشت", "Download contact" => "دانلود مشخصات اشخاص", "Delete contact" => "پاک کردن اطلاعات شخص مورد نظر", @@ -147,9 +144,14 @@ "create a new addressbook" => "یک کتابچه نشانی بسازید", "Name of new addressbook" => "نام کتابچه نشانی جدید", "Importing contacts" => "وارد کردن اشخاص", +"Contacts imported successfully" => "اشخاص با موفقیت افزوده شدند", +"Close Dialog" => "بستن دیالوگ", +"Import Addressbook" => "وارد کردن کتابچه نشانی", +"Select address book to import to:" => "یک کتابچه نشانی انتخاب کنید تا وارد شود", +"Drop a VCF file to import contacts." => "یک پرونده VCF را به اینجا بکشید تا اشخاص افزوده شوند", +"Select from HD" => "انتخاب از دیسک سخت", "You have no contacts in your addressbook." => "شماهیچ شخصی در کتابچه نشانی خود ندارید", "Add contact" => "افزودن اطلاعات شخص مورد نظر", -"Configure addressbooks" => "پیکربندی کتابچه ی نشانی ها", "CardDAV syncing addresses" => "CardDAV syncing addresses ", "more info" => "اطلاعات بیشتر", "Primary address (Kontact et al)" => "نشانی اولیه", diff --git a/apps/contacts/l10n/fi_FI.php b/apps/contacts/l10n/fi_FI.php index 069b08144e..23cafe44dc 100644 --- a/apps/contacts/l10n/fi_FI.php +++ b/apps/contacts/l10n/fi_FI.php @@ -8,9 +8,7 @@ "Cannot add empty property." => "Tyhjää ominaisuutta ei voi lisätä.", "At least one of the address fields has to be filled out." => "Vähintään yksi osoitekenttä tulee täyttää.", "Information about vCard is incorrect. Please reload the page." => "vCardin tiedot eivät kelpaa. Lataa sivu uudelleen.", -"Error deleting contact property." => "Virhe poistettaessa yhteystiedon ominaisuutta.", "Error parsing VCard for ID: \"" => "Virhe jäsennettäessä vCardia tunnisteelle: \"", -"Error updating contact property." => "Virhe päivitettäessä yhteystiedon ominaisuutta.", "Error saving temporary file." => "Virhe tallennettaessa tilapäistiedostoa.", "No photo path was submitted." => "Kuvan polkua ei annettu.", "File doesn't exist:" => "Tiedostoa ei ole olemassa:", @@ -31,19 +29,32 @@ "Error" => "Virhe", "Edit name" => "Muokkaa nimeä", "No files selected for upload." => "Tiedostoja ei ole valittu lähetettäväksi.", +"Error loading profile picture." => "Virhe profiilikuvaa ladatessa.", +"Select type" => "Valitse tyyppi", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Jotkin yhteystiedot on merkitty poistettaviksi, mutta niitä ei ole vielä poistettu. Odota hetki, että kyseiset yhteystiedot poistetaan.", +"Do you want to merge these address books?" => "Haluatko yhdistää nämä osoitekirjat?", "Result: " => "Tulos: ", " imported, " => " tuotu, ", " failed." => " epäonnistui.", +"Displayname cannot be empty." => "Näyttönimi ei voi olla tyhjä.", "Addressbook not found: " => "Osoitekirjaa ei löytynyt:", "This is not your addressbook." => "Tämä ei ole osoitekirjasi.", "Contact could not be found." => "Yhteystietoa ei löytynyt.", -"Address" => "Osoite", -"Telephone" => "Puhelin", -"Email" => "Sähköposti", -"Organization" => "Organisaatio", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "Google Talk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Työ", "Home" => "Koti", +"Other" => "Muu", "Mobile" => "Mobiili", "Text" => "Teksti", "Voice" => "Ääni", @@ -54,7 +65,6 @@ "Internet" => "Internet", "Birthday" => "Syntymäpäivä", "Business" => "Työ", -"Other" => "Muu", "Questions" => "Kysymykset", "{name}'s Birthday" => "Henkilön {name} syntymäpäivä", "Contact" => "Yhteystieto", @@ -78,6 +88,7 @@ "Upload new photo" => "Lähetä uusi valokuva", "Select photo from ownCloud" => "Valitse valokuva ownCloudista", "Edit name details" => "Muokkaa nimitietoja", +"Organization" => "Organisaatio", "Delete" => "Poista", "Nickname" => "Kutsumanimi", "Enter nickname" => "Anna kutsumanimi", @@ -90,14 +101,18 @@ "Preferred" => "Ensisijainen", "Please specify a valid email address." => "Anna kelvollinen sähköpostiosoite.", "Enter email address" => "Anna sähköpostiosoite", +"Mail to address" => "Lähetä sähköpostia", "Delete email address" => "Poista sähköpostiosoite", "Enter phone number" => "Anna puhelinnumero", "Delete phone number" => "Poista puhelinnumero", +"Instant Messenger" => "Pikaviestin", "View on map" => "Näytä kartalla", "Edit address details" => "Muokkaa osoitetietoja", "Add notes here." => "Lisää huomiot tähän.", "Add field" => "Lisää kenttä", "Phone" => "Puhelin", +"Email" => "Sähköposti", +"Address" => "Osoite", "Note" => "Huomio", "Download contact" => "Lataa yhteystieto", "Delete contact" => "Poista yhteystieto", @@ -125,7 +140,6 @@ "Importing contacts" => "Tuodaan yhteystietoja", "You have no contacts in your addressbook." => "Osoitekirjassasi ei ole yhteystietoja.", "Add contact" => "Lisää yhteystieto", -"Configure addressbooks" => "Muokkaa osoitekirjoja", "Select Address Books" => "Valitse osoitekirjat", "Enter name" => "Anna nimi", "Enter description" => "Anna kuvaus", @@ -133,6 +147,7 @@ "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "Näytä CardDav-linkki", "Show read-only VCF link" => "Näytä vain luku -muodossa oleva VCF-linkki", +"Share" => "Jaa", "Download" => "Lataa", "Edit" => "Muokkaa", "New Address Book" => "Uusi osoitekirja", diff --git a/apps/contacts/l10n/fr.php b/apps/contacts/l10n/fr.php index 93299380d2..91df9a4b51 100644 --- a/apps/contacts/l10n/fr.php +++ b/apps/contacts/l10n/fr.php @@ -14,15 +14,14 @@ "Cannot add empty property." => "Impossible d'ajouter un champ vide.", "At least one of the address fields has to be filled out." => "Au moins un des champs d'adresses doit être complété.", "Trying to add duplicate property: " => "Ajout d'une propriété en double:", -"Error adding contact property: " => "Erreur pendant l'ajout de la propriété du contact :", +"Missing IM parameter." => "Paramètre de Messagerie Instantanée manquants.", +"Unknown IM: " => "Messagerie Instantanée inconnue", "Information about vCard is incorrect. Please reload the page." => "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page.", -"Error deleting contact property." => "Erreur lors de la suppression du champ.", "Missing ID" => "ID manquant", "Error parsing VCard for ID: \"" => "Erreur lors de l'analyse du VCard pour l'ID: \"", "checksum is not set." => "L'hachage n'est pas défini.", "Information about vCard is incorrect. Please reload the page: " => "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir la page:", "Something went FUBAR. " => "Quelque chose est FUBAR.", -"Error updating contact property." => "Erreur lors de la mise à jour du champ.", "No contact ID was submitted." => "Aucun ID de contact envoyé", "Error reading contact photo." => "Erreur de lecture de la photo du contact.", "Error saving temporary file." => "Erreur de sauvegarde du fichier temporaire.", @@ -49,18 +48,23 @@ "Couldn't load temporary image: " => "Impossible de charger l'image temporaire :", "No file was uploaded. Unknown error" => "Aucun fichier n'a été chargé. Erreur inconnue", "Contacts" => "Contacts", -"Sorry, this functionality has not been implemented yet" => "Désolé cette fonctionnalité n'a pas encore été implementée", +"Sorry, this functionality has not been implemented yet" => "Désolé cette fonctionnalité n'a pas encore été implémentée", "Not implemented" => "Pas encore implémenté", "Couldn't get a valid address." => "Impossible de trouver une adresse valide.", "Error" => "Erreur", +"You do not have permission to add contacts to " => "Vous n'avez pas l'autorisation d'ajouter des contacts à", +"Please select one of your own address books." => "Veuillez sélectionner l'un de vos carnets d'adresses.", +"Permission error" => "Erreur de permission", "This property has to be non-empty." => "Cette valeur ne doit pas être vide", -"Couldn't serialize elements." => "Impossible de sérialiser les éléments", +"Couldn't serialize elements." => "Impossible de sérialiser les éléments.", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' a été appelé sans type d'arguments. Merci de rapporter un bug à bugs.owncloud.org", "Edit name" => "Éditer le nom", "No files selected for upload." => "Aucun fichiers choisis pour être chargés", -"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Le fichier que vous tenter de charger dépasse la taille maximum de fichier autorisé sur ce serveur.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Le fichier que vous tentez de charger dépasse la taille maximum de fichier autorisée sur ce serveur.", +"Error loading profile picture." => "Erreur pendant le chargement de la photo de profil.", "Select type" => "Sélectionner un type", -"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Certains contacts sont marqués pour être supprimés mais sont encore présents, veuillez attendre que l'opération se termine.", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Certains contacts sont marqués pour être supprimés, mais ne le sont pas encore. Veuillez attendre que l'opération se termine.", +"Do you want to merge these address books?" => "Voulez-vous fusionner ces carnets d'adresses ?", "Result: " => "Résultat :", " imported, " => "importé,", " failed." => "échoué.", @@ -68,12 +72,21 @@ "Addressbook not found: " => "Carnet d'adresse introuvable : ", "This is not your addressbook." => "Ce n'est pas votre carnet d'adresses.", "Contact could not be found." => "Ce contact n'a pu être trouvé.", -"Address" => "Adresse", -"Telephone" => "Téléphone", -"Email" => "E-mail", -"Organization" => "Société", +"Jabber" => "Jabber", +"AIM" => "Messagerie Instantanée", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Travail", -"Home" => "Maison", +"Home" => "Domicile", +"Other" => "Autre", "Mobile" => "Mobile", "Text" => "Texte", "Voice" => "Voix", @@ -92,12 +105,13 @@ "Journey" => "Trajet", "Jubilee" => "Jubilé", "Meeting" => "Rendez-vous", -"Other" => "Autre", "Personal" => "Personnel", "Projects" => "Projets", "Questions" => "Questions", "{name}'s Birthday" => "Anniversaire de {name}", "Contact" => "Contact", +"You do not have the permissions to edit this contact." => "Vous n'avez pas l'autorisation de modifier ce contact.", +"You do not have the permissions to delete this contact." => "Vous n'avez pas l'autorisation de supprimer ce contact.", "Add Contact" => "Ajouter un Contact", "Import" => "Importer", "Settings" => "Paramètres", @@ -122,6 +136,7 @@ "Select photo from ownCloud" => "Sélectionner une photo depuis ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec virgule", "Edit name details" => "Editer les noms", +"Organization" => "Société", "Delete" => "Supprimer", "Nickname" => "Surnom", "Enter nickname" => "Entrer un surnom", @@ -139,11 +154,16 @@ "Delete email address" => "Supprimer l'adresse e-mail", "Enter phone number" => "Entrer un numéro de téléphone", "Delete phone number" => "Supprimer le numéro de téléphone", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "Supprimer la Messagerie Instantanée", "View on map" => "Voir sur une carte", "Edit address details" => "Editer les adresses", "Add notes here." => "Ajouter des notes ici.", "Add field" => "Ajouter un champ.", "Phone" => "Téléphone", +"Email" => "E-mail", +"Instant Messaging" => "Messagerie instantanée", +"Address" => "Adresse", "Note" => "Note", "Download contact" => "Télécharger le contact", "Delete contact" => "Supprimer le contact", @@ -186,9 +206,14 @@ "create a new addressbook" => "Créer un nouveau carnet d'adresses", "Name of new addressbook" => "Nom du nouveau carnet d'adresses", "Importing contacts" => "Importation des contacts", +"Contacts imported successfully" => "Contacts importés avec succes", +"Close Dialog" => "Fermer la boite de dialogue", +"Import Addressbook" => "Importer un carnet d'adresses.", +"Select address book to import to:" => "Selectionner le carnet d'adresses à importer vers:", +"Drop a VCF file to import contacts." => "Glisser un fichier VCF pour importer des contacts.", +"Select from HD" => "Selectionner depuis le disque dur", "You have no contacts in your addressbook." => "Il n'y a pas de contact dans votre carnet d'adresses.", "Add contact" => "Ajouter un contact", -"Configure addressbooks" => "Paramétrer carnet d'adresses", "Select Address Books" => "Choix du carnet d'adresses", "Enter name" => "Saisissez le nom", "Enter description" => "Saisissez une description", @@ -198,6 +223,7 @@ "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "Afficher le lien CardDav", "Show read-only VCF link" => "Afficher les liens VCF en lecture seule", +"Share" => "Partager", "Download" => "Télécharger", "Edit" => "Modifier", "New Address Book" => "Nouveau Carnet d'adresses", diff --git a/apps/contacts/l10n/gl.php b/apps/contacts/l10n/gl.php index 1b456fba01..f25219b22c 100644 --- a/apps/contacts/l10n/gl.php +++ b/apps/contacts/l10n/gl.php @@ -14,12 +14,10 @@ "At least one of the address fields has to be filled out." => "Polo menos un dos campos do enderezo ten que ser cuberto.", "Trying to add duplicate property: " => "Tentando engadir propiedade duplicada: ", "Information about vCard is incorrect. Please reload the page." => "A información sobre a vCard é incorrecta. Por favor volva cargar a páxina.", -"Error deleting contact property." => "Produciuse un erro borrando a propiedade do contacto.", "Missing ID" => "ID perdido", "Error parsing VCard for ID: \"" => "Erro procesando a VCard para o ID: \"", "checksum is not set." => "non se estableceu a suma de verificación.", "Information about vCard is incorrect. Please reload the page: " => "A información sobre a vCard é incorrecta. Por favor, recargue a páxina: ", -"Error updating contact property." => "Produciuse un erro actualizando a propiedade do contacto.", "No contact ID was submitted." => "Non se enviou ningún ID de contacto.", "Error reading contact photo." => "Erro lendo a fotografía do contacto.", "Error saving temporary file." => "Erro gardando o ficheiro temporal.", @@ -62,10 +60,6 @@ " failed." => " fallou.", "This is not your addressbook." => "Esta non é a súa axenda.", "Contact could not be found." => "Non se atopou o contacto.", -"Address" => "Enderezo", -"Telephone" => "Teléfono", -"Email" => "Correo electrónico", -"Organization" => "Organización", "Work" => "Traballo", "Home" => "Casa", "Mobile" => "Móbil", @@ -90,6 +84,7 @@ "Select photo from ownCloud" => "Escoller foto desde ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome corto, Nome completo, Inverso ou Inverso con coma", "Edit name details" => "Editar detalles do nome", +"Organization" => "Organización", "Delete" => "Eliminar", "Nickname" => "Apodo", "Enter nickname" => "Introuza apodo", @@ -109,6 +104,8 @@ "Add notes here." => "Engadir aquí as notas.", "Add field" => "Engadir campo", "Phone" => "Teléfono", +"Email" => "Correo electrónico", +"Address" => "Enderezo", "Note" => "Nota", "Download contact" => "Descargar contacto", "Delete contact" => "Borrar contacto", @@ -148,7 +145,6 @@ "Importing contacts" => "Importando contactos", "You have no contacts in your addressbook." => "Non ten contactos na súa libreta de enderezos.", "Add contact" => "Engadir contacto", -"Configure addressbooks" => "Configurar libretas de enderezos", "CardDAV syncing addresses" => "Enderezos CardDAV a sincronizar", "more info" => "máis información", "Primary address (Kontact et al)" => "Enderezo primario (Kontact et al)", diff --git a/apps/contacts/l10n/he.php b/apps/contacts/l10n/he.php index be67fe8ae8..b224403ad2 100644 --- a/apps/contacts/l10n/he.php +++ b/apps/contacts/l10n/he.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "יש למלא לפחות אחד משדות הכתובת.", "Trying to add duplicate property: " => "ניסיון להוספת מאפיין כפול: ", "Information about vCard is incorrect. Please reload the page." => "המידע אודות vCard אינו נכון. נא לטעון מחדש את הדף.", -"Error deleting contact property." => "שגיאה במחיקת מאפיין של איש הקשר.", "Missing ID" => "מזהה חסר", "Error parsing VCard for ID: \"" => "שגיאה בפענוח ה VCard עבור מספר המזהה: \"", "checksum is not set." => "סיכום ביקורת לא נקבע.", "Information about vCard is incorrect. Please reload the page: " => "המידע עבור ה vCard אינו נכון. אנא טען את העמוד: ", "Something went FUBAR. " => "משהו לא התנהל כצפוי.", -"Error updating contact property." => "שגיאה בעדכון המאפיין של איש הקשר.", "No contact ID was submitted." => "מספר מזהה של אישר הקשר לא נשלח.", "Error reading contact photo." => "שגיאה בקריאת תמונת איש הקשר.", "Error saving temporary file." => "שגיאה בשמירת קובץ זמני.", @@ -43,10 +41,6 @@ "Contacts" => "אנשי קשר", "This is not your addressbook." => "זהו אינו ספר הכתובות שלך", "Contact could not be found." => "לא ניתן לאתר איש קשר", -"Address" => "כתובת", -"Telephone" => "טלפון", -"Email" => "דואר אלקטרוני", -"Organization" => "ארגון", "Work" => "עבודה", "Home" => "בית", "Mobile" => "נייד", @@ -69,6 +63,7 @@ "Upload new photo" => "העלה תמונה חדשה", "Select photo from ownCloud" => "בחר תמונה מ ownCloud", "Edit name details" => "ערוך פרטי שם", +"Organization" => "ארגון", "Delete" => "מחיקה", "Nickname" => "כינוי", "Enter nickname" => "הכנס כינוי", @@ -88,6 +83,8 @@ "Add notes here." => "הוסף הערות כאן.", "Add field" => "הוסף שדה", "Phone" => "טלפון", +"Email" => "דואר אלקטרוני", +"Address" => "כתובת", "Note" => "הערה", "Download contact" => "הורדת איש קשר", "Delete contact" => "מחיקת איש קשר", @@ -126,7 +123,6 @@ "Importing contacts" => "מיבא אנשי קשר", "You have no contacts in your addressbook." => "איך לך אנשי קשר בספר הכתובות", "Add contact" => "הוסף איש קשר", -"Configure addressbooks" => "הגדר ספרי כתובות", "CardDAV syncing addresses" => "CardDAV מסנכרן כתובות", "more info" => "מידע נוסף", "Primary address (Kontact et al)" => "כתובת ראשית", diff --git a/apps/contacts/l10n/hr.php b/apps/contacts/l10n/hr.php index d29283f767..769a6ced0f 100644 --- a/apps/contacts/l10n/hr.php +++ b/apps/contacts/l10n/hr.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Morate ispuniti barem jedno od adresnih polja.", "Trying to add duplicate property: " => "Pokušali ste dodati duplo svojstvo:", "Information about vCard is incorrect. Please reload the page." => "Informacija o vCard je neispravna. Osvježite stranicu.", -"Error deleting contact property." => "Pogreška pri brisanju svojstva kontakta.", "Missing ID" => "Nedostupan ID identifikator", "Error parsing VCard for ID: \"" => "Pogreška pri raščlanjivanju VCard za ID:", "checksum is not set." => "checksum nije postavljen.", "Information about vCard is incorrect. Please reload the page: " => "Informacije o VCard su pogrešne. Molimo, učitajte ponovno stranicu:", "Something went FUBAR. " => "Nešto je otišlo... krivo...", -"Error updating contact property." => "Pogreška pri ažuriranju svojstva kontakta.", "No contact ID was submitted." => "ID kontakta nije podnešen.", "Error reading contact photo." => "Pogreška pri čitanju kontakt fotografije.", "Error saving temporary file." => "Pogreška pri spremanju privremene datoteke.", @@ -39,10 +37,6 @@ "Contacts" => "Kontakti", "This is not your addressbook." => "Ovo nije vaš adresar.", "Contact could not be found." => "Kontakt ne postoji.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacija", "Work" => "Posao", "Home" => "Kuća", "Mobile" => "Mobitel", @@ -62,6 +56,7 @@ "Drop photo to upload" => "Dovucite fotografiju za slanje", "Edit current photo" => "Uredi trenutnu sliku", "Edit name details" => "Uredi detalje imena", +"Organization" => "Organizacija", "Delete" => "Obriši", "Nickname" => "Nadimak", "Enter nickname" => "Unesi nadimank", @@ -76,6 +71,8 @@ "Add notes here." => "Dodaj bilješke ovdje.", "Add field" => "Dodaj polje", "Phone" => "Telefon", +"Email" => "E-mail", +"Address" => "Adresa", "Note" => "Bilješka", "Download contact" => "Preuzmi kontakt", "Delete contact" => "Izbriši kontakt", diff --git a/apps/contacts/l10n/hu_HU.php b/apps/contacts/l10n/hu_HU.php index b3f831ea8a..4febe9c29f 100644 --- a/apps/contacts/l10n/hu_HU.php +++ b/apps/contacts/l10n/hu_HU.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Legalább egy címmező kitöltendő", "Trying to add duplicate property: " => "Kísérlet dupla tulajdonság hozzáadására: ", "Information about vCard is incorrect. Please reload the page." => "A vCardról szóló információ helytelen. Töltsd újra az oldalt.", -"Error deleting contact property." => "Hiba a kapcsolat-tulajdonság törlésekor", "Missing ID" => "Hiányzó ID", "Error parsing VCard for ID: \"" => "VCard elemzése sikertelen a következő ID-hoz: \"", "checksum is not set." => "az ellenőrzőösszeg nincs beállítva", "Information about vCard is incorrect. Please reload the page: " => "Helytelen információ a vCardról. Töltse újra az oldalt: ", "Something went FUBAR. " => "Valami balul sült el.", -"Error updating contact property." => "Hiba a kapcsolat-tulajdonság frissítésekor", "No contact ID was submitted." => "Nincs ID megadva a kontakthoz", "Error reading contact photo." => "A kontakt képének beolvasása sikertelen", "Error saving temporary file." => "Ideiglenes fájl mentése sikertelen", @@ -63,10 +61,6 @@ " failed." => " sikertelen", "This is not your addressbook." => "Ez nem a te címjegyzéked.", "Contact could not be found." => "Kapcsolat nem található.", -"Address" => "Cím", -"Telephone" => "Telefonszám", -"Email" => "E-mail", -"Organization" => "Szervezet", "Work" => "Munkahelyi", "Home" => "Otthoni", "Mobile" => "Mobiltelefonszám", @@ -91,6 +85,7 @@ "Select photo from ownCloud" => "Kép kiválasztása ownCloud-ból", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé vesszővel", "Edit name details" => "Név részleteinek szerkesztése", +"Organization" => "Szervezet", "Delete" => "Törlés", "Nickname" => "Becenév", "Enter nickname" => "Becenév megadása", @@ -110,6 +105,8 @@ "Add notes here." => "Megjegyzések", "Add field" => "Mező hozzáadása", "Phone" => "Telefonszám", +"Email" => "E-mail", +"Address" => "Cím", "Note" => "Jegyzet", "Download contact" => "Kapcsolat letöltése", "Delete contact" => "Kapcsolat törlése", @@ -149,7 +146,6 @@ "Importing contacts" => "Kapcsolatok importálása", "You have no contacts in your addressbook." => "Nincsenek kapcsolatok a címlistában", "Add contact" => "Kapcsolat hozzáadása", -"Configure addressbooks" => "Címlisták beállítása", "CardDAV syncing addresses" => "CardDAV szinkronizációs címek", "more info" => "további információ", "Primary address (Kontact et al)" => "Elsődleges cím", diff --git a/apps/contacts/l10n/ia.php b/apps/contacts/l10n/ia.php index b3f9db539a..4d455f7c97 100644 --- a/apps/contacts/l10n/ia.php +++ b/apps/contacts/l10n/ia.php @@ -9,10 +9,6 @@ "Contacts" => "Contactos", "This is not your addressbook." => "Iste non es tu libro de adresses", "Contact could not be found." => "Contacto non poterea esser legite", -"Address" => "Adresse", -"Telephone" => "Telephono", -"Email" => "E-posta", -"Organization" => "Organisation", "Work" => "Travalio", "Home" => "Domo", "Mobile" => "Mobile", @@ -32,6 +28,7 @@ "Edit current photo" => "Modificar photo currente", "Upload new photo" => "Incargar nove photo", "Select photo from ownCloud" => "Seliger photo ex ownCloud", +"Organization" => "Organisation", "Delete" => "Deler", "Nickname" => "Pseudonymo", "Enter nickname" => "Inserer pseudonymo", @@ -46,6 +43,8 @@ "Add notes here." => "Adder notas hic", "Add field" => "Adder campo", "Phone" => "Phono", +"Email" => "E-posta", +"Address" => "Adresse", "Note" => "Nota", "Download contact" => "Discargar contacto", "Delete contact" => "Deler contacto", @@ -71,6 +70,10 @@ "Please choose the addressbook" => "Per favor selige le adressario", "create a new addressbook" => "Crear un nove adressario", "Name of new addressbook" => "Nomine del nove gruppo:", +"Import" => "Importar", +"Contacts imported successfully" => "Contactos importate con successo.", +"Close Dialog" => "Clauder dialogo", +"Import Addressbook" => "Importar adressario.", "Add contact" => "Adder adressario", "more info" => "plus info", "iOS/OS X" => "iOS/OS X", diff --git a/apps/contacts/l10n/it.php b/apps/contacts/l10n/it.php index e1af39fe91..b10130f8d7 100644 --- a/apps/contacts/l10n/it.php +++ b/apps/contacts/l10n/it.php @@ -14,15 +14,14 @@ "Cannot add empty property." => "Impossibile aggiungere una proprietà vuota.", "At least one of the address fields has to be filled out." => "Deve essere inserito almeno un indirizzo.", "Trying to add duplicate property: " => "P", -"Error adding contact property: " => "Errore durante l'aggiunta della proprietà del contatto: ", +"Missing IM parameter." => "Parametro IM mancante.", +"Unknown IM: " => "IM sconosciuto:", "Information about vCard is incorrect. Please reload the page." => "Informazioni sulla vCard non corrette. Ricarica la pagina.", -"Error deleting contact property." => "Errore durante l'eliminazione della proprietà del contatto.", "Missing ID" => "ID mancante", "Error parsing VCard for ID: \"" => "Errore in fase di elaborazione del file VCard per l'ID: \"", "checksum is not set." => "il codice di controllo non è impostato.", "Information about vCard is incorrect. Please reload the page: " => "Le informazioni della vCard non sono corrette. Ricarica la pagina: ", "Something went FUBAR. " => "Qualcosa è andato storto. ", -"Error updating contact property." => "Errore durante l'aggiornamento della proprietà del contatto.", "No contact ID was submitted." => "Nessun ID di contatto inviato.", "Error reading contact photo." => "Errore di lettura della foto del contatto.", "Error saving temporary file." => "Errore di salvataggio del file temporaneo.", @@ -53,6 +52,9 @@ "Not implemented" => "Non implementata", "Couldn't get a valid address." => "Impossibile ottenere un indirizzo valido.", "Error" => "Errore", +"You do not have permission to add contacts to " => "Non hai i permessi per aggiungere contatti a", +"Please select one of your own address books." => "Seleziona una delle tue rubriche.", +"Permission error" => "Errore relativo ai permessi", "This property has to be non-empty." => "Questa proprietà non può essere vuota.", "Couldn't serialize elements." => "Impossibile serializzare gli elementi.", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' invocata senza l'argomento di tipo. Segnalalo a bugs.owncloud.org", @@ -62,6 +64,7 @@ "Error loading profile picture." => "Errore durante il caricamento dell'immagine di profilo.", "Select type" => "Seleziona il tipo", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alcuni contatti sono marcati per l'eliminazione, ma non sono stati ancora rimossi. Attendi fino al completamento dell'operazione.", +"Do you want to merge these address books?" => "Vuoi unire queste rubriche?", "Result: " => "Risultato: ", " imported, " => " importato, ", " failed." => " non riuscito.", @@ -69,12 +72,21 @@ "Addressbook not found: " => "Rubrica non trovata:", "This is not your addressbook." => "Questa non è la tua rubrica.", "Contact could not be found." => "Il contatto non può essere trovato.", -"Address" => "Indirizzo", -"Telephone" => "Telefono", -"Email" => "Email", -"Organization" => "Organizzazione", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Lavoro", "Home" => "Casa", +"Other" => "Altro", "Mobile" => "Cellulare", "Text" => "Testo", "Voice" => "Voce", @@ -93,12 +105,13 @@ "Journey" => "Viaggio", "Jubilee" => "Anniversario", "Meeting" => "Riunione", -"Other" => "Altro", "Personal" => "Personale", "Projects" => "Progetti", "Questions" => "Domande", "{name}'s Birthday" => "Data di nascita di {name}", "Contact" => "Contatto", +"You do not have the permissions to edit this contact." => "Non hai i permessi per modificare questo contatto.", +"You do not have the permissions to delete this contact." => "Non hai i permessi per eliminare questo contatto.", "Add Contact" => "Aggiungi contatto", "Import" => "Importa", "Settings" => "Impostazioni", @@ -123,6 +136,7 @@ "Select photo from ownCloud" => "Seleziona la foto da ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizzato, nome breve, nome completo, invertito o invertito con virgola", "Edit name details" => "Modifica dettagli del nome", +"Organization" => "Organizzazione", "Delete" => "Elimina", "Nickname" => "Pseudonimo", "Enter nickname" => "Inserisci pseudonimo", @@ -140,11 +154,16 @@ "Delete email address" => "Elimina l'indirizzo email", "Enter phone number" => "Inserisci il numero di telefono", "Delete phone number" => "Elimina il numero di telefono", +"Instant Messenger" => "Client di messaggistica istantanea", +"Delete IM" => "Elimina IM", "View on map" => "Visualizza sulla mappa", "Edit address details" => "Modifica dettagli dell'indirizzo", "Add notes here." => "Aggiungi qui le note.", "Add field" => "Aggiungi campo", "Phone" => "Telefono", +"Email" => "Email", +"Instant Messaging" => "Messaggistica istantanea", +"Address" => "Indirizzo", "Note" => "Nota", "Download contact" => "Scarica contatto", "Delete contact" => "Elimina contatto", @@ -187,9 +206,14 @@ "create a new addressbook" => "crea una nuova rubrica", "Name of new addressbook" => "Nome della nuova rubrica", "Importing contacts" => "Importazione contatti", +"Contacts imported successfully" => "Contatti importati correttamente", +"Close Dialog" => "Chiudi finestra", +"Import Addressbook" => "Importa rubrica", +"Select address book to import to:" => "Seleziona la rubrica di destinazione:", +"Drop a VCF file to import contacts." => "Rilascia un file VCF per importare i contatti.", +"Select from HD" => "Seleziona da disco", "You have no contacts in your addressbook." => "Non hai contatti nella rubrica.", "Add contact" => "Aggiungi contatto", -"Configure addressbooks" => "Configura rubriche", "Select Address Books" => "Seleziona rubriche", "Enter name" => "Inserisci il nome", "Enter description" => "Inserisci una descrizione", @@ -199,6 +223,7 @@ "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "Mostra collegamento CardDav", "Show read-only VCF link" => "Mostra collegamento VCF in sola lettura", +"Share" => "Condividi", "Download" => "Scarica", "Edit" => "Modifica", "New Address Book" => "Nuova rubrica", diff --git a/apps/contacts/l10n/ja_JP.php b/apps/contacts/l10n/ja_JP.php index 4f7800e1db..9b5874d459 100644 --- a/apps/contacts/l10n/ja_JP.php +++ b/apps/contacts/l10n/ja_JP.php @@ -1,12 +1,12 @@ "アドレスブックの有効/無効化に失敗しました。", +"Error (de)activating addressbook." => "アドレス帳の有効/無効化に失敗しました。", "id is not set." => "idが設定されていません。", -"Cannot update addressbook with an empty name." => "空白の名前でアドレスブックを更新することはできません。", -"Error updating addressbook." => "アドレスブックの更新に失敗しました。", +"Cannot update addressbook with an empty name." => "空白の名前でアドレス帳を更新することはできません。", +"Error updating addressbook." => "アドレス帳の更新に失敗しました。", "No ID provided" => "IDが提供されていません", "Error setting checksum." => "チェックサムの設定エラー。", "No categories selected for deletion." => "削除するカテゴリが選択されていません。", -"No address books found." => "アドレスブックが見つかりません。", +"No address books found." => "アドレス帳が見つかりません。", "No contacts found." => "連絡先が見つかりません。", "There was an error adding the contact." => "連絡先の追加でエラーが発生しました。", "element name is not set." => "要素名が設定されていません。", @@ -14,26 +14,25 @@ "Cannot add empty property." => "項目の新規追加に失敗しました。", "At least one of the address fields has to be filled out." => "住所の項目のうち1つは入力して下さい。", "Trying to add duplicate property: " => "重複する属性を追加: ", -"Error adding contact property: " => "コンタクト属性の追加エラー: ", +"Missing IM parameter." => "IMのパラメータが不足しています。", +"Unknown IM: " => "不明なIM:", "Information about vCard is incorrect. Please reload the page." => "vCardの情報に誤りがあります。ページをリロードして下さい。", -"Error deleting contact property." => "連絡先の削除に失敗しました。", "Missing ID" => "IDが見つかりません", "Error parsing VCard for ID: \"" => "VCardからIDの抽出エラー: \"", "checksum is not set." => "チェックサムが設定されていません。", "Information about vCard is incorrect. Please reload the page: " => "vCardの情報が正しくありません。ページを再読み込みしてください: ", "Something went FUBAR. " => "何かがFUBARへ移動しました。", -"Error updating contact property." => "連絡先の更新に失敗しました。", "No contact ID was submitted." => "連絡先IDは登録されませんでした。", "Error reading contact photo." => "連絡先写真の読み込みエラー。", "Error saving temporary file." => "一時ファイルの保存エラー。", "The loading photo is not valid." => "写真の読み込みは無効です。", -"Contact ID is missing." => "コンタクトIDが見つかりません。", +"Contact ID is missing." => "連絡先 IDが見つかりません。", "No photo path was submitted." => "写真のパスが登録されていません。", "File doesn't exist:" => "ファイルが存在しません:", "Error loading image." => "画像の読み込みエラー。", -"Error getting contact object." => "コンタクトオブジェクトの取得エラー。", +"Error getting contact object." => "連絡先オブジェクトの取得エラー。", "Error getting PHOTO property." => "写真属性の取得エラー。", -"Error saving contact." => "コンタクトの保存エラー。", +"Error saving contact." => "連絡先の保存エラー。", "Error resizing image" => "画像のリサイズエラー", "Error cropping image" => "画像の切り抜きエラー", "Error creating temporary image" => "一時画像の生成エラー", @@ -53,26 +52,41 @@ "Not implemented" => "未実装", "Couldn't get a valid address." => "有効なアドレスを取得できませんでした。", "Error" => "エラー", +"You do not have permission to add contacts to " => "連絡先を追加する権限がありません", +"Please select one of your own address books." => "アドレス帳を一つ選択してください", +"Permission error" => "権限エラー", "This property has to be non-empty." => "この属性は空にできません。", "Couldn't serialize elements." => "要素をシリアライズできませんでした。", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' は型の引数無しで呼び出されました。bugs.owncloud.org へ報告してください。", "Edit name" => "名前を編集", "No files selected for upload." => "アップロードするファイルが選択されていません。", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "アップロードしようとしているファイルは、このサーバの最大ファイルアップロードサイズを超えています。", +"Error loading profile picture." => "プロファイルの画像の読み込みエラー", "Select type" => "タイプを選択", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "いくつかの連絡先が削除とマークされていますが、まだ削除されていません。削除するまでお待ちください。", +"Do you want to merge these address books?" => "これらのアドレス帳をマージしてもよろしいですか?", "Result: " => "結果: ", " imported, " => " をインポート、 ", " failed." => " は失敗しました。", "Displayname cannot be empty." => "表示名は空にできません。", -"Addressbook not found: " => "連絡先が見つかりません:", +"Addressbook not found: " => "アドレス帳が見つかりません:", "This is not your addressbook." => "これはあなたの電話帳ではありません。", "Contact could not be found." => "連絡先を見つける事ができません。", -"Address" => "住所", -"Telephone" => "電話番号", -"Email" => "メールアドレス", -"Organization" => "所属", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "Googleトーク", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "勤務先", "Home" => "住居", +"Other" => "その他", "Mobile" => "携帯電話", "Text" => "TTY TDD", "Voice" => "音声番号", @@ -91,35 +105,38 @@ "Journey" => "旅行", "Jubilee" => "記念祭", "Meeting" => "打ち合わせ", -"Other" => "その他", "Personal" => "個人", "Projects" => "プロジェクト", "Questions" => "質問", "{name}'s Birthday" => "{name}の誕生日", "Contact" => "連絡先", +"You do not have the permissions to edit this contact." => "この連絡先を編集する権限がありません", +"You do not have the permissions to delete this contact." => "この連絡先を削除する権限がありません", "Add Contact" => "連絡先の追加", "Import" => "インポート", "Settings" => "設定", -"Addressbooks" => "電話帳", +"Addressbooks" => "アドレス帳", "Close" => "閉じる", "Keyboard shortcuts" => "キーボードショートカット", "Navigation" => "ナビゲーション", -"Next contact in list" => "リスト内の次のコンタクト", -"Previous contact in list" => "リスト内の前のコンタクト", -"Expand/collapse current addressbook" => "現在の連絡帳を展開する/折りたたむ", -"Next addressbook" => "次の連絡先", -"Previous addressbook" => "前の連絡先", +"Next contact in list" => "リスト内の次の連絡先", +"Previous contact in list" => "リスト内の前の連絡先", +"Expand/collapse current addressbook" => "現在のアドレス帳を展開する/折りたたむ", +"Next addressbook" => "次のアドレス帳", +"Previous addressbook" => "前のアドレス帳", "Actions" => "アクション", "Refresh contacts list" => "連絡先リストを再読込する", -"Add new contact" => "新しいコンタクトを追加", -"Add new addressbook" => "新しいアドレスブックを追加", -"Delete current contact" => "現在のコンタクトを削除", +"Add new contact" => "新しい連絡先を追加", +"Add new addressbook" => "新しいアドレス帳を追加", +"Delete current contact" => "現在の連絡先を削除", "Drop photo to upload" => "写真をドロップしてアップロード", "Delete current photo" => "現在の写真を削除", "Edit current photo" => "現在の写真を編集", "Upload new photo" => "新しい写真をアップロード", "Select photo from ownCloud" => "ownCloudから写真を選択", +"Format custom, Short name, Full name, Reverse or Reverse with comma" => "編集フォーマット、ショートネーム、フルネーム、逆順、カンマ区切りの逆順", "Edit name details" => "名前の詳細を編集", +"Organization" => "所属", "Delete" => "削除", "Nickname" => "ニックネーム", "Enter nickname" => "ニックネームを入力", @@ -131,17 +148,22 @@ "Separate groups with commas" => "コンマでグループを分割", "Edit groups" => "グループを編集", "Preferred" => "推奨", -"Please specify a valid email address." => "連絡先を追加", +"Please specify a valid email address." => "有効なメールアドレスを指定してください。", "Enter email address" => "メールアドレスを入力", "Mail to address" => "アドレスへメールを送る", "Delete email address" => "メールアドレスを削除", "Enter phone number" => "電話番号を入力", "Delete phone number" => "電話番号を削除", +"Instant Messenger" => "インスタントメッセンジャー", +"Delete IM" => "IMを削除", "View on map" => "地図で表示", "Edit address details" => "住所の詳細を編集", "Add notes here." => "ここにメモを追加。", "Add field" => "項目を追加", "Phone" => "電話番号", +"Email" => "メールアドレス", +"Instant Messaging" => "インスタントメッセージ", +"Address" => "住所", "Note" => "メモ", "Download contact" => "連絡先のダウンロード", "Delete contact" => "連絡先の削除", @@ -159,7 +181,8 @@ "Zipcode" => "郵便番号", "Postal code" => "郵便番号", "Country" => "国名", -"Addressbook" => "アドレスブック", +"Addressbook" => "アドレス帳", +"Hon. prefixes" => "敬称", "Miss" => "Miss", "Ms" => "Ms", "Mr" => "Mr", @@ -169,7 +192,7 @@ "Given name" => "名", "Additional names" => "ミドルネーム", "Family name" => "姓", -"Hon. suffixes" => "ストレージへの連絡先のアップロードエラー。", +"Hon. suffixes" => "称号", "J.D." => "J.D.", "M.D." => "M.D.", "D.O." => "D.O.", @@ -178,15 +201,14 @@ "Esq." => "Esq.", "Jr." => "Jr.", "Sn." => "Sn.", -"Import a contacts file" => "コンタクトファイルをインポート", -"Please choose the addressbook" => "アドレスブックを選択してください", -"create a new addressbook" => "新しいアドレスブックを作成", +"Import a contacts file" => "連絡先ファイルをインポート", +"Please choose the addressbook" => "アドレス帳を選択してください", +"create a new addressbook" => "新しいアドレス帳を作成", "Name of new addressbook" => "新しいアドレスブックの名前", -"Importing contacts" => "コンタクトをインポート", -"You have no contacts in your addressbook." => "アドレスブックに連絡先が登録されていません。", +"Importing contacts" => "連絡先をインポート", +"You have no contacts in your addressbook." => "アドレス帳に連絡先が登録されていません。", "Add contact" => "連絡先を追加", -"Configure addressbooks" => "アドレス帳を設定", -"Select Address Books" => "連絡先を洗濯してください", +"Select Address Books" => "アドレス帳を選択してください", "Enter name" => "名前を入力", "Enter description" => "説明を入力してください", "CardDAV syncing addresses" => "CardDAV同期アドレス", @@ -195,9 +217,10 @@ "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "CarDavリンクを表示", "Show read-only VCF link" => "読み取り専用のVCFリンクを表示", +"Share" => "共有", "Download" => "ダウンロード", "Edit" => "編集", -"New Address Book" => "新規電話帳", +"New Address Book" => "新規のアドレス帳", "Name" => "名前", "Description" => "説明", "Save" => "保存", diff --git a/apps/contacts/l10n/ko.php b/apps/contacts/l10n/ko.php index f060b419e0..4349224f53 100644 --- a/apps/contacts/l10n/ko.php +++ b/apps/contacts/l10n/ko.php @@ -14,12 +14,10 @@ "At least one of the address fields has to be filled out." => "최소한 하나의 주소록 항목을 입력해야 합니다.", "Trying to add duplicate property: " => "중복 속성 추가 시도: ", "Information about vCard is incorrect. Please reload the page." => "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오.", -"Error deleting contact property." => "연락처 속성을 삭제할 수 없습니다.", "Missing ID" => "아이디 분실", "Error parsing VCard for ID: \"" => "아이디에 대한 VCard 분석 오류", "checksum is not set." => "체크섬이 설정되지 않았습니다.", "Information about vCard is incorrect. Please reload the page: " => " vCard에 대한 정보가 잘못되었습니다. 페이지를 다시 로드하세요:", -"Error updating contact property." => "연락처 속성을 업데이트할 수 없습니다.", "No contact ID was submitted." => "접속 아이디가 기입되지 않았습니다.", "Error reading contact photo." => "사진 읽기 오류", "Error saving temporary file." => "임시 파일을 저장하는 동안 오류가 발생했습니다. ", @@ -61,10 +59,6 @@ " failed." => "실패.", "This is not your addressbook." => "내 주소록이 아닙니다.", "Contact could not be found." => "연락처를 찾을 수 없습니다.", -"Address" => "주소", -"Telephone" => "전화 번호", -"Email" => "전자 우편", -"Organization" => "조직", "Work" => "직장", "Home" => "자택", "Mobile" => "휴대폰", @@ -89,6 +83,7 @@ "Select photo from ownCloud" => "ownCloud에서 사진 선택", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format custom, Short name, Full name, Reverse or Reverse with comma", "Edit name details" => "이름 세부사항을 편집합니다. ", +"Organization" => "조직", "Delete" => "삭제", "Nickname" => "별명", "Enter nickname" => "별명 입력", @@ -107,6 +102,8 @@ "Add notes here." => "여기에 노트 추가.", "Add field" => "파일 추가", "Phone" => "전화 번호", +"Email" => "전자 우편", +"Address" => "주소", "Note" => "노트", "Download contact" => "연락처 다운로드", "Delete contact" => "연락처 삭제", @@ -146,7 +143,6 @@ "Importing contacts" => "연락처 입력", "You have no contacts in your addressbook." => "당신의 주소록에는 연락처가 없습니다. ", "Add contact" => "연락처 추가", -"Configure addressbooks" => "주소록 구성", "CardDAV syncing addresses" => "CardDAV 주소 동기화", "more info" => "더 많은 정보", "Primary address (Kontact et al)" => "기본 주소 (Kontact et al)", diff --git a/apps/contacts/l10n/lb.php b/apps/contacts/l10n/lb.php index 90ff22f122..22ca20e751 100644 --- a/apps/contacts/l10n/lb.php +++ b/apps/contacts/l10n/lb.php @@ -11,9 +11,7 @@ "Cannot add empty property." => "Ka keng eidel Proprietéit bäisetzen.", "Trying to add duplicate property: " => "Probéieren duebel Proprietéit bäi ze setzen:", "Information about vCard is incorrect. Please reload the page." => "Informatioun iwwert vCard ass net richteg. Lued d'Säit wegl nei.", -"Error deleting contact property." => "Fehler beim läschen vun der Kontakt Proprietéit.", "Missing ID" => "ID fehlt", -"Error updating contact property." => "Fehler beim updaten vun der Kontakt Proprietéit.", "No contact ID was submitted." => "Kontakt ID ass net mat geschéckt ginn.", "Error reading contact photo." => "Fehler beim liesen vun der Kontakt Photo.", "Error saving temporary file." => "Fehler beim späicheren vum temporäre Fichier.", @@ -28,10 +26,6 @@ " imported, " => " importéiert, ", "This is not your addressbook." => "Dat do ass net däin Adressbuch.", "Contact could not be found." => "Konnt den Kontakt net fannen.", -"Address" => "Adress", -"Telephone" => "Telefon's Nummer", -"Email" => "Email", -"Organization" => "Firma", "Work" => "Aarbecht", "Home" => "Doheem", "Mobile" => "GSM", @@ -48,6 +42,7 @@ "Add Contact" => "Kontakt bäisetzen", "Addressbooks" => "Adressbicher ", "Close" => "Zoumaachen", +"Organization" => "Firma", "Delete" => "Läschen", "Nickname" => "Spëtznumm", "Enter nickname" => "Gëff e Spëtznumm an", @@ -59,6 +54,8 @@ "View on map" => "Op da Kaart uweisen", "Edit address details" => "Adress Detailer editéieren", "Phone" => "Telefon", +"Email" => "Email", +"Address" => "Adress", "Note" => "Note", "Download contact" => "Kontakt eroflueden", "Delete contact" => "Kontakt läschen", diff --git a/apps/contacts/l10n/lt_LT.php b/apps/contacts/l10n/lt_LT.php index eece7fa67c..3b31aa7931 100644 --- a/apps/contacts/l10n/lt_LT.php +++ b/apps/contacts/l10n/lt_LT.php @@ -15,10 +15,6 @@ "Contacts" => "Kontaktai", "This is not your addressbook." => "Tai ne jūsų adresų knygelė.", "Contact could not be found." => "Kontaktas nerastas", -"Address" => "Adresas", -"Telephone" => "Telefonas", -"Email" => "El. paštas", -"Organization" => "Organizacija", "Work" => "Darbo", "Home" => "Namų", "Mobile" => "Mobilusis", @@ -33,9 +29,13 @@ "Contact" => "Kontaktas", "Add Contact" => "Pridėti kontaktą", "Addressbooks" => "Adresų knygos", +"Organization" => "Organizacija", "Delete" => "Trinti", "Nickname" => "Slapyvardis", +"Enter nickname" => "Įveskite slapyvardį", "Phone" => "Telefonas", +"Email" => "El. paštas", +"Address" => "Adresas", "Download contact" => "Atsisųsti kontaktą", "Delete contact" => "Ištrinti kontaktą", "Type" => "Tipas", diff --git a/apps/contacts/l10n/mk.php b/apps/contacts/l10n/mk.php index bdc0e6681f..dbdd633e51 100644 --- a/apps/contacts/l10n/mk.php +++ b/apps/contacts/l10n/mk.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Барем една од полињата за адреса треба да биде пополнето.", "Trying to add duplicate property: " => "Се обидовте да внесете дупликат вредност:", "Information about vCard is incorrect. Please reload the page." => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава.", -"Error deleting contact property." => "Греш при бришење на вредноста за контакт.", "Missing ID" => "Недостасува ИД", "Error parsing VCard for ID: \"" => "Грешка при парсирање VCard за ИД: \"", "checksum is not set." => "сумата за проверка не е поставена.", "Information about vCard is incorrect. Please reload the page: " => "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава:", "Something went FUBAR. " => "Нешто се расипа.", -"Error updating contact property." => "Грешка при ажурирање на вредноста за контакт.", "No contact ID was submitted." => "Не беше доставено ИД за контакт.", "Error reading contact photo." => "Грешка во читање на контакт фотографија.", "Error saving temporary file." => "Грешка во снимање на привремена датотека.", @@ -63,10 +61,6 @@ " failed." => "неуспешно.", "This is not your addressbook." => "Ова не е во Вашиот адресар.", "Contact could not be found." => "Контактот неможе да биде најден.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Е-пошта", -"Organization" => "Организација", "Work" => "Работа", "Home" => "Дома", "Mobile" => "Мобилен", @@ -91,6 +85,7 @@ "Select photo from ownCloud" => "Изберете фотографија од ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Прилагоден формат, кратко име, цело име, обратно или обратно со запирка", "Edit name details" => "Уреди детали за име", +"Organization" => "Организација", "Delete" => "Избриши", "Nickname" => "Прекар", "Enter nickname" => "Внеси прекар", @@ -110,6 +105,8 @@ "Add notes here." => "Внесете забелешки тука.", "Add field" => "Додади поле", "Phone" => "Телефон", +"Email" => "Е-пошта", +"Address" => "Адреса", "Note" => "Забелешка", "Download contact" => "Преземи го контактот", "Delete contact" => "Избриши го контактот", @@ -147,9 +144,14 @@ "create a new addressbook" => "креирај нов адресар", "Name of new addressbook" => "Име на новиот адресар", "Importing contacts" => "Внесување контакти", +"Contacts imported successfully" => "Контаките беа внесени успешно", +"Close Dialog" => "Дијалог за затварање", +"Import Addressbook" => "Внеси адресар", +"Select address book to import to:" => "Изберете адресар да се внесе:", +"Drop a VCF file to import contacts." => "Довлечкај VCF датотека да се внесат контакти.", +"Select from HD" => "Изберете од хард диск", "You have no contacts in your addressbook." => "Немате контакти во Вашиот адресар.", "Add contact" => "Додади контакт", -"Configure addressbooks" => "Уреди адресари", "CardDAV syncing addresses" => "Адреса за синхронизација со CardDAV", "more info" => "повеќе информации", "Primary address (Kontact et al)" => "Примарна адреса", diff --git a/apps/contacts/l10n/ms_MY.php b/apps/contacts/l10n/ms_MY.php index 8153c4d936..3fce9eae5a 100644 --- a/apps/contacts/l10n/ms_MY.php +++ b/apps/contacts/l10n/ms_MY.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Sekurangnya satu ruangan alamat perlu diisikan.", "Trying to add duplicate property: " => "Cuba untuk letak nilai duplikasi:", "Information about vCard is incorrect. Please reload the page." => "Maklumat vCard tidak tepat. Sila reload semula halaman ini.", -"Error deleting contact property." => "Masalah memadam maklumat.", "Missing ID" => "ID Hilang", "Error parsing VCard for ID: \"" => "Ralat VCard untuk ID: \"", "checksum is not set." => "checksum tidak ditetapkan.", "Information about vCard is incorrect. Please reload the page: " => "Maklumat tentang vCard tidak betul.", "Something went FUBAR. " => "Sesuatu tidak betul.", -"Error updating contact property." => "Masalah mengemaskini maklumat.", "No contact ID was submitted." => "Tiada ID kenalan yang diberi.", "Error reading contact photo." => "Ralat pada foto kenalan.", "Error saving temporary file." => "Ralat menyimpan fail sementara", @@ -64,12 +62,9 @@ "Addressbook not found: " => "Buku alamat tidak ditemui:", "This is not your addressbook." => "Ini bukan buku alamat anda.", "Contact could not be found." => "Hubungan tidak dapat ditemui", -"Address" => "Alamat", -"Telephone" => "Telefon", -"Email" => "Emel", -"Organization" => "Organisasi", "Work" => "Kerja", "Home" => "Rumah", +"Other" => "Lain", "Mobile" => "Mudah alih", "Text" => "Teks", "Voice" => "Suara", @@ -86,7 +81,6 @@ "Journey" => "Perjalanan", "Jubilee" => "Jubli", "Meeting" => "Mesyuarat", -"Other" => "Lain", "Personal" => "Peribadi", "Projects" => "Projek", "{name}'s Birthday" => "Hari Lahir {name}", @@ -105,6 +99,7 @@ "Select photo from ownCloud" => "Pilih foto dari ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format bebas, Nama pendek, Nama penuh, Unduran dengan koma", "Edit name details" => "Ubah butiran nama", +"Organization" => "Organisasi", "Delete" => "Padam", "Nickname" => "Nama Samaran", "Enter nickname" => "Masukkan nama samaran", @@ -124,6 +119,8 @@ "Add notes here." => "Letak nota disini.", "Add field" => "Letak ruangan", "Phone" => "Telefon", +"Email" => "Emel", +"Address" => "Alamat", "Note" => "Nota", "Download contact" => "Muat turun hubungan", "Delete contact" => "Padam hubungan", @@ -163,7 +160,6 @@ "Importing contacts" => "Import senarai kenalan", "You have no contacts in your addressbook." => "Anda tidak mempunyai sebarang kenalan didalam buku alamat.", "Add contact" => "Letak kenalan", -"Configure addressbooks" => "Konfigurasi buku alamat", "Select Address Books" => "Pilih Buku Alamat", "Enter name" => "Masukkan nama", "Enter description" => "Masukkan keterangan", diff --git a/apps/contacts/l10n/nb_NO.php b/apps/contacts/l10n/nb_NO.php index 4066d670e4..5f7c49c8b9 100644 --- a/apps/contacts/l10n/nb_NO.php +++ b/apps/contacts/l10n/nb_NO.php @@ -11,10 +11,8 @@ "Cannot add empty property." => "Kan ikke legge til tomt felt.", "At least one of the address fields has to be filled out." => "Minst en av adressefeltene må oppgis.", "Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-filen er ikke riktig. Last inn siden på nytt.", -"Error deleting contact property." => "Et problem oppsto med å fjerne kontaktfeltet.", "Missing ID" => "Manglende ID", "Something went FUBAR. " => "Noe gikk fryktelig galt.", -"Error updating contact property." => "Et problem oppsto med å legge til kontaktfeltet.", "Error reading contact photo." => "Klarte ikke å lese kontaktbilde.", "Error saving temporary file." => "Klarte ikke å lagre midlertidig fil.", "The loading photo is not valid." => "Bildet som lastes inn er ikke gyldig.", @@ -48,10 +46,6 @@ " failed." => "feilet.", "This is not your addressbook." => "Dette er ikke dine adressebok.", "Contact could not be found." => "Kontakten ble ikke funnet.", -"Address" => "Adresse", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisasjon", "Work" => "Arbeid", "Home" => "Hjem", "Mobile" => "Mobil", @@ -75,6 +69,7 @@ "Upload new photo" => "Last opp nytt bilde", "Select photo from ownCloud" => "Velg bilde fra ownCloud", "Edit name details" => "Endre detaljer rundt navn", +"Organization" => "Organisasjon", "Delete" => "Slett", "Nickname" => "Kallenavn", "Enter nickname" => "Skriv inn kallenavn", @@ -94,6 +89,8 @@ "Add notes here." => "Legg inn notater her.", "Add field" => "Legg til felt", "Phone" => "Telefon", +"Email" => "E-post", +"Address" => "Adresse", "Note" => "Notat", "Download contact" => "Hend ned kontakten", "Delete contact" => "Slett kontakt", @@ -119,6 +116,13 @@ "Ph.D." => "Stipendiat", "Jr." => "Jr.", "Sn." => "Sr.", +"New Addressbook" => "Ny adressebok", +"Edit Addressbook" => "Endre adressebok", +"Displayname" => "Visningsnavn", +"Active" => "Aktiv", +"Save" => "Lagre", +"Submit" => "Send inn", +"Cancel" => "Avbryt", "Import a contacts file" => "Importer en fil med kontakter.", "Please choose the addressbook" => "Vennligst velg adressebok", "create a new addressbook" => "Lag ny adressebok", @@ -126,7 +130,6 @@ "Importing contacts" => "Importerer kontakter", "You have no contacts in your addressbook." => "Du har ingen kontakter i din adressebok", "Add contact" => "Ny kontakt", -"Configure addressbooks" => "Konfigurer adressebøker", "CardDAV syncing addresses" => "Synkroniseringsadresse for CardDAV", "more info" => "mer info", "iOS/OS X" => "iOS/OS X", diff --git a/apps/contacts/l10n/nl.php b/apps/contacts/l10n/nl.php index 4a621eec25..a8646e9d4e 100644 --- a/apps/contacts/l10n/nl.php +++ b/apps/contacts/l10n/nl.php @@ -10,17 +10,18 @@ "No contacts found." => "Geen contracten gevonden", "There was an error adding the contact." => "Er was een fout bij het toevoegen van het contact.", "element name is not set." => "onderdeel naam is niet opgegeven.", +"Could not parse contact: " => "Kon het contact niet verwerken", "Cannot add empty property." => "Kan geen lege eigenschap toevoegen.", "At least one of the address fields has to be filled out." => "Minstens één van de adresvelden moet ingevuld worden.", "Trying to add duplicate property: " => "Eigenschap bestaat al: ", +"Missing IM parameter." => "IM parameter ontbreekt", +"Unknown IM: " => "Onbekende IM:", "Information about vCard is incorrect. Please reload the page." => "Informatie over de vCard is onjuist. Herlaad de pagina.", -"Error deleting contact property." => "Fout bij het verwijderen van de contacteigenschap.", "Missing ID" => "Ontbrekend ID", "Error parsing VCard for ID: \"" => "Fout bij inlezen VCard voor ID: \"", "checksum is not set." => "controlegetal is niet opgegeven.", "Information about vCard is incorrect. Please reload the page: " => "Informatie over vCard is fout. Herlaad de pagina: ", "Something went FUBAR. " => "Er ging iets totaal verkeerd. ", -"Error updating contact property." => "Fout bij het updaten van de contacteigenschap.", "No contact ID was submitted." => "Geen contact ID opgestuurd.", "Error reading contact photo." => "Lezen van contact foto mislukt.", "Error saving temporary file." => "Tijdelijk bestand opslaan mislukt.", @@ -29,6 +30,13 @@ "No photo path was submitted." => "Geen fotopad opgestuurd.", "File doesn't exist:" => "Bestand bestaat niet:", "Error loading image." => "Fout bij laden plaatje.", +"Error getting contact object." => "Fout om contact object te verkrijgen", +"Error getting PHOTO property." => "Fout om PHOTO eigenschap te verkrijgen", +"Error saving contact." => "Fout om contact op te slaan", +"Error resizing image" => "Fout tijdens aanpassen plaatje", +"Error cropping image" => "Fout tijdens aanpassen plaatje", +"Error creating temporary image" => "Fout om een tijdelijk plaatje te maken", +"Error finding image: " => "Fout kan plaatje niet vinden:", "Error uploading contacts to storage." => "Fout bij opslaan van contacten.", "There is no error, the file uploaded with success" => "De upload van het bestand is goedgegaan.", "The uploaded file exceeds the upload_max_filesize directive in php.ini" => "Het bestand overschrijdt de upload_max_filesize instelling in php.ini", @@ -36,15 +44,49 @@ "The uploaded file was only partially uploaded" => "Het bestand is gedeeltelijk geüpload", "No file was uploaded" => "Er is geen bestand geüpload", "Missing a temporary folder" => "Er ontbreekt een tijdelijke map", +"Couldn't save temporary image: " => "Kan tijdelijk plaatje niet op slaan:", +"Couldn't load temporary image: " => "Kan tijdelijk plaatje niet op laden:", +"No file was uploaded. Unknown error" => "Er was geen bestand geladen. Onbekende fout", "Contacts" => "Contacten", +"Sorry, this functionality has not been implemented yet" => "Sorry, deze functionaliteit is nog niet geïmplementeerd", +"Not implemented" => "Niet geïmplementeerd", +"Couldn't get a valid address." => "Kan geen geldig adres krijgen", +"Error" => "Fout", +"You do not have permission to add contacts to " => "U hebt geen permissie om contacten toe te voegen aan", +"Please select one of your own address books." => "Selecteer één van uw eigen adresboeken", +"Permission error" => "Permissie fout", +"This property has to be non-empty." => "Dit veld mag niet leeg blijven", +"Couldn't serialize elements." => "Kan de elementen niet serializen", +"'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' aangeroepen zonder type argument. Rapporteer dit a.u.b. via http://bugs.owncloud.org", +"Edit name" => "Pas naam aan", +"No files selected for upload." => "Geen bestanden geselecteerd voor upload.", +"The file you are trying to upload exceed the maximum size for file uploads on this server." => "Het bestand dat u probeert te uploaden overschrijdt de maximale bestand grootte voor bestand uploads voor deze server.", +"Error loading profile picture." => "Fout profiel plaatje kan niet worden geladen.", +"Select type" => "Selecteer type", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Enkele contacten zijn gemarkeerd om verwijderd te worden, maar zijn nog niet verwijderd. Wacht totdat ze zijn verwijderd.", +"Do you want to merge these address books?" => "Wilt u deze adresboeken samenvoegen?", +"Result: " => "Resultaat:", +" imported, " => "geïmporteerd,", +" failed." => "gefaald.", +"Displayname cannot be empty." => "Displaynaam mag niet leeg zijn.", +"Addressbook not found: " => "Adresboek niet gevonden:", "This is not your addressbook." => "Dit is niet uw adresboek.", "Contact could not be found." => "Contact kon niet worden gevonden.", -"Address" => "Adres", -"Telephone" => "Telefoon", -"Email" => "E-mail", -"Organization" => "Organisatie", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Werk", "Home" => "Thuis", +"Other" => "Anders", "Mobile" => "Mobiel", "Text" => "Tekst", "Voice" => "Stem", @@ -54,11 +96,39 @@ "Pager" => "Pieper", "Internet" => "Internet", "Birthday" => "Verjaardag", +"Business" => "Business", +"Call" => "Bel", +"Clients" => "Klanten", +"Deliverer" => "Leverancier", +"Holidays" => "Vakanties", +"Ideas" => "Ideeën", +"Journey" => "Reis", +"Jubilee" => "Jubileum", +"Meeting" => "Vergadering", +"Personal" => "Persoonlijk", +"Projects" => "Projecten", +"Questions" => "Vragen", "{name}'s Birthday" => "{name}'s verjaardag", "Contact" => "Contact", +"You do not have the permissions to edit this contact." => "U heeft geen permissie om dit contact te bewerken.", +"You do not have the permissions to delete this contact." => "U heeft geen permissie om dit contact te verwijderen.", "Add Contact" => "Contact toevoegen", "Import" => "Importeer", +"Settings" => "Instellingen", "Addressbooks" => "Adresboeken", +"Close" => "Sluiten", +"Keyboard shortcuts" => "Sneltoetsen", +"Navigation" => "Navigatie", +"Next contact in list" => "Volgende contact in de lijst", +"Previous contact in list" => "Vorige contact in de lijst", +"Expand/collapse current addressbook" => "Uitklappen / inklappen huidig adresboek", +"Next addressbook" => "Volgende adresboek", +"Previous addressbook" => "Vorige adresboek", +"Actions" => "Acties", +"Refresh contacts list" => "Vernieuw contact lijst", +"Add new contact" => "Voeg nieuw contact toe", +"Add new addressbook" => "Voeg nieuw adresboek toe", +"Delete current contact" => "Verwijder huidig contact", "Drop photo to upload" => "Verwijder foto uit upload", "Delete current photo" => "Verwijdere huidige foto", "Edit current photo" => "Wijzig huidige foto", @@ -66,9 +136,13 @@ "Select photo from ownCloud" => "Selecteer foto uit ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit met komma", "Edit name details" => "Wijzig naam gegevens", +"Organization" => "Organisatie", "Delete" => "Verwijderen", "Nickname" => "Roepnaam", "Enter nickname" => "Voer roepnaam in", +"Web site" => "Website", +"http://www.somesite.com" => "http://www.willekeurigesite.com", +"Go to web site" => "Ga naar website", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Groepen", "Separate groups with commas" => "Gebruik komma bij meerder groepen", @@ -80,24 +154,41 @@ "Delete email address" => "Verwijder email adres", "Enter phone number" => "Voer telefoonnummer in", "Delete phone number" => "Verwijdere telefoonnummer", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "Verwijder IM", "View on map" => "Bekijk op een kaart", "Edit address details" => "Wijzig adres gegevens", "Add notes here." => "Voeg notitie toe", "Add field" => "Voeg veld toe", "Phone" => "Telefoon", +"Email" => "E-mail", +"Instant Messaging" => "Instant Messaging", +"Address" => "Adres", "Note" => "Notitie", "Download contact" => "Download contact", "Delete contact" => "Verwijder contact", +"The temporary image has been removed from cache." => "Het tijdelijke plaatje is uit de cache verwijderd.", "Edit address" => "Wijzig adres", "Type" => "Type", "PO Box" => "Postbus", +"Street address" => "Adres", +"Street and number" => "Straat en nummer", "Extended" => "Uitgebreide", +"Apartment number etc." => "Apartement nummer", "City" => "Stad", "Region" => "Regio", +"E.g. state or province" => "Provincie", "Zipcode" => "Postcode", +"Postal code" => "Postcode", "Country" => "Land", "Addressbook" => "Adresboek", "Hon. prefixes" => "Hon. prefixes", +"Miss" => "Mw", +"Ms" => "Mw", +"Mr" => "M", +"Sir" => "M", +"Mrs" => "Mw", +"Dr" => "M", "Given name" => "Voornaam", "Additional names" => "Extra namen", "Family name" => "Achternaam", @@ -106,16 +197,30 @@ "create a new addressbook" => "Maak een nieuw adresboek", "Name of new addressbook" => "Naam van nieuw adresboek", "Importing contacts" => "Importeren van contacten", +"Contacts imported successfully" => "Contacten zijn geïmporteerd", +"Close Dialog" => "Sluit venster", +"Import Addressbook" => "Importeer adresboek", +"Select address book to import to:" => "Selecteer adresboek voor import:", +"Drop a VCF file to import contacts." => "Sleep een VCF bestand om de contacten te importeren.", +"Select from HD" => "Selecteer van schijf", "You have no contacts in your addressbook." => "Je hebt geen contacten in je adresboek", "Add contact" => "Contactpersoon toevoegen", -"Configure addressbooks" => "Bewerken adresboeken", +"Select Address Books" => "Selecteer adresboeken", +"Enter name" => "Naam", +"Enter description" => "Beschrijving", "CardDAV syncing addresses" => "CardDAV synchroniseert de adressen", "more info" => "meer informatie", "Primary address (Kontact et al)" => "Standaardadres", "iOS/OS X" => "IOS/OS X", +"Show CardDav link" => "Laat CardDav link zien", +"Show read-only VCF link" => "Laat alleen lezen VCF link zien", +"Share" => "Deel", "Download" => "Download", "Edit" => "Bewerken", "New Address Book" => "Nieuw Adresboek", +"Name" => "Naam", +"Description" => "Beschrijving", "Save" => "Opslaan", -"Cancel" => "Anuleren" +"Cancel" => "Anuleren", +"More..." => "Meer..." ); diff --git a/apps/contacts/l10n/nn_NO.php b/apps/contacts/l10n/nn_NO.php index 0a4778283e..2e3ab16da3 100644 --- a/apps/contacts/l10n/nn_NO.php +++ b/apps/contacts/l10n/nn_NO.php @@ -5,15 +5,9 @@ "Cannot add empty property." => "Kan ikkje leggja til tomt felt.", "At least one of the address fields has to be filled out." => "Minst eit av adressefelta må fyllast ut.", "Information about vCard is incorrect. Please reload the page." => "Informasjonen om vCard-et er feil, ver venleg og last sida på nytt.", -"Error deleting contact property." => "Eit problem oppstod ved å slette kontaktfeltet.", -"Error updating contact property." => "Eit problem oppstod ved å endre kontaktfeltet.", "Contacts" => "Kotaktar", "This is not your addressbook." => "Dette er ikkje di adressebok.", "Contact could not be found." => "Fann ikkje kontakten.", -"Address" => "Adresse", -"Telephone" => "Telefonnummer", -"Email" => "Epost", -"Organization" => "Organisasjon", "Work" => "Arbeid", "Home" => "Heime", "Mobile" => "Mobil", @@ -26,9 +20,12 @@ "Contact" => "Kontakt", "Add Contact" => "Legg til kontakt", "Addressbooks" => "Adressebøker", +"Organization" => "Organisasjon", "Delete" => "Slett", "Preferred" => "Føretrekt", "Phone" => "Telefonnummer", +"Email" => "Epost", +"Address" => "Adresse", "Download contact" => "Last ned kontakt", "Delete contact" => "Slett kontakt", "Type" => "Skriv", diff --git a/apps/contacts/l10n/pl.php b/apps/contacts/l10n/pl.php index 5b26324007..924622ebb0 100644 --- a/apps/contacts/l10n/pl.php +++ b/apps/contacts/l10n/pl.php @@ -14,15 +14,12 @@ "Cannot add empty property." => "Nie można dodać pustego elementu.", "At least one of the address fields has to be filled out." => "Należy wypełnić przynajmniej jedno pole adresu.", "Trying to add duplicate property: " => "Próba dodania z duplikowanej właściwości:", -"Error adding contact property: " => "Błąd przy dodawaniu właściwości kontaktu:", "Information about vCard is incorrect. Please reload the page." => "Informacje o vCard są nieprawidłowe. Proszę odświeżyć stronę.", -"Error deleting contact property." => "Błąd usuwania elementu.", "Missing ID" => "Brak ID", "Error parsing VCard for ID: \"" => "Wystąpił błąd podczas przetwarzania VCard ID: \"", "checksum is not set." => "checksum-a nie ustawiona", "Information about vCard is incorrect. Please reload the page: " => "Informacje na temat vCard są niepoprawne. Proszę przeładuj stronę:", "Something went FUBAR. " => "Gdyby coś poszło FUBAR.", -"Error updating contact property." => "Błąd uaktualniania elementu.", "No contact ID was submitted." => "ID kontaktu nie został utworzony.", "Error reading contact photo." => "Błąd odczytu zdjęcia kontaktu.", "Error saving temporary file." => "Wystąpił błąd podczas zapisywania pliku tymczasowego.", @@ -59,18 +56,32 @@ "Edit name" => "Zmień nazwę", "No files selected for upload." => "Żadne pliki nie zostały zaznaczone do wysłania.", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "Plik, który próbujesz wysłać przekracza maksymalny rozmiar pliku przekazywania na tym serwerze.", +"Error loading profile picture." => "Błąd wczytywania zdjęcia profilu.", "Select type" => "Wybierz typ", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Niektóre kontakty są zaznaczone do usunięcia, ale nie są usunięte jeszcze. Proszę czekać na ich usunięcie.", +"Do you want to merge these address books?" => "Czy chcesz scalić te książki adresowe?", "Result: " => "Wynik: ", " imported, " => " importowane, ", " failed." => " nie powiodło się.", +"Displayname cannot be empty." => "Nazwa nie może być pusta.", +"Addressbook not found: " => "Nie znaleziono książki adresowej:", "This is not your addressbook." => "To nie jest Twoja książka adresowa.", "Contact could not be found." => "Nie można odnaleźć kontaktu.", -"Address" => "Adres", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacja", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GG", "Work" => "Praca", "Home" => "Dom", +"Other" => "Inne", "Mobile" => "Komórka", "Text" => "Połączenie tekstowe", "Voice" => "Połączenie głosowe", @@ -81,12 +92,14 @@ "Internet" => "Internet", "Birthday" => "Urodziny", "Business" => "Biznesowe", +"Call" => "Wywołanie", "Clients" => "Klienci", +"Deliverer" => "Doręczanie", "Holidays" => "Święta", "Ideas" => "Pomysły", "Journey" => "Podróż", +"Jubilee" => "Jubileusz", "Meeting" => "Spotkanie", -"Other" => "Inne", "Personal" => "Osobiste", "Projects" => "Projekty", "Questions" => "Pytania", @@ -101,6 +114,9 @@ "Navigation" => "Nawigacja", "Next contact in list" => "Następny kontakt na liście", "Previous contact in list" => "Poprzedni kontakt na liście", +"Expand/collapse current addressbook" => "Rozwiń/Zwiń bieżącą książkę adresową", +"Next addressbook" => "Następna książka adresowa", +"Previous addressbook" => "Poprzednia książka adresowa", "Actions" => "Akcje", "Refresh contacts list" => "Odśwież listę kontaktów", "Add new contact" => "Dodaj nowy kontakt", @@ -113,6 +129,7 @@ "Select photo from ownCloud" => "Wybierz zdjęcie z ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format niestandardowy, krótkie nazwy, imię i nazwisko, Odwracać lub Odwrócić z przecinkiem", "Edit name details" => "Edytuj szczegóły nazwy", +"Organization" => "Organizacja", "Delete" => "Usuwa książkę adresową", "Nickname" => "Nazwa", "Enter nickname" => "Wpisz nazwę", @@ -135,6 +152,8 @@ "Add notes here." => "Dodaj notatkę tutaj.", "Add field" => "Dodaj pole", "Phone" => "Telefon", +"Email" => "E-mail", +"Address" => "Adres", "Note" => "Uwaga", "Download contact" => "Pobiera kontakt", "Delete contact" => "Usuwa kontakt", @@ -142,10 +161,13 @@ "Edit address" => "Edytuj adres", "Type" => "Typ", "PO Box" => "Skrzynka pocztowa", +"Street address" => "Ulica", "Street and number" => "Ulica i numer", "Extended" => "Rozszerzony", +"Apartment number etc." => "Numer lokalu", "City" => "Miasto", "Region" => "Region", +"E.g. state or province" => "Np. stanu lub prowincji", "Zipcode" => "Kod pocztowy", "Postal code" => "Kod pocztowy", "Country" => "Kraj", @@ -176,7 +198,6 @@ "Importing contacts" => "importuj kontakty", "You have no contacts in your addressbook." => "Nie masz żadnych kontaktów w swojej książce adresowej.", "Add contact" => "Dodaj kontakt", -"Configure addressbooks" => "Konfiguruj książkę adresową", "Select Address Books" => "Wybierz książki adresowe", "Enter name" => "Wpisz nazwę", "Enter description" => "Wprowadź opis", @@ -184,9 +205,15 @@ "more info" => "więcej informacji", "Primary address (Kontact et al)" => "Pierwszy adres", "iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Pokaż link CardDAV", +"Show read-only VCF link" => "Pokaż tylko do odczytu łącze VCF", +"Share" => "Udostępnij", "Download" => "Pobiera książkę adresową", "Edit" => "Edytuje książkę adresową", "New Address Book" => "Nowa książka adresowa", +"Name" => "Nazwa", +"Description" => "Opis", "Save" => "Zapisz", -"Cancel" => "Anuluj" +"Cancel" => "Anuluj", +"More..." => "Więcej..." ); diff --git a/apps/contacts/l10n/pt_BR.php b/apps/contacts/l10n/pt_BR.php index 74b8650c6c..de43e6cbb0 100644 --- a/apps/contacts/l10n/pt_BR.php +++ b/apps/contacts/l10n/pt_BR.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço tem que ser preenchido.", "Trying to add duplicate property: " => "Tentando adiciona propriedade duplicada:", "Information about vCard is incorrect. Please reload the page." => "Informações sobre vCard é incorreta. Por favor, recarregue a página.", -"Error deleting contact property." => "Erro ao excluir propriedade de contato.", "Missing ID" => "Faltando ID", "Error parsing VCard for ID: \"" => "Erro de identificação VCard para ID:", "checksum is not set." => "checksum não definido.", "Information about vCard is incorrect. Please reload the page: " => "Informação sobre vCard incorreto. Por favor, recarregue a página:", "Something went FUBAR. " => "Something went FUBAR. ", -"Error updating contact property." => "Erro ao atualizar propriedades do contato.", "No contact ID was submitted." => "Nenhum ID do contato foi submetido.", "Error reading contact photo." => "Erro de leitura na foto do contato.", "Error saving temporary file." => "Erro ao salvar arquivo temporário.", @@ -63,10 +61,6 @@ " failed." => "falhou.", "This is not your addressbook." => "Esta não é a sua agenda de endereços.", "Contact could not be found." => "Contato não pôde ser encontrado.", -"Address" => "Endereço", -"Telephone" => "Telefone", -"Email" => "E-mail", -"Organization" => "Organização", "Work" => "Trabalho", "Home" => "Home", "Mobile" => "Móvel", @@ -91,6 +85,7 @@ "Select photo from ownCloud" => "Selecionar foto do OwnCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formato personalizado, Nome curto, Nome completo, Inverter ou Inverter com vírgula", "Edit name details" => "Editar detalhes do nome", +"Organization" => "Organização", "Delete" => "Excluir", "Nickname" => "Apelido", "Enter nickname" => "Digite o apelido", @@ -110,6 +105,8 @@ "Add notes here." => "Adicionar notas", "Add field" => "Adicionar campo", "Phone" => "Telefone", +"Email" => "E-mail", +"Address" => "Endereço", "Note" => "Nota", "Download contact" => "Baixar contato", "Delete contact" => "Apagar contato", @@ -149,7 +146,6 @@ "Importing contacts" => "Importar contatos", "You have no contacts in your addressbook." => "Voce não tem contatos em sua agenda de endereços.", "Add contact" => "Adicionar contatos", -"Configure addressbooks" => "Configurar agenda de endereços", "CardDAV syncing addresses" => "Sincronizando endereços CardDAV", "more info" => "leia mais", "Primary address (Kontact et al)" => "Endereço primário(Kontact et al)", diff --git a/apps/contacts/l10n/pt_PT.php b/apps/contacts/l10n/pt_PT.php index 269e63583f..38708c8620 100644 --- a/apps/contacts/l10n/pt_PT.php +++ b/apps/contacts/l10n/pt_PT.php @@ -10,17 +10,18 @@ "No contacts found." => "Nenhum contacto encontrado.", "There was an error adding the contact." => "Erro ao adicionar contato", "element name is not set." => "o nome do elemento não está definido.", +"Could not parse contact: " => "Incapaz de processar contacto", "Cannot add empty property." => "Não é possivel adicionar uma propriedade vazia", "At least one of the address fields has to be filled out." => "Pelo menos um dos campos de endereço precisa de estar preenchido", "Trying to add duplicate property: " => "A tentar adicionar propriedade duplicada: ", +"Missing IM parameter." => "Falta o parâmetro de mensagens instantâneas (IM)", +"Unknown IM: " => "Mensagens instantâneas desconhecida (IM)", "Information about vCard is incorrect. Please reload the page." => "A informação sobre o vCard está incorreta. Por favor refresque a página", -"Error deleting contact property." => "Erro ao apagar propriedade do contato", "Missing ID" => "Falta ID", "Error parsing VCard for ID: \"" => "Erro a analisar VCard para o ID: \"", "checksum is not set." => "Checksum não está definido.", "Information about vCard is incorrect. Please reload the page: " => "A informação sobre o VCard está incorrecta. Por favor refresque a página: ", "Something went FUBAR. " => "Algo provocou um FUBAR. ", -"Error updating contact property." => "Erro ao atualizar propriedade do contato", "No contact ID was submitted." => "Nenhum ID de contacto definido.", "Error reading contact photo." => "Erro a ler a foto do contacto.", "Error saving temporary file." => "Erro a guardar ficheiro temporário.", @@ -57,18 +58,32 @@ "Edit name" => "Editar nome", "No files selected for upload." => "Nenhum ficheiro seleccionado para enviar.", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "O tamanho do ficheiro que está a tentar carregar ultrapassa o limite máximo definido para ficheiros no servidor.", +"Error loading profile picture." => "Erro ao carregar imagem de perfil.", "Select type" => "Seleccionar tipo", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Alguns contactos forma marcados para apagar, mas ainda não foram apagados. Por favor espere que ele sejam apagados.", +"Do you want to merge these address books?" => "Quer fundir estes Livros de endereços?", "Result: " => "Resultado: ", " imported, " => " importado, ", " failed." => " falhou.", +"Displayname cannot be empty." => "Displayname não pode ser vazio", +"Addressbook not found: " => "Livro de endereços não encontrado.", "This is not your addressbook." => "Esta não é a sua lista de contactos", "Contact could not be found." => "O contacto não foi encontrado", -"Address" => "Morada", -"Telephone" => "Telefone", -"Email" => "Email", -"Organization" => "Organização", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Emprego", "Home" => "Casa", +"Other" => "Outro", "Mobile" => "Telemovel", "Text" => "Texto", "Voice" => "Voz", @@ -78,12 +93,37 @@ "Pager" => "Pager", "Internet" => "Internet", "Birthday" => "Aniversário", +"Business" => "Empresa", +"Call" => "Telefonar", +"Clients" => "Clientes", +"Deliverer" => "Fornecedor", +"Holidays" => "Férias", +"Ideas" => "Ideias", +"Journey" => "Viagem", +"Jubilee" => "Jubileu", +"Meeting" => "Encontro", +"Personal" => "Pessoal", +"Projects" => "Projectos", +"Questions" => "Questões", "{name}'s Birthday" => "Aniversário de {name}", "Contact" => "Contacto", "Add Contact" => "Adicionar Contacto", "Import" => "Importar", +"Settings" => "Configurações", "Addressbooks" => "Livros de endereços", "Close" => "Fechar", +"Keyboard shortcuts" => "Atalhos de teclado", +"Navigation" => "Navegação", +"Next contact in list" => "Próximo contacto na lista", +"Previous contact in list" => "Contacto anterior na lista", +"Expand/collapse current addressbook" => "Expandir/encolher o livro de endereços atual", +"Next addressbook" => "Próximo livro de endereços", +"Previous addressbook" => "Livro de endereços anterior", +"Actions" => "Ações", +"Refresh contacts list" => "Recarregar lista de contactos", +"Add new contact" => "Adicionar novo contacto", +"Add new addressbook" => "Adicionar novo Livro de endereços", +"Delete current contact" => "Apagar o contacto atual", "Drop photo to upload" => "Arraste e solte fotos para carregar", "Delete current photo" => "Eliminar a foto actual", "Edit current photo" => "Editar a foto actual", @@ -91,9 +131,13 @@ "Select photo from ownCloud" => "Selecionar uma foto da ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formate personalizado, Nome curto, Nome completo, Reverso ou Reverso com virgula", "Edit name details" => "Editar detalhes do nome", +"Organization" => "Organização", "Delete" => "Apagar", "Nickname" => "Alcunha", "Enter nickname" => "Introduza alcunha", +"Web site" => "Página web", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Ir para página web", "dd-mm-yyyy" => "dd-mm-aaaa", "Groups" => "Grupos", "Separate groups with commas" => "Separe os grupos usando virgulas", @@ -105,11 +149,16 @@ "Delete email address" => "Eliminar o endereço de correio", "Enter phone number" => "Insira o número de telefone", "Delete phone number" => "Eliminar o número de telefone", +"Instant Messenger" => "Mensageiro instantâneo", +"Delete IM" => "Apagar mensageiro instantâneo (IM)", "View on map" => "Ver no mapa", "Edit address details" => "Editar os detalhes do endereço", "Add notes here." => "Insira notas aqui.", "Add field" => "Adicionar campo", "Phone" => "Telefone", +"Email" => "Email", +"Instant Messaging" => "Mensagens Instantâneas", +"Address" => "Morada", "Note" => "Nota", "Download contact" => "Transferir contacto", "Delete contact" => "Apagar contato", @@ -117,10 +166,15 @@ "Edit address" => "Editar endereço", "Type" => "Tipo", "PO Box" => "Apartado", +"Street address" => "Endereço da Rua", +"Street and number" => "Rua e número", "Extended" => "Extendido", +"Apartment number etc." => "Número de Apartamento, etc.", "City" => "Cidade", "Region" => "Região", +"E.g. state or province" => "Por Ex. Estado ou província", "Zipcode" => "Código Postal", +"Postal code" => "Código Postal", "Country" => "País", "Addressbook" => "Livro de endereços", "Hon. prefixes" => "Prefixos honoráveis", @@ -149,14 +203,22 @@ "Importing contacts" => "A importar os contactos", "You have no contacts in your addressbook." => "Não tem contactos no seu livro de endereços.", "Add contact" => "Adicionar contacto", -"Configure addressbooks" => "Configurar livros de endereços", +"Select Address Books" => "Selecionar Livros de contactos", +"Enter name" => "Introduzir nome", +"Enter description" => "Introduzir descrição", "CardDAV syncing addresses" => "CardDAV a sincronizar endereços", "more info" => "mais informação", "Primary address (Kontact et al)" => "Endereço primario (Kontact et al)", "iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Mostrar ligação CardDAV", +"Show read-only VCF link" => "Mostrar ligações VCF só de leitura", +"Share" => "Partilhar", "Download" => "Transferir", "Edit" => "Editar", "New Address Book" => "Novo livro de endereços", +"Name" => "Nome", +"Description" => "Descrição", "Save" => "Guardar", -"Cancel" => "Cancelar" +"Cancel" => "Cancelar", +"More..." => "Mais..." ); diff --git a/apps/contacts/l10n/ro.php b/apps/contacts/l10n/ro.php index 15a34db7d7..291e8d54f7 100644 --- a/apps/contacts/l10n/ro.php +++ b/apps/contacts/l10n/ro.php @@ -12,11 +12,9 @@ "Cannot add empty property." => "Nu se poate adăuga un câmp gol.", "At least one of the address fields has to be filled out." => "Cel puțin unul din câmpurile adresei trebuie completat.", "Information about vCard is incorrect. Please reload the page." => "Informațiile cărții de vizită sunt incorecte. Te rog reîncarcă pagina.", -"Error deleting contact property." => "Eroare la ștergerea proprietăților contactului.", "Missing ID" => "ID lipsă", "Error parsing VCard for ID: \"" => "Eroare la prelucrarea VCard-ului pentru ID:\"", "checksum is not set." => "suma de control nu este stabilită.", -"Error updating contact property." => "Eroare la actualizarea proprietăților contactului.", "No contact ID was submitted." => "Nici un ID de contact nu a fost transmis", "Error reading contact photo." => "Eroare la citerea fotografiei de contact", "Error saving temporary file." => "Eroare la salvarea fișierului temporar.", @@ -28,10 +26,6 @@ "Contacts" => "Contacte", "This is not your addressbook." => "Nu se găsește în agendă.", "Contact could not be found." => "Contactul nu a putut fi găsit.", -"Address" => "Adresă", -"Telephone" => "Telefon", -"Email" => "Email", -"Organization" => "Organizație", "Work" => "Servicu", "Home" => "Acasă", "Mobile" => "Mobil", @@ -48,6 +42,7 @@ "Add Contact" => "Adaugă contact", "Addressbooks" => "Agende", "Edit name details" => "Introdu detalii despre nume", +"Organization" => "Organizație", "Delete" => "Șterge", "Nickname" => "Pseudonim", "Enter nickname" => "Introdu pseudonim", @@ -61,6 +56,8 @@ "Mail to address" => "Trimite mesaj la e-mail", "Delete email address" => "Șterge e-mail", "Phone" => "Telefon", +"Email" => "Email", +"Address" => "Adresă", "Download contact" => "Descarcă acest contact", "Delete contact" => "Șterge contact", "Type" => "Tip", diff --git a/apps/contacts/l10n/ru.php b/apps/contacts/l10n/ru.php index 308325cb53..eaeb385d3b 100644 --- a/apps/contacts/l10n/ru.php +++ b/apps/contacts/l10n/ru.php @@ -10,17 +10,18 @@ "No contacts found." => "Контакты не найдены.", "There was an error adding the contact." => "Произошла ошибка при добавлении контакта.", "element name is not set." => "имя элемента не установлено.", +"Could not parse contact: " => "Невозможно распознать контакт:", "Cannot add empty property." => "Невозможно добавить пустой параметр.", "At least one of the address fields has to be filled out." => "Как минимум одно поле адреса должно быть заполнено.", "Trying to add duplicate property: " => "При попытке добавить дубликат:", +"Missing IM parameter." => "Отсутствует параметр IM.", +"Unknown IM: " => "Неизвестный IM:", "Information about vCard is incorrect. Please reload the page." => "Информация о vCard некорректна. Пожалуйста, обновите страницу.", -"Error deleting contact property." => "Ошибка удаления информации из контакта.", "Missing ID" => "Отсутствует ID", "Error parsing VCard for ID: \"" => "Ошибка обработки VCard для ID: \"", "checksum is not set." => "контрольная сумма не установлена.", "Information about vCard is incorrect. Please reload the page: " => "Информация о vCard не корректна. Перезагрузите страницу: ", "Something went FUBAR. " => "Что-то пошло FUBAR.", -"Error updating contact property." => "Ошибка обновления информации контакта.", "No contact ID was submitted." => "Нет контакта ID", "Error reading contact photo." => "Ошибка чтения фотографии контакта.", "Error saving temporary file." => "Ошибка сохранения временного файла.", @@ -51,24 +52,41 @@ "Not implemented" => "Не реализовано", "Couldn't get a valid address." => "Не удалось получить адрес.", "Error" => "Ошибка", +"You do not have permission to add contacts to " => "У вас нет разрешений добавлять контакты в", +"Please select one of your own address books." => "Выберите одну из ваших собственных адресных книг.", +"Permission error" => "Ошибка доступа", "This property has to be non-empty." => "Это свойство должно быть не пустым.", "Couldn't serialize elements." => "Не удалось сериализовать элементы.", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "'deleteProperty' called without type argument. Please report at bugs.owncloud.org", "Edit name" => "Изменить имя", "No files selected for upload." => "Нет выбранных файлов для загрузки.", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "Файл, который вы пытаетесь загрузить превышать максимальный размер загружаемых файлов на этом сервере.", +"Error loading profile picture." => "Ошибка загрузки изображения профиля.", "Select type" => "Выберите тип", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Некоторые контакты помечены на удаление, но ещё не удалены. Подождите, пока они удаляются.", +"Do you want to merge these address books?" => "Вы хотите соединить эти адресные книги?", "Result: " => "Результат:", " imported, " => "импортировано, ", " failed." => "не удалось.", +"Displayname cannot be empty." => "Отображаемое имя не может быть пустым.", +"Addressbook not found: " => "Адресная книга не найдена:", "This is not your addressbook." => "Это не ваша адресная книга.", "Contact could not be found." => "Контакт не найден.", -"Address" => "Адрес", -"Telephone" => "Телефон", -"Email" => "Ящик эл. почты", -"Organization" => "Организация", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Рабочий", "Home" => "Домашний", +"Other" => "Другое", "Mobile" => "Мобильный", "Text" => "Текст", "Voice" => "Голос", @@ -78,12 +96,39 @@ "Pager" => "Пейджер", "Internet" => "Интернет", "Birthday" => "День рождения", +"Business" => "Бизнес", +"Call" => "Вызов", +"Clients" => "Клиенты", +"Deliverer" => "Посыльный", +"Holidays" => "Праздники", +"Ideas" => "Идеи", +"Journey" => "Поездка", +"Jubilee" => "Юбилей", +"Meeting" => "Встреча", +"Personal" => "Личный", +"Projects" => "Проекты", +"Questions" => "Вопросы", "{name}'s Birthday" => "День рождения {name}", "Contact" => "Контакт", +"You do not have the permissions to edit this contact." => "У вас нет разрешений редактировать этот контакт.", +"You do not have the permissions to delete this contact." => "У вас нет разрешений удалять этот контакт.", "Add Contact" => "Добавить Контакт", "Import" => "Импорт", +"Settings" => "Настройки", "Addressbooks" => "Адресные книги", "Close" => "Закрыть", +"Keyboard shortcuts" => "Горячие клавиши", +"Navigation" => "Навигация", +"Next contact in list" => "Следующий контакт в списке", +"Previous contact in list" => "Предыдущий контакт в списке", +"Expand/collapse current addressbook" => "Развернуть/свернуть текущую адресную книгу", +"Next addressbook" => "Следующая адресная книга", +"Previous addressbook" => "Предыдущая адресная книга", +"Actions" => "Действия", +"Refresh contacts list" => "Обновить список контактов", +"Add new contact" => "Добавить новый контакт", +"Add new addressbook" => "Добавить новую адресную книгу", +"Delete current contact" => "Удалить текущий контакт", "Drop photo to upload" => "Перетяните фотографии для загрузки", "Delete current photo" => "Удалить текущую фотографию", "Edit current photo" => "Редактировать текущую фотографию", @@ -91,9 +136,13 @@ "Select photo from ownCloud" => "Выбрать фотографию из ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Формат Краткое имя, Полное имя", "Edit name details" => "Изменить детали имени", +"Organization" => "Организация", "Delete" => "Удалить", "Nickname" => "Псевдоним", "Enter nickname" => "Введите псевдоним", +"Web site" => "Веб-сайт", +"http://www.somesite.com" => "http://www.somesite.com", +"Go to web site" => "Перейти на веб-сайт", "dd-mm-yyyy" => "dd-mm-yyyy", "Groups" => "Группы", "Separate groups with commas" => "Разделить группы запятыми", @@ -105,11 +154,16 @@ "Delete email address" => "Удалить адрес электронной почты", "Enter phone number" => "Ввести номер телефона", "Delete phone number" => "Удалить номер телефона", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "Удалить IM", "View on map" => "Показать на карте", "Edit address details" => "Ввести детали адреса", "Add notes here." => "Добавьте заметки здесь.", "Add field" => "Добавить поле", "Phone" => "Телефон", +"Email" => "Ящик эл. почты", +"Instant Messaging" => "Быстрые сообщения", +"Address" => "Адрес", "Note" => "Заметка", "Download contact" => "Скачать контакт", "Delete contact" => "Удалить контакт", @@ -117,10 +171,15 @@ "Edit address" => "Редактировать адрес", "Type" => "Тип", "PO Box" => "АО", +"Street address" => "Улица", +"Street and number" => "Улица и дом", "Extended" => "Расширенный", +"Apartment number etc." => "Номер квартиры и т.д.", "City" => "Город", "Region" => "Область", +"E.g. state or province" => "Например, область или район", "Zipcode" => "Почтовый индекс", +"Postal code" => "Почтовый индекс", "Country" => "Страна", "Addressbook" => "Адресная книга", "Hon. prefixes" => "Уважительные префиксы", @@ -149,14 +208,22 @@ "Importing contacts" => "Импорт контактов", "You have no contacts in your addressbook." => "В адресной книге нет контактов.", "Add contact" => "Добавить контакт", -"Configure addressbooks" => "Настроить адресную книгу", +"Select Address Books" => "Выбрать адресную книгу", +"Enter name" => "Введите имя", +"Enter description" => "Ввдите описание", "CardDAV syncing addresses" => "CardDAV синхронизации адресов", "more info" => "дополнительная информация", "Primary address (Kontact et al)" => "Первичный адрес (Kontact и др.)", "iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Показать ссылку CardDav", +"Show read-only VCF link" => "Показать нередактируемую ссылку VCF", +"Share" => "Опубликовать", "Download" => "Скачать", "Edit" => "Редактировать", "New Address Book" => "Новая адресная книга", +"Name" => "Имя", +"Description" => "Описание", "Save" => "Сохранить", -"Cancel" => "Отменить" +"Cancel" => "Отменить", +"More..." => "Ещё..." ); diff --git a/apps/contacts/l10n/sk_SK.php b/apps/contacts/l10n/sk_SK.php index 2afbd62091..54ae324d93 100644 --- a/apps/contacts/l10n/sk_SK.php +++ b/apps/contacts/l10n/sk_SK.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "Musí byť uvedený aspoň jeden adresný údaj.", "Trying to add duplicate property: " => "Pokúšate sa pridať rovnaký atribút:", "Information about vCard is incorrect. Please reload the page." => "Informácie o vCard sú neplatné. Prosím obnovte stránku.", -"Error deleting contact property." => "Chyba odstránenia údaju kontaktu.", "Missing ID" => "Chýba ID", "Error parsing VCard for ID: \"" => "Chyba pri vyňatí ID z VCard:", "checksum is not set." => "kontrolný súčet nie je nastavený.", "Information about vCard is incorrect. Please reload the page: " => "Informácia o vCard je nesprávna. Obnovte stránku, prosím.", "Something went FUBAR. " => "Niečo sa pokazilo.", -"Error updating contact property." => "Chyba aktualizovania údaju kontaktu.", "No contact ID was submitted." => "Nebolo nastavené ID kontaktu.", "Error reading contact photo." => "Chyba pri čítaní fotky kontaktu.", "Error saving temporary file." => "Chyba pri ukladaní dočasného súboru.", @@ -63,12 +61,9 @@ " failed." => " zlyhaných.", "This is not your addressbook." => "Toto nie je váš adresár.", "Contact could not be found." => "Kontakt nebol nájdený.", -"Address" => "Adresa", -"Telephone" => "Telefón", -"Email" => "E-mail", -"Organization" => "Organizácia", "Work" => "Práca", "Home" => "Domov", +"Other" => "Iné", "Mobile" => "Mobil", "Text" => "SMS", "Voice" => "Odkazová schránka", @@ -82,7 +77,6 @@ "Clients" => "Klienti", "Holidays" => "Prázdniny", "Meeting" => "Stretnutie", -"Other" => "Iné", "Projects" => "Projekty", "Questions" => "Otázky", "{name}'s Birthday" => "Narodeniny {name}", @@ -107,6 +101,7 @@ "Select photo from ownCloud" => "Vybrať fotku z ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené s čiarkami", "Edit name details" => "Upraviť podrobnosti mena", +"Organization" => "Organizácia", "Delete" => "Odstrániť", "Nickname" => "Prezývka", "Enter nickname" => "Zadajte prezývku", @@ -126,6 +121,8 @@ "Add notes here." => "Tu môžete pridať poznámky.", "Add field" => "Pridať pole", "Phone" => "Telefón", +"Email" => "E-mail", +"Address" => "Adresa", "Note" => "Poznámka", "Download contact" => "Stiahnuť kontakt", "Delete contact" => "Odstrániť kontakt", @@ -166,9 +163,14 @@ "create a new addressbook" => "vytvoriť nový adresár", "Name of new addressbook" => "Meno nového adresára", "Importing contacts" => "Importovanie kontaktov", +"Contacts imported successfully" => "Kontakty úspešne importované", +"Close Dialog" => "Zatvoriť ponuku", +"Import Addressbook" => "Importovanie adresára", +"Select address book to import to:" => "Vyberte adresár, do ktorého chcete importovať:", +"Drop a VCF file to import contacts." => "Pretiahnite VCF súbor pre import kontaktov.", +"Select from HD" => "Vyberte z pevného disku", "You have no contacts in your addressbook." => "Nemáte žiadne kontakty v adresári.", "Add contact" => "Pridať kontakt", -"Configure addressbooks" => "Nastaviť adresáre", "Enter name" => "Zadaj meno", "CardDAV syncing addresses" => "Adresy pre synchronizáciu s CardDAV", "more info" => "viac informácií", diff --git a/apps/contacts/l10n/sl.php b/apps/contacts/l10n/sl.php index 1dc0cef74b..f65f0452f1 100644 --- a/apps/contacts/l10n/sl.php +++ b/apps/contacts/l10n/sl.php @@ -10,17 +10,18 @@ "No contacts found." => "Ni bilo najdenih stikov.", "There was an error adding the contact." => "Med dodajanjem stika je prišlo do napake", "element name is not set." => "ime elementa ni nastavljeno.", +"Could not parse contact: " => "Ne morem razčleniti stika:", "Cannot add empty property." => "Ne morem dodati prazne lastnosti.", "At least one of the address fields has to be filled out." => "Vsaj eno izmed polj je še potrebno izpolniti.", "Trying to add duplicate property: " => "Poskušam dodati podvojeno lastnost:", +"Missing IM parameter." => "Manjkajoč IM parameter.", +"Unknown IM: " => "Neznan IM:", "Information about vCard is incorrect. Please reload the page." => "Informacije o vCard niso pravilne. Prosimo, če ponovno naložite stran.", -"Error deleting contact property." => "Napaka pri brisanju lastnosti stika.", "Missing ID" => "Manjkajoč ID", "Error parsing VCard for ID: \"" => "Napaka pri razčlenjevanju VCard za ID: \"", "checksum is not set." => "nadzorna vsota ni nastavljena.", "Information about vCard is incorrect. Please reload the page: " => "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: ", "Something went FUBAR. " => "Nekaj je šlo v franže. ", -"Error updating contact property." => "Napaka pri posodabljanju lastnosti stika.", "No contact ID was submitted." => "ID stika ni bil poslan.", "Error reading contact photo." => "Napaka pri branju slike stika.", "Error saving temporary file." => "Napaka pri shranjevanju začasne datoteke.", @@ -51,24 +52,41 @@ "Not implemented" => "Ni podprto", "Couldn't get a valid address." => "Ne morem dobiti veljavnega naslova.", "Error" => "Napaka", +"You do not have permission to add contacts to " => "Nimate dovoljenja za dodajanje stikov v", +"Please select one of your own address books." => "Prosimo, če izberete enega izmed vaših adresarjev.", +"Permission error" => "Napaka dovoljenj", "This property has to be non-empty." => "Ta lastnost ne sme biti prazna", "Couldn't serialize elements." => "Predmetov ni bilo mogoče dati v zaporedje.", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" je bila klicana brez vrste argumenta. Prosimo, če oddate poročilo o napaki na bugs.owncloud.org", "Edit name" => "Uredi ime", "No files selected for upload." => "Nobena datoteka ni bila izbrana za nalaganje.", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "Datoteka, ki jo poskušate naložiti, presega največjo dovoljeno velikost za nalaganje na tem strežniku.", +"Error loading profile picture." => "Napaka pri nalaganju slike profila.", "Select type" => "Izberite vrsto", +"Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Nekateri stiki so označeni za izbris, vendar še niso izbrisani. Prosimo, če počakate na njihov izbris.", +"Do you want to merge these address books?" => "Ali želite združiti adresarje?", "Result: " => "Rezultati: ", " imported, " => " uvoženih, ", " failed." => " je spodletelo.", +"Displayname cannot be empty." => "Ime za prikaz ne more biti prazno.", +"Addressbook not found: " => "Adresar ni bil najden:", "This is not your addressbook." => "To ni vaš imenik.", "Contact could not be found." => "Stika ni bilo mogoče najti.", -"Address" => "Naslov", -"Telephone" => "Telefon", -"Email" => "E-pošta", -"Organization" => "Organizacija", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Delo", "Home" => "Doma", +"Other" => "Drugo", "Mobile" => "Mobilni telefon", "Text" => "Besedilo", "Voice" => "Glas", @@ -78,12 +96,39 @@ "Pager" => "Pozivnik", "Internet" => "Internet", "Birthday" => "Rojstni dan", +"Business" => "Poslovno", +"Call" => "Klic", +"Clients" => "Stranka", +"Deliverer" => "Dostavljalec", +"Holidays" => "Prazniki", +"Ideas" => "Ideje", +"Journey" => "Potovanje", +"Jubilee" => "Jubilej", +"Meeting" => "Sestanek", +"Personal" => "Osebno", +"Projects" => "Projekti", +"Questions" => "Vprašanja", "{name}'s Birthday" => "{name} - rojstni dan", "Contact" => "Stik", +"You do not have the permissions to edit this contact." => "Nimate dovoljenj za urejanje tega stika.", +"You do not have the permissions to delete this contact." => "Nimate dovoljenj za izbris tega stika.", "Add Contact" => "Dodaj stik", "Import" => "Uvozi", +"Settings" => "Nastavitve", "Addressbooks" => "Imeniki", "Close" => "Zapri", +"Keyboard shortcuts" => "Bližnjice na tipkovnici", +"Navigation" => "Krmarjenje", +"Next contact in list" => "Naslednji stik na seznamu", +"Previous contact in list" => "Predhodni stik na seznamu", +"Expand/collapse current addressbook" => "Razširi/skrči trenutni adresar", +"Next addressbook" => "Naslednji adresar", +"Previous addressbook" => "Predhodni adresar", +"Actions" => "Dejanja", +"Refresh contacts list" => "Osveži seznam stikov", +"Add new contact" => "Dodaj nov stik", +"Add new addressbook" => "Dodaj nov adresar", +"Delete current contact" => "Izbriši trenutni stik", "Drop photo to upload" => "Spustite sliko tukaj, da bi jo naložili", "Delete current photo" => "Izbriši trenutno sliko", "Edit current photo" => "Uredi trenutno sliko", @@ -91,9 +136,13 @@ "Select photo from ownCloud" => "Izberi sliko iz ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico", "Edit name details" => "Uredite podrobnosti imena", +"Organization" => "Organizacija", "Delete" => "Izbriši", "Nickname" => "Vzdevek", "Enter nickname" => "Vnesite vzdevek", +"Web site" => "Spletna stran", +"http://www.somesite.com" => "http://www.nekastran.si", +"Go to web site" => "Pojdi na spletno stran", "dd-mm-yyyy" => "dd. mm. yyyy", "Groups" => "Skupine", "Separate groups with commas" => "Skupine ločite z vejicami", @@ -105,11 +154,16 @@ "Delete email address" => "Izbriši e-poštni naslov", "Enter phone number" => "Vpiši telefonsko številko", "Delete phone number" => "Izbriši telefonsko številko", +"Instant Messenger" => "Takojšni sporočilnik", +"Delete IM" => "Izbriši IM", "View on map" => "Prikaz na zemljevidu", "Edit address details" => "Uredi podrobnosti", "Add notes here." => "Opombe dodajte tukaj.", "Add field" => "Dodaj polje", "Phone" => "Telefon", +"Email" => "E-pošta", +"Instant Messaging" => "Neposredno sporočanje", +"Address" => "Naslov", "Note" => "Opomba", "Download contact" => "Prenesi stik", "Delete contact" => "Izbriši stik", @@ -117,10 +171,15 @@ "Edit address" => "Uredi naslov", "Type" => "Vrsta", "PO Box" => "Poštni predal", +"Street address" => "Ulični naslov", +"Street and number" => "Ulica in štelika", "Extended" => "Razširjeno", +"Apartment number etc." => "Številka stanovanja itd.", "City" => "Mesto", "Region" => "Regija", +"E.g. state or province" => "Npr. dežela ali pokrajina", "Zipcode" => "Poštna št.", +"Postal code" => "Poštna številka", "Country" => "Dežela", "Addressbook" => "Imenik", "Hon. prefixes" => "Predpone", @@ -147,16 +206,30 @@ "create a new addressbook" => "Ustvari nov imenik", "Name of new addressbook" => "Ime novega imenika", "Importing contacts" => "Uvažam stike", +"Contacts imported successfully" => "Stiki so bili uspešno uvoženi", +"Close Dialog" => "Zapri dialog", +"Import Addressbook" => "Uvozi imenik", +"Select address book to import to:" => "Izberite imenik v katerega boste uvažali:", +"Drop a VCF file to import contacts." => "Za uvoz stikov spustite VCF datoteko tukaj.", +"Select from HD" => "Izberi iz HD", "You have no contacts in your addressbook." => "V vašem imeniku ni stikov.", "Add contact" => "Dodaj stik", -"Configure addressbooks" => "Nastavi imenike", +"Select Address Books" => "Izberite adresarje", +"Enter name" => "Vnesite ime", +"Enter description" => "Vnesite opis", "CardDAV syncing addresses" => "CardDAV naslovi za sinhronizacijo", "more info" => "več informacij", "Primary address (Kontact et al)" => "Primarni naslov (za kontakt et al)", "iOS/OS X" => "iOS/OS X", +"Show CardDav link" => "Pokaži CardDav povezavo", +"Show read-only VCF link" => "Pokaži VCF povezavo samo za branje", +"Share" => "Souporaba", "Download" => "Prenesi", "Edit" => "Uredi", "New Address Book" => "Nov imenik", +"Name" => "Ime", +"Description" => "Opis", "Save" => "Shrani", -"Cancel" => "Prekliči" +"Cancel" => "Prekliči", +"More..." => "Več..." ); diff --git a/apps/contacts/l10n/sr.php b/apps/contacts/l10n/sr.php index ad8e1c28fb..f54741c182 100644 --- a/apps/contacts/l10n/sr.php +++ b/apps/contacts/l10n/sr.php @@ -3,10 +3,6 @@ "Contacts" => "Контакти", "This is not your addressbook." => "Ово није ваш адресар.", "Contact could not be found." => "Контакт се не може наћи.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Е-маил", -"Organization" => "Организација", "Work" => "Посао", "Home" => "Кућа", "Mobile" => "Мобилни", @@ -19,9 +15,12 @@ "Contact" => "Контакт", "Add Contact" => "Додај контакт", "Addressbooks" => "Адресар", +"Organization" => "Организација", "Delete" => "Обриши", "Preferred" => "Пожељан", "Phone" => "Телефон", +"Email" => "Е-маил", +"Address" => "Адреса", "Download contact" => "Преузми контакт", "Delete contact" => "Обриши контакт", "Type" => "Тип", diff --git a/apps/contacts/l10n/sr@latin.php b/apps/contacts/l10n/sr@latin.php index 3d0c0d2b8f..f06539ab43 100644 --- a/apps/contacts/l10n/sr@latin.php +++ b/apps/contacts/l10n/sr@latin.php @@ -2,10 +2,6 @@ "Information about vCard is incorrect. Please reload the page." => "Podaci o vKarti su neispravni. Ponovo učitajte stranicu.", "This is not your addressbook." => "Ovo nije vaš adresar.", "Contact could not be found." => "Kontakt se ne može naći.", -"Address" => "Adresa", -"Telephone" => "Telefon", -"Email" => "E-mail", -"Organization" => "Organizacija", "Work" => "Posao", "Home" => "Kuća", "Mobile" => "Mobilni", @@ -16,8 +12,11 @@ "Pager" => "Pejdžer", "Birthday" => "Rođendan", "Add Contact" => "Dodaj kontakt", +"Organization" => "Organizacija", "Delete" => "Obriši", "Phone" => "Telefon", +"Email" => "E-mail", +"Address" => "Adresa", "PO Box" => "Poštanski broj", "Extended" => "Proširi", "City" => "Grad", diff --git a/apps/contacts/l10n/sv.php b/apps/contacts/l10n/sv.php index f470a338b6..88aac866f6 100644 --- a/apps/contacts/l10n/sv.php +++ b/apps/contacts/l10n/sv.php @@ -13,15 +13,15 @@ "Could not parse contact: " => "Kunde inte läsa kontakt:", "Cannot add empty property." => "Kan inte lägga till en tom egenskap.", "At least one of the address fields has to be filled out." => "Minst ett fält måste fyllas i.", -"Error adding contact property: " => "Kunde inte lägga till egenskap för kontakt:", +"Trying to add duplicate property: " => "Försöker lägga till dubblett:", +"Missing IM parameter." => "IM parameter saknas.", +"Unknown IM: " => "Okänt IM:", "Information about vCard is incorrect. Please reload the page." => "Information om vCard är felaktigt. Vänligen ladda om sidan.", -"Error deleting contact property." => "Fel uppstod när kontaktegenskap skulle tas bort.", "Missing ID" => "ID saknas", "Error parsing VCard for ID: \"" => "Fel vid läsning av VCard för ID: \"", "checksum is not set." => "kontrollsumma är inte satt.", "Information about vCard is incorrect. Please reload the page: " => "Informationen om vCard är fel. Ladda om sidan:", "Something went FUBAR. " => "Något gick fel.", -"Error updating contact property." => "Fel uppstod när kontaktegenskap skulle uppdateras.", "No contact ID was submitted." => "Inget kontakt-ID angavs.", "Error reading contact photo." => "Fel uppstod vid läsning av kontaktfoto.", "Error saving temporary file." => "Fel uppstod när temporär fil skulle sparas.", @@ -52,14 +52,19 @@ "Not implemented" => "Inte införd", "Couldn't get a valid address." => "Kunde inte hitta en giltig adress.", "Error" => "Fel", +"You do not have permission to add contacts to " => "Du saknar behörighet att skapa kontakter i", +"Please select one of your own address books." => "Välj en av dina egna adressböcker.", +"Permission error" => "Behörighetsfel", "This property has to be non-empty." => "Denna egenskap får inte vara tom.", "Couldn't serialize elements." => "Kunde inte serialisera element.", "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" => "\"deleteProperty\" anropades utan typargument. Vänligen rapportera till bugs.owncloud.org", "Edit name" => "Ändra namn", "No files selected for upload." => "Inga filer valda för uppladdning", "The file you are trying to upload exceed the maximum size for file uploads on this server." => "Filen du försöker ladda upp är större än den maximala storleken för filuppladdning på denna server.", +"Error loading profile picture." => "Fel vid hämtning av profilbild.", "Select type" => "Välj typ", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "Vissa kontakter är markerade för radering, men är inte raderade än. Vänta tills dom är raderade.", +"Do you want to merge these address books?" => "Vill du slå samman dessa adressböcker?", "Result: " => "Resultat:", " imported, " => "importerad,", " failed." => "misslyckades.", @@ -67,12 +72,21 @@ "Addressbook not found: " => "Adressboken hittades inte:", "This is not your addressbook." => "Det här är inte din adressbok.", "Contact could not be found." => "Kontakt kunde inte hittas.", -"Address" => "Adress", -"Telephone" => "Telefon", -"Email" => "E-post", -"Organization" => "Organisation", +"Jabber" => "Jabber", +"AIM" => "AIM", +"MSN" => "MSN", +"Twitter" => "Twitter", +"GoogleTalk" => "GoogleTalk", +"Facebook" => "Facebook", +"XMPP" => "XMPP", +"ICQ" => "ICQ", +"Yahoo" => "Yahoo", +"Skype" => "Skype", +"QQ" => "QQ", +"GaduGadu" => "GaduGadu", "Work" => "Arbete", "Home" => "Hem", +"Other" => "Annat", "Mobile" => "Mobil", "Text" => "Text", "Voice" => "Röst", @@ -91,12 +105,13 @@ "Journey" => "Resa", "Jubilee" => "Jubileum", "Meeting" => "Möte", -"Other" => "Annat", "Personal" => "Privat", "Projects" => "Projekt", "Questions" => "Frågor", "{name}'s Birthday" => "{name}'s födelsedag", "Contact" => "Kontakt", +"You do not have the permissions to edit this contact." => "Du saknar behörighet för att ändra denna kontakt.", +"You do not have the permissions to delete this contact." => "Du saknar behörighet för att radera denna kontakt.", "Add Contact" => "Lägg till kontakt", "Import" => "Importera", "Settings" => "Inställningar", @@ -121,6 +136,7 @@ "Select photo from ownCloud" => "Välj foto från ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => " anpassad, korta namn, hela namn, bakåt eller bakåt med komma", "Edit name details" => "Redigera detaljer för namn", +"Organization" => "Organisation", "Delete" => "Radera", "Nickname" => "Smeknamn", "Enter nickname" => "Ange smeknamn", @@ -138,11 +154,16 @@ "Delete email address" => "Ta bort e-postadress", "Enter phone number" => "Ange telefonnummer", "Delete phone number" => "Ta bort telefonnummer", +"Instant Messenger" => "Instant Messenger", +"Delete IM" => "Radera IM", "View on map" => "Visa på karta", "Edit address details" => "Redigera detaljer för adress", "Add notes here." => "Lägg till noteringar här.", "Add field" => "Lägg till fält", "Phone" => "Telefon", +"Email" => "E-post", +"Instant Messaging" => "Instant Messaging", +"Address" => "Adress", "Note" => "Notering", "Download contact" => "Ladda ner kontakt", "Delete contact" => "Radera kontakt", @@ -161,15 +182,25 @@ "Postal code" => "Postnummer", "Country" => "Land", "Addressbook" => "Adressbok", +"Hon. prefixes" => "Ledande titlar", "Miss" => "Fröken", +"Ms" => "Fru", "Mr" => "Herr", "Sir" => "Herr", -"Mrs" => "Fröken", -"Dr" => "Dr", +"Mrs" => "Fru", +"Dr" => "Dr.", "Given name" => "Förnamn", "Additional names" => "Mellannamn", "Family name" => "Efternamn", +"Hon. suffixes" => "Efterställda titlar", +"J.D." => "Kand. Jur.", +"M.D." => "M.D.", +"D.O." => "D.O.", +"D.C." => "D.C.", "Ph.D." => "Fil.dr.", +"Esq." => "Esq.", +"Jr." => "Jr.", +"Sn." => "Sn.", "Import a contacts file" => "Importera en kontaktfil", "Please choose the addressbook" => "Vänligen välj adressboken", "create a new addressbook" => "skapa en ny adressbok", @@ -177,7 +208,6 @@ "Importing contacts" => "Importerar kontakter", "You have no contacts in your addressbook." => "Du har inga kontakter i din adressbok.", "Add contact" => "Lägg till en kontakt", -"Configure addressbooks" => "Anpassa adressböcker.", "Select Address Books" => "Välj adressböcker", "Enter name" => "Ange namn", "Enter description" => "Ange beskrivning", @@ -187,6 +217,7 @@ "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "Visa CardDav-länk", "Show read-only VCF link" => "Visa skrivskyddad VCF-länk", +"Share" => "Dela", "Download" => "Nedladdning", "Edit" => "Redigera", "New Address Book" => "Ny adressbok", diff --git a/apps/contacts/l10n/th_TH.php b/apps/contacts/l10n/th_TH.php index 7a4989986f..6afc64e61d 100644 --- a/apps/contacts/l10n/th_TH.php +++ b/apps/contacts/l10n/th_TH.php @@ -14,15 +14,12 @@ "Cannot add empty property." => "ไม่สามารถเพิ่มรายละเอียดที่ไม่มีข้อมูลได้", "At least one of the address fields has to be filled out." => "อย่างน้อยที่สุดช่องข้อมูลที่อยู่จะต้องถูกกรอกลงไป", "Trying to add duplicate property: " => "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: ", -"Error adding contact property: " => "เกิดข้อผิดพลาดในการเพิ่มคุณสมบัติข้อมูลผู้ติดต่อ", "Information about vCard is incorrect. Please reload the page." => "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง", -"Error deleting contact property." => "เกิดข้อผิดพลาดในการลบรายละเอียดการติดต่อ", "Missing ID" => "รหัสสูญหาย", "Error parsing VCard for ID: \"" => "พบข้อผิดพลาดในการแยกรหัส VCard:\"", "checksum is not set." => "ยังไม่ได้กำหนดค่า checksum", "Information about vCard is incorrect. Please reload the page: " => "ข้อมูล vCard ไม่ถูกต้อง กรุณาโหลดหน้าเว็บใหม่อีกครั้ง: ", "Something went FUBAR. " => "มีบางอย่างเกิดการ FUBAR. ", -"Error updating contact property." => "เกิดข้อผิดพลาดในการอัพเดทข้อมูลการติดต่อ", "No contact ID was submitted." => "ไม่มีรหัสข้อมูลการติดต่อถูกส่งมา", "Error reading contact photo." => "เกิดข้อผิดพลาดในการอ่านรูปภาพของข้อมูลการติดต่อ", "Error saving temporary file." => "เกิดข้อผิดพลาดในการบันทึกไฟล์ชั่วคราว", @@ -62,6 +59,7 @@ "Error loading profile picture." => "เกิดข้อผิดพลาดในการโหลดรูปภาพประจำตัว", "Select type" => "เลือกชนิด", "Some contacts are marked for deletion, but not deleted yet. Please wait for them to be deleted." => "ข้อมูลผู้ติดต่อบางรายการได้ถูกทำเครื่องหมายสำหรับลบทิ้งเอาไว้, แต่ยังไม่ได้ถูกลบทิ้ง, กรุณารอให้รายการดังกล่าวถูกลบทิ้งเสียก่อน", +"Do you want to merge these address books?" => "คุณต้องการผสานข้อมูลสมุดบันทึกที่อยู่เหล่านี้หรือไม่?", "Result: " => "ผลลัพธ์: ", " imported, " => " นำเข้าข้อมูลแล้ว, ", " failed." => " ล้มเหลว.", @@ -69,12 +67,9 @@ "Addressbook not found: " => "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ", "This is not your addressbook." => "นี่ไม่ใช่สมุดบันทึกที่อยู่ของคุณ", "Contact could not be found." => "ไม่พบข้อมูลการติดต่อ", -"Address" => "ที่อยู่", -"Telephone" => "โทรศัพท์", -"Email" => "อีเมล์", -"Organization" => "หน่วยงาน", "Work" => "ที่ทำงาน", "Home" => "บ้าน", +"Other" => "อื่นๆ", "Mobile" => "มือถือ", "Text" => "ข้อความ", "Voice" => "เสียงพูด", @@ -93,7 +88,6 @@ "Journey" => "การเดินทาง", "Jubilee" => "งานเฉลิมฉลอง", "Meeting" => "ประชุม", -"Other" => "อื่นๆ", "Personal" => "ส่วนตัว", "Projects" => "โปรเจค", "Questions" => "คำถาม", @@ -123,6 +117,7 @@ "Select photo from ownCloud" => "เลือกรูปภาพจาก ownCloud", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "กำหนดรูปแบบของชื่อย่อ, ชื่อจริง, ย้อนค่ากลัีบด้วยคอมม่าเอง", "Edit name details" => "แก้ไขรายละเอียดของชื่อ", +"Organization" => "หน่วยงาน", "Delete" => "ลบ", "Nickname" => "ชื่อเล่น", "Enter nickname" => "กรอกชื่อเล่น", @@ -145,6 +140,8 @@ "Add notes here." => "เพิ่มหมายเหตุกำกับไว้ที่นี่", "Add field" => "เพิ่มช่องรับข้อมูล", "Phone" => "โทรศัพท์", +"Email" => "อีเมล์", +"Address" => "ที่อยู่", "Note" => "หมายเหตุ", "Download contact" => "ดาวน์โหลดข้อมูลการติดต่อ", "Delete contact" => "ลบข้อมูลการติดต่อ", @@ -187,9 +184,14 @@ "create a new addressbook" => "สร้างสมุดบันทึกที่อยู่ใหม่", "Name of new addressbook" => "กำหนดชื่อของสมุดที่อยู่ที่สร้างใหม่", "Importing contacts" => "นำเข้าข้อมูลการติดต่อ", +"Contacts imported successfully" => "ข้อมูลการติดต่อถูกนำเข้าข้อมูลเรียบร้อยแล้ว", +"Close Dialog" => "ปิดกล่องข้อความ", +"Import Addressbook" => "นำเข้าข้อมูลสมุดบันทึกที่อยู่", +"Select address book to import to:" => "เลือกสมุดบันทึกที่อยู่ที่ต้องการนำเข้า:", +"Drop a VCF file to import contacts." => "วางไฟล์ VCF ที่ต้องการนำเข้าข้อมูลการติดต่อ", +"Select from HD" => "เลือกจากฮาร์ดดิส", "You have no contacts in your addressbook." => "คุณยังไม่มีข้อมูลการติดต่อใดๆในสมุดบันทึกที่อยู่ของคุณ", "Add contact" => "เพิ่มชื่อผู้ติดต่อ", -"Configure addressbooks" => "กำหนดค่าสมุดบันทึกที่อยู่", "Select Address Books" => "เลือกสมุดบันทึกที่อยู่", "Enter name" => "กรอกชื่อ", "Enter description" => "กรอกคำอธิบาย", @@ -199,6 +201,7 @@ "iOS/OS X" => "iOS/OS X", "Show CardDav link" => "แสดงลิงก์ CardDav", "Show read-only VCF link" => "แสดงลิงก์ VCF สำหรับอ่านเท่านั้น", +"Share" => "แชร์", "Download" => "ดาวน์โหลด", "Edit" => "แก้ไข", "New Address Book" => "สร้างสมุดบันทึกข้อมูลการติดต่อใหม่", diff --git a/apps/contacts/l10n/tr.php b/apps/contacts/l10n/tr.php index dc4ec06c93..e2a769410f 100644 --- a/apps/contacts/l10n/tr.php +++ b/apps/contacts/l10n/tr.php @@ -14,15 +14,12 @@ "Cannot add empty property." => "Boş özellik eklenemiyor.", "At least one of the address fields has to be filled out." => "En az bir adres alanı doldurulmalı.", "Trying to add duplicate property: " => "Yinelenen özellik eklenmeye çalışılıyor: ", -"Error adding contact property: " => "Kişi özelliği eklenirken hata oluştu.", "Information about vCard is incorrect. Please reload the page." => "vCard bilgileri doğru değil. Lütfen sayfayı yenileyin.", -"Error deleting contact property." => "Kişi özelliği silinirken hata oluştu.", "Missing ID" => "Eksik ID", "Error parsing VCard for ID: \"" => "ID için VCard ayrıştırılamadı:\"", "checksum is not set." => "checksum atanmamış.", "Information about vCard is incorrect. Please reload the page: " => "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: ", "Something went FUBAR. " => "Bir şey FUBAR gitti.", -"Error updating contact property." => "Kişi özelliği güncellenirken hata oluştu.", "No contact ID was submitted." => "Bağlantı ID'si girilmedi.", "Error reading contact photo." => "Bağlantı fotoğrafı okunamadı.", "Error saving temporary file." => "Geçici dosya kaydetme hatası.", @@ -65,12 +62,9 @@ " failed." => " hatalı.", "This is not your addressbook." => "Bu sizin adres defteriniz değil.", "Contact could not be found." => "Kişi bulunamadı.", -"Address" => "Adres", -"Telephone" => "Telefon", -"Email" => "Eposta", -"Organization" => "Organizasyon", "Work" => "İş", "Home" => "Ev", +"Other" => "Diğer", "Mobile" => "Mobil", "Text" => "Metin", "Voice" => "Ses", @@ -89,7 +83,6 @@ "Journey" => "Seyahat", "Jubilee" => "Yıl Dönümü", "Meeting" => "Toplantı", -"Other" => "Diğer", "Personal" => "Kişisel", "Projects" => "Projeler", "Questions" => "Sorular", @@ -116,6 +109,7 @@ "Select photo from ownCloud" => "ownCloud'dan bir fotoğraf seç", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "Biçin özel, Kısa isim, Tam isim, Ters veya noktalı ters", "Edit name details" => "İsim detaylarını düzenle", +"Organization" => "Organizasyon", "Delete" => "Sil", "Nickname" => "Takma ad", "Enter nickname" => "Takma adı girin", @@ -138,6 +132,8 @@ "Add notes here." => "Notları buraya ekleyin.", "Add field" => "Alan ekle", "Phone" => "Telefon", +"Email" => "Eposta", +"Address" => "Adres", "Note" => "Not", "Download contact" => "Kişiyi indir", "Delete contact" => "Kişiyi sil", @@ -180,9 +176,14 @@ "create a new addressbook" => "Yeni adres defteri oluştur", "Name of new addressbook" => "Yeni adres defteri için isim", "Importing contacts" => "Bağlantıları içe aktar", +"Contacts imported successfully" => "Bağlantılar başarıyla içe aktarıldı", +"Close Dialog" => "Diyaloğu kapat", +"Import Addressbook" => "Adres defterini içeri aktar", +"Select address book to import to:" => "İçe aktarılacak adres defterini seçin:", +"Drop a VCF file to import contacts." => "Bağlantıları içe aktarmak için bir VCF dosyası bırakın.", +"Select from HD" => "HD'den seç", "You have no contacts in your addressbook." => "Adres defterinizde hiç bağlantı yok.", "Add contact" => "Bağlatı ekle", -"Configure addressbooks" => "Adres defterini yapılandır", "Select Address Books" => "Adres deftelerini seçiniz", "Enter name" => "İsim giriniz", "Enter description" => "Tanım giriniz", diff --git a/apps/contacts/l10n/uk.php b/apps/contacts/l10n/uk.php index cc09651065..dcd9efff34 100644 --- a/apps/contacts/l10n/uk.php +++ b/apps/contacts/l10n/uk.php @@ -1,10 +1,6 @@ "Має бути заповнено щонайменше одне поле.", "This is not your addressbook." => "Це не ваша адресна книга.", -"Address" => "Адреса", -"Telephone" => "Телефон", -"Email" => "Ел.пошта", -"Organization" => "Організація", "Mobile" => "Мобільний", "Text" => "Текст", "Voice" => "Голос", @@ -13,8 +9,11 @@ "Pager" => "Пейджер", "Birthday" => "День народження", "Add Contact" => "Додати контакт", +"Organization" => "Організація", "Delete" => "Видалити", "Phone" => "Телефон", +"Email" => "Ел.пошта", +"Address" => "Адреса", "Delete contact" => "Видалити контакт", "Extended" => "Розширено", "City" => "Місто", diff --git a/apps/contacts/l10n/vi.php b/apps/contacts/l10n/vi.php index 0c650586a2..d484fb405c 100644 --- a/apps/contacts/l10n/vi.php +++ b/apps/contacts/l10n/vi.php @@ -12,10 +12,6 @@ "Error uploading contacts to storage." => "Lỗi tải lên danh sách địa chỉ để lưu trữ.", "There is no error, the file uploaded with success" => "Không có lỗi, các tập tin tải lên thành công", "Contacts" => "Liên lạc", -"Address" => "Địa chỉ", -"Telephone" => "Điện thoại bàn", -"Email" => "Email", -"Organization" => "Tổ chức", "Work" => "Công việc", "Home" => "Nhà", "Mobile" => "Di động", @@ -26,8 +22,11 @@ "Contact" => "Danh sách", "Add Contact" => "Thêm liên lạc", "Addressbooks" => "Sổ địa chỉ", +"Organization" => "Tổ chức", "Delete" => "Xóa", "Phone" => "Điện thoại", +"Email" => "Email", +"Address" => "Địa chỉ", "Delete contact" => "Xóa liên lạc", "PO Box" => "Hòm thư bưu điện", "City" => "Thành phố", diff --git a/apps/contacts/l10n/zh_CN.php b/apps/contacts/l10n/zh_CN.php index bb4188314d..b3bac7aedf 100644 --- a/apps/contacts/l10n/zh_CN.php +++ b/apps/contacts/l10n/zh_CN.php @@ -14,13 +14,11 @@ "At least one of the address fields has to be filled out." => "至少需要填写一项地址。", "Trying to add duplicate property: " => "试图添加重复属性: ", "Information about vCard is incorrect. Please reload the page." => "vCard 的信息不正确。请重新加载页面。", -"Error deleting contact property." => "删除联系人属性错误。", "Missing ID" => "缺少 ID", "Error parsing VCard for ID: \"" => "无法解析如下ID的 VCard:“", "checksum is not set." => "未设置校验值。", "Information about vCard is incorrect. Please reload the page: " => "vCard 信息不正确。请刷新页面: ", "Something went FUBAR. " => "有一些信息无法被处理。", -"Error updating contact property." => "更新联系人属性错误。", "No contact ID was submitted." => "未提交联系人 ID。", "Error reading contact photo." => "读取联系人照片错误。", "Error saving temporary file." => "保存临时文件错误。", @@ -63,10 +61,6 @@ " failed." => " 失败。", "This is not your addressbook." => "这不是您的地址簿。", "Contact could not be found." => "无法找到联系人。", -"Address" => "地址", -"Telephone" => "电话", -"Email" => "电子邮件", -"Organization" => "组织", "Work" => "工作", "Home" => "家庭", "Mobile" => "移动电话", @@ -91,6 +85,7 @@ "Select photo from ownCloud" => "从 ownCloud 选择照片", "Format custom, Short name, Full name, Reverse or Reverse with comma" => "自定义格式,简称,全名,姓在前,姓在前并用逗号分割", "Edit name details" => "编辑名称详情", +"Organization" => "组织", "Delete" => "删除", "Nickname" => "昵称", "Enter nickname" => "输入昵称", @@ -110,6 +105,8 @@ "Add notes here." => "添加注释。", "Add field" => "添加字段", "Phone" => "电话", +"Email" => "电子邮件", +"Address" => "地址", "Note" => "注释", "Download contact" => "下载联系人", "Delete contact" => "删除联系人", @@ -149,7 +146,6 @@ "Importing contacts" => "导入联系人", "You have no contacts in your addressbook." => "您的地址簿中没有联系人。", "Add contact" => "添加联系人", -"Configure addressbooks" => "配置地址簿", "CardDAV syncing addresses" => "CardDAV 同步地址", "more info" => "更多信息", "Primary address (Kontact et al)" => "首选地址 (Kontact 等)", diff --git a/apps/contacts/l10n/zh_TW.php b/apps/contacts/l10n/zh_TW.php index db0a1dbf21..0d007ef9c8 100644 --- a/apps/contacts/l10n/zh_TW.php +++ b/apps/contacts/l10n/zh_TW.php @@ -6,18 +6,16 @@ "There was an error adding the contact." => "添加通訊錄發生錯誤", "Cannot add empty property." => "不可添加空白內容", "At least one of the address fields has to be filled out." => "至少必須填寫一欄地址", +"Error adding contact property." => "添加通訊錄內容中發生錯誤", +"No ID provided" => "未提供 ID", +"Error adding addressbook." => "添加電話簿中發生錯誤", +"Error activating addressbook." => "啟用電話簿中發生錯誤", "Information about vCard is incorrect. Please reload the page." => "有關 vCard 的資訊不正確,請重新載入此頁。", -"Error deleting contact property." => "刪除通訊錄內容中發生錯誤", "Missing ID" => "遺失ID", -"Error updating contact property." => "更新通訊錄內容中發生錯誤", "No file was uploaded" => "沒有已上傳的檔案", "Contacts" => "通訊錄", "This is not your addressbook." => "這不是你的電話簿", "Contact could not be found." => "通訊錄未發現", -"Address" => "地址", -"Telephone" => "電話", -"Email" => "電子郵件", -"Organization" => "組織", "Work" => "公司", "Home" => "住宅", "Mobile" => "行動電話", @@ -34,6 +32,7 @@ "Add Contact" => "添加通訊錄", "Addressbooks" => "電話簿", "Edit name details" => "編輯姓名詳細資訊", +"Organization" => "組織", "Delete" => "刪除", "Nickname" => "綽號", "Enter nickname" => "輸入綽號", @@ -52,6 +51,8 @@ "Add notes here." => "在這裡新增註解", "Add field" => "新增欄位", "Phone" => "電話", +"Email" => "電子郵件", +"Address" => "地址", "Note" => "註解", "Download contact" => "下載通訊錄", "Delete contact" => "刪除通訊錄", diff --git a/apps/contacts/lib/addressbook.php b/apps/contacts/lib/addressbook.php index eb61b6dbce..b487260d32 100644 --- a/apps/contacts/lib/addressbook.php +++ b/apps/contacts/lib/addressbook.php @@ -48,11 +48,11 @@ class OC_Contacts_Addressbook { $values = array($uid); $active_where = ''; if ($active) { - $active_where = ' AND active = ?'; + $active_where = ' AND `active` = ?'; $values[] = 1; } try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE userid = ? ' . $active_where . ' ORDER BY displayname' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' . $active_where . ' ORDER BY `displayname`' ); $result = $stmt->execute($values); } catch(Exception $e) { OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); @@ -64,10 +64,11 @@ class OC_Contacts_Addressbook { while( $row = $result->fetchRow()) { $addressbooks[] = $row; } + $addressbooks = array_merge($addressbooks, OCP\Share::getItemsSharedWith('addressbook', OC_Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS)); if(!$active && !count($addressbooks)) { - self::addDefault($uid); + $id = self::addDefault($uid); + return array(self::find($id),); } - return $addressbooks; } @@ -114,8 +115,9 @@ class OC_Contacts_Addressbook { */ public static function find($id) { try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' ); $result = $stmt->execute(array($id)); + return $result->fetchRow(); } catch(Exception $e) { OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); @@ -139,7 +141,7 @@ class OC_Contacts_Addressbook { } return $id; } - + /** * @brief Creates a new address book * @param string $userid @@ -149,7 +151,7 @@ class OC_Contacts_Addressbook { */ public static function add($uid,$name,$description='') { try { - $stmt = OCP\DB::prepare( 'SELECT uri FROM *PREFIX*contacts_addressbooks WHERE userid = ? ' ); + $stmt = OCP\DB::prepare( 'SELECT `uri` FROM `*PREFIX*contacts_addressbooks` WHERE `userid` = ? ' ); $result = $stmt->execute(array($uid)); } catch(Exception $e) { OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' exception: '.$e->getMessage(), OCP\Util::ERROR); @@ -163,7 +165,7 @@ class OC_Contacts_Addressbook { $uri = self::createURI($name, $uris ); try { - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)' ); + $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)' ); $result = $stmt->execute(array($uid,$name,$uri,$description,1)); } catch(Exception $e) { OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); @@ -186,7 +188,7 @@ class OC_Contacts_Addressbook { $uid = self::extractUserID($principaluri); try { - $stmt = OCP\DB::prepare('INSERT INTO *PREFIX*contacts_addressbooks (userid,displayname,uri,description,ctag) VALUES(?,?,?,?,?)'); + $stmt = OCP\DB::prepare('INSERT INTO `*PREFIX*contacts_addressbooks` (`userid`,`displayname`,`uri`,`description`,`ctag`) VALUES(?,?,?,?,?)'); $result = $stmt->execute(array($uid,$name,$uri,$description,1)); } catch(Exception $e) { OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); @@ -208,7 +210,12 @@ class OC_Contacts_Addressbook { public static function edit($id,$name,$description) { // Need these ones for checking uri $addressbook = self::find($id); - + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + return false; + } + } if(is_null($name)) { $name = $addressbook['name']; } @@ -217,7 +224,7 @@ class OC_Contacts_Addressbook { } try { - $stmt = OCP\DB::prepare('UPDATE *PREFIX*contacts_addressbooks SET displayname=?,description=?, ctag=ctag+1 WHERE id=?'); + $stmt = OCP\DB::prepare('UPDATE `*PREFIX*contacts_addressbooks` SET `displayname`=?,`description`=?, `ctag`=`ctag`+1 WHERE `id`=?'); $result = $stmt->execute(array($name,$description,$id)); } catch(Exception $e) { OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); @@ -235,7 +242,7 @@ class OC_Contacts_Addressbook { * @return boolean */ public static function setActive($id,$active) { - $sql = 'UPDATE *PREFIX*contacts_addressbooks SET active = ? WHERE id = ?'; + $sql = 'UPDATE `*PREFIX*contacts_addressbooks` SET `active` = ? WHERE `id` = ?'; OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id.', active: '.intval($active), OCP\Util::ERROR); try { $stmt = OCP\DB::prepare($sql); @@ -253,7 +260,7 @@ class OC_Contacts_Addressbook { * @return boolean */ public static function isActive($id) { - $sql = 'SELECT active FROM *PREFIX*contacts_addressbooks WHERE id = ?'; + $sql = 'SELECT `active` FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?'; try { $stmt = OCP\DB::prepare( $sql ); $result = $stmt->execute(array($id)); @@ -270,15 +277,22 @@ class OC_Contacts_Addressbook { * @return boolean */ public static function delete($id) { + $addressbook = self::find($id); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_DELETE)) { + return false; + } + } self::setActive($id, false); try { - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_addressbooks WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_addressbooks` WHERE `id` = ?' ); $stmt->execute(array($id)); } catch(Exception $e) { OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception for '.$id.': '.$e->getMessage(), OCP\Util::ERROR); return false; } - + $cards = OC_Contacts_VCard::all($id); foreach($cards as $card){ OC_Contacts_VCard::delete($card['id']); @@ -293,7 +307,7 @@ class OC_Contacts_Addressbook { * @return boolean */ public static function touch($id) { - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_addressbooks SET ctag = ctag + 1 WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_addressbooks` SET `ctag` = `ctag` + 1 WHERE `id` = ?' ); $stmt->execute(array($id)); return true; diff --git a/apps/contacts/lib/app.php b/apps/contacts/lib/app.php index b59a8372b7..e8e1937404 100644 --- a/apps/contacts/lib/app.php +++ b/apps/contacts/lib/app.php @@ -37,21 +37,24 @@ class OC_Contacts_App { ) ) ); - } - else { - OCP\Util::writeLog('contacts', - 'Addressbook('.$id.') is not from '.OCP\USER::getUser(), - OCP\Util::ERROR); - //throw new Exception('This is not your addressbook.'); - OCP\JSON::error( - array( - 'data' => array( - 'message' => self::$l10n->t('This is not your addressbook.') + } else { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $id, OC_Share_Backend_Addressbook::FORMAT_ADDRESSBOOKS); + if ($sharedAddressbook) { + return $sharedAddressbook; + } else { + OCP\Util::writeLog('contacts', + 'Addressbook('.$id.') is not from '.OCP\USER::getUser(), + OCP\Util::ERROR); + //throw new Exception('This is not your addressbook.'); + OCP\JSON::error( + array( + 'data' => array( + 'message' => self::$l10n->t('This is not your addressbook.') + ) ) - ) - ); + ); + } } - exit(); } return $addressbook; } @@ -106,14 +109,77 @@ class OC_Contacts_App { /** * @return array of vcard prop => label */ - public static function getAddPropertyOptions() { + public static function getIMOptions($im = null) { $l10n = self::$l10n; - return array( - 'ADR' => $l10n->t('Address'), - 'TEL' => $l10n->t('Telephone'), - 'EMAIL' => $l10n->t('Email'), - 'ORG' => $l10n->t('Organization'), - ); + $ims = array( + 'jabber' => array( + 'displayname' => (string)$l10n->t('Jabber'), + 'xname' => 'X-JABBER', + 'protocol' => 'xmpp', + ), + 'aim' => array( + 'displayname' => (string)$l10n->t('AIM'), + 'xname' => 'X-AIM', + 'protocol' => 'aim', + ), + 'msn' => array( + 'displayname' => (string)$l10n->t('MSN'), + 'xname' => 'X-MSN', + 'protocol' => 'msn', + ), + 'twitter' => array( + 'displayname' => (string)$l10n->t('Twitter'), + 'xname' => 'X-TWITTER', + 'protocol' => null, + ), + 'googletalk' => array( + 'displayname' => (string)$l10n->t('GoogleTalk'), + 'xname' => null, + 'protocol' => 'xmpp', + ), + 'facebook' => array( + 'displayname' => (string)$l10n->t('Facebook'), + 'xname' => null, + 'protocol' => 'xmpp', + ), + 'xmpp' => array( + 'displayname' => (string)$l10n->t('XMPP'), + 'xname' => null, + 'protocol' => 'xmpp', + ), + 'icq' => array( + 'displayname' => (string)$l10n->t('ICQ'), + 'xname' => 'X-ICQ', + 'protocol' => 'icq', + ), + 'yahoo' => array( + 'displayname' => (string)$l10n->t('Yahoo'), + 'xname' => 'X-YAHOO', + 'protocol' => 'ymsgr', + ), + 'skype' => array( + 'displayname' => (string)$l10n->t('Skype'), + 'xname' => 'X-SKYPE', + 'protocol' => 'skype', + ), + 'qq' => array( + 'displayname' => (string)$l10n->t('QQ'), + 'xname' => 'X-SKYPE', + 'protocol' => 'x-apple', + ), + 'gadugadu' => array( + 'displayname' => (string)$l10n->t('GaduGadu'), + 'xname' => 'X-SKYPE', + 'protocol' => 'x-apple', + ), + ); + if(is_null($im)) { + return $ims; + } else { + $ims['ymsgr'] = $ims['yahoo']; + $ims['gtalk'] = $ims['googletalk']; + return isset($ims[$im]) ? $ims[$im] : null; + } } /** @@ -123,9 +189,11 @@ class OC_Contacts_App { $l = self::$l10n; switch($prop) { case 'ADR': + case 'IMPP': return array( 'WORK' => $l->t('Work'), 'HOME' => $l->t('Home'), + 'OTHER' => $l->t('Other'), ); case 'TEL': return array( @@ -138,6 +206,7 @@ class OC_Contacts_App { 'FAX' => $l->t('Fax'), 'VIDEO' => $l->t('Video'), 'PAGER' => $l->t('Pager'), + 'OTHER' => $l->t('Other'), ); case 'EMAIL': return array( diff --git a/apps/contacts/lib/hooks.php b/apps/contacts/lib/hooks.php index 3344e3d693..8b7adc60f2 100644 --- a/apps/contacts/lib/hooks.php +++ b/apps/contacts/lib/hooks.php @@ -42,7 +42,7 @@ class OC_Contacts_Hooks{ OC_Contacts_Addressbook::addDefault($parameters['uid']); return true; } - + /** * @brief Deletes all Addressbooks of a certain user * @param paramters parameters from postDeleteUser-Hook diff --git a/apps/contacts/lib/sabre/addressbook.php b/apps/contacts/lib/sabre/addressbook.php new file mode 100644 index 0000000000..e9eb77472b --- /dev/null +++ b/apps/contacts/lib/sabre/addressbook.php @@ -0,0 +1,128 @@ +. + * + */ + +/** + * This class overrides __construct to get access to $addressBookInfo and + * $carddavBackend, Sabre_CardDAV_AddressBook::getACL() to return read/write + * permissions based on user and shared state and it overrides + * Sabre_CardDAV_AddressBook::getChild() and Sabre_CardDAV_AddressBook::getChildren() + * to instantiate OC_Connector_Sabre_CardDAV_Cards. +*/ +class OC_Connector_Sabre_CardDAV_AddressBook extends Sabre_CardDAV_AddressBook { + + /** + * CardDAV backend + * + * @var Sabre_CardDAV_Backend_Abstract + */ + private $carddavBackend; + + /** + * Constructor + * + * @param Sabre_CardDAV_Backend_Abstract $carddavBackend + * @param array $addressBookInfo + */ + public function __construct( + Sabre_CardDAV_Backend_Abstract $carddavBackend, + array $addressBookInfo) { + + $this->carddavBackend = $carddavBackend; + $this->addressBookInfo = $addressBookInfo; + parent::__construct($carddavBackend, $addressBookInfo); + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Contacts_Addressbook::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['id']); + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + + ); + + } + + /** + * Returns a card + * + * @param string $name + * @return OC_Connector_Sabre_DAV_Card + */ + public function getChild($name) { + + $obj = $this->carddavBackend->getCard($this->addressBookInfo['id'],$name); + if (!$obj) throw new Sabre_DAV_Exception_NotFound('Card not found'); + return new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); + + } + + /** + * Returns the full list of cards + * + * @return array + */ + public function getChildren() { + + $objs = $this->carddavBackend->getCards($this->addressBookInfo['id']); + $children = array(); + foreach($objs as $obj) { + $children[] = new OC_Connector_Sabre_CardDAV_Card($this->carddavBackend,$this->addressBookInfo,$obj); + } + return $children; + + } +} \ No newline at end of file diff --git a/apps/contacts/lib/sabre/addressbookroot.php b/apps/contacts/lib/sabre/addressbookroot.php new file mode 100644 index 0000000000..69cd602128 --- /dev/null +++ b/apps/contacts/lib/sabre/addressbookroot.php @@ -0,0 +1,45 @@ +. + * + */ + +/** + * This class overrides Sabre_CardDAV_AddressBookRoot::getChildForPrincipal() + * to instantiate OC_Connector_CardDAV_UserAddressBooks. +*/ +class OC_Connector_Sabre_CardDAV_AddressBookRoot extends Sabre_CardDAV_AddressBookRoot { + + /** + * This method returns a node for a principal. + * + * The passed array contains principal information, and is guaranteed to + * at least contain a uri item. Other properties may or may not be + * supplied by the authentication backend. + * + * @param array $principal + * @return Sabre_DAV_INode + */ + public function getChildForPrincipal(array $principal) { + + return new OC_Connector_Sabre_CardDAV_UserAddressBooks($this->carddavBackend, $principal['uri']); + + } + +} \ No newline at end of file diff --git a/apps/contacts/lib/connector_sabre.php b/apps/contacts/lib/sabre/backend.php similarity index 98% rename from apps/contacts/lib/connector_sabre.php rename to apps/contacts/lib/sabre/backend.php index 2bc6c9a28c..04737eb3ab 100644 --- a/apps/contacts/lib/connector_sabre.php +++ b/apps/contacts/lib/sabre/backend.php @@ -145,6 +145,7 @@ class OC_Connector_Sabre_CardDAV extends Sabre_CardDAV_Backend_Abstract { $data = OC_Contacts_VCard::all($addressbookid); $cards = array(); foreach($data as $i){ + //OCP\Util::writeLog('contacts', __METHOD__.', uri: ' . $i['uri'], OCP\Util::DEBUG); $cards[] = array( 'id' => $i['id'], //'carddata' => $i['carddata'], diff --git a/apps/contacts/lib/sabre/card.php b/apps/contacts/lib/sabre/card.php new file mode 100644 index 0000000000..f4414a25f7 --- /dev/null +++ b/apps/contacts/lib/sabre/card.php @@ -0,0 +1,94 @@ +. + * + */ + +/** + * This class overrides Sabre_CardDAV_Card::getACL() + * to return read/write permissions based on user and shared state. +*/ +class OC_Connector_Sabre_CardDAV_Card extends Sabre_CardDAV_Card { + + /** + * Array with information about the containing addressbook + * + * @var array + */ + private $addressBookInfo; + + /** + * Constructor + * + * @param Sabre_CardDAV_Backend_Abstract $carddavBackend + * @param array $addressBookInfo + * @param array $cardData + */ + public function __construct(Sabre_CardDAV_Backend_Abstract $carddavBackend, array $addressBookInfo, array $cardData) { + + $this->addressBookInfo = $addressBookInfo; + parent::__construct($carddavBackend, $addressBookInfo, $cardData); + + } + + /** + * Returns a list of ACE's for this node. + * + * Each ACE has the following properties: + * * 'privilege', a string such as {DAV:}read or {DAV:}write. These are + * currently the only supported privileges + * * 'principal', a url to the principal who owns the node + * * 'protected' (optional), indicating that this ACE is not allowed to + * be updated. + * + * @return array + */ + public function getACL() { + + $readprincipal = $this->getOwner(); + $writeprincipal = $this->getOwner(); + $uid = OC_Contacts_Addressbook::extractUserID($this->getOwner()); + + if($uid != OCP\USER::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $this->addressBookInfo['id']); + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_READ)) { + $readprincipal = 'principals/' . OCP\USER::getUser(); + } + if ($sharedAddressbook && ($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + $writeprincipal = 'principals/' . OCP\USER::getUser(); + } + } + + return array( + array( + 'privilege' => '{DAV:}read', + 'principal' => $readprincipal, + 'protected' => true, + ), + array( + 'privilege' => '{DAV:}write', + 'principal' => $writeprincipal, + 'protected' => true, + ), + + ); + + } + +} \ No newline at end of file diff --git a/apps/contacts/lib/sabre/useraddressbooks.php b/apps/contacts/lib/sabre/useraddressbooks.php new file mode 100644 index 0000000000..328b433bd6 --- /dev/null +++ b/apps/contacts/lib/sabre/useraddressbooks.php @@ -0,0 +1,45 @@ +. + * + */ + +/** + * This class overrides Sabre_CardDAV_UserAddressBooks::getChildren() + * to instantiate OC_Connector_Sabre_CardDAV_AddressBooks. +*/ +class OC_Connector_Sabre_CardDAV_UserAddressBooks extends Sabre_CardDAV_UserAddressBooks { + + /** + * Returns a list of addressbooks + * + * @return array + */ + public function getChildren() { + + $addressbooks = $this->carddavBackend->getAddressbooksForUser($this->principalUri); + $objs = array(); + foreach($addressbooks as $addressbook) { + $objs[] = new OC_Connector_Sabre_CardDAV_AddressBook($this->carddavBackend, $addressbook); + } + return $objs; + + } + +} \ No newline at end of file diff --git a/apps/contacts/lib/VCFExportPlugin.php b/apps/contacts/lib/sabre/vcfexportplugin.php similarity index 97% rename from apps/contacts/lib/VCFExportPlugin.php rename to apps/contacts/lib/sabre/vcfexportplugin.php index 9a64c964b0..f0ba60b303 100644 --- a/apps/contacts/lib/VCFExportPlugin.php +++ b/apps/contacts/lib/sabre/vcfexportplugin.php @@ -13,7 +13,7 @@ * @author Evert Pot (http://www.rooftopsolutions.nl/) * @license http://code.google.com/p/sabredav/wiki/License Modified BSD License */ -class Sabre_CardDAV_VCFExportPlugin extends Sabre_DAV_ServerPlugin { +class OC_Connector_Sabre_CardDAV_VCFExportPlugin extends Sabre_DAV_ServerPlugin { /** * Reference to Server class diff --git a/apps/contacts/lib/share/addressbook.php b/apps/contacts/lib/share/addressbook.php new file mode 100644 index 0000000000..acabeab2ad --- /dev/null +++ b/apps/contacts/lib/share/addressbook.php @@ -0,0 +1,94 @@ + + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +class OC_Share_Backend_Addressbook implements OCP\Share_Backend_Collection { + const FORMAT_ADDRESSBOOKS = 1; + + /** + * @brief Get the source of the item to be stored in the database + * @param string Item + * @param string Owner of the item + * @return mixed|array|false Source + * + * Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' + * Return false if the item does not exist for the user + * + * The formatItems() function will translate the source returned back into the item + */ + public function isValidSource($itemSource, $uidOwner) { + $addressbook = OC_Contacts_Addressbook::find( $itemSource ); + if( $addressbook === false || $addressbook['userid'] != $uidOwner) { + return false; + } + return true; + } + + /** + * @brief Get a unique name of the item for the specified user + * @param string Item + * @param string|false User the item is being shared with + * @param array|null List of similar item names already existing as shared items + * @return string Target name + * + * This function needs to verify that the user does not already have an item with this name. + * If it does generate a new name e.g. name_# + */ + public function generateTarget($itemSource, $shareWith, $exclude = null) { + $addressbook = OC_Contacts_Addressbook::find( $itemSource ); + $user_addressbooks = array(); + foreach(OC_Contacts_Addressbook::all($shareWith) as $user_addressbook) { + $user_addressbooks[] = $user_addressbook['displayname']; + } + $name = $addressbook['userid']."'s ".$addressbook['displayname']; + $suffix = ''; + while (in_array($name.$suffix, $user_addressbooks)) { + $suffix++; + } + + return $name.$suffix; + } + + /** + * @brief Converts the shared item sources back into the item in the specified format + * @param array Shared items + * @param int Format + * @return ? + * + * The items array is a 3-dimensional array with the item_source as the first key and the share id as the second key to an array with the share info. + * The key/value pairs included in the share info depend on the function originally called: + * If called by getItem(s)Shared: id, item_type, item, item_source, share_type, share_with, permissions, stime, file_source + * If called by getItem(s)SharedWith: id, item_type, item, item_source, item_target, share_type, share_with, permissions, stime, file_source, file_target + * This function allows the backend to control the output of shared items with custom formats. + * It is only called through calls to the public getItem(s)Shared(With) functions. + */ + public function formatItems($items, $format, $parameters = null) { + $addressbooks = array(); + if ($format == self::FORMAT_ADDRESSBOOKS) { + foreach ($items as $item) { + $addressbook = OC_Contacts_Addressbook::find($item['item_source']); + if ($addressbook) { + $addressbook['displayname'] = $item['item_target']; + $addressbook['permissions'] = $item['permissions']; + $addressbooks[] = $addressbook; + } + } + } + return $addressbooks; + } + + public function getChildren($itemSource) { + $query = OCP\DB::prepare('SELECT `id` FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ?'); + $result = $query->execute(array($itemSource)); + $sources = array(); + while ($contact = $result->fetchRow()) { + $sources[] = $contact['id']; + } + return $sources; + } + +} diff --git a/apps/contacts/lib/share/contact.php b/apps/contacts/lib/share/contact.php new file mode 100644 index 0000000000..718c8f9025 --- /dev/null +++ b/apps/contacts/lib/share/contact.php @@ -0,0 +1,53 @@ +. +*/ + +class OC_Share_Backend_Contact implements OCP\Share_Backend { + + const FORMAT_CONTACT = 0; + + private static $contact; + + public function isValidSource($itemSource, $uidOwner) { + self::$contact = OC_Contacts_VCard::find($itemSource); + if (self::$contact) { + return true; + } + return false; + } + + public function generateTarget($itemSource, $shareWith, $exclude = null) { + // TODO Get default addressbook and check for conflicts + return self::$contact['fullname']; + } + + public function formatItems($items, $format, $parameters = null) { + $contacts = array(); + if ($format == self::FORMAT_CONTACT) { + foreach ($items as $item) { + $contact = OC_Contacts_VCard::find($item['item_source']); + $contact['fullname'] = $item['item_target']; + $contacts[] = $contact; + } + } + return $contacts; + } + +} \ No newline at end of file diff --git a/apps/contacts/lib/vcard.php b/apps/contacts/lib/vcard.php index b213bcd762..91a5b806b1 100644 --- a/apps/contacts/lib/vcard.php +++ b/apps/contacts/lib/vcard.php @@ -38,7 +38,7 @@ /** * This class manages our vCards */ -class OC_Contacts_VCard{ +class OC_Contacts_VCard { /** * @brief Returns all cards of an address book * @param integer $id @@ -48,38 +48,31 @@ class OC_Contacts_VCard{ * ['carddata'] */ public static function all($id, $start=null, $num=null){ - $limitsql = ''; - if(!is_null($num)) { - $limitsql = ' LIMIT '.$num; - } - if(!is_null($start) && !is_null($num)) { - $limitsql .= ' OFFSET '.$start.' '; - } $result = null; if(is_array($id) && count($id)) { $id_sql = join(',', array_fill(0, count($id), '?')); - $prep = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid IN ('.$id_sql.') ORDER BY fullname '.$limitsql; + $sql = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` IN ('.$id_sql.') ORDER BY `fullname`'; try { - $stmt = OCP\DB::prepare( $prep ); + $stmt = OCP\DB::prepare( $sql, $num, $start ); $result = $stmt->execute($id); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', ids: '.join(',', $id), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.'SQL:'.$prep, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', ids: '.join(',', $id), OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.'SQL:'.$sql, OCP\Util::DEBUG); return false; } } elseif(is_int($id) || is_string($id)) { try { - $sql = 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? ORDER BY fullname'.$limitsql; - $stmt = OCP\DB::prepare( $sql ); + $sql = 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? ORDER BY `fullname`'; + $stmt = OCP\DB::prepare( $sql, $num, $start ); $result = $stmt->execute(array($id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', ids: '. $id, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', ids: '. $id, OCP\Util::DEBUG); return false; } } else { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.'. Addressbook id(s) argument is empty: '. print_r($id, true), OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.'. Addressbook id(s) argument is empty: '. print_r($id, true), OCP\Util::DEBUG); return false; } $cards = array(); @@ -99,11 +92,11 @@ class OC_Contacts_VCard{ */ public static function find($id){ try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `id` = ?' ); $result = $stmt->execute(array($id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '. $id, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id: '. $id, OCP\Util::DEBUG); return false; } @@ -118,11 +111,11 @@ class OC_Contacts_VCard{ */ public static function findWhereDAVDataIs($aid,$uri){ try { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); $result = $stmt->execute(array($aid,$uri)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); return false; } @@ -172,13 +165,13 @@ class OC_Contacts_VCard{ * @returns true if the UID has been changed. */ protected static function trueUID($aid, &$uid) { - $stmt = OCP\DB::prepare( 'SELECT * FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri = ?' ); + $stmt = OCP\DB::prepare( 'SELECT * FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); $uri = $uid.'.vcf'; try { $result = $stmt->execute(array($aid,$uri)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uid'.$uid, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uid'.$uid, OCP\Util::DEBUG); return false; } if($result->numRows() > 0) { @@ -293,12 +286,17 @@ class OC_Contacts_VCard{ OCP\Util::writeLog('contacts', 'OC_Contacts_VCard::add. No vCard supplied', OCP\Util::ERROR); return null; }; - + $addressbook = OC_Contacts_Addressbook::find($aid); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $aid); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_CREATE)) { + return false; + } + } if(!$isChecked) { OC_Contacts_App::loadCategoriesFromVCard($card); self::updateValuesFromAdd($aid, $card); } - $card->setString('VERSION', '3.0'); // Add product ID is missing. $prodid = trim($card->getAsString('PRODID')); @@ -320,12 +318,12 @@ class OC_Contacts_VCard{ } $data = $card->serialize(); - $stmt = OCP\DB::prepare( 'INSERT INTO *PREFIX*contacts_cards (addressbookid,fullname,carddata,uri,lastmodified) VALUES(?,?,?,?,?)' ); + $stmt = OCP\DB::prepare( 'INSERT INTO `*PREFIX*contacts_cards` (`addressbookid`,`fullname`,`carddata`,`uri`,`lastmodified`) VALUES(?,?,?,?,?)' ); try { $result = $stmt->execute(array($aid,$fn,$data,$uri,time())); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri'.$uri, OCP\Util::DEBUG); return false; } $newid = OCP\DB::insertid('*PREFIX*contacts_cards'); @@ -352,19 +350,30 @@ class OC_Contacts_VCard{ * @param array $objects An array of [id, carddata]. */ public static function updateDataByID($objects){ - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET carddata = ?, lastmodified = ? WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `carddata` = ?, `lastmodified` = ? WHERE `id` = ?' ); $now = new DateTime; foreach($objects as $object) { $vcard = OC_VObject::parse($object[1]); if(!is_null($vcard)) { + $oldcard = self::find($object[0]); + if (!$oldcard) { + return false; + } + $addressbook = OC_Contacts_Addressbook::find($oldcard['addressbookid']); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $object[0], OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + return false; + } + } $vcard->setString('REV', $now->format(DateTime::W3C)); $data = $vcard->serialize(); try { $result = $stmt->execute(array($data,time(),$object[0])); //OCP\Util::writeLog('contacts','OC_Contacts_VCard::updateDataByID, id: '.$object[0].': '.$object[1],OCP\Util::DEBUG); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$object[0], OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id: '.$object[0], OCP\Util::DEBUG); } } } @@ -378,11 +387,20 @@ class OC_Contacts_VCard{ */ public static function edit($id, OC_VObject $card){ $oldcard = self::find($id); - + if (!$oldcard) { + return false; + } if(is_null($card)) { return false; } - + // NOTE: Owner checks are being made in the ajax files, which should be done inside the lib files to prevent any redundancies with sharing checks + $addressbook = OC_Contacts_Addressbook::find($oldcard['addressbookid']); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_UPDATE)) { + throw new Exception(OC_Contacts_App::$l10n->t('You do not have the permissions to edit this contact.')); + } + } OC_Contacts_App::loadCategoriesFromVCard($card); $fn = $card->getAsString('FN'); @@ -394,12 +412,13 @@ class OC_Contacts_VCard{ $card->setString('REV', $now->format(DateTime::W3C)); $data = $card->serialize(); - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET fullname = ?,carddata = ?, lastmodified = ? WHERE id = ?' ); + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `fullname` = ?,`carddata` = ?, `lastmodified` = ? WHERE `id` = ?' ); try { $result = $stmt->execute(array($fn,$data,time(),$id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id'.$id, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: ' + . $e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id'.$id, OCP\Util::DEBUG); return false; } @@ -419,10 +438,21 @@ class OC_Contacts_VCard{ $oldcard = self::findWhereDAVDataIs($aid, $uri); $card = OC_VObject::parse($data); if(!$card) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', Unable to parse VCARD, uri: '.$uri, OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__. + ', Unable to parse VCARD, uri: '.$uri, OCP\Util::ERROR); + return false; + } + try { + self::edit($oldcard['id'], $card); + return true; + } catch(Exception $e) { + OCP\Util::writeLog('contacts', __METHOD__.', exception: ' + . $e->getMessage() . ', ' + . OCP\USER::getUser(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', uri' + . $uri, OCP\Util::DEBUG); return false; } - return self::edit($oldcard['id'], $card); } /** @@ -431,13 +461,34 @@ class OC_Contacts_VCard{ * @return boolean */ public static function delete($id){ - OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', array('aid' => null, 'id' => $id, 'uri' => null)); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE id = ?' ); + $card = self::find($id); + if (!$card) { + return false; + } + $addressbook = OC_Contacts_Addressbook::find($card['addressbookid']); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', + $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact + || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + throw new Exception( + OC_Contacts_App::$l10n->t( + 'You do not have the permissions to delete this contact.' + ) + ); + } + } + OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', + array('aid' => null, 'id' => $id, 'uri' => null) + ); + $stmt = OCP\DB::prepare('DELETE FROM `*PREFIX*contacts_cards` WHERE `id` = ?'); try { $stmt->execute(array($id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', id: '.$id, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__. + ', exception: ' . $e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', id: ' + . $id, OCP\Util::DEBUG); return false; } @@ -451,13 +502,25 @@ class OC_Contacts_VCard{ * @return boolean */ public static function deleteFromDAVData($aid,$uri){ + $addressbook = OC_Contacts_Addressbook::find($aid); + if ($addressbook['userid'] != OCP\User::getUser()) { + $query = OCP\DB::prepare( 'SELECT `id` FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri` = ?' ); + $id = $query->execute(array($aid, $uri))->fetchOne(); + if (!$id) { + return false; + } + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + return false; + } + } OC_Hook::emit('OC_Contacts_VCard', 'pre_deleteVCard', array('aid' => $aid, 'id' => null, 'uri' => $uri)); - $stmt = OCP\DB::prepare( 'DELETE FROM *PREFIX*contacts_cards WHERE addressbookid = ? AND uri=?' ); + $stmt = OCP\DB::prepare( 'DELETE FROM `*PREFIX*contacts_cards` WHERE `addressbookid` = ? AND `uri`=?' ); try { $stmt->execute(array($aid,$uri)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', aid: '.$aid.' uri: '.$uri, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', aid: '.$aid.' uri: '.$uri, OCP\Util::DEBUG); return false; } OC_Contacts_Addressbook::touch($aid); @@ -511,14 +574,23 @@ class OC_Contacts_VCard{ */ public static function structureContact($object) { $details = array(); - foreach($object->children as $property){ + + foreach($object->children as $property) { + $pname = $property->name; $temp = self::structureProperty($property); if(!is_null($temp)) { - if(array_key_exists($property->name, $details)) { - $details[$property->name][] = $temp; + // Get Apple X-ABLabels + if(isset($object->{$property->group . '.X-ABLABEL'})) { + $temp['label'] = $object->{$property->group . '.X-ABLABEL'}->value; + if($temp['label'] == '_$!!$_') { + $temp['label'] = OC_Contacts_App::$l10n->t('Other'); + } + } + if(array_key_exists($pname, $details)) { + $details[$pname][] = $temp; } else{ - $details[$property->name] = array($temp); + $details[$pname] = array($temp); } } } @@ -552,6 +624,9 @@ class OC_Contacts_VCard{ } } } + if(is_string($value)) { + $value = strtr($value, array('\,' => ',', '\;' => ';')); + } $temp = array( 'name' => $property->name, 'value' => $value, @@ -561,7 +636,7 @@ class OC_Contacts_VCard{ // Faulty entries by kaddressbook // Actually TYPE=PREF is correct according to RFC 2426 // but this way is more handy in the UI. Tanghus. - if($parameter->name == 'TYPE' && $parameter->value == 'PREF') { + if($parameter->name == 'TYPE' && strtoupper($parameter->value) == 'PREF') { $parameter->name = 'PREF'; $parameter->value = '1'; } @@ -589,29 +664,65 @@ class OC_Contacts_VCard{ * @return boolean * */ - public static function moveToAddressBook($aid, $id) { + public static function moveToAddressBook($aid, $id, $isAddressbook = false) { OC_Contacts_App::getAddressbook($aid); // check for user ownership. + $addressbook = OC_Contacts_Addressbook::find($aid); + if ($addressbook['userid'] != OCP\User::getUser()) { + $sharedAddressbook = OCP\Share::getItemSharedWithBySource('addressbook', $aid); + if (!$sharedAddressbook || !($sharedAddressbook['permissions'] & OCP\Share::PERMISSION_CREATE)) { + return false; + } + } if(is_array($id)) { + foreach ($id as $index => $cardId) { + $card = self::find($cardId); + if (!$card) { + unset($id[$index]); + } + $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']); + if ($oldAddressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $cardId, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + unset($id[$index]); + } + } + } $id_sql = join(',', array_fill(0, count($id), '?')); - $prep = 'UPDATE *PREFIX*contacts_cards SET addressbookid = ? WHERE id IN ('.$id_sql.')'; + $prep = 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` IN ('.$id_sql.')'; try { $stmt = OCP\DB::prepare( $prep ); //$aid = array($aid); $vals = array_merge((array)$aid, $id); $result = $stmt->execute($vals); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', ids: '.join(',', $vals), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', SQL:'.$prep, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::ERROR); + OCP\Util::writeLog('contacts', __METHOD__.', ids: '.join(',', $vals), OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', SQL:'.$prep, OCP\Util::DEBUG); return false; } } else { + $stmt = null; + if($isAddressbook) { + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `addressbookid` = ?' ); + } else { + $card = self::find($id); + if (!$card) { + return false; + } + $oldAddressbook = OC_Contacts_Addressbook::find($card['addressbookid']); + if ($oldAddressbook['userid'] != OCP\User::getUser()) { + $sharedContact = OCP\Share::getItemSharedWithBySource('contact', $id, OCP\Share::FORMAT_NONE, null, true); + if (!$sharedContact || !($sharedContact['permissions'] & OCP\Share::PERMISSION_DELETE)) { + return false; + } + } + $stmt = OCP\DB::prepare( 'UPDATE `*PREFIX*contacts_cards` SET `addressbookid` = ? WHERE `id` = ?' ); + } try { - $stmt = OCP\DB::prepare( 'UPDATE *PREFIX*contacts_cards SET addressbookid = ? WHERE id = ?' ); $result = $stmt->execute(array($aid, $id)); } catch(Exception $e) { - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.', exception: '.$e->getMessage(), OCP\Util::DEBUG); - OCP\Util::writeLog('contacts', __CLASS__.'::'.__METHOD__.' id: '.$id, OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.', exception: '.$e->getMessage(), OCP\Util::DEBUG); + OCP\Util::writeLog('contacts', __METHOD__.' id: '.$id, OCP\Util::DEBUG); return false; } } diff --git a/apps/contacts/templates/part.contact.php b/apps/contacts/templates/part.contact.php index 3670ce0389..87ed07c0ec 100644 --- a/apps/contacts/templates/part.contact.php +++ b/apps/contacts/templates/part.contact.php @@ -11,7 +11,7 @@ $id = isset($_['id']) ? $_['id'] : ''; -
+
@@ -22,11 +22,11 @@ $id = isset($_['id']) ? $_['id'] : '';
  • -
    -
    + +
    @@ -50,61 +50,75 @@ $id = isset($_['id']) ? $_['id'] : '';
    -
    - -
    -
    - -
    -
      - -
    -
    + + - -
    -
      - -
    -
    + + - - -
    -
    + + -
    -
    +
    + +
    @@ -114,6 +128,7 @@ $id = isset($_['id']) ? $_['id'] : '';
  • t('Birthday'); ?>
  • t('Phone'); ?>
  • t('Email'); ?>
  • +
  • t('Instant Messaging'); ?>
  • t('Address'); ?>
  • t('Note'); ?>
  • t('Web site'); ?>
  • diff --git a/apps/contacts/templates/part.no_contacts.php b/apps/contacts/templates/part.no_contacts.php index be12092d45..1802939483 100644 --- a/apps/contacts/templates/part.no_contacts.php +++ b/apps/contacts/templates/part.no_contacts.php @@ -2,7 +2,6 @@
    t('You have no contacts in your addressbook.') ?>
    - - +
    diff --git a/apps/contacts/templates/settings.php b/apps/contacts/templates/settings.php index 3fddc59588..e3536c7b46 100644 --- a/apps/contacts/templates/settings.php +++ b/apps/contacts/templates/settings.php @@ -22,6 +22,9 @@ + + + diff --git a/apps/external/img/external.png b/apps/external/img/external.png index 75d1366326..9e56f2919f 100644 Binary files a/apps/external/img/external.png and b/apps/external/img/external.png differ diff --git a/apps/files/appinfo/update.php b/apps/files/appinfo/update.php index 5514aed197..b2480a58f5 100644 --- a/apps/files/appinfo/update.php +++ b/apps/files/appinfo/update.php @@ -1,13 +1,13 @@ execute(); - while( $row = $result->fetchRow()){ - $query = OC_DB::prepare( 'UPDATE *PREFIX*properties SET propertyname = ? WHERE userid = ? AND propertypath = ?' ); - $query->execute( array( preg_replace("/^{.*}/", "", $row["propertyname"]),$row["userid"], $row["propertypath"] )); + $query = OC_DB::prepare( "SELECT `propertyname`, `propertypath`, `userid` FROM `*PREFIX*properties`" ); + $result = $query->execute(); + while( $row = $result->fetchRow()){ + $query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertyname` = ? WHERE `userid` = ? AND `propertypath` = ?' ); + $query->execute( array( preg_replace("/^{.*}/", "", $row["propertyname"]),$row["userid"], $row["propertypath"] )); } } diff --git a/apps/files/index.php b/apps/files/index.php index ffe9493272..ea5192629b 100644 --- a/apps/files/index.php +++ b/apps/files/index.php @@ -39,7 +39,7 @@ OCP\App::setActiveNavigationEntry( 'files_index' ); $dir = isset( $_GET['dir'] ) ? stripslashes($_GET['dir']) : ''; // Redirect if directory does not exist if(!OC_Filesystem::is_dir($dir.'/')) { - header('Location: '.$_SERVER['PHP_SELF'].''); + header('Location: '.$_SERVER['SCRIPT_NAME'].''); exit(); } @@ -92,8 +92,8 @@ $maxUploadFilesize = min($maxUploadFilesize ,$freeSpace); $tmpl = new OCP\Template( 'files', 'index', 'user' ); $tmpl->assign( 'fileList', $list->fetchPage(), false ); $tmpl->assign( 'breadcrumb', $breadcrumbNav->fetchPage(), false ); -$tmpl->assign( 'dir', $dir); -$tmpl->assign( 'readonly', !OC_Filesystem::is_writable($dir.'/')); +$tmpl->assign( 'dir', OC_Filesystem::normalizePath($dir)); +$tmpl->assign( 'isCreatable', OC_Filesystem::isCreatable($dir.'/')); $tmpl->assign( 'files', $files ); $tmpl->assign( 'uploadMaxFilesize', $maxUploadFilesize); $tmpl->assign( 'uploadMaxHumanFilesize', OCP\Util::humanFileSize($maxUploadFilesize)); diff --git a/apps/files/js/fileactions.js b/apps/files/js/fileactions.js index cecfddbf1c..44c04bf0d7 100644 --- a/apps/files/js/fileactions.js +++ b/apps/files/js/fileactions.js @@ -1,19 +1,28 @@ FileActions={ + PERMISSION_CREATE:4, + PERMISSION_READ:1, + PERMISSION_UPDATE:2, + PERMISSION_DELETE:8, + PERMISSION_SHARE:16, actions:{}, defaults:{}, icons:{}, currentFile:null, - register:function(mime,name,icon,action){ + register:function(mime,name,permissions,icon,action){ if(!FileActions.actions[mime]){ FileActions.actions[mime]={}; } - FileActions.actions[mime][name]=action; + if (!FileActions.actions[mime][name]) { + FileActions.actions[mime][name] = {}; + } + FileActions.actions[mime][name]['action'] = action; + FileActions.actions[mime][name]['permissions'] = permissions; FileActions.icons[name]=icon; }, setDefault:function(mime,name){ FileActions.defaults[mime]=name; }, - get:function(mime,type){ + get:function(mime,type,permissions){ var actions={}; if(FileActions.actions.all){ actions=$.extend( actions, FileActions.actions.all ) @@ -32,9 +41,15 @@ FileActions={ actions=$.extend( actions, FileActions.actions[type] ) } } - return actions; + var filteredActions = {}; + $.each(actions, function(name, action) { + if (action.permissions & permissions) { + filteredActions[name] = action.action; + } + }); + return filteredActions; }, - getDefault:function(mime,type){ + getDefault:function(mime,type,permissions){ if(mime){ var mimePart=mime.substr(0,mime.indexOf('/')); } @@ -48,22 +63,24 @@ FileActions={ }else{ name=FileActions.defaults.all; } - var actions=this.get(mime,type); + var actions=this.get(mime,type,permissions); return actions[name]; }, - display:function(parent, filename, type){ + display:function(parent){ FileActions.currentFile=parent; $('#fileList span.fileactions, #fileList td.date a.action').remove(); - var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType()); + var actions=FileActions.get(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions()); var file=FileActions.getCurrentFile(); if($('tr').filterAttr('data-file',file).data('renaming')){ return; } parent.children('a.name').append(''); - var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType()); + var defaultAction=FileActions.getDefault(FileActions.getCurrentMimeType(),FileActions.getCurrentType(), FileActions.getCurrentPermissions()); for(name in actions){ - // no rename and share action for the 'Shared' dir - if((name=='Rename' || name =='Share') && type=='dir' && filename=='Shared') { continue; } + // NOTE: Temporary fix to prevent rename action in root of Shared directory + if (name == 'Rename' && $('#dir').val() == '/Shared') { + continue; + } if((name=='Download' || actions[name]!=defaultAction) && name!='Delete'){ var img=FileActions.icons[name]; if(img.call){ @@ -86,16 +103,12 @@ FileActions={ parent.find('a.name>span.fileactions').append(element); } } - if(actions['Delete'] && (type!='dir' || filename != 'Shared')){ // no delete action for the 'Shared' dir + if(actions['Delete']){ var img=FileActions.icons['Delete']; if(img.call){ img=img(file); } - if ($('#dir').val().indexOf('Shared') != -1) { - var html='
    t('New');?>
    - +
    t('Nothing in here. Upload something!')?>
    @@ -43,7 +43,7 @@ - + t( 'Name' ); ?> @@ -56,7 +56,7 @@ t( 'Modified' ); ?>t('Delete')?> <?php echo $l->t('Delete')?>" /> - + diff --git a/apps/files/templates/part.list.php b/apps/files/templates/part.list.php index 4506630c16..8faeae3939 100644 --- a/apps/files/templates/part.list.php +++ b/apps/files/templates/part.list.php @@ -1,5 +1,4 @@ - ' data-write=''> + ' data-permissions=''> diff --git a/apps/files_archive/js/archive.js b/apps/files_archive/js/archive.js index 48ec031be6..4357198b00 100644 --- a/apps/files_archive/js/archive.js +++ b/apps/files_archive/js/archive.js @@ -7,11 +7,11 @@ $(document).ready(function() { if(typeof FileActions!=='undefined'){ - FileActions.register('application/zip','Open','',function(filename){ + FileActions.register('application/zip','Open', FileActions.PERMISSION_READ, '',function(filename){ window.location=OC.linkTo('files', 'index.php')+'?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); }); FileActions.setDefault('application/zip','Open'); - FileActions.register('application/x-gzip','Open','',function(filename){ + FileActions.register('application/x-gzip','Open', FileActions.PERMISSION_READ, '',function(filename){ window.location=OC.linkTo('files', 'index.php')+'?dir='+encodeURIComponent($('#dir').val()).replace(/%2F/g, '/')+'/'+encodeURIComponent(filename); }); FileActions.setDefault('application/x-gzip','Open'); diff --git a/apps/files_archive/lib/storage.php b/apps/files_archive/lib/storage.php index 8676166361..3c14c3e1fd 100644 --- a/apps/files_archive/lib/storage.php +++ b/apps/files_archive/lib/storage.php @@ -38,22 +38,30 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{ return $this->archive->remove($path.'/'); } public function opendir($path){ + if(substr($path,-1)!=='/'){ + $path.='/'; + } $path=$this->stripPath($path); - $content=$this->archive->getFolder($path); - foreach($content as &$file){ + $files=$this->archive->getFolder($path); + $content=array(); + foreach($files as $file){ if(substr($file,-1)=='/'){ $file=substr($file,0,-1); } + if($file and strpos($file,'/')===false){ + $content[]=$file; + } } $id=md5($this->path.$path); OC_FakeDirStream::$dirs[$id]=$content; return opendir('fakedir://'.$id); } public function stat($path){ - $ctime=filectime($this->path); + $ctime=-1; $path=$this->stripPath($path); if($path==''){ $stat=stat($this->path); + $stat['size']=0; }else{ if($this->is_dir($path)){ $stat=array('size'=>0); @@ -62,6 +70,9 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{ $stat=array(); $stat['mtime']=$this->archive->mtime($path); $stat['size']=$this->archive->filesize($path); + if(!$stat['mtime']){ + $stat['mtime']=time(); + } } } $stat['ctime']=$ctime; @@ -78,10 +89,10 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{ return $this->archive->fileExists($path.'/')?'dir':'file'; } } - public function is_readable($path){ + public function isReadable($path){ return is_readable($this->path); } - public function is_writable($path){ + public function isUpdatable($path){ return is_writable($this->path); } public function file_exists($path){ @@ -111,6 +122,19 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{ return false;//not supported } } + private function toTmpFile($path){ + $tmpFile=OC_Helper::tmpFile($extension); + $this->archive->extractFile($path,$tmpFile); + return $tmpFile; + } + public function file_put_contents($path,$data) { + $path=$this->stripPath($path); + return $this->archive->addFile($path,$data); + } + public function file_get_contents($path) { + $path=$this->stripPath($path); + return $this->archive->getFile($path); + } /** * automount paths from file hooks @@ -143,4 +167,8 @@ class OC_Filestorage_Archive extends OC_Filestorage_Common{ public function rename($path1,$path2){ return $this->archive->rename($path1,$path2); } + + public function hasUpdated($path,$time){ + return $this->filemtime($this->path)>$time; + } } diff --git a/apps/files_encryption/l10n/cs_CZ.php b/apps/files_encryption/l10n/cs_CZ.php new file mode 100644 index 0000000000..15cf770570 --- /dev/null +++ b/apps/files_encryption/l10n/cs_CZ.php @@ -0,0 +1,6 @@ + "Kryptování", +"Exclude the following file types from encryption" => "Při kryptování vynechat následující typy souborů", +"None" => "Žádný", +"Enable Encryption" => "Povolit kryptování" +); diff --git a/apps/files_encryption/l10n/el.php b/apps/files_encryption/l10n/el.php new file mode 100644 index 0000000000..40a7c6a367 --- /dev/null +++ b/apps/files_encryption/l10n/el.php @@ -0,0 +1,6 @@ + "Κρυπτογράφηση", +"Exclude the following file types from encryption" => "Εξαίρεση των παρακάτω τύπων αρχείων από την κρυπτογράφηση", +"None" => "Καμία", +"Enable Encryption" => "Ενεργοποίηση Κρυπτογράφησης" +); diff --git a/apps/files_encryption/l10n/eo.php b/apps/files_encryption/l10n/eo.php new file mode 100644 index 0000000000..af3c9ae98e --- /dev/null +++ b/apps/files_encryption/l10n/eo.php @@ -0,0 +1,6 @@ + "Ĉifrado", +"Exclude the following file types from encryption" => "Malinkluzivigi la jenajn dosiertipojn el ĉifrado", +"None" => "Nenio", +"Enable Encryption" => "Kapabligi ĉifradon" +); diff --git a/apps/files_encryption/l10n/es.php b/apps/files_encryption/l10n/es.php new file mode 100644 index 0000000000..26ace24e33 --- /dev/null +++ b/apps/files_encryption/l10n/es.php @@ -0,0 +1,3 @@ + "Cifrado" +); diff --git a/apps/files_encryption/l10n/et_EE.php b/apps/files_encryption/l10n/et_EE.php new file mode 100644 index 0000000000..a7cd9395bf --- /dev/null +++ b/apps/files_encryption/l10n/et_EE.php @@ -0,0 +1,6 @@ + "Krüpteerimine", +"Exclude the following file types from encryption" => "Järgnevaid failitüüpe ära krüpteeri", +"None" => "Pole", +"Enable Encryption" => "Luba krüpteerimine" +); diff --git a/apps/files_encryption/l10n/fa.php b/apps/files_encryption/l10n/fa.php new file mode 100644 index 0000000000..0faa3f3aae --- /dev/null +++ b/apps/files_encryption/l10n/fa.php @@ -0,0 +1,5 @@ + "رمزگذاری", +"None" => "هیچ‌کدام", +"Enable Encryption" => "فعال کردن رمزگذاری" +); diff --git a/apps/files_encryption/l10n/fi_FI.php b/apps/files_encryption/l10n/fi_FI.php new file mode 100644 index 0000000000..5796499a26 --- /dev/null +++ b/apps/files_encryption/l10n/fi_FI.php @@ -0,0 +1,6 @@ + "Salaus", +"Exclude the following file types from encryption" => "Jätä seuraavat tiedostotyypit salaamatta", +"None" => "Ei mitään", +"Enable Encryption" => "Käytä salausta" +); diff --git a/apps/files_encryption/l10n/ja_JP.php b/apps/files_encryption/l10n/ja_JP.php new file mode 100644 index 0000000000..2c3e5410de --- /dev/null +++ b/apps/files_encryption/l10n/ja_JP.php @@ -0,0 +1,6 @@ + "暗号化", +"Exclude the following file types from encryption" => "暗号化から除外するファイルタイプ", +"None" => "なし", +"Enable Encryption" => "暗号化を有効にする" +); diff --git a/apps/files_encryption/l10n/lt_LT.php b/apps/files_encryption/l10n/lt_LT.php new file mode 100644 index 0000000000..b939df164c --- /dev/null +++ b/apps/files_encryption/l10n/lt_LT.php @@ -0,0 +1,6 @@ + "Šifravimas", +"Exclude the following file types from encryption" => "Nešifruoti pasirinkto tipo failų", +"None" => "Nieko", +"Enable Encryption" => "Įjungti šifravimą" +); diff --git a/apps/files_encryption/l10n/nb_NO.php b/apps/files_encryption/l10n/nb_NO.php new file mode 100644 index 0000000000..e65df7b6ce --- /dev/null +++ b/apps/files_encryption/l10n/nb_NO.php @@ -0,0 +1,6 @@ + "Kryptering", +"Exclude the following file types from encryption" => "Ekskluder følgende filer fra kryptering", +"None" => "Ingen", +"Enable Encryption" => "Slå på kryptering" +); diff --git a/apps/files_encryption/l10n/nl.php b/apps/files_encryption/l10n/nl.php new file mode 100644 index 0000000000..1ea56006fc --- /dev/null +++ b/apps/files_encryption/l10n/nl.php @@ -0,0 +1,6 @@ + "Versleuteling", +"Exclude the following file types from encryption" => "Versleutel de volgende bestand types niet", +"None" => "Geen", +"Enable Encryption" => "Zet versleuteling aan" +); diff --git a/apps/files_encryption/l10n/ru.php b/apps/files_encryption/l10n/ru.php new file mode 100644 index 0000000000..3a7e84b6d0 --- /dev/null +++ b/apps/files_encryption/l10n/ru.php @@ -0,0 +1,6 @@ + "Шифрование", +"Exclude the following file types from encryption" => "Исключить шифрование следующих типов файлов", +"None" => "Ничего", +"Enable Encryption" => "Включить шифрование" +); diff --git a/apps/files_encryption/l10n/sl.php b/apps/files_encryption/l10n/sl.php new file mode 100644 index 0000000000..65807910e1 --- /dev/null +++ b/apps/files_encryption/l10n/sl.php @@ -0,0 +1,6 @@ + "Šifriranje", +"Exclude the following file types from encryption" => "Naslednje vrste datotek naj se ne šifrirajo", +"None" => "Brez", +"Enable Encryption" => "Omogoči šifriranje" +); diff --git a/apps/files_external/l10n/cs_CZ.php b/apps/files_external/l10n/cs_CZ.php new file mode 100644 index 0000000000..8f11d7da11 --- /dev/null +++ b/apps/files_external/l10n/cs_CZ.php @@ -0,0 +1,13 @@ + "Externí úložiště", +"Mount point" => "Přípojný bod", +"Configuration" => "Konfigurace", +"Options" => "Nastavení", +"Add mount point" => "Přidat přípojný bod", +"All Users" => "Všichni uživatelé", +"Groups" => "Skupiny", +"Users" => "Uživatelé", +"Delete" => "Smazat", +"Enable User External Storage" => "Zapnout uživatelské externí úložiště", +"Allow users to mount their own external storage" => "Povolit uživatelů připojit jejich vlastní externí úložiště" +); diff --git a/apps/files_external/l10n/de.php b/apps/files_external/l10n/de.php index 45e5d32dfc..4306ad33dc 100644 --- a/apps/files_external/l10n/de.php +++ b/apps/files_external/l10n/de.php @@ -13,6 +13,6 @@ "Delete" => "Löschen", "SSL root certificates" => "SSL-Root-Zertifikate", "Import Root Certificate" => "Root-Zertifikate importieren", -"Enable User External Storage" => "Externer Speicher für Benutzer aktivieren", -"Allow users to mount their own external storage" => "Erlaubt Benutzern Ihre eigenen externen Speicher einzubinden" +"Enable User External Storage" => "Externen Speicher für Benutzer aktivieren", +"Allow users to mount their own external storage" => "Erlaubt Benutzern ihre eigenen externen Speicher einzubinden" ); diff --git a/apps/files_external/l10n/el.php b/apps/files_external/l10n/el.php new file mode 100644 index 0000000000..a4a910ce63 --- /dev/null +++ b/apps/files_external/l10n/el.php @@ -0,0 +1,9 @@ + "Εξωτερική αποθήκευση", +"Configuration" => "Ρυθμίσεις", +"Options" => "Επιλογές", +"All Users" => "Όλοι οι χρήστες", +"Groups" => "Ομάδες", +"Users" => "Χρήστες", +"Delete" => "Διαγραφή" +); diff --git a/apps/files_external/l10n/eo.php b/apps/files_external/l10n/eo.php new file mode 100644 index 0000000000..3cb8255c52 --- /dev/null +++ b/apps/files_external/l10n/eo.php @@ -0,0 +1,18 @@ + "Malena memorilo", +"Mount point" => "Surmetingo", +"Backend" => "Motoro", +"Configuration" => "Agordo", +"Options" => "Malneproj", +"Applicable" => "Aplikebla", +"Add mount point" => "Aldoni surmetingon", +"None set" => "Nenio agordita", +"All Users" => "Ĉiuj uzantoj", +"Groups" => "Grupoj", +"Users" => "Uzantoj", +"Delete" => "Forigi", +"SSL root certificates" => "Radikaj SSL-atestoj", +"Import Root Certificate" => "Enporti radikan ateston", +"Enable User External Storage" => "Kapabligi malenan memorilon de uzanto", +"Allow users to mount their own external storage" => "Permesi al uzantoj surmeti siajn proprajn malenajn memorilojn" +); diff --git a/apps/files_external/l10n/es.php b/apps/files_external/l10n/es.php new file mode 100644 index 0000000000..c1c605735f --- /dev/null +++ b/apps/files_external/l10n/es.php @@ -0,0 +1,13 @@ + "Almacenamiento externo", +"Backend" => "Motor", +"Configuration" => "Configuración", +"Options" => "Opciones", +"Applicable" => "Aplicable", +"Add mount point" => "Añadir punto de montaje", +"None set" => "No se ha configurado", +"All Users" => "Todos los usuarios", +"Groups" => "Grupos", +"Users" => "Usuarios", +"Delete" => "Eliiminar" +); diff --git a/apps/files_external/l10n/et_EE.php b/apps/files_external/l10n/et_EE.php new file mode 100644 index 0000000000..a6907e775b --- /dev/null +++ b/apps/files_external/l10n/et_EE.php @@ -0,0 +1,12 @@ + "Väline salvestuskoht", +"Mount point" => "Ühenduspunkt", +"Configuration" => "Seadistamine", +"Options" => "Valikud", +"Add mount point" => "Lisa ühenduspunkt", +"None set" => "Pole määratud", +"All Users" => "Kõik kasutajad", +"Groups" => "Grupid", +"Users" => "Kasutajad", +"Delete" => "Kustuta" +); diff --git a/apps/files_external/l10n/fi_FI.php b/apps/files_external/l10n/fi_FI.php new file mode 100644 index 0000000000..7dca49791e --- /dev/null +++ b/apps/files_external/l10n/fi_FI.php @@ -0,0 +1,16 @@ + "Erillinen tallennusväline", +"Mount point" => "Liitospiste", +"Backend" => "Taustaosa", +"Configuration" => "Asetukset", +"Options" => "Valinnat", +"Add mount point" => "Lisää liitospiste", +"None set" => "Ei asetettu", +"All Users" => "Kaikki käyttäjät", +"Groups" => "Ryhmät", +"Users" => "Käyttäjät", +"Delete" => "Poista", +"SSL root certificates" => "SSL-juurivarmenteet", +"Import Root Certificate" => "Tuo juurivarmenne", +"Allow users to mount their own external storage" => "Salli käyttäjien liittää omia erillisiä tallennusvälineitä" +); diff --git a/apps/files_external/l10n/ja_JP.php b/apps/files_external/l10n/ja_JP.php new file mode 100644 index 0000000000..c7d38d8832 --- /dev/null +++ b/apps/files_external/l10n/ja_JP.php @@ -0,0 +1,18 @@ + "外部ストレージ", +"Mount point" => "マウントポイント", +"Backend" => "バックエンド", +"Configuration" => "設定", +"Options" => "オプション", +"Applicable" => "適用範囲", +"Add mount point" => "マウントポイントを追加", +"None set" => "未設定", +"All Users" => "すべてのユーザ", +"Groups" => "グループ", +"Users" => "ユーザ", +"Delete" => "削除", +"SSL root certificates" => "SSLルート証明書", +"Import Root Certificate" => "ルート証明書をインポート", +"Enable User External Storage" => "ユーザの外部ストレージを有効にする", +"Allow users to mount their own external storage" => "ユーザに外部ストレージのマウントを許可する" +); diff --git a/apps/files_external/l10n/lt_LT.php b/apps/files_external/l10n/lt_LT.php new file mode 100644 index 0000000000..00022aa3d3 --- /dev/null +++ b/apps/files_external/l10n/lt_LT.php @@ -0,0 +1,9 @@ + "Konfigūracija", +"Options" => "Nustatymai", +"None set" => "Nieko nepasirinkta", +"All Users" => "Visi vartotojai", +"Groups" => "Grupės", +"Users" => "Vartotojai", +"Delete" => "Ištrinti" +); diff --git a/apps/files_external/l10n/pl.php b/apps/files_external/l10n/pl.php new file mode 100644 index 0000000000..df0ed54e80 --- /dev/null +++ b/apps/files_external/l10n/pl.php @@ -0,0 +1,18 @@ + "Zewnętrzna zasoby dyskowe", +"Mount point" => "Punkt montowania", +"Backend" => "Zaplecze", +"Configuration" => "Konfiguracja", +"Options" => "Opcje", +"Applicable" => "Zastosowanie", +"Add mount point" => "Dodaj punkt montowania", +"None set" => "Nie ustawione", +"All Users" => "Wszyscy uzytkownicy", +"Groups" => "Grupy", +"Users" => "Użytkownicy", +"Delete" => "Usuń", +"SSL root certificates" => "Główny certyfikat SSL", +"Import Root Certificate" => "Importuj główny certyfikat", +"Enable User External Storage" => "Włącz zewnętrzne zasoby dyskowe użytkownika", +"Allow users to mount their own external storage" => "Zezwalaj użytkownikom na montowanie ich własnych zewnętrznych zasobów dyskowych" +); diff --git a/apps/files_external/l10n/ru.php b/apps/files_external/l10n/ru.php new file mode 100644 index 0000000000..7ee4378662 --- /dev/null +++ b/apps/files_external/l10n/ru.php @@ -0,0 +1,18 @@ + "Внешний носитель", +"Mount point" => "Точка монтирования", +"Backend" => "Подсистема", +"Configuration" => "Конфигурация", +"Options" => "Опции", +"Applicable" => "Применимый", +"Add mount point" => "Добавить точку монтирования", +"None set" => "Не установлено", +"All Users" => "Все пользователи", +"Groups" => "Группы", +"Users" => "Пользователи", +"Delete" => "Удалить", +"SSL root certificates" => "Корневые сертификаты SSL", +"Import Root Certificate" => "Импортировать корневые сертификаты", +"Enable User External Storage" => "Включить пользовательские внешние носители", +"Allow users to mount their own external storage" => "Разрешить пользователям монтировать их собственные внешние носители" +); diff --git a/apps/files_external/l10n/sl.php b/apps/files_external/l10n/sl.php index 6a96e2cd69..d588844467 100644 --- a/apps/files_external/l10n/sl.php +++ b/apps/files_external/l10n/sl.php @@ -1,9 +1,18 @@ "Zunanja podatkovna shramba", +"Mount point" => "Priklopna točka", +"Backend" => "Zaledje", +"Configuration" => "Nastavitve", +"Options" => "Možnosti", +"Applicable" => "Se uporablja", +"Add mount point" => "Dodaj priklopno točko", +"None set" => "Ni nastavljeno", "All Users" => "Vsi uporabniki", "Groups" => "Skupine", "Users" => "Uporabniki", "Delete" => "Izbriši", "SSL root certificates" => "SSL korenski certifikati", "Import Root Certificate" => "Uvozi korenski certifikat", -"Enable User External Storage" => "Omogoči" +"Enable User External Storage" => "Omogoči uporabo zunanje podatkovne shrambe za uporabnike", +"Allow users to mount their own external storage" => "Dovoli uporabnikom priklop lastne zunanje podatkovne shrambe" ); diff --git a/apps/files_external/lib/amazons3.php b/apps/files_external/lib/amazons3.php index 9feb490dac..3c2e333017 100644 --- a/apps/files_external/lib/amazons3.php +++ b/apps/files_external/lib/amazons3.php @@ -134,12 +134,12 @@ class OC_Filestorage_AmazonS3 extends OC_Filestorage_Common { return false; } - public function is_readable($path) { + public function isReadable($path) { // TODO Check acl and determine who grantee is return true; } - public function is_writable($path) { + public function isUpdatable($path) { // TODO Check acl and determine who grantee is return true; } diff --git a/apps/files_external/lib/dropbox.php b/apps/files_external/lib/dropbox.php index a27d9d7c36..b90563a506 100755 --- a/apps/files_external/lib/dropbox.php +++ b/apps/files_external/lib/dropbox.php @@ -125,11 +125,11 @@ class OC_Filestorage_Dropbox extends OC_Filestorage_Common { return false; } - public function is_readable($path) { + public function isReadable($path) { return $this->file_exists($path); } - public function is_writable($path) { + public function isUpdatable($path) { return $this->file_exists($path); } diff --git a/apps/files_external/lib/google.php b/apps/files_external/lib/google.php index 2b387f0c83..73317bbf71 100644 --- a/apps/files_external/lib/google.php +++ b/apps/files_external/lib/google.php @@ -284,11 +284,11 @@ class OC_Filestorage_Google extends OC_Filestorage_Common { return false; } - public function is_readable($path) { + public function isReadable($path) { return true; } - public function is_writable($path) { + public function isUpdatable($path) { if ($path == '' || $path == '/') { return true; } else if ($entry = $this->getResource($path)) { diff --git a/apps/files_external/lib/streamwrapper.php b/apps/files_external/lib/streamwrapper.php index 7d56445361..467c5a5b84 100644 --- a/apps/files_external/lib/streamwrapper.php +++ b/apps/files_external/lib/streamwrapper.php @@ -32,11 +32,11 @@ abstract class OC_FileStorage_StreamWrapper extends OC_Filestorage_Common{ return filetype($this->constructUrl($path)); } - public function is_readable($path){ + public function isReadable($path){ return true;//not properly supported } - public function is_writable($path){ + public function isUpdatable($path){ return true;//not properly supported } diff --git a/apps/files_external/lib/swift.php b/apps/files_external/lib/swift.php index 58b95a6ae0..94ccde1ff8 100644 --- a/apps/files_external/lib/swift.php +++ b/apps/files_external/lib/swift.php @@ -353,11 +353,11 @@ class OC_FileStorage_SWIFT extends OC_Filestorage_Common{ } } - public function is_readable($path){ + public function isReadable($path){ return true; } - public function is_writable($path){ + public function isUpdatable($path){ return true; } diff --git a/apps/files_external/lib/webdav.php b/apps/files_external/lib/webdav.php index 84d64b6519..e3f73c5c0a 100644 --- a/apps/files_external/lib/webdav.php +++ b/apps/files_external/lib/webdav.php @@ -104,11 +104,11 @@ class OC_FileStorage_DAV extends OC_Filestorage_Common{ } } - public function is_readable($path){ + public function isReadable($path){ return true;//not properly supported } - public function is_writable($path){ + public function isUpdatable($path){ return true;//not properly supported } diff --git a/apps/files_external/tests/test.php b/apps/files_external/tests/test.php new file mode 100644 index 0000000000..bd24404f3b --- /dev/null +++ b/apps/files_external/tests/test.php @@ -0,0 +1,7 @@ +"; +print_r(OC_Mount_Config::getSystemMountPoints()); +echo ""; +// OC_Mount_Config::addMountPoint('Photos', 'OC_Filestorage_SWIFT', array('host' => 'gapinthecloud.com', 'user' => 'Gap', 'token' => '23423afdasFJEW22', 'secure' => 'true', 'root' => ''), OC_Mount_Config::MOUNT_TYPE_GROUP, 'admin', false); +?> diff --git a/apps/files_imageviewer/img/fancybox-y.png b/apps/files_imageviewer/img/fancybox-y.png index 7ef399b990..62f3176199 100644 Binary files a/apps/files_imageviewer/img/fancybox-y.png and b/apps/files_imageviewer/img/fancybox-y.png differ diff --git a/apps/files_imageviewer/js/lightbox.js b/apps/files_imageviewer/js/lightbox.js index 31f08456d2..ff12d808bc 100644 --- a/apps/files_imageviewer/js/lightbox.js +++ b/apps/files_imageviewer/js/lightbox.js @@ -1,6 +1,6 @@ $(document).ready(function() { if(typeof FileActions!=='undefined'){ - FileActions.register('image','View','',function(filename){ + FileActions.register('image','View', FileActions.PERMISSION_READ, '',function(filename){ viewImage($('#dir').val(),filename); }); FileActions.setDefault('image','View'); diff --git a/apps/files_odfviewer/appinfo/app.php b/apps/files_odfviewer/appinfo/app.php new file mode 100644 index 0000000000..f5fe338c0e --- /dev/null +++ b/apps/files_odfviewer/appinfo/app.php @@ -0,0 +1,5 @@ + + + files_odfviewer + ODF Viewer + Simple ODF viewer for owncloud + 0.1 + AGPL + Thomas Müller + 4 + true + + diff --git a/apps/files_odfviewer/css/odfviewer.css b/apps/files_odfviewer/css/odfviewer.css new file mode 100644 index 0000000000..097276a00f --- /dev/null +++ b/apps/files_odfviewer/css/odfviewer.css @@ -0,0 +1,20 @@ +#odf-canvas{ + position: relative; + top: 37px; + left: 1px; + border:1px solid darkgray; + box-shadow: 0px 4px 10px #000; + -moz-box-shadow: 0px 4px 10px #000; + -webkit-box-shadow: 0px 4px 10px #000; +} + +#odf_close{ + margin-left: auto; + margin-right: 167px; + float: right; +} + +#odf-toolbar{ + padding: 0 0 0 1em +} + diff --git a/apps/files_odfviewer/css/webodf.css b/apps/files_odfviewer/css/webodf.css new file mode 100644 index 0000000000..0ceca2f851 --- /dev/null +++ b/apps/files_odfviewer/css/webodf.css @@ -0,0 +1,196 @@ +@namespace draw url(urn:oasis:names:tc:opendocument:xmlns:drawing:1.0); +@namespace fo url(urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0); +@namespace office url(urn:oasis:names:tc:opendocument:xmlns:office:1.0); +@namespace presentation url(urn:oasis:names:tc:opendocument:xmlns:presentation:1.0); +@namespace style url(urn:oasis:names:tc:opendocument:xmlns:style:1.0); +@namespace svg url(urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0); +@namespace table url(urn:oasis:names:tc:opendocument:xmlns:table:1.0); +@namespace text url(urn:oasis:names:tc:opendocument:xmlns:text:1.0); +@namespace runtimens url(urn:webodf); /* namespace for runtime only */ + +office|document > *, office|document-content > * { + display: none; +} +office|body, office|document { + display: inline-block; + position: relative; +} + +text|p, text|h { + display: block; + padding: 3px 3px 3px 3px; + margin: 5px 5px 5px 5px; +} +text|h { + font-weight: bold; +} +*[runtimens|containsparagraphanchor] { + position: relative; +} +text|s:before { /* this needs to be the number of spaces given by text:c */ + content: ' '; +} +text|tab:before { + display: inline; + content: ' '; +} +text|line-break { + content: " "; + display: block; +} +text|tracked-changes { + /*Consumers that do not support change tracking, should ignore changes.*/ + display: none; +} +office|binary-data { + display: none; +} +office|text { + display: block; + width: 216mm; /* default to A4 width */ + min-height: 279mm; + padding-left: 32mm; + padding-right: 32mm; + padding-top: 25mm; + padding-bottom: 13mm; + margin: 2px; + text-align: left; + overflow: hidden; +} +office|spreadsheet { + display: block; + border-collapse: collapse; + empty-cells: show; + font-family: sans-serif; + font-size: 10pt; + text-align: left; + page-break-inside: avoid; + overflow: hidden; +} +office|presentation { + display: inline-block; + text-align: left; +} +draw|page { + display: block; + height: 21cm; + width: 28cm; + margin: 3px; + position: relative; + overflow: hidden; +} +presentation|notes { + display: none; +} +@media print { + draw|page { + border: 1pt solid black; + page-break-inside: avoid; + } + presentation|notes { + /*TODO*/ + } +} +office|spreadsheet text|p { + border: 0px; + padding: 1px; + margin: 0px; +} +office|spreadsheet table|table { + margin: 3px; +} +office|spreadsheet table|table:after { + /* show sheet name the end of the sheet */ + /*content: attr(table|name);*/ /* gives parsing error in opera */ +} +office|spreadsheet table|table-row { + counter-increment: row; +} +office|spreadsheet table|table-row:before { + width: 3em; + background: #cccccc; + border: 1px solid black; + text-align: center; + content: counter(row); +} +office|spreadsheet table|table-cell { + border: 1px solid #cccccc; +} +table|table { + display: table; +} +draw|frame table|table { + width: 100%; + height: 100%; + background: white; +} +table|table-row { + display: table-row; +} +table|table-column { + display: table-column; +} +table|table-cell { + display: table-cell; +} +draw|frame { + display: block; +} +draw|image { + display: block; + width: 100%; + height: 100%; + top: 0px; + left: 0px; + background-repeat: no-repeat; + background-size: 100% 100%; + -moz-background-size: 100% 100%; +} +/* only show the first image in frame */ +draw|frame > draw|image:nth-of-type(n+2) { + display: none; +} +text|list { + display: block; + padding-left: 1.5em; + counter-reset: list; +} +text|list-item { + display: block; +} +text|list-item:before { + display: inline-block; + content: '•'; + counter-increment: list; + width: 0.5em; + margin-left: -0.5em; + padding: 0px; + border: 0px; +} +text|list-item > *:first-child { + display: inline-block; +} +text|a { + color: blue; + text-decoration: underline; +} +text|note-citation { + vertical-align: super; + font-size: smaller; +} +text|note-body { + display: none; +} +text|note:hover text|note-citation { + background: #dddddd; +} +text|note:hover text|note-body { + display: block; + left:1em; + max-width: 80%; + position: absolute; + background: #ffffaa; +} +svg|title, svg|desc { + display: none; +} diff --git a/apps/files_odfviewer/js/viewer.js b/apps/files_odfviewer/js/viewer.js new file mode 100644 index 0000000000..586da12687 --- /dev/null +++ b/apps/files_odfviewer/js/viewer.js @@ -0,0 +1,60 @@ +function viewOdf(dir, file) { + var location=OC.filePath('files','ajax','download.php')+'?files='+file+'&dir='+dir; + + // fade out files menu and add odf menu + $('.actions,#file_action_panel').fadeOut('slow').promise().done(function() { + // odf action toolbar + var odfToolbarHtml = + '
    ' + + '' + + '
    '; + $('#controls').append(odfToolbarHtml); + + }); + + // fade out file list and show pdf canvas + $('table').fadeOut('slow').promise().done(function(){; + var canvashtml = '
    '; + $('table').after(canvashtml); + + var odfelement = document.getElementById("odf-canvas"); + var odfcanvas = new odf.OdfCanvas(odfelement); + odfcanvas.load(location); + }); +} + +function closeOdfViewer(){ + // Fade out odf-toolbar + $('#odf-toolbar').fadeOut('slow'); + // Fade out editor + $('#odf-canvas').fadeOut('slow', function(){ + $('#odf-toolbar').remove(); + $('#odf-canvas').remove(); + $('.actions,#file_access_panel').fadeIn('slow'); + $('table').fadeIn('slow'); + }); + is_editor_shown = false; +} + +$(document).ready(function() { + if(typeof FileActions!=='undefined'){ + + var supportedMimes = new Array( + 'application/vnd.oasis.opendocument.text', + 'application/vnd.oasis.opendocument.spreadsheet', + 'application/vnd.oasis.opendocument.graphics', + 'application/vnd.oasis.opendocument.presentation'); + for (var i = 0; i < supportedMimes.length; ++i){ + var mime = supportedMimes[i]; + FileActions.register(mime,'View','',function(filename){ + viewOdf($('#dir').val(),filename); + }); + FileActions.setDefault(mime,'View'); + } + } + + $('#odf_close').live('click',function() { + closeOdfViewer(); + }); +}); + diff --git a/apps/files_odfviewer/js/webodf-debug.js b/apps/files_odfviewer/js/webodf-debug.js new file mode 100644 index 0000000000..6c7c7e1d6f --- /dev/null +++ b/apps/files_odfviewer/js/webodf-debug.js @@ -0,0 +1,7124 @@ +/* + + @licstart + The JavaScript code in this page is free software: you can redistribute it + and/or modify it under the terms of the GNU Affero General Public License + (GNU AGPL) as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. The code is distributed + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + + As additional permission under GNU AGPL version 3 section 7, you + may distribute non-source (e.g., minimized or compacted) forms of + that code without the copy of the GNU GPL normally required by + section 4, provided you include this license notice and a URL + through which recipients can access the Corresponding Source. + + As a special exception to the AGPL, any HTML file which merely makes function + calls to this code, and for that purpose includes it by reference shall be + deemed a separate work for copyright law purposes. In addition, the copyright + holders of this code give you permission to combine this code with free + software libraries that are released under the GNU LGPL. You may copy and + distribute such a system following the terms of the GNU AGPL for this code + and the LGPL for the libraries. If you modify this code, you may extend this + exception to your version of the code, but you are not obligated to do so. + If you do not wish to do so, delete this exception statement from your + version. + + This license applies to this entire compilation. + @licend + @source: http://www.webodf.org/ + @source: http://gitorious.org/odfkit/webodf/ +*/ +var core = {}; +var gui = {}; +var xmldom = {}; +var odf = {}; +function Runtime() { +} +Runtime.ByteArray = function(size) { +}; +Runtime.ByteArray.prototype.slice = function(start, end) { +}; +Runtime.prototype.byteArrayFromArray = function(array) { +}; +Runtime.prototype.byteArrayFromString = function(string, encoding) { +}; +Runtime.prototype.byteArrayToString = function(bytearray, encoding) { +}; +Runtime.prototype.concatByteArrays = function(bytearray1, bytearray2) { +}; +Runtime.prototype.read = function(path, offset, length, callback) { +}; +Runtime.prototype.readFile = function(path, encoding, callback) { +}; +Runtime.prototype.readFileSync = function(path, encoding) { +}; +Runtime.prototype.loadXML = function(path, callback) { +}; +Runtime.prototype.writeFile = function(path, data, callback) { +}; +Runtime.prototype.isFile = function(path, callback) { +}; +Runtime.prototype.getFileSize = function(path, callback) { +}; +Runtime.prototype.deleteFile = function(path, callback) { +}; +Runtime.prototype.log = function(msgOrCategory, msg) { +}; +Runtime.prototype.setTimeout = function(callback, milliseconds) { +}; +Runtime.prototype.libraryPaths = function() { +}; +Runtime.prototype.type = function() { +}; +Runtime.prototype.getDOMImplementation = function() { +}; +Runtime.prototype.getWindow = function() { +}; +var IS_COMPILED_CODE = false; +Runtime.byteArrayToString = function(bytearray, encoding) { + function byteArrayToString(bytearray) { + var s = "", i, l = bytearray.length; + for(i = 0;i < l;i += 1) { + s += String.fromCharCode(bytearray[i] & 255) + } + return s + } + function utf8ByteArrayToString(bytearray) { + var s = "", i, l = bytearray.length, c0, c1, c2; + for(i = 0;i < l;i += 1) { + c0 = bytearray[i]; + if(c0 < 128) { + s += String.fromCharCode(c0) + }else { + i += 1; + c1 = bytearray[i]; + if(c0 < 224) { + s += String.fromCharCode((c0 & 31) << 6 | c1 & 63) + }else { + i += 1; + c2 = bytearray[i]; + s += String.fromCharCode((c0 & 15) << 12 | (c1 & 63) << 6 | c2 & 63) + } + } + } + return s + } + var result; + if(encoding === "utf8") { + result = utf8ByteArrayToString(bytearray) + }else { + if(encoding !== "binary") { + this.log("Unsupported encoding: " + encoding) + } + result = byteArrayToString(bytearray) + } + return result +}; +Runtime.getFunctionName = function getFunctionName(f) { + var m; + if(f.name === undefined) { + m = (new RegExp("function\\s+(\\w+)")).exec(f); + return m && m[1] + } + return f.name +}; +function BrowserRuntime(logoutput) { + var self = this, cache = {}, useNativeArray = window.ArrayBuffer && window.Uint8Array; + this.ByteArray = useNativeArray ? function ByteArray(size) { + Uint8Array.prototype.slice = function(begin, end) { + if(end === undefined) { + if(begin === undefined) { + begin = 0 + } + end = this.length + } + var view = this.subarray(begin, end), array, i; + end -= begin; + array = new Uint8Array(new ArrayBuffer(end)); + for(i = 0;i < end;i += 1) { + array[i] = view[i] + } + return array + }; + return new Uint8Array(new ArrayBuffer(size)) + } : function ByteArray(size) { + var a = []; + a.length = size; + return a + }; + this.concatByteArrays = useNativeArray ? function(bytearray1, bytearray2) { + var i, l1 = bytearray1.length, l2 = bytearray2.length, a = new this.ByteArray(l1 + l2); + for(i = 0;i < l1;i += 1) { + a[i] = bytearray1[i] + } + for(i = 0;i < l2;i += 1) { + a[i + l1] = bytearray2[i] + } + return a + } : function(bytearray1, bytearray2) { + return bytearray1.concat(bytearray2) + }; + function utf8ByteArrayFromString(string) { + var l = string.length, bytearray, i, n, j = 0; + for(i = 0;i < l;i += 1) { + n = string.charCodeAt(i); + j += 1 + (n > 128) + (n > 2048) + } + bytearray = new self.ByteArray(j); + j = 0; + for(i = 0;i < l;i += 1) { + n = string.charCodeAt(i); + if(n < 128) { + bytearray[j] = n; + j += 1 + }else { + if(n < 2048) { + bytearray[j] = 192 | n >>> 6; + bytearray[j + 1] = 128 | n & 63; + j += 2 + }else { + bytearray[j] = 224 | n >>> 12 & 15; + bytearray[j + 1] = 128 | n >>> 6 & 63; + bytearray[j + 2] = 128 | n & 63; + j += 3 + } + } + } + return bytearray + } + function byteArrayFromString(string) { + var l = string.length, a = new self.ByteArray(l), i; + for(i = 0;i < l;i += 1) { + a[i] = string.charCodeAt(i) & 255 + } + return a + } + this.byteArrayFromArray = function(array) { + return array.slice() + }; + this.byteArrayFromString = function(string, encoding) { + var result; + if(encoding === "utf8") { + result = utf8ByteArrayFromString(string) + }else { + if(encoding !== "binary") { + self.log("unknown encoding: " + encoding) + } + result = byteArrayFromString(string) + } + return result + }; + this.byteArrayToString = Runtime.byteArrayToString; + function log(msgOrCategory, msg) { + var node, doc, category; + if(msg) { + category = msgOrCategory + }else { + msg = msgOrCategory + } + if(logoutput) { + doc = logoutput.ownerDocument; + if(category) { + node = doc.createElement("span"); + node.className = category; + node.appendChild(doc.createTextNode(category)); + logoutput.appendChild(node); + logoutput.appendChild(doc.createTextNode(" ")) + } + node = doc.createElement("span"); + node.appendChild(doc.createTextNode(msg)); + logoutput.appendChild(node); + logoutput.appendChild(doc.createElement("br")) + }else { + if(console) { + console.log(msg) + } + } + } + function readFile(path, encoding, callback) { + if(cache.hasOwnProperty(path)) { + callback(null, cache[path]); + return + } + var xhr = new XMLHttpRequest; + function handleResult() { + var data; + if(xhr.readyState === 4) { + if(xhr.status === 0 && !xhr.responseText) { + callback("File " + path + " is empty.") + }else { + if(xhr.status === 200 || xhr.status === 0) { + if(encoding === "binary") { + if(typeof VBArray !== "undefined") { + data = (new VBArray(xhr.responseBody)).toArray() + }else { + data = self.byteArrayFromString(xhr.responseText, "binary") + } + }else { + data = xhr.responseText + } + cache[path] = data; + callback(null, data) + }else { + callback(xhr.responseText || xhr.statusText) + } + } + } + } + xhr.open("GET", path, true); + xhr.onreadystatechange = handleResult; + if(xhr.overrideMimeType) { + if(encoding !== "binary") { + xhr.overrideMimeType("text/plain; charset=" + encoding) + }else { + xhr.overrideMimeType("text/plain; charset=x-user-defined") + } + } + try { + xhr.send(null) + }catch(e) { + callback(e.message) + } + } + function read(path, offset, length, callback) { + if(cache.hasOwnProperty(path)) { + callback(null, cache[path].slice(offset, offset + length)); + return + } + var xhr = new XMLHttpRequest; + function handleResult() { + var data; + if(xhr.readyState === 4) { + if(xhr.status === 0 && !xhr.responseText) { + callback("File " + path + " is empty.") + }else { + if(xhr.status === 200 || xhr.status === 0) { + if(typeof VBArray !== "undefined") { + data = (new VBArray(xhr.responseBody)).toArray() + }else { + data = self.byteArrayFromString(xhr.responseText, "binary") + } + cache[path] = data; + callback(null, data.slice(offset, offset + length)) + }else { + callback(xhr.responseText || xhr.statusText) + } + } + } + } + xhr.open("GET", path, true); + xhr.onreadystatechange = handleResult; + if(xhr.overrideMimeType) { + xhr.overrideMimeType("text/plain; charset=x-user-defined") + } + try { + xhr.send(null) + }catch(e) { + callback(e.message) + } + } + function readFileSync(path, encoding) { + var xhr = new XMLHttpRequest, result; + xhr.open("GET", path, false); + if(xhr.overrideMimeType) { + if(encoding !== "binary") { + xhr.overrideMimeType("text/plain; charset=" + encoding) + }else { + xhr.overrideMimeType("text/plain; charset=x-user-defined") + } + } + try { + xhr.send(null); + if(xhr.status === 200 || xhr.status === 0) { + result = xhr.responseText + } + }catch(e) { + } + return result + } + function writeFile(path, data, callback) { + cache[path] = data; + var xhr = new XMLHttpRequest; + function handleResult() { + if(xhr.readyState === 4) { + if(xhr.status === 0 && !xhr.responseText) { + callback("File " + path + " is empty.") + }else { + if(xhr.status >= 200 && xhr.status < 300 || xhr.status === 0) { + callback(null) + }else { + callback("Status " + String(xhr.status) + ": " + xhr.responseText || xhr.statusText) + } + } + } + } + xhr.open("PUT", path, true); + xhr.onreadystatechange = handleResult; + if(data.buffer && !xhr.sendAsBinary) { + data = data.buffer + }else { + data = self.byteArrayToString(data, "binary") + } + try { + if(xhr.sendAsBinary) { + xhr.sendAsBinary(data) + }else { + xhr.send(data) + } + }catch(e) { + self.log("HUH? " + e + " " + data); + callback(e.message) + } + } + function deleteFile(path, callback) { + var xhr = new XMLHttpRequest; + xhr.open("DELETE", path, true); + xhr.onreadystatechange = function() { + if(xhr.readyState === 4) { + if(xhr.status < 200 && xhr.status >= 300) { + callback(xhr.responseText) + }else { + callback(null) + } + } + }; + xhr.send(null) + } + function loadXML(path, callback) { + var xhr = new XMLHttpRequest; + function handleResult() { + if(xhr.readyState === 4) { + if(xhr.status === 0 && !xhr.responseText) { + callback("File " + path + " is empty.") + }else { + if(xhr.status === 200 || xhr.status === 0) { + callback(null, xhr.responseXML) + }else { + callback(xhr.responseText) + } + } + } + } + xhr.open("GET", path, true); + if(xhr.overrideMimeType) { + xhr.overrideMimeType("text/xml") + } + xhr.onreadystatechange = handleResult; + try { + xhr.send(null) + }catch(e) { + callback(e.message) + } + } + function isFile(path, callback) { + self.getFileSize(path, function(size) { + callback(size !== -1) + }) + } + function getFileSize(path, callback) { + var xhr = new XMLHttpRequest; + xhr.open("HEAD", path, true); + xhr.onreadystatechange = function() { + if(xhr.readyState !== 4) { + return + } + var cl = xhr.getResponseHeader("Content-Length"); + if(cl) { + callback(parseInt(cl, 10)) + }else { + callback(-1) + } + }; + xhr.send(null) + } + function wrap(nativeFunction, nargs) { + if(!nativeFunction) { + return null + } + return function() { + cache = {}; + var callback = arguments[nargs], args = Array.prototype.slice.call(arguments, 0, nargs), callbackname = "callback" + String(Math.random()).substring(2); + window[callbackname] = function() { + delete window[callbackname]; + callback.apply(this, arguments) + }; + args.push(callbackname); + nativeFunction.apply(this, args) + } + } + this.readFile = readFile; + this.read = read; + this.readFileSync = readFileSync; + this.writeFile = writeFile; + this.deleteFile = deleteFile; + this.loadXML = loadXML; + this.isFile = isFile; + this.getFileSize = getFileSize; + this.log = log; + this.setTimeout = function(f, msec) { + setTimeout(function() { + f() + }, msec) + }; + this.libraryPaths = function() { + return["lib"] + }; + this.setCurrentDirectory = function(dir) { + }; + this.type = function() { + return"BrowserRuntime" + }; + this.getDOMImplementation = function() { + return window.document.implementation + }; + this.exit = function(exitCode) { + log("Calling exit with code " + String(exitCode) + ", but exit() is not implemented.") + }; + this.getWindow = function() { + return window + } +} +function NodeJSRuntime() { + var self = this, fs = require("fs"), currentDirectory = ""; + this.ByteArray = function(size) { + return new Buffer(size) + }; + this.byteArrayFromArray = function(array) { + var ba = new Buffer(array.length), i, l = array.length; + for(i = 0;i < l;i += 1) { + ba[i] = array[i] + } + return ba + }; + this.concatByteArrays = function(a, b) { + var ba = new Buffer(a.length + b.length); + a.copy(ba, 0, 0); + b.copy(ba, a.length, 0); + return ba + }; + this.byteArrayFromString = function(string, encoding) { + return new Buffer(string, encoding) + }; + this.byteArrayToString = function(bytearray, encoding) { + return bytearray.toString(encoding) + }; + function isFile(path, callback) { + if(currentDirectory) { + path = currentDirectory + "/" + path + } + fs.stat(path, function(err, stats) { + callback(!err && stats.isFile()) + }) + } + function loadXML(path, callback) { + throw"Not implemented."; + } + this.readFile = function(path, encoding, callback) { + if(encoding !== "binary") { + fs.readFile(path, encoding, callback) + }else { + fs.readFile(path, null, callback) + } + }; + this.writeFile = function(path, data, callback) { + fs.writeFile(path, data, "binary", function(err) { + callback(err || null) + }) + }; + this.deleteFile = fs.unlink; + this.read = function(path, offset, length, callback) { + if(currentDirectory) { + path = currentDirectory + "/" + path + } + fs.open(path, "r+", 666, function(err, fd) { + if(err) { + callback(err); + return + } + var buffer = new Buffer(length); + fs.read(fd, buffer, 0, length, offset, function(err, bytesRead) { + fs.close(fd); + callback(err, buffer) + }) + }) + }; + this.readFileSync = function(path, encoding) { + if(!encoding) { + return"" + } + return fs.readFileSync(path, encoding) + }; + this.loadXML = loadXML; + this.isFile = isFile; + this.getFileSize = function(path, callback) { + if(currentDirectory) { + path = currentDirectory + "/" + path + } + fs.stat(path, function(err, stats) { + if(err) { + callback(-1) + }else { + callback(stats.size) + } + }) + }; + this.log = function(msg) { + process.stderr.write(msg + "\n") + }; + this.setTimeout = function(f, msec) { + setTimeout(function() { + f() + }, msec) + }; + this.libraryPaths = function() { + return[__dirname] + }; + this.setCurrentDirectory = function(dir) { + currentDirectory = dir + }; + this.currentDirectory = function() { + return currentDirectory + }; + this.type = function() { + return"NodeJSRuntime" + }; + this.getDOMImplementation = function() { + return null + }; + this.exit = process.exit; + this.getWindow = function() { + return null + } +} +function RhinoRuntime() { + var self = this, dom = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(), builder, entityresolver, currentDirectory = ""; + dom.setValidating(false); + dom.setNamespaceAware(true); + dom.setExpandEntityReferences(false); + dom.setSchema(null); + entityresolver = Packages.org.xml.sax.EntityResolver({resolveEntity:function(publicId, systemId) { + var file, open = function(path) { + var reader = new Packages.java.io.FileReader(path), source = new Packages.org.xml.sax.InputSource(reader); + return source + }; + file = systemId; + return open(file) + }}); + builder = dom.newDocumentBuilder(); + builder.setEntityResolver(entityresolver); + this.ByteArray = function ByteArray(size) { + return[size] + }; + this.byteArrayFromArray = function(array) { + return array + }; + this.byteArrayFromString = function(string, encoding) { + var a = [], i, l = string.length; + for(i = 0;i < l;i += 1) { + a[i] = string.charCodeAt(i) & 255 + } + return a + }; + this.byteArrayToString = Runtime.byteArrayToString; + this.concatByteArrays = function(bytearray1, bytearray2) { + return bytearray1.concat(bytearray2) + }; + function loadXML(path, callback) { + var file = new Packages.java.io.File(path), document; + try { + document = builder.parse(file) + }catch(err) { + print(err); + callback(err); + return + } + callback(null, document) + } + function runtimeReadFile(path, encoding, callback) { + var file = new Packages.java.io.File(path), data, rhinoencoding = encoding === "binary" ? "latin1" : encoding; + if(!file.isFile()) { + callback(path + " is not a file.") + }else { + data = readFile(path, rhinoencoding); + if(encoding === "binary") { + data = self.byteArrayFromString(data, "binary") + } + callback(null, data) + } + } + function runtimeReadFileSync(path, encoding) { + var file = new Packages.java.io.File(path), data, i; + if(!file.isFile()) { + return null + } + if(encoding === "binary") { + encoding = "latin1" + } + return readFile(path, encoding) + } + function isFile(path, callback) { + if(currentDirectory) { + path = currentDirectory + "/" + path + } + var file = new Packages.java.io.File(path); + callback(file.isFile()) + } + this.loadXML = loadXML; + this.readFile = runtimeReadFile; + this.writeFile = function(path, data, callback) { + var out = new Packages.java.io.FileOutputStream(path), i, l = data.length; + for(i = 0;i < l;i += 1) { + out.write(data[i]) + } + out.close(); + callback(null) + }; + this.deleteFile = function(path, callback) { + var file = new Packages.java.io.File(path); + if(file["delete"]()) { + callback(null) + }else { + callback("Could not delete " + path) + } + }; + this.read = function(path, offset, length, callback) { + if(currentDirectory) { + path = currentDirectory + "/" + path + } + var data = runtimeReadFileSync(path, "binary"); + if(data) { + callback(null, this.byteArrayFromString(data.substring(offset, offset + length), "binary")) + }else { + callback("Cannot read " + path) + } + }; + this.readFileSync = function(path, encoding) { + if(!encoding) { + return"" + } + return readFile(path, encoding) + }; + this.isFile = isFile; + this.getFileSize = function(path, callback) { + if(currentDirectory) { + path = currentDirectory + "/" + path + } + var file = new Packages.java.io.File(path); + callback(file.length()) + }; + this.log = print; + this.setTimeout = function(f, msec) { + f() + }; + this.libraryPaths = function() { + return["lib"] + }; + this.setCurrentDirectory = function(dir) { + currentDirectory = dir + }; + this.currentDirectory = function() { + return currentDirectory + }; + this.type = function() { + return"RhinoRuntime" + }; + this.getDOMImplementation = function() { + return builder.getDOMImplementation() + }; + this.exit = quit; + this.getWindow = function() { + return null + } +} +var runtime = function() { + var result; + if(typeof window !== "undefined") { + result = new BrowserRuntime(window.document.getElementById("logoutput")) + }else { + if(typeof require !== "undefined") { + result = new NodeJSRuntime + }else { + result = new RhinoRuntime + } + } + return result +}(); +(function() { + var cache = {}, dircontents = {}; + function getOrDefinePackage(packageNameComponents) { + var topname = packageNameComponents[0], i, pkg; + pkg = eval("if (typeof " + topname + " === 'undefined') {" + "eval('" + topname + " = {};');}" + topname); + for(i = 1;i < packageNameComponents.length - 1;i += 1) { + if(!pkg.hasOwnProperty(packageNameComponents[i])) { + pkg = pkg[packageNameComponents[i]] = {} + } + } + return pkg[packageNameComponents[packageNameComponents.length - 1]] + } + runtime.loadClass = function(classpath) { + if(IS_COMPILED_CODE) { + return + } + if(cache.hasOwnProperty(classpath)) { + return + } + var names = classpath.split("."), impl; + impl = getOrDefinePackage(names); + if(impl) { + cache[classpath] = true; + return + } + function getPathFromManifests(classpath) { + var path = classpath.replace(".", "/") + ".js", dirs = runtime.libraryPaths(), i, dir, code; + if(runtime.currentDirectory) { + dirs.push(runtime.currentDirectory()) + } + for(i = 0;i < dirs.length;i += 1) { + dir = dirs[i]; + if(!dircontents.hasOwnProperty(dir)) { + code = runtime.readFileSync(dirs[i] + "/manifest.js", "utf8"); + if(code && code.length) { + try { + dircontents[dir] = eval(code) + }catch(e1) { + dircontents[dir] = null; + runtime.log("Cannot load manifest for " + dir + ".") + } + }else { + dircontents[dir] = null + } + } + code = null; + dir = dircontents[dir]; + if(dir && dir.indexOf && dir.indexOf(path) !== -1) { + return dirs[i] + "/" + path + } + } + return null + } + function load(classpath) { + var code, path; + path = getPathFromManifests(classpath); + if(!path) { + throw classpath + " is not listed in any manifest.js."; + } + try { + code = runtime.readFileSync(path, "utf8") + }catch(e2) { + runtime.log("Error loading " + classpath + " " + e2); + throw e2; + } + if(code === undefined) { + throw"Cannot load class " + classpath; + } + try { + code = eval(classpath + " = eval(code);") + }catch(e4) { + runtime.log("Error loading " + classpath + " " + e4); + throw e4; + } + return code + } + impl = load(classpath); + if(!impl || Runtime.getFunctionName(impl) !== names[names.length - 1]) { + runtime.log("Loaded code is not for " + names[names.length - 1]); + throw"Loaded code is not for " + names[names.length - 1]; + } + cache[classpath] = true + } +})(); +(function(args) { + args = Array.prototype.slice.call(args); + function run(argv) { + if(!argv.length) { + return + } + var script = argv[0]; + runtime.readFile(script, "utf8", function(err, code) { + var path = "", paths = runtime.libraryPaths(); + if(script.indexOf("/") !== -1) { + path = script.substring(0, script.indexOf("/")) + } + runtime.setCurrentDirectory(path); + function run() { + var script, path, paths, args, argv, result; + result = eval(code); + if(result) { + runtime.exit(result) + } + return + } + if(err) { + runtime.log(err); + runtime.exit(1) + }else { + run.apply(null, argv) + } + }) + } + if(runtime.type() === "NodeJSRuntime") { + run(process.argv.slice(2)) + }else { + if(runtime.type() === "RhinoRuntime") { + run(args) + }else { + run(args.slice(1)) + } + } +})(typeof arguments !== "undefined" && arguments); +core.Base64 = function() { + var b64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", b64charcodes = function() { + var a = [], i, codeA = "A".charCodeAt(0), codea = "a".charCodeAt(0), code0 = "0".charCodeAt(0); + for(i = 0;i < 26;i += 1) { + a.push(codeA + i) + } + for(i = 0;i < 26;i += 1) { + a.push(codea + i) + } + for(i = 0;i < 10;i += 1) { + a.push(code0 + i) + } + a.push("+".charCodeAt(0)); + a.push("/".charCodeAt(0)); + return a + }(), b64tab = function(bin) { + var t = {}, i, l; + for(i = 0, l = bin.length;i < l;i += 1) { + t[bin.charAt(i)] = i + } + return t + }(b64chars), convertUTF16StringToBase64, convertBase64ToUTF16String, btoa, atob; + function stringToArray(s) { + var a = [], i, l = s.length; + for(i = 0;i < l;i += 1) { + a[i] = s.charCodeAt(i) & 255 + } + return a + } + function convertUTF8ArrayToBase64(bin) { + var n, b64 = "", i, l = bin.length - 2; + for(i = 0;i < l;i += 3) { + n = bin[i] << 16 | bin[i + 1] << 8 | bin[i + 2]; + b64 += b64chars[n >>> 18]; + b64 += b64chars[n >>> 12 & 63]; + b64 += b64chars[n >>> 6 & 63]; + b64 += b64chars[n & 63] + } + if(i === l + 1) { + n = bin[i] << 4; + b64 += b64chars[n >>> 6]; + b64 += b64chars[n & 63]; + b64 += "==" + }else { + if(i === l) { + n = bin[i] << 10 | bin[i + 1] << 2; + b64 += b64chars[n >>> 12]; + b64 += b64chars[n >>> 6 & 63]; + b64 += b64chars[n & 63]; + b64 += "=" + } + } + return b64 + } + function convertBase64ToUTF8Array(b64) { + b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ""); + var bin = [], padlen = b64.length % 4, i, l = b64.length, n; + for(i = 0;i < l;i += 4) { + n = (b64tab[b64.charAt(i)] || 0) << 18 | (b64tab[b64.charAt(i + 1)] || 0) << 12 | (b64tab[b64.charAt(i + 2)] || 0) << 6 | (b64tab[b64.charAt(i + 3)] || 0); + bin.push(n >> 16, n >> 8 & 255, n & 255) + } + bin.length -= [0, 0, 2, 1][padlen]; + return bin + } + function convertUTF16ArrayToUTF8Array(uni) { + var bin = [], i, l = uni.length, n; + for(i = 0;i < l;i += 1) { + n = uni[i]; + if(n < 128) { + bin.push(n) + }else { + if(n < 2048) { + bin.push(192 | n >>> 6, 128 | n & 63) + }else { + bin.push(224 | n >>> 12 & 15, 128 | n >>> 6 & 63, 128 | n & 63) + } + } + } + return bin + } + function convertUTF8ArrayToUTF16Array(bin) { + var uni = [], i, l = bin.length, c0, c1, c2; + for(i = 0;i < l;i += 1) { + c0 = bin[i]; + if(c0 < 128) { + uni.push(c0) + }else { + i += 1; + c1 = bin[i]; + if(c0 < 224) { + uni.push((c0 & 31) << 6 | c1 & 63) + }else { + i += 1; + c2 = bin[i]; + uni.push((c0 & 15) << 12 | (c1 & 63) << 6 | c2 & 63) + } + } + } + return uni + } + function convertUTF8StringToBase64(bin) { + return convertUTF8ArrayToBase64(stringToArray(bin)) + } + function convertBase64ToUTF8String(b64) { + return String.fromCharCode.apply(String, convertBase64ToUTF8Array(b64)) + } + function convertUTF8StringToUTF16Array(bin) { + return convertUTF8ArrayToUTF16Array(stringToArray(bin)) + } + function convertUTF8ArrayToUTF16String(bin) { + var b = convertUTF8ArrayToUTF16Array(bin), r = "", i = 0, chunksize = 45E3; + while(i < b.length) { + r += String.fromCharCode.apply(String, b.slice(i, i + chunksize)); + i += chunksize + } + return r + } + function convertUTF8StringToUTF16String_internal(bin, i, end) { + var str = "", c0, c1, c2, j; + for(j = i;j < end;j += 1) { + c0 = bin.charCodeAt(j) & 255; + if(c0 < 128) { + str += String.fromCharCode(c0) + }else { + j += 1; + c1 = bin.charCodeAt(j) & 255; + if(c0 < 224) { + str += String.fromCharCode((c0 & 31) << 6 | c1 & 63) + }else { + j += 1; + c2 = bin.charCodeAt(j) & 255; + str += String.fromCharCode((c0 & 15) << 12 | (c1 & 63) << 6 | c2 & 63) + } + } + } + return str + } + function convertUTF8StringToUTF16String(bin, callback) { + var partsize = 1E5, numparts = bin.length / partsize, str = "", pos = 0; + if(bin.length < partsize) { + callback(convertUTF8StringToUTF16String_internal(bin, 0, bin.length), true); + return + } + if(typeof bin !== "string") { + bin = bin.slice() + } + function f() { + var end = pos + partsize; + if(end > bin.length) { + end = bin.length + } + str += convertUTF8StringToUTF16String_internal(bin, pos, end); + pos = end; + end = pos === bin.length; + if(callback(str, end) && !end) { + runtime.setTimeout(f, 0) + } + } + f() + } + function convertUTF16StringToUTF8Array(uni) { + return convertUTF16ArrayToUTF8Array(stringToArray(uni)) + } + function convertUTF16ArrayToUTF8String(uni) { + return String.fromCharCode.apply(String, convertUTF16ArrayToUTF8Array(uni)) + } + function convertUTF16StringToUTF8String(uni) { + return String.fromCharCode.apply(String, convertUTF16ArrayToUTF8Array(stringToArray(uni))) + } + btoa = runtime.getWindow() && runtime.getWindow().btoa; + if(btoa) { + convertUTF16StringToBase64 = function(uni) { + return btoa(convertUTF16StringToUTF8String(uni)) + } + }else { + btoa = convertUTF8StringToBase64; + convertUTF16StringToBase64 = function(uni) { + return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)) + } + } + atob = runtime.getWindow() && runtime.getWindow().atob; + if(atob) { + convertBase64ToUTF16String = function(b64) { + var b = atob(b64); + return convertUTF8StringToUTF16String_internal(b, 0, b.length) + } + }else { + atob = convertBase64ToUTF8String; + convertBase64ToUTF16String = function(b64) { + return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)) + } + } + function Base64() { + this.convertUTF8ArrayToBase64 = convertUTF8ArrayToBase64; + this.convertByteArrayToBase64 = convertUTF8ArrayToBase64; + this.convertBase64ToUTF8Array = convertBase64ToUTF8Array; + this.convertBase64ToByteArray = convertBase64ToUTF8Array; + this.convertUTF16ArrayToUTF8Array = convertUTF16ArrayToUTF8Array; + this.convertUTF16ArrayToByteArray = convertUTF16ArrayToUTF8Array; + this.convertUTF8ArrayToUTF16Array = convertUTF8ArrayToUTF16Array; + this.convertByteArrayToUTF16Array = convertUTF8ArrayToUTF16Array; + this.convertUTF8StringToBase64 = convertUTF8StringToBase64; + this.convertBase64ToUTF8String = convertBase64ToUTF8String; + this.convertUTF8StringToUTF16Array = convertUTF8StringToUTF16Array; + this.convertUTF8ArrayToUTF16String = convertUTF8ArrayToUTF16String; + this.convertByteArrayToUTF16String = convertUTF8ArrayToUTF16String; + this.convertUTF8StringToUTF16String = convertUTF8StringToUTF16String; + this.convertUTF16StringToUTF8Array = convertUTF16StringToUTF8Array; + this.convertUTF16StringToByteArray = convertUTF16StringToUTF8Array; + this.convertUTF16ArrayToUTF8String = convertUTF16ArrayToUTF8String; + this.convertUTF16StringToUTF8String = convertUTF16StringToUTF8String; + this.convertUTF16StringToBase64 = convertUTF16StringToBase64; + this.convertBase64ToUTF16String = convertBase64ToUTF16String; + this.fromBase64 = convertBase64ToUTF8String; + this.toBase64 = convertUTF8StringToBase64; + this.atob = atob; + this.btoa = btoa; + this.utob = convertUTF16StringToUTF8String; + this.btou = convertUTF8StringToUTF16String; + this.encode = convertUTF16StringToBase64; + this.encodeURI = function(u) { + return convertUTF16StringToBase64(u).replace(/[+\/]/g, function(m0) { + return m0 === "+" ? "-" : "_" + }).replace(/\\=+$/, "") + }; + this.decode = function(a) { + return convertBase64ToUTF16String(a.replace(/[\-_]/g, function(m0) { + return m0 === "-" ? "+" : "/" + })) + } + } + return Base64 +}(); +core.RawDeflate = function() { + var zip_WSIZE = 32768, zip_STORED_BLOCK = 0, zip_STATIC_TREES = 1, zip_DYN_TREES = 2, zip_DEFAULT_LEVEL = 6, zip_FULL_SEARCH = true, zip_INBUFSIZ = 32768, zip_INBUF_EXTRA = 64, zip_OUTBUFSIZ = 1024 * 8, zip_window_size = 2 * zip_WSIZE, zip_MIN_MATCH = 3, zip_MAX_MATCH = 258, zip_BITS = 16, zip_LIT_BUFSIZE = 8192, zip_HASH_BITS = 13, zip_DIST_BUFSIZE = zip_LIT_BUFSIZE, zip_HASH_SIZE = 1 << zip_HASH_BITS, zip_HASH_MASK = zip_HASH_SIZE - 1, zip_WMASK = zip_WSIZE - 1, zip_NIL = 0, zip_TOO_FAR = 4096, + zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1, zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD, zip_SMALLEST = 1, zip_MAX_BITS = 15, zip_MAX_BL_BITS = 7, zip_LENGTH_CODES = 29, zip_LITERALS = 256, zip_END_BLOCK = 256, zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES, zip_D_CODES = 30, zip_BL_CODES = 19, zip_REP_3_6 = 16, zip_REPZ_3_10 = 17, zip_REPZ_11_138 = 18, zip_HEAP_SIZE = 2 * zip_L_CODES + 1, zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / zip_MIN_MATCH, 10), zip_free_queue, + zip_qhead, zip_qtail, zip_initflag, zip_outbuf = null, zip_outcnt, zip_outoff, zip_complete, zip_window, zip_d_buf, zip_l_buf, zip_prev, zip_bi_buf, zip_bi_valid, zip_block_start, zip_ins_h, zip_hash_head, zip_prev_match, zip_match_available, zip_match_length, zip_prev_length, zip_strstart, zip_match_start, zip_eofile, zip_lookahead, zip_max_chain_length, zip_max_lazy_match, zip_compr_level, zip_good_match, zip_nice_match, zip_dyn_ltree, zip_dyn_dtree, zip_static_ltree, zip_static_dtree, zip_bl_tree, + zip_l_desc, zip_d_desc, zip_bl_desc, zip_bl_count, zip_heap, zip_heap_len, zip_heap_max, zip_depth, zip_length_code, zip_dist_code, zip_base_length, zip_base_dist, zip_flag_buf, zip_last_lit, zip_last_dist, zip_last_flags, zip_flags, zip_flag_bit, zip_opt_len, zip_static_len, zip_deflate_data, zip_deflate_pos, zip_extra_lbits = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], zip_extra_dbits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, + 9, 10, 10, 11, 11, 12, 12, 13, 13], zip_extra_blbits = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], zip_configuration_table; + if(zip_LIT_BUFSIZE > zip_INBUFSIZ) { + runtime.log("error: zip_INBUFSIZ is too small") + } + if(zip_WSIZE << 1 > 1 << zip_BITS) { + runtime.log("error: zip_WSIZE is too large") + } + if(zip_HASH_BITS > zip_BITS - 1) { + runtime.log("error: zip_HASH_BITS is too large") + } + if(zip_HASH_BITS < 8 || zip_MAX_MATCH !== 258) { + runtime.log("error: Code too clever") + } + function Zip_DeflateCT() { + this.fc = 0; + this.dl = 0 + } + function Zip_DeflateTreeDesc() { + this.dyn_tree = null; + this.static_tree = null; + this.extra_bits = null; + this.extra_base = 0; + this.elems = 0; + this.max_length = 0; + this.max_code = 0 + } + function Zip_DeflateConfiguration(a, b, c, d) { + this.good_length = a; + this.max_lazy = b; + this.nice_length = c; + this.max_chain = d + } + function Zip_DeflateBuffer() { + this.next = null; + this.len = 0; + this.ptr = []; + this.ptr.length = zip_OUTBUFSIZ; + this.off = 0 + } + zip_configuration_table = [new Zip_DeflateConfiguration(0, 0, 0, 0), new Zip_DeflateConfiguration(4, 4, 8, 4), new Zip_DeflateConfiguration(4, 5, 16, 8), new Zip_DeflateConfiguration(4, 6, 32, 32), new Zip_DeflateConfiguration(4, 4, 16, 16), new Zip_DeflateConfiguration(8, 16, 32, 32), new Zip_DeflateConfiguration(8, 16, 128, 128), new Zip_DeflateConfiguration(8, 32, 128, 256), new Zip_DeflateConfiguration(32, 128, 258, 1024), new Zip_DeflateConfiguration(32, 258, 258, 4096)]; + function zip_deflate_start(level) { + var i; + if(!level) { + level = zip_DEFAULT_LEVEL + }else { + if(level < 1) { + level = 1 + }else { + if(level > 9) { + level = 9 + } + } + } + zip_compr_level = level; + zip_initflag = false; + zip_eofile = false; + if(zip_outbuf !== null) { + return + } + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = []; + zip_outbuf.length = zip_OUTBUFSIZ; + zip_window = []; + zip_window.length = zip_window_size; + zip_d_buf = []; + zip_d_buf.length = zip_DIST_BUFSIZE; + zip_l_buf = []; + zip_l_buf.length = zip_INBUFSIZ + zip_INBUF_EXTRA; + zip_prev = []; + zip_prev.length = 1 << zip_BITS; + zip_dyn_ltree = []; + zip_dyn_ltree.length = zip_HEAP_SIZE; + for(i = 0;i < zip_HEAP_SIZE;i++) { + zip_dyn_ltree[i] = new Zip_DeflateCT + } + zip_dyn_dtree = []; + zip_dyn_dtree.length = 2 * zip_D_CODES + 1; + for(i = 0;i < 2 * zip_D_CODES + 1;i++) { + zip_dyn_dtree[i] = new Zip_DeflateCT + } + zip_static_ltree = []; + zip_static_ltree.length = zip_L_CODES + 2; + for(i = 0;i < zip_L_CODES + 2;i++) { + zip_static_ltree[i] = new Zip_DeflateCT + } + zip_static_dtree = []; + zip_static_dtree.length = zip_D_CODES; + for(i = 0;i < zip_D_CODES;i++) { + zip_static_dtree[i] = new Zip_DeflateCT + } + zip_bl_tree = []; + zip_bl_tree.length = 2 * zip_BL_CODES + 1; + for(i = 0;i < 2 * zip_BL_CODES + 1;i++) { + zip_bl_tree[i] = new Zip_DeflateCT + } + zip_l_desc = new Zip_DeflateTreeDesc; + zip_d_desc = new Zip_DeflateTreeDesc; + zip_bl_desc = new Zip_DeflateTreeDesc; + zip_bl_count = []; + zip_bl_count.length = zip_MAX_BITS + 1; + zip_heap = []; + zip_heap.length = 2 * zip_L_CODES + 1; + zip_depth = []; + zip_depth.length = 2 * zip_L_CODES + 1; + zip_length_code = []; + zip_length_code.length = zip_MAX_MATCH - zip_MIN_MATCH + 1; + zip_dist_code = []; + zip_dist_code.length = 512; + zip_base_length = []; + zip_base_length.length = zip_LENGTH_CODES; + zip_base_dist = []; + zip_base_dist.length = zip_D_CODES; + zip_flag_buf = []; + zip_flag_buf.length = parseInt(zip_LIT_BUFSIZE / 8, 10) + } + var zip_deflate_end = function() { + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = null; + zip_window = null; + zip_d_buf = null; + zip_l_buf = null; + zip_prev = null; + zip_dyn_ltree = null; + zip_dyn_dtree = null; + zip_static_ltree = null; + zip_static_dtree = null; + zip_bl_tree = null; + zip_l_desc = null; + zip_d_desc = null; + zip_bl_desc = null; + zip_bl_count = null; + zip_heap = null; + zip_depth = null; + zip_length_code = null; + zip_dist_code = null; + zip_base_length = null; + zip_base_dist = null; + zip_flag_buf = null + }; + var zip_reuse_queue = function(p) { + p.next = zip_free_queue; + zip_free_queue = p + }; + var zip_new_queue = function() { + var p; + if(zip_free_queue !== null) { + p = zip_free_queue; + zip_free_queue = zip_free_queue.next + }else { + p = new Zip_DeflateBuffer + } + p.next = null; + p.len = p.off = 0; + return p + }; + var zip_head1 = function(i) { + return zip_prev[zip_WSIZE + i] + }; + var zip_head2 = function(i, val) { + zip_prev[zip_WSIZE + i] = val; + return val + }; + var zip_qoutbuf = function() { + var q, i; + if(zip_outcnt !== 0) { + q = zip_new_queue(); + if(zip_qhead === null) { + zip_qhead = zip_qtail = q + }else { + zip_qtail = zip_qtail.next = q + } + q.len = zip_outcnt - zip_outoff; + for(i = 0;i < q.len;i++) { + q.ptr[i] = zip_outbuf[zip_outoff + i] + } + zip_outcnt = zip_outoff = 0 + } + }; + var zip_put_byte = function(c) { + zip_outbuf[zip_outoff + zip_outcnt++] = c; + if(zip_outoff + zip_outcnt === zip_OUTBUFSIZ) { + zip_qoutbuf() + } + }; + var zip_put_short = function(w) { + w &= 65535; + if(zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { + zip_outbuf[zip_outoff + zip_outcnt++] = w & 255; + zip_outbuf[zip_outoff + zip_outcnt++] = w >>> 8 + }else { + zip_put_byte(w & 255); + zip_put_byte(w >>> 8) + } + }; + var zip_INSERT_STRING = function() { + zip_ins_h = (zip_ins_h << zip_H_SHIFT ^ zip_window[zip_strstart + zip_MIN_MATCH - 1] & 255) & zip_HASH_MASK; + zip_hash_head = zip_head1(zip_ins_h); + zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; + zip_head2(zip_ins_h, zip_strstart) + }; + var zip_Buf_size = 16; + var zip_send_bits = function(value, length) { + if(zip_bi_valid > zip_Buf_size - length) { + zip_bi_buf |= value << zip_bi_valid; + zip_put_short(zip_bi_buf); + zip_bi_buf = value >> zip_Buf_size - zip_bi_valid; + zip_bi_valid += length - zip_Buf_size + }else { + zip_bi_buf |= value << zip_bi_valid; + zip_bi_valid += length + } + }; + var zip_SEND_CODE = function(c, tree) { + zip_send_bits(tree[c].fc, tree[c].dl) + }; + var zip_D_CODE = function(dist) { + return(dist < 256 ? zip_dist_code[dist] : zip_dist_code[256 + (dist >> 7)]) & 255 + }; + var zip_SMALLER = function(tree, n, m) { + return tree[n].fc < tree[m].fc || tree[n].fc === tree[m].fc && zip_depth[n] <= zip_depth[m] + }; + var zip_read_buff = function(buff, offset, n) { + var i; + for(i = 0;i < n && zip_deflate_pos < zip_deflate_data.length;i++) { + buff[offset + i] = zip_deflate_data.charCodeAt(zip_deflate_pos++) & 255 + } + return i + }; + var zip_fill_window = function() { + var n, m; + var more = zip_window_size - zip_lookahead - zip_strstart; + if(more === -1) { + more-- + }else { + if(zip_strstart >= zip_WSIZE + zip_MAX_DIST) { + for(n = 0;n < zip_WSIZE;n++) { + zip_window[n] = zip_window[n + zip_WSIZE] + } + zip_match_start -= zip_WSIZE; + zip_strstart -= zip_WSIZE; + zip_block_start -= zip_WSIZE; + for(n = 0;n < zip_HASH_SIZE;n++) { + m = zip_head1(n); + zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL) + } + for(n = 0;n < zip_WSIZE;n++) { + m = zip_prev[n]; + zip_prev[n] = m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL + } + more += zip_WSIZE + } + } + if(!zip_eofile) { + n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); + if(n <= 0) { + zip_eofile = true + }else { + zip_lookahead += n + } + } + }; + var zip_lm_init = function() { + var j; + for(j = 0;j < zip_HASH_SIZE;j++) { + zip_prev[zip_WSIZE + j] = 0 + } + zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; + zip_good_match = zip_configuration_table[zip_compr_level].good_length; + if(!zip_FULL_SEARCH) { + zip_nice_match = zip_configuration_table[zip_compr_level].nice_length + } + zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; + zip_strstart = 0; + zip_block_start = 0; + zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); + if(zip_lookahead <= 0) { + zip_eofile = true; + zip_lookahead = 0; + return + } + zip_eofile = false; + while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { + zip_fill_window() + } + zip_ins_h = 0; + for(j = 0;j < zip_MIN_MATCH - 1;j++) { + zip_ins_h = (zip_ins_h << zip_H_SHIFT ^ zip_window[j] & 255) & zip_HASH_MASK + } + }; + var zip_longest_match = function(cur_match) { + var chain_length = zip_max_chain_length; + var scanp = zip_strstart; + var matchp; + var len; + var best_len = zip_prev_length; + var limit = zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL; + var strendp = zip_strstart + zip_MAX_MATCH; + var scan_end1 = zip_window[scanp + best_len - 1]; + var scan_end = zip_window[scanp + best_len]; + if(zip_prev_length >= zip_good_match) { + chain_length >>= 2 + } + do { + matchp = cur_match; + if(zip_window[matchp + best_len] !== scan_end || zip_window[matchp + best_len - 1] !== scan_end1 || zip_window[matchp] !== zip_window[scanp] || zip_window[++matchp] !== zip_window[scanp + 1]) { + continue + } + scanp += 2; + matchp++; + do { + ++scanp + }while(zip_window[scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && zip_window[++scanp] === zip_window[++matchp] && scanp < strendp); + len = zip_MAX_MATCH - (strendp - scanp); + scanp = strendp - zip_MAX_MATCH; + if(len > best_len) { + zip_match_start = cur_match; + best_len = len; + if(zip_FULL_SEARCH) { + if(len >= zip_MAX_MATCH) { + break + } + }else { + if(len >= zip_nice_match) { + break + } + } + scan_end1 = zip_window[scanp + best_len - 1]; + scan_end = zip_window[scanp + best_len] + } + }while((cur_match = zip_prev[cur_match & zip_WMASK]) > limit && --chain_length !== 0); + return best_len + }; + var zip_ct_tally = function(dist, lc) { + zip_l_buf[zip_last_lit++] = lc; + if(dist === 0) { + zip_dyn_ltree[lc].fc++ + }else { + dist--; + zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; + zip_dyn_dtree[zip_D_CODE(dist)].fc++; + zip_d_buf[zip_last_dist++] = dist; + zip_flags |= zip_flag_bit + } + zip_flag_bit <<= 1; + if((zip_last_lit & 7) === 0) { + zip_flag_buf[zip_last_flags++] = zip_flags; + zip_flags = 0; + zip_flag_bit = 1 + } + if(zip_compr_level > 2 && (zip_last_lit & 4095) === 0) { + var out_length = zip_last_lit * 8; + var in_length = zip_strstart - zip_block_start; + var dcode; + for(dcode = 0;dcode < zip_D_CODES;dcode++) { + out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]) + } + out_length >>= 3; + if(zip_last_dist < parseInt(zip_last_lit / 2, 10) && out_length < parseInt(in_length / 2, 10)) { + return true + } + } + return zip_last_lit === zip_LIT_BUFSIZE - 1 || zip_last_dist === zip_DIST_BUFSIZE + }; + var zip_pqdownheap = function(tree, k) { + var v = zip_heap[k]; + var j = k << 1; + while(j <= zip_heap_len) { + if(j < zip_heap_len && zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) { + j++ + } + if(zip_SMALLER(tree, v, zip_heap[j])) { + break + } + zip_heap[k] = zip_heap[j]; + k = j; + j <<= 1 + } + zip_heap[k] = v + }; + var zip_gen_bitlen = function(desc) { + var tree = desc.dyn_tree; + var extra = desc.extra_bits; + var base = desc.extra_base; + var max_code = desc.max_code; + var max_length = desc.max_length; + var stree = desc.static_tree; + var h; + var n, m; + var bits; + var xbits; + var f; + var overflow = 0; + for(bits = 0;bits <= zip_MAX_BITS;bits++) { + zip_bl_count[bits] = 0 + } + tree[zip_heap[zip_heap_max]].dl = 0; + for(h = zip_heap_max + 1;h < zip_HEAP_SIZE;h++) { + n = zip_heap[h]; + bits = tree[tree[n].dl].dl + 1; + if(bits > max_length) { + bits = max_length; + overflow++ + } + tree[n].dl = bits; + if(n > max_code) { + continue + } + zip_bl_count[bits]++; + xbits = 0; + if(n >= base) { + xbits = extra[n - base] + } + f = tree[n].fc; + zip_opt_len += f * (bits + xbits); + if(stree !== null) { + zip_static_len += f * (stree[n].dl + xbits) + } + } + if(overflow === 0) { + return + } + do { + bits = max_length - 1; + while(zip_bl_count[bits] === 0) { + bits-- + } + zip_bl_count[bits]--; + zip_bl_count[bits + 1] += 2; + zip_bl_count[max_length]--; + overflow -= 2 + }while(overflow > 0); + for(bits = max_length;bits !== 0;bits--) { + n = zip_bl_count[bits]; + while(n !== 0) { + m = zip_heap[--h]; + if(m > max_code) { + continue + } + if(tree[m].dl !== bits) { + zip_opt_len += (bits - tree[m].dl) * tree[m].fc; + tree[m].fc = bits + } + n-- + } + } + }; + var zip_bi_reverse = function(code, len) { + var res = 0; + do { + res |= code & 1; + code >>= 1; + res <<= 1 + }while(--len > 0); + return res >> 1 + }; + var zip_gen_codes = function(tree, max_code) { + var next_code = []; + next_code.length = zip_MAX_BITS + 1; + var code = 0; + var bits; + var n; + for(bits = 1;bits <= zip_MAX_BITS;bits++) { + code = code + zip_bl_count[bits - 1] << 1; + next_code[bits] = code + } + for(n = 0;n <= max_code;n++) { + var len = tree[n].dl; + if(len === 0) { + continue + } + tree[n].fc = zip_bi_reverse(next_code[len]++, len) + } + }; + var zip_build_tree = function(desc) { + var tree = desc.dyn_tree; + var stree = desc.static_tree; + var elems = desc.elems; + var n, m; + var max_code = -1; + var node = elems; + zip_heap_len = 0; + zip_heap_max = zip_HEAP_SIZE; + for(n = 0;n < elems;n++) { + if(tree[n].fc !== 0) { + zip_heap[++zip_heap_len] = max_code = n; + zip_depth[n] = 0 + }else { + tree[n].dl = 0 + } + } + while(zip_heap_len < 2) { + var xnew = zip_heap[++zip_heap_len] = max_code < 2 ? ++max_code : 0; + tree[xnew].fc = 1; + zip_depth[xnew] = 0; + zip_opt_len--; + if(stree !== null) { + zip_static_len -= stree[xnew].dl + } + } + desc.max_code = max_code; + for(n = zip_heap_len >> 1;n >= 1;n--) { + zip_pqdownheap(tree, n) + } + do { + n = zip_heap[zip_SMALLEST]; + zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; + zip_pqdownheap(tree, zip_SMALLEST); + m = zip_heap[zip_SMALLEST]; + zip_heap[--zip_heap_max] = n; + zip_heap[--zip_heap_max] = m; + tree[node].fc = tree[n].fc + tree[m].fc; + if(zip_depth[n] > zip_depth[m] + 1) { + zip_depth[node] = zip_depth[n] + }else { + zip_depth[node] = zip_depth[m] + 1 + } + tree[n].dl = tree[m].dl = node; + zip_heap[zip_SMALLEST] = node++; + zip_pqdownheap(tree, zip_SMALLEST) + }while(zip_heap_len >= 2); + zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; + zip_gen_bitlen(desc); + zip_gen_codes(tree, max_code) + }; + var zip_scan_tree = function(tree, max_code) { + var n; + var prevlen = -1; + var curlen; + var nextlen = tree[0].dl; + var count = 0; + var max_count = 7; + var min_count = 4; + if(nextlen === 0) { + max_count = 138; + min_count = 3 + } + tree[max_code + 1].dl = 65535; + for(n = 0;n <= max_code;n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if(++count < max_count && curlen === nextlen) { + continue + }else { + if(count < min_count) { + zip_bl_tree[curlen].fc += count + }else { + if(curlen !== 0) { + if(curlen !== prevlen) { + zip_bl_tree[curlen].fc++ + } + zip_bl_tree[zip_REP_3_6].fc++ + }else { + if(count <= 10) { + zip_bl_tree[zip_REPZ_3_10].fc++ + }else { + zip_bl_tree[zip_REPZ_11_138].fc++ + } + } + } + } + count = 0; + prevlen = curlen; + if(nextlen === 0) { + max_count = 138; + min_count = 3 + }else { + if(curlen === nextlen) { + max_count = 6; + min_count = 3 + }else { + max_count = 7; + min_count = 4 + } + } + } + }; + var zip_build_bl_tree = function() { + var max_blindex; + zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); + zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); + zip_build_tree(zip_bl_desc); + for(max_blindex = zip_BL_CODES - 1;max_blindex >= 3;max_blindex--) { + if(zip_bl_tree[zip_bl_order[max_blindex]].dl !== 0) { + break + } + } + zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + return max_blindex + }; + var zip_bi_windup = function() { + if(zip_bi_valid > 8) { + zip_put_short(zip_bi_buf) + }else { + if(zip_bi_valid > 0) { + zip_put_byte(zip_bi_buf) + } + } + zip_bi_buf = 0; + zip_bi_valid = 0 + }; + var zip_compress_block = function(ltree, dtree) { + var dist; + var lc; + var lx = 0; + var dx = 0; + var fx = 0; + var flag = 0; + var code; + var extra; + if(zip_last_lit !== 0) { + do { + if((lx & 7) === 0) { + flag = zip_flag_buf[fx++] + } + lc = zip_l_buf[lx++] & 255; + if((flag & 1) === 0) { + zip_SEND_CODE(lc, ltree) + }else { + code = zip_length_code[lc]; + zip_SEND_CODE(code + zip_LITERALS + 1, ltree); + extra = zip_extra_lbits[code]; + if(extra !== 0) { + lc -= zip_base_length[code]; + zip_send_bits(lc, extra) + } + dist = zip_d_buf[dx++]; + code = zip_D_CODE(dist); + zip_SEND_CODE(code, dtree); + extra = zip_extra_dbits[code]; + if(extra !== 0) { + dist -= zip_base_dist[code]; + zip_send_bits(dist, extra) + } + } + flag >>= 1 + }while(lx < zip_last_lit) + } + zip_SEND_CODE(zip_END_BLOCK, ltree) + }; + var zip_send_tree = function(tree, max_code) { + var n; + var prevlen = -1; + var curlen; + var nextlen = tree[0].dl; + var count = 0; + var max_count = 7; + var min_count = 4; + if(nextlen === 0) { + max_count = 138; + min_count = 3 + } + for(n = 0;n <= max_code;n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if(++count < max_count && curlen === nextlen) { + continue + }else { + if(count < min_count) { + do { + zip_SEND_CODE(curlen, zip_bl_tree) + }while(--count !== 0) + }else { + if(curlen !== 0) { + if(curlen !== prevlen) { + zip_SEND_CODE(curlen, zip_bl_tree); + count-- + } + zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); + zip_send_bits(count - 3, 2) + }else { + if(count <= 10) { + zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); + zip_send_bits(count - 3, 3) + }else { + zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); + zip_send_bits(count - 11, 7) + } + } + } + } + count = 0; + prevlen = curlen; + if(nextlen === 0) { + max_count = 138; + min_count = 3 + }else { + if(curlen === nextlen) { + max_count = 6; + min_count = 3 + }else { + max_count = 7; + min_count = 4 + } + } + } + }; + var zip_send_all_trees = function(lcodes, dcodes, blcodes) { + var rank; + zip_send_bits(lcodes - 257, 5); + zip_send_bits(dcodes - 1, 5); + zip_send_bits(blcodes - 4, 4); + for(rank = 0;rank < blcodes;rank++) { + zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3) + } + zip_send_tree(zip_dyn_ltree, lcodes - 1); + zip_send_tree(zip_dyn_dtree, dcodes - 1) + }; + var zip_init_block = function() { + var n; + for(n = 0;n < zip_L_CODES;n++) { + zip_dyn_ltree[n].fc = 0 + } + for(n = 0;n < zip_D_CODES;n++) { + zip_dyn_dtree[n].fc = 0 + } + for(n = 0;n < zip_BL_CODES;n++) { + zip_bl_tree[n].fc = 0 + } + zip_dyn_ltree[zip_END_BLOCK].fc = 1; + zip_opt_len = zip_static_len = 0; + zip_last_lit = zip_last_dist = zip_last_flags = 0; + zip_flags = 0; + zip_flag_bit = 1 + }; + var zip_flush_block = function(eof) { + var opt_lenb, static_lenb; + var max_blindex; + var stored_len; + stored_len = zip_strstart - zip_block_start; + zip_flag_buf[zip_last_flags] = zip_flags; + zip_build_tree(zip_l_desc); + zip_build_tree(zip_d_desc); + max_blindex = zip_build_bl_tree(); + opt_lenb = zip_opt_len + 3 + 7 >> 3; + static_lenb = zip_static_len + 3 + 7 >> 3; + if(static_lenb <= opt_lenb) { + opt_lenb = static_lenb + } + if(stored_len + 4 <= opt_lenb && zip_block_start >= 0) { + var i; + zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); + zip_bi_windup(); + zip_put_short(stored_len); + zip_put_short(~stored_len); + for(i = 0;i < stored_len;i++) { + zip_put_byte(zip_window[zip_block_start + i]) + } + }else { + if(static_lenb === opt_lenb) { + zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); + zip_compress_block(zip_static_ltree, zip_static_dtree) + }else { + zip_send_bits((zip_DYN_TREES << 1) + eof, 3); + zip_send_all_trees(zip_l_desc.max_code + 1, zip_d_desc.max_code + 1, max_blindex + 1); + zip_compress_block(zip_dyn_ltree, zip_dyn_dtree) + } + } + zip_init_block(); + if(eof !== 0) { + zip_bi_windup() + } + }; + var zip_deflate_fast = function() { + while(zip_lookahead !== 0 && zip_qhead === null) { + var flush; + zip_INSERT_STRING(); + if(zip_hash_head !== zip_NIL && zip_strstart - zip_hash_head <= zip_MAX_DIST) { + zip_match_length = zip_longest_match(zip_hash_head); + if(zip_match_length > zip_lookahead) { + zip_match_length = zip_lookahead + } + } + if(zip_match_length >= zip_MIN_MATCH) { + flush = zip_ct_tally(zip_strstart - zip_match_start, zip_match_length - zip_MIN_MATCH); + zip_lookahead -= zip_match_length; + if(zip_match_length <= zip_max_lazy_match) { + zip_match_length--; + do { + zip_strstart++; + zip_INSERT_STRING() + }while(--zip_match_length !== 0); + zip_strstart++ + }else { + zip_strstart += zip_match_length; + zip_match_length = 0; + zip_ins_h = zip_window[zip_strstart] & 255; + zip_ins_h = (zip_ins_h << zip_H_SHIFT ^ zip_window[zip_strstart + 1] & 255) & zip_HASH_MASK + } + }else { + flush = zip_ct_tally(0, zip_window[zip_strstart] & 255); + zip_lookahead--; + zip_strstart++ + } + if(flush) { + zip_flush_block(0); + zip_block_start = zip_strstart + } + while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { + zip_fill_window() + } + } + }; + var zip_deflate_better = function() { + while(zip_lookahead !== 0 && zip_qhead === null) { + zip_INSERT_STRING(); + zip_prev_length = zip_match_length; + zip_prev_match = zip_match_start; + zip_match_length = zip_MIN_MATCH - 1; + if(zip_hash_head !== zip_NIL && zip_prev_length < zip_max_lazy_match && zip_strstart - zip_hash_head <= zip_MAX_DIST) { + zip_match_length = zip_longest_match(zip_hash_head); + if(zip_match_length > zip_lookahead) { + zip_match_length = zip_lookahead + } + if(zip_match_length === zip_MIN_MATCH && zip_strstart - zip_match_start > zip_TOO_FAR) { + zip_match_length-- + } + } + if(zip_prev_length >= zip_MIN_MATCH && zip_match_length <= zip_prev_length) { + var flush; + flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, zip_prev_length - zip_MIN_MATCH); + zip_lookahead -= zip_prev_length - 1; + zip_prev_length -= 2; + do { + zip_strstart++; + zip_INSERT_STRING() + }while(--zip_prev_length !== 0); + zip_match_available = 0; + zip_match_length = zip_MIN_MATCH - 1; + zip_strstart++; + if(flush) { + zip_flush_block(0); + zip_block_start = zip_strstart + } + }else { + if(zip_match_available !== 0) { + if(zip_ct_tally(0, zip_window[zip_strstart - 1] & 255)) { + zip_flush_block(0); + zip_block_start = zip_strstart + } + zip_strstart++; + zip_lookahead-- + }else { + zip_match_available = 1; + zip_strstart++; + zip_lookahead-- + } + } + while(zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { + zip_fill_window() + } + } + }; + var zip_ct_init = function() { + var n; + var bits; + var length; + var code; + var dist; + if(zip_static_dtree[0].dl !== 0) { + return + } + zip_l_desc.dyn_tree = zip_dyn_ltree; + zip_l_desc.static_tree = zip_static_ltree; + zip_l_desc.extra_bits = zip_extra_lbits; + zip_l_desc.extra_base = zip_LITERALS + 1; + zip_l_desc.elems = zip_L_CODES; + zip_l_desc.max_length = zip_MAX_BITS; + zip_l_desc.max_code = 0; + zip_d_desc.dyn_tree = zip_dyn_dtree; + zip_d_desc.static_tree = zip_static_dtree; + zip_d_desc.extra_bits = zip_extra_dbits; + zip_d_desc.extra_base = 0; + zip_d_desc.elems = zip_D_CODES; + zip_d_desc.max_length = zip_MAX_BITS; + zip_d_desc.max_code = 0; + zip_bl_desc.dyn_tree = zip_bl_tree; + zip_bl_desc.static_tree = null; + zip_bl_desc.extra_bits = zip_extra_blbits; + zip_bl_desc.extra_base = 0; + zip_bl_desc.elems = zip_BL_CODES; + zip_bl_desc.max_length = zip_MAX_BL_BITS; + zip_bl_desc.max_code = 0; + length = 0; + for(code = 0;code < zip_LENGTH_CODES - 1;code++) { + zip_base_length[code] = length; + for(n = 0;n < 1 << zip_extra_lbits[code];n++) { + zip_length_code[length++] = code + } + } + zip_length_code[length - 1] = code; + dist = 0; + for(code = 0;code < 16;code++) { + zip_base_dist[code] = dist; + for(n = 0;n < 1 << zip_extra_dbits[code];n++) { + zip_dist_code[dist++] = code + } + } + dist >>= 7; + n = code; + for(code = n;code < zip_D_CODES;code++) { + zip_base_dist[code] = dist << 7; + for(n = 0;n < 1 << zip_extra_dbits[code] - 7;n++) { + zip_dist_code[256 + dist++] = code + } + } + for(bits = 0;bits <= zip_MAX_BITS;bits++) { + zip_bl_count[bits] = 0 + } + n = 0; + while(n <= 143) { + zip_static_ltree[n++].dl = 8; + zip_bl_count[8]++ + } + while(n <= 255) { + zip_static_ltree[n++].dl = 9; + zip_bl_count[9]++ + } + while(n <= 279) { + zip_static_ltree[n++].dl = 7; + zip_bl_count[7]++ + } + while(n <= 287) { + zip_static_ltree[n++].dl = 8; + zip_bl_count[8]++ + } + zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); + for(n = 0;n < zip_D_CODES;n++) { + zip_static_dtree[n].dl = 5; + zip_static_dtree[n].fc = zip_bi_reverse(n, 5) + } + zip_init_block() + }; + var zip_init_deflate = function() { + if(zip_eofile) { + return + } + zip_bi_buf = 0; + zip_bi_valid = 0; + zip_ct_init(); + zip_lm_init(); + zip_qhead = null; + zip_outcnt = 0; + zip_outoff = 0; + if(zip_compr_level <= 3) { + zip_prev_length = zip_MIN_MATCH - 1; + zip_match_length = 0 + }else { + zip_match_length = zip_MIN_MATCH - 1; + zip_match_available = 0 + } + zip_complete = false + }; + var zip_qcopy = function(buff, off, buff_size) { + var n, i, j; + n = 0; + while(zip_qhead !== null && n < buff_size) { + i = buff_size - n; + if(i > zip_qhead.len) { + i = zip_qhead.len + } + for(j = 0;j < i;j++) { + buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j] + } + zip_qhead.off += i; + zip_qhead.len -= i; + n += i; + if(zip_qhead.len === 0) { + var p; + p = zip_qhead; + zip_qhead = zip_qhead.next; + zip_reuse_queue(p) + } + } + if(n === buff_size) { + return n + } + if(zip_outoff < zip_outcnt) { + i = buff_size - n; + if(i > zip_outcnt - zip_outoff) { + i = zip_outcnt - zip_outoff + } + for(j = 0;j < i;j++) { + buff[off + n + j] = zip_outbuf[zip_outoff + j] + } + zip_outoff += i; + n += i; + if(zip_outcnt === zip_outoff) { + zip_outcnt = zip_outoff = 0 + } + } + return n + }; + var zip_deflate_internal = function(buff, off, buff_size) { + var n; + if(!zip_initflag) { + zip_init_deflate(); + zip_initflag = true; + if(zip_lookahead === 0) { + zip_complete = true; + return 0 + } + } + if((n = zip_qcopy(buff, off, buff_size)) === buff_size) { + return buff_size + } + if(zip_complete) { + return n + } + if(zip_compr_level <= 3) { + zip_deflate_fast() + }else { + zip_deflate_better() + } + if(zip_lookahead === 0) { + if(zip_match_available !== 0) { + zip_ct_tally(0, zip_window[zip_strstart - 1] & 255) + } + zip_flush_block(1); + zip_complete = true + } + return n + zip_qcopy(buff, n + off, buff_size - n) + }; + var zip_deflate = function(str, level) { + var i, j; + zip_deflate_data = str; + zip_deflate_pos = 0; + if(typeof level === "undefined") { + level = zip_DEFAULT_LEVEL + } + zip_deflate_start(level); + var buff = new Array(1024); + var aout = []; + while((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { + var cbuf = []; + cbuf.length = i; + for(j = 0;j < i;j++) { + cbuf[j] = String.fromCharCode(buff[j]) + } + aout[aout.length] = cbuf.join("") + } + zip_deflate_data = null; + return aout.join("") + }; + this.deflate = zip_deflate +}; +core.ByteArray = function ByteArray(data) { + this.pos = 0; + this.data = data; + this.readUInt32LE = function() { + var data = this.data, pos = this.pos += 4; + return data[--pos] << 24 | data[--pos] << 16 | data[--pos] << 8 | data[--pos] + }; + this.readUInt16LE = function() { + var data = this.data, pos = this.pos += 2; + return data[--pos] << 8 | data[--pos] + } +}; +core.ByteArrayWriter = function ByteArrayWriter(encoding) { + var self = this, data = new runtime.ByteArray(0); + this.appendByteArrayWriter = function(writer) { + data = runtime.concatByteArrays(data, writer.getByteArray()) + }; + this.appendByteArray = function(array) { + data = runtime.concatByteArrays(data, array) + }; + this.appendArray = function(array) { + data = runtime.concatByteArrays(data, runtime.byteArrayFromArray(array)) + }; + this.appendUInt16LE = function(value) { + self.appendArray([value & 255, value >> 8 & 255]) + }; + this.appendUInt32LE = function(value) { + self.appendArray([value & 255, value >> 8 & 255, value >> 16 & 255, value >> 24 & 255]) + }; + this.appendString = function(string) { + data = runtime.concatByteArrays(data, runtime.byteArrayFromString(string, encoding)) + }; + this.getLength = function() { + return data.length + }; + this.getByteArray = function() { + return data + } +}; +core.RawInflate = function RawInflate() { + var zip_WSIZE = 32768; + var zip_STORED_BLOCK = 0; + var zip_STATIC_TREES = 1; + var zip_DYN_TREES = 2; + var zip_lbits = 9; + var zip_dbits = 6; + var zip_INBUFSIZ = 32768; + var zip_INBUF_EXTRA = 64; + var zip_slide; + var zip_wp; + var zip_fixed_tl = null; + var zip_fixed_td; + var zip_fixed_bl, fixed_bd; + var zip_bit_buf; + var zip_bit_len; + var zip_method; + var zip_eof; + var zip_copy_leng; + var zip_copy_dist; + var zip_tl, zip_td; + var zip_bl, zip_bd; + var zip_inflate_data; + var zip_inflate_pos; + var zip_MASK_BITS = new Array(0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535); + var zip_cplens = new Array(3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0); + var zip_cplext = new Array(0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); + var zip_cpdist = new Array(1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577); + var zip_cpdext = new Array(0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13); + var zip_border = new Array(16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); + var zip_HuftList = function() { + this.next = null; + this.list = null + }; + var zip_HuftNode = function() { + this.e = 0; + this.b = 0; + this.n = 0; + this.t = null + }; + var zip_HuftBuild = function(b, n, s, d, e, mm) { + this.BMAX = 16; + this.N_MAX = 288; + this.status = 0; + this.root = null; + this.m = 0; + var a; + var c = new Array(this.BMAX + 1); + var el; + var f; + var g; + var h; + var i; + var j; + var k; + var lx = new Array(this.BMAX + 1); + var p; + var pidx; + var q; + var r = new zip_HuftNode; + var u = new Array(this.BMAX); + var v = new Array(this.N_MAX); + var w; + var x = new Array(this.BMAX + 1); + var xp; + var y; + var z; + var o; + var tail; + tail = this.root = null; + for(i = 0;i < c.length;i++) { + c[i] = 0 + } + for(i = 0;i < lx.length;i++) { + lx[i] = 0 + } + for(i = 0;i < u.length;i++) { + u[i] = null + } + for(i = 0;i < v.length;i++) { + v[i] = 0 + } + for(i = 0;i < x.length;i++) { + x[i] = 0 + } + el = n > 256 ? b[256] : this.BMAX; + p = b; + pidx = 0; + i = n; + do { + c[p[pidx]]++; + pidx++ + }while(--i > 0); + if(c[0] == n) { + this.root = null; + this.m = 0; + this.status = 0; + return + } + for(j = 1;j <= this.BMAX;j++) { + if(c[j] != 0) { + break + } + } + k = j; + if(mm < j) { + mm = j + } + for(i = this.BMAX;i != 0;i--) { + if(c[i] != 0) { + break + } + } + g = i; + if(mm > i) { + mm = i + } + for(y = 1 << j;j < i;j++, y <<= 1) { + if((y -= c[j]) < 0) { + this.status = 2; + this.m = mm; + return + } + } + if((y -= c[i]) < 0) { + this.status = 2; + this.m = mm; + return + } + c[i] += y; + x[1] = j = 0; + p = c; + pidx = 1; + xp = 2; + while(--i > 0) { + x[xp++] = j += p[pidx++] + } + p = b; + pidx = 0; + i = 0; + do { + if((j = p[pidx++]) != 0) { + v[x[j]++] = i + } + }while(++i < n); + n = x[g]; + x[0] = i = 0; + p = v; + pidx = 0; + h = -1; + w = lx[0] = 0; + q = null; + z = 0; + for(;k <= g;k++) { + a = c[k]; + while(a-- > 0) { + while(k > w + lx[1 + h]) { + w += lx[1 + h]; + h++; + z = (z = g - w) > mm ? mm : z; + if((f = 1 << (j = k - w)) > a + 1) { + f -= a + 1; + xp = k; + while(++j < z) { + if((f <<= 1) <= c[++xp]) { + break + } + f -= c[xp] + } + } + if(w + j > el && w < el) { + j = el - w + } + z = 1 << j; + lx[1 + h] = j; + q = new Array(z); + for(o = 0;o < z;o++) { + q[o] = new zip_HuftNode + } + if(tail == null) { + tail = this.root = new zip_HuftList + }else { + tail = tail.next = new zip_HuftList + } + tail.next = null; + tail.list = q; + u[h] = q; + if(h > 0) { + x[h] = i; + r.b = lx[h]; + r.e = 16 + j; + r.t = q; + j = (i & (1 << w) - 1) >> w - lx[h]; + u[h - 1][j].e = r.e; + u[h - 1][j].b = r.b; + u[h - 1][j].n = r.n; + u[h - 1][j].t = r.t + } + } + r.b = k - w; + if(pidx >= n) { + r.e = 99 + }else { + if(p[pidx] < s) { + r.e = p[pidx] < 256 ? 16 : 15; + r.n = p[pidx++] + }else { + r.e = e[p[pidx] - s]; + r.n = d[p[pidx++] - s] + } + } + f = 1 << k - w; + for(j = i >> w;j < z;j += f) { + q[j].e = r.e; + q[j].b = r.b; + q[j].n = r.n; + q[j].t = r.t + } + for(j = 1 << k - 1;(i & j) != 0;j >>= 1) { + i ^= j + } + i ^= j; + while((i & (1 << w) - 1) != x[h]) { + w -= lx[h]; + h-- + } + } + } + this.m = lx[1]; + this.status = y != 0 && g != 1 ? 1 : 0 + }; + var zip_GET_BYTE = function() { + if(zip_inflate_data.length == zip_inflate_pos) { + return-1 + } + return zip_inflate_data[zip_inflate_pos++] + }; + var zip_NEEDBITS = function(n) { + while(zip_bit_len < n) { + zip_bit_buf |= zip_GET_BYTE() << zip_bit_len; + zip_bit_len += 8 + } + }; + var zip_GETBITS = function(n) { + return zip_bit_buf & zip_MASK_BITS[n] + }; + var zip_DUMPBITS = function(n) { + zip_bit_buf >>= n; + zip_bit_len -= n + }; + var zip_inflate_codes = function(buff, off, size) { + var e; + var t; + var n; + if(size == 0) { + return 0 + } + n = 0; + for(;;) { + zip_NEEDBITS(zip_bl); + t = zip_tl.list[zip_GETBITS(zip_bl)]; + e = t.e; + while(e > 16) { + if(e == 99) { + return-1 + } + zip_DUMPBITS(t.b); + e -= 16; + zip_NEEDBITS(e); + t = t.t[zip_GETBITS(e)]; + e = t.e + } + zip_DUMPBITS(t.b); + if(e == 16) { + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] = t.n; + if(n == size) { + return size + } + continue + } + if(e == 15) { + break + } + zip_NEEDBITS(e); + zip_copy_leng = t.n + zip_GETBITS(e); + zip_DUMPBITS(e); + zip_NEEDBITS(zip_bd); + t = zip_td.list[zip_GETBITS(zip_bd)]; + e = t.e; + while(e > 16) { + if(e == 99) { + return-1 + } + zip_DUMPBITS(t.b); + e -= 16; + zip_NEEDBITS(e); + t = t.t[zip_GETBITS(e)]; + e = t.e + } + zip_DUMPBITS(t.b); + zip_NEEDBITS(e); + zip_copy_dist = zip_wp - t.n - zip_GETBITS(e); + zip_DUMPBITS(e); + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_copy_dist &= zip_WSIZE - 1; + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] = zip_slide[zip_copy_dist++] + } + if(n == size) { + return size + } + } + zip_method = -1; + return n + }; + var zip_inflate_stored = function(buff, off, size) { + var n; + n = zip_bit_len & 7; + zip_DUMPBITS(n); + zip_NEEDBITS(16); + n = zip_GETBITS(16); + zip_DUMPBITS(16); + zip_NEEDBITS(16); + if(n != (~zip_bit_buf & 65535)) { + return-1 + } + zip_DUMPBITS(16); + zip_copy_leng = n; + n = 0; + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_wp &= zip_WSIZE - 1; + zip_NEEDBITS(8); + buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); + zip_DUMPBITS(8) + } + if(zip_copy_leng == 0) { + zip_method = -1 + } + return n + }; + var zip_fixed_bd; + var zip_inflate_fixed = function(buff, off, size) { + if(zip_fixed_tl == null) { + var i; + var l = new Array(288); + var h; + for(i = 0;i < 144;i++) { + l[i] = 8 + } + for(;i < 256;i++) { + l[i] = 9 + } + for(;i < 280;i++) { + l[i] = 7 + } + for(;i < 288;i++) { + l[i] = 8 + } + zip_fixed_bl = 7; + h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext, zip_fixed_bl); + if(h.status != 0) { + alert("HufBuild error: " + h.status); + return-1 + } + zip_fixed_tl = h.root; + zip_fixed_bl = h.m; + for(i = 0;i < 30;i++) { + l[i] = 5 + } + zip_fixed_bd = 5; + h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd); + if(h.status > 1) { + zip_fixed_tl = null; + alert("HufBuild error: " + h.status); + return-1 + } + zip_fixed_td = h.root; + zip_fixed_bd = h.m + } + zip_tl = zip_fixed_tl; + zip_td = zip_fixed_td; + zip_bl = zip_fixed_bl; + zip_bd = zip_fixed_bd; + return zip_inflate_codes(buff, off, size) + }; + var zip_inflate_dynamic = function(buff, off, size) { + var i; + var j; + var l; + var n; + var t; + var nb; + var nl; + var nd; + var ll = new Array(286 + 30); + var h; + for(i = 0;i < ll.length;i++) { + ll[i] = 0 + } + zip_NEEDBITS(5); + nl = 257 + zip_GETBITS(5); + zip_DUMPBITS(5); + zip_NEEDBITS(5); + nd = 1 + zip_GETBITS(5); + zip_DUMPBITS(5); + zip_NEEDBITS(4); + nb = 4 + zip_GETBITS(4); + zip_DUMPBITS(4); + if(nl > 286 || nd > 30) { + return-1 + } + for(j = 0;j < nb;j++) { + zip_NEEDBITS(3); + ll[zip_border[j]] = zip_GETBITS(3); + zip_DUMPBITS(3) + } + for(;j < 19;j++) { + ll[zip_border[j]] = 0 + } + zip_bl = 7; + h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl); + if(h.status != 0) { + return-1 + } + zip_tl = h.root; + zip_bl = h.m; + n = nl + nd; + i = l = 0; + while(i < n) { + zip_NEEDBITS(zip_bl); + t = zip_tl.list[zip_GETBITS(zip_bl)]; + j = t.b; + zip_DUMPBITS(j); + j = t.n; + if(j < 16) { + ll[i++] = l = j + }else { + if(j == 16) { + zip_NEEDBITS(2); + j = 3 + zip_GETBITS(2); + zip_DUMPBITS(2); + if(i + j > n) { + return-1 + } + while(j-- > 0) { + ll[i++] = l + } + }else { + if(j == 17) { + zip_NEEDBITS(3); + j = 3 + zip_GETBITS(3); + zip_DUMPBITS(3); + if(i + j > n) { + return-1 + } + while(j-- > 0) { + ll[i++] = 0 + } + l = 0 + }else { + zip_NEEDBITS(7); + j = 11 + zip_GETBITS(7); + zip_DUMPBITS(7); + if(i + j > n) { + return-1 + } + while(j-- > 0) { + ll[i++] = 0 + } + l = 0 + } + } + } + } + zip_bl = zip_lbits; + h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl); + if(zip_bl == 0) { + h.status = 1 + } + if(h.status != 0) { + return-1 + } + zip_tl = h.root; + zip_bl = h.m; + for(i = 0;i < nd;i++) { + ll[i] = ll[i + nl] + } + zip_bd = zip_dbits; + h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd); + zip_td = h.root; + zip_bd = h.m; + if(zip_bd == 0 && nl > 257) { + return-1 + } + if(h.status != 0) { + return-1 + } + return zip_inflate_codes(buff, off, size) + }; + var zip_inflate_start = function() { + var i; + if(zip_slide == null) { + zip_slide = new Array(2 * zip_WSIZE) + } + zip_wp = 0; + zip_bit_buf = 0; + zip_bit_len = 0; + zip_method = -1; + zip_eof = false; + zip_copy_leng = zip_copy_dist = 0; + zip_tl = null + }; + var zip_inflate_internal = function(buff, off, size) { + var n, i; + n = 0; + while(n < size) { + if(zip_eof && zip_method == -1) { + return n + } + if(zip_copy_leng > 0) { + if(zip_method != zip_STORED_BLOCK) { + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_copy_dist &= zip_WSIZE - 1; + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] = zip_slide[zip_copy_dist++] + } + }else { + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_wp &= zip_WSIZE - 1; + zip_NEEDBITS(8); + buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); + zip_DUMPBITS(8) + } + if(zip_copy_leng == 0) { + zip_method = -1 + } + } + if(n == size) { + return n + } + } + if(zip_method == -1) { + if(zip_eof) { + break + } + zip_NEEDBITS(1); + if(zip_GETBITS(1) != 0) { + zip_eof = true + } + zip_DUMPBITS(1); + zip_NEEDBITS(2); + zip_method = zip_GETBITS(2); + zip_DUMPBITS(2); + zip_tl = null; + zip_copy_leng = 0 + } + switch(zip_method) { + case 0: + i = zip_inflate_stored(buff, off + n, size - n); + break; + case 1: + if(zip_tl != null) { + i = zip_inflate_codes(buff, off + n, size - n) + }else { + i = zip_inflate_fixed(buff, off + n, size - n) + } + break; + case 2: + if(zip_tl != null) { + i = zip_inflate_codes(buff, off + n, size - n) + }else { + i = zip_inflate_dynamic(buff, off + n, size - n) + } + break; + default: + i = -1; + break + } + if(i == -1) { + if(zip_eof) { + return 0 + } + return-1 + } + n += i + } + return n + }; + var zip_inflate = function(data, size) { + var i, j; + zip_inflate_start(); + zip_inflate_data = data; + zip_inflate_pos = 0; + var buff = new runtime.ByteArray(size); + zip_inflate_internal(buff, 0, size); + zip_inflate_data = null; + return buff + }; + this.inflate = zip_inflate +}; +core.Cursor = function Cursor(selection, document) { + var cursorns, cursorNode; + cursorns = "urn:webodf:names:cursor"; + cursorNode = document.createElementNS(cursorns, "cursor"); + function putCursorIntoTextNode(container, offset) { + var len, ref, textnode, parent; + parent = container.parentNode; + if(offset === 0) { + parent.insertBefore(cursorNode, container) + }else { + if(offset === container.length) { + parent.appendChild(cursorNode) + }else { + len = container.length; + ref = container.nextSibling; + textnode = document.createTextNode(container.substringData(offset, len)); + container.deleteData(offset, len); + if(ref) { + parent.insertBefore(textnode, ref) + }else { + parent.appendChild(textnode) + } + parent.insertBefore(cursorNode, textnode) + } + } + } + function putCursorIntoContainer(container, offset) { + var node; + node = container.firstChild; + while(node && offset) { + node = node.nextSibling; + offset -= 1 + } + container.insertBefore(cursorNode, node) + } + function getPotentialParentOrNode(parent, node) { + var n = node; + while(n && n !== parent) { + n = n.parentNode + } + return n || node + } + function removeCursorFromSelectionRange(range, cursorpos) { + var cursorParent, start, end; + cursorParent = cursorNode.parentNode; + start = getPotentialParentOrNode(cursorNode, range.startContainer); + end = getPotentialParentOrNode(cursorNode, range.endContainer); + if(start === cursorNode) { + range.setStart(cursorParent, cursorpos) + }else { + if(start === cursorParent && range.startOffset > cursorpos) { + range.setStart(cursorParent, range.startOffset - 1) + } + } + if(range.endContainer === cursorNode) { + range.setEnd(cursorParent, cursorpos) + }else { + if(range.endContainer === cursorParent && range.endOffset > cursorpos) { + range.setEnd(cursorParent, range.endOffset - 1) + } + } + } + function adaptRangeToMergedText(range, prev, textnodetomerge, cursorpos) { + var diff = prev.length - textnodetomerge.length; + if(range.startContainer === textnodetomerge) { + range.setStart(prev, diff + range.startOffset) + }else { + if(range.startContainer === prev.parentNode && range.startOffset === cursorpos) { + range.setStart(prev, diff) + } + } + if(range.endContainer === textnodetomerge) { + range.setEnd(prev, diff + range.endOffset) + }else { + if(range.endContainer === prev.parentNode && range.endOffset === cursorpos) { + range.setEnd(prev, diff) + } + } + } + function removeCursor() { + var i, cursorpos, node, textnodetoremove, range; + if(!cursorNode.parentNode) { + return + } + cursorpos = 0; + node = cursorNode.parentNode.firstChild; + while(node && node !== cursorNode) { + cursorpos += 1; + node = node.nextSibling + } + if(cursorNode.previousSibling && cursorNode.previousSibling.nodeType === 3 && cursorNode.nextSibling && cursorNode.nextSibling.nodeType === 3) { + textnodetoremove = cursorNode.nextSibling; + cursorNode.previousSibling.appendData(textnodetoremove.nodeValue) + } + for(i = 0;i < selection.rangeCount;i += 1) { + removeCursorFromSelectionRange(selection.getRangeAt(i), cursorpos) + } + if(textnodetoremove) { + for(i = 0;i < selection.rangeCount;i += 1) { + adaptRangeToMergedText(selection.getRangeAt(i), cursorNode.previousSibling, textnodetoremove, cursorpos) + } + textnodetoremove.parentNode.removeChild(textnodetoremove) + } + cursorNode.parentNode.removeChild(cursorNode) + } + function putCursor(container, offset) { + if(container.nodeType === 3) { + putCursorIntoTextNode(container, offset) + }else { + if(container.nodeType !== 9) { + putCursorIntoContainer(container, offset) + } + } + } + this.getNode = function() { + return cursorNode + }; + this.updateToSelection = function() { + var range; + removeCursor(); + if(selection.focusNode) { + putCursor(selection.focusNode, selection.focusOffset) + } + }; + this.remove = function() { + removeCursor() + } +}; +core.UnitTest = function UnitTest() { +}; +core.UnitTest.prototype.setUp = function() { +}; +core.UnitTest.prototype.tearDown = function() { +}; +core.UnitTest.prototype.description = function() { +}; +core.UnitTest.prototype.tests = function() { +}; +core.UnitTest.prototype.asyncTests = function() { +}; +core.UnitTestRunner = function UnitTestRunner() { + var failedTests = 0; + function debug(msg) { + runtime.log(msg) + } + function testFailed(msg) { + failedTests += 1; + runtime.log("fail", msg) + } + function testPassed(msg) { + runtime.log("pass", msg) + } + function areArraysEqual(a, b) { + var i; + try { + if(a.length !== b.length) { + return false + } + for(i = 0;i < a.length;i += 1) { + if(a[i] !== b[i]) { + return false + } + } + }catch(ex) { + return false + } + return true + } + function isResultCorrect(actual, expected) { + if(expected === 0) { + return actual === expected && 1 / actual === 1 / expected + } + if(actual === expected) { + return true + } + if(typeof expected === "number" && isNaN(expected)) { + return typeof actual === "number" && isNaN(actual) + } + if(Object.prototype.toString.call(expected) === Object.prototype.toString.call([])) { + return areArraysEqual(actual, expected) + } + return false + } + function stringify(v) { + if(v === 0 && 1 / v < 0) { + return"-0" + } + return String(v) + } + function shouldBe(t, a, b) { + if(typeof a !== "string" || typeof b !== "string") { + debug("WARN: shouldBe() expects string arguments") + } + var exception, av, bv; + try { + av = eval(a) + }catch(e) { + exception = e + } + bv = eval(b); + if(exception) { + testFailed(a + " should be " + bv + ". Threw exception " + exception) + }else { + if(isResultCorrect(av, bv)) { + testPassed(a + " is " + b) + }else { + if(typeof av === typeof bv) { + testFailed(a + " should be " + bv + ". Was " + stringify(av) + ".") + }else { + testFailed(a + " should be " + bv + " (of type " + typeof bv + "). Was " + av + " (of type " + typeof av + ").") + } + } + } + } + function shouldBeNonNull(t, a) { + var exception, av; + try { + av = eval(a) + }catch(e) { + exception = e + } + if(exception) { + testFailed(a + " should be non-null. Threw exception " + exception) + }else { + if(av !== null) { + testPassed(a + " is non-null.") + }else { + testFailed(a + " should be non-null. Was " + av) + } + } + } + function shouldBeNull(t, a) { + shouldBe(t, a, "null") + } + this.shouldBeNull = shouldBeNull; + this.shouldBeNonNull = shouldBeNonNull; + this.shouldBe = shouldBe; + this.countFailedTests = function() { + return failedTests + } +}; +core.UnitTester = function UnitTester() { + var failedTests = 0, results = {}; + this.runTests = function(TestClass, callback) { + var testName = Runtime.getFunctionName(TestClass), tname, runner = new core.UnitTestRunner, test = new TestClass(runner), testResults = {}, i, t, tests, lastFailCount; + if(testName.hasOwnProperty(results)) { + runtime.log("Test " + testName + " has already run."); + return + } + runtime.log("Running " + testName + ": " + test.description()); + tests = test.tests(); + for(i = 0;i < tests.length;i += 1) { + t = tests[i]; + tname = Runtime.getFunctionName(t); + runtime.log("Running " + tname); + lastFailCount = runner.countFailedTests(); + test.setUp(); + t(); + test.tearDown(); + testResults[tname] = lastFailCount === runner.countFailedTests() + } + function runAsyncTests(todo) { + if(todo.length === 0) { + results[testName] = testResults; + failedTests += runner.countFailedTests(); + callback(); + return + } + t = todo[0]; + var tname = Runtime.getFunctionName(t); + runtime.log("Running " + tname); + lastFailCount = runner.countFailedTests(); + test.setUp(); + t(function() { + test.tearDown(); + testResults[tname] = lastFailCount === runner.countFailedTests(); + runAsyncTests(todo.slice(1)) + }) + } + runAsyncTests(test.asyncTests()) + }; + this.countFailedTests = function() { + return failedTests + }; + this.results = function() { + return results + } +}; +core.PointWalker = function PointWalker(node) { + var currentNode = node, before = null, after = node && node.firstChild, root = node, pos = 0; + function getPosition(node) { + var p = -1, n = node; + while(n) { + n = n.previousSibling; + p += 1 + } + return p + } + this.setPoint = function(node, position) { + currentNode = node; + pos = position; + if(currentNode.nodeType === 3) { + after = null; + before = null + }else { + after = currentNode.firstChild; + while(position) { + position -= 1; + after = after.nextSibling + } + if(after) { + before = after.previousSibling + }else { + before = currentNode.lastChild + } + } + }; + this.stepForward = function() { + var len; + if(currentNode.nodeType === 3) { + if(typeof currentNode.nodeValue.length === "number") { + len = currentNode.nodeValue.length + }else { + len = currentNode.nodeValue.length() + } + if(pos < len) { + pos += 1; + return true + } + } + if(after) { + if(after.nodeType === 1) { + currentNode = after; + before = null; + after = currentNode.firstChild; + pos = 0 + }else { + if(after.nodeType === 3) { + currentNode = after; + before = null; + after = null; + pos = 0 + }else { + before = after; + after = after.nextSibling; + pos += 1 + } + } + return true + } + if(currentNode !== root) { + before = currentNode; + after = before.nextSibling; + currentNode = currentNode.parentNode; + pos = getPosition(before) + 1; + return true + } + return false + }; + this.stepBackward = function() { + if(currentNode.nodeType === 3) { + if(pos > 0) { + pos -= 1; + return true + } + } + if(before) { + if(before.nodeType === 1) { + currentNode = before; + before = currentNode.lastChild; + after = null; + pos = getPosition(before) + 1 + }else { + if(before.nodeType === 3) { + currentNode = before; + before = null; + after = null; + if(typeof currentNode.nodeValue.length === "number") { + pos = currentNode.nodeValue.length + }else { + pos = currentNode.nodeValue.length() + } + }else { + after = before; + before = before.previousSibling; + pos -= 1 + } + } + return true + } + if(currentNode !== root) { + after = currentNode; + before = after.previousSibling; + currentNode = currentNode.parentNode; + pos = getPosition(after); + return true + } + return false + }; + this.node = function() { + return currentNode + }; + this.position = function() { + return pos + }; + this.precedingSibling = function() { + return before + }; + this.followingSibling = function() { + return after + } +}; +core.Async = function Async() { + this.forEach = function(items, f, callback) { + var i, l = items.length, itemsDone = 0; + function end(err) { + if(itemsDone !== l) { + if(err) { + itemsDone = l; + callback(err) + }else { + itemsDone += 1; + if(itemsDone === l) { + callback(null) + } + } + } + } + for(i = 0;i < l;i += 1) { + f(items[i], end) + } + } +}; +runtime.loadClass("core.RawInflate"); +runtime.loadClass("core.ByteArray"); +runtime.loadClass("core.ByteArrayWriter"); +runtime.loadClass("core.Base64"); +core.Zip = function Zip(url, entriesReadCallback) { + var entries, filesize, nEntries, inflate = (new core.RawInflate).inflate, zip = this, base64 = new core.Base64; + function crc32(data) { + var table = [0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685, 2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995, 2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648, 2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990, 1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755, 2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145, 1258607687, 3524101629, 2768942443, 901097722, 1119000684, + 3686517206, 2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980, 1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705, 3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527, 1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772, 4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290, 251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719, 3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925, + 453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202, 4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960, 984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733, 3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467, 855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048, 3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054, 702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443, 3233442989, + 3988292384, 2596254646, 62317068, 1957810842, 3939845945, 2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430, 2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580, 2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225, 1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143, 2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732, 1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850, 2936675148, 906185462, + 1090812512, 3747672003, 2825379669, 829329135, 1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109, 3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954, 1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920, 3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877, 83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603, 3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992, 534414190, 2176718541, 4139329115, + 1873836001, 414664567, 2282248934, 4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795, 376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105, 3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270, 936918E3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108, 3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449, 601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471, 3272380065, 1510334235, 755167117], crc = + 0, i, iTop = data.length, x = 0, y = 0; + crc = crc ^ -1; + for(i = 0;i < iTop;i += 1) { + y = (crc ^ data[i]) & 255; + x = table[y]; + crc = crc >>> 8 ^ x + } + return crc ^ -1 + } + function dosTime2Date(dostime) { + var year = (dostime >> 25 & 127) + 1980, month = (dostime >> 21 & 15) - 1, mday = dostime >> 16 & 31, hour = dostime >> 11 & 15, min = dostime >> 5 & 63, sec = (dostime & 31) << 1, d = new Date(year, month, mday, hour, min, sec); + return d + } + function date2DosTime(date) { + var y = date.getFullYear(); + return y < 1980 ? 0 : y - 1980 << 25 | date.getMonth() + 1 << 21 | date.getDate() << 16 | date.getHours() << 11 | date.getMinutes() << 5 | date.getSeconds() >> 1 + } + function ZipEntry(url, stream) { + var sig, namelen, extralen, commentlen, compressionMethod, compressedSize, uncompressedSize, offset, crc, entry = this; + function handleEntryData(data, callback) { + var stream = new core.ByteArray(data), sig = stream.readUInt32LE(), filenamelen, extralen; + if(sig !== 67324752) { + callback("File entry signature is wrong." + sig.toString() + " " + data.length.toString(), null); + return + } + stream.pos += 22; + filenamelen = stream.readUInt16LE(); + extralen = stream.readUInt16LE(); + stream.pos += filenamelen + extralen; + if(compressionMethod) { + data = data.slice(stream.pos, stream.pos + compressedSize); + if(compressedSize !== data.length) { + callback("The amount of compressed bytes read was " + data.length.toString() + " instead of " + compressedSize.toString() + " for " + entry.filename + " in " + url + ".", null); + return + } + data = inflate(data, uncompressedSize) + }else { + data = data.slice(stream.pos, stream.pos + uncompressedSize) + } + if(uncompressedSize !== data.length) { + callback("The amount of bytes read was " + data.length.toString() + " instead of " + uncompressedSize.toString() + " for " + entry.filename + " in " + url + ".", null); + return + } + entry.data = data; + callback(null, data) + } + function load(callback) { + if(entry.data !== undefined) { + callback(null, entry.data); + return + } + var size = compressedSize + 34 + namelen + extralen + 256; + if(size + offset > filesize) { + size = filesize - offset + } + runtime.read(url, offset, size, function(err, data) { + if(err) { + callback(err, data) + }else { + handleEntryData(data, callback) + } + }) + } + this.load = load; + function set(filename, data, compressed, date) { + entry.filename = filename; + entry.data = data; + entry.compressed = compressed; + entry.date = date + } + this.set = set; + this.error = null; + if(!stream) { + return + } + sig = stream.readUInt32LE(); + if(sig !== 33639248) { + this.error = "Central directory entry has wrong signature at position " + (stream.pos - 4).toString() + ' for file "' + url + '": ' + stream.data.length.toString(); + return + } + stream.pos += 6; + compressionMethod = stream.readUInt16LE(); + this.date = dosTime2Date(stream.readUInt32LE()); + crc = stream.readUInt32LE(); + compressedSize = stream.readUInt32LE(); + uncompressedSize = stream.readUInt32LE(); + namelen = stream.readUInt16LE(); + extralen = stream.readUInt16LE(); + commentlen = stream.readUInt16LE(); + stream.pos += 8; + offset = stream.readUInt32LE(); + this.filename = runtime.byteArrayToString(stream.data.slice(stream.pos, stream.pos + namelen), "utf8"); + stream.pos += namelen + extralen + commentlen + } + function handleCentralDirectory(data, callback) { + var stream = new core.ByteArray(data), i, e; + entries = []; + for(i = 0;i < nEntries;i += 1) { + e = new ZipEntry(url, stream); + if(e.error) { + callback(e.error, zip); + return + } + entries[entries.length] = e + } + callback(null, zip) + } + function handleCentralDirectoryEnd(data, callback) { + if(data.length !== 22) { + callback("Central directory length should be 22.", zip); + return + } + var stream = new core.ByteArray(data), sig, disk, cddisk, diskNEntries, cdsSize, cdsOffset; + sig = stream.readUInt32LE(); + if(sig !== 101010256) { + callback("Central directory signature is wrong: " + sig.toString(), zip); + return + } + disk = stream.readUInt16LE(); + if(disk !== 0) { + callback("Zip files with non-zero disk numbers are not supported.", zip); + return + } + cddisk = stream.readUInt16LE(); + if(cddisk !== 0) { + callback("Zip files with non-zero disk numbers are not supported.", zip); + return + } + diskNEntries = stream.readUInt16LE(); + nEntries = stream.readUInt16LE(); + if(diskNEntries !== nEntries) { + callback("Number of entries is inconsistent.", zip); + return + } + cdsSize = stream.readUInt32LE(); + cdsOffset = stream.readUInt16LE(); + cdsOffset = filesize - 22 - cdsSize; + runtime.read(url, cdsOffset, filesize - cdsOffset, function(err, data) { + handleCentralDirectory(data, callback) + }) + } + function load(filename, callback) { + var entry = null, end = filesize, e, i; + for(i = 0;i < entries.length;i += 1) { + e = entries[i]; + if(e.filename === filename) { + entry = e; + break + } + } + if(entry) { + if(entry.data) { + callback(null, entry.data) + }else { + entry.load(callback) + } + }else { + callback(filename + " not found.", null) + } + } + function loadAsString(filename, callback) { + load(filename, function(err, data) { + if(err) { + return callback(err, null) + } + data = runtime.byteArrayToString(data, "utf8"); + callback(null, data) + }) + } + function loadContentXmlAsFragments(filename, handler) { + loadAsString(filename, function(err, data) { + if(err) { + return handler.rootElementReady(err) + } + handler.rootElementReady(null, data, true) + }) + } + function loadAsDataURL(filename, mimetype, callback) { + load(filename, function(err, data) { + if(err) { + return callback(err, null) + } + var p = data, chunksize = 45E3, i = 0, url; + if(!mimetype) { + if(p[1] === 80 && p[2] === 78 && p[3] === 71) { + mimetype = "image/png" + }else { + if(p[0] === 255 && p[1] === 216 && p[2] === 255) { + mimetype = "image/jpeg" + }else { + if(p[0] === 71 && p[1] === 73 && p[2] === 70) { + mimetype = "image/gif" + }else { + mimetype = "" + } + } + } + } + url = "data:" + mimetype + ";base64,"; + while(i < data.length) { + url += base64.convertUTF8ArrayToBase64(p.slice(i, Math.min(i + chunksize, p.length))); + i += chunksize + } + callback(null, url) + }) + } + function loadAsDOM(filename, callback) { + loadAsString(filename, function(err, xmldata) { + if(err) { + callback(err, null); + return + } + var parser = new DOMParser; + xmldata = parser.parseFromString(xmldata, "text/xml"); + callback(null, xmldata) + }) + } + function save(filename, data, compressed, date) { + var i, entry; + for(i = 0;i < entries.length;i += 1) { + entry = entries[i]; + if(entry.filename === filename) { + entry.set(filename, data, compressed, date); + return + } + } + entry = new ZipEntry(url); + entry.set(filename, data, compressed, date); + entries.push(entry) + } + function writeEntry(entry) { + var data = new core.ByteArrayWriter("utf8"), length = 0; + data.appendArray([80, 75, 3, 4, 20, 0, 0, 0, 0, 0]); + if(entry.data) { + length = entry.data.length + } + data.appendUInt32LE(date2DosTime(entry.date)); + data.appendUInt32LE(crc32(entry.data)); + data.appendUInt32LE(length); + data.appendUInt32LE(length); + data.appendUInt16LE(entry.filename.length); + data.appendUInt16LE(0); + data.appendString(entry.filename); + if(entry.data) { + data.appendByteArray(entry.data) + } + return data + } + function writeCODEntry(entry, offset) { + var data = new core.ByteArrayWriter("utf8"), length = 0; + data.appendArray([80, 75, 1, 2, 20, 0, 20, 0, 0, 0, 0, 0]); + if(entry.data) { + length = entry.data.length + } + data.appendUInt32LE(date2DosTime(entry.date)); + data.appendUInt32LE(crc32(entry.data)); + data.appendUInt32LE(length); + data.appendUInt32LE(length); + data.appendUInt16LE(entry.filename.length); + data.appendArray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + data.appendUInt32LE(offset); + data.appendString(entry.filename); + return data + } + function loadAllEntries(position, callback) { + if(position === entries.length) { + callback(null); + return + } + var entry = entries[position]; + if(entry.data !== undefined) { + loadAllEntries(position + 1, callback); + return + } + entry.load(function(err) { + if(err) { + callback(err); + return + } + loadAllEntries(position + 1, callback) + }) + } + function write(callback) { + loadAllEntries(0, function(err) { + if(err) { + callback(err); + return + } + var data = new core.ByteArrayWriter("utf8"), i, e, codoffset, codsize, offsets = [0]; + for(i = 0;i < entries.length;i += 1) { + data.appendByteArrayWriter(writeEntry(entries[i])); + offsets.push(data.getLength()) + } + codoffset = data.getLength(); + for(i = 0;i < entries.length;i += 1) { + e = entries[i]; + data.appendByteArrayWriter(writeCODEntry(e, offsets[i])) + } + codsize = data.getLength() - codoffset; + data.appendArray([80, 75, 5, 6, 0, 0, 0, 0]); + data.appendUInt16LE(entries.length); + data.appendUInt16LE(entries.length); + data.appendUInt32LE(codsize); + data.appendUInt32LE(codoffset); + data.appendArray([0, 0]); + runtime.writeFile(url, data.getByteArray(), callback) + }) + } + this.load = load; + this.save = save; + this.write = write; + this.loadContentXmlAsFragments = loadContentXmlAsFragments; + this.loadAsString = loadAsString; + this.loadAsDOM = loadAsDOM; + this.loadAsDataURL = loadAsDataURL; + this.getEntries = function() { + return entries.slice() + }; + filesize = -1; + if(entriesReadCallback === null) { + entries = []; + return + } + runtime.getFileSize(url, function(size) { + filesize = size; + if(filesize < 0) { + entriesReadCallback("File '" + url + "' cannot be read.", zip) + }else { + runtime.read(url, filesize - 22, 22, function(err, data) { + if(err || entriesReadCallback === null) { + entriesReadCallback(err, zip) + }else { + handleCentralDirectoryEnd(data, entriesReadCallback) + } + }) + } + }) +}; +xmldom.LSSerializerFilter = function LSSerializerFilter() { +}; +if(typeof Object.create !== "function") { + Object["create"] = function(o) { + var F = function() { + }; + F.prototype = o; + return new F + } +} +xmldom.LSSerializer = function LSSerializer() { + var self = this; + function serializeAttribute(prefix, attr) { + var s = prefix + attr.localName + '="' + attr.nodeValue + '"'; + return s + } + function attributePrefix(nsmap, prefix, ns) { + if(nsmap.hasOwnProperty(ns)) { + return nsmap[ns] + ":" + } + if(nsmap[ns] !== prefix) { + nsmap[ns] = prefix + } + return prefix + ":" + } + function startNode(nsmap, node) { + var s = "", atts = node.attributes, length, i, attr, attstr = "", accept, prefix; + if(atts) { + if(nsmap[node.namespaceURI] !== node.prefix) { + nsmap[node.namespaceURI] = node.prefix + } + s += "<" + node.nodeName; + length = atts.length; + for(i = 0;i < length;i += 1) { + attr = atts.item(i); + if(attr.namespaceURI !== "http://www.w3.org/2000/xmlns/") { + accept = self.filter ? self.filter.acceptNode(attr) : 1; + if(accept === 1) { + if(attr.namespaceURI) { + prefix = attributePrefix(nsmap, attr.prefix, attr.namespaceURI) + }else { + prefix = "" + } + attstr += " " + serializeAttribute(prefix, attr) + } + } + } + for(i in nsmap) { + if(nsmap.hasOwnProperty(i)) { + prefix = nsmap[i]; + if(!prefix) { + s += ' xmlns="' + i + '"' + }else { + if(prefix !== "xmlns") { + s += " xmlns:" + nsmap[i] + '="' + i + '"' + } + } + } + } + s += attstr + ">" + } + return s + } + function endNode(node) { + var s = ""; + if(node.nodeType === 1) { + s += "" + } + return s + } + function serializeNode(parentnsmap, node) { + var s = "", nsmap = Object.create(parentnsmap), accept = self.filter ? self.filter.acceptNode(node) : 1, child; + if(accept === 1) { + s += startNode(nsmap, node) + } + if(accept === 1 || accept === 3) { + child = node.firstChild; + while(child) { + s += serializeNode(nsmap, child); + child = child.nextSibling + } + if(node.nodeValue) { + s += node.nodeValue + } + } + if(accept === 1) { + s += endNode(node) + } + return s + } + function invertMap(map) { + var m = {}, i; + for(i in map) { + if(map.hasOwnProperty(i)) { + m[map[i]] = i + } + } + return m + } + this.filter = null; + this.writeToString = function(node, nsmap) { + if(!node) { + return"" + } + nsmap = nsmap ? invertMap(nsmap) : {}; + return serializeNode(nsmap, node) + } +}; +xmldom.RelaxNGParser = function RelaxNGParser() { + var self = this, rngns = "http://relaxng.org/ns/structure/1.0", xmlnsns = "http://www.w3.org/2000/xmlns/", start, nsmap = {"http://www.w3.org/XML/1998/namespace":"xml"}, parse; + function RelaxNGParseError(error, context) { + this.message = function() { + if(context) { + error += context.nodeType === 1 ? " Element " : " Node "; + error += context.nodeName; + if(context.nodeValue) { + error += " with value '" + context.nodeValue + "'" + } + error += "." + } + return error + } + } + function splitToDuos(e) { + if(e.e.length <= 2) { + return e + } + var o = {name:e.name, e:e.e.slice(0, 2)}; + return splitToDuos({name:e.name, e:[o].concat(e.e.slice(2))}) + } + function splitQName(name) { + var r = name.split(":", 2), prefix = "", i; + if(r.length === 1) { + r = ["", r[0]] + }else { + prefix = r[0] + } + for(i in nsmap) { + if(nsmap[i] === prefix) { + r[0] = i + } + } + return r + } + function splitQNames(def) { + var i, l = def.names ? def.names.length : 0, name, localnames = def.localnames = [l], namespaces = def.namespaces = [l]; + for(i = 0;i < l;i += 1) { + name = splitQName(def.names[i]); + namespaces[i] = name[0]; + localnames[i] = name[1] + } + } + function trim(str) { + str = str.replace(/^\s\s*/, ""); + var ws = /\s/, i = str.length - 1; + while(ws.test(str.charAt(i))) { + i -= 1 + } + return str.slice(0, i + 1) + } + function copyAttributes(atts, name, names) { + var a = {}, i, att; + for(i = 0;i < atts.length;i += 1) { + att = atts.item(i); + if(!att.namespaceURI) { + if(att.localName === "name" && (name === "element" || name === "attribute")) { + names.push(att.value) + } + if(att.localName === "name" || att.localName === "combine" || att.localName === "type") { + att.value = trim(att.value) + } + a[att.localName] = att.value + }else { + if(att.namespaceURI === xmlnsns) { + nsmap[att.value] = att.localName + } + } + } + return a + } + function parseChildren(c, e, elements, names) { + var text = "", ce; + while(c) { + if(c.nodeType === 1 && c.namespaceURI === rngns) { + ce = parse(c, elements, e); + if(ce) { + if(ce.name === "name") { + names.push(nsmap[ce.a.ns] + ":" + ce.text); + e.push(ce) + }else { + if(ce.name === "choice" && ce.names && ce.names.length) { + names = names.concat(ce.names); + delete ce.names; + e.push(ce) + }else { + e.push(ce) + } + } + } + }else { + if(c.nodeType === 3) { + text += c.nodeValue + } + } + c = c.nextSibling + } + return text + } + function combineDefines(combine, name, e, siblings) { + var i, ce; + for(i = 0;siblings && i < siblings.length;i += 1) { + ce = siblings[i]; + if(ce.name === "define" && ce.a && ce.a.name === name) { + ce.e = [{name:combine, e:ce.e.concat(e)}]; + return ce + } + } + return null + } + parse = function parse(element, elements, siblings) { + var e = [], a, ce, i, text, name = element.localName, names = []; + a = copyAttributes(element.attributes, name, names); + a.combine = a.combine || undefined; + text = parseChildren(element.firstChild, e, elements, names); + if(name !== "value" && name !== "param") { + text = /^\s*([\s\S]*\S)?\s*$/.exec(text)[1] + } + if(name === "value" && a.type === undefined) { + a.type = "token"; + a.datatypeLibrary = "" + } + if((name === "attribute" || name === "element") && a.name !== undefined) { + i = splitQName(a.name); + e = [{name:"name", text:i[1], a:{ns:i[0]}}].concat(e); + delete a.name + } + if(name === "name" || name === "nsName" || name === "value") { + if(a.ns === undefined) { + a.ns = "" + } + }else { + delete a.ns + } + if(name === "name") { + i = splitQName(text); + a.ns = i[0]; + text = i[1] + } + if(e.length > 1 && (name === "define" || name === "oneOrMore" || name === "zeroOrMore" || name === "optional" || name === "list" || name === "mixed")) { + e = [{name:"group", e:splitToDuos({name:"group", e:e}).e}] + } + if(e.length > 2 && name === "element") { + e = [e[0]].concat({name:"group", e:splitToDuos({name:"group", e:e.slice(1)}).e}) + } + if(e.length === 1 && name === "attribute") { + e.push({name:"text", text:text}) + } + if(e.length === 1 && (name === "choice" || name === "group" || name === "interleave")) { + name = e[0].name; + names = e[0].names; + a = e[0].a; + text = e[0].text; + e = e[0].e + }else { + if(e.length > 2 && (name === "choice" || name === "group" || name === "interleave")) { + e = splitToDuos({name:name, e:e}).e + } + } + if(name === "mixed") { + name = "interleave"; + e = [e[0], {name:"text"}] + } + if(name === "optional") { + name = "choice"; + e = [e[0], {name:"empty"}] + } + if(name === "zeroOrMore") { + name = "choice"; + e = [{name:"oneOrMore", e:[e[0]]}, {name:"empty"}] + } + if(name === "define" && a.combine) { + ce = combineDefines(a.combine, a.name, e, siblings); + if(ce) { + return + } + } + ce = {name:name}; + if(e && e.length > 0) { + ce.e = e + } + for(i in a) { + if(a.hasOwnProperty(i)) { + ce.a = a; + break + } + } + if(text !== undefined) { + ce.text = text + } + if(names && names.length > 0) { + ce.names = names + } + if(name === "element") { + ce.id = elements.length; + elements.push(ce); + ce = {name:"elementref", id:ce.id} + } + return ce + }; + function resolveDefines(def, defines) { + var i = 0, e, defs, end, name = def.name; + while(def.e && i < def.e.length) { + e = def.e[i]; + if(e.name === "ref") { + defs = defines[e.a.name]; + if(!defs) { + throw e.a.name + " was not defined."; + } + end = def.e.slice(i + 1); + def.e = def.e.slice(0, i); + def.e = def.e.concat(defs.e); + def.e = def.e.concat(end) + }else { + i += 1; + resolveDefines(e, defines) + } + } + e = def.e; + if(name === "choice") { + if(!e || !e[1] || e[1].name === "empty") { + if(!e || !e[0] || e[0].name === "empty") { + delete def.e; + def.name = "empty" + }else { + e[1] = e[0]; + e[0] = {name:"empty"} + } + } + } + if(name === "group" || name === "interleave") { + if(e[0].name === "empty") { + if(e[1].name === "empty") { + delete def.e; + def.name = "empty" + }else { + name = def.name = e[1].name; + def.names = e[1].names; + e = def.e = e[1].e + } + }else { + if(e[1].name === "empty") { + name = def.name = e[0].name; + def.names = e[0].names; + e = def.e = e[0].e + } + } + } + if(name === "oneOrMore" && e[0].name === "empty") { + delete def.e; + def.name = "empty" + } + if(name === "attribute") { + splitQNames(def) + } + if(name === "interleave") { + if(e[0].name === "interleave") { + if(e[1].name === "interleave") { + e = def.e = e[0].e.concat(e[1].e) + }else { + e = def.e = [e[1]].concat(e[0].e) + } + }else { + if(e[1].name === "interleave") { + e = def.e = [e[0]].concat(e[1].e) + } + } + } + } + function resolveElements(def, elements) { + var i = 0, e, name; + while(def.e && i < def.e.length) { + e = def.e[i]; + if(e.name === "elementref") { + e.id = e.id || 0; + def.e[i] = elements[e.id] + }else { + if(e.name !== "element") { + resolveElements(e, elements) + } + } + i += 1 + } + } + function main(dom, callback) { + var elements = [], grammar = parse(dom && dom.documentElement, elements, undefined), i, e, defines = {}; + for(i = 0;i < grammar.e.length;i += 1) { + e = grammar.e[i]; + if(e.name === "define") { + defines[e.a.name] = e + }else { + if(e.name === "start") { + start = e + } + } + } + if(!start) { + return[new RelaxNGParseError("No Relax NG start element was found.")] + } + resolveDefines(start, defines); + for(i in defines) { + if(defines.hasOwnProperty(i)) { + resolveDefines(defines[i], defines) + } + } + for(i = 0;i < elements.length;i += 1) { + resolveDefines(elements[i], defines) + } + if(callback) { + self.rootPattern = callback(start.e[0], elements) + } + resolveElements(start, elements); + for(i = 0;i < elements.length;i += 1) { + resolveElements(elements[i], elements) + } + self.start = start; + self.elements = elements; + self.nsmap = nsmap; + return null + } + this.parseRelaxNGDOM = main +}; +runtime.loadClass("xmldom.RelaxNGParser"); +xmldom.RelaxNG = function RelaxNG() { + var xmlnsns = "http://www.w3.org/2000/xmlns/", createChoice, createInterleave, createGroup, createAfter, createOneOrMore, createValue, createAttribute, createNameClass, createData, makePattern, notAllowed = {type:"notAllowed", nullable:false, hash:"notAllowed", textDeriv:function() { + return notAllowed + }, startTagOpenDeriv:function() { + return notAllowed + }, attDeriv:function() { + return notAllowed + }, startTagCloseDeriv:function() { + return notAllowed + }, endTagDeriv:function() { + return notAllowed + }}, empty = {type:"empty", nullable:true, hash:"empty", textDeriv:function() { + return notAllowed + }, startTagOpenDeriv:function() { + return notAllowed + }, attDeriv:function(context, attribute) { + return notAllowed + }, startTagCloseDeriv:function() { + return empty + }, endTagDeriv:function() { + return notAllowed + }}, text = {type:"text", nullable:true, hash:"text", textDeriv:function() { + return text + }, startTagOpenDeriv:function() { + return notAllowed + }, attDeriv:function() { + return notAllowed + }, startTagCloseDeriv:function() { + return text + }, endTagDeriv:function() { + return notAllowed + }}, applyAfter, childDeriv, rootPattern; + function memoize0arg(func) { + return function() { + var cache; + return function() { + if(cache === undefined) { + cache = func() + } + return cache + } + }() + } + function memoize1arg(type, func) { + return function() { + var cache = {}, cachecount = 0; + return function(a) { + var ahash = a.hash || a.toString(), v; + v = cache[ahash]; + if(v !== undefined) { + return v + } + cache[ahash] = v = func(a); + v.hash = type + cachecount.toString(); + cachecount += 1; + return v + } + }() + } + function memoizeNode(func) { + return function() { + var cache = {}; + return function(node) { + var v, m; + m = cache[node.localName]; + if(m === undefined) { + cache[node.localName] = m = {} + }else { + v = m[node.namespaceURI]; + if(v !== undefined) { + return v + } + } + m[node.namespaceURI] = v = func(node); + return v + } + }() + } + function memoize2arg(type, fastfunc, func) { + return function() { + var cache = {}, cachecount = 0; + return function(a, b) { + var v = fastfunc && fastfunc(a, b), ahash, bhash, m; + if(v !== undefined) { + return v + } + ahash = a.hash || a.toString(); + bhash = b.hash || b.toString(); + m = cache[ahash]; + if(m === undefined) { + cache[ahash] = m = {} + }else { + v = m[bhash]; + if(v !== undefined) { + return v + } + } + m[bhash] = v = func(a, b); + v.hash = type + cachecount.toString(); + cachecount += 1; + return v + } + }() + } + function unorderedMemoize2arg(type, fastfunc, func) { + return function() { + var cache = {}, cachecount = 0; + return function(a, b) { + var v = fastfunc && fastfunc(a, b), ahash, bhash, m; + if(v !== undefined) { + return v + } + ahash = a.hash || a.toString(); + bhash = b.hash || b.toString(); + if(ahash < bhash) { + m = ahash; + ahash = bhash; + bhash = m; + m = a; + a = b; + b = m + } + m = cache[ahash]; + if(m === undefined) { + cache[ahash] = m = {} + }else { + v = m[bhash]; + if(v !== undefined) { + return v + } + } + m[bhash] = v = func(a, b); + v.hash = type + cachecount.toString(); + cachecount += 1; + return v + } + }() + } + function getUniqueLeaves(leaves, pattern) { + if(pattern.p1.type === "choice") { + getUniqueLeaves(leaves, pattern.p1) + }else { + leaves[pattern.p1.hash] = pattern.p1 + } + if(pattern.p2.type === "choice") { + getUniqueLeaves(leaves, pattern.p2) + }else { + leaves[pattern.p2.hash] = pattern.p2 + } + } + createChoice = memoize2arg("choice", function(p1, p2) { + if(p1 === notAllowed) { + return p2 + } + if(p2 === notAllowed) { + return p1 + } + if(p1 === p2) { + return p1 + } + }, function(p1, p2) { + function makeChoice(p1, p2) { + return{type:"choice", p1:p1, p2:p2, nullable:p1.nullable || p2.nullable, textDeriv:function(context, text) { + return createChoice(p1.textDeriv(context, text), p2.textDeriv(context, text)) + }, startTagOpenDeriv:memoizeNode(function(node) { + return createChoice(p1.startTagOpenDeriv(node), p2.startTagOpenDeriv(node)) + }), attDeriv:function(context, attribute) { + return createChoice(p1.attDeriv(context, attribute), p2.attDeriv(context, attribute)) + }, startTagCloseDeriv:memoize0arg(function() { + return createChoice(p1.startTagCloseDeriv(), p2.startTagCloseDeriv()) + }), endTagDeriv:memoize0arg(function() { + return createChoice(p1.endTagDeriv(), p2.endTagDeriv()) + })} + } + var leaves = {}, i; + getUniqueLeaves(leaves, {p1:p1, p2:p2}); + p1 = undefined; + p2 = undefined; + for(i in leaves) { + if(leaves.hasOwnProperty(i)) { + if(p1 === undefined) { + p1 = leaves[i] + }else { + if(p2 === undefined) { + p2 = leaves[i] + }else { + p2 = createChoice(p2, leaves[i]) + } + } + } + } + return makeChoice(p1, p2) + }); + createInterleave = unorderedMemoize2arg("interleave", function(p1, p2) { + if(p1 === notAllowed || p2 === notAllowed) { + return notAllowed + } + if(p1 === empty) { + return p2 + } + if(p2 === empty) { + return p1 + } + }, function(p1, p2) { + return{type:"interleave", p1:p1, p2:p2, nullable:p1.nullable && p2.nullable, textDeriv:function(context, text) { + return createChoice(createInterleave(p1.textDeriv(context, text), p2), createInterleave(p1, p2.textDeriv(context, text))) + }, startTagOpenDeriv:memoizeNode(function(node) { + return createChoice(applyAfter(function(p) { + return createInterleave(p, p2) + }, p1.startTagOpenDeriv(node)), applyAfter(function(p) { + return createInterleave(p1, p) + }, p2.startTagOpenDeriv(node))) + }), attDeriv:function(context, attribute) { + return createChoice(createInterleave(p1.attDeriv(context, attribute), p2), createInterleave(p1, p2.attDeriv(context, attribute))) + }, startTagCloseDeriv:memoize0arg(function() { + return createInterleave(p1.startTagCloseDeriv(), p2.startTagCloseDeriv()) + })} + }); + createGroup = memoize2arg("group", function(p1, p2) { + if(p1 === notAllowed || p2 === notAllowed) { + return notAllowed + } + if(p1 === empty) { + return p2 + } + if(p2 === empty) { + return p1 + } + }, function(p1, p2) { + return{type:"group", p1:p1, p2:p2, nullable:p1.nullable && p2.nullable, textDeriv:function(context, text) { + var p = createGroup(p1.textDeriv(context, text), p2); + if(p1.nullable) { + return createChoice(p, p2.textDeriv(context, text)) + } + return p + }, startTagOpenDeriv:function(node) { + var x = applyAfter(function(p) { + return createGroup(p, p2) + }, p1.startTagOpenDeriv(node)); + if(p1.nullable) { + return createChoice(x, p2.startTagOpenDeriv(node)) + } + return x + }, attDeriv:function(context, attribute) { + return createChoice(createGroup(p1.attDeriv(context, attribute), p2), createGroup(p1, p2.attDeriv(context, attribute))) + }, startTagCloseDeriv:memoize0arg(function() { + return createGroup(p1.startTagCloseDeriv(), p2.startTagCloseDeriv()) + })} + }); + createAfter = memoize2arg("after", function(p1, p2) { + if(p1 === notAllowed || p2 === notAllowed) { + return notAllowed + } + }, function(p1, p2) { + return{type:"after", p1:p1, p2:p2, nullable:false, textDeriv:function(context, text) { + return createAfter(p1.textDeriv(context, text), p2) + }, startTagOpenDeriv:memoizeNode(function(node) { + return applyAfter(function(p) { + return createAfter(p, p2) + }, p1.startTagOpenDeriv(node)) + }), attDeriv:function(context, attribute) { + return createAfter(p1.attDeriv(context, attribute), p2) + }, startTagCloseDeriv:memoize0arg(function() { + return createAfter(p1.startTagCloseDeriv(), p2) + }), endTagDeriv:memoize0arg(function() { + return p1.nullable ? p2 : notAllowed + })} + }); + createOneOrMore = memoize1arg("oneormore", function(p) { + if(p === notAllowed) { + return notAllowed + } + return{type:"oneOrMore", p:p, nullable:p.nullable, textDeriv:function(context, text) { + return createGroup(p.textDeriv(context, text), createChoice(this, empty)) + }, startTagOpenDeriv:function(node) { + var oneOrMore = this; + return applyAfter(function(pf) { + return createGroup(pf, createChoice(oneOrMore, empty)) + }, p.startTagOpenDeriv(node)) + }, attDeriv:function(context, attribute) { + var oneOrMore = this; + return createGroup(p.attDeriv(context, attribute), createChoice(oneOrMore, empty)) + }, startTagCloseDeriv:memoize0arg(function() { + return createOneOrMore(p.startTagCloseDeriv()) + })} + }); + function createElement(nc, p) { + return{type:"element", nc:nc, nullable:false, textDeriv:function() { + return notAllowed + }, startTagOpenDeriv:function(node) { + if(nc.contains(node)) { + return createAfter(p, empty) + } + return notAllowed + }, attDeriv:function(context, attribute) { + return notAllowed + }, startTagCloseDeriv:function() { + return this + }} + } + function valueMatch(context, pattern, text) { + return pattern.nullable && /^\s+$/.test(text) || pattern.textDeriv(context, text).nullable + } + createAttribute = memoize2arg("attribute", undefined, function(nc, p) { + return{type:"attribute", nullable:false, nc:nc, p:p, attDeriv:function(context, attribute) { + if(nc.contains(attribute) && valueMatch(context, p, attribute.nodeValue)) { + return empty + } + return notAllowed + }, startTagCloseDeriv:function() { + return notAllowed + }} + }); + function createList() { + return{type:"list", nullable:false, hash:"list", textDeriv:function(context, text) { + return empty + }} + } + createValue = memoize1arg("value", function(value) { + return{type:"value", nullable:false, value:value, textDeriv:function(context, text) { + return text === value ? empty : notAllowed + }, attDeriv:function() { + return notAllowed + }, startTagCloseDeriv:function() { + return this + }} + }); + createData = memoize1arg("data", function(type) { + return{type:"data", nullable:false, dataType:type, textDeriv:function() { + return empty + }, attDeriv:function() { + return notAllowed + }, startTagCloseDeriv:function() { + return this + }} + }); + function createDataExcept() { + return{type:"dataExcept", nullable:false, hash:"dataExcept"} + } + applyAfter = function applyAfter(f, p) { + var result; + if(p.type === "after") { + result = createAfter(p.p1, f(p.p2)) + }else { + if(p.type === "choice") { + result = createChoice(applyAfter(f, p.p1), applyAfter(f, p.p2)) + }else { + result = p + } + } + return result + }; + function attsDeriv(context, pattern, attributes, position) { + if(pattern === notAllowed) { + return notAllowed + } + if(position >= attributes.length) { + return pattern + } + if(position === 0) { + position = 0 + } + var a = attributes.item(position); + while(a.namespaceURI === xmlnsns) { + position += 1; + if(position >= attributes.length) { + return pattern + } + a = attributes.item(position) + } + a = attsDeriv(context, pattern.attDeriv(context, attributes.item(position)), attributes, position + 1); + return a + } + function childrenDeriv(context, pattern, walker) { + var element = walker.currentNode, childNode = walker.firstChild(), numberOfTextNodes = 0, childNodes = [], i, p; + while(childNode) { + if(childNode.nodeType === 1) { + childNodes.push(childNode) + }else { + if(childNode.nodeType === 3 && !/^\s*$/.test(childNode.nodeValue)) { + childNodes.push(childNode.nodeValue); + numberOfTextNodes += 1 + } + } + childNode = walker.nextSibling() + } + if(childNodes.length === 0) { + childNodes = [""] + } + p = pattern; + for(i = 0;p !== notAllowed && i < childNodes.length;i += 1) { + childNode = childNodes[i]; + if(typeof childNode === "string") { + if(/^\s*$/.test(childNode)) { + p = createChoice(p, p.textDeriv(context, childNode)) + }else { + p = p.textDeriv(context, childNode) + } + }else { + walker.currentNode = childNode; + p = childDeriv(context, p, walker) + } + } + walker.currentNode = element; + return p + } + childDeriv = function childDeriv(context, pattern, walker) { + var childNode = walker.currentNode, p; + p = pattern.startTagOpenDeriv(childNode); + p = attsDeriv(context, p, childNode.attributes, 0); + p = p.startTagCloseDeriv(); + p = childrenDeriv(context, p, walker); + p = p.endTagDeriv(); + return p + }; + function addNames(name, ns, pattern) { + if(pattern.e[0].a) { + name.push(pattern.e[0].text); + ns.push(pattern.e[0].a.ns) + }else { + addNames(name, ns, pattern.e[0]) + } + if(pattern.e[1].a) { + name.push(pattern.e[1].text); + ns.push(pattern.e[1].a.ns) + }else { + addNames(name, ns, pattern.e[1]) + } + } + createNameClass = function createNameClass(pattern) { + var name, ns, hash, i, result; + if(pattern.name === "name") { + name = pattern.text; + ns = pattern.a.ns; + result = {name:name, ns:ns, hash:"{" + ns + "}" + name, contains:function(node) { + return node.namespaceURI === ns && node.localName === name + }} + }else { + if(pattern.name === "choice") { + name = []; + ns = []; + addNames(name, ns, pattern); + hash = ""; + for(i = 0;i < name.length;i += 1) { + hash += "{" + ns[i] + "}" + name[i] + "," + } + result = {hash:hash, contains:function(node) { + var i; + for(i = 0;i < name.length;i += 1) { + if(name[i] === node.localName && ns[i] === node.namespaceURI) { + return true + } + } + return false + }} + }else { + result = {hash:"anyName", contains:function() { + return true + }} + } + } + return result + }; + function resolveElement(pattern, elements) { + var element, p, i, hash; + hash = "element" + pattern.id.toString(); + p = elements[pattern.id] = {hash:hash}; + element = createElement(createNameClass(pattern.e[0]), makePattern(pattern.e[1], elements)); + for(i in element) { + if(element.hasOwnProperty(i)) { + p[i] = element[i] + } + } + return p + } + makePattern = function makePattern(pattern, elements) { + var p, i; + if(pattern.name === "elementref") { + p = pattern.id || 0; + pattern = elements[p]; + if(pattern.name !== undefined) { + return resolveElement(pattern, elements) + } + return pattern + } + switch(pattern.name) { + case "empty": + return empty; + case "notAllowed": + return notAllowed; + case "text": + return text; + case "choice": + return createChoice(makePattern(pattern.e[0], elements), makePattern(pattern.e[1], elements)); + case "interleave": + p = makePattern(pattern.e[0], elements); + for(i = 1;i < pattern.e.length;i += 1) { + p = createInterleave(p, makePattern(pattern.e[i], elements)) + } + return p; + case "group": + return createGroup(makePattern(pattern.e[0], elements), makePattern(pattern.e[1], elements)); + case "oneOrMore": + return createOneOrMore(makePattern(pattern.e[0], elements)); + case "attribute": + return createAttribute(createNameClass(pattern.e[0]), makePattern(pattern.e[1], elements)); + case "value": + return createValue(pattern.text); + case "data": + p = pattern.a && pattern.a.type; + if(p === undefined) { + p = "" + } + return createData(p); + case "list": + return createList() + } + throw"No support for " + pattern.name; + }; + this.makePattern = function(pattern, elements) { + var copy = {}, i; + for(i in elements) { + if(elements.hasOwnProperty(i)) { + copy[i] = elements[i] + } + } + i = makePattern(pattern, copy); + return i + }; + this.validate = function validate(walker, callback) { + var errors; + walker.currentNode = walker.root; + errors = childDeriv(null, rootPattern, walker); + if(!errors.nullable) { + runtime.log("Error in Relax NG validation: " + errors); + callback(["Error in Relax NG validation: " + errors]) + }else { + callback(null) + } + }; + this.init = function init(rootPattern1) { + rootPattern = rootPattern1 + } +}; +runtime.loadClass("xmldom.RelaxNGParser"); +xmldom.RelaxNG2 = function RelaxNG2() { + var start, validateNonEmptyPattern, nsmap, depth = 0, p = " "; + function RelaxNGParseError(error, context) { + this.message = function() { + if(context) { + error += context.nodeType === 1 ? " Element " : " Node "; + error += context.nodeName; + if(context.nodeValue) { + error += " with value '" + context.nodeValue + "'" + } + error += "." + } + return error + } + } + function validateOneOrMore(elementdef, walker, element) { + var node, i = 0, err; + do { + node = walker.currentNode; + err = validateNonEmptyPattern(elementdef.e[0], walker, element); + i += 1 + }while(!err && node !== walker.currentNode); + if(i > 1) { + walker.currentNode = node; + return null + } + return err + } + function qName(node) { + return nsmap[node.namespaceURI] + ":" + node.localName + } + function isWhitespace(node) { + return node && node.nodeType === 3 && /^\s+$/.test(node.nodeValue) + } + function validatePattern(elementdef, walker, element, data) { + if(elementdef.name === "empty") { + return null + } + return validateNonEmptyPattern(elementdef, walker, element, data) + } + function validateAttribute(elementdef, walker, element) { + if(elementdef.e.length !== 2) { + throw"Attribute with wrong # of elements: " + elementdef.e.length; + } + var att, a, l = elementdef.localnames.length, i; + for(i = 0;i < l;i += 1) { + a = element.getAttributeNS(elementdef.namespaces[i], elementdef.localnames[i]); + if(a === "" && !element.hasAttributeNS(elementdef.namespaces[i], elementdef.localnames[i])) { + a = undefined + } + if(att !== undefined && a !== undefined) { + return[new RelaxNGParseError("Attribute defined too often.", element)] + } + att = a + } + if(att === undefined) { + return[new RelaxNGParseError("Attribute not found: " + elementdef.names, element)] + } + return validatePattern(elementdef.e[1], walker, element, att) + } + function validateTop(elementdef, walker, element) { + return validatePattern(elementdef, walker, element) + } + function validateElement(elementdef, walker, element) { + if(elementdef.e.length !== 2) { + throw"Element with wrong # of elements: " + elementdef.e.length; + } + depth += 1; + var node = walker.currentNode, type = node ? node.nodeType : 0, error = null; + while(type > 1) { + if(type !== 8 && (type !== 3 || !/^\s+$/.test(walker.currentNode.nodeValue))) { + depth -= 1; + return[new RelaxNGParseError("Not allowed node of type " + type + ".")] + } + node = walker.nextSibling(); + type = node ? node.nodeType : 0 + } + if(!node) { + depth -= 1; + return[new RelaxNGParseError("Missing element " + elementdef.names)] + } + if(elementdef.names && elementdef.names.indexOf(qName(node)) === -1) { + depth -= 1; + return[new RelaxNGParseError("Found " + node.nodeName + " instead of " + elementdef.names + ".", node)] + } + if(walker.firstChild()) { + error = validateTop(elementdef.e[1], walker, node); + while(walker.nextSibling()) { + type = walker.currentNode.nodeType; + if(!isWhitespace(walker.currentNode) && type !== 8) { + depth -= 1; + return[new RelaxNGParseError("Spurious content.", walker.currentNode)] + } + } + if(walker.parentNode() !== node) { + depth -= 1; + return[new RelaxNGParseError("Implementation error.")] + } + }else { + error = validateTop(elementdef.e[1], walker, node) + } + depth -= 1; + node = walker.nextSibling(); + return error + } + function validateChoice(elementdef, walker, element, data) { + if(elementdef.e.length !== 2) { + throw"Choice with wrong # of options: " + elementdef.e.length; + } + var node = walker.currentNode, err; + if(elementdef.e[0].name === "empty") { + err = validateNonEmptyPattern(elementdef.e[1], walker, element, data); + if(err) { + walker.currentNode = node + } + return null + } + err = validatePattern(elementdef.e[0], walker, element, data); + if(err) { + walker.currentNode = node; + err = validateNonEmptyPattern(elementdef.e[1], walker, element, data) + } + return err + } + function validateInterleave(elementdef, walker, element) { + var l = elementdef.e.length, n = [l], err, i, todo = l, donethisround, node, subnode, e; + while(todo > 0) { + donethisround = 0; + node = walker.currentNode; + for(i = 0;i < l;i += 1) { + subnode = walker.currentNode; + if(n[i] !== true && n[i] !== subnode) { + e = elementdef.e[i]; + err = validateNonEmptyPattern(e, walker, element); + if(err) { + walker.currentNode = subnode; + if(n[i] === undefined) { + n[i] = false + } + }else { + if(subnode === walker.currentNode || e.name === "oneOrMore" || e.name === "choice" && (e.e[0].name === "oneOrMore" || e.e[1].name === "oneOrMore")) { + donethisround += 1; + n[i] = subnode + }else { + donethisround += 1; + n[i] = true + } + } + } + } + if(node === walker.currentNode && donethisround === todo) { + return null + } + if(donethisround === 0) { + for(i = 0;i < l;i += 1) { + if(n[i] === false) { + return[new RelaxNGParseError("Interleave does not match.", element)] + } + } + return null + } + todo = 0; + for(i = 0;i < l;i += 1) { + if(n[i] !== true) { + todo += 1 + } + } + } + return null + } + function validateGroup(elementdef, walker, element) { + if(elementdef.e.length !== 2) { + throw"Group with wrong # of members: " + elementdef.e.length; + } + return validateNonEmptyPattern(elementdef.e[0], walker, element) || validateNonEmptyPattern(elementdef.e[1], walker, element) + } + function validateText(elementdef, walker, element) { + var node = walker.currentNode, type = node ? node.nodeType : 0, error = null; + while(node !== element && type !== 3) { + if(type === 1) { + return[new RelaxNGParseError("Element not allowed here.", node)] + } + node = walker.nextSibling(); + type = node ? node.nodeType : 0 + } + walker.nextSibling(); + return null + } + validateNonEmptyPattern = function validateNonEmptyPattern(elementdef, walker, element, data) { + var name = elementdef.name, err = null; + if(name === "text") { + err = validateText(elementdef, walker, element) + }else { + if(name === "data") { + err = null + }else { + if(name === "value") { + if(data !== elementdef.text) { + err = [new RelaxNGParseError("Wrong value, should be '" + elementdef.text + "', not '" + data + "'", element)] + } + }else { + if(name === "list") { + err = null + }else { + if(name === "attribute") { + err = validateAttribute(elementdef, walker, element) + }else { + if(name === "element") { + err = validateElement(elementdef, walker, element) + }else { + if(name === "oneOrMore") { + err = validateOneOrMore(elementdef, walker, element) + }else { + if(name === "choice") { + err = validateChoice(elementdef, walker, element, data) + }else { + if(name === "group") { + err = validateGroup(elementdef, walker, element) + }else { + if(name === "interleave") { + err = validateInterleave(elementdef, walker, element) + }else { + throw name + " not allowed in nonEmptyPattern."; + } + } + } + } + } + } + } + } + } + } + return err + }; + this.validate = function validate(walker, callback) { + walker.currentNode = walker.root; + var errors = validatePattern(start.e[0], walker, walker.root); + callback(errors) + }; + this.init = function init(start1, nsmap1) { + start = start1; + nsmap = nsmap1 + } +}; +xmldom.OperationalTransformInterface = function() { +}; +xmldom.OperationalTransformInterface.prototype.retain = function(amount) { +}; +xmldom.OperationalTransformInterface.prototype.insertCharacters = function(chars) { +}; +xmldom.OperationalTransformInterface.prototype.insertElementStart = function(tagname, attributes) { +}; +xmldom.OperationalTransformInterface.prototype.insertElementEnd = function() { +}; +xmldom.OperationalTransformInterface.prototype.deleteCharacters = function(amount) { +}; +xmldom.OperationalTransformInterface.prototype.deleteElementStart = function() { +}; +xmldom.OperationalTransformInterface.prototype.deleteElementEnd = function() { +}; +xmldom.OperationalTransformInterface.prototype.replaceAttributes = function(atts) { +}; +xmldom.OperationalTransformInterface.prototype.updateAttributes = function(atts) { +}; +xmldom.OperationalTransformDOM = function OperationalTransformDOM(root, serializer) { + var pos, length; + function retain(amount) { + } + function insertCharacters(chars) { + } + function insertElementStart(tagname, attributes) { + } + function insertElementEnd() { + } + function deleteCharacters(amount) { + } + function deleteElementStart() { + } + function deleteElementEnd() { + } + function replaceAttributes(atts) { + } + function updateAttributes(atts) { + } + function atEnd() { + return pos === length + } + this.retain = retain; + this.insertCharacters = insertCharacters; + this.insertElementStart = insertElementStart; + this.insertElementEnd = insertElementEnd; + this.deleteCharacters = deleteCharacters; + this.deleteElementStart = deleteElementStart; + this.deleteElementEnd = deleteElementEnd; + this.replaceAttributes = replaceAttributes; + this.updateAttributes = updateAttributes; + this.atEnd = atEnd +}; +xmldom.XPath = function() { + var createXPathPathIterator, parsePredicates; + function isSmallestPositive(a, b, c) { + return a !== -1 && (a < b || b === -1) && (a < c || c === -1) + } + function parseXPathStep(xpath, pos, end, steps) { + var location = "", predicates = [], value, brapos = xpath.indexOf("[", pos), slapos = xpath.indexOf("/", pos), eqpos = xpath.indexOf("=", pos), depth = 0, start = 0; + if(isSmallestPositive(slapos, brapos, eqpos)) { + location = xpath.substring(pos, slapos); + pos = slapos + 1 + }else { + if(isSmallestPositive(brapos, slapos, eqpos)) { + location = xpath.substring(pos, brapos); + pos = parsePredicates(xpath, brapos, predicates) + }else { + if(isSmallestPositive(eqpos, slapos, brapos)) { + location = xpath.substring(pos, eqpos); + pos = eqpos + }else { + location = xpath.substring(pos, end); + pos = end + } + } + } + steps.push({location:location, predicates:predicates}); + return pos + } + function parseXPath(xpath) { + var steps = [], p = 0, end = xpath.length, value; + while(p < end) { + p = parseXPathStep(xpath, p, end, steps); + if(p < end && xpath[p] === "=") { + value = xpath.substring(p + 1, end); + if(value.length > 2 && (value[0] === "'" || value[0] === '"')) { + value = value.slice(1, value.length - 1) + }else { + try { + value = parseInt(value, 10) + }catch(e) { + } + } + p = end + } + } + return{steps:steps, value:value} + } + parsePredicates = function parsePredicates(xpath, start, predicates) { + var pos = start, l = xpath.length, selector, depth = 0; + while(pos < l) { + if(xpath[pos] === "]") { + depth -= 1; + if(depth <= 0) { + predicates.push(parseXPath(xpath.substring(start, pos))) + } + }else { + if(xpath[pos] === "[") { + if(depth <= 0) { + start = pos + 1 + } + depth += 1 + } + } + pos += 1 + } + return pos + }; + function XPathIterator() { + } + XPathIterator.prototype.next = function() { + }; + XPathIterator.prototype.reset = function() { + }; + function NodeIterator() { + var node, done = false; + this.setNode = function setNode(n) { + node = n + }; + this.reset = function() { + done = false + }; + this.next = function next() { + var val = done ? null : node; + done = true; + return val + } + } + function AttributeIterator(it, namespace, localName) { + this.reset = function reset() { + it.reset() + }; + this.next = function next() { + var node = it.next(), attr; + while(node) { + node = node.getAttributeNodeNS(namespace, localName); + if(node) { + return node + } + node = it.next() + } + return node + } + } + function AllChildElementIterator(it, recurse) { + var root = it.next(), node = null; + this.reset = function reset() { + it.reset(); + root = it.next(); + node = null + }; + this.next = function next() { + while(root) { + if(node) { + if(recurse && node.firstChild) { + node = node.firstChild + }else { + while(!node.nextSibling && node !== root) { + node = node.parentNode + } + if(node === root) { + root = it.next() + }else { + node = node.nextSibling + } + } + }else { + do { + node = root.firstChild; + if(!node) { + root = it.next() + } + }while(root && !node) + } + if(node && node.nodeType === 1) { + return node + } + } + return null + } + } + function ConditionIterator(it, condition) { + this.reset = function reset() { + it.reset() + }; + this.next = function next() { + var n = it.next(); + while(n && !condition(n)) { + n = it.next() + } + return n + } + } + function createNodenameFilter(it, name, namespaceResolver) { + var s = name.split(":", 2), namespace = namespaceResolver(s[0]), localName = s[1]; + return new ConditionIterator(it, function(node) { + return node.localName === localName && node.namespaceURI === namespace + }) + } + function createPredicateFilteredIterator(it, p, namespaceResolver) { + var nit = new NodeIterator, pit = createXPathPathIterator(nit, p, namespaceResolver), value = p.value; + if(value === undefined) { + return new ConditionIterator(it, function(node) { + nit.setNode(node); + pit.reset(); + return pit.next() + }) + } + return new ConditionIterator(it, function(node) { + nit.setNode(node); + pit.reset(); + var n = pit.next(); + return n && n.nodeValue === value + }) + } + createXPathPathIterator = function createXPathPathIterator(it, xpath, namespaceResolver) { + var i, j, step, location, namespace, localName, prefix, p; + for(i = 0;i < xpath.steps.length;i += 1) { + step = xpath.steps[i]; + location = step.location; + if(location === "") { + it = new AllChildElementIterator(it, false) + }else { + if(location[0] === "@") { + p = location.slice(1).split(":", 2); + it = new AttributeIterator(it, namespaceResolver(p[0]), p[1]) + }else { + if(location !== ".") { + it = new AllChildElementIterator(it, false); + if(location.indexOf(":") !== -1) { + it = createNodenameFilter(it, location, namespaceResolver) + } + } + } + } + for(j = 0;j < step.predicates.length;j += 1) { + p = step.predicates[j]; + it = createPredicateFilteredIterator(it, p, namespaceResolver) + } + } + return it + }; + function fallback(node, xpath, namespaceResolver) { + var it = new NodeIterator, i, nodelist, parsedXPath, pos; + it.setNode(node); + parsedXPath = parseXPath(xpath); + it = createXPathPathIterator(it, parsedXPath, namespaceResolver); + nodelist = []; + i = it.next(); + while(i) { + nodelist.push(i); + i = it.next() + } + return nodelist + } + function getODFElementsWithXPath(node, xpath, namespaceResolver) { + var doc = node.ownerDocument, nodes, elements = [], n = null; + if(!doc || !doc.evaluate || !n) { + elements = fallback(node, xpath, namespaceResolver) + }else { + nodes = doc.evaluate(xpath, node, namespaceResolver, XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); + n = nodes.iterateNext(); + while(n !== null) { + if(n.nodeType === 1) { + elements.push(n) + } + n = nodes.iterateNext() + } + } + return elements + } + xmldom.XPath = function XPath() { + this.getODFElementsWithXPath = getODFElementsWithXPath + }; + return xmldom.XPath +}(); +odf.StyleInfo = function StyleInfo() { + var chartns = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0", dbns = "urn:oasis:names:tc:opendocument:xmlns:database:1.0", dr3dns = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0", drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", formns = "urn:oasis:names:tc:opendocument:xmlns:form:1.0", numberns = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0", officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", + presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", elementstyles = {"text":[{ens:stylens, en:"tab-stop", ans:stylens, a:"leader-text-style"}, {ens:stylens, en:"drop-cap", ans:stylens, a:"style-name"}, {ens:textns, en:"notes-configuration", + ans:textns, a:"citation-body-style-name"}, {ens:textns, en:"notes-configuration", ans:textns, a:"citation-style-name"}, {ens:textns, en:"a", ans:textns, a:"style-name"}, {ens:textns, en:"alphabetical-index", ans:textns, a:"style-name"}, {ens:textns, en:"linenumbering-configuration", ans:textns, a:"style-name"}, {ens:textns, en:"list-level-style-number", ans:textns, a:"style-name"}, {ens:textns, en:"ruby-text", ans:textns, a:"style-name"}, {ens:textns, en:"span", ans:textns, a:"style-name"}, {ens:textns, + en:"a", ans:textns, a:"visited-style-name"}, {ens:stylens, en:"text-properties", ans:stylens, a:"text-line-through-text-style"}, {ens:textns, en:"alphabetical-index-source", ans:textns, a:"main-entry-style-name"}, {ens:textns, en:"index-entry-bibliography", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-chapter", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-link-end", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-link-start", ans:textns, a:"style-name"}, {ens:textns, + en:"index-entry-page-number", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-span", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-tab-stop", ans:textns, a:"style-name"}, {ens:textns, en:"index-entry-text", ans:textns, a:"style-name"}, {ens:textns, en:"index-title-template", ans:textns, a:"style-name"}, {ens:textns, en:"list-level-style-bullet", ans:textns, a:"style-name"}, {ens:textns, en:"outline-level-style", ans:textns, a:"style-name"}], "paragraph":[{ens:drawns, en:"caption", + ans:drawns, a:"text-style-name"}, {ens:drawns, en:"circle", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"connector", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"control", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"custom-shape", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"ellipse", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"frame", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"line", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"measure", ans:drawns, + a:"text-style-name"}, {ens:drawns, en:"path", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"polygon", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"polyline", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"rect", ans:drawns, a:"text-style-name"}, {ens:drawns, en:"regular-polygon", ans:drawns, a:"text-style-name"}, {ens:officens, en:"annotation", ans:drawns, a:"text-style-name"}, {ens:formns, en:"column", ans:formns, a:"text-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"next-style-name"}, + {ens:tablens, en:"body", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"even-columns", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"even-rows", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"first-column", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"first-row", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"last-column", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"last-row", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, + en:"odd-columns", ans:tablens, a:"paragraph-style-name"}, {ens:tablens, en:"odd-rows", ans:tablens, a:"paragraph-style-name"}, {ens:textns, en:"notes-configuration", ans:textns, a:"default-style-name"}, {ens:textns, en:"alphabetical-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"bibliography-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"h", ans:textns, a:"style-name"}, {ens:textns, en:"illustration-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, + en:"index-source-style", ans:textns, a:"style-name"}, {ens:textns, en:"object-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"p", ans:textns, a:"style-name"}, {ens:textns, en:"table-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"table-of-content-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"table-index-entry-template", ans:textns, a:"style-name"}, {ens:textns, en:"user-index-entry-template", ans:textns, a:"style-name"}, {ens:stylens, en:"page-layout-properties", + ans:stylens, a:"register-truth-ref-style-name"}], "chart":[{ens:chartns, en:"axis", ans:chartns, a:"style-name"}, {ens:chartns, en:"chart", ans:chartns, a:"style-name"}, {ens:chartns, en:"data-label", ans:chartns, a:"style-name"}, {ens:chartns, en:"data-point", ans:chartns, a:"style-name"}, {ens:chartns, en:"equation", ans:chartns, a:"style-name"}, {ens:chartns, en:"error-indicator", ans:chartns, a:"style-name"}, {ens:chartns, en:"floor", ans:chartns, a:"style-name"}, {ens:chartns, en:"footer", + ans:chartns, a:"style-name"}, {ens:chartns, en:"grid", ans:chartns, a:"style-name"}, {ens:chartns, en:"legend", ans:chartns, a:"style-name"}, {ens:chartns, en:"mean-value", ans:chartns, a:"style-name"}, {ens:chartns, en:"plot-area", ans:chartns, a:"style-name"}, {ens:chartns, en:"regression-curve", ans:chartns, a:"style-name"}, {ens:chartns, en:"series", ans:chartns, a:"style-name"}, {ens:chartns, en:"stock-gain-marker", ans:chartns, a:"style-name"}, {ens:chartns, en:"stock-loss-marker", ans:chartns, + a:"style-name"}, {ens:chartns, en:"stock-range-line", ans:chartns, a:"style-name"}, {ens:chartns, en:"subtitle", ans:chartns, a:"style-name"}, {ens:chartns, en:"title", ans:chartns, a:"style-name"}, {ens:chartns, en:"wall", ans:chartns, a:"style-name"}], "section":[{ens:textns, en:"alphabetical-index", ans:textns, a:"style-name"}, {ens:textns, en:"bibliography", ans:textns, a:"style-name"}, {ens:textns, en:"illustration-index", ans:textns, a:"style-name"}, {ens:textns, en:"index-title", ans:textns, + a:"style-name"}, {ens:textns, en:"object-index", ans:textns, a:"style-name"}, {ens:textns, en:"section", ans:textns, a:"style-name"}, {ens:textns, en:"table-of-content", ans:textns, a:"style-name"}, {ens:textns, en:"table-index", ans:textns, a:"style-name"}, {ens:textns, en:"user-index", ans:textns, a:"style-name"}], "ruby":[{ens:textns, en:"ruby", ans:textns, a:"style-name"}], "table":[{ens:dbns, en:"query", ans:dbns, a:"style-name"}, {ens:dbns, en:"table-representation", ans:dbns, a:"style-name"}, + {ens:tablens, en:"background", ans:tablens, a:"style-name"}, {ens:tablens, en:"table", ans:tablens, a:"style-name"}], "table-column":[{ens:dbns, en:"column", ans:dbns, a:"style-name"}, {ens:tablens, en:"table-column", ans:tablens, a:"style-name"}], "table-row":[{ens:dbns, en:"query", ans:dbns, a:"default-row-style-name"}, {ens:dbns, en:"table-representation", ans:dbns, a:"default-row-style-name"}, {ens:tablens, en:"table-row", ans:tablens, a:"style-name"}], "table-cell":[{ens:dbns, en:"column", + ans:dbns, a:"default-cell-style-name"}, {ens:tablens, en:"table-column", ans:tablens, a:"default-cell-style-name"}, {ens:tablens, en:"table-row", ans:tablens, a:"default-cell-style-name"}, {ens:tablens, en:"body", ans:tablens, a:"style-name"}, {ens:tablens, en:"covered-table-cell", ans:tablens, a:"style-name"}, {ens:tablens, en:"even-columns", ans:tablens, a:"style-name"}, {ens:tablens, en:"covered-table-cell", ans:tablens, a:"style-name"}, {ens:tablens, en:"even-columns", ans:tablens, a:"style-name"}, + {ens:tablens, en:"even-rows", ans:tablens, a:"style-name"}, {ens:tablens, en:"first-column", ans:tablens, a:"style-name"}, {ens:tablens, en:"first-row", ans:tablens, a:"style-name"}, {ens:tablens, en:"last-column", ans:tablens, a:"style-name"}, {ens:tablens, en:"last-row", ans:tablens, a:"style-name"}, {ens:tablens, en:"odd-columns", ans:tablens, a:"style-name"}, {ens:tablens, en:"odd-rows", ans:tablens, a:"style-name"}, {ens:tablens, en:"table-cell", ans:tablens, a:"style-name"}], "graphic":[{ens:dr3dns, + en:"cube", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"extrude", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"rotate", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"scene", ans:drawns, a:"style-name"}, {ens:dr3dns, en:"sphere", ans:drawns, a:"style-name"}, {ens:drawns, en:"caption", ans:drawns, a:"style-name"}, {ens:drawns, en:"circle", ans:drawns, a:"style-name"}, {ens:drawns, en:"connector", ans:drawns, a:"style-name"}, {ens:drawns, en:"control", ans:drawns, a:"style-name"}, {ens:drawns, en:"custom-shape", + ans:drawns, a:"style-name"}, {ens:drawns, en:"ellipse", ans:drawns, a:"style-name"}, {ens:drawns, en:"frame", ans:drawns, a:"style-name"}, {ens:drawns, en:"g", ans:drawns, a:"style-name"}, {ens:drawns, en:"line", ans:drawns, a:"style-name"}, {ens:drawns, en:"measure", ans:drawns, a:"style-name"}, {ens:drawns, en:"page-thumbnail", ans:drawns, a:"style-name"}, {ens:drawns, en:"path", ans:drawns, a:"style-name"}, {ens:drawns, en:"polygon", ans:drawns, a:"style-name"}, {ens:drawns, en:"polyline", ans:drawns, + a:"style-name"}, {ens:drawns, en:"rect", ans:drawns, a:"style-name"}, {ens:drawns, en:"regular-polygon", ans:drawns, a:"style-name"}, {ens:officens, en:"annotation", ans:drawns, a:"style-name"}], "presentation":[{ens:dr3dns, en:"cube", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"extrude", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"rotate", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"scene", ans:presentationns, a:"style-name"}, {ens:dr3dns, en:"sphere", ans:presentationns, + a:"style-name"}, {ens:drawns, en:"caption", ans:presentationns, a:"style-name"}, {ens:drawns, en:"circle", ans:presentationns, a:"style-name"}, {ens:drawns, en:"connector", ans:presentationns, a:"style-name"}, {ens:drawns, en:"control", ans:presentationns, a:"style-name"}, {ens:drawns, en:"custom-shape", ans:presentationns, a:"style-name"}, {ens:drawns, en:"ellipse", ans:presentationns, a:"style-name"}, {ens:drawns, en:"frame", ans:presentationns, a:"style-name"}, {ens:drawns, en:"g", ans:presentationns, + a:"style-name"}, {ens:drawns, en:"line", ans:presentationns, a:"style-name"}, {ens:drawns, en:"measure", ans:presentationns, a:"style-name"}, {ens:drawns, en:"page-thumbnail", ans:presentationns, a:"style-name"}, {ens:drawns, en:"path", ans:presentationns, a:"style-name"}, {ens:drawns, en:"polygon", ans:presentationns, a:"style-name"}, {ens:drawns, en:"polyline", ans:presentationns, a:"style-name"}, {ens:drawns, en:"rect", ans:presentationns, a:"style-name"}, {ens:drawns, en:"regular-polygon", + ans:presentationns, a:"style-name"}, {ens:officens, en:"annotation", ans:presentationns, a:"style-name"}], "drawing-page":[{ens:drawns, en:"page", ans:drawns, a:"style-name"}, {ens:presentationns, en:"notes", ans:drawns, a:"style-name"}, {ens:stylens, en:"handout-master", ans:drawns, a:"style-name"}, {ens:stylens, en:"master-page", ans:drawns, a:"style-name"}], "list-style":[{ens:textns, en:"list", ans:textns, a:"style-name"}, {ens:textns, en:"numbered-paragraph", ans:textns, a:"style-name"}, {ens:textns, + en:"list-item", ans:textns, a:"style-override"}, {ens:stylens, en:"style", ans:stylens, a:"list-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"data-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"percentage-data-style-name"}, {ens:presentationns, en:"date-time-decl", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"database-display", ans:stylens, + a:"data-style-name"}, {ens:textns, en:"date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"editing-duration", ans:stylens, a:"data-style-name"}, {ens:textns, en:"expression", ans:stylens, a:"data-style-name"}, {ens:textns, en:"meta-field", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"print-date", ans:stylens, a:"data-style-name"}, {ens:textns, + en:"print-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"table-formula", ans:stylens, a:"data-style-name"}, {ens:textns, en:"time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-defined", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-input", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-input", ans:stylens, + a:"data-style-name"}, {ens:textns, en:"variable-set", ans:stylens, a:"data-style-name"}], "data":[{ens:stylens, en:"style", ans:stylens, a:"data-style-name"}, {ens:stylens, en:"style", ans:stylens, a:"percentage-data-style-name"}, {ens:presentationns, en:"date-time-decl", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"creation-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"database-display", ans:stylens, a:"data-style-name"}, + {ens:textns, en:"date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"editing-duration", ans:stylens, a:"data-style-name"}, {ens:textns, en:"expression", ans:stylens, a:"data-style-name"}, {ens:textns, en:"meta-field", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"modification-time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"print-date", ans:stylens, a:"data-style-name"}, {ens:textns, en:"print-time", + ans:stylens, a:"data-style-name"}, {ens:textns, en:"table-formula", ans:stylens, a:"data-style-name"}, {ens:textns, en:"time", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-defined", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"user-field-input", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-get", ans:stylens, a:"data-style-name"}, {ens:textns, en:"variable-input", ans:stylens, a:"data-style-name"}, + {ens:textns, en:"variable-set", ans:stylens, a:"data-style-name"}], "page-layout":[{ens:presentationns, en:"notes", ans:stylens, a:"page-layout-name"}, {ens:stylens, en:"handout-master", ans:stylens, a:"page-layout-name"}, {ens:stylens, en:"master-page", ans:stylens, a:"page-layout-name"}]}, elements; + function canElementHaveStyle(family, element) { + var elname = elements[element.localName], elns = elname && elname[element.namespaceURI], length = elns ? elns.length : 0, i; + return elns && elns.length > 0 + } + function getStyleRef(family, element) { + var elname = elements[element.localName], elns = elname && elname[element.namespaceURI], length = elns ? elns.length : 0, i, attr; + for(i = 0;i < length;i += 1) { + attr = element.getAttributeNS(elns[i].ns, elns[i].localname) + } + return null + } + function getUsedStylesForAutomatic(element, keys) { + var elname = elements[element.localName], elns = elname && elname[element.namespaceURI], length = elns ? elns.length : 0, i, attr, group, map, e; + for(i = 0;i < length;i += 1) { + attr = element.getAttributeNS(elns[i].ns, elns[i].localname); + if(attr) { + group = elns[i].keygroup; + map = keys[group]; + if(!map) { + map = keys[group] = {} + } + map[attr] = 1 + } + } + i = element.firstChild; + while(i) { + if(i.nodeType === 1) { + e = i; + getUsedStylesForAutomatic(e, keys) + } + i = i.nextSibling + } + } + function inverse(elementstyles) { + var keyname, i, list, item, l, elements = {}, map, array; + for(keyname in elementstyles) { + if(elementstyles.hasOwnProperty(keyname)) { + list = elementstyles[keyname]; + l = list.length; + for(i = 0;i < l;i += 1) { + item = list[i]; + map = elements[item.en] = elements[item.en] || {}; + array = map[item.ens] = map[item.ens] || []; + array.push({ns:item.ans, localname:item.a, keygroup:keyname}) + } + } + } + return elements + } + this.UsedKeysList = function(element) { + var usedKeys = {}; + this.uses = function(element) { + var localName = element.localName, name = element.getAttributeNS(drawns, "name") || element.getAttributeNS(stylens, "name"), keyName, map; + if(localName === "style") { + keyName = element.getAttributeNS(stylens, "family") + }else { + if(element.namespaceURI === numberns) { + keyName = "data" + }else { + keyName = localName + } + } + map = usedKeys[keyName]; + return map ? map[name] > 0 : false + }; + getUsedStylesForAutomatic(element, usedKeys) + }; + this.canElementHaveStyle = canElementHaveStyle; + elements = inverse(elementstyles) +}; +odf.Style2CSS = function Style2CSS() { + var xlinkns = "http://www.w3.org/1999/xlink", drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", + textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", namespaces = {"draw":drawns, "fo":fons, "office":officens, "presentation":presentationns, "style":stylens, "svg":svgns, "table":tablens, "text":textns, "xlink":xlinkns}, familynamespaceprefixes = {"graphic":"draw", "paragraph":"text", "presentation":"presentation", "ruby":"text", "section":"text", "table":"table", "table-cell":"table", "table-column":"table", "table-row":"table", "text":"text", "list":"text"}, familytagnames = {"graphic":["circle", + "connected", "control", "custom-shape", "ellipse", "frame", "g", "line", "measure", "page", "page-thumbnail", "path", "polygon", "polyline", "rect", "regular-polygon"], "paragraph":["alphabetical-index-entry-template", "h", "illustration-index-entry-template", "index-source-style", "object-index-entry-template", "p", "table-index-entry-template", "table-of-content-entry-template", "user-index-entry-template"], "presentation":["caption", "circle", "connector", "control", "custom-shape", "ellipse", + "frame", "g", "line", "measure", "page-thumbnail", "path", "polygon", "polyline", "rect", "regular-polygon"], "ruby":["ruby", "ruby-text"], "section":["alphabetical-index", "bibliography", "illustration-index", "index-title", "object-index", "section", "table-of-content", "table-index", "user-index"], "table":["background", "table"], "table-cell":["body", "covered-table-cell", "even-columns", "even-rows", "first-column", "first-row", "last-column", "last-row", "odd-columns", "odd-rows", "table-cell"], + "table-column":["table-column"], "table-row":["table-row"], "text":["a", "index-entry-chapter", "index-entry-link-end", "index-entry-link-start", "index-entry-page-number", "index-entry-span", "index-entry-tab-stop", "index-entry-text", "index-title-template", "linenumbering-configuration", "list-level-style-number", "list-level-style-bullet", "outline-level-style", "span"], "list":["list-item"]}, textPropertySimpleMapping = [[fons, "color", "color"], [fons, "background-color", "background-color"], + [fons, "font-weight", "font-weight"], [fons, "font-style", "font-style"], [fons, "font-size", "font-size"]], bgImageSimpleMapping = [[stylens, "repeat", "background-repeat"]], paragraphPropertySimpleMapping = [[fons, "background-color", "background-color"], [fons, "text-align", "text-align"], [fons, "padding-left", "padding-left"], [fons, "padding-right", "padding-right"], [fons, "padding-top", "padding-top"], [fons, "padding-bottom", "padding-bottom"], [fons, "border-left", "border-left"], [fons, + "border-right", "border-right"], [fons, "border-top", "border-top"], [fons, "border-bottom", "border-bottom"], [fons, "margin-left", "margin-left"], [fons, "margin-right", "margin-right"], [fons, "margin-top", "margin-top"], [fons, "margin-bottom", "margin-bottom"], [fons, "border", "border"]], graphicPropertySimpleMapping = [[drawns, "fill-color", "background-color"], [drawns, "fill", "background"], [fons, "min-height", "min-height"], [drawns, "stroke", "border"], [svgns, "stroke-color", "border-color"]], + tablecellPropertySimpleMapping = [[fons, "background-color", "background-color"], [fons, "border-left", "border-left"], [fons, "border-right", "border-right"], [fons, "border-top", "border-top"], [fons, "border-bottom", "border-bottom"]]; + function namespaceResolver(prefix) { + return namespaces[prefix] || null + } + function getStyleMap(doc, stylesnode) { + var stylemap = {}, node, name, family, map; + if(!stylesnode) { + return stylemap + } + node = stylesnode.firstChild; + while(node) { + if(node.namespaceURI === stylens && node.localName === "style") { + family = node.getAttributeNS(stylens, "family") + }else { + if(node.namespaceURI === textns && node.localName === "list-style") { + family = "list" + } + } + name = family && node.getAttributeNS && node.getAttributeNS(stylens, "name"); + if(name) { + if(!stylemap[family]) { + stylemap[family] = {} + } + stylemap[family][name] = node + } + node = node.nextSibling + } + return stylemap + } + function findStyle(stylestree, name) { + if(!name || !stylestree) { + return null + } + if(stylestree[name]) { + return stylestree[name] + } + var derivedStyles = stylestree.derivedStyles, n, style; + for(n in stylestree) { + if(stylestree.hasOwnProperty(n)) { + style = findStyle(stylestree[n].derivedStyles, name); + if(style) { + return style + } + } + } + return null + } + function addStyleToStyleTree(stylename, stylesmap, stylestree) { + var style = stylesmap[stylename], parentname, parentstyle; + if(!style) { + return + } + parentname = style.getAttributeNS(stylens, "parent-style-name"); + parentstyle = null; + if(parentname) { + parentstyle = findStyle(stylestree, parentname); + if(!parentstyle && stylesmap[parentname]) { + addStyleToStyleTree(parentname, stylesmap, stylestree); + parentstyle = stylesmap[parentname]; + stylesmap[parentname] = null + } + } + if(parentstyle) { + if(!parentstyle.derivedStyles) { + parentstyle.derivedStyles = {} + } + parentstyle.derivedStyles[stylename] = style + }else { + stylestree[stylename] = style + } + } + function addStyleMapToStyleTree(stylesmap, stylestree) { + var name; + for(name in stylesmap) { + if(stylesmap.hasOwnProperty(name)) { + addStyleToStyleTree(name, stylesmap, stylestree); + stylesmap[name] = null + } + } + } + function createSelector(family, name) { + var prefix = familynamespaceprefixes[family], namepart, selector = "", first = true; + if(prefix === null) { + return null + } + namepart = "[" + prefix + '|style-name="' + name + '"]'; + if(prefix === "presentation") { + prefix = "draw"; + namepart = '[presentation|style-name="' + name + '"]' + } + return prefix + "|" + familytagnames[family].join(namepart + "," + prefix + "|") + namepart + } + function getSelectors(family, name, node) { + var selectors = [], n, ss, s; + selectors.push(createSelector(family, name)); + for(n in node.derivedStyles) { + if(node.derivedStyles.hasOwnProperty(n)) { + ss = getSelectors(family, n, node.derivedStyles[n]); + for(s in ss) { + if(ss.hasOwnProperty(s)) { + selectors.push(ss[s]) + } + } + } + } + return selectors + } + function getDirectChild(node, ns, name) { + if(!node) { + return null + } + var c = node.firstChild, e; + while(c) { + if(c.namespaceURI === ns && c.localName === name) { + e = c; + return e + } + c = c.nextSibling + } + return null + } + function applySimpleMapping(props, mapping) { + var rule = "", r, value; + for(r in mapping) { + if(mapping.hasOwnProperty(r)) { + r = mapping[r]; + value = props.getAttributeNS(r[0], r[1]); + if(value) { + rule += r[2] + ":" + value + ";" + } + } + } + return rule + } + function getFontDeclaration(name) { + return'"' + name + '"' + } + function getTextProperties(props) { + var rule = "", value; + rule += applySimpleMapping(props, textPropertySimpleMapping); + value = props.getAttributeNS(stylens, "text-underline-style"); + if(value === "solid") { + rule += "text-decoration: underline;" + } + value = props.getAttributeNS(stylens, "font-name"); + if(value) { + value = getFontDeclaration(value); + if(value) { + rule += "font-family: " + value + ";" + } + } + return rule + } + function getParagraphProperties(props) { + var rule = "", imageProps, url, element; + rule += applySimpleMapping(props, paragraphPropertySimpleMapping); + imageProps = props.getElementsByTagNameNS(stylens, "background-image"); + if(imageProps.length > 0) { + url = imageProps.item(0).getAttributeNS(xlinkns, "href"); + if(url) { + rule += "background-image: url('odfkit:" + url + "');"; + element = imageProps.item(0); + rule += applySimpleMapping(element, bgImageSimpleMapping) + } + } + return rule + } + function getGraphicProperties(props) { + var rule = ""; + rule += applySimpleMapping(props, graphicPropertySimpleMapping); + return rule + } + function getTableCellProperties(props) { + var rule = ""; + rule += applySimpleMapping(props, tablecellPropertySimpleMapping); + return rule + } + function addStyleRule(sheet, family, name, node) { + var selectors = getSelectors(family, name, node), selector = selectors.join(","), rule = "", properties = getDirectChild(node, stylens, "text-properties"); + if(properties) { + rule += getTextProperties(properties) + } + properties = getDirectChild(node, stylens, "paragraph-properties"); + if(properties) { + rule += getParagraphProperties(properties) + } + properties = getDirectChild(node, stylens, "graphic-properties"); + if(properties) { + rule += getGraphicProperties(properties) + } + properties = getDirectChild(node, stylens, "table-cell-properties"); + if(properties) { + rule += getTableCellProperties(properties) + } + if(rule.length === 0) { + return + } + rule = selector + "{" + rule + "}"; + try { + sheet.insertRule(rule, sheet.cssRules.length) + }catch(e) { + throw e; + } + } + function getNumberRule(node) { + var style = node.getAttributeNS(stylens, "num-format"), suffix = node.getAttributeNS(stylens, "num-suffix"), prefix = node.getAttributeNS(stylens, "num-prefix"), rule = "", stylemap = {1:"decimal", "a":"lower-latin", "A":"upper-latin", "i":"lower-roman", "I":"upper-roman"}, content = ""; + content = prefix || ""; + if(stylemap.hasOwnProperty(style)) { + content += " counter(list, " + stylemap[style] + ")" + }else { + if(style) { + content += "'" + style + "';" + }else { + content += " ''" + } + } + if(suffix) { + content += " '" + suffix + "'" + } + rule = "content: " + content + ";"; + return rule + } + function getImageRule(node) { + var rule = "content: none;"; + return rule + } + function getBulletRule(node) { + var rule = "", bulletChar = node.getAttributeNS(textns, "bullet-char"); + return"content: '" + bulletChar + "';" + } + function addListStyleRule(sheet, name, node, itemrule) { + var selector = 'text|list[text|style-name="' + name + '"]', level = node.getAttributeNS(textns, "level"), rule = ""; + level = level && parseInt(level, 10); + while(level > 1) { + selector += " > text|list-item > text|list"; + level -= 1 + } + selector += " > list-item:before"; + rule = itemrule; + rule = selector + "{" + rule + "}"; + try { + sheet.insertRule(rule, sheet.cssRules.length) + }catch(e) { + throw e; + } + } + function addListStyleRules(sheet, name, node) { + var n = node.firstChild, e, itemrule; + while(n) { + if(n.namespaceURI === textns) { + e = n; + if(n.localName === "list-level-style-number") { + itemrule = getNumberRule(e); + addListStyleRule(sheet, name, e, itemrule) + }else { + if(n.localName === "list-level-style-image") { + itemrule = getImageRule(e); + addListStyleRule(sheet, name, e, itemrule) + }else { + if(n.localName === "list-level-style-bullet") { + itemrule = getBulletRule(e); + addListStyleRule(sheet, name, e, itemrule) + } + } + } + } + n = n.nextSibling + } + } + function addRule(sheet, family, name, node) { + if(family === "list") { + addListStyleRules(sheet, name, node) + }else { + addStyleRule(sheet, family, name, node) + } + } + function addRules(sheet, family, name, node) { + addRule(sheet, family, name, node); + var n; + for(n in node.derivedStyles) { + if(node.derivedStyles.hasOwnProperty(n)) { + addRules(sheet, family, n, node.derivedStyles[n]) + } + } + } + this.namespaces = namespaces; + this.namespaceResolver = namespaceResolver; + this.namespaceResolver.lookupNamespaceURI = this.namespaceResolver; + this.style2css = function(stylesheet, styles, autostyles) { + var doc, prefix, styletree, tree, name, rule, family, stylenodes, styleautonodes; + while(stylesheet.cssRules.length) { + stylesheet.deleteRule(stylesheet.cssRules.length - 1) + } + doc = null; + if(styles) { + doc = styles.ownerDocument + } + if(autostyles) { + doc = autostyles.ownerDocument + } + if(!doc) { + return + } + for(prefix in namespaces) { + if(namespaces.hasOwnProperty(prefix)) { + rule = "@namespace " + prefix + " url(" + namespaces[prefix] + ");"; + try { + stylesheet.insertRule(rule, stylesheet.cssRules.length) + }catch(e) { + } + } + } + stylenodes = getStyleMap(doc, styles); + styleautonodes = getStyleMap(doc, autostyles); + styletree = {}; + for(family in familynamespaceprefixes) { + if(familynamespaceprefixes.hasOwnProperty(family)) { + tree = styletree[family] = {}; + addStyleMapToStyleTree(stylenodes[family], tree); + addStyleMapToStyleTree(styleautonodes[family], tree); + for(name in tree) { + if(tree.hasOwnProperty(name)) { + addRules(stylesheet, family, name, tree[name]) + } + } + } + } + } +}; +runtime.loadClass("core.Base64"); +runtime.loadClass("xmldom.XPath"); +runtime.loadClass("odf.Style2CSS"); +odf.FontLoader = function() { + var style2CSS = new odf.Style2CSS, xpath = new xmldom.XPath, base64 = new core.Base64; + function getEmbeddedFontDeclarations(fontFaceDecls) { + var decls = {}, fonts, i, font, name, uris, href; + if(!fontFaceDecls) { + return decls + } + fonts = xpath.getODFElementsWithXPath(fontFaceDecls, "style:font-face[svg:font-face-src]", style2CSS.namespaceResolver); + for(i = 0;i < fonts.length;i += 1) { + font = fonts[i]; + name = font.getAttributeNS(style2CSS.namespaces["style"], "name"); + uris = xpath.getODFElementsWithXPath(font, "svg:font-face-src/svg:font-face-uri", style2CSS.namespaceResolver); + if(uris.length > 0) { + href = uris[0].getAttributeNS(style2CSS.namespaces["xlink"], "href"); + decls[name] = {href:href} + } + } + return decls + } + function addFontToCSS(name, font, fontdata, stylesheet) { + stylesheet = document.styleSheets[0]; + var rule = '@font-face { font-family: "' + name + '"; src: ' + "url(data:application/x-font-ttf;charset=binary;base64," + base64.convertUTF8ArrayToBase64(fontdata) + ') format("truetype"); }'; + try { + stylesheet.insertRule(rule, stylesheet.cssRules.length) + }catch(e) { + runtime.log("Problem inserting rule in CSS: " + rule) + } + } + function loadFontIntoCSS(embeddedFontDeclarations, zip, pos, stylesheet, callback) { + var name, i = 0, n; + for(n in embeddedFontDeclarations) { + if(embeddedFontDeclarations.hasOwnProperty(n)) { + if(i === pos) { + name = n + } + i += 1 + } + } + if(!name) { + return callback() + } + zip.load(embeddedFontDeclarations[name].href, function(err, fontdata) { + if(err) { + runtime.log(err) + }else { + addFontToCSS(name, embeddedFontDeclarations[name], fontdata, stylesheet) + } + return loadFontIntoCSS(embeddedFontDeclarations, zip, pos + 1, stylesheet, callback) + }) + } + function loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet) { + loadFontIntoCSS(embeddedFontDeclarations, zip, 0, stylesheet, function() { + }) + } + odf.FontLoader = function FontLoader() { + var self = this; + this.loadFonts = function(fontFaceDecls, zip, stylesheet) { + var embeddedFontDeclarations = getEmbeddedFontDeclarations(fontFaceDecls); + loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet) + } + }; + return odf.FontLoader +}(); +runtime.loadClass("core.Base64"); +runtime.loadClass("core.Zip"); +runtime.loadClass("xmldom.LSSerializer"); +runtime.loadClass("odf.StyleInfo"); +runtime.loadClass("odf.Style2CSS"); +runtime.loadClass("odf.FontLoader"); +odf.OdfContainer = function() { + var styleInfo = new odf.StyleInfo, style2CSS = new odf.Style2CSS, namespaces = style2CSS.namespaces, officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", manifestns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", nodeorder = ["meta", "settings", "scripts", "font-face-decls", "styles", "automatic-styles", "master-styles", "body"], base64 = new core.Base64, fontLoader = new odf.FontLoader, partMimetypes = {}; + function getDirectChild(node, ns, name) { + node = node ? node.firstChild : null; + while(node) { + if(node.localName === name && node.namespaceURI === ns) { + return node + } + node = node.nextSibling + } + return null + } + function getNodePosition(child) { + var childpos = 0, i, l = nodeorder.length; + for(i = 0;i < l;i += 1) { + if(child.namespaceURI === officens && child.localName === nodeorder[i]) { + return i + } + } + return-1 + } + function OdfNodeFilter(odfroot, usedStylesElement) { + var automaticStyles = odfroot.automaticStyles, usedKeysList; + if(usedStylesElement) { + usedKeysList = new styleInfo.UsedKeysList(usedStylesElement) + } + this.acceptNode = function(node) { + var styleName, styleFamily, result; + if(node.namespaceURI === "http://www.w3.org/1999/xhtml") { + result = 3 + }else { + if(usedKeysList && node.parentNode === automaticStyles && node.nodeType === 1) { + if(usedKeysList.uses(node)) { + result = 1 + }else { + result = 2 + } + }else { + result = 1 + } + } + return result + } + } + function setChild(node, child) { + if(!child) { + return + } + var childpos = getNodePosition(child), pos, c = node.firstChild; + if(childpos === -1) { + return + } + while(c) { + pos = getNodePosition(c); + if(pos !== -1 && pos > childpos) { + break + } + c = c.nextSibling + } + node.insertBefore(child, c) + } + function ODFElement() { + } + function ODFDocumentElement(odfcontainer) { + this.OdfContainer = odfcontainer + } + ODFDocumentElement.prototype = new ODFElement; + ODFDocumentElement.prototype.constructor = ODFDocumentElement; + ODFDocumentElement.namespaceURI = officens; + ODFDocumentElement.localName = "document"; + function OdfPart(name, container, zip) { + var self = this, privatedata; + this.size = 0; + this.type = null; + this.name = name; + this.container = container; + this.url = null; + this.mimetype = null; + this.document = null; + this.onreadystatechange = null; + this.onchange = null; + this.EMPTY = 0; + this.LOADING = 1; + this.DONE = 2; + this.state = this.EMPTY; + this.load = function() { + var mimetype = partMimetypes[name]; + this.mimetype = mimetype; + zip.loadAsDataURL(name, mimetype, function(err, url) { + self.url = url; + if(self.onchange) { + self.onchange(self) + } + if(self.onstatereadychange) { + self.onstatereadychange(self) + } + }) + }; + this.abort = function() { + } + } + OdfPart.prototype.load = function() { + }; + OdfPart.prototype.getUrl = function() { + if(this.data) { + return"data:;base64," + base64.toBase64(this.data) + } + return null + }; + function OdfPartList(odfcontainer) { + var self = this; + this.length = 0; + this.item = function(index) { + } + } + odf.OdfContainer = function OdfContainer(url, onstatereadychange) { + var self = this, zip = null, contentXmlCompletelyLoaded = false; + this.onstatereadychange = onstatereadychange; + this.onchange = null; + this.state = null; + this.rootElement = null; + this.parts = null; + function removeProcessingInstructions(element) { + var n = element.firstChild, next, e; + while(n) { + next = n.nextSibling; + if(n.nodeType === 1) { + e = n; + removeProcessingInstructions(e) + }else { + if(n.nodeType === 7) { + element.removeChild(n) + } + } + n = next + } + } + function importRootNode(xmldoc) { + var doc = self.rootElement.ownerDocument, node; + if(xmldoc) { + removeProcessingInstructions(xmldoc.documentElement); + try { + node = doc.importNode(xmldoc.documentElement, true) + }catch(e) { + } + } + return node + } + function setState(state) { + self.state = state; + if(self.onchange) { + self.onchange(self) + } + if(self.onstatereadychange) { + self.onstatereadychange(self) + } + } + function handleFlatXml(xmldoc) { + var root = importRootNode(xmldoc); + if(!root || root.localName !== "document" || root.namespaceURI !== officens) { + setState(OdfContainer.INVALID); + return + } + self.rootElement = root; + root.fontFaceDecls = getDirectChild(root, officens, "font-face-decls"); + root.styles = getDirectChild(root, officens, "styles"); + root.automaticStyles = getDirectChild(root, officens, "automatic-styles"); + root.masterStyles = getDirectChild(root, officens, "master-styles"); + root.body = getDirectChild(root, officens, "body"); + root.meta = getDirectChild(root, officens, "meta"); + setState(OdfContainer.DONE) + } + function handleStylesXml(xmldoc) { + var node = importRootNode(xmldoc), root = self.rootElement; + if(!node || node.localName !== "document-styles" || node.namespaceURI !== officens) { + setState(OdfContainer.INVALID); + return + } + root.fontFaceDecls = getDirectChild(node, officens, "font-face-decls"); + setChild(root, root.fontFaceDecls); + root.styles = getDirectChild(node, officens, "styles"); + setChild(root, root.styles); + root.automaticStyles = getDirectChild(node, officens, "automatic-styles"); + setChild(root, root.automaticStyles); + root.masterStyles = getDirectChild(node, officens, "master-styles"); + setChild(root, root.masterStyles); + fontLoader.loadFonts(root.fontFaceDecls, zip, null) + } + function handleContentXml(xmldoc) { + var node = importRootNode(xmldoc), root, automaticStyles, fontFaceDecls, c; + if(!node || node.localName !== "document-content" || node.namespaceURI !== officens) { + setState(OdfContainer.INVALID); + return + } + root = self.rootElement; + fontFaceDecls = getDirectChild(node, officens, "font-face-decls"); + if(root.fontFaceDecls && fontFaceDecls) { + c = fontFaceDecls.firstChild; + while(c) { + root.fontFaceDecls.appendChild(c); + c = fontFaceDecls.firstChild + } + }else { + if(fontFaceDecls) { + root.fontFaceDecls = fontFaceDecls; + setChild(root, fontFaceDecls) + } + } + automaticStyles = getDirectChild(node, officens, "automatic-styles"); + if(root.automaticStyles && automaticStyles) { + c = automaticStyles.firstChild; + while(c) { + root.automaticStyles.appendChild(c); + c = automaticStyles.firstChild + } + }else { + if(automaticStyles) { + root.automaticStyles = automaticStyles; + setChild(root, automaticStyles) + } + } + root.body = getDirectChild(node, officens, "body"); + setChild(root, root.body) + } + function handleMetaXml(xmldoc) { + var node = importRootNode(xmldoc), root; + if(!node || node.localName !== "document-meta" || node.namespaceURI !== officens) { + return + } + root = self.rootElement; + root.meta = getDirectChild(node, officens, "meta"); + setChild(root, root.meta) + } + function handleSettingsXml(xmldoc) { + var node = importRootNode(xmldoc), root; + if(!node || node.localName !== "document-settings" || node.namespaceURI !== officens) { + return + } + root = self.rootElement; + root.settings = getDirectChild(node, officens, "settings"); + setChild(root, root.settings) + } + function handleManifestXml(xmldoc) { + var node = importRootNode(xmldoc), root, n; + if(!node || node.localName !== "manifest" || node.namespaceURI !== manifestns) { + return + } + root = self.rootElement; + root.manifest = node; + n = root.manifest.firstChild; + while(n) { + if(n.nodeType === 1 && n.localName === "file-entry" && n.namespaceURI === manifestns) { + partMimetypes[n.getAttributeNS(manifestns, "full-path")] = n.getAttributeNS(manifestns, "media-type") + } + n = n.nextSibling + } + } + function getContentXmlNode(callback) { + var handler = {rootElementReady:function(err, rootxml, done) { + contentXmlCompletelyLoaded = err || done; + if(err) { + return callback(err, null) + } + var parser = new DOMParser; + rootxml = parser.parseFromString(rootxml, "text/xml"); + callback(null, rootxml) + }, bodyChildElementsReady:function(err, nodes, done) { + }}; + zip.loadContentXmlAsFragments("content.xml", handler) + } + function getXmlNode(filepath, callback) { + zip.loadAsDOM(filepath, callback) + } + function loadComponents() { + getXmlNode("styles.xml", function(err, xmldoc) { + handleStylesXml(xmldoc); + if(self.state === OdfContainer.INVALID) { + return + } + getXmlNode("content.xml", function(err, xmldoc) { + handleContentXml(xmldoc); + if(self.state === OdfContainer.INVALID) { + return + } + getXmlNode("meta.xml", function(err, xmldoc) { + handleMetaXml(xmldoc); + if(self.state === OdfContainer.INVALID) { + return + } + getXmlNode("settings.xml", function(err, xmldoc) { + if(xmldoc) { + handleSettingsXml(xmldoc) + } + getXmlNode("META-INF/manifest.xml", function(err, xmldoc) { + if(xmldoc) { + handleManifestXml(xmldoc) + } + if(self.state !== OdfContainer.INVALID) { + setState(OdfContainer.DONE) + } + }) + }) + }) + }) + }) + } + function documentElement(name, map) { + var s = "", i; + for(i in map) { + if(map.hasOwnProperty(i)) { + s += " xmlns:" + i + '="' + map[i] + '"' + } + } + return'' + } + function serializeMetaXml() { + var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-meta", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement); + s += serializer.writeToString(self.rootElement.meta, nsmap); + s += ""; + return s + } + function serializeSettingsXml() { + var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-settings", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement); + s += serializer.writeToString(self.rootElement.settings, nsmap); + s += ""; + return s + } + function serializeStylesXml() { + var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-styles", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement, self.rootElement.masterStyles); + s += serializer.writeToString(self.rootElement.fontFaceDecls, nsmap); + s += serializer.writeToString(self.rootElement.styles, nsmap); + s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); + s += serializer.writeToString(self.rootElement.masterStyles, nsmap); + s += ""; + return s + } + function serializeContentXml() { + var nsmap = style2CSS.namespaces, serializer = new xmldom.LSSerializer, s = documentElement("document-content", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement, self.rootElement.body); + s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); + s += serializer.writeToString(self.rootElement.body, nsmap); + s += ""; + return s + } + function createElement(Type) { + var original = document.createElementNS(Type.namespaceURI, Type.localName), method, iface = new Type; + for(method in iface) { + if(iface.hasOwnProperty(method)) { + original[method] = iface[method] + } + } + return original + } + function loadFromXML(url, callback) { + runtime.loadXML(url, function(err, dom) { + if(err) { + callback(err) + }else { + handleFlatXml(dom) + } + }) + } + this.getPart = function(partname) { + return new OdfPart(partname, self, zip) + }; + this.save = function(callback) { + var data; + data = runtime.byteArrayFromString(serializeSettingsXml(), "utf8"); + zip.save("settings.xml", data, true, new Date); + data = runtime.byteArrayFromString(serializeMetaXml(), "utf8"); + zip.save("meta.xml", data, true, new Date); + data = runtime.byteArrayFromString(serializeStylesXml(), "utf8"); + zip.save("styles.xml", data, true, new Date); + data = runtime.byteArrayFromString(serializeContentXml(), "utf8"); + zip.save("content.xml", data, true, new Date); + zip.write(function(err) { + callback(err) + }) + }; + this.state = OdfContainer.LOADING; + this.rootElement = createElement(ODFDocumentElement); + this.parts = new OdfPartList(this); + zip = new core.Zip(url, function(err, zipobject) { + zip = zipobject; + if(err) { + loadFromXML(url, function(xmlerr) { + if(err) { + zip.error = err + "\n" + xmlerr; + setState(OdfContainer.INVALID) + } + }) + }else { + loadComponents() + } + }) + }; + odf.OdfContainer.EMPTY = 0; + odf.OdfContainer.LOADING = 1; + odf.OdfContainer.DONE = 2; + odf.OdfContainer.INVALID = 3; + odf.OdfContainer.SAVING = 4; + odf.OdfContainer.MODIFIED = 5; + odf.OdfContainer.getContainer = function(url) { + return new odf.OdfContainer(url, null) + }; + return odf.OdfContainer +}(); +odf.Formatting = function Formatting() { + var odfContainer, styleInfo = new odf.StyleInfo; + function RangeElementIterator(range) { + function getNthChild(parent, n) { + var c = parent && parent.firstChild; + while(c && n) { + c = c.nextSibling; + n -= 1 + } + return c + } + var start = getNthChild(range.startContainer, range.startOffset), end = getNthChild(range.endContainer, range.endOffset), current = start; + this.next = function() { + var c = current; + if(c === null) { + return c + } + return null + } + } + function getParentStyle(element) { + var n = element.firstChild, e; + if(n.nodeType === 1) { + e = n; + return e + } + return null + } + function getParagraphStyles(range) { + var iter = new RangeElementIterator(range), e, styles = []; + e = iter.next(); + while(e) { + if(styleInfo.canElementHaveStyle("paragraph", e)) { + styles.push(e) + } + } + return styles + } + this.setOdfContainer = function(odfcontainer) { + odfContainer = odfcontainer + }; + this.isCompletelyBold = function(selection) { + return false + }; + this.getAlignment = function(selection) { + var styles = this.getParagraphStyles(selection), i, l = styles.length; + return undefined + }; + this.getParagraphStyles = function(selection) { + var i, j, s, styles = []; + for(i = 0;i < selection.length;i += 0) { + s = getParagraphStyles(selection[i]); + for(j = 0;j < s.length;j += 1) { + if(styles.indexOf(s[j]) === -1) { + styles.push(s[j]) + } + } + } + return styles + }; + this.getTextStyles = function(selection) { + return[] + } +}; +runtime.loadClass("odf.OdfContainer"); +runtime.loadClass("odf.Formatting"); +runtime.loadClass("xmldom.XPath"); +odf.OdfCanvas = function() { + function LoadingQueue() { + var queue = [], taskRunning = false; + function run(task) { + taskRunning = true; + runtime.setTimeout(function() { + try { + task() + }catch(e) { + runtime.log(e) + } + taskRunning = false; + if(queue.length > 0) { + run(queue.pop()) + } + }, 10) + } + this.clearQueue = function() { + queue.length = 0 + }; + this.addToQueue = function(loadingTask) { + if(queue.length === 0 && !taskRunning) { + return run(loadingTask) + } + queue.push(loadingTask) + } + } + function PageSwitcher(css) { + var sheet = css.sheet, position = 1; + function updateCSS() { + while(sheet.cssRules.length > 0) { + sheet.deleteRule(0) + } + sheet.insertRule("office|presentation draw|page {display:none;}", 0); + sheet.insertRule("office|presentation draw|page:nth-child(" + position + ") {display:block;}", 1) + } + this.showNextPage = function() { + position += 1; + updateCSS() + }; + this.showPreviousPage = function() { + if(position > 1) { + position -= 1; + updateCSS() + } + }; + this.css = css + } + function listenEvent(eventTarget, eventType, eventHandler) { + if(eventTarget.addEventListener) { + eventTarget.addEventListener(eventType, eventHandler, false) + }else { + if(eventTarget.attachEvent) { + eventType = "on" + eventType; + eventTarget.attachEvent(eventType, eventHandler) + }else { + eventTarget["on" + eventType] = eventHandler + } + } + } + function SelectionWatcher(element) { + var selection = [], count = 0, listeners = []; + function isAncestorOf(ancestor, descendant) { + while(descendant) { + if(descendant === ancestor) { + return true + } + descendant = descendant.parentNode + } + return false + } + function fallsWithin(element, range) { + return isAncestorOf(element, range.startContainer) && isAncestorOf(element, range.endContainer) + } + function getCurrentSelection() { + var s = [], selection = runtime.getWindow().getSelection(), i, r; + for(i = 0;i < selection.rangeCount;i += 1) { + r = selection.getRangeAt(i); + if(r !== null && fallsWithin(element, r)) { + s.push(r) + } + } + return s + } + function rangesNotEqual(rangeA, rangeB) { + if(rangeA === rangeB) { + return false + } + if(rangeA === null || rangeB === null) { + return true + } + return rangeA.startContainer !== rangeB.startContainer || rangeA.startOffset !== rangeB.startOffset || rangeA.endContainer !== rangeB.endContainer || rangeA.endOffset !== rangeB.endOffset + } + function emitNewSelection() { + var i, l = listeners.length; + for(i = 0;i < l;i += 1) { + listeners[i](element, selection) + } + } + function copySelection(selection) { + var s = [selection.length], i, oldr, r, doc = element.ownerDocument; + for(i = 0;i < selection.length;i += 1) { + oldr = selection[i]; + r = doc.createRange(); + r.setStart(oldr.startContainer, oldr.startOffset); + r.setEnd(oldr.endContainer, oldr.endOffset); + s[i] = r + } + return s + } + function checkSelection() { + var s = getCurrentSelection(), i; + if(s.length === selection.length) { + for(i = 0;i < s.length;i += 1) { + if(rangesNotEqual(s[i], selection[i])) { + break + } + } + if(i === s.length) { + return + } + } + selection = s; + selection = copySelection(s); + emitNewSelection() + } + this.addListener = function(eventName, handler) { + var i, l = listeners.length; + for(i = 0;i < l;i += 1) { + if(listeners[i] === handler) { + return + } + } + listeners.push(handler) + }; + listenEvent(element, "mouseup", checkSelection); + listenEvent(element, "keyup", checkSelection); + listenEvent(element, "keydown", checkSelection) + } + var style2CSS = new odf.Style2CSS, namespaces = style2CSS.namespaces, drawns = namespaces.draw, fons = namespaces.fo, officens = namespaces.office, svgns = namespaces.svg, textns = namespaces.text, xlinkns = namespaces.xlink, window = runtime.getWindow(), xpath = new xmldom.XPath, eventHandlers = {}, editparagraph, loadingQueue = new LoadingQueue; + function addEventListener(eventType, eventHandler) { + var handlers = eventHandlers[eventType]; + if(handlers === undefined) { + handlers = eventHandlers[eventType] = [] + } + if(eventHandler && handlers.indexOf(eventHandler) === -1) { + handlers.push(eventHandler) + } + } + function fireEvent(eventType, args) { + if(!eventHandlers.hasOwnProperty(eventType)) { + return + } + var handlers = eventHandlers[eventType], i; + for(i = 0;i < handlers.length;i += 1) { + handlers[i](args) + } + } + function clear(element) { + while(element.firstChild) { + element.removeChild(element.firstChild) + } + } + function handleStyles(odfelement, stylesxmlcss) { + var style2css = new odf.Style2CSS; + style2css.style2css(stylesxmlcss.sheet, odfelement.styles, odfelement.automaticStyles) + } + function setFramePosition(id, frame, stylesheet) { + frame.setAttribute("styleid", id); + var rule, anchor = frame.getAttributeNS(textns, "anchor-type"), x = frame.getAttributeNS(svgns, "x"), y = frame.getAttributeNS(svgns, "y"), width = frame.getAttributeNS(svgns, "width"), height = frame.getAttributeNS(svgns, "height"), minheight = frame.getAttributeNS(fons, "min-height"), minwidth = frame.getAttributeNS(fons, "min-width"); + if(anchor === "as-char") { + rule = "display: inline-block;" + }else { + if(anchor || x || y) { + rule = "position: absolute;" + }else { + if(width || height || minheight || minwidth) { + rule = "display: block;" + } + } + } + if(x) { + rule += "left: " + x + ";" + } + if(y) { + rule += "top: " + y + ";" + } + if(width) { + rule += "width: " + width + ";" + } + if(height) { + rule += "height: " + height + ";" + } + if(minheight) { + rule += "min-height: " + minheight + ";" + } + if(minwidth) { + rule += "min-width: " + minwidth + ";" + } + if(rule) { + rule = "draw|" + frame.localName + '[styleid="' + id + '"] {' + rule + "}"; + stylesheet.insertRule(rule, stylesheet.cssRules.length) + } + } + function getUrlFromBinaryDataElement(image) { + var node = image.firstChild; + while(node) { + if(node.namespaceURI === officens && node.localName === "binary-data") { + return"data:image/png;base64," + node.textContent + } + node = node.nextSibling + } + return"" + } + function setImage(id, container, image, stylesheet) { + image.setAttribute("styleid", id); + var url = image.getAttributeNS(xlinkns, "href"), part, node; + function callback(url) { + var rule = "background-image: url(" + url + ");"; + rule = 'draw|image[styleid="' + id + '"] {' + rule + "}"; + stylesheet.insertRule(rule, stylesheet.cssRules.length) + } + if(url) { + try { + if(container.getPartUrl) { + url = container.getPartUrl(url); + callback(url) + }else { + part = container.getPart(url); + part.onchange = function(part) { + callback(part.url) + }; + part.load() + } + }catch(e) { + runtime.log("slight problem: " + e) + } + }else { + url = getUrlFromBinaryDataElement(image); + callback(url) + } + } + function formatParagraphAnchors(odfbody) { + var runtimens = "urn:webodf", n, i, nodes = xpath.getODFElementsWithXPath(odfbody, ".//*[*[@text:anchor-type='paragraph']]", style2CSS.namespaceResolver); + for(i = 0;i < nodes.length;i += 1) { + n = nodes[i]; + if(n.setAttributeNS) { + n.setAttributeNS(runtimens, "containsparagraphanchor", true) + } + } + } + function modifyImages(container, odfbody, stylesheet) { + var node, frames, i, images; + function namespaceResolver(prefix) { + return namespaces[prefix] + } + frames = []; + node = odfbody.firstChild; + while(node && node !== odfbody) { + if(node.namespaceURI === drawns) { + frames[frames.length] = node + } + if(node.firstChild) { + node = node.firstChild + }else { + while(node && node !== odfbody && !node.nextSibling) { + node = node.parentNode + } + if(node && node.nextSibling) { + node = node.nextSibling + } + } + } + for(i = 0;i < frames.length;i += 1) { + node = frames[i]; + setFramePosition("frame" + String(i), node, stylesheet) + } + formatParagraphAnchors(odfbody) + } + function loadImages(container, odffragment, stylesheet) { + var i, images, node; + function loadImage(name, container, node, stylesheet) { + loadingQueue.addToQueue(function() { + setImage(name, container, node, stylesheet) + }) + } + images = odffragment.getElementsByTagNameNS(drawns, "image"); + for(i = 0;i < images.length;i += 1) { + node = images.item(i); + loadImage("image" + String(i), container, node, stylesheet) + } + } + function setVideo(id, container, plugin, stylesheet) { + var video, source, url, videoType, doc = plugin.ownerDocument, part, node; + url = plugin.getAttributeNS(xlinkns, "href"); + function callback(url, mimetype) { + if(mimetype.substr(0, 6) === "video/") { + video = doc.createElementNS(doc.documentElement.namespaceURI, "video"); + video.setAttribute("controls", "controls"); + source = doc.createElement("source"); + source.setAttribute("src", url); + source.setAttribute("type", mimetype); + video.appendChild(source); + plugin.parentNode.appendChild(video) + }else { + plugin.innerHtml = "Unrecognised Plugin" + } + } + if(url) { + try { + if(container.getPartUrl) { + url = container.getPartUrl(url); + callback(url, "video/mp4") + }else { + part = container.getPart(url); + part.onchange = function(part) { + callback(part.url, part.mimetype) + }; + part.load() + } + }catch(e) { + runtime.log("slight problem: " + e) + } + }else { + runtime.log("using MP4 data fallback"); + url = getUrlFromBinaryDataElement(plugin); + callback(url, "video/mp4") + } + } + function loadVideos(container, odffragment, stylesheet) { + var i, plugins, node; + function loadVideo(name, container, node, stylesheet) { + loadingQueue.addToQueue(function() { + setVideo(name, container, node, stylesheet) + }) + } + plugins = odffragment.getElementsByTagNameNS(drawns, "plugin"); + runtime.log("Loading Videos:"); + for(i = 0;i < plugins.length;i += 1) { + runtime.log("...Found a video."); + node = plugins.item(i); + loadVideo("video" + String(i), container, node, stylesheet) + } + } + function addStyleSheet(document) { + var styles = document.getElementsByTagName("style"), head = document.getElementsByTagName("head")[0], text = "", prefix, a = "", b; + if(styles && styles.length > 0) { + styles = styles[0].cloneNode(false) + }else { + styles = document.createElement("style") + } + for(prefix in namespaces) { + if(namespaces.hasOwnProperty(prefix) && prefix) { + text += "@namespace " + prefix + " url(" + namespaces[prefix] + ");\n" + } + } + styles.appendChild(document.createTextNode(text)); + head.appendChild(styles); + return styles + } + odf.OdfCanvas = function OdfCanvas(element) { + var self = this, document = element.ownerDocument, odfcontainer, formatting = new odf.Formatting, selectionWatcher = new SelectionWatcher(element), slidecssindex = 0, pageSwitcher = new PageSwitcher(addStyleSheet(document)), stylesxmlcss = addStyleSheet(document), positioncss = addStyleSheet(document), editable = false, zoomLevel = 1; + function fixContainerSize() { + var sizer = element.firstChild, odfdoc = sizer.firstChild; + if(!odfdoc) { + return + } + element.style.WebkitTransform = "scale(" + zoomLevel + ")"; + element.style.WebkitTransformOrigin = "left top"; + element.style.width = Math.round(zoomLevel * odfdoc.offsetWidth) + "px"; + element.style.height = Math.round(zoomLevel * odfdoc.offsetHeight) + "px" + } + function handleContent(container, odfnode) { + var css = positioncss.sheet, sizer; + modifyImages(container, odfnode.body, css); + css.insertRule("draw|page { background-color:#fff; }", css.cssRules.length); + clear(element); + sizer = document.createElement("div"); + sizer.style.display = "inline-block"; + sizer.style.background = "white"; + sizer.appendChild(odfnode); + element.appendChild(sizer); + loadImages(container, odfnode.body, css); + loadVideos(container, odfnode.body, css); + fixContainerSize() + } + function refreshOdf(container) { + if(odfcontainer !== container) { + return + } + function callback() { + clear(element); + element.style.display = "inline-block"; + var odfnode = container.rootElement; + element.ownerDocument.importNode(odfnode, true); + formatting.setOdfContainer(container); + handleStyles(odfnode, stylesxmlcss); + handleContent(container, odfnode); + fireEvent("statereadychange") + } + if(odfcontainer.state === odf.OdfContainer.DONE) { + callback() + }else { + odfcontainer.onchange = callback + } + } + this.odfContainer = function() { + return odfcontainer + }; + this.slidevisibilitycss = function() { + return pageSwitcher.css + }; + this["load"] = this.load = function(url) { + loadingQueue.clearQueue(); + element.innerHTML = "loading " + url; + odfcontainer = new odf.OdfContainer(url, function(container) { + odfcontainer = container; + refreshOdf(container) + }); + odfcontainer.onstatereadychange = refreshOdf + }; + function stopEditing() { + if(!editparagraph) { + return + } + var fragment = editparagraph.ownerDocument.createDocumentFragment(); + while(editparagraph.firstChild) { + fragment.insertBefore(editparagraph.firstChild, null) + } + editparagraph.parentNode.replaceChild(fragment, editparagraph) + } + this.save = function(callback) { + stopEditing(); + odfcontainer.save(callback) + }; + function cancelPropagation(event) { + if(event.stopPropagation) { + event.stopPropagation() + }else { + event.cancelBubble = true + } + } + function cancelEvent(event) { + if(event.preventDefault) { + event.preventDefault(); + event.stopPropagation() + }else { + event.returnValue = false; + event.cancelBubble = true + } + } + this.setEditable = function(iseditable) { + editable = iseditable; + if(!editable) { + stopEditing() + } + }; + function processClick(evt) { + evt = evt || window.event; + var e = evt.target, selection = window.getSelection(), range = selection.rangeCount > 0 ? selection.getRangeAt(0) : null, startContainer = range && range.startContainer, startOffset = range && range.startOffset, endContainer = range && range.endContainer, endOffset = range && range.endOffset; + while(e && !((e.localName === "p" || e.localName === "h") && e.namespaceURI === textns)) { + e = e.parentNode + } + if(!editable) { + return + } + if(!e || e.parentNode === editparagraph) { + return + } + if(!editparagraph) { + editparagraph = e.ownerDocument.createElement("p"); + if(!editparagraph.style) { + editparagraph = e.ownerDocument.createElementNS("http://www.w3.org/1999/xhtml", "p") + } + editparagraph.style.margin = "0px"; + editparagraph.style.padding = "0px"; + editparagraph.style.border = "0px"; + editparagraph.setAttribute("contenteditable", true) + }else { + if(editparagraph.parentNode) { + stopEditing() + } + } + e.parentNode.replaceChild(editparagraph, e); + editparagraph.appendChild(e); + editparagraph.focus(); + if(range) { + selection.removeAllRanges(); + range = e.ownerDocument.createRange(); + range.setStart(startContainer, startOffset); + range.setEnd(endContainer, endOffset); + selection.addRange(range) + } + cancelEvent(evt) + } + this.addListener = function(eventName, handler) { + if(eventName === "selectionchange") { + selectionWatcher.addListener(eventName, handler) + }else { + addEventListener(eventName, handler) + } + }; + this.getFormatting = function() { + return formatting + }; + this.setZoomLevel = function(zoom) { + zoomLevel = zoom; + fixContainerSize() + }; + this.getZoomLevel = function() { + return zoomLevel + }; + this.fitToContainingElement = function(width, height) { + var realWidth = element.offsetWidth / zoomLevel, realHeight = element.offsetHeight / zoomLevel; + zoomLevel = width / realWidth; + if(height / realHeight < zoomLevel) { + zoomLevel = height / realHeight + } + fixContainerSize() + }; + this.fitToWidth = function(width) { + var realWidth = element.offsetWidth / zoomLevel; + zoomLevel = width / realWidth; + fixContainerSize() + }; + this.fitToHeight = function(height) { + var realHeight = element.offsetHeight / zoomLevel; + zoomLevel = height / realHeight; + fixContainerSize() + }; + this.showNextPage = function() { + pageSwitcher.showNextPage() + }; + this.showPreviousPage = function() { + pageSwitcher.showPreviousPage() + }; + this.showAllPages = function() { + }; + listenEvent(element, "click", processClick) + }; + return odf.OdfCanvas +}(); +runtime.loadClass("xmldom.XPath"); +runtime.loadClass("odf.Style2CSS"); +gui.PresenterUI = function() { + var s2css = new odf.Style2CSS, xpath = new xmldom.XPath, nsResolver = s2css.namespaceResolver; + return function PresenterUI(odf_element) { + var self = this; + self.setInitialSlideMode = function() { + self.startSlideMode("single") + }; + self.keyDownHandler = function(ev) { + if(ev.target.isContentEditable) { + return + } + if(ev.target.nodeName === "input") { + return + } + switch(ev.keyCode) { + case 84: + self.toggleToolbar(); + break; + case 37: + ; + case 8: + self.prevSlide(); + break; + case 39: + ; + case 32: + self.nextSlide(); + break; + case 36: + self.firstSlide(); + break; + case 35: + self.lastSlide(); + break + } + }; + self.root = function() { + return self.odf_canvas.odfContainer().rootElement + }; + self.firstSlide = function() { + self.slideChange(function(old, pc) { + return 0 + }) + }; + self.lastSlide = function() { + self.slideChange(function(old, pc) { + return pc - 1 + }) + }; + self.nextSlide = function() { + self.slideChange(function(old, pc) { + return old + 1 < pc ? old + 1 : -1 + }) + }; + self.prevSlide = function() { + self.slideChange(function(old, pc) { + return old < 1 ? -1 : old - 1 + }) + }; + self.slideChange = function(indexChanger) { + var pages = self.getPages(self.odf_canvas.odfContainer().rootElement), last = -1, i = 0, newidx, pagelist; + pages.forEach(function(tuple) { + var name = tuple[0], node = tuple[1]; + if(node.hasAttribute("slide_current")) { + last = i; + node.removeAttribute("slide_current") + } + i += 1 + }); + newidx = indexChanger(last, pages.length); + if(newidx === -1) { + newidx = last + } + pages[newidx][1].setAttribute("slide_current", "1"); + pagelist = document.getElementById("pagelist"); + pagelist.selectedIndex = newidx; + if(self.slide_mode === "cont") { + window.scrollBy(0, pages[newidx][1].getBoundingClientRect().top - 30) + } + }; + self.selectSlide = function(idx) { + self.slideChange(function(old, pc) { + if(idx >= pc) { + return-1 + } + if(idx < 0) { + return-1 + } + return idx + }) + }; + self.scrollIntoContView = function(idx) { + var pages = self.getPages(self.odf_canvas.odfContainer().rootElement); + if(pages.length === 0) { + return + } + window.scrollBy(0, pages[idx][1].getBoundingClientRect().top - 30) + }; + self.getPages = function(root) { + var pagenodes = root.getElementsByTagNameNS(nsResolver("draw"), "page"), pages = [], i; + for(i = 0;i < pagenodes.length;i += 1) { + pages.push([pagenodes[i].getAttribute("draw:name"), pagenodes[i]]) + } + return pages + }; + self.fillPageList = function(odfdom_root, html_select) { + var pages = self.getPages(odfdom_root), i, html_option, res, page_denom; + while(html_select.firstChild) { + html_select.removeChild(html_select.firstChild) + } + for(i = 0;i < pages.length;i += 1) { + html_option = document.createElement("option"); + res = xpath.getODFElementsWithXPath(pages[i][1], './draw:frame[@presentation:class="title"]//draw:text-box/text:p', xmldom.XPath); + page_denom = res.length > 0 ? res[0].textContent : pages[i][0]; + html_option.textContent = i + 1 + ": " + page_denom; + html_select.appendChild(html_option) + } + }; + self.startSlideMode = function(mode) { + var pagelist = document.getElementById("pagelist"), css = self.odf_canvas.slidevisibilitycss().sheet; + self.slide_mode = mode; + while(css.cssRules.length > 0) { + css.deleteRule(0) + } + self.selectSlide(0); + if(self.slide_mode === "single") { + css.insertRule("draw|page { position:fixed; left:0px;top:30px; z-index:1; }", 0); + css.insertRule("draw|page[slide_current] { z-index:2;}", 1); + css.insertRule("draw|page { -webkit-transform: scale(1);}", 2); + self.fitToWindow(); + window.addEventListener("resize", self.fitToWindow, false) + }else { + if(self.slide_mode === "cont") { + window.removeEventListener("resize", self.fitToWindow, false) + } + } + self.fillPageList(self.odf_canvas.odfContainer().rootElement, pagelist) + }; + self.toggleToolbar = function() { + var css, found, i; + css = self.odf_canvas.slidevisibilitycss().sheet; + found = -1; + for(i = 0;i < css.cssRules.length;i += 1) { + if(css.cssRules[i].cssText.substring(0, 8) === ".toolbar") { + found = i; + break + } + } + if(found > -1) { + css.deleteRule(found) + }else { + css.insertRule(".toolbar { position:fixed; left:0px;top:-200px; z-index:0; }", 0) + } + }; + self.fitToWindow = function() { + function ruleByFactor(f) { + return"draw|page { \n" + "-moz-transform: scale(" + f + "); \n" + "-moz-transform-origin: 0% 0%; " + "-webkit-transform-origin: 0% 0%; -webkit-transform: scale(" + f + "); " + "-o-transform-origin: 0% 0%; -o-transform: scale(" + f + "); " + "-ms-transform-origin: 0% 0%; -ms-transform: scale(" + f + "); " + "}" + } + var pages = self.getPages(self.root()), factorVert = (window.innerHeight - 40) / pages[0][1].clientHeight, factorHoriz = (window.innerWidth - 10) / pages[0][1].clientWidth, factor = factorVert < factorHoriz ? factorVert : factorHoriz, css = self.odf_canvas.slidevisibilitycss().sheet; + css.deleteRule(2); + css.insertRule(ruleByFactor(factor), 2) + }; + self.load = function(url) { + self.odf_canvas.load(url) + }; + self.odf_element = odf_element; + self.odf_canvas = new odf.OdfCanvas(self.odf_element); + self.odf_canvas.addListener("statereadychange", self.setInitialSlideMode); + self.slide_mode = "undefined"; + document.addEventListener("keydown", self.keyDownHandler, false) + } +}(); +gui.Caret = function Caret(selection, rootNode) { + var document = rootNode.ownerDocument, cursorns, cursorNode; + cursorns = "urn:webodf:names:cursor"; + cursorNode = document.createElementNS(cursorns, "cursor"); + this.updateToSelection = function() { + var range; + if(selection.rangeCount === 1) { + range = selection.getRangeAt(0) + } + } +}; +runtime.loadClass("core.Cursor"); +gui.SelectionMover = function SelectionMover(selection, pointWalker) { + var doc = pointWalker.node().ownerDocument, cursor = new core.Cursor(selection, doc); + function getActiveRange(node) { + var range; + if(selection.rangeCount === 0) { + selection.addRange(node.ownerDocument.createRange()) + } + return selection.getRangeAt(selection.rangeCount - 1) + } + function setStart(node, offset) { + var ranges = [], i, range; + for(i = 0;i < selection.rangeCount;i += 1) { + ranges[i] = selection.getRangeAt(i) + } + selection.removeAllRanges(); + if(ranges.length === 0) { + ranges[0] = node.ownerDocument.createRange() + } + ranges[ranges.length - 1].setStart(pointWalker.node(), pointWalker.position()); + for(i = 0;i < ranges.length;i += 1) { + selection.addRange(ranges[i]) + } + } + function doMove(extend, move) { + if(selection.rangeCount === 0) { + return + } + var range = selection.getRangeAt(0), element; + if(!range.startContainer || range.startContainer.nodeType !== 1) { + return + } + element = range.startContainer; + pointWalker.setPoint(element, range.startOffset); + move(); + setStart(pointWalker.node(), pointWalker.position()) + } + function doMoveForward(extend, move) { + if(selection.rangeCount === 0) { + return + } + move(); + var range = selection.getRangeAt(0), element; + if(!range.startContainer || range.startContainer.nodeType !== 1) { + return + } + element = range.startContainer; + pointWalker.setPoint(element, range.startOffset) + } + function moveCursor(node, offset, selectMode) { + if(selectMode) { + selection.extend(node, offset) + }else { + selection.collapse(node, offset) + } + cursor.updateToSelection() + } + function moveCursorLeft() { + var element; + if(!selection.focusNode || selection.focusNode.nodeType !== 1) { + return + } + element = selection.focusNode; + pointWalker.setPoint(element, selection.focusOffset); + pointWalker.stepBackward(); + moveCursor(pointWalker.node(), pointWalker.position(), false) + } + function moveCursorRight() { + cursor.remove(); + var element; + if(!selection.focusNode || selection.focusNode.nodeType !== 1) { + return + } + element = selection.focusNode; + pointWalker.setPoint(element, selection.focusOffset); + pointWalker.stepForward(); + moveCursor(pointWalker.node(), pointWalker.position(), false) + } + function moveCursorUp() { + var rect = cursor.getNode().getBoundingClientRect(), x = rect.left, y = rect.top, arrived = false, left = 200; + while(!arrived && left) { + left -= 1; + moveCursorLeft(); + rect = cursor.getNode().getBoundingClientRect(); + arrived = rect.top !== y && rect.left < x + } + } + function moveCursorDown() { + cursor.updateToSelection(); + var rect = cursor.getNode().getBoundingClientRect(), x = rect.left, y = rect.top, arrived = false, left = 200; + while(!arrived) { + left -= 1; + moveCursorRight(); + rect = cursor.getNode().getBoundingClientRect(); + arrived = rect.top !== y && rect.left > x + } + } + this.movePointForward = function(extend) { + doMove(extend, pointWalker.stepForward) + }; + this.movePointBackward = function(extend) { + doMove(extend, pointWalker.stepBackward) + }; + this.moveLineForward = function(extend) { + if(selection.modify) { + selection.modify(extend ? "extend" : "move", "forward", "line") + }else { + doMove(extend, moveCursorDown) + } + }; + this.moveLineBackward = function(extend) { + if(selection.modify) { + selection.modify(extend ? "extend" : "move", "backward", "line") + }else { + doMove(extend, function() { + }) + } + }; + return this +}; +runtime.loadClass("core.PointWalker"); +runtime.loadClass("core.Cursor"); +gui.XMLEdit = function XMLEdit(element, stylesheet) { + var simplecss, cssprefix, documentElement, customNS = "customns", walker = null; + if(!element.id) { + element.id = "xml" + String(Math.random()).substring(2) + } + cssprefix = "#" + element.id + " "; + function installHandlers() { + } + simplecss = cssprefix + "*," + cssprefix + ":visited, " + cssprefix + ":link {display:block; margin: 0px; margin-left: 10px; font-size: medium; color: black; background: white; font-variant: normal; font-weight: normal; font-style: normal; font-family: sans-serif; text-decoration: none; white-space: pre-wrap; height: auto; width: auto}\n" + cssprefix + ":before {color: blue; content: '<' attr(customns_name) attr(customns_atts) '>';}\n" + cssprefix + ":after {color: blue; content: '';}\n" + + cssprefix + "{overflow: auto;}\n"; + function listenEvent(eventTarget, eventType, eventHandler) { + if(eventTarget.addEventListener) { + eventTarget.addEventListener(eventType, eventHandler, false) + }else { + if(eventTarget.attachEvent) { + eventType = "on" + eventType; + eventTarget.attachEvent(eventType, eventHandler) + }else { + eventTarget["on" + eventType] = eventHandler + } + } + } + function cancelEvent(event) { + if(event.preventDefault) { + event.preventDefault() + }else { + event.returnValue = false + } + } + function isCaretMoveCommand(charCode) { + if(charCode >= 16 && charCode <= 20) { + return true + } + if(charCode >= 33 && charCode <= 40) { + return true + } + return false + } + function syncSelectionWithWalker() { + var sel = element.ownerDocument.defaultView.getSelection(), r; + if(!sel || sel.rangeCount <= 0 || !walker) { + return + } + r = sel.getRangeAt(0); + walker.setPoint(r.startContainer, r.startOffset) + } + function syncWalkerWithSelection() { + var sel = element.ownerDocument.defaultView.getSelection(), n, r; + sel.removeAllRanges(); + if(!walker || !walker.node()) { + return + } + n = walker.node(); + r = n.ownerDocument.createRange(); + r.setStart(n, walker.position()); + r.collapse(true); + sel.addRange(r) + } + function handleKeyDown(event) { + var charCode = event.charCode || event.keyCode; + walker = null; + if(walker && charCode === 39) { + syncSelectionWithWalker(); + walker.stepForward(); + syncWalkerWithSelection() + }else { + if(walker && charCode === 37) { + syncSelectionWithWalker(); + walker.stepBackward(); + syncWalkerWithSelection() + }else { + if(isCaretMoveCommand(charCode)) { + return + } + } + } + cancelEvent(event) + } + function handleKeyPress(event) { + } + function handleClick(event) { + var sel = element.ownerDocument.defaultView.getSelection(), r = sel.getRangeAt(0), n = r.startContainer; + cancelEvent(event) + } + function initElement(element) { + listenEvent(element, "click", handleClick); + listenEvent(element, "keydown", handleKeyDown); + listenEvent(element, "keypress", handleKeyPress); + listenEvent(element, "drop", cancelEvent); + listenEvent(element, "dragend", cancelEvent); + listenEvent(element, "beforepaste", cancelEvent); + listenEvent(element, "paste", cancelEvent) + } + function cleanWhitespace(node) { + var n = node.firstChild, p, re = /^\s*$/; + while(n && n !== node) { + p = n; + n = n.nextSibling || n.parentNode; + if(p.nodeType === 3 && re.test(p.nodeValue)) { + p.parentNode.removeChild(p) + } + } + } + function setCssHelperAttributes(node) { + var atts, attsv, a, i; + atts = node.attributes; + attsv = ""; + for(i = atts.length - 1;i >= 0;i -= 1) { + a = atts.item(i); + attsv = attsv + " " + a.nodeName + '="' + a.nodeValue + '"' + } + node.setAttribute("customns_name", node.nodeName); + node.setAttribute("customns_atts", attsv) + } + function addExplicitAttributes(node) { + var n = node.firstChild; + while(n && n !== node) { + if(n.nodeType === 1) { + addExplicitAttributes(n) + } + n = n.nextSibling || n.parentNode + } + setCssHelperAttributes(node); + cleanWhitespace(node) + } + function getNamespacePrefixes(node, prefixes) { + var n = node.firstChild, atts, att, i; + while(n && n !== node) { + if(n.nodeType === 1) { + getNamespacePrefixes(n, prefixes); + atts = n.attributes; + for(i = atts.length - 1;i >= 0;i -= 1) { + att = atts.item(i); + if(att.namespaceURI === "http://www.w3.org/2000/xmlns/") { + if(!prefixes[att.nodeValue]) { + prefixes[att.nodeValue] = att.localName + } + } + } + } + n = n.nextSibling || n.parentNode + } + } + function generateUniquePrefixes(prefixes) { + var taken = {}, ns, p, n = 0; + for(ns in prefixes) { + if(prefixes.hasOwnProperty(ns) && ns) { + p = prefixes[ns]; + if(!p || taken.hasOwnProperty(p) || p === "xmlns") { + do { + p = "ns" + n; + n += 1 + }while(taken.hasOwnProperty(p)); + prefixes[ns] = p + } + taken[p] = true + } + } + } + function createCssFromXmlInstance(node) { + var prefixes = {}, css = "@namespace customns url(customns);\n", name, pre, ns, names, csssel; + getNamespacePrefixes(node, prefixes); + generateUniquePrefixes(prefixes); + return css + } + function updateCSS() { + var css = element.ownerDocument.createElement("style"), text = createCssFromXmlInstance(element); + css.type = "text/css"; + text = text + simplecss; + css.appendChild(element.ownerDocument.createTextNode(text)); + stylesheet = stylesheet.parentNode.replaceChild(css, stylesheet) + } + function getXML() { + return documentElement + } + function setXML(xml) { + var node = xml.documentElement || xml; + node = element.ownerDocument.importNode(node, true); + documentElement = node; + addExplicitAttributes(node); + while(element.lastChild) { + element.removeChild(element.lastChild) + } + element.appendChild(node); + updateCSS(); + walker = new core.PointWalker(node) + } + initElement(element); + this.updateCSS = updateCSS; + this.setXML = setXML; + this.getXML = getXML +}; +(function() { + return["core/Async.js", "core/Base64.js", "core/ByteArray.js", "core/ByteArrayWriter.js", "core/Cursor.js", "core/JSLint.js", "core/PointWalker.js", "core/RawDeflate.js", "core/RawInflate.js", "core/UnitTester.js", "core/Zip.js", "gui/Caret.js", "gui/SelectionMover.js", "gui/XMLEdit.js", "gui/PresenterUI.js", "odf/FontLoader.js", "odf/Formatting.js", "odf/OdfCanvas.js", "odf/OdfContainer.js", "odf/Style2CSS.js", "odf/StyleInfo.js", "xmldom/LSSerializer.js", "xmldom/LSSerializerFilter.js", "xmldom/OperationalTransformDOM.js", + "xmldom/OperationalTransformInterface.js", "xmldom/RelaxNG.js", "xmldom/RelaxNG2.js", "xmldom/RelaxNGParser.js", "xmldom/XPath.js"] +})(); + diff --git a/apps/files_odfviewer/js/webodf.js b/apps/files_odfviewer/js/webodf.js new file mode 100644 index 0000000000..1b85527260 --- /dev/null +++ b/apps/files_odfviewer/js/webodf.js @@ -0,0 +1,343 @@ +// Input 0 +/* + + @licstart + The JavaScript code in this page is free software: you can redistribute it + and/or modify it under the terms of the GNU Affero General Public License + (GNU AGPL) as published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. The code is distributed + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + + As additional permission under GNU AGPL version 3 section 7, you + may distribute non-source (e.g., minimized or compacted) forms of + that code without the copy of the GNU GPL normally required by + section 4, provided you include this license notice and a URL + through which recipients can access the Corresponding Source. + + As a special exception to the AGPL, any HTML file which merely makes function + calls to this code, and for that purpose includes it by reference shall be + deemed a separate work for copyright law purposes. In addition, the copyright + holders of this code give you permission to combine this code with free + software libraries that are released under the GNU LGPL. You may copy and + distribute such a system following the terms of the GNU AGPL for this code + and the LGPL for the libraries. If you modify this code, you may extend this + exception to your version of the code, but you are not obligated to do so. + If you do not wish to do so, delete this exception statement from your + version. + + This license applies to this entire compilation. + @licend + @source: http://www.webodf.org/ + @source: http://gitorious.org/odfkit/webodf/ +*/ +var core={},gui={},xmldom={},odf={}; +// Input 1 +function Runtime(){}Runtime.ByteArray=function(){};Runtime.ByteArray.prototype.slice=function(){};Runtime.prototype.byteArrayFromArray=function(){};Runtime.prototype.byteArrayFromString=function(){};Runtime.prototype.byteArrayToString=function(){};Runtime.prototype.concatByteArrays=function(){};Runtime.prototype.read=function(){};Runtime.prototype.readFile=function(){};Runtime.prototype.readFileSync=function(){};Runtime.prototype.loadXML=function(){};Runtime.prototype.writeFile=function(){}; +Runtime.prototype.isFile=function(){};Runtime.prototype.getFileSize=function(){};Runtime.prototype.deleteFile=function(){};Runtime.prototype.log=function(){};Runtime.prototype.setTimeout=function(){};Runtime.prototype.libraryPaths=function(){};Runtime.prototype.type=function(){};Runtime.prototype.getDOMImplementation=function(){};Runtime.prototype.getWindow=function(){};var IS_COMPILED_CODE=!0; +Runtime.byteArrayToString=function(j,l){function f(c){var b="",d,a=c.length;for(d=0;de?b+=String.fromCharCode(e):(d+=1,i=c[d],224>e?b+=String.fromCharCode((e&31)<<6|i&63):(d+=1,h=c[d],b+=String.fromCharCode((e&15)<<12|(i&63)<<6|h&63)));return b}var a;"utf8"===l?a=g(j):("binary"!==l&&this.log("Unsupported encoding: "+l),a=f(j));return a}; +Runtime.getFunctionName=function(j){return void 0===j.name?(j=/function\s+(\w+)/.exec(j))&&j[1]:j.name}; +function BrowserRuntime(j){function l(c,b){var d,a,e;b?e=c:b=c;j?(a=j.ownerDocument,e&&(d=a.createElement("span"),d.className=e,d.appendChild(a.createTextNode(e)),j.appendChild(d),j.appendChild(a.createTextNode(" "))),d=a.createElement("span"),d.appendChild(a.createTextNode(b)),j.appendChild(d),j.appendChild(a.createElement("br"))):console&&console.log(b)}var f=this,g={},a=window.ArrayBuffer&&window.Uint8Array;this.ByteArray=a?function(c){Uint8Array.prototype.slice=function(b,c){void 0===c&&(void 0=== +b&&(b=0),c=this.length);var a=this.subarray(b,c),e,i,c=c-b;e=new Uint8Array(new ArrayBuffer(c));for(i=0;ii?(a[h]=i,h+=1):2048>i?(a[h]=192|i>>>6,a[h+1]=128|i&63,h+=2):(a[h]=224|i>>>12&15,a[h+1]=128|i>>>6&63,a[h+2]=128|i&63,h+=3)}else{"binary"!==b&&f.log("unknown encoding: "+b);d=c.length;a=new f.ByteArray(d);for(e=0;ek.status||0===k.status?a(null):a("Status "+k.status+": "+k.responseText||k.statusText))};b=b.buffer&&!k.sendAsBinary?b.buffer:f.byteArrayToString(b,"binary");try{k.sendAsBinary?k.sendAsBinary(b):k.send(b)}catch(e){f.log("HUH? "+e+" "+b),a(e.message)}};this.deleteFile=function(a,b){var d=new XMLHttpRequest;d.open("DELETE",a,!0);d.onreadystatechange=function(){4===d.readyState&&(200>d.status&&300<= +d.status?b(d.responseText):b(null))};d.send(null)};this.loadXML=function(a,b){var d=new XMLHttpRequest;d.open("GET",a,!0);d.overrideMimeType&&d.overrideMimeType("text/xml");d.onreadystatechange=function(){4===d.readyState&&(0===d.status&&!d.responseText?b("File "+a+" is empty."):200===d.status||0===d.status?b(null,d.responseXML):b(d.responseText))};try{d.send(null)}catch(k){b(k.message)}};this.isFile=function(a,b){f.getFileSize(a,function(a){b(-1!==a)})};this.getFileSize=function(a,b){var d=new XMLHttpRequest; +d.open("HEAD",a,!0);d.onreadystatechange=function(){if(4===d.readyState){var a=d.getResponseHeader("Content-Length");a?b(parseInt(a,10)):b(-1)}};d.send(null)};this.log=l;this.setTimeout=function(a,b){setTimeout(function(){a()},b)};this.libraryPaths=function(){return["lib"]};this.setCurrentDirectory=function(){};this.type=function(){return"BrowserRuntime"};this.getDOMImplementation=function(){return window.document.implementation};this.exit=function(a){l("Calling exit with code "+a+", but exit() is not implemented.")}; +this.getWindow=function(){return window}} +function NodeJSRuntime(){var j=require("fs"),l="";this.ByteArray=function(f){return new Buffer(f)};this.byteArrayFromArray=function(f){var g=new Buffer(f.length),a,c=f.length;for(a=0;a>>18],c+=u[b>>>12&63],c+=u[b>>>6&63],c+=u[b&63];e===d+1?(b=a[e]<<4,c+=u[b>>>6],c+=u[b&63],c+="=="):e===d&&(b=a[e]<<10|a[e+1]<<2,c+=u[b>>>12],c+=u[b>>>6&63],c+=u[b&63],c+="=");return c}function f(a){var a=a.replace(/[^A-Za-z0-9+\/]+/g,""),b=[],c=a.length%4,e,d=a.length,i;for(e=0;e>16,i>>8&255,i&255);b.length-=[0,0,2,1][c];return b}function g(a){var b=[],c,e=a.length,d;for(c=0;cd?b.push(d):2048>d?b.push(192|d>>>6,128|d&63):b.push(224|d>>>12&15,128|d>>>6&63,128|d&63);return b}function a(a){var b=[],c,e=a.length,d,i,m;for(c=0;cd?b.push(d):(c+=1,i=a[c],224>d?b.push((d&31)<<6|i&63):(c+=1,m=a[c],b.push((d&15)<<12|(i&63)<<6|m&63)));return b}function c(a){return l(j(a))} +function b(a){return String.fromCharCode.apply(String,f(a))}function d(b){return a(j(b))}function k(b){for(var b=a(b),c="",e=0;eb?e+=String.fromCharCode(b):(m+=1,d=a.charCodeAt(m)&255,224>b?e+=String.fromCharCode((b&31)<<6|d&63):(m+=1,i=a.charCodeAt(m)&255,e+=String.fromCharCode((b&15)<<12|(d&63)<<6|i&63)));return e}function i(a,b){function c(){var m= +n+d;m>a.length&&(m=a.length);i+=e(a,n,m);n=m;m=n===a.length;b(i,m)&&!m&&runtime.setTimeout(c,0)}var d=1E5,i="",n=0;a.lengthb;b+=1)a.push(65+b);for(b=0;26>b;b+=1)a.push(97+b);for(b= +0;10>b;b+=1)a.push(48+b);a.push(43);a.push(47);return a})();var s=function(a){var b={},c,e;c=0;for(e=a.length;c>>8):(la(b&255),la(b>>>8))},na=function(){q=(q<<5^o[m+3-1]&255)&8191;x=p[32768+q];p[m&32767]=x;p[32768+q]=m},Q=function(a,b){B>16-b?(w|=a<>16-B,B+=b-16):(w|=a<a;a++)o[a]=o[a+32768];t-=32768;m-=32768;A-=32768;for(a=0;8192>a;a++)b=p[32768+a],p[32768+a]=32768<=b?b-32768:0;for(a=0;32768>a;a++)b=p[a],p[a]=32768<=b?b-32768:0;c+=32768}r||(a=xa(o,m+y,c),0>=a?r=!0:y+=a)},ya=function(a){var b=L,c=m,e,d=F,i=32506=N&&(b>>=2);do if(e=a,!(o[e+d]!==h||o[e+d-1]!==n||o[e]!==o[c]||o[++e]!==o[c+1])){c+=2;e++;do++c; +while(o[c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&o[++c]===o[++e]&&cd){t=a;d=e;if(258<=e)break;n=o[c+d-1];h=o[c+d]}}while((a=p[a&32767])>i&&0!==--b);return d},ga=function(a,b){s[P++]=b;0===a?v[b].fc++:(a--,v[$[b]+256+1].fc++,J[(256>a?Y[a]:Y[256+(a>>7)])&255].fc++,u[ia++]=a,aa|=ea);ea<<=1;0===(P&7)&&(da[pa++]=aa,aa=0,ea=1);if(2d;d++)c+=J[d].fc*(5+fa[d]); +c>>=3;if(ia>=1,c<<=1;while(0<--b);return c>>1},Aa=function(a,b){var c=[];c.length=16;var e=0,d;for(d=1;15>=d;d++)e=e+M[d-1]<<1,c[d]=e;for(e=0;e<=b;e++)d=a[e].dl,0!==d&&(a[e].fc=za(c[d]++,d))},ua=function(a){var b=a.dyn_tree,c=a.static_tree,e=a.elems,d,m=-1,i=e;V=0; +Z=573;for(d=0;dV;)d=I[++V]=2>m?++m:0,b[d].fc=1,S[d]=0,W--,null!==c&&(ba-=c[d].dl);a.max_code=m;for(d=V>>1;1<=d;d--)ta(b,d);do d=I[1],I[1]=I[V--],ta(b,1),c=I[1],I[--Z]=d,I[--Z]=c,b[i].fc=b[d].fc+b[c].fc,S[i]=S[d]>S[c]+1?S[d]:S[c]+1,b[d].dl=b[c].dl=i,I[1]=i++,ta(b,1);while(2<=V);I[--Z]=I[1];i=a.dyn_tree;d=a.extra_bits;var e=a.extra_base,c=a.max_code,r=a.max_length,n=a.static_tree,t,h,f,k,q=0;for(h=0;15>=h;h++)M[h]=0;i[I[Z]].dl=0;for(a=Z+1;573> +a;a++)if(t=I[a],h=i[i[t].dl].dl+1,h>r&&(h=r,q++),i[t].dl=h,!(t>c))M[h]++,f=0,t>=e&&(f=d[t-e]),k=i[t].fc,W+=k*(h+f),null!==n&&(ba+=k*(n[t].dl+f));if(0!==q){do{for(h=r-1;0===M[h];)h--;M[h]--;M[h+1]+=2;M[r]--;q-=2}while(0c||(i[d].dl!==h&&(W+=(h-i[d].dl)*i[d].fc,i[d].fc=h),t--)}Aa(b,m)},Ba=function(a,b){var c,e=-1,d,m=a[0].dl,i=0,h=7,r=4;0===m&&(h=138,r=3);a[b+1].dl=65535;for(c=0;c<=b;c++)if(d=m,m=a[c+1].dl,!(++i=i?K[17].fc++:K[18].fc++,i=0,e=d,0===m)?(h=138,r=3):d===m?(h=6,r=3):(h=7,r=4)},Ca=function(){8c?Y[c]:Y[256+(c>>7)])&255,X(h,b),r=fa[h],0!==r)c-=ca[h],Q(c,r);i>>=1}while(e=i?(X(17,K),Q(i-3,3)):(X(18,K),Q(i-11,7));i=0;e=d;0===m?(h=138,r=3):d===m?(h=6,r=3):(h=7,r=4)}},Fa=function(){var a;for(a=0;286>a;a++)v[a].fc=0;for(a=0;30>a;a++)J[a].fc=0;for(a=0;19>a;a++)K[a].fc=0;v[256].fc=1;aa=P=ia=pa=W=ba=0;ea=1},oa=function(a){var b,c,e,d;d=m-A;da[pa]=aa;ua(H);ua(D);Ba(v,H.max_code);Ba(J,D.max_code);ua(U);for(e=18;3<=e&&0===K[va[e]].dl;e--);W+= +3*(e+1)+14;b=W+3+7>>3;c=ba+3+7>>3;c<=b&&(b=c);if(d+4<=b&&0<=A){Q(0+a,3);Ca();ma(d);ma(~d);for(e=0;eb.len&&(t=b.len);for(n=0;ni-h&&(t=i-h);for(n=0;ng;g++){ha[g]=f;for(d= +0;d<1<g;g++){ca[g]=f;for(d=0;d<1<>=7;30>g;g++){ca[g]=f<<7;for(d=0;d<1<=d;d++)M[d]=0;for(d=0;143>=d;)G[d++].dl=8,M[8]++;for(;255>=d;)G[d++].dl=9,M[9]++;for(;279>=d;)G[d++].dl=7,M[7]++;for(;287>=d;)G[d++].dl=8,M[8]++;Aa(G,287);for(d=0;30>d;d++)R[d].dl=5,R[d].fc=za(d,5);Fa()}for(d=0;8192>d;d++)p[32768+d]=0;T=ka[O].max_lazy;N=ka[O].good_length;L=ka[O].max_chain;A=m=0;y=xa(o,0,65536);if(0>=y)r=!0,y= +0;else{for(r=!1;262>y&&!r;)sa();for(d=q=0;2>d;d++)q=(q<<5^o[d]&255)&8191}b=null;h=i=0;3>=O?(F=2,z=0):(z=2,C=0);n=!1}k=!0;if(0===y)return n=!0,0}if((d=Ga(a,c,e))===e)return e;if(n)return d;if(3>=O)for(;0!==y&&null===b;){na();0!==x&&32506>=m-x&&(z=ya(x),z>y&&(z=y));if(3<=z)if(g=ga(m-t,z-3),y-=z,z<=T){z--;do m++,na();while(0!==--z);m++}else m+=z,z=0,q=o[m]&255,q=(q<<5^o[m+1]&255)&8191;else g=ga(0,o[m]&255),y--,m++;g&&(oa(0),A=m);for(;262>y&&!r;)sa()}else for(;0!==y&&null===b;){na();F=z;E=t;z=2;0!==x&& +F=m-x&&(z=ya(x),z>y&&(z=y),3===z&&4096y&&!r;)sa()}0===y&&(0!==C&&ga(0,o[m-1]&255),oa(1),n=!0);return d+Ga(a,d+c,e-d)};this.deflate=function(m,i){var h,t;ja=m;qa=0;"undefined"===typeof i&&(i=6);(h=i)?1>h?h=1:9h;h++)v[h]=new j;J=[];J.length=61;for(h=0;61>h;h++)J[h]=new j;G=[];G.length=288;for(h=0;288>h;h++)G[h]=new j;R=[];R.length=30;for(h=0;30>h;h++)R[h]=new j;K=[];K.length=39;for(h=0;39>h;h++)K[h]=new j;H=new l;D=new l;U=new l;M=[];M.length=16;I=[];I.length=573;S=[];S.length=573;$=[];$.length=256;Y=[];Y.length=512;ha=[];ha.length=29;ca=[];ca.length=30;da=[];da.length=1024}for(var n=Array(1024),f=[];0<(h=Ia(n,0,n.length));){var g=[];g.length=h;for(t= +0;t>8&255])};this.appendUInt32LE=function(f){l.appendArray([f&255,f>>8&255,f>>16&255,f>>24&255])};this.appendString=function(g){f=runtime.concatByteArrays(f, +runtime.byteArrayFromString(g,j))};this.getLength=function(){return f.length};this.getByteArray=function(){return f}}; +// Input 6 +core.RawInflate=function(){var j,l,f=null,g,a,c,b,d,k,e,i,h,n,o,u,s,p,w=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535],B=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0],A=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,99,99],q=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],x=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],E=[16,17,18, +0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],C=function(){this.list=this.next=null},z=function(){this.n=this.b=this.e=0;this.t=null},F=function(a,b,c,d,e,m){this.BMAX=16;this.N_MAX=288;this.status=0;this.root=null;this.m=0;var h=Array(this.BMAX+1),i,r,t,n,f,k,g,q=Array(this.BMAX+1),o,j,p,y=new z,x=Array(this.BMAX);n=Array(this.N_MAX);var E,s=Array(this.BMAX+1),B,A,u;u=this.root=null;for(f=0;ff&&(m=f);for(B=1<(B-=h[k])){this.status=2;this.m=m;return}if(0>(B-=h[f]))this.status=2,this.m=m;else{h[f]+=B;s[1]=k=0;o=h;j=1;for(p=2;0<--f;)s[p++]=k+=o[j++];o=a;f=j=0;do if(0!=(k=o[j++]))n[s[k]++]=f;while(++fE+q[1+n];){E+=q[1+n];n++;A=(A=t-E)>m?m:A;if((r=1<<(k=g-E))>a+1){r-=a+1;for(p=g;++ki&&E>E-q[n],x[n-1][k].e=y.e,x[n-1][k].b=y.b,x[n-1][k].n=y.n,x[n-1][k].t=y.t)}y.b=g-E;j>=b?y.e=99:o[j]o[j]?16:15,y.n=o[j++]): +(y.e=e[o[j]-c],y.n=d[o[j++]-c]);r=1<>E;k>=1)f^=k;for(f^=k;(f&(1<>=a;b-=a},y=function(a,b,c){var f,k,g;if(0==c)return 0;for(g=0;;){m(o);k=h.list[t(o)];for(f=k.e;16e;e++)p[E[e]]= +0;o=7;e=new F(p,19,19,null,null,o);if(0!=e.status)return-1;h=e.root;o=e.m;i=g+j;for(d=f=0;de)p[d++]=f=e;else if(16==e){m(2);e=3+t(2);r(2);if(d+e>i)return-1;for(;0i)return-1;for(;0D;D++)H[D]=8;for(;256>D;D++)H[D]=9;for(;280>D;D++)H[D]=7;for(;288>D;D++)H[D]=8;a=7;D=new F(H,288,257,B,A,a);if(0!=D.status){alert("HufBuild error: "+D.status);G=-1;break b}f=D.root;a=D.m;for(D=0;30>D;D++)H[D]=5;L=5;D=new F(H,30,0,q,x,L);if(1e&&k.setStart(i,k.startOffset-1);k.endContainer===a?k.setEnd(i,e):k.endContainer===i&&k.endOffset>e&&k.setEnd(i,k.endOffset-1)}if(d){for(c=0;c1/f?"-0":""+f)+"."):j(c+" should be "+a+" (of type "+typeof a+"). Was "+f+" (of type "+typeof f+").")}var g=0;this.shouldBeNull=function(a,c){f(a,c,"null")};this.shouldBeNonNull=function(a,c){var b,d;try{d=eval(c)}catch(f){b=f}b?j(c+" should be non-null. Threw exception "+b):null!==d?runtime.log("pass",c+" is non-null."):j(c+" should be non-null. Was "+ +d)};this.shouldBe=f;this.countFailedTests=function(){return g}}; +core.UnitTester=function(){var j=0,l={};this.runTests=function(f,g){function a(b){if(0===b.length)l[c]=e,j+=d.countFailedTests(),g();else{h=b[0];var f=Runtime.getFunctionName(h);runtime.log("Running "+f);o=d.countFailedTests();k.setUp();h(function(){k.tearDown();e[f]=o===d.countFailedTests();a(b.slice(1))})}}var c=Runtime.getFunctionName(f),b,d=new core.UnitTestRunner,k=new f(d),e={},i,h,n,o;if(c.hasOwnProperty(l))runtime.log("Test "+c+" has already run.");else{runtime.log("Running "+c+": "+k.description()); +n=k.tests();for(i=0;i>>8^f;return c^-1}function g(a){return new Date((a>>25&127)+1980,(a>>21&15)-1,a>>16&31,a>>11&15,a>>5&63,(a&31)<<1)}function a(a){var b=a.getFullYear();return 1980>b?0:b-1980<< +25|a.getMonth()+1<<21|a.getDate()<<16|a.getHours()<<11|a.getMinutes()<<5|a.getSeconds()>>1}function c(a,b){var c,e,d,f,h,i,m,n=this;this.load=function(b){if(void 0!==n.data)b(null,n.data);else{var d=h+34+c+e+256;d+m>o&&(d=o-m);runtime.read(a,m,d,function(c,e){if(c)b(c,e);else a:{var d=e,m=new core.ByteArray(d),k=m.readUInt32LE(),g;if(67324752!==k)b("File entry signature is wrong."+k.toString()+" "+d.length.toString(),null);else{m.pos+=22;k=m.readUInt16LE();g=m.readUInt16LE();m.pos+=k+g;if(f){d=d.slice(m.pos, +m.pos+h);if(h!==d.length){b("The amount of compressed bytes read was "+d.length.toString()+" instead of "+h.toString()+" for "+n.filename+" in "+a+".",null);break a}d=s(d,i)}else d=d.slice(m.pos,m.pos+i);i!==d.length?b("The amount of bytes read was "+d.length.toString()+" instead of "+i.toString()+" for "+n.filename+" in "+a+".",null):(n.data=d,b(null,d))}}})}};this.set=function(a,b,c,e){n.filename=a;n.data=b;n.compressed=c;n.date=e};this.error=null;b&&(33639248!==b.readUInt32LE()?this.error="Central directory entry has wrong signature at position "+ +(b.pos-4).toString()+' for file "'+a+'": '+b.data.length.toString():(b.pos+=6,f=b.readUInt16LE(),this.date=g(b.readUInt32LE()),b.readUInt32LE(),h=b.readUInt32LE(),i=b.readUInt32LE(),c=b.readUInt16LE(),e=b.readUInt16LE(),d=b.readUInt16LE(),b.pos+=8,m=b.readUInt32LE(),this.filename=runtime.byteArrayToString(b.data.slice(b.pos,b.pos+c),"utf8"),b.pos+=c+e+d))}function b(a,b){if(22!==a.length)b("Central directory length should be 22.",p);else{var e=new core.ByteArray(a),d;d=e.readUInt32LE();101010256!== +d?b("Central directory signature is wrong: "+d.toString(),p):0!==e.readUInt16LE()?b("Zip files with non-zero disk numbers are not supported.",p):0!==e.readUInt16LE()?b("Zip files with non-zero disk numbers are not supported.",p):(d=e.readUInt16LE(),u=e.readUInt16LE(),d!==u?b("Number of entries is inconsistent.",p):(d=e.readUInt32LE(),e=e.readUInt16LE(),e=o-22-d,runtime.read(j,e,o-e,function(a,e){a:{var d=new core.ByteArray(e),f,m;n=[];for(f=0;fo?l("File '"+ +j+"' cannot be read.",p):runtime.read(j,o-22,22,function(a,c){a||null===l?l(a,p):b(c,l)})})}; +// Input 12 +xmldom.LSSerializerFilter=function(){}; +// Input 13 +"function"!==typeof Object.create&&(Object.create=function(j){var l=function(){};l.prototype=j;return new l}); +xmldom.LSSerializer=function(){function j(f,g){var a="",c=Object.create(f),b=l.filter?l.filter.acceptNode(g):1,d;if(1===b){d="";var k=g.attributes,e,i,h,n="",o;if(k){c[g.namespaceURI]!==g.prefix&&(c[g.namespaceURI]=g.prefix);d+="<"+g.nodeName;e=k.length;for(i=0;i"}a+=d}if(1===b||3===b){for(d=g.firstChild;d;)a+=j(c,d),d=d.nextSibling;g.nodeValue&&(a+=g.nodeValue)}1===b&&(c="",1===g.nodeType&&(c+=""),a+=c);return a}var l=this;this.filter=null;this.writeToString=function(f,g){if(!f)return"";var a;if(g){a=g;var c={},b;for(b in a)a.hasOwnProperty(b)&&(c[a[b]]=b);a=c}else a={};return j(a, +f)}}; +// Input 14 +xmldom.RelaxNGParser=function(){function j(a,b){this.message=function(){b&&(a+=1===b.nodeType?" Element ":" Node ",a+=b.nodeName,b.nodeValue&&(a+=" with value '"+b.nodeValue+"'"),a+=".");return a}}function l(a){if(2>=a.e.length)return a;var b={name:a.name,e:a.e.slice(0,2)};return l({name:a.name,e:[b].concat(a.e.slice(2))})}function f(a){var a=a.split(":",2),b="",c;1===a.length?a=["",a[0]]:b=a[0];for(c in d)d[c]===b&&(a[0]=c);return a}function g(a,b){for(var c=0,d,k,j=a.name;a.e&&c=c.length)return b;0===f&&(f=0);for(var h=c.item(f);h.namespaceURI===e;){f+=1;if(f>=c.length)return b;h=c.item(f)}return h=d(a,b.attDeriv(a,c.item(f)),c,f+1)}function k(a,b,c){c.e[0].a?(a.push(c.e[0].text),b.push(c.e[0].a.ns)):k(a,b,c.e[0]);c.e[1].a?(a.push(c.e[1].text),b.push(c.e[1].a.ns)): +k(a,b,c.e[1])}var e="http://www.w3.org/2000/xmlns/",i,h,n,o,u,s,p,w,B,A,q={type:"notAllowed",nullable:!1,hash:"notAllowed",textDeriv:function(){return q},startTagOpenDeriv:function(){return q},attDeriv:function(){return q},startTagCloseDeriv:function(){return q},endTagDeriv:function(){return q}},x={type:"empty",nullable:!0,hash:"empty",textDeriv:function(){return q},startTagOpenDeriv:function(){return q},attDeriv:function(){return q},startTagCloseDeriv:function(){return x},endTagDeriv:function(){return q}}, +E={type:"text",nullable:!0,hash:"text",textDeriv:function(){return E},startTagOpenDeriv:function(){return q},attDeriv:function(){return q},startTagCloseDeriv:function(){return E},endTagDeriv:function(){return q}},C,z,F;i=g("choice",function(a,b){if(a===q)return b;if(b===q||a===b)return a},function(b,c){var d={},e;a(d,{p1:b,p2:c});c=b=void 0;for(e in d)d.hasOwnProperty(e)&&(void 0===b?b=d[e]:c=void 0===c?d[e]:i(c,d[e]));return function(a,b){return{type:"choice",p1:a,p2:b,nullable:a.nullable||b.nullable, +textDeriv:function(c,d){return i(a.textDeriv(c,d),b.textDeriv(c,d))},startTagOpenDeriv:f(function(c){return i(a.startTagOpenDeriv(c),b.startTagOpenDeriv(c))}),attDeriv:function(c,d){return i(a.attDeriv(c,d),b.attDeriv(c,d))},startTagCloseDeriv:j(function(){return i(a.startTagCloseDeriv(),b.startTagCloseDeriv())}),endTagDeriv:j(function(){return i(a.endTagDeriv(),b.endTagDeriv())})}}(b,c)});h=function(a,b,c){return function(){var d={},e=0;return function(f,h){var i=b&&b(f,h),k,g;if(void 0!==i)return i; +i=f.hash||f.toString();k=h.hash||h.toString();i=f&&b.push(l(a.substring(c,d)))):"["===a[d]&&(0>=f&&(c=d+1),f+=1),d+=1;return d};f.prototype.next=function(){};f.prototype.reset=function(){};i=function(b,e,f){var g,h,i,j;for(g= +0;g text|list-item > text|list",c-=1;try{a.insertRule(b+ +" > list-item:before{"+d+"}",a.cssRules.length)}catch(e){throw e;}}function e(a,f,g,j){if("list"===f)for(var l=j.firstChild,m,t;l;){if(l.namespaceURI===n)if(m=l,"list-level-style-number"===l.localName){t=m;var r=t.getAttributeNS(h,"num-format"),o=t.getAttributeNS(h,"num-suffix"),s="",s={1:"decimal",a:"lower-latin",A:"upper-latin",i:"lower-roman",I:"upper-roman"},u="",u=t.getAttributeNS(h,"num-prefix")||"",u=s.hasOwnProperty(r)?u+(" counter(list, "+s[r]+")"):r?u+("'"+r+"';"):u+" ''";o&&(u+=" '"+o+ +"'");t=s="content: "+u+";";k(a,g,m,t)}else"list-level-style-image"===l.localName?(t="content: none;",k(a,g,m,t)):"list-level-style-bullet"===l.localName&&(t="content: '"+m.getAttributeNS(n,"bullet-char")+"';",k(a,g,m,t));l=l.nextSibling}else{g=c(f,g,j).join(",");l="";if(m=b(j,h,"text-properties")){t=""+d(m,p);r=m.getAttributeNS(h,"text-underline-style");"solid"===r&&(t+="text-decoration: underline;");if(r=m.getAttributeNS(h,"font-name"))(r='"'+r+'"')&&(t+="font-family: "+r+";");l+=t}if(m=b(j,h,"paragraph-properties")){t= +m;m=""+d(t,B);t=t.getElementsByTagNameNS(h,"background-image");if(0c)break;e=e.nextSibling}a.insertBefore(b,e)}}}function a(a){this.OdfContainer=a}function c(a,b,c){var d=this;this.size=0;this.type=null;this.name=a;this.container=b;this.onchange=this.onreadystatechange=this.document=this.mimetype=this.url=null;this.EMPTY=0;this.LOADING=1;this.DONE=2;this.state=this.EMPTY;this.load=function(){var b=u[a];this.mimetype=b;c.loadAsDataURL(a,b,function(a,b){d.url=b;if(d.onchange)d.onchange(d);if(d.onstatereadychange)d.onstatereadychange(d)})}; +this.abort=function(){}}function b(){this.length=0;this.item=function(){}}var d=new odf.StyleInfo,k=new odf.Style2CSS,e="urn:oasis:names:tc:opendocument:xmlns:office:1.0",i="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0",h="meta,settings,scripts,font-face-decls,styles,automatic-styles,master-styles,body".split(","),n=new core.Base64,o=new odf.FontLoader,u={};a.prototype=new function(){};a.prototype.constructor=a;a.namespaceURI=e;a.localName="document";c.prototype.load=function(){};c.prototype.getUrl= +function(){return this.data?"data:;base64,"+n.toBase64(this.data):null};odf.OdfContainer=function p(d,h){function l(a){for(var b=a.firstChild,c;b;)c=b.nextSibling,1===b.nodeType?l(b):7===b.nodeType&&a.removeChild(b),b=c}function n(a){var b=v.rootElement.ownerDocument,c;if(a){l(a.documentElement);try{c=b.importNode(a.documentElement,!0)}catch(d){}}return c}function x(a){v.state=a;if(v.onchange)v.onchange(v);if(v.onstatereadychange)v.onstatereadychange(v)}function E(a){var a=n(a),b=v.rootElement;!a|| +"document-styles"!==a.localName||a.namespaceURI!==e?x(p.INVALID):(b.fontFaceDecls=j(a,e,"font-face-decls"),g(b,b.fontFaceDecls),b.styles=j(a,e,"styles"),g(b,b.styles),b.automaticStyles=j(a,e,"automatic-styles"),g(b,b.automaticStyles),b.masterStyles=j(a,e,"master-styles"),g(b,b.masterStyles),o.loadFonts(b.fontFaceDecls,J,null))}function C(a){var a=n(a),b,c,d;if(!a||"document-content"!==a.localName||a.namespaceURI!==e)x(p.INVALID);else{b=v.rootElement;c=j(a,e,"font-face-decls");if(b.fontFaceDecls&& +c)for(d=c.firstChild;d;)b.fontFaceDecls.appendChild(d),d=c.firstChild;else c&&(b.fontFaceDecls=c,g(b,c));c=j(a,e,"automatic-styles");if(b.automaticStyles&&c)for(d=c.firstChild;d;)b.automaticStyles.appendChild(d),d=c.firstChild;else c&&(b.automaticStyles=c,g(b,c));b.body=j(a,e,"body");g(b,b.body)}}function z(a){var a=n(a),b;if(a&&!("document-meta"!==a.localName||a.namespaceURI!==e))b=v.rootElement,b.meta=j(a,e,"meta"),g(b,b.meta)}function F(a){var a=n(a),b;if(a&&!("document-settings"!==a.localName|| +a.namespaceURI!==e))b=v.rootElement,b.settings=j(a,e,"settings"),g(b,b.settings)}function m(a,b){J.loadAsDOM(a,b)}function t(){m("styles.xml",function(a,b){E(b);v.state!==p.INVALID&&m("content.xml",function(a,b){C(b);v.state!==p.INVALID&&m("meta.xml",function(a,b){z(b);v.state!==p.INVALID&&m("settings.xml",function(a,b){b&&F(b);m("META-INF/manifest.xml",function(a,b){if(b){var c=n(b),d;if(c&&!("manifest"!==c.localName||c.namespaceURI!==i)){d=v.rootElement;d.manifest=c;for(c=d.manifest.firstChild;c;)1=== +c.nodeType&&"file-entry"===c.localName&&c.namespaceURI===i&&(u[c.getAttributeNS(i,"full-path")]=c.getAttributeNS(i,"media-type")),c=c.nextSibling}}v.state!==p.INVALID&&x(p.DONE)})})})})})}function r(a,b){var c="",d;for(d in b)b.hasOwnProperty(d)&&(c+=" xmlns:"+d+'="'+b[d]+'"');return''}function y(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-meta",a);b.filter=new f(v.rootElement);c+=b.writeToString(v.rootElement.meta, +a);return c+""}function L(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-settings",a);b.filter=new f(v.rootElement);c+=b.writeToString(v.rootElement.settings,a);return c+""}function T(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-styles",a);b.filter=new f(v.rootElement,v.rootElement.masterStyles);c+=b.writeToString(v.rootElement.fontFaceDecls,a);c+=b.writeToString(v.rootElement.styles,a);c+=b.writeToString(v.rootElement.automaticStyles, +a);c+=b.writeToString(v.rootElement.masterStyles,a);return c+""}function O(){var a=k.namespaces,b=new xmldom.LSSerializer,c=r("document-content",a);b.filter=new f(v.rootElement,v.rootElement.body);c+=b.writeToString(v.rootElement.automaticStyles,a);c+=b.writeToString(v.rootElement.body,a);return c+""}function N(a,b){runtime.loadXML(a,function(a,c){if(a)b(a);else{var d=n(c);!d||"document"!==d.localName||d.namespaceURI!==e?x(p.INVALID):(v.rootElement= +d,d.fontFaceDecls=j(d,e,"font-face-decls"),d.styles=j(d,e,"styles"),d.automaticStyles=j(d,e,"automatic-styles"),d.masterStyles=j(d,e,"master-styles"),d.body=j(d,e,"body"),d.meta=j(d,e,"meta"),x(p.DONE))}})}var v=this,J=null;this.onstatereadychange=h;this.parts=this.rootElement=this.state=this.onchange=null;this.getPart=function(a){return new c(a,v,J)};this.save=function(a){var b;b=runtime.byteArrayFromString(L(),"utf8");J.save("settings.xml",b,!0,new Date);b=runtime.byteArrayFromString(y(),"utf8"); +J.save("meta.xml",b,!0,new Date);b=runtime.byteArrayFromString(T(),"utf8");J.save("styles.xml",b,!0,new Date);b=runtime.byteArrayFromString(O(),"utf8");J.save("content.xml",b,!0,new Date);J.write(function(b){a(b)})};this.state=p.LOADING;this.rootElement=function(a){var b=document.createElementNS(a.namespaceURI,a.localName),c,a=new a;for(c in a)a.hasOwnProperty(c)&&(b[c]=a[c]);return b}(a);this.parts=new b(this);J=new core.Zip(d,function(a,b){J=b;a?N(d,function(b){a&&(J.error=a+"\n"+b,x(p.INVALID))}): +t()})};odf.OdfContainer.EMPTY=0;odf.OdfContainer.LOADING=1;odf.OdfContainer.DONE=2;odf.OdfContainer.INVALID=3;odf.OdfContainer.SAVING=4;odf.OdfContainer.MODIFIED=5;odf.OdfContainer.getContainer=function(a){return new odf.OdfContainer(a,null)};return odf.OdfContainer}(); +// Input 24 +odf.Formatting=function(){function j(f){function g(a,b){for(var d=a&&a.firstChild;d&&b;)d=d.nextSibling,b-=1;return d}var a=g(f.startContainer,f.startOffset);g(f.endContainer,f.endOffset);this.next=function(){return null===a?a:null}}var l=new odf.StyleInfo;this.setOdfContainer=function(){};this.isCompletelyBold=function(){return!1};this.getAlignment=function(f){this.getParagraphStyles(f)};this.getParagraphStyles=function(f){var g,a,c,b=[];for(g=0;ga?-1:a-1})};a.slideChange=function(c){var b=a.getPages(a.odf_canvas.odfContainer().rootElement),d=-1,f=0;b.forEach(function(a){a=a[1];a.hasAttribute("slide_current")&&(d=f,a.removeAttribute("slide_current"));f+=1});c=c(d,b.length);-1===c&&(c=d); +b[c][1].setAttribute("slide_current","1");document.getElementById("pagelist").selectedIndex=c;"cont"===a.slide_mode&&window.scrollBy(0,b[c][1].getBoundingClientRect().top-30)};a.selectSlide=function(c){a.slideChange(function(a,d){return c>=d||0>c?-1:c})};a.scrollIntoContView=function(c){var b=a.getPages(a.odf_canvas.odfContainer().rootElement);0!==b.length&&window.scrollBy(0,b[c][1].getBoundingClientRect().top-30)};a.getPages=function(a){var a=a.getElementsByTagNameNS(f("draw"),"page"),b=[],d;for(d= +0;dd}}var a=l.node().ownerDocument,c=new core.Cursor(j,a);this.movePointForward=function(a){f(a,l.stepForward)};this.movePointBackward=function(a){f(a,l.stepBackward)};this.moveLineForward=function(a){j.modify?j.modify(a?"extend":"move","forward", +"line"):f(a,g)};this.moveLineBackward=function(a){j.modify?j.modify(a?"extend":"move","backward","line"):f(a,function(){})};return this}; +// Input 29 +runtime.loadClass("core.PointWalker");runtime.loadClass("core.Cursor"); +gui.XMLEdit=function(j,l){function f(a,b,c){a.addEventListener?a.addEventListener(b,c,!1):a.attachEvent?a.attachEvent("on"+b,c):a["on"+b]=c}function g(a){a.preventDefault?a.preventDefault():a.returnValue=!1}function a(){var a=j.ownerDocument.defaultView.getSelection();a&&!(0>=a.rangeCount)&&s&&(a=a.getRangeAt(0),s.setPoint(a.startContainer,a.startOffset))}function c(){var a=j.ownerDocument.defaultView.getSelection(),b,c;a.removeAllRanges();s&&s.node()&&(b=s.node(),c=b.ownerDocument.createRange(), +c.setStart(b,s.position()),c.collapse(!0),a.addRange(c))}function b(b){var d=b.charCode||b.keyCode;if(s=null,s&&37===d)a(),s.stepBackward(),c();else if(16<=d&&20>=d||33<=d&&40>=d)return;g(b)}function d(){}function k(a){j.ownerDocument.defaultView.getSelection().getRangeAt(0);g(a)}function e(a){for(var b=a.firstChild;b&&b!==a;)1===b.nodeType&&e(b),b=b.nextSibling||b.parentNode;var c,d,f,b=a.attributes;c="";for(f=b.length-1;0<=f;f-=1)d=b.item(f),c=c+" "+d.nodeName+'="'+d.nodeValue+'"';a.setAttribute("customns_name", +a.nodeName);a.setAttribute("customns_atts",c);b=a.firstChild;for(d=/^\s*$/;b&&b!==a;)c=b,b=b.nextSibling||b.parentNode,3===c.nodeType&&d.test(c.nodeValue)&&c.parentNode.removeChild(c)}function i(a,b){for(var c=a.firstChild,d,e,f;c&&c!==a;){if(1===c.nodeType){i(c,b);d=c.attributes;for(f=d.length-1;0<=f;f-=1)e=d.item(f),"http://www.w3.org/2000/xmlns/"===e.namespaceURI&&!b[e.nodeValue]&&(b[e.nodeValue]=e.localName)}c=c.nextSibling||c.parentNode}}function h(){var a=j.ownerDocument.createElement("style"), +b;b={};i(j,b);var c={},d,e,f=0;for(d in b)if(b.hasOwnProperty(d)&&d){e=b[d];if(!e||c.hasOwnProperty(e)||"xmlns"===e){do e="ns"+f,f+=1;while(c.hasOwnProperty(e));b[d]=e}c[e]=!0}a.type="text/css";b="@namespace customns url(customns);\n"+n;a.appendChild(j.ownerDocument.createTextNode(b));l=l.parentNode.replaceChild(a,l)}var n,o,u,s=null;j.id||(j.id="xml"+(""+Math.random()).substring(2));o="#"+j.id+" ";n=o+"*,"+o+":visited, "+o+":link {display:block; margin: 0px; margin-left: 10px; font-size: medium; color: black; background: white; font-variant: normal; font-weight: normal; font-style: normal; font-family: sans-serif; text-decoration: none; white-space: pre-wrap; height: auto; width: auto}\n"+ +o+":before {color: blue; content: '<' attr(customns_name) attr(customns_atts) '>';}\n"+o+":after {color: blue; content: '';}\n"+o+"{overflow: auto;}\n";(function(a){f(a,"click",k);f(a,"keydown",b);f(a,"keypress",d);f(a,"drop",g);f(a,"dragend",g);f(a,"beforepaste",g);f(a,"paste",g)})(j);this.updateCSS=h;this.setXML=function(a){a=a.documentElement||a;u=a=j.ownerDocument.importNode(a,true);for(e(a);j.lastChild;)j.removeChild(j.lastChild);j.appendChild(a);h();s=new core.PointWalker(a)}; +this.getXML=function(){return u}}; +// Input 30 +(function(){return"core/Async.js,core/Base64.js,core/ByteArray.js,core/ByteArrayWriter.js,core/Cursor.js,core/JSLint.js,core/PointWalker.js,core/RawDeflate.js,core/RawInflate.js,core/UnitTester.js,core/Zip.js,gui/Caret.js,gui/SelectionMover.js,gui/XMLEdit.js,gui/PresenterUI.js,odf/FontLoader.js,odf/Formatting.js,odf/OdfCanvas.js,odf/OdfContainer.js,odf/Style2CSS.js,odf/StyleInfo.js,xmldom/LSSerializer.js,xmldom/LSSerializerFilter.js,xmldom/OperationalTransformDOM.js,xmldom/OperationalTransformInterface.js,xmldom/RelaxNG.js,xmldom/RelaxNG2.js,xmldom/RelaxNGParser.js,xmldom/XPath.js".split(",")})(); diff --git a/apps/files_odfviewer/src/.gitignore b/apps/files_odfviewer/src/.gitignore new file mode 100644 index 0000000000..378eac25d3 --- /dev/null +++ b/apps/files_odfviewer/src/.gitignore @@ -0,0 +1 @@ +build diff --git a/apps/files_odfviewer/src/update.sh b/apps/files_odfviewer/src/update.sh new file mode 100755 index 0000000000..dad9bf35fb --- /dev/null +++ b/apps/files_odfviewer/src/update.sh @@ -0,0 +1,9 @@ +cd webodf +git pull +cd .. +rm -Rf build +mkdir build +cd build +cmake ../webodf +make webodf.js webodf-debug.js +cp webodf/webodf*.js ../../js/ diff --git a/apps/files_odfviewer/src/webodf/.gitignore b/apps/files_odfviewer/src/webodf/.gitignore new file mode 100644 index 0000000000..5f9afa1071 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/.gitignore @@ -0,0 +1,17 @@ +#android/bin +#android/gen +nativeQtClient/nativeQtClient.pro.user +programs/firefoxextension/content/webodf.js +programs/firefoxextension/content/webodf.css +programs/firefoxextension/install.rdf +programs/ios/WebODF.xcodeproj/project.xcworkspace +programs/ios/WebODF.xcodeproj/xcuserdata +programs/ios/www/ZoomIn.png +programs/ios/www/ZoomOut.png +programs/ios/www/app/ +programs/ios/www/sencha-touch.css +programs/ios/www/sencha-touch.js +programs/ios/www/webodf.css +programs/ios/www/webodf.js +.DS_Store +programs/ios/build/ diff --git a/apps/files_odfviewer/src/webodf/.gitmodules b/apps/files_odfviewer/src/webodf/.gitmodules new file mode 100644 index 0000000000..0d440b2a36 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/.gitmodules @@ -0,0 +1,9 @@ +[submodule "webodf/extjs"] + path = webodf/extjs + url = git://github.com/probonogeek/extjs.git +[submodule "simplerevisionserver/pywebdav"] + path = simplerevisionserver/pywebdav + url = ssh://vandenoever@heap.kogmbh.net/srv/git/pywebdav +[submodule "extjs"] + path = extjs + url = git://github.com/probonogeek/extjs.git diff --git a/apps/files_odfviewer/src/webodf/CMakeLists.txt b/apps/files_odfviewer/src/webodf/CMakeLists.txt new file mode 100644 index 0000000000..dfac345df1 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/CMakeLists.txt @@ -0,0 +1,160 @@ +# WebODF is mostly a JavaScript project. CMake needs to know about the C++ parts +project (WebODF C CXX) +# version 2.8.2 is needed to have support for zip files in external projects +cmake_minimum_required(VERSION 2.8.2) + +# At this point, the version number that is used throughout is defined +set(WEBODF_VERSION 0.3.0) + +# This makefile 'compiles' WebODF using various tools, instruments the code and +# builds and packages programs that use WebODF. + +# Find installed dependencies +find_package(Qt4 4.7.0 COMPONENTS QtCore QtGui QtXml QtNetwork QtWebKit) +if (NOT QT4_FOUND) + message(WARNING "Qt4 with modules QtCore QtGui QtXml QtNetwork QtWebKit was not found. qtjsruntime will no be built.") +endif (NOT QT4_FOUND) + +# java runtime is needed for Closure Compiler +find_package(Java COMPONENTS Runtime) + +if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + message(FATAL_ERROR "Compiling in the source directortory is not supported. Use for example 'mkdir build; cd build; cmake ..'.") +endif (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) + +# Tools must be obtained to work with: +include (ExternalProject) + +if(Java_JAVA_EXECUTABLE) + # Closure Compiler + ExternalProject_Add( + ClosureCompiler + URL "http://closure-compiler.googlecode.com/files/compiler-20120305.tar.gz" + URL_MD5 513344df6f18bfa00b17f034cabf897d + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + ) + set(CLOSURE_JAR ${CMAKE_BINARY_DIR}/ClosureCompiler-prefix/src/ClosureCompiler/compiler.jar) +endif(Java_JAVA_EXECUTABLE) + +# Rhino +if(Java_JAVA_EXECUTABLE) + ExternalProject_Add( + Rhino + URL "http://ftp.mozilla.org/pub/js/rhino1_7R3.zip" + URL_MD5 99d94103662a8d0b571e247a77432ac5 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + ) + set(RHINO ${CMAKE_BINARY_DIR}/Rhino-prefix/src/Rhino/js.jar) +endif(Java_JAVA_EXECUTABLE) + +# JSDoc +ExternalProject_Add( + JsDoc + URL "http://jsdoc-toolkit.googlecode.com/files/jsdoc_toolkit-2.4.0.zip" + URL_MD5 a8f78f5ecd24b54501147b2af341a231 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" +) +set(JSDOCDIR ${CMAKE_BINARY_DIR}/JsDoc-prefix/src/JsDoc/jsdoc-toolkit) + +# Node.JS +ExternalProject_Add( + NodeJS + URL "http://nodejs.org/dist/v0.6.15/node-v0.6.15.tar.gz" + URL_MD5 852cfb1ed8125a4cdba456446d869d19 + CONFIGURE_COMMAND "./configure" + BUILD_IN_SOURCE 1 + INSTALL_COMMAND "" +) +set(NODE ${CMAKE_BINARY_DIR}/NodeJS-prefix/src/NodeJS/out/Release/node) + +# JSCoverage +ExternalProject_Add( + JSCoverage + URL "http://siliconforks.com/jscoverage/download/jscoverage-0.5.1.tar.bz2" + URL_MD5 a70d79a6759367fbcc0bcc18d6866ff3 + PATCH_COMMAND patch -p0 < ${CMAKE_CURRENT_SOURCE_DIR}/JSCoverage.patch + CONFIGURE_COMMAND "./configure" + BUILD_IN_SOURCE 1 + INSTALL_COMMAND "" +) +set(JSCOVERAGE ${CMAKE_BINARY_DIR}/JSCoverage-prefix/src/JSCoverage/jscoverage) + +# Android +if (NOT ANDROID_SDK_DIR) + find_path(ANDROID_SDK_DIR platform-tools/aapt) +endif(NOT ANDROID_SDK_DIR) +if (NOT ANT) + find_file(ANT NAMES ant ant.exe /usr/bin /usr/local/bin) +endif(NOT ANT) + + + +set(LIBJSFILES lib/packages.js lib/runtime.js lib/core/Base64.js + lib/core/RawDeflate.js lib/core/ByteArray.js + lib/core/ByteArrayWriter.js lib/core/RawInflate.js + lib/core/Cursor.js lib/core/UnitTester.js + lib/core/PointWalker.js lib/core/Async.js + lib/core/Zip.js + + lib/xmldom/LSSerializerFilter.js lib/xmldom/LSSerializer.js + lib/xmldom/RelaxNGParser.js lib/xmldom/RelaxNG.js + lib/xmldom/RelaxNG2.js lib/xmldom/OperationalTransformInterface.js + lib/xmldom/OperationalTransformDOM.js + lib/xmldom/XPath.js + + lib/odf/StyleInfo.js lib/odf/Style2CSS.js + lib/odf/FontLoader.js lib/odf/OdfContainer.js + lib/odf/Formatting.js lib/odf/OdfCanvas.js + + lib/gui/PresenterUI.js lib/gui/Caret.js + lib/gui/SelectionMover.js lib/gui/XMLEdit.js + + lib/manifest.js +) + +set(HTML5UIFILES + app/app.js app/controller/Files.js app/model/FileSystem.js + app/views/FileDetail.js app/views/FilesList.js app/views/OdfView.js + app/views/Viewport.js sencha-touch.css sencha-touch.js + app/store/FileStore.js + ZoomOut.png ZoomIn.png go-previous.png go-next.png + zoom-fit-width.png zoom-fit-best.png zoom-fit-height.png +) + +add_subdirectory(webodf) +add_subdirectory(programs) + +# package webodf +set(WEBODFZIP webodf-${WEBODF_VERSION}.zip) +set(WEBODFZIP_FILES + ${CMAKE_BINARY_DIR}/webodf/webodf-debug.js + ${CMAKE_BINARY_DIR}/webodf/webodf.js + ${CMAKE_SOURCE_DIR}/webodf/webodf.css +) +add_custom_command( + OUTPUT ${WEBODFZIP} + # zip using javascript code running in node.js + COMMAND ${NODE} ARGS webodf/lib/runtime.js packwebodf.js + ${CMAKE_BINARY_DIR}/${WEBODFZIP} +#input files + ${WEBODFZIP_FILES} +#output files + webodf-debug.js + webodf.js + webodf.css + DEPENDS NodeJS + packwebodf.js + ${WEBODFZIP_FILES} + webodf-debug.js + webodf.js + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} +) +add_custom_target(zip ALL DEPENDS ${WEBODFZIP}) + +# vim:expandtab diff --git a/apps/files_odfviewer/src/webodf/JSCoverage.patch b/apps/files_odfviewer/src/webodf/JSCoverage.patch new file mode 100644 index 0000000000..b769f40b9d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/JSCoverage.patch @@ -0,0 +1,13 @@ +--- ./util.c_ 2011-04-20 11:22:46.558521731 +0200 ++++ ./util.c 2011-04-20 11:23:23.999880771 +0200 +@@ -478,6 +478,10 @@ + p->next = head; + head = p; + } ++ else if (S_ISDIR(buf.st_mode)) { ++ head = recursive_dir_list(root, entry_wrt_root, head); ++ free(entry_wrt_root); ++ } + else { + fatal("refusing to follow symbolic link: %s", entry); + } diff --git a/apps/files_odfviewer/src/webodf/packwebodf.js b/apps/files_odfviewer/src/webodf/packwebodf.js new file mode 100644 index 0000000000..3a0d76c692 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/packwebodf.js @@ -0,0 +1,93 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true*/ +runtime.loadClass("core.Zip"); +runtime.loadClass("core.Base64"); + +function addFiles(zip, pos, inputfiles, zipfiles, callback) { + "use strict"; + if (inputfiles.length !== zipfiles.length) { + return callback( + "Arrays inputfiles and zipfiles should have the same length."); + } + if (pos >= inputfiles.length) { + zip.write(function (err) { + return callback(err); + }); + return; + } + var inputfile = inputfiles[pos], + zipmemberpath = zipfiles[pos]; + runtime.readFile(inputfile, "binary", function (err, data) { + var base64; + if (err) { + return callback(err); + } + zip.save(zipmemberpath, data, false, new Date()); + addFiles(zip, pos + 1, inputfiles, zipfiles, callback); + }); +} + +function usage() { + "use strict"; + runtime.log("Usage:"); +} + +/** + * This script takes 1+2n arguments + * First argument is the name of the target zip file. + * The next n arguments are the input files. The last n arguments are the + * names of the files in the zip file. + */ +if (arguments.length % 2 !== 0) { + runtime.log("Wrong number of arguments."); + usage(); + runtime.exit(1); +} +var args = arguments, + n = (args.length - 2) / 2, + zipfilename = args[1], + inputmembers = [], + zipmembers = [], + i, + zip = new core.Zip(zipfilename, null); +for (i = 0; i < n; i += 1) { + inputmembers[i] = args[2 + i]; + zipmembers[i] = args[2 + n + i]; +} +addFiles(zip, 0, inputmembers, zipmembers, function (err) { + "use strict"; + if (err) { + runtime.log(err); + } +}); diff --git a/apps/files_odfviewer/src/webodf/programs/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/CMakeLists.txt new file mode 100644 index 0000000000..4621a25d67 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/CMakeLists.txt @@ -0,0 +1,30 @@ +macro(COPY_FILES _varname _srcdir _tgtdir) + foreach(_file ${ARGN}) + GET_FILENAME_COMPONENT(_subdir ${_file} PATH) + FILE(MAKE_DIRECTORY ${_tgtdir}/${_subdir}) + add_custom_command( + OUTPUT ${_tgtdir}/${_file} + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different + ${_srcdir}/${_file} + ${_tgtdir}/${_file} + DEPENDS + ${_srcdir}/${_file} + ) + set(${_varname} ${${_varname}} ${_tgtdir}/${_file}) + endforeach(_file) +endmacro(COPY_FILES _directory _files) + +if(QT4_FOUND) + add_subdirectory(qtjsruntime) + add_subdirectory(nativeQtClient) + add_subdirectory(docnosis) +endif(QT4_FOUND) + +if(ANDROID_SDK_DIR AND ANT) + add_subdirectory(android) +endif(ANDROID_SDK_DIR AND ANT) + +add_subdirectory(firefoxextension) + +add_subdirectory(touchui) +add_subdirectory(playbook) diff --git a/apps/files_odfviewer/src/webodf/programs/android/AndroidManifest.xml b/apps/files_odfviewer/src/webodf/programs/android/AndroidManifest.xml new file mode 100644 index 0000000000..491bbb80a2 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/AndroidManifest.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/android/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/android/CMakeLists.txt new file mode 100644 index 0000000000..b16c5a2f69 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/CMakeLists.txt @@ -0,0 +1,41 @@ +set(ANDROID_JAR ${ANDROID_SDK_DIR}/platforms/android-8/android.jar) + +COPY_FILES(APKDEPS ${CMAKE_SOURCE_DIR}/programs/touchui + ${CMAKE_CURRENT_BINARY_DIR}/assets/www ${HTML5UIFILES}) +COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR}/assets/www + ${CMAKE_CURRENT_BINARY_DIR}/assets/www + index.html icon.png phonegap-1.4.1.js) +COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR}/res + ${CMAKE_CURRENT_BINARY_DIR}/res + drawable-hdpi/ic_launcher.png drawable-ldpi/ic_launcher.png + drawable/icon.png drawable-mdpi/ic_launcher.png values/strings.xml + xml/phonegap.xml xml/plugins.xml layout/selector.xml + layout/main.xml layout/listitem.xml) +COPY_FILES(APKDEPS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} + src/org/webodf/WebODFActivity.java libs/phonegap-1.4.1.jar + AndroidManifest.xml) +COPY_FILES(APKDEPS ${CMAKE_SOURCE_DIR}/webodf + ${CMAKE_CURRENT_BINARY_DIR}/assets/www webodf.css) +COPY_FILES(APKDEPS ${CMAKE_BINARY_DIR}/webodf + ${CMAKE_CURRENT_BINARY_DIR}/assets/www webodf.js) + +set(WEBODFAPK ${CMAKE_CURRENT_BINARY_DIR}/bin/WebODF-debug.apk) +add_custom_command( + OUTPUT ${WEBODFAPK} + COMMAND ${ANDROID_SDK_DIR}/tools/android + ARGS update project --path . --target android-7 --name WebODF + COMMAND ${ANT} + ARGS -lib ${CMAKE_CURRENT_SOURCE_DIR}/libs/phonegap-1.4.1.jar debug + DEPENDS ${APKDEPS} + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) +add_custom_target(apk ALL DEPENDS ${WEBODFAPK}) +set(WEBODFRELEASEAPK ${CMAKE_CURRENT_BINARY_DIR}/bin/WebODF-release.apk) +add_custom_command( + OUTPUT ${WEBODFRELEASEAPK} + COMMAND ${ANT} + ARGS -lib ${CMAKE_CURRENT_SOURCE_DIR}/libs/phonegap-1.4.1.jar release + DEPENDS ${WEBODFAPK} webodf.js + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) +add_custom_target(releaseapk ALL DEPENDS ${WEBODFRELEASEAPK}) diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/config.xml b/apps/files_odfviewer/src/webodf/programs/android/assets/www/config.xml new file mode 100644 index 0000000000..21b5ca9ecc --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/assets/www/config.xml @@ -0,0 +1,25 @@ + + + + WebODF: online/offline office + + A viewer for ODF files. + + + Jos van den Oever + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/icon.png b/apps/files_odfviewer/src/webodf/programs/android/assets/www/icon.png new file mode 100644 index 0000000000..2993aa9f14 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/android/assets/www/icon.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/index.html b/apps/files_odfviewer/src/webodf/programs/android/assets/www/index.html new file mode 100644 index 0000000000..d9a299d24d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/assets/www/index.html @@ -0,0 +1,46 @@ + + + + WebODF + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/android/assets/www/phonegap-1.4.1.js b/apps/files_odfviewer/src/webodf/programs/android/assets/www/phonegap-1.4.1.js new file mode 100644 index 0000000000..908b8a8a21 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/assets/www/phonegap-1.4.1.js @@ -0,0 +1,4586 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + */ + +// Version 1.2.0 + +if (typeof PhoneGap === "undefined") { + +/** + * The order of events during page load and PhoneGap startup is as follows: + * + * onDOMContentLoaded Internal event that is received when the web page is loaded and parsed. + * window.onload Body onload event. + * onNativeReady Internal event that indicates the PhoneGap native side is ready. + * onPhoneGapInit Internal event that kicks off creation of all PhoneGap JavaScript objects (runs constructors). + * onPhoneGapReady Internal event fired when all PhoneGap JavaScript objects have been created + * onPhoneGapInfoReady Internal event fired when device properties are available + * onDeviceReady User event fired to indicate that PhoneGap is ready + * onResume User event fired to indicate a start/resume lifecycle event + * onPause User event fired to indicate a pause lifecycle event + * onDestroy Internal event fired when app is being destroyed (User should use window.onunload event, not this one). + * + * The only PhoneGap events that user code should register for are: + * deviceready PhoneGap native code is initialized and PhoneGap APIs can be called from JavaScript + * pause App has moved to background + * resume App has returned to foreground + * + * Listeners can be registered as: + * document.addEventListener("deviceready", myDeviceReadyListener, false); + * document.addEventListener("resume", myResumeListener, false); + * document.addEventListener("pause", myPauseListener, false); + * + * The DOM lifecycle events should be used for saving and restoring state + * window.onload + * window.onunload + */ + +/** + * This represents the PhoneGap API itself, and provides a global namespace for accessing + * information about the state of PhoneGap. + * @class + */ +var PhoneGap = { + documentEventHandler: {}, // Collection of custom document event handlers + windowEventHandler: {} // Collection of custom window event handlers +}; + +/** + * List of resource files loaded by PhoneGap. + * This is used to ensure JS and other files are loaded only once. + */ +PhoneGap.resources = {base: true}; + +/** + * Determine if resource has been loaded by PhoneGap + * + * @param name + * @return + */ +PhoneGap.hasResource = function(name) { + return PhoneGap.resources[name]; +}; + +/** + * Add a resource to list of loaded resources by PhoneGap + * + * @param name + */ +PhoneGap.addResource = function(name) { + PhoneGap.resources[name] = true; +}; + +/** + * Custom pub-sub channel that can have functions subscribed to it + * @constructor + */ +PhoneGap.Channel = function (type) +{ + this.type = type; + this.handlers = {}; + this.guid = 0; + this.fired = false; + this.enabled = true; +}; + +/** + * Subscribes the given function to the channel. Any time that + * Channel.fire is called so too will the function. + * Optionally specify an execution context for the function + * and a guid that can be used to stop subscribing to the channel. + * Returns the guid. + */ +PhoneGap.Channel.prototype.subscribe = function(f, c, g) { + // need a function to call + if (f === null) { return; } + + var func = f; + if (typeof c === "object" && typeof f === "function") { func = PhoneGap.close(c, f); } + + g = g || func.observer_guid || f.observer_guid || this.guid++; + func.observer_guid = g; + f.observer_guid = g; + this.handlers[g] = func; + return g; +}; + +/** + * Like subscribe but the function is only called once and then it + * auto-unsubscribes itself. + */ +PhoneGap.Channel.prototype.subscribeOnce = function(f, c) { + var g = null; + var _this = this; + var m = function() { + f.apply(c || null, arguments); + _this.unsubscribe(g); + }; + if (this.fired) { + if (typeof c === "object" && typeof f === "function") { f = PhoneGap.close(c, f); } + f.apply(this, this.fireArgs); + } else { + g = this.subscribe(m); + } + return g; +}; + +/** + * Unsubscribes the function with the given guid from the channel. + */ +PhoneGap.Channel.prototype.unsubscribe = function(g) { + if (typeof g === "function") { g = g.observer_guid; } + this.handlers[g] = null; + delete this.handlers[g]; +}; + +/** + * Calls all functions subscribed to this channel. + */ +PhoneGap.Channel.prototype.fire = function(e) { + if (this.enabled) { + var fail = false; + var item, handler, rv; + for (item in this.handlers) { + if (this.handlers.hasOwnProperty(item)) { + handler = this.handlers[item]; + if (typeof handler === "function") { + rv = (handler.apply(this, arguments) === false); + fail = fail || rv; + } + } + } + this.fired = true; + this.fireArgs = arguments; + return !fail; + } + return true; +}; + +/** + * Calls the provided function only after all of the channels specified + * have been fired. + */ +PhoneGap.Channel.join = function(h, c) { + var i = c.length; + var f = function() { + if (!(--i)) { + h(); + } + }; + var len = i; + var j; + for (j=0; j + * + * @param name The plugin name + * @param obj The plugin object + */ +PhoneGap.addPlugin = function(name, obj) { + if (!window.plugins[name]) { + window.plugins[name] = obj; + } + else { + console.log("Error: Plugin "+name+" already exists."); + } +}; + +/** + * onDOMContentLoaded channel is fired when the DOM content + * of the page has been parsed. + */ +PhoneGap.onDOMContentLoaded = new PhoneGap.Channel('onDOMContentLoaded'); + +/** + * onNativeReady channel is fired when the PhoneGap native code + * has been initialized. + */ +PhoneGap.onNativeReady = new PhoneGap.Channel('onNativeReady'); + +/** + * onPhoneGapInit channel is fired when the web page is fully loaded and + * PhoneGap native code has been initialized. + */ +PhoneGap.onPhoneGapInit = new PhoneGap.Channel('onPhoneGapInit'); + +/** + * onPhoneGapReady channel is fired when the JS PhoneGap objects have been created. + */ +PhoneGap.onPhoneGapReady = new PhoneGap.Channel('onPhoneGapReady'); + +/** + * onPhoneGapInfoReady channel is fired when the PhoneGap device properties + * has been set. + */ +PhoneGap.onPhoneGapInfoReady = new PhoneGap.Channel('onPhoneGapInfoReady'); + +/** + * onPhoneGapConnectionReady channel is fired when the PhoneGap connection properties + * has been set. + */ +PhoneGap.onPhoneGapConnectionReady = new PhoneGap.Channel('onPhoneGapConnectionReady'); + +/** + * onDestroy channel is fired when the PhoneGap native code + * is destroyed. It is used internally. + * Window.onunload should be used by the user. + */ +PhoneGap.onDestroy = new PhoneGap.Channel('onDestroy'); +PhoneGap.onDestroy.subscribeOnce(function() { + PhoneGap.shuttingDown = true; +}); +PhoneGap.shuttingDown = false; + +// _nativeReady is global variable that the native side can set +// to signify that the native code is ready. It is a global since +// it may be called before any PhoneGap JS is ready. +if (typeof _nativeReady !== 'undefined') { PhoneGap.onNativeReady.fire(); } + +/** + * onDeviceReady is fired only after all PhoneGap objects are created and + * the device properties are set. + */ +PhoneGap.onDeviceReady = new PhoneGap.Channel('onDeviceReady'); + + +// Array of channels that must fire before "deviceready" is fired +PhoneGap.deviceReadyChannelsArray = [ PhoneGap.onPhoneGapReady, PhoneGap.onPhoneGapInfoReady, PhoneGap.onPhoneGapConnectionReady]; + +// Hashtable of user defined channels that must also fire before "deviceready" is fired +PhoneGap.deviceReadyChannelsMap = {}; + +/** + * Indicate that a feature needs to be initialized before it is ready to be used. + * This holds up PhoneGap's "deviceready" event until the feature has been initialized + * and PhoneGap.initComplete(feature) is called. + * + * @param feature {String} The unique feature name + */ +PhoneGap.waitForInitialization = function(feature) { + if (feature) { + var channel = new PhoneGap.Channel(feature); + PhoneGap.deviceReadyChannelsMap[feature] = channel; + PhoneGap.deviceReadyChannelsArray.push(channel); + } +}; + +/** + * Indicate that initialization code has completed and the feature is ready to be used. + * + * @param feature {String} The unique feature name + */ +PhoneGap.initializationComplete = function(feature) { + var channel = PhoneGap.deviceReadyChannelsMap[feature]; + if (channel) { + channel.fire(); + } +}; + +/** + * Create all PhoneGap objects once page has fully loaded and native side is ready. + */ +PhoneGap.Channel.join(function() { + + // Start listening for XHR callbacks + setTimeout(function() { + if (PhoneGap.UsePolling) { + PhoneGap.JSCallbackPolling(); + } + else { + var polling = prompt("usePolling", "gap_callbackServer:"); + PhoneGap.UsePolling = polling; + if (polling == "true") { + PhoneGap.UsePolling = true; + PhoneGap.JSCallbackPolling(); + } + else { + PhoneGap.UsePolling = false; + PhoneGap.JSCallback(); + } + } + }, 1); + + // Run PhoneGap constructors + PhoneGap.onPhoneGapInit.fire(); + + // Fire event to notify that all objects are created + PhoneGap.onPhoneGapReady.fire(); + + // Fire onDeviceReady event once all constructors have run and PhoneGap info has been + // received from native side, and any user defined initialization channels. + PhoneGap.Channel.join(function() { + // Let native code know we are inited on JS side + prompt("", "gap_init:"); + + PhoneGap.onDeviceReady.fire(); + }, PhoneGap.deviceReadyChannelsArray); + +}, [ PhoneGap.onDOMContentLoaded, PhoneGap.onNativeReady ]); + +// Listen for DOMContentLoaded and notify our channel subscribers +document.addEventListener('DOMContentLoaded', function() { + PhoneGap.onDOMContentLoaded.fire(); +}, false); + +// Intercept calls to document.addEventListener and watch for deviceready +PhoneGap.m_document_addEventListener = document.addEventListener; + +// Intercept calls to window.addEventListener +PhoneGap.m_window_addEventListener = window.addEventListener; + +/** + * Add a custom window event handler. + * + * @param {String} event The event name that callback handles + * @param {Function} callback The event handler + */ +PhoneGap.addWindowEventHandler = function(event, callback) { + PhoneGap.windowEventHandler[event] = callback; +}; + +/** + * Add a custom document event handler. + * + * @param {String} event The event name that callback handles + * @param {Function} callback The event handler + */ +PhoneGap.addDocumentEventHandler = function(event, callback) { + PhoneGap.documentEventHandler[event] = callback; +}; + +/** + * Intercept adding document event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + if (e === 'deviceready') { + PhoneGap.onDeviceReady.subscribeOnce(handler); + } + else { + // If subscribing to Android backbutton + if (e === 'backbutton') { + PhoneGap.exec(null, null, "App", "overrideBackbutton", [true]); + } + + // If subscribing to an event that is handled by a plugin + else if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { + if (PhoneGap.documentEventHandler[e](e, handler, true)) { + return; // Stop default behavior + } + } + + PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); + } +}; + +/** + * Intercept adding window event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If subscribing to an event that is handled by a plugin + if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { + if (PhoneGap.windowEventHandler[e](e, handler, true)) { + return; // Stop default behavior + } + } + + PhoneGap.m_window_addEventListener.call(window, evt, handler, capture); +}; + +// Intercept calls to document.removeEventListener and watch for events that +// are generated by PhoneGap native code +PhoneGap.m_document_removeEventListener = document.removeEventListener; + +// Intercept calls to window.removeEventListener +PhoneGap.m_window_removeEventListener = window.removeEventListener; + +/** + * Intercept removing document event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If unsubscribing to Android backbutton + if (e === 'backbutton') { + PhoneGap.exec(null, null, "App", "overrideBackbutton", [false]); + } + + // If unsubcribing from an event that is handled by a plugin + if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { + if (PhoneGap.documentEventHandler[e](e, handler, false)) { + return; // Stop default behavior + } + } + + PhoneGap.m_document_removeEventListener.call(document, evt, handler, capture); +}; + +/** + * Intercept removing window event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If unsubcribing from an event that is handled by a plugin + if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { + if (PhoneGap.windowEventHandler[e](e, handler, false)) { + return; // Stop default behavior + } + } + + PhoneGap.m_window_removeEventListener.call(window, evt, handler, capture); +}; + +/** + * Method to fire document event + * + * @param {String} type The event type to fire + * @param {Object} data Data to send with event + */ +PhoneGap.fireDocumentEvent = function(type, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + document.dispatchEvent(e); +}; + +/** + * Method to fire window event + * + * @param {String} type The event type to fire + * @param {Object} data Data to send with event + */ +PhoneGap.fireWindowEvent = function(type, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + window.dispatchEvent(e); +}; + +/** + * Does a deep clone of the object. + * + * @param obj + * @return {Object} + */ +PhoneGap.clone = function(obj) { + var i, retVal; + if(!obj) { + return obj; + } + + if(obj instanceof Array){ + retVal = []; + for(i = 0; i < obj.length; ++i){ + retVal.push(PhoneGap.clone(obj[i])); + } + return retVal; + } + + if (typeof obj === "function") { + return obj; + } + + if(!(obj instanceof Object)){ + return obj; + } + + if (obj instanceof Date) { + return obj; + } + + retVal = {}; + for(i in obj){ + if(!(i in retVal) || retVal[i] !== obj[i]) { + retVal[i] = PhoneGap.clone(obj[i]); + } + } + return retVal; +}; + +PhoneGap.callbackId = 0; +PhoneGap.callbacks = {}; +PhoneGap.callbackStatus = { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }; + + +/** + * Execute a PhoneGap command. It is up to the native side whether this action is synch or async. + * The native side can return: + * Synchronous: PluginResult object as a JSON string + * Asynchrounous: Empty string "" + * If async, the native side will PhoneGap.callbackSuccess or PhoneGap.callbackError, + * depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action Action to be run in PhoneGap + * @param {Array.} [args] Zero or more arguments to pass to the method + */ +PhoneGap.exec = function(success, fail, service, action, args) { + try { + var callbackId = service + PhoneGap.callbackId++; + if (success || fail) { + PhoneGap.callbacks[callbackId] = {success:success, fail:fail}; + } + + var r = prompt(JSON.stringify(args), "gap:"+JSON.stringify([service, action, callbackId, true])); + + // If a result was returned + if (r.length > 0) { + eval("var v="+r+";"); + + // If status is OK, then return value back to caller + if (v.status === PhoneGap.callbackStatus.OK) { + + // If there is a success callback, then call it now with + // returned value + if (success) { + try { + success(v.message); + } catch (e) { + console.log("Error in success callback: " + callbackId + " = " + e); + } + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + return v.message; + } + + // If no result + else if (v.status === PhoneGap.callbackStatus.NO_RESULT) { + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + + // If error, then display error + else { + console.log("Error: Status="+v.status+" Message="+v.message); + + // If there is a fail callback, then call it now with returned value + if (fail) { + try { + fail(v.message); + } + catch (e1) { + console.log("Error in error callback: "+callbackId+" = "+e1); + } + + // Clear callback if not expecting any more results + if (!v.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } + return null; + } + } + } catch (e2) { + console.log("Error: "+e2); + } +}; + +/** + * Called by native code when returning successful result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackSuccess = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + + // If result is to be sent to callback + if (args.status === PhoneGap.callbackStatus.OK) { + try { + if (PhoneGap.callbacks[callbackId].success) { + PhoneGap.callbacks[callbackId].success(args.message); + } + } + catch (e) { + console.log("Error in success callback: "+callbackId+" = "+e); + } + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + +/** + * Called by native code when returning error result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackError = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + try { + if (PhoneGap.callbacks[callbackId].fail) { + PhoneGap.callbacks[callbackId].fail(args.message); + } + } + catch (e) { + console.log("Error in error callback: "+callbackId+" = "+e); + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + +PhoneGap.JSCallbackPort = null; +PhoneGap.JSCallbackToken = null; + +/** + * This is only for Android. + * + * Internal function that uses XHR to call into PhoneGap Java code and retrieve + * any JavaScript code that needs to be run. This is used for callbacks from + * Java to JavaScript. + */ +PhoneGap.JSCallback = function() { + + // Exit if shutting down app + if (PhoneGap.shuttingDown) { + return; + } + + // If polling flag was changed, start using polling from now on + if (PhoneGap.UsePolling) { + PhoneGap.JSCallbackPolling(); + return; + } + + var xmlhttp = new XMLHttpRequest(); + + // Callback function when XMLHttpRequest is ready + xmlhttp.onreadystatechange=function(){ + if(xmlhttp.readyState === 4){ + + // Exit if shutting down app + if (PhoneGap.shuttingDown) { + return; + } + + // If callback has JavaScript statement to execute + if (xmlhttp.status === 200) { + + // Need to url decode the response + var msg = decodeURIComponent(xmlhttp.responseText); + setTimeout(function() { + try { + var t = eval(msg); + } + catch (e) { + // If we're getting an error here, seeing the message will help in debugging + console.log("JSCallback: Message from Server: " + msg); + console.log("JSCallback Error: "+e); + } + }, 1); + setTimeout(PhoneGap.JSCallback, 1); + } + + // If callback ping (used to keep XHR request from timing out) + else if (xmlhttp.status === 404) { + setTimeout(PhoneGap.JSCallback, 10); + } + + // If security error + else if (xmlhttp.status === 403) { + console.log("JSCallback Error: Invalid token. Stopping callbacks."); + } + + // If server is stopping + else if (xmlhttp.status === 503) { + console.log("JSCallback Server Closed: Stopping callbacks."); + } + + // If request wasn't GET + else if (xmlhttp.status === 400) { + console.log("JSCallback Error: Bad request. Stopping callbacks."); + } + + // If error, revert to polling + else { + console.log("JSCallback Error: Request failed."); + PhoneGap.UsePolling = true; + PhoneGap.JSCallbackPolling(); + } + } + }; + + if (PhoneGap.JSCallbackPort === null) { + PhoneGap.JSCallbackPort = prompt("getPort", "gap_callbackServer:"); + } + if (PhoneGap.JSCallbackToken === null) { + PhoneGap.JSCallbackToken = prompt("getToken", "gap_callbackServer:"); + } + xmlhttp.open("GET", "http://127.0.0.1:"+PhoneGap.JSCallbackPort+"/"+PhoneGap.JSCallbackToken , true); + xmlhttp.send(); +}; + +/** + * The polling period to use with JSCallbackPolling. + * This can be changed by the application. The default is 50ms. + */ +PhoneGap.JSCallbackPollingPeriod = 50; + +/** + * Flag that can be set by the user to force polling to be used or force XHR to be used. + */ +PhoneGap.UsePolling = false; // T=use polling, F=use XHR + +/** + * This is only for Android. + * + * Internal function that uses polling to call into PhoneGap Java code and retrieve + * any JavaScript code that needs to be run. This is used for callbacks from + * Java to JavaScript. + */ +PhoneGap.JSCallbackPolling = function() { + + // Exit if shutting down app + if (PhoneGap.shuttingDown) { + return; + } + + // If polling flag was changed, stop using polling from now on + if (!PhoneGap.UsePolling) { + PhoneGap.JSCallback(); + return; + } + + var msg = prompt("", "gap_poll:"); + if (msg) { + setTimeout(function() { + try { + var t = eval(""+msg); + } + catch (e) { + console.log("JSCallbackPolling: Message from Server: " + msg); + console.log("JSCallbackPolling Error: "+e); + } + }, 1); + setTimeout(PhoneGap.JSCallbackPolling, 1); + } + else { + setTimeout(PhoneGap.JSCallbackPolling, PhoneGap.JSCallbackPollingPeriod); + } +}; + +/** + * Create a UUID + * + * @return {String} + */ +PhoneGap.createUUID = function() { + return PhoneGap.UUIDcreatePart(4) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(6); +}; + +PhoneGap.UUIDcreatePart = function(length) { + var uuidpart = ""; + var i, uuidchar; + for (i=0; i frequency + 10 sec + PhoneGap.exec( + function(timeout) { + if (timeout < (frequency + 10000)) { + PhoneGap.exec(null, null, "Accelerometer", "setTimeout", [frequency + 10000]); + } + }, + function(e) { }, "Accelerometer", "getTimeout", []); + + // Start watch timer + var id = PhoneGap.createUUID(); + navigator.accelerometer.timers[id] = setInterval(function() { + PhoneGap.exec(successCallback, errorCallback, "Accelerometer", "getAcceleration", []); + }, (frequency ? frequency : 1)); + + return id; +}; + +/** + * Clears the specified accelerometer watch. + * + * @param {String} id The id of the watch returned from #watchAcceleration. + */ +Accelerometer.prototype.clearWatch = function(id) { + + // Stop javascript timer & remove from timer list + if (id && navigator.accelerometer.timers[id] !== undefined) { + clearInterval(navigator.accelerometer.timers[id]); + delete navigator.accelerometer.timers[id]; + } +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.accelerometer === "undefined") { + navigator.accelerometer = new Accelerometer(); + } +}); +} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + */ + +if (!PhoneGap.hasResource("app")) { +PhoneGap.addResource("app"); +(function() { + +/** + * Constructor + * @constructor + */ +var App = function() {}; + +/** + * Clear the resource cache. + */ +App.prototype.clearCache = function() { + PhoneGap.exec(null, null, "App", "clearCache", []); +}; + +/** + * Load the url into the webview or into new browser instance. + * + * @param url The URL to load + * @param props Properties that can be passed in to the activity: + * wait: int => wait msec before loading URL + * loadingDialog: "Title,Message" => display a native loading dialog + * loadUrlTimeoutValue: int => time in msec to wait before triggering a timeout error + * clearHistory: boolean => clear webview history (default=false) + * openExternal: boolean => open in a new browser (default=false) + * + * Example: + * navigator.app.loadUrl("http://server/myapp/index.html", {wait:2000, loadingDialog:"Wait,Loading App", loadUrlTimeoutValue: 60000}); + */ +App.prototype.loadUrl = function(url, props) { + PhoneGap.exec(null, null, "App", "loadUrl", [url, props]); +}; + +/** + * Cancel loadUrl that is waiting to be loaded. + */ +App.prototype.cancelLoadUrl = function() { + PhoneGap.exec(null, null, "App", "cancelLoadUrl", []); +}; + +/** + * Clear web history in this web view. + * Instead of BACK button loading the previous web page, it will exit the app. + */ +App.prototype.clearHistory = function() { + PhoneGap.exec(null, null, "App", "clearHistory", []); +}; + +/** + * Go to previous page displayed. + * This is the same as pressing the backbutton on Android device. + */ +App.prototype.backHistory = function() { + PhoneGap.exec(null, null, "App", "backHistory", []); +}; + +/** + * Exit and terminate the application. + */ +App.prototype.exitApp = function() { + return PhoneGap.exec(null, null, "App", "exitApp", []); +}; + +PhoneGap.addConstructor(function() { + navigator.app = new App(); +}); +}()); +} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + */ + +if (!PhoneGap.hasResource("battery")) { +PhoneGap.addResource("battery"); + +/** + * This class contains information about the current battery status. + * @constructor + */ +var Battery = function() { + this._level = null; + this._isPlugged = null; + this._batteryListener = []; + this._lowListener = []; + this._criticalListener = []; +}; + +/** + * Registers as an event producer for battery events. + * + * @param {Object} eventType + * @param {Object} handler + * @param {Object} add + */ +Battery.prototype.eventHandler = function(eventType, handler, add) { + var me = navigator.battery; + if (add) { + // If there are no current registered event listeners start the battery listener on native side. + if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { + PhoneGap.exec(me._status, me._error, "Battery", "start", []); + } + + // Register the event listener in the proper array + if (eventType === "batterystatus") { + if (me._batteryListener.indexOf(handler) === -1) { + me._batteryListener.push(handler); + } + } else if (eventType === "batterylow") { + if (me._lowListener.indexOf(handler) === -1) { + me._lowListener.push(handler); + } + } else if (eventType === "batterycritical") { + if (me._criticalListener.indexOf(handler) === -1) { + me._criticalListener.push(handler); + } + } + } else { + var pos = -1; + // Remove the event listener from the proper array + if (eventType === "batterystatus") { + pos = me._batteryListener.indexOf(handler); + if (pos > -1) { + me._batteryListener.splice(pos, 1); + } + } else if (eventType === "batterylow") { + pos = me._lowListener.indexOf(handler); + if (pos > -1) { + me._lowListener.splice(pos, 1); + } + } else if (eventType === "batterycritical") { + pos = me._criticalListener.indexOf(handler); + if (pos > -1) { + me._criticalListener.splice(pos, 1); + } + } + + // If there are no more registered event listeners stop the battery listener on native side. + if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { + PhoneGap.exec(null, null, "Battery", "stop", []); + } + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function(info) { + if (info) { + var me = this; + var level = info.level; + if (me._level !== level || me._isPlugged !== info.isPlugged) { + // Fire batterystatus event + PhoneGap.fireWindowEvent("batterystatus", info); + + // Fire low battery event + if (level === 20 || level === 5) { + if (level === 20) { + PhoneGap.fireWindowEvent("batterylow", info); + } + else { + PhoneGap.fireWindowEvent("batterycritical", info); + } + } + } + me._level = level; + me._isPlugged = info.isPlugged; + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.battery === "undefined") { + navigator.battery = new Battery(); + PhoneGap.addWindowEventHandler("batterystatus", navigator.battery.eventHandler); + PhoneGap.addWindowEventHandler("batterylow", navigator.battery.eventHandler); + PhoneGap.addWindowEventHandler("batterycritical", navigator.battery.eventHandler); + } +}); +} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + */ + +if (!PhoneGap.hasResource("camera")) { +PhoneGap.addResource("camera"); + +/** + * This class provides access to the device camera. + * + * @constructor + */ +var Camera = function() { + this.successCallback = null; + this.errorCallback = null; + this.options = null; +}; + +/** + * Format of image that returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.DestinationType = { + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1 // Return file uri (content://media/external/images/media/2 for Android) +}; +Camera.prototype.DestinationType = Camera.DestinationType; + +/** + * Encoding of image returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.CAMERA, + * encodingType: Camera.EncodingType.PNG}) +*/ +Camera.EncodingType = { + JPEG: 0, // Return JPEG encoded image + PNG: 1 // Return PNG encoded image +}; +Camera.prototype.EncodingType = Camera.EncodingType; + +/** + * Type of pictures to select from. Only applicable when + * PictureSourceType is PHOTOLIBRARY or SAVEDPHOTOALBUM + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY, + * mediaType: Camera.MediaType.PICTURE}) + */ +Camera.MediaType = { + PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType + VIDEO: 1, // allow selection of video only, ONLY RETURNS URL + ALLMEDIA : 2 // allow selection from all media types +}; +Camera.prototype.MediaType = Camera.MediaType; + + +/** + * Source to getPicture from. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.PictureSourceType = { + PHOTOLIBRARY : 0, // Choose image from picture library (same as SAVEDPHOTOALBUM for Android) + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library (same as PHOTOLIBRARY for Android) +}; +Camera.prototype.PictureSourceType = Camera.PictureSourceType; + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=DATA_URL. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +Camera.prototype.getPicture = function(successCallback, errorCallback, options) { + + // successCallback required + if (typeof successCallback !== "function") { + console.log("Camera Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("Camera Error: errorCallback is not a function"); + return; + } + + if (options === null || typeof options === "undefined") { + options = {}; + } + if (options.quality === null || typeof options.quality === "undefined") { + options.quality = 80; + } + if (options.maxResolution === null || typeof options.maxResolution === "undefined") { + options.maxResolution = 0; + } + if (options.destinationType === null || typeof options.destinationType === "undefined") { + options.destinationType = Camera.DestinationType.FILE_URI; + } + if (options.sourceType === null || typeof options.sourceType === "undefined") { + options.sourceType = Camera.PictureSourceType.CAMERA; + } + if (options.encodingType === null || typeof options.encodingType === "undefined") { + options.encodingType = Camera.EncodingType.JPEG; + } + if (options.mediaType === null || typeof options.mediaType === "undefined") { + options.mediaType = Camera.MediaType.PICTURE; + } + if (options.targetWidth === null || typeof options.targetWidth === "undefined") { + options.targetWidth = -1; + } + else if (typeof options.targetWidth === "string") { + var width = new Number(options.targetWidth); + if (isNaN(width) === false) { + options.targetWidth = width.valueOf(); + } + } + if (options.targetHeight === null || typeof options.targetHeight === "undefined") { + options.targetHeight = -1; + } + else if (typeof options.targetHeight === "string") { + var height = new Number(options.targetHeight); + if (isNaN(height) === false) { + options.targetHeight = height.valueOf(); + } + } + + PhoneGap.exec(successCallback, errorCallback, "Camera", "takePicture", [options]); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.camera === "undefined") { + navigator.camera = new Camera(); + } +}); +} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + */ + +if (!PhoneGap.hasResource("capture")) { +PhoneGap.addResource("capture"); + +/** + * Represents a single file. + * + * name {DOMString} name of the file, without path information + * fullPath {DOMString} the full path of the file, including the name + * type {DOMString} mime type + * lastModifiedDate {Date} last modified date + * size {Number} size of the file in bytes + */ +var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ + this.name = name || null; + this.fullPath = fullPath || null; + this.type = type || null; + this.lastModifiedDate = lastModifiedDate || null; + this.size = size || 0; +}; + +/** + * Launch device camera application for recording video(s). + * + * @param {Function} successCB + * @param {Function} errorCB + */ +MediaFile.prototype.getFormatData = function(successCallback, errorCallback){ + PhoneGap.exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); +}; + +/** + * MediaFileData encapsulates format information of a media file. + * + * @param {DOMString} codecs + * @param {long} bitrate + * @param {long} height + * @param {long} width + * @param {float} duration + */ +var MediaFileData = function(codecs, bitrate, height, width, duration){ + this.codecs = codecs || null; + this.bitrate = bitrate || 0; + this.height = height || 0; + this.width = width || 0; + this.duration = duration || 0; +}; + +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +var CaptureError = function(){ + this.code = null; +}; + +// Capture error codes +CaptureError.CAPTURE_INTERNAL_ERR = 0; +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +var Capture = function(){ + this.supportedAudioModes = []; + this.supportedImageModes = []; + this.supportedVideoModes = []; +}; + +/** + * Launch audio recorder application for recording audio clip(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureAudioOptions} options + */ +Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ + PhoneGap.exec(successCallback, errorCallback, "Capture", "captureAudio", [options]); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options){ + PhoneGap.exec(successCallback, errorCallback, "Capture", "captureImage", [options]); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype._castMediaFile = function(pluginResult){ + var mediaFiles = []; + var i; + for (i = 0; i < pluginResult.message.length; i++) { + var mediaFile = new MediaFile(); + mediaFile.name = pluginResult.message[i].name; + mediaFile.fullPath = pluginResult.message[i].fullPath; + mediaFile.type = pluginResult.message[i].type; + mediaFile.lastModifiedDate = pluginResult.message[i].lastModifiedDate; + mediaFile.size = pluginResult.message[i].size; + mediaFiles.push(mediaFile); + } + pluginResult.message = mediaFiles; + return pluginResult; +}; + +/** + * Launch device camera application for recording video(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureVideoOptions} options + */ +Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ + PhoneGap.exec(successCallback, errorCallback, "Capture", "captureVideo", [options]); +}; + +/** + * Encapsulates a set of parameters that the capture device supports. + */ +var ConfigurationData = function(){ + // The ASCII-encoded string in lower case representing the media type. + this.type = null; + // The height attribute represents height of the image or video in pixels. + // In the case of a sound clip this attribute has value 0. + this.height = 0; + // The width attribute represents width of the image or video in pixels. + // In the case of a sound clip this attribute has value 0 + this.width = 0; +}; + +/** + * Encapsulates all image capture operation configuration options. + */ +var CaptureImageOptions = function(){ + // Upper limit of images user can take. Value must be equal or greater than 1. + this.limit = 1; + // The selected image mode. Must match with one of the elements in supportedImageModes array. + this.mode = null; +}; + +/** + * Encapsulates all video capture operation configuration options. + */ +var CaptureVideoOptions = function(){ + // Upper limit of videos user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single video clip in seconds. + this.duration = 0; + // The selected video mode. Must match with one of the elements in supportedVideoModes array. + this.mode = null; +}; + +/** + * Encapsulates all audio capture operation configuration options. + */ +var CaptureAudioOptions = function(){ + // Upper limit of sound clips user can record. Value must be equal or greater than 1. + this.limit = 1; + // Maximum duration of a single sound clip in seconds. + this.duration = 0; + // The selected audio mode. Must match with one of the elements in supportedAudioModes array. + this.mode = null; +}; + +PhoneGap.addConstructor(function(){ + if (typeof navigator.device.capture === "undefined") { + navigator.device.capture = window.device.capture = new Capture(); + } +}); +} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + */ + +if (!PhoneGap.hasResource("compass")) { +PhoneGap.addResource("compass"); + +var CompassError = function(){ + this.code = null; +}; + +// Capture error codes +CompassError.COMPASS_INTERNAL_ERR = 0; +CompassError.COMPASS_NOT_SUPPORTED = 20; + +var CompassHeading = function() { + this.magneticHeading = null; + this.trueHeading = null; + this.headingAccuracy = null; + this.timestamp = null; +}; + +/** + * This class provides access to device Compass data. + * @constructor + */ +var Compass = function() { + /** + * The last known Compass position. + */ + this.lastHeading = null; + + /** + * List of compass watch timers + */ + this.timers = {}; +}; + +Compass.ERROR_MSG = ["Not running", "Starting", "", "Failed to start"]; + +/** + * Asynchronously aquires the current heading. + * + * @param {Function} successCallback The function to call when the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + * @param {PositionOptions} options The options for getting the heading data such as timeout. (OPTIONAL) + */ +Compass.prototype.getCurrentHeading = function(successCallback, errorCallback, options) { + + // successCallback required + if (typeof successCallback !== "function") { + console.log("Compass Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("Compass Error: errorCallback is not a function"); + return; + } + + // Get heading + PhoneGap.exec(successCallback, errorCallback, "Compass", "getHeading", []); +}; + +/** + * Asynchronously aquires the heading repeatedly at a given interval. + * + * @param {Function} successCallback The function to call each time the heading data is available + * @param {Function} errorCallback The function to call when there is an error getting the heading data. (OPTIONAL) + * @param {HeadingOptions} options The options for getting the heading data such as timeout and the frequency of the watch. (OPTIONAL) + * @return String The watch id that must be passed to #clearWatch to stop watching. + */ +Compass.prototype.watchHeading= function(successCallback, errorCallback, options) { + + // Default interval (100 msec) + var frequency = (options !== undefined) ? options.frequency : 100; + + // successCallback required + if (typeof successCallback !== "function") { + console.log("Compass Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback !== "function")) { + console.log("Compass Error: errorCallback is not a function"); + return; + } + + // Make sure compass timeout > frequency + 10 sec + PhoneGap.exec( + function(timeout) { + if (timeout < (frequency + 10000)) { + PhoneGap.exec(null, null, "Compass", "setTimeout", [frequency + 10000]); + } + }, + function(e) { }, "Compass", "getTimeout", []); + + // Start watch timer to get headings + var id = PhoneGap.createUUID(); + navigator.compass.timers[id] = setInterval( + function() { + PhoneGap.exec(successCallback, errorCallback, "Compass", "getHeading", []); + }, (frequency ? frequency : 1)); + + return id; +}; + + +/** + * Clears the specified heading watch. + * + * @param {String} id The ID of the watch returned from #watchHeading. + */ +Compass.prototype.clearWatch = function(id) { + + // Stop javascript timer & remove from timer list + if (id && navigator.compass.timers[id]) { + clearInterval(navigator.compass.timers[id]); + delete navigator.compass.timers[id]; + } +}; + +Compass.prototype._castDate = function(pluginResult) { + if (pluginResult.message.timestamp) { + var timestamp = new Date(pluginResult.message.timestamp); + pluginResult.message.timestamp = timestamp; + } + return pluginResult; +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.compass === "undefined") { + navigator.compass = new Compass(); + } +}); +} +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF 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. + */ + +if (!PhoneGap.hasResource("contact")) { +PhoneGap.addResource("contact"); + +/** +* Contains information about a single contact. +* @constructor +* @param {DOMString} id unique identifier +* @param {DOMString} displayName +* @param {ContactName} name +* @param {DOMString} nickname +* @param {Array.} phoneNumbers array of phone numbers +* @param {Array.} emails array of email addresses +* @param {Array.} addresses array of addresses +* @param {Array.} ims instant messaging user ids +* @param {Array.} organizations +* @param {DOMString} birthday contact's birthday +* @param {DOMString} note user notes about contact +* @param {Array.} photos +* @param {Array.} categories +* @param {Array.} urls contact's web sites +*/ +var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.rawId = null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; // ContactField[] + this.urls = urls || null; // ContactField[] +}; + +/** + * ContactError. + * An error code assigned by an implementation when an error has occurreds + * @constructor + */ +var ContactError = function() { + this.code=null; +}; + +/** + * Error codes + */ +ContactError.UNKNOWN_ERROR = 0; +ContactError.INVALID_ARGUMENT_ERROR = 1; +ContactError.TIMEOUT_ERROR = 2; +ContactError.PENDING_OPERATION_ERROR = 3; +ContactError.IO_ERROR = 4; +ContactError.NOT_SUPPORTED_ERROR = 5; +ContactError.PERMISSION_DENIED_ERROR = 20; + +/** +* Removes contact from device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.remove = function(successCB, errorCB) { + if (this.id === null) { + var errorObj = new ContactError(); + errorObj.code = ContactError.UNKNOWN_ERROR; + errorCB(errorObj); + } + else { + PhoneGap.exec(successCB, errorCB, "Contacts", "remove", [this.id]); + } +}; + +/** +* Creates a deep copy of this Contact. +* With the contact ID set to null. +* @return copy of this Contact +*/ +Contact.prototype.clone = function() { + var clonedContact = PhoneGap.clone(this); + var i; + clonedContact.id = null; + clonedContact.rawId = null; + // Loop through and clear out any id's in phones, emails, etc. + if (clonedContact.phoneNumbers) { + for (i = 0; i < clonedContact.phoneNumbers.length; i++) { + clonedContact.phoneNumbers[i].id = null; + } + } + if (clonedContact.emails) { + for (i = 0; i < clonedContact.emails.length; i++) { + clonedContact.emails[i].id = null; + } + } + if (clonedContact.addresses) { + for (i = 0; i < clonedContact.addresses.length; i++) { + clonedContact.addresses[i].id = null; + } + } + if (clonedContact.ims) { + for (i = 0; i < clonedContact.ims.length; i++) { + clonedContact.ims[i].id = null; + } + } + if (clonedContact.organizations) { + for (i = 0; i < clonedContact.organizations.length; i++) { + clonedContact.organizations[i].id = null; + } + } + if (clonedContact.tags) { + for (i = 0; i < clonedContact.tags.length; i++) { + clonedContact.tags[i].id = null; + } + } + if (clonedContact.photos) { + for (i = 0; i < clonedContact.photos.length; i++) { + clonedContact.photos[i].id = null; + } + } + if (clonedContact.urls) { + for (i = 0; i < clonedContact.urls.length; i++) { + clonedContact.urls[i].id = null; + } + } + return clonedContact; +}; + +/** +* Persists contact to device storage. +* @param successCB success callback +* @param errorCB error callback +*/ +Contact.prototype.save = function(successCB, errorCB) { + PhoneGap.exec(successCB, errorCB, "Contacts", "save", [this]); +}; + +/** +* Contact name. +* @constructor +* @param formatted +* @param familyName +* @param givenName +* @param middle +* @param prefix +* @param suffix +*/ +var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { + this.formatted = formatted || null; + this.familyName = familyName || null; + this.givenName = givenName || null; + this.middleName = middle || null; + this.honorificPrefix = prefix || null; + this.honorificSuffix = suffix || null; +}; + +/** +* Generic contact field. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param type +* @param value +* @param pref +*/ +var ContactField = function(type, value, pref) { + this.id = null; + this.type = type || null; + this.value = value || null; + this.pref = pref || null; +}; + +/** +* Contact address. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param formatted +* @param streetAddress +* @param locality +* @param region +* @param postalCode +* @param country +*/ +var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { + this.id = null; + this.pref = pref || null; + this.type = type || null; + this.formatted = formatted || null; + this.streetAddress = streetAddress || null; + this.locality = locality || null; + this.region = region || null; + this.postalCode = postalCode || null; + this.country = country || null; +}; + +/** +* Contact organization. +* @constructor +* @param {DOMString} id unique identifier, should only be set by native code +* @param name +* @param dept +* @param title +* @param startDate +* @param endDate +* @param location +* @param desc +*/ +var ContactOrganization = function(pref, type, name, dept, title) { + this.id = null; + this.pref = pref || null; + this.type = type || null; + this.name = name || null; + this.department = dept || null; + this.title = title || null; +}; + +/** +* Represents a group of Contacts. +* @constructor +*/ +var Contacts = function() { + this.inProgress = false; + this.records = []; +}; +/** +* Returns an array of Contacts matching the search criteria. +* @param fields that should be searched +* @param successCB success callback +* @param errorCB error callback +* @param {ContactFindOptions} options that can be applied to contact searching +* @return array of Contacts matching search criteria +*/ +Contacts.prototype.find = function(fields, successCB, errorCB, options) { + if (successCB === null) { + throw new TypeError("You must specify a success callback for the find command."); + } + if (fields === null || fields === "undefined" || fields.length === "undefined" || fields.length <= 0) { + if (typeof errorCB === "function") { + errorCB({"code": ContactError.INVALID_ARGUMENT_ERROR}); + } + } else { + PhoneGap.exec(successCB, errorCB, "Contacts", "search", [fields, options]); + } +}; + +/** +* This function creates a new contact, but it does not persist the contact +* to device storage. To persist the contact to device storage, invoke +* contact.save(). +* @param properties an object who's properties will be examined to create a new Contact +* @returns new Contact object +*/ +Contacts.prototype.create = function(properties) { + var i; + var contact = new Contact(); + for (i in properties) { + if (contact[i] !== 'undefined') { + contact[i] = properties[i]; + } + } + return contact; +}; + +/** +* This function returns and array of contacts. It is required as we need to convert raw +* JSON objects into concrete Contact objects. Currently this method is called after +* navigator.contacts.find but before the find methods success call back. +* +* @param jsonArray an array of JSON Objects that need to be converted to Contact objects. +* @returns an array of Contact objects +*/ +Contacts.prototype.cast = function(pluginResult) { + var contacts = []; + var i; + for (i=0; i][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + this.fileName = ""; + if (typeof file.fullPath === "undefined") { + this.fileName = file; + } else { + this.fileName = file.fullPath; + } + + // LOADING state + this.readyState = FileReader.LOADING; + + // If loadstart callback + if (typeof this.onloadstart === "function") { + this.onloadstart({"type":"loadstart", "target":this}); + } + + var me = this; + + // Read file + PhoneGap.exec( + // Success callback + function(r) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileReader.DONE) { + return; + } + + // Save result + me.result = r; + + // If onload callback + if (typeof me.onload === "function") { + me.onload({"type":"load", "target":me}); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend({"type":"loadend", "target":me}); + } + }, + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileReader.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror({"type":"error", "target":me}); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + me.onloadend({"type":"loadend", "target":me}); + } + }, "File", "readAsDataURL", [this.fileName]); +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsBinaryString = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +/** + * Read file and return data as a binary data. + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +//----------------------------------------------------------------------------- +// File Writer +//----------------------------------------------------------------------------- + +/** + * This class writes to the mobile device file system. + * + * For Android: + * The root directory is the root of the file system. + * To write to the SD card, the file name is "sdcard/my_file.txt" + * + * @constructor + * @param file {File} File object containing file properties + * @param append if true write to the end of the file, otherwise overwrite the file + */ +var FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.fileName = file.fullPath || file; + this.length = file.size || 0; + } + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +}; + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw FileError.INVALID_STATE_ERR; + } + + // set error + var error = new FileError(), evt; + error.code = error.ABORT_ERR; + this.error = error; + + // If error callback + if (typeof this.onerror === "function") { + this.onerror({"type":"error", "target":this}); + } + // If abort callback + if (typeof this.onabort === "function") { + this.onabort({"type":"abort", "target":this}); + } + + this.readyState = FileWriter.DONE; + + // If write end callback + if (typeof this.onwriteend === "function") { + this.onwriteend({"type":"writeend", "target":this}); + } +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart({"type":"writestart", "target":me}); + } + + // Write file + PhoneGap.exec( + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + me.length = me.position; + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite({"type":"write", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + }, + // Error callback + function(e) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror({"type":"error", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + }, "File", "write", [this.fileName, text, this.position]); +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + if (!offset) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger then file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + me.onwritestart({"type":"writestart", "target":this}); + } + + // Write file + PhoneGap.exec( + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + me.onwrite({"type":"write", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + }, + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + me.onerror({"type":"error", "target":me}); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + me.onwriteend({"type":"writeend", "target":me}); + } + }, "File", "truncate", [this.fileName, size]); +}; + +/** + * Information about the state of the file or directory + * + * @constructor + * {Date} modificationTime (readonly) + */ +var Metadata = function() { + this.modificationTime=null; +}; + +/** + * Supplies arguments to methods that lookup or create files and directories + * + * @constructor + * @param {boolean} create file or directory if it doesn't exist + * @param {boolean} exclusive if true the command will fail if the file or directory exists + */ +var Flags = function(create, exclusive) { + this.create = create || false; + this.exclusive = exclusive || false; +}; + +/** + * An interface representing a file system + * + * @constructor + * {DOMString} name the unique name of the file system (readonly) + * {DirectoryEntry} root directory of the file system (readonly) + */ +var FileSystem = function() { + this.name = null; + this.root = null; +}; + +/** + * An interface that lists the files and directories in a directory. + * @constructor + */ +var DirectoryReader = function(fullPath){ + this.fullPath = fullPath || null; +}; + +/** + * Returns a list of entries from a directory. + * + * @param {Function} successCallback is called with a list of entries + * @param {Function} errorCallback is called with a FileError + */ +DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "readEntries", [this.fullPath]); +}; + +/** + * An interface representing a directory on the file system. + * + * @constructor + * {boolean} isFile always false (readonly) + * {boolean} isDirectory always true (readonly) + * {DOMString} name of the directory, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the directory (readonly) + * {FileSystem} filesystem on which the directory resides (readonly) + */ +var DirectoryEntry = function() { + this.isFile = false; + this.isDirectory = true; + this.name = null; + this.fullPath = null; + this.filesystem = null; +}; + +/** + * Copies a directory to a new location + * + * @param {DirectoryEntry} parent the directory to which to copy the entry + * @param {DOMString} newName the new name of the entry, defaults to the current name + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "copyTo", [this.fullPath, parent, newName]); +}; + +/** + * Looks up the metadata of the entry + * + * @param {Function} successCallback is called with a Metadata object + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getMetadata = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "getMetadata", [this.fullPath]); +}; + +/** + * Gets the parent of the entry + * + * @param {Function} successCallback is called with a parent entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getParent = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "getParent", [this.fullPath]); +}; + +/** + * Moves a directory to a new location + * + * @param {DirectoryEntry} parent the directory to which to move the entry + * @param {DOMString} newName the new name of the entry, defaults to the current name + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "moveTo", [this.fullPath, parent, newName]); +}; + +/** + * Removes the entry + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.remove = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "remove", [this.fullPath]); +}; + +/** + * Returns a URI that can be used to identify this entry. + * + * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI. + * @return uri + */ +DirectoryEntry.prototype.toURI = function(mimeType) { + return "file://" + this.fullPath; +}; + +/** + * Creates a new DirectoryReader to read entries from this directory + */ +DirectoryEntry.prototype.createReader = function(successCallback, errorCallback) { + return new DirectoryReader(this.fullPath); +}; + +/** + * Creates or looks up a directory + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory + * @param {Flags} options to create or excluively create the directory + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "getDirectory", [this.fullPath, path, options]); +}; + +/** + * Creates or looks up a file + * + * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file + * @param {Flags} options to create or excluively create the file + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "getFile", [this.fullPath, path, options]); +}; + +/** + * Deletes a directory and all of it's contents + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "removeRecursively", [this.fullPath]); +}; + +/** + * An interface representing a directory on the file system. + * + * @constructor + * {boolean} isFile always true (readonly) + * {boolean} isDirectory always false (readonly) + * {DOMString} name of the file, excluding the path leading to it (readonly) + * {DOMString} fullPath the absolute full path to the file (readonly) + * {FileSystem} filesystem on which the directory resides (readonly) + */ +var FileEntry = function() { + this.isFile = true; + this.isDirectory = false; + this.name = null; + this.fullPath = null; + this.filesystem = null; +}; + +/** + * Copies a file to a new location + * + * @param {DirectoryEntry} parent the directory to which to copy the entry + * @param {DOMString} newName the new name of the entry, defaults to the current name + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.copyTo = function(parent, newName, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "copyTo", [this.fullPath, parent, newName]); +}; + +/** + * Looks up the metadata of the entry + * + * @param {Function} successCallback is called with a Metadata object + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.getMetadata = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "getMetadata", [this.fullPath]); +}; + +/** + * Gets the parent of the entry + * + * @param {Function} successCallback is called with a parent entry + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.getParent = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "getParent", [this.fullPath]); +}; + +/** + * Moves a directory to a new location + * + * @param {DirectoryEntry} parent the directory to which to move the entry + * @param {DOMString} newName the new name of the entry, defaults to the current name + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.moveTo = function(parent, newName, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "moveTo", [this.fullPath, parent, newName]); +}; + +/** + * Removes the entry + * + * @param {Function} successCallback is called with no parameters + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.remove = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "remove", [this.fullPath]); +}; + +/** + * Returns a URI that can be used to identify this entry. + * + * @param {DOMString} mimeType for a FileEntry, the mime type to be used to interpret the file, when loaded through this URI. + * @return uri + */ +FileEntry.prototype.toURI = function(mimeType) { + return "file://" + this.fullPath; +}; + +/** + * Creates a new FileWriter associated with the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new FileWriter + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.createWriter = function(successCallback, errorCallback) { + this.file(function(filePointer) { + var writer = new FileWriter(filePointer); + + if (writer.fileName === null || writer.fileName === "") { + if (typeof errorCallback === "function") { + errorCallback({ + "code": FileError.INVALID_STATE_ERR + }); + } + } + + if (typeof successCallback === "function") { + successCallback(writer); + } + }, errorCallback); +}; + +/** + * Returns a File that represents the current state of the file that this FileEntry represents. + * + * @param {Function} successCallback is called with the new File object + * @param {Function} errorCallback is called with a FileError + */ +FileEntry.prototype.file = function(successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "getFileMetadata", [this.fullPath]); +}; + +/** @constructor */ +var LocalFileSystem = function() { +}; + +// File error codes +LocalFileSystem.TEMPORARY = 0; +LocalFileSystem.PERSISTENT = 1; +LocalFileSystem.RESOURCE = 2; +LocalFileSystem.APPLICATION = 3; + +/** + * Requests a filesystem in which to store application data. + * + * @param {int} type of file system being requested + * @param {Function} successCallback is called with the new FileSystem + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.requestFileSystem = function(type, size, successCallback, errorCallback) { + if (type < 0 || type > 3) { + if (typeof errorCallback === "function") { + errorCallback({ + "code": FileError.SYNTAX_ERR + }); + } + } + else { + PhoneGap.exec(successCallback, errorCallback, "File", "requestFileSystem", [type, size]); + } +}; + +/** + * + * @param {DOMString} uri referring to a local file in a filesystem + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.resolveLocalFileSystemURI = function(uri, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "File", "resolveLocalFileSystemURI", [uri]); +}; + +/** +* This function returns and array of contacts. It is required as we need to convert raw +* JSON objects into concrete Contact objects. Currently this method is called after +* navigator.service.contacts.find but before the find methods success call back. +* +* @param a JSON Objects that need to be converted to DirectoryEntry or FileEntry objects. +* @returns an entry +*/ +LocalFileSystem.prototype._castFS = function(pluginResult) { + var entry = null; + entry = new DirectoryEntry(); + entry.isDirectory = pluginResult.message.root.isDirectory; + entry.isFile = pluginResult.message.root.isFile; + entry.name = pluginResult.message.root.name; + entry.fullPath = pluginResult.message.root.fullPath; + pluginResult.message.root = entry; + return pluginResult; +}; + +LocalFileSystem.prototype._castEntry = function(pluginResult) { + var entry = null; + if (pluginResult.message.isDirectory) { + entry = new DirectoryEntry(); + } + else if (pluginResult.message.isFile) { + entry = new FileEntry(); + } + entry.isDirectory = pluginResult.message.isDirectory; + entry.isFile = pluginResult.message.isFile; + entry.name = pluginResult.message.name; + entry.fullPath = pluginResult.message.fullPath; + pluginResult.message = entry; + return pluginResult; +}; + +LocalFileSystem.prototype._castEntries = function(pluginResult) { + var entries = pluginResult.message; + var retVal = []; + for (var i=0; i 0) + { + var constructor = PhoneGap._constructors.shift(); + try + { + constructor(); + } + catch(e) + { + if (typeof(console['log']) == 'function') + { + console.log("Failed to run constructor: " + console.processMessage(e)); + } + else + { + alert("Failed to run constructor: " + e.message); + } + } + } + // all constructors run, now fire the deviceready event + var e = document.createEvent('Events'); + e.initEvent('deviceready'); + document.dispatchEvent(e); + } + }, 1); +})(); + +// session id for calls +PhoneGap.sessionKey = 0; + +// centralized callbacks +PhoneGap.callbackId = 0; +PhoneGap.callbacks = {}; +PhoneGap.callbackStatus = { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }; + +/** + * Creates a gap bridge iframe used to notify the native code about queued + * commands. + * + * @private + */ +PhoneGap.createGapBridge = function() { + gapBridge = document.createElement("iframe"); + gapBridge.setAttribute("style", "display:none;"); + gapBridge.setAttribute("height","0px"); + gapBridge.setAttribute("width","0px"); + gapBridge.setAttribute("frameborder","0"); + document.documentElement.appendChild(gapBridge); + return gapBridge; +} + +/** + * Execute a PhoneGap command by queuing it and letting the native side know + * there are queued commands. The native side will then request all of the + * queued commands and execute them. + * + * Arguments may be in one of two formats: + * + * FORMAT ONE (preferable) + * The native side will call PhoneGap.callbackSuccess or + * PhoneGap.callbackError, depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action The name of the action to use + * @param {String[]} [args] Zero or more arguments to pass to the method + * + * FORMAT TWO + * @param {String} command Command to be run in PhoneGap, e.g. + * "ClassName.method" + * @param {String[]} [args] Zero or more arguments to pass to the method + * object parameters are passed as an array object + * [object1, object2] each object will be passed as + * JSON strings + */ +PhoneGap.exec = function() { + if (!PhoneGap.available) { + alert("ERROR: Attempting to call PhoneGap.exec()" + +" before 'deviceready'. Ignoring."); + return; + } + + var successCallback, failCallback, service, action, actionArgs; + var callbackId = null; + if (typeof arguments[0] !== "string") { + // FORMAT ONE + successCallback = arguments[0]; + failCallback = arguments[1]; + service = arguments[2]; + action = arguments[3]; + actionArgs = arguments[4]; + + // Since we need to maintain backwards compatibility, we have to pass + // an invalid callbackId even if no callback was provided since plugins + // will be expecting it. The PhoneGap.exec() implementation allocates + // an invalid callbackId and passes it even if no callbacks were given. + callbackId = 'INVALID'; + } else { + // FORMAT TWO + splitCommand = arguments[0].split("."); + action = splitCommand.pop(); + service = splitCommand.join("."); + actionArgs = Array.prototype.splice.call(arguments, 1); + } + + // Start building the command object. + var command = { + className: service, + methodName: action, + arguments: [] + }; + + // Register the callbacks and add the callbackId to the positional + // arguments if given. + if (successCallback || failCallback) { + callbackId = service + PhoneGap.callbackId++; + PhoneGap.callbacks[callbackId] = + {success:successCallback, fail:failCallback}; + } + if (callbackId != null) { + command.arguments.push(callbackId); + } + + for (var i = 0; i < actionArgs.length; ++i) { + var arg = actionArgs[i]; + if (arg == undefined || arg == null) { + continue; + } else if (typeof(arg) == 'object') { + command.options = arg; + } else { + command.arguments.push(arg); + } + } + + // Stringify and queue the command. We stringify to command now to + // effectively clone the command arguments in case they are mutated before + // the command is executed. + PhoneGap.commandQueue.push(JSON.stringify(command)); + + // If the queue length is 1, then that means it was empty before we queued + // the given command, so let the native side know that we have some + // commands to execute, unless the queue is currently being flushed, in + // which case the command will be picked up without notification. + if (PhoneGap.commandQueue.length == 1 && !PhoneGap.commandQueueFlushing) { + if (!PhoneGap.gapBridge) { + PhoneGap.gapBridge = PhoneGap.createGapBridge(); + } + + PhoneGap.gapBridge.src = "gap://ready"; + } +} + +/** + * Called by native code to retrieve all queued commands and clear the queue. + */ +PhoneGap.getAndClearQueuedCommands = function() { + json = JSON.stringify(PhoneGap.commandQueue); + PhoneGap.commandQueue = []; + return json; +} + +/** + * Called by native code when returning successful result from an action. + * + * @param callbackId + * @param args + * args.status - PhoneGap.callbackStatus + * args.message - return value + * args.keepCallback - 0 to remove callback, 1 to keep callback in PhoneGap.callbacks[] + */ +PhoneGap.callbackSuccess = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + + // If result is to be sent to callback + if (args.status == PhoneGap.callbackStatus.OK) { + try { + if (PhoneGap.callbacks[callbackId].success) { + PhoneGap.callbacks[callbackId].success(args.message); + } + } + catch (e) { + console.log("Error in success callback: "+callbackId+" = "+e); + } + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + +/** + * Called by native code when returning error result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackError = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + try { + if (PhoneGap.callbacks[callbackId].fail) { + PhoneGap.callbacks[callbackId].fail(args.message); + } + } + catch (e) { + console.log("Error in error callback: "+callbackId+" = "+e); + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + + +/** + * Does a deep clone of the object. + * + * @param obj + * @return + */ +PhoneGap.clone = function(obj) { + if(!obj) { + return obj; + } + + if(obj instanceof Array){ + var retVal = new Array(); + for(var i = 0; i < obj.length; ++i){ + retVal.push(PhoneGap.clone(obj[i])); + } + return retVal; + } + + if (obj instanceof Function) { + return obj; + } + + if(!(obj instanceof Object)){ + return obj; + } + + if (obj instanceof Date) { + return obj; + } + + retVal = new Object(); + for(i in obj){ + if(!(i in retVal) || retVal[i] != obj[i]) { + retVal[i] = PhoneGap.clone(obj[i]); + } + } + return retVal; +}; + +// Intercept calls to document.addEventListener +PhoneGap.m_document_addEventListener = document.addEventListener; + +// Intercept calls to window.addEventListener +PhoneGap.m_window_addEventListener = window.addEventListener; + +/** + * Add a custom window event handler. + * + * @param {String} event The event name that callback handles + * @param {Function} callback The event handler + */ +PhoneGap.addWindowEventHandler = function(event, callback) { + PhoneGap.windowEventHandler[event] = callback; +} + +/** + * Add a custom document event handler. + * + * @param {String} event The event name that callback handles + * @param {Function} callback The event handler + */ +PhoneGap.addDocumentEventHandler = function(event, callback) { + PhoneGap.documentEventHandler[event] = callback; +} + +/** + * Intercept adding document event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If subscribing to an event that is handled by a plugin + if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { + if (PhoneGap.documentEventHandler[e](e, handler, true)) { + return; // Stop default behavior + } + } + + PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); +}; + +/** + * Intercept adding window event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If subscribing to an event that is handled by a plugin + if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { + if (PhoneGap.windowEventHandler[e](e, handler, true)) { + return; // Stop default behavior + } + } + + PhoneGap.m_window_addEventListener.call(window, evt, handler, capture); +}; + +// Intercept calls to document.removeEventListener and watch for events that +// are generated by PhoneGap native code +PhoneGap.m_document_removeEventListener = document.removeEventListener; + +// Intercept calls to window.removeEventListener +PhoneGap.m_window_removeEventListener = window.removeEventListener; + +/** + * Intercept removing document event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If unsubcribing from an event that is handled by a plugin + if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { + if (PhoneGap.documentEventHandler[e](e, handler, false)) { + return; // Stop default behavior + } + } + + PhoneGap.m_document_removeEventListener.call(document, evt, handler, capture); +}; + +/** + * Intercept removing window event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If unsubcribing from an event that is handled by a plugin + if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { + if (PhoneGap.windowEventHandler[e](e, handler, false)) { + return; // Stop default behavior + } + } + + PhoneGap.m_window_removeEventListener.call(window, evt, handler, capture); +}; + +/** + * Method to fire document event + * + * @param {String} type The event type to fire + * @param {Object} data Data to send with event + */ +PhoneGap.fireDocumentEvent = function(type, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + document.dispatchEvent(e); +}; + +/** + * Method to fire window event + * + * @param {String} type The event type to fire + * @param {Object} data Data to send with event + */ +PhoneGap.fireWindowEvent = function(type, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + window.dispatchEvent(e); +}; + +/** + * Method to fire event from native code + * Leaving this generic version to handle problems with iOS 3.x. Is currently used by orientation and battery events + * Remove when iOS 3.x no longer supported and call fireWindowEvent or fireDocumentEvent directly + */ +PhoneGap.fireEvent = function(type, target, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + target = target || document; + if (target.dispatchEvent === undefined) { // ie window.dispatchEvent is undefined in iOS 3.x + target = document; + } + + target.dispatchEvent(e); +}; +/** + * Create a UUID + * + * @return + */ +PhoneGap.createUUID = function() { + return PhoneGap.UUIDcreatePart(4) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(6); +}; + +PhoneGap.UUIDcreatePart = function(length) { + var uuidpart = ""; + for (var i=0; i -1) { + me._batteryListener.splice(pos, 1); + } + } else if (eventType === "batterylow") { + var pos = me._lowListener.indexOf(handler); + if (pos > -1) { + me._lowListener.splice(pos, 1); + } + } else if (eventType === "batterycritical") { + var pos = me._criticalListener.indexOf(handler); + if (pos > -1) { + me._criticalListener.splice(pos, 1); + } + } + + // If there are no more registered event listeners stop the battery listener on native side. + if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { + PhoneGap.exec(null, null, "com.phonegap.battery", "stop", []); + } + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function(info) { + if (info) { + var me = this; + if (me._level != info.level || me._isPlugged != info.isPlugged) { + // Fire batterystatus event + //PhoneGap.fireWindowEvent("batterystatus", info); + // use this workaround since iOS 3.x does have window.dispatchEvent + PhoneGap.fireEvent("batterystatus", window, info); + + // Fire low battery event + if (info.level == 20 || info.level == 5) { + if (info.level == 20) { + //PhoneGap.fireWindowEvent("batterylow", info); + // use this workaround since iOS 3.x does not have window.dispatchEvent + PhoneGap.fireEvent("batterylow", window, info); + } + else { + //PhoneGap.fireWindowEvent("batterycritical", info); + // use this workaround since iOS 3.x does not have window.dispatchEvent + PhoneGap.fireEvent("batterycritical", window, info); + } + } + } + me._level = info.level; + me._isPlugged = info.isPlugged; + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.battery === "undefined") { + navigator.battery = new Battery(); + PhoneGap.addWindowEventHandler("batterystatus", navigator.battery.eventHandler); + PhoneGap.addWindowEventHandler("batterylow", navigator.battery.eventHandler); + PhoneGap.addWindowEventHandler("batterycritical", navigator.battery.eventHandler); + } +}); +}if (!PhoneGap.hasResource("camera")) { + PhoneGap.addResource("camera"); + + +/** + * This class provides access to the device camera. + * @constructor + */ +Camera = function() { + +} +/** + * Available Camera Options + * {boolean} allowEdit - true to allow editing image, default = false + * {number} quality 0-100 (low to high) default = 100 + * {Camera.DestinationType} destinationType default = DATA_URL + * {Camera.PictureSourceType} sourceType default = CAMERA + * {number} targetWidth - width in pixels to scale image default = 0 (no scaling) + * {number} targetHeight - height in pixels to scale image default = 0 (no scaling) + * {Camera.EncodingType} - encodingType default = JPEG + * {boolean} correctOrientation - Rotate the image to correct for the orientation of the device during capture (iOS only) + * {boolean} saveToPhotoAlbum - Save the image to the photo album on the device after capture (iOS only) + */ +/** + * Format of image that is returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.DestinationType = { + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1 // Return file uri +}; +Camera.prototype.DestinationType = Camera.DestinationType; + +/** + * Source to getPicture from. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.PictureSourceType = { + PHOTOLIBRARY : 0, // Choose image from picture library + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library +}; +Camera.prototype.PictureSourceType = Camera.PictureSourceType; + +/** + * Encoding of image returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.CAMERA, + * encodingType: Camera.EncodingType.PNG}) + */ +Camera.EncodingType = { + JPEG: 0, // Return JPEG encoded image + PNG: 1 // Return PNG encoded image +}; +Camera.prototype.EncodingType = Camera.EncodingType; + +/** + * Type of pictures to select from. Only applicable when + * PictureSourceType is PHOTOLIBRARY or SAVEDPHOTOALBUM + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY, + * mediaType: Camera.MediaType.PICTURE}) + */ +Camera.MediaType = { + PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType + VIDEO: 1, // allow selection of video only, ONLY RETURNS URL + ALLMEDIA : 2 // allow selection from all media types +}; +Camera.prototype.MediaType = Camera.MediaType; + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=DATA_URL. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +Camera.prototype.getPicture = function(successCallback, errorCallback, options) { + // successCallback required + if (typeof successCallback != "function") { + console.log("Camera Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback != "function")) { + console.log("Camera Error: errorCallback is not a function"); + return; + } + + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.camera","getPicture",[options]); +}; + + + +PhoneGap.addConstructor(function() { + if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); +}); +}; + +if (!PhoneGap.hasResource("device")) { + PhoneGap.addResource("device"); + +/** + * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +Device = function() +{ + this.platform = null; + this.version = null; + this.name = null; + this.phonegap = null; + this.uuid = null; + try + { + this.platform = DeviceInfo.platform; + this.version = DeviceInfo.version; + this.name = DeviceInfo.name; + this.phonegap = DeviceInfo.gap; + this.uuid = DeviceInfo.uuid; + + } + catch(e) + { + // TODO: + } + this.available = PhoneGap.available = this.uuid != null; +} + +PhoneGap.addConstructor(function() { + if (typeof navigator.device === "undefined") { + navigator.device = window.device = new Device(); + } +}); +}; +if (!PhoneGap.hasResource("capture")) { + PhoneGap.addResource("capture"); +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +function CaptureError() { + this.code = null; +}; + +// Capture error codes +CaptureError.CAPTURE_INTERNAL_ERR = 0; +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +function Capture() { + this.supportedAudioModes = []; + this.supportedImageModes = []; + this.supportedVideoModes = []; +}; + +/** + * Launch audio recorder application for recording audio clip(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureAudioOptions} options + * + * No audio recorder to launch for iOS - return CAPTURE_NOT_SUPPORTED + */ +Capture.prototype.captureAudio = function(successCallback, errorCallback, options) { + /*if (errorCallback && typeof errorCallback === "function") { + errorCallback({ + "code": CaptureError.CAPTURE_NOT_SUPPORTED + }); + }*/ + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureAudio", [options]); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options) { + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureImage", [options]); +}; + +/** + * Casts a PluginResult message property (array of objects) to an array of MediaFile objects + * (used in Objective-C) + * + * @param {PluginResult} pluginResult + */ +Capture.prototype._castMediaFile = function(pluginResult) { + var mediaFiles = []; + var i; + for (i=0; i} categories +* @param {ContactField[]} urls contact's web sites +*/ +var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; // JS Date + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; + this.urls = urls || null; // ContactField[] +}; + +/** +* Converts Dates to milliseconds before sending to iOS +*/ +Contact.prototype.convertDatesOut = function() +{ + var dates = new Array("birthday"); + for (var i=0; i][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + this.fileName = ""; + + if (typeof file.fullPath === "undefined") { + this.fileName = file; + } else { + this.fileName = file.fullPath; + } + + // LOADING state + this.readyState = FileReader.LOADING; + + // If loadstart callback + if (typeof this.onloadstart === "function") { + var evt = File._createEvent("loadstart", this); + this.onloadstart(evt); + } + + var me = this; + + // Read file + navigator.fileMgr.readAsDataURL(this.fileName, + + // Success callback + function(r) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileReader.DONE) { + return; + } + + // Save result + me.result = r; + + // If onload callback + if (typeof me.onload === "function") { + evt = File._createEvent("load", me); + me.onload(evt); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + evt = File._createEvent("loadend", me); + me.onloadend(evt); + } + }, + + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileReader.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + evt = File._createEvent("loadend", me); + me.onloadend(evt); + } + } + ); +}; + +/** + * Read file and return data as a binary data. + * + * @param file The name of the file + */ +FileReader.prototype.readAsBinaryString = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +/** + * Read file and return data as a binary data. + * + * @param file The name of the file + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +//----------------------------------------------------------------------------- +// File Writer +//----------------------------------------------------------------------------- + +/** + * This class writes to the mobile device file system. + * + @param file {File} a File object representing a file on the file system +*/ +FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.fileName = file.fullPath || file; + this.length = file.size || 0; + } + + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +} + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw FileError.INVALID_STATE_ERR; + } + + // set error + var error = new FileError(), evt; + error.code = error.ABORT_ERR; + this.error = error; + + // If error callback + if (typeof this.onerror === "function") { + evt = File._createEvent("error", this); + this.onerror(evt); + } + // If abort callback + if (typeof this.onabort === "function") { + evt = File._createEvent("abort", this); + this.onabort(evt); + } + + this.readyState = FileWriter.DONE; + + // If write end callback + if (typeof this.onwriteend == "function") { + evt = File._createEvent("writeend", this); + this.onwriteend(evt); + } +}; + +/** + * @Deprecated: use write instead + * + * @param file to write the data to + * @param text to be written + * @param bAppend if true write to end of file, otherwise overwrite the file + */ +FileWriter.prototype.writeAsText = function(file, text, bAppend) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + if (bAppend !== true) { + bAppend = false; // for null values + } + + this.fileName = file; + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + + // Write file + navigator.fileMgr.writeAsText(file, text, bAppend, + // Success callback + function(r) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save result + me.result = r; + + // If onwrite callback + if (typeof me.onwrite === "function") { + evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + // Write file + navigator.fileMgr.write(this.fileName, text, this.position, + + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + me.length = me.position; + + // If onwrite callback + if (typeof me.onwrite === "function") { + evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); + +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + if (!offset) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger then file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + // what if no size specified? + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + // Write file + navigator.fileMgr.truncate(this.fileName, size, + + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); +}; + +LocalFileSystem = function() { +}; + +// File error codes +LocalFileSystem.TEMPORARY = 0; +LocalFileSystem.PERSISTENT = 1; +LocalFileSystem.RESOURCE = 2; +LocalFileSystem.APPLICATION = 3; + +/** + * Requests a filesystem in which to store application data. + * + * @param {int} type of file system being requested + * @param {Function} successCallback is called with the new FileSystem + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.requestFileSystem = function(type, size, successCallback, errorCallback) { + if (type < 0 || type > 3) { + if (typeof errorCallback == "function") { + errorCallback({ + "code": FileError.SYNTAX_ERR + }); + } + } + else { + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "requestFileSystem", [type, size]); + } +}; + +/** + * + * @param {DOMString} uri referring to a local file in a filesystem + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.resolveLocalFileSystemURI = function(uri, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "resolveLocalFileSystemURI", [uri]); +}; + +/** +* This function is required as we need to convert raw +* JSON objects into concrete File and Directory objects. +* +* @param a JSON Objects that need to be converted to DirectoryEntry or FileEntry objects. +* @returns an entry +*/ +LocalFileSystem.prototype._castFS = function(pluginResult) { + var entry = null; + entry = new DirectoryEntry(); + entry.isDirectory = pluginResult.message.root.isDirectory; + entry.isFile = pluginResult.message.root.isFile; + entry.name = pluginResult.message.root.name; + entry.fullPath = pluginResult.message.root.fullPath; + pluginResult.message.root = entry; + return pluginResult; +} + +LocalFileSystem.prototype._castEntry = function(pluginResult) { + var entry = null; + if (pluginResult.message.isDirectory) { + entry = new DirectoryEntry(); + } + else if (pluginResult.message.isFile) { + entry = new FileEntry(); + } + entry.isDirectory = pluginResult.message.isDirectory; + entry.isFile = pluginResult.message.isFile; + entry.name = pluginResult.message.name; + entry.fullPath = pluginResult.message.fullPath; + pluginResult.message = entry; + return pluginResult; +} + +LocalFileSystem.prototype._castEntries = function(pluginResult) { + var entries = pluginResult.message; + var retVal = []; + for (i=0; i + + \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/layout/main.xml b/apps/files_odfviewer/src/webodf/programs/android/res/layout/main.xml new file mode 100644 index 0000000000..bc12cd8231 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/res/layout/main.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/layout/selector.xml b/apps/files_odfviewer/src/webodf/programs/android/res/layout/selector.xml new file mode 100644 index 0000000000..4af1380e95 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/res/layout/selector.xml @@ -0,0 +1,17 @@ + + + + + + + + + \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/values/strings.xml b/apps/files_odfviewer/src/webodf/programs/android/res/values/strings.xml new file mode 100644 index 0000000000..44673ed78b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/res/values/strings.xml @@ -0,0 +1,7 @@ + + + + Hello World, WebODFActivity! + WebODF + + \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/xml/phonegap.xml b/apps/files_odfviewer/src/webodf/programs/android/res/xml/phonegap.xml new file mode 100755 index 0000000000..97f31ea110 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/res/xml/phonegap.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/android/res/xml/plugins.xml b/apps/files_odfviewer/src/webodf/programs/android/res/xml/plugins.xml new file mode 100644 index 0000000000..3d8d48d838 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/res/xml/plugins.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/src/org/webodf/WebODFActivity.java b/apps/files_odfviewer/src/webodf/programs/android/src/org/webodf/WebODFActivity.java new file mode 100644 index 0000000000..9c826c9210 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/src/org/webodf/WebODFActivity.java @@ -0,0 +1,33 @@ +package org.webodf; + +import android.os.Bundle; + +import com.phonegap.DroidGap; + +public class WebODFActivity extends DroidGap { + + private String path; + + /** Called when the activity is first created. */ + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + path = null; + if (getIntent() != null && getIntent().getData() != null) { + path = getIntent().getData().getPath(); + } + setContentView(R.layout.main); + super.loadUrl("file:///android_asset/www/index.html"); + } + + @Override + protected void onResume() { + super.onResume(); + if (path == null) { + return; + } + String escapedPath = "file://" + path.replace("'", "\\'"); + sendJavascript("invokeString = '" + escapedPath + "';"); + } + +} \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/android/updateWebODF.sh b/apps/files_odfviewer/src/webodf/programs/android/updateWebODF.sh new file mode 100755 index 0000000000..b51e94290b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/android/updateWebODF.sh @@ -0,0 +1,3 @@ +# /bin/bash +cd assets +for f in `find . -type f`; do cp ../../webodf/$f $f; done diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/docnosis/CMakeLists.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.0-os.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.0-os.rng new file mode 100644 index 0000000000..97fe580eab --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.0-os.rng @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.1.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.1.rng new file mode 100644 index 0000000000..4082d4ba95 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-manifest-schema-v1.1.rng @@ -0,0 +1,111 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.0-os.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.0-os.rng new file mode 100644 index 0000000000..cf4ee51741 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.0-os.rng @@ -0,0 +1,17666 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + boolean + short + int + long + double + string + datetime + base64Binary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + simple + + + + + replace + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + float + + + + + + date + + + + + + time + + + + + + boolean + + + + + + string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + none + + + + + condition + + + + + + + + + + + + + + + + + + + + + simple + + + + + embed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + footnote + endnote + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + previous + current + next + + + + + + + + + + + + + + previous + next + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + name + number + number-and-name + plain-number-and-name + plain-number + + + + + + + + + + + + + + + + + + + full + path + name + name-and-extension + + + + + + + + + + + + + + + + + + full + path + name + name-and-extension + area + title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:page-count + text:paragraph-count + text:word-count + text:character-count + text:table-count + text:image-count + text:object-count + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + command + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + table + text-box + image + object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:reference-ref + text:bookmark-ref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + page + chapter + direction + text + + + + + + + + + page + chapter + direction + text + category-and-value + caption + value + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + value + unit + gap + + + + + + + + + + + + + + + + + + + + + + + + + float + + + + + + + + percentage + + + + + + + + currency + + + + + + + + + + + + + date + + + + + + + + time + + + + + + + + boolean + + + + + + + + string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + value + none + + + + + + + + + value + formula + none + + + + + + + + + value + formula + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:identifier + text:address + text:annote + text:author + text:booktitle + text:chapter + text:edition + text:editor + text:howpublished + text:institution + text:journal + text:month + text:note + text:number + text:organizations + text:pages + text:publisher + text:school + text:series + text:title + text:report-type + text:volume + text:year + text:url + text:custom1 + text:custom2 + text:custom3 + text:custom4 + text:custom5 + text:isbn + text:issn + + + + + + + + + + article + book + booklet + conference + custom1 + custom2 + custom3 + custom4 + custom5 + email + inbook + incollection + inproceedings + journal + manual + mastersthesis + misc + phdthesis + proceedings + techreport + unpublished + www + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + category-and-value + caption + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + separator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + name + number + number-and-name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + address + annote + author + bibliography-type + booktitle + chapter + custom1 + custom2 + custom3 + custom4 + custom5 + edition + editor + howpublished + identifier + institution + isbn + issn + journal + month + note + number + organizations + pages + publisher + report-type + school + series + title + url + volume + year + + + + + + + + + + + + + + + + + + + + + + + + right + + + + left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + collapse + filter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ($?([^\. ']+|'[^']+'))?\.$?[A-Z]+$?[0-9]+ + + + + + ($?([^\. ']+|'[^']+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'[^']+'))?\.$?[A-Z]+$?[0-9]+)? + + + + + + + + + + + + + + + + + + + copy-all + copy-results-only + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trace-dependents + remove-dependents + trace-precedents + remove-precedents + trace-errors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + from-another-table + to-another-table + from-same-table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + enable + disable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + unsorted + sort-ascending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stop + warning + information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + column + row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + print-range + filter + repeat-row + repeat-column + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + column + row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + automatic + + + + + + + + + + ascending + descending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + automatic + + + + + + + + + + ascending + descending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + self + cell-range + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + data + hidden + + + + + page + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + from-top + from-bottom + + + + + + + + + + + + + + data + + + + + + + + none + manual + name + + + + + + + + ascending + descending + + + + + + + + + + + + + tabular-layout + outline-subtotals-top + outline-subtotals-bottom + + + + + + + + + + + + + + + + + + + + + + + named + + + + + + + + previous + next + + + + + + + + none + member-difference + member-percentage + member-percentage-difference + running-total + row-percentage + column-percentage + total-percentage + index + + + + + + + + + + + + + + + + + + + + + + auto + + + + + + auto + + + + + + + + + + auto + + + + + + auto + + + + + + + + + + + + + seconds + minutes + hours + days + months + quarters + years + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + accepted + rejected + pending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + always + screen + printer + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + full + section + cut + arc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + standard + lines + line + curve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + page + frame + paragraph + char + as-char + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top-left + top + top-right + left + center + right + bottom-left + bottom-right + + + + + + + auto + left + right + up + down + horizontal + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale + scale-min + + + + + + + + scale + scale-min + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + onRequest + + + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + nohref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + parallel + perspective + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + phong + gouraud + draft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + non-primitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + phong + gouraud + draft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + parallel + perspective + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + segments + rectangle + + + + + + + + + + + + + + + + + + + + + normal + path + shape + + + + + + + + + path + shape + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + title + outline + subtitle + text + graphic + object + chart + table + orgchart + page + notes + handout + header + footer + date-time + page-number + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + fade + move + stripes + open + close + dissolve + wavyline + random + lines + laser + appear + hide + move-short + checkerboard + rotate + stretch + + + + + + + + + + + + none + from-left + from-top + from-right + from-bottom + from-center + from-upper-left + from-upper-right + from-lower-left + from-lower-right + to-left + to-top + to-right + to-bottom + to-upper-left + to-upper-right + to-lower-right + to-lower-left + path + spiral-inward-left + spiral-inward-right + spiral-outward-left + spiral-outward-right + vertical + horizontal + to-center + clockwise + counter-clockwise + + + + + + + + + + + + slow + medium + fast + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + on-click + with-previous + after-previous + timing-root + main-sequence + interactive-sequence + + + + + + + + + + + + + + + + + + + + + + + custom + entrance + exit + emphasis + motion-path + ole-action + media-call + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + previous-page + next-page + first-page + last-page + hide + stop + execute + show + verb + fade-out + sound + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fixed + current-date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + enabled + disabled + + + + + + + + + enabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start + end + top + bottom + + + + + + start + center + end + + + + + + + top-start + bottom-start + top-end + bottom-end + + + + + + + + + + + + + wide + high + balanced + + + + + custom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + y + z + + + + + + + + + + + + + + + + + + + + + + + + + + + major + minor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + get + post + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + command + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + current + parent + + + + + + + + + + + + + + + + + + + records + current + page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + unchecked + checked + unknown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horizontal + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + submit + reset + push + url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + 3d + + + + + + + + + center + + + + + + start + end + top + bottom + + + + + + start + center + end + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + sql + sql-pass-through + value-list + table-fields + + + + + + + + + + + + + + + + + + + + + + + + + + + void + + + + + + + + + + + + + + float + + + + + + + + + + + + percentage + + + + + + + + + + + + currency + + + + + + + + + + + + + + + + + date + + + + + + + + + + + + time + + + + + + + + + + + + boolean + + + + + + + + + + + + string + + + + + + + + + + + void + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + i + I + + + + + + + + a + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + into-default-style-data-style + into-english-number + keep-text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + rgb + hsl + + + + + + + + + clockwise + counter-clockwise + + + + + + + + + + + + + + + + + + translate + scale + rotate + skewX + skewY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + forward + reverse + + + + + + + + + forward + reverse + + + + + + + + + in + out + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + + + none + sum + + + + + + + + + replace + sum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + first + last + all + media + + + + + + + + + + + + + + + + + + + remove + freeze + hold + auto + default + transition + + + + + + + + + remove + freeze + hold + transition + auto + inherit + + + + + + + + + never + always + whenNotActive + default + + + + + + + + + never + always + whenNotActive + inherit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + left + right + mirrored + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + ultra-condensed + extra-condensed + condensed + semi-condensed + semi-expanded + expanded + extra-expanded + ultra-expanded + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fixed + language + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + medium + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gregorian + gengou + ROC + hanja_yoil + hanja + hijri + jewish + buddhist + + + + + + + + + text + + + + + + + + + + paragraph + + + + + + + + + + + + + section + + + + + + + + + + ruby + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + rigth + inner + outer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + page + + + + + + + + + text + page + section + document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + address + annote + author + bibliography-type + booktitle + chapter + custom1 + custom2 + custom3 + custom4 + custom5 + edition + editor + howpublished + identifier + institution + isbn + issn + journal + month + note + number + organizations + pages + publisher + report-type + school + series + title + url + volume + year + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + + + + + + + + + + table-column + + + + + + + + + + table-row + + + + + + + + + + table-cell + + + + + + + + + + + + + + + + + graphic + presentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + drawing-page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + linear + axial + radial + ellipsoid + square + rectangular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + objectBoundingBox + + + + + + + + + + + pad + reflect + repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + single + double + triple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rect + round + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + + + + + + + + + + portrait + landscape + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + headers + grid + annotations + objects + charts + drawings + formulas + zero-values + + + + + + + + + + + ttb + ltr + + + + + + + + + + continue + + + + + + + + + + + + + + + + + + + + + horizontal + vertical + both + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + + + + + + + + + + + + + + none + line + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + small-caps + + + + + + + none + lowercase + uppercase + capitalize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + super + sub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + roman + swiss + modern + decorative + script + system + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fixed + variable + + + + + + + + + + + + + [A-Za-z][A-Za-z0-9._\-]* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + latin + asian + complex + ignore + + + + + + + + + + normal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + italic + oblique + + + + + + + none + embossed + engraved + + + + + + + + + + + + + + + none + + + + + + + + + + + + + + + none + single + double + + + + + + + + + + + + + none + solid + dotted + dash + long-dash + dot-dash + dot-dot-dash + wave + + + + + + + + + + + + + auto + normal + bold + thin + dash + medium + thick + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + normal + bold + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + + + + + + + + + + + + + continuous + skip-white-space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + letters + lines + + + + + + + + + + + + + + + + + + + + + none + + + none + accent + dot + circle + disc + + + above + below + + + + + + + + + + + + + + + + + + + + + + + + + fixed + line-height + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + none + + + + condition + + + none + + + + + + + + + + + + + + + + + + + + + + + + normal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start + end + left + right + center + justify + + + + + + + + + start + center + justify + + + + + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + char + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + page + + + + + + + + + no-limit + + + + + + + + + + + + + + + + + + + + + + word + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + column + page + + + + + + + auto + column + page + + + + + + + + + + + + + transparent + + + + + + + + + + + + + + + + + + + + + + + + + + no-repeat + repeat + stretch + + + + + + + + + left + center + right + top + bottom + + + + + + + + + + + + + + + + left + center + right + + + + + top + center + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + + none + ideograph-alpha + + + + + + + + + simple + hanging + + + + + + + + + normal + strict + + + + + + + + + top + middle + bottom + auto + + + + + + + + + + + + + lr-tb + rl-tb + tb-rl + tb-lr + lr + rl + tb + page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + above + below + + + + + + + + + left + center + right + distribute-letter + distribute-space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + solid + dotted + dashed + dot-dashed + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + margins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + collapsing + separating + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + automatic + + + + + + + + + fix + value-type + + + + + + + + + + + + + ltr + ttb + + + + + + + + + auto + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + no-wrap + wrap + + + + + + + + + + + + + + + + + + + + none + bottom + top + center + + + + + + + + + none + hidden-and-protected + + + + protected + formula-hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + dash + solid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + miter + round + bevel + middle + none + inherit + + + + + + + + + none + solid + bitmap + gradient + hatch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + no-repeat + repeat + stretch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top-left + top + top-right + left + center + right + bottom-left + bottom + bottom-right + + + + + + + + + + + + + + + + + + + + + + + + + + + + nonzero + evenodd + + + + + + + + + + + + + + + + none + scroll + alternate + slide + + + + + + + + + left + right + up + down + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + justify + + + + + + + + + left + center + right + justify + + + + + + + + + no-wrap + wrap + + + + + + + + + + + + + + greyscale + mono + watermark + standard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + below + above + + + + + + + + + + + + + + + + automatic + left-outside + inside + right-outside + + + + + + + automatic + above + below + center + + + + + + + + + automatic + mm + cm + m + km + pt + pc + inch + ft + mi + + + + + + + + + + + + + + + + + + + + + + + straight-line + angled-line + angled-connector-line + + + + + + + + + fixed + free + + + + + + + + + + + + + + + + + + + + + + + horizontal + vertical + auto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + correct + attractive + + + + + + + + + + + + + + + + + + + + + + + enabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + standard + double-sided + + + + + + + + + object + flat + sphere + + + + + + + + + normal + inverse + + + + + + + + + object + parallel + sphere + + + + + + + object + parallel + sphere + + + + + + + + + luminance + intesity + color + + + + + + + + + enabled + disabled + + + + + + + + + replace + modulate + blend + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + content + position + size + + + + + + + + + + + + left + center + right + from-left + inside + outside + from-inside + + + + + + + + + + + + + + page + page-content + page-start-margin + page-end-margin + frame + frame-content + frame-start-margin + frame-end-margin + paragraph + paragraph-content + paragraph-start-margin + paragraph-end-margin + char + + + + + + + + + + + + + top + middle + bottom + from-top + below + + + + + + + + + + + + + + + + + + page + page-content + frame + frame-content + paragraph + paragraph-content + char + line + baseline + text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + left + right + parallel + dynamic + run-through + biggest + + + + + + + + + + + + + + + + no-limit + + + + + + + + + + + + + + + + + full + outside + + + + + + + + + foreground + background + + + + + + + + + + + + + + + + clip + auto-create-new-frame + + + + + + + + + none + vertical + + + vertical + + + + + vertical + + + + + + + + + horizontal + horizontal-on-odd + horizontal-on-even + + + + + + + + + + + + + + + iterative + once-concurrent + once-successive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([0-9]+(\.[0-9]*)?|\.[0-9]+)(px) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + automatic + + + + named-symbol + + + + square + diamond + arrow-down + arrow-up + arrow-right + arrow-left + bow-tie + hourglass + circle + star + x + plus + asterisk + horizontal-bar + vertical-bar + + + + + + image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + cubic-spline + b-spline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cuboid + cylinder + cone + pyramid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + side-by-side + stagger-even + stagger-odd + + + + + + + + + + + + + + + none + value + percentage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + variance + standard-deviation + percentage + error-margin + constant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + columns + rows + + + + + + + + + none + linear + logarithmic + exponential + power + + + + + + + + + manual + automatic + semi-automatic + + + + + + + + + none + fade-from-left + fade-from-top + fade-from-right + fade-from-bottom + fade-from-upperleft + fade-from-upperright + fade-from-lowerleft + fade-from-lowerright + move-from-left + move-from-top + move-from-right + move-from-bottom + move-from-upperleft + move-from-upperright + move-from-lowerleft + move-from-lowerright + uncover-to-left + uncover-to-top + uncover-to-right + uncover-to-bottom + uncover-to-upperleft + uncover-to-upperright + uncover-to-lowerleft + uncover-to-lowerright + fade-to-center + fade-from-center + vertical-stripes + horizontal-stripes + clockwise + counterclockwise + open-vertical + open-horizontal + close-vertical + close-horizontal + wavyline-from-left + wavyline-from-top + wavyline-from-right + wavyline-from-bottom + spiralin-left + spiralin-right + spiralout-left + spiralout-right + roll-from-top + roll-from-left + roll-from-right + roll-from-bottom + stretch-from-left + stretch-from-top + stretch-from-right + stretch-from-bottom + + vertical-lines + horizontal-lines + dissolve + random + vertical-checkerboard + horizontal-checkerboard + interlocking-horizontal-left + interlocking-horizontal-right + interlocking-vertical-top + interlocking-vertical-bottom + fly-away + open + close + melt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + forward + reverse + + + + + + + + + forward + reverse + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + full + border + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + [A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})* + + + + + [A-Za-z0-9]{1,8} + + + + + [A-Za-z]{1,8} + + + + + 1 + + + + + -?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + + ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + + + ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + + -?([0-9]+(\.[0-9]*)?|\.[0-9]+)% + + + + + [0-9]+\* + + + + + + + + + + + #[0-9a-fA-F]{6} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _self + _blank + _parent + _top + + + + + + + float + time + date + percentage + currency + boolean + string + + + + + + -?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)* + + + + + + + + + \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\) + + + + + + + [0-9a-zA-Z_]+:[0-9a-zA-Z._\-]+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.1.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.1.rng new file mode 100644 index 0000000000..3ba6a687c4 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-schema-v1.1.rng @@ -0,0 +1,17891 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + boolean + short + int + long + double + string + datetime + base64Binary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + simple + + + + + replace + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + float + + + + + + date + + + + + + time + + + + + + boolean + + + + + + string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + none + + + + + condition + + + + + + + + + + + + + + + + + + + + + simple + + + + + embed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + footnote + endnote + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + previous + current + next + + + + + + + + + + + + + + previous + next + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + name + number + number-and-name + plain-number-and-name + plain-number + + + + + + + + + + + + + + + + + + + full + path + name + name-and-extension + + + + + + + + + + + + + + + + + + full + path + name + name-and-extension + area + title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:page-count + text:paragraph-count + text:word-count + text:character-count + text:table-count + text:image-count + text:object-count + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + command + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + table + text-box + image + object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:reference-ref + text:bookmark-ref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + page + chapter + direction + text + + + + + + + + + page + chapter + direction + text + category-and-value + caption + value + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + value + unit + gap + + + + + + + + + + + + + + + + + + + + + + + + + float + + + + + + + + percentage + + + + + + + + currency + + + + + + + + + + + + + date + + + + + + + + time + + + + + + + + boolean + + + + + + + + string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + value + none + + + + + + + + + value + formula + none + + + + + + + + + value + formula + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:identifier + text:address + text:annote + text:author + text:booktitle + text:chapter + text:edition + text:editor + text:howpublished + text:institution + text:journal + text:month + text:note + text:number + text:organizations + text:pages + text:publisher + text:school + text:series + text:title + text:report-type + text:volume + text:year + text:url + text:custom1 + text:custom2 + text:custom3 + text:custom4 + text:custom5 + text:isbn + text:issn + + + + + + + + + + article + book + booklet + conference + custom1 + custom2 + custom3 + custom4 + custom5 + email + inbook + incollection + inproceedings + journal + manual + mastersthesis + misc + phdthesis + proceedings + techreport + unpublished + www + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + category-and-value + caption + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + separator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + name + number + number-and-name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + address + annote + author + bibliography-type + booktitle + chapter + custom1 + custom2 + custom3 + custom4 + custom5 + edition + editor + howpublished + identifier + institution + isbn + issn + journal + month + note + number + organizations + pages + publisher + report-type + school + series + title + url + volume + year + + + + + + + + + + + + + + + + + + + + + + + + right + + + + left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + collapse + filter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+ + + + + + + ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)? + + + + + + + + + + + + + + + + + + + copy-all + copy-results-only + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trace-dependents + remove-dependents + trace-precedents + remove-precedents + trace-errors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + from-another-table + to-another-table + from-same-table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + enable + disable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + unsorted + sort-ascending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stop + warning + information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + column + row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + print-range + filter + repeat-row + repeat-column + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + column + row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + automatic + + + + + + + + + + ascending + descending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + automatic + + + + + + + + + + ascending + descending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + self + cell-range + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + data + hidden + + + + + page + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + from-top + from-bottom + + + + + + + + + + + + + + data + + + + + + + + none + manual + name + + + + + + + + ascending + descending + + + + + + + + + + + + + tabular-layout + outline-subtotals-top + outline-subtotals-bottom + + + + + + + + + + + + + + + + + + + + + + + named + + + + + + + + previous + next + + + + + + + + none + member-difference + member-percentage + member-percentage-difference + running-total + row-percentage + column-percentage + total-percentage + index + + + + + + + + + + + + + + + + + + + + + + auto + + + + + + auto + + + + + + + + + + auto + + + + + + auto + + + + + + + + + + + + + seconds + minutes + hours + days + months + quarters + years + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + accepted + rejected + pending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + always + screen + printer + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + full + section + cut + arc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + standard + lines + line + curve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + page + frame + paragraph + char + as-char + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top-left + top + top-right + left + center + right + bottom-left + bottom-right + + + + + + + + auto + left + right + up + down + horizontal + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale + scale-min + + + + + + + + scale + scale-min + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + onRequest + + + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + nohref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + parallel + perspective + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + phong + gouraud + draft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + non-primitive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + phong + gouraud + draft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + parallel + perspective + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + segments + rectangle + + + + + + + + + + + + + + + + + + + + + normal + path + shape + + + + + + + + + path + shape + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + title + outline + subtitle + text + graphic + object + chart + table + orgchart + page + notes + handout + header + footer + date-time + page-number + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + fade + move + stripes + open + close + dissolve + wavyline + random + lines + laser + appear + hide + move-short + checkerboard + rotate + stretch + + + + + + + + + + + + none + from-left + from-top + from-right + from-bottom + from-center + from-upper-left + from-upper-right + from-lower-left + from-lower-right + to-left + to-top + to-right + to-bottom + to-upper-left + to-upper-right + to-lower-right + to-lower-left + path + spiral-inward-left + spiral-inward-right + spiral-outward-left + spiral-outward-right + vertical + horizontal + to-center + clockwise + counter-clockwise + + + + + + + + + + + + slow + medium + fast + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + on-click + with-previous + after-previous + timing-root + main-sequence + interactive-sequence + + + + + + + + + + + + + + + + + + + + + + + custom + entrance + exit + emphasis + motion-path + ole-action + media-call + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + previous-page + next-page + first-page + last-page + hide + stop + execute + show + verb + fade-out + sound + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fixed + current-date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + enabled + disabled + + + + + + + + + enabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start + end + top + bottom + + + + + + start + center + end + + + + + + + top-start + bottom-start + top-end + bottom-end + + + + + + + + + + + + + wide + high + balanced + + + + + custom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + y + z + + + + + + + + + + + + + + + + + + + + + + + + + + + major + minor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + get + post + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + command + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + current + parent + + + + + + + + + + + + + + + + + + + records + current + page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + unchecked + checked + unknown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horizontal + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + submit + reset + push + url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + 3d + + + + + + + + + center + + + + + + start + end + top + bottom + + + + + + start + center + end + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + sql + sql-pass-through + value-list + table-fields + + + + + + + + + + + + + + + + + + + + + + + + + + + void + + + + + + + + + + + + + + float + + + + + + + + + + + + percentage + + + + + + + + + + + + currency + + + + + + + + + + + + + + + + + date + + + + + + + + + + + + time + + + + + + + + + + + + boolean + + + + + + + + + + + + string + + + + + + + + + + + void + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + i + I + + + + + + + + a + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + into-default-style-data-style + into-english-number + keep-text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + rgb + hsl + + + + + + + + + clockwise + counter-clockwise + + + + + + + + + + + + + + + + + + translate + scale + rotate + skewX + skewY + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + forward + reverse + + + + + + + + + forward + reverse + + + + + + + + + in + out + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + + + none + sum + + + + + + + + + replace + sum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + first + last + all + media + + + + + + + + + + + + + + + indefinite + + + + + + + + + remove + freeze + hold + auto + default + transition + + + + + + + + + remove + freeze + hold + transition + auto + inherit + + + + + + + + + never + always + whenNotActive + default + + + + + + + + + never + always + whenNotActive + inherit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + left + right + mirrored + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + ultra-condensed + extra-condensed + condensed + semi-condensed + semi-expanded + expanded + extra-expanded + ultra-expanded + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fixed + language + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + medium + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gregorian + gengou + ROC + hanja_yoil + hanja + hijri + jewish + buddhist + + + + + + + + + text + + + + + + + + + + paragraph + + + + + + + + + + + + + section + + + + + + + + + + ruby + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + right + inner + outer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + page + + + + + + + + + text + page + section + document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + address + annote + author + bibliography-type + booktitle + chapter + custom1 + custom2 + custom3 + custom4 + custom5 + edition + editor + howpublished + identifier + institution + isbn + issn + journal + month + note + number + organizations + pages + publisher + report-type + school + series + title + url + volume + year + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + + + + + + + + + + table-column + + + + + + + + + + table-row + + + + + + + + + + table-cell + + + + + + + + + + + + + + + + + graphic + presentation + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + drawing-page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + linear + axial + radial + ellipsoid + square + rectangular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + objectBoundingBox + + + + + + + + + + + pad + reflect + repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + single + double + triple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rect + round + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + + + + + + + + + + portrait + landscape + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + headers + grid + annotations + objects + charts + drawings + formulas + zero-values + + + + + + + + + + + ttb + ltr + + + + + + + + + + continue + + + + + + + + + + + + + + + + + + + + + horizontal + vertical + both + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + + + + + + + + + + + + + + none + line + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + small-caps + + + + + + + none + lowercase + uppercase + capitalize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + super + sub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + roman + swiss + modern + decorative + script + system + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fixed + variable + + + + + + + + + + + + + + + + + + + + + + + [A-Za-z][A-Za-z0-9._\-]* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + latin + asian + complex + ignore + + + + + + + + + + normal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + italic + oblique + + + + + + + none + embossed + engraved + + + + + + + + + + + + + + + none + + + + + + + + + + + + + + + none + single + double + + + + + + + + + + + + + none + solid + dotted + dash + long-dash + dot-dash + dot-dot-dash + wave + + + + + + + + + + + + + auto + normal + bold + thin + dash + medium + thick + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + normal + bold + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + + + + + + + + + + + + + continuous + skip-white-space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + letters + lines + + + + + + + + + + + + + + + + + + + + + none + + + none + accent + dot + circle + disc + + + above + below + + + + + + + + + + + + + + + + + + + + + + + + + fixed + line-height + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + none + + + + condition + + + none + + + + + + + + + + + + + + + + + + + + + + + + normal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start + end + left + right + center + justify + + + + + + + + + start + center + justify + + + + + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + char + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + page + + + + + + + + + no-limit + + + + + + + + + + + + + + + + + + + + + + word + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + column + page + + + + + + + auto + column + page + + + + + + + + + + + + + transparent + + + + + + + + + + + + + + + + + + + + + + + + + + no-repeat + repeat + stretch + + + + + + + + + left + center + right + top + bottom + + + + + + + + + + + + + + + + left + center + right + + + + + top + center + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + + none + ideograph-alpha + + + + + + + + + simple + hanging + + + + + + + + + normal + strict + + + + + + + + + top + middle + bottom + auto + baseline + + + + + + + + + + + + + lr-tb + rl-tb + tb-rl + tb-lr + lr + rl + tb + page + + + + + + + + + + + + + + + + + + + + + + + + + + auto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + above + below + + + + + + + + + left + center + right + distribute-letter + distribute-space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + solid + dotted + dashed + dot-dashed + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + margins + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + collapsing + separating + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + automatic + + + + + + + + + fix + value-type + + + + + + + + + + + + + ltr + ttb + + + + + + + + + auto + 0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + no-wrap + wrap + + + + + + + + + + + + + + + + + + + + none + bottom + top + center + + + + + + + + + none + hidden-and-protected + + + + protected + formula-hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + dash + solid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + miter + round + bevel + middle + none + inherit + + + + + + + + + none + solid + bitmap + gradient + hatch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + no-repeat + repeat + stretch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top-left + top + top-right + left + center + right + bottom-left + bottom + bottom-right + + + + + + + + + + + + + + + + + + + + + + + + + + + + nonzero + evenodd + + + + + + + + + + + + + + + + none + scroll + alternate + slide + + + + + + + + + left + right + up + down + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + justify + + + + + + + + + left + center + right + justify + + + + + + + + + no-wrap + wrap + + + + + + + + + + + + + + greyscale + mono + watermark + standard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + below + above + + + + + + + + + + + + + + + + automatic + left-outside + inside + right-outside + + + + + + + automatic + above + below + center + + + + + + + + + automatic + mm + cm + m + km + pt + pc + inch + ft + mi + + + + + + + + + + + + + + + + + + + + + + + straight-line + angled-line + angled-connector-line + + + + + + + + + fixed + free + + + + + + + + + + + + + + + + + + + + + + + horizontal + vertical + auto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + correct + attractive + + + + + + + + + + + + + + + + + + + + + + + enabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + standard + double-sided + + + + + + + + + object + flat + sphere + + + + + + + + + normal + inverse + + + + + + + + + object + parallel + sphere + + + + + + + object + parallel + sphere + + + + + + + + + luminance + intensity + color + + + + + + + + + enabled + disabled + + + + + + + + + replace + modulate + blend + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + content + position + size + + + + + + + + + + + + left + center + right + from-left + inside + outside + from-inside + + + + + + + + + + + + + + page + page-content + page-start-margin + page-end-margin + frame + frame-content + frame-start-margin + frame-end-margin + paragraph + paragraph-content + paragraph-start-margin + paragraph-end-margin + char + + + + + + + + + + + + + top + middle + bottom + from-top + below + + + + + + + + + + + + + + + + + + page + page-content + frame + frame-content + paragraph + paragraph-content + char + line + baseline + text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + left + right + parallel + dynamic + run-through + biggest + + + + + + + + + + + + + + + + no-limit + + + + + + + + + + + + + + + + + full + outside + + + + + + + + + foreground + background + + + + + + + + + + + + + + + + clip + auto-create-new-frame + + + + + + + + + none + vertical + + + vertical + + + + + vertical + + + + + + + + + horizontal + horizontal-on-odd + horizontal-on-even + + + + + + + + + + + + + + + iterative + once-concurrent + once-successive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ([0-9]+(\.[0-9]*)?|\.[0-9]+)(px) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + automatic + + + + named-symbol + + + + square + diamond + arrow-down + arrow-up + arrow-right + arrow-left + bow-tie + hourglass + circle + star + x + plus + asterisk + horizontal-bar + vertical-bar + + + + + + image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + cubic-spline + b-spline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cuboid + cylinder + cone + pyramid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + side-by-side + stagger-even + stagger-odd + + + + + + + + + + + + + + + none + value + percentage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + variance + standard-deviation + percentage + error-margin + constant + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + columns + rows + + + + + + + + + none + linear + logarithmic + exponential + power + + + + + + + + + manual + automatic + semi-automatic + + + + + + + + + none + fade-from-left + fade-from-top + fade-from-right + fade-from-bottom + fade-from-upperleft + fade-from-upperright + fade-from-lowerleft + fade-from-lowerright + move-from-left + move-from-top + move-from-right + move-from-bottom + move-from-upperleft + move-from-upperright + move-from-lowerleft + move-from-lowerright + uncover-to-left + uncover-to-top + uncover-to-right + uncover-to-bottom + uncover-to-upperleft + uncover-to-upperright + uncover-to-lowerleft + uncover-to-lowerright + fade-to-center + fade-from-center + vertical-stripes + horizontal-stripes + clockwise + counterclockwise + open-vertical + open-horizontal + close-vertical + close-horizontal + wavyline-from-left + wavyline-from-top + wavyline-from-right + wavyline-from-bottom + spiralin-left + spiralin-right + spiralout-left + spiralout-right + roll-from-top + roll-from-left + roll-from-right + roll-from-bottom + stretch-from-left + stretch-from-top + stretch-from-right + stretch-from-bottom + + vertical-lines + horizontal-lines + dissolve + random + vertical-checkerboard + horizontal-checkerboard + interlocking-horizontal-left + interlocking-horizontal-right + interlocking-vertical-top + interlocking-vertical-bottom + fly-away + open + close + melt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + forward + reverse + + + + + + + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + full + border + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + + + + [A-Za-z0-9]{1,8} + + + + + [A-Za-z]{1,8} + + + + + 1 + + + + + -?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + + ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + + ([0-9]*[1-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1-9][0-9]*|\.[0-9]*[1-9][0-9]*)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + + -?([0-9]+(\.[0-9]*)?|\.[0-9]+)% + + + + + [0-9]+\* + + + + + + + + + + + #[0-9a-fA-F]{6} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _self + _blank + _parent + _top + + + + + + + float + time + date + percentage + currency + boolean + string + + + + + + -?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)* + + + + + + + + + \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\) + + + + + + + [0-9a-zA-Z_]+:[0-9a-zA-Z._\-]+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.0-os.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.0-os.rng new file mode 100644 index 0000000000..aa761dc880 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.0-os.rng @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.1.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.1.rng new file mode 100644 index 0000000000..e77fe4ba6e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-strict-schema-v1.1.rng @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-dsig-schema.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-dsig-schema.rng new file mode 100644 index 0000000000..bb2e591d86 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-dsig-schema.rng @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-manifest-schema.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-manifest-schema.rng new file mode 100644 index 0000000000..8902970eec --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-manifest-schema.rng @@ -0,0 +1,224 @@ + + + + + + + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + edit + presentation-slide-show + read-only + + + + + + + + + + + + + + + + + + + + + + + + + + + SHA1/1K + + + + + + + + + + + + + + + + + + + Blowfish CFB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PBKDF2 + + + + + + + + + + + + + + + + + + + + + + + + + + + SHA1 + + + + + + + + + + + + + + + + [^:]+:[^:]+ + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-schema.rng b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-schema.rng new file mode 100644 index 0000000000..bd57af13f7 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/OpenDocument-v1.2-cos01-schema.rng @@ -0,0 +1,18127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + boolean + short + int + long + double + string + datetime + base64Binary + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + + + + + + + + + + + simple + + + + + + + replace + + + + + onLoad + + + + + + + + + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + float + + + + + + date + + + + + + time + + + + + + boolean + + + + + + string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + none + + + + + condition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:page-count + text:paragraph-count + text:word-count + text:character-count + text:table-count + text:image-count + text:object-count + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:reference-ref + text:bookmark-ref + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + value + unit + gap + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text:identifier + text:address + text:annote + text:author + text:booktitle + text:chapter + text:edition + text:editor + text:howpublished + text:institution + text:journal + text:month + text:note + text:number + text:organizations + text:pages + text:publisher + text:school + text:series + text:title + text:report-type + text:volume + text:year + text:url + text:custom1 + text:custom2 + text:custom3 + text:custom4 + text:custom5 + text:isbn + text:issn + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + footnote + endnote + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + previous + current + next + + + + + + + + + + previous + next + + + + + + + + + + + + + + name + number + number-and-name + plain-number-and-name + plain-number + + + + + + + + + + + + + full + path + name + name-and-extension + + + + + + + + + + + full + path + name + name-and-extension + area + title + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + command + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + table + text-box + image + object + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + number-no-superior + number-all-superior + number + + + + + + + + + + + + + + + + + + + + + + category-and-value + caption + value + + + + + + + page + chapter + direction + text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + float + + + + + + + + percentage + + + + + + + + currency + + + + + + + + + + + + + date + + + + + + + + time + + + + + + + + boolean + + + + + + + + string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + value + none + + + + + + + + + value + formula + none + + + + + + + + + value + formula + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + article + book + booklet + conference + custom1 + custom2 + custom3 + custom4 + custom5 + email + inbook + incollection + inproceedings + journal + manual + mastersthesis + misc + phdthesis + proceedings + techreport + unpublished + www + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + category-and-value + caption + + + + + + + + + + document + chapter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + + 1 + 2 + 3 + separator + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + name + number + number-and-name + plain-number + plain-number-and-name + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + address + annote + author + bibliography-type + booktitle + chapter + custom1 + custom2 + custom3 + custom4 + custom5 + edition + editor + howpublished + identifier + institution + isbn + issn + journal + month + note + number + organizations + pages + publisher + report-type + school + series + title + url + volume + year + + + + + + + + + + + + + + + + + + + + + + + + right + + + + left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + collapse + filter + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+ + + + + + + ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)? + + + ($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+:($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+ + + + ($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+ + + + + + + Value is a space separated list of "cellRangeAddress" patterns + + + + + + + + + + + + + + copy-all + copy-results-only + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + trace-dependents + remove-dependents + trace-precedents + remove-precedents + trace-errors + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + from-another-table + to-another-table + from-same-table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + date + + + + + + + + + + + + + + + + enable + disable + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + unsorted + sort-ascending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + stop + warning + information + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + column + row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + print-range + filter + repeat-row + repeat-column + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + column + row + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + alpha-numeric + integer + double + + + + + + + + + + + + + + + + + + + + text + number + automatic + + + + + + + + ascending + descending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + automatic + + + + + + + + ascending + descending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + self + cell-range + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + number + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + data + hidden + + + + + page + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + from-top + from-bottom + + + + + + + + + + + + + + + + data + + + + + + + + none + manual + name + + + + + + ascending + descending + + + + + + + + + + + + + + + tabular-layout + outline-subtotals-top + outline-subtotals-bottom + + + + + + + + + + + + + + + + + + + + + named + + + + + + + + previous + next + + + + + + none + member-difference + member-percentage + member-percentage-difference + running-total + row-percentage + column-percentage + total-percentage + index + + + + + + + + + + + + + + + + + + + + + + auto + + + + + + auto + + + + + + + + auto + + + + + + auto + + + + + + + + + seconds + minutes + hours + days + months + quarters + years + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + average + count + countnums + max + min + product + stdev + stdevp + sum + var + varp + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + table + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + accepted + rejected + pending + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + always + screen + printer + none + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + full + section + cut + arc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + standard + lines + line + curve + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + page + frame + paragraph + char + as-char + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top-left + top + top-right + left + center + right + bottom-left + bottom-right + + + + + + auto + left + right + up + down + horizontal + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + scale + scale-min + + + + + + + + scale + scale-min + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + new + replace + + + + + + + + + + + + nohref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + parallel + perspective + + + + + + + + + + + + + + + + + + + + + + flat + phong + gouraud + draft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + phong + gouraud + draft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + parallel + perspective + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + segments + rectangle + + + + + + + + + + + + + + + + + normal + path + shape + + + + + + + path + shape + + + + + + + + + + + + + + + + + + non-primitive + + + + + + \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))){2}[ ]*\) + + + + + -0.5 + 0.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + title + outline + subtitle + text + graphic + object + chart + table + orgchart + page + notes + handout + header + footer + date-time + page-number + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + new + replace + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + fade + move + stripes + open + close + dissolve + wavyline + random + lines + laser + appear + hide + move-short + checkerboard + rotate + stretch + + + + + none + from-left + from-top + from-right + from-bottom + from-center + from-upper-left + from-upper-right + from-lower-left + from-lower-right + to-left + to-top + to-right + to-bottom + to-upper-left + to-upper-right + to-lower-right + to-lower-left + path + spiral-inward-left + spiral-inward-right + spiral-outward-left + spiral-outward-right + vertical + horizontal + to-center + clockwise + counter-clockwise + + + + + slow + medium + fast + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + on-click + with-previous + after-previous + timing-root + main-sequence + interactive-sequence + + + + + + + + + + + + + + + + + custom + entrance + exit + emphasis + motion-path + ole-action + media-call + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + previous-page + next-page + first-page + last-page + hide + stop + execute + show + verb + fade-out + sound + last-visited-page + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + fixed + current-date + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + enabled + disabled + + + + + + + enabled + disabled + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + start + end + top + bottom + + + + + + start + center + end + + + + + + + top-start + bottom-start + top-end + bottom-end + + + + + + + + + wide + high + balanced + + + + + custom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + row + column + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + x + y + z + + + + + + + + + + + + + + + + + + + + + + major + minor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + none + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + equal-integer + is-boolean + equal-boolean + equal-use-only-zero + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + boolean + short + int + long + double + string + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + none + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + no-nulls + nullable + + + + + + + + + + + + + + + + + + + + bit + boolean + tinyint + smallint + integer + bigint + float + real + double + numeric + decimal + char + varchar + longvarchar + date + time + timestmp + binary + varbinary + longvarbinary + sqlnull + other + object + distinct + struct + array + blob + clob + ref + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + primary + unique + foreign + + + + + + + + + + + + + cascade + restrict + set-null + no-action + set-default + + + + + + + + cascade + restrict + set-null + no-action + set-default + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + + + + + + get + post + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + command + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + current + parent + + + + + records + current + page + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + selection + selection-indices + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + unchecked + checked + unknown + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + horizontal + vertical + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + submit + reset + push + url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + flat + 3d + + + + + + + + + center + + + + + + start + end + top + bottom + + + + + + start + center + end + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + table + query + sql + sql-pass-through + value-list + table-fields + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + void + + + + + + + + float + + + + + + + + + + + + percentage + + + + + + + + + + + + currency + + + + + + + + + + + + + + + + + date + + + + + + + + + + + + time + + + + + + + + + + + + boolean + + + + + + + + + + + + string + + + + + + + + + + + void + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1 + i + I + + + + + + + + a + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + + + + + + + To avoid inclusion of the complete MathML schema, anything is allowed within a math:math top-level element + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + into-default-style-data-style + into-english-number + keep-text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + rgb + hsl + + + + + + + clockwise + counter-clockwise + + + + + + + + + translate + scale + rotate + skewX + skewY + + + + + + + + + + + + + + + + + forward + reverse + + + + + + + + + + + + in + out + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + discrete + linear + paced + spline + + + + + + + + + + + + + + + + + + + + + + + + none + sum + + + + + + + replace + sum + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + first + last + all + media + + + + + + + + + + + + + + + + indefinite + + + + + + + 0.0 + + + + + + + remove + freeze + hold + auto + default + transition + + + + + + + + + remove + freeze + hold + transition + auto + inherit + + + + + + + + + never + always + whenNotActive + default + + + + + + + + + never + always + whenNotActive + inherit + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + all + left + right + mirrored + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + row + column + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + normal + ultra-condensed + extra-condensed + condensed + semi-condensed + semi-expanded + expanded + extra-expanded + ultra-expanded + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + onRequest + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + short + long + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + short + medium + long + + + + + + + + + + + + + + + + + fixed + language + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + gregorian + gengou + ROC + hanja_yoil + hanja + hijri + jewish + buddhist + + + + + + + + + + text + + + + + + + + paragraph + + + + + + + + + + + section + + + + + + + + ruby + + + + + + + + table + + + + + + + + table-column + + + + + + + + table-row + + + + + + + + table-cell + + + + + + + + + + + + + + + graphic + presentation + + + + + + + + + + + + + + + drawing-page + + + + + + + + chart + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + right + inner + outer + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + document + chapter + page + + + + + + + text + page + section + document + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + address + annote + author + bibliography-type + booktitle + chapter + custom1 + custom2 + custom3 + custom4 + custom5 + edition + editor + howpublished + identifier + institution + isbn + issn + journal + month + note + number + organizations + pages + publisher + report-type + school + series + title + url + volume + year + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + linear + axial + radial + ellipsoid + square + rectangular + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + objectBoundingBox + + + + + + + + + + + pad + reflect + repeat + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + single + double + triple + + + + + + + + + + + + + + + + + + + + + + + + simple + + + + + + + embed + + + + + onLoad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + rect + round + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + default + + + + + + + + portrait + landscape + + + + + + + + + + + + + + + + + + + + + + headers + grid + annotations + objects + charts + drawings + formulas + zero-values + + + + + + + + + ttb + ltr + + + + + + + + continue + + + + + + + + + + + + + + + + + horizontal + vertical + both + none + + + + + + + + + + + + + none + line + both + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + lowercase + uppercase + capitalize + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + super + sub + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + latin + asian + complex + ignore + + + + + + + + normal + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + embossed + engraved + + + + + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + letters + lines + + + + + + + + + + + + + + + + + none + + + none + accent + dot + circle + disc + + + above + below + + + + + + + + + + + + + + + + + + + fixed + line-height + + + + + + + + + + + + + + + + + + + + + true + + + none + + + + condition + + + none + + + + + + + + + normal + small-caps + + + + + roman + swiss + modern + decorative + script + system + + + + + fixed + variable + + + + + [A-Za-z][A-Za-z0-9._\-]* + + + + + normal + italic + oblique + + + + + none + + + + + + none + single + double + + + + + none + solid + dotted + dash + long-dash + dot-dash + dot-dot-dash + wave + + + + + auto + normal + bold + thin + medium + thick + + + + + + + + normal + bold + 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800 + 900 + + + + + continuous + skip-white-space + + + + + + + + + + + + + + + + + normal + + + + + + + + + + + + + + + + + + + + + + + + + start + center + justify + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + auto + page + + + + + + + no-limit + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + ideograph-alpha + + + + + + + simple + hanging + + + + + + + normal + strict + + + + + + + top + middle + bottom + auto + baseline + + + + + + + + + + + + + + + + + + + + + + + start + end + left + right + center + justify + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + + char + + + + + + + + + + + + + + + + + + + + + + + font-color + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + word + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + column + page + + + + + + + auto + column + page + + + + + + + + + transparent + + + + + + + + + + + + + + + + + + + + + + + no-repeat + repeat + stretch + + + + + + + left + center + right + top + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + + + + + top + center + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + always + + + + + + + + + lr-tb + rl-tb + tb-rl + tb-lr + lr + rl + tb + page + + + + + + + + + + auto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + above + below + + + + + + + left + center + right + distribute-letter + distribute-space + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + solid + dotted + dashed + dot-dashed + + + + + + + + + + + + + + + top + middle + bottom + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + left + center + right + margins + + + + + + + + + + + + + + + + + + + + collapsing + separating + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + auto + always + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + automatic + + + + + + + fix + value-type + + + + + + + + auto + 0 + 0deg + 0rad + 0grad + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + no-wrap + wrap + + + + + + + + none + bottom + top + center + + + + + + + none + hidden-and-protected + + + + protected + formula-hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ltr + ttb + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + label-width-and-position + label-alignment + + + + + + + + + + + + + + + + + + + + + listtab + space + nothing + + + + + + + + + + + + + + + + + + + + + + + + + none + dash + solid + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 0 + 1 + + + + + + + + + miter + round + bevel + middle + none + + + + + + + butt + square + round + + + + + + + + + + + + none + scroll + alternate + slide + + + + + + + left + right + up + down + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top + middle + bottom + justify + + + + + + + left + center + right + justify + + + + + + + no-wrap + wrap + + + + + + + + + + + + greyscale + mono + watermark + standard + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + below + above + + + + + + + + + + + + automatic + left-outside + inside + right-outside + + + + + + + automatic + above + below + center + + + + + + + automatic + mm + cm + m + km + pt + pc + inch + ft + mi + + + + + + + + + + + + + + + + + straight-line + angled-line + angled-connector-line + + + + + + + fixed + free + + + + + + + + + + + + + + + + + horizontal + vertical + auto + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + correct + attractive + + + + + + + + + + + + + + + + + enabled + disabled + + + + + + + + + + + + + + + + + + + + + + standard + double-sided + + + + + + + object + flat + sphere + + + + + + + normal + inverse + + + + + + + object + parallel + sphere + + + + + + + object + parallel + sphere + + + + + + + luminance + intensity + color + + + + + + + enabled + disabled + + + + + + + replace + modulate + blend + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + + content + position + size + + + + + + + + + + left + center + right + from-left + inside + outside + from-inside + + + + + + + + + + + + page + page-content + page-start-margin + page-end-margin + frame + frame-content + frame-start-margin + frame-end-margin + paragraph + paragraph-content + paragraph-start-margin + paragraph-end-margin + char + + + + + + + + + + + + + + + + + none + left + right + parallel + dynamic + run-through + biggest + + + + + + + + + + + + no-limit + + + + + + + + + + + + + full + outside + + + + + + + foreground + background + + + + + + + + + + + + clip + auto-create-new-frame + + + + + + + none + vertical + + + vertical + + + + + vertical + + + + + + + + auto + + + + + + + + iterative + once-concurrent + once-successive + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + content + thumbnail + icon + print-view + + + + + + + + + + + + + + + + none + solid + bitmap + gradient + hatch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + no-repeat + repeat + stretch + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + top-left + top + top-right + left + center + right + bottom-left + bottom + bottom-right + + + + + + + + + horizontal + vertical + + + + + + + + + + + + + + + + + + nonzero + evenodd + + + + + + + + + + + + + + + + + + + top + middle + bottom + from-top + below + + + + + + + + + + + + + + page + page-content + frame + frame-content + paragraph + paragraph-content + char + line + baseline + text + + + + + + + + + + + + + + horizontal + horizontal-on-odd + horizontal-on-even + + + + + rect\([ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)))|(auto))([ ]*,[ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))))|(auto)){3}[ ]*\) + + + + + ([0-9]+(\.[0-9]*)?|\.[0-9]+)(px) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + + + automatic + + + + named-symbol + + + + square + diamond + arrow-down + arrow-up + arrow-right + arrow-left + bow-tie + hourglass + circle + star + x + plus + asterisk + horizontal-bar + vertical-bar + + + + + + image + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + cubic-spline + b-spline + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + cuboid + cylinder + cone + pyramid + + + + + + + + + + + + + + + + + use-zero + leave-gap + ignore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + side-by-side + stagger-even + stagger-odd + + + + + + + + + none + value + percentage + value-and-percentage + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + none + variance + standard-deviation + percentage + error-margin + constant + standard-error + cell-range + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + columns + rows + + + + + + + none + linear + logarithmic + exponential + power + + + + + + + start + end + + + + + + + + near-axis + near-axis-other-side + outside-start + outside-end + + + + + + + at-labels + at-axis + at-labels-and-axis + + + + + + + + + + + + + avoid-overlap + center + top + top-right + right + bottom-right + bottom + bottom-left + left + top-left + inside + outside + near-origin + + + + + + + + manual + automatic + semi-automatic + + + + + + + none + fade-from-left + fade-from-top + fade-from-right + fade-from-bottom + fade-from-upperleft + fade-from-upperright + fade-from-lowerleft + fade-from-lowerright + move-from-left + move-from-top + move-from-right + move-from-bottom + move-from-upperleft + move-from-upperright + move-from-lowerleft + move-from-lowerright + uncover-to-left + uncover-to-top + uncover-to-right + uncover-to-bottom + uncover-to-upperleft + uncover-to-upperright + uncover-to-lowerleft + uncover-to-lowerright + fade-to-center + fade-from-center + vertical-stripes + horizontal-stripes + clockwise + counterclockwise + open-vertical + open-horizontal + close-vertical + close-horizontal + wavyline-from-left + wavyline-from-top + wavyline-from-right + wavyline-from-bottom + spiralin-left + spiralin-right + spiralout-left + spiralout-right + roll-from-top + roll-from-left + roll-from-right + roll-from-bottom + stretch-from-left + stretch-from-top + stretch-from-right + stretch-from-bottom + vertical-lines + horizontal-lines + dissolve + random + vertical-checkerboard + horizontal-checkerboard + interlocking-horizontal-left + interlocking-horizontal-right + interlocking-vertical-top + interlocking-vertical-bottom + fly-away + open + close + melt + + + + + + + + + + + + + + + + + + + + + + forward + reverse + + + + + + + + + + + + + + + + + visible + hidden + + + + + + + full + border + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + false + + + + + + + + + + + + + + + + + + + + [A-Za-z0-9]{1,8} + + + + + [A-Za-z]{1,8} + + + + + [A-Za-z0-9]{1,8} + + + + + 1 + + + + + -?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + ([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + ([0-9]*[1-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1-9][0-9]*|\.[0-9]*[1-9][0-9]*)((cm)|(mm)|(in)|(pt)|(pc)|(px)) + + + + + -?([0-9]+(\.[0-9]*)?|\.[0-9]+)% + + + + + ([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)% + + + + + -?([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)% + + + + + [0-9]+\* + + + + + + + + + + + #[0-9a-fA-F]{6} + + + + + + + + (([\i-[:]][\c-[:]]*)?:)?.+ + 1 + + + + + + + + + + + + \[(([\i-[:]][\c-[:]]*)?:)?.+\] + 3 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + _self + _blank + _parent + _top + + + + + + float + time + date + percentage + currency + boolean + string + + + + + -?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)* + + + + + + + + \([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\) + + + + + [^:]+:[^:]+ + + + + + An IRI-reference as defined in [RFC3987]. See ODF 1.2 Part 1 section 18.3. + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.presentation.png b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.presentation.png new file mode 100644 index 0000000000..1d0fdc08af Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.presentation.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.spreadsheet.png b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.spreadsheet.png new file mode 100644 index 0000000000..9614ca81d6 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.spreadsheet.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.text.png b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.text.png new file mode 100644 index 0000000000..3fa71f4dc1 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/docnosis/application-vnd.oasis.opendocument.text.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/docnosis.js b/apps/files_odfviewer/src/webodf/programs/docnosis/docnosis.js new file mode 100644 index 0000000000..4bddc12cc2 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/docnosis.js @@ -0,0 +1,779 @@ +/*global runtime, Node, window, DOMParser, core, xmldom, NodeFilter, alert, + FileReader*/ +runtime.loadClass("core.Zip"); +runtime.loadClass("core.Base64"); +runtime.loadClass("xmldom.RelaxNG"); + +/** This code runs a number of tests on an ODF document. + * Ideally, it would use ODFContainer, but for now, it uses a custome container + * for loaded odf files. + */ + +function conformsToPattern(object, pattern, name) { + "use strict"; + var i; + if (object === undefined || object === null) { + return pattern === null || (typeof pattern) !== "object"; + } + for (i in pattern) { + if (pattern.hasOwnProperty(i)) { + if (!(object.hasOwnProperty(i) || + (i === "length" && object.length)) || + !conformsToPattern(object[i], pattern[i], i)) { + return false; + } + } + } + return true; +} + +function getConformingObjects(object, pattern, name) { + "use strict"; + var c = [], i, j; + name = name || "??"; + // we do not look inside long arrays and strings atm, + // detection of these types could be better + function accept(object) { + return object !== null && object !== undefined && + (typeof object) === "object" && + (object.length === undefined || object.length < 1000) && + !(object instanceof Node) && + !(object.constructor && object.constructor === window.Uint8Array); + } + for (i in object) { + if (object.hasOwnProperty(i) && accept(object[i])) { + c = c.concat(getConformingObjects(object[i], pattern, i)); + } + } + if (conformsToPattern(object, pattern, "?")) { + c.push(object); + } + return c; +} +function parseXml(data, errorlog, name) { + "use strict"; + function getText(e) { + var str = "", c = e.firstChild; + while (c) { + if (c.nodeType === 3) { + str += c.nodeValue; + } else { + str += getText(c); + } + c = c.nextSibling; + } + return str; + } + var str, parser, errorelements; + try { + str = runtime.byteArrayToString(data, "utf8"); + parser = new DOMParser(); + str = parser.parseFromString(str, "text/xml"); + if (str.documentElement.localName === "parsererror" + || str.documentElement.localName === "html") { + errorelements = str.getElementsByTagName("parsererror"); + if (errorelements.length > 0) { + errorlog.push("invalid XML in " + name + ": " + + getText(errorelements[0])); + str = null; + } + } + } catch (err) { + errorlog.push(err); + } + return str; +} + +/*** the jobs / tests ***/ + +function ParseXMLJob() { + "use strict"; + this.inputpattern = { file: { entries: [] } }; + this.outputpattern = { + file: { entries: [] }, + errors: { parseXmlErrors: [] }, + content_xml: null, + manifest_xml: null, + settings_xml: null, + meta_xml: null, + styles_xml: null + }; + function parseXmlFiles(input, position, callback) { + var e = input.file.entries, + filename, + ext, + dom; + if (position >= e.length) { + return callback(); + } + filename = e[position].filename; + ext = filename.substring(filename.length - 4); + if (ext === ".xml" || ext === ".rdf") { + dom = parseXml(e[position].data, input.errors.parseXmlErrors, + filename); + if (filename === "content.xml") { + input.content_xml = dom; + } else if (filename === "META-INF/manifest.xml") { + input.manifest_xml = dom; + } else if (filename === "styles.xml") { + input.styles_xml = dom; + } else if (filename === "meta.xml") { + input.meta_xml = dom; + } else if (filename === "settings.xml") { + input.settings_xml = dom; + } + e[position].dom = dom; + } + window.setTimeout(function () { + parseXmlFiles(input, position + 1, callback); + }, 0); + } + this.run = function (input, callback) { + input.errors = input.errors || {}; + input.errors.parseXmlErrors = []; + input.content_xml = null; + input.manifest_xml = null; + input.styles_xml = null; + input.meta_xml = null; + input.settings_xml = null; + parseXmlFiles(input, 0, callback); + }; +} +function UnpackJob() { + "use strict"; + this.inputpattern = { file: { path: "", data: { length: 0 } } }; + this.outputpattern = { + file: { entries: [], dom: null }, errors: { unpackErrors: [] } + }; + function getText(e) { + var str = "", c = e.firstChild; + while (c) { + if (c.nodeType === 3) { + str += c.nodeValue; + } else { + str += getText(c); + } + c = c.nextSibling; + } + return str; + } + function loadZipEntries(input, position, callback) { + if (position >= input.file.entries.length) { + return callback(); + } + var e = input.file.entries[position]; + e.load(function (err, data) { + if (err) { + input.errors.unpackErrors.push(err); + } + e.error = err; + e.data = data; + window.setTimeout(function () { + loadZipEntries(input, position + 1, callback); + }, 0); + }); + } + function loadZip(input, callback) { + var zip = new core.Zip(input.file.path, function (err, zip) { + var i; + if (err) { + input.errors.unpackErrors.push(err); + callback(); + } else { + input.file.entries = zip.getEntries(); + loadZipEntries(input, 0, callback); + } + }); + } + function loadXml(input, callback) { + input.file.dom = parseXml(input.file.data, input.errors.unpackErrors, + input.file.name); + callback(); + } + this.run = function (input, callback) { + input.errors = input.errors || {}; + input.errors.unpackErrors = []; + input.file.dom = null; + input.file.entries = []; + + if (input.file.data.length < 1) { + input.errors.unpackErrors.push("Input data is empty."); + return; + } + if (input.file.data[0] === 80) { // a ZIP file starts with 'P' + loadZip(input, callback); + } else { + loadXml(input, callback); + } + }; +} +function MimetypeTestJob(odffile) { + "use strict"; + this.inputpattern = { + file: { entries: [], dom: null }, + manifest_xml: null + }; + this.outputpattern = { mimetype: "", errors: { mimetypeErrors: [] } }; + var manifestns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"; + function getManifestMimetype(manifest) { + if (!manifest) { + return null; + } + var path, mimetype, node; + node = manifest.documentElement.firstChild; + while (node) { + if (node.nodeType === 1 && node.localName === "file-entry" && + node.namespaceURI === manifestns) { + path = node.getAttributeNS(manifestns, "full-path"); + if (path === "/") { + mimetype = node.getAttributeNS(manifestns, "media-type"); + break; + } + } + node = node.nextSibling; + } + return mimetype; + } + this.run = function (input, callback) { + input.mimetype = null; + input.errors.mimetypeErrors = []; + var mime = null, + altmime, + e = input.file.entries, + i; + if (input.file.dom) { + mime = input.file.dom.documentElement.getAttributeNS( + "urn:oasis:names:tc:opendocument:xmlns:office:1.0", "mimetype"); + } else { + if (e.length < 1 || e[0].filename !== "mimetype") { + input.errors.mimetypeErrors.push( + "First file in zip is not 'mimetype'"); + } + for (i = 0; i < e.length; i += 1) { + if (e[i].filename === "mimetype") { + mime = runtime.byteArrayToString(e[i].data, "binary"); + break; + } + } + if (mime) { + altmime = input.file.data.slice(38, 38 + mime.length); + altmime = runtime.byteArrayToString(altmime, "binary"); + if (mime !== altmime) { + input.errors.mimetypeErrors.push( + "mimetype should start at byte 38 in the zip file."); + } + } + // compare with mimetype from manifest_xml + altmime = getManifestMimetype(input.manifest_xml); + if (altmime !== mime) { + input.errors.mimetypeErrors.push( + "manifest.xml has a different mimetype."); + } + } + if (!mime) { + input.errors.mimetypeErrors.push("No mimetype was found."); + } + input.mimetype = mime; + callback(); + }; +} +function VersionTestJob() { + "use strict"; + this.inputpattern = { + file: { dom: null }, + content_xml: null, + styles_xml: null, + meta_xml: null, + settings_xml: null, + manifest_xml: null + }; + this.outputpattern = { version: "", errors: { versionErrors: [] } }; + var officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0"; + function getVersion(dom, filename, log, vinfo, filerequired) { + var v, ns = officens; + if (!dom) { + if (filerequired) { + log.push(filename + " is missing, so version cannot be found."); + } + return; + } + if (filename === "META-INF/manifest.xml") { + ns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0"; + } + if (!dom.documentElement.hasAttributeNS(ns, "version")) { + if (vinfo.versionrequired) { + log.push(filename + " has no version number."); + } + return; + } + v = dom.documentElement.getAttributeNS(ns, "version"); + if (vinfo.version === undefined) { + vinfo.version = v; + // version number is required since ODF 1.2 + vinfo.needversion = vinfo.version === "1.2"; + vinfo.versionSource = filename; + } else if (v !== vinfo.version) { + log.push(vinfo.versionSource + " and " + filename + " " + + " have different version number."); + } + } + this.run = function (input, callback) { + input.errors.versionErrors = []; + var v, + e = input.file.entries, + log = input.errors.versionErrors, + vinfo = { + version: undefined, + needversion: null, + versionSource: null + }, + contentxmlhasnoversionnumber; + if (input.file.dom) { + getVersion(input.file.dom, input.file.name, log, vinfo, true); + } else { + // until we know the version number, we cannot claim that + // content.xml needs a version number + getVersion(input.content_xml, "content.xml", log, vinfo, true); + contentxmlhasnoversionnumber = vinfo.version === undefined; + getVersion(input.manifest_xml, "META-INF/manifest.xml", log, + vinfo, true); + getVersion(input.styles_xml, "styles.xml", log, vinfo); + getVersion(input.meta_xml, "meta.xml", log, vinfo); + getVersion(input.settings_xml, "settings.xml", log, vinfo); + if (vinfo.needversion && contentxmlhasnoversionnumber) { + log.push("content.xml has no version number."); + } + } + input.version = vinfo.version; + callback(); + }; +} +function GetThumbnailJob() { + "use strict"; + var base64 = new core.Base64(); + this.inputpattern = { file: { entries: [] }, errors: {}, mimetype: "" }; + this.outputpattern = { thumbnail: "", errors: { thumbnailErrors: [] } }; + this.run = function (input, callback) { + input.thumbnail = null; + input.errors.thumbnailErrors = []; + var i, e = input.file.entries, mime = input.mimetype, thumb = null; + if (mime === "application/vnd.oasis.opendocument.text") { + thumb = "application-vnd.oasis.opendocument.text.png"; + } else if (mime === "application/vnd.oasis.opendocument.spreadsheet") { + thumb = "application-vnd.oasis.opendocument.spreadsheet.png"; + } else if (mime === "application/vnd.oasis.opendocument.presentation") { + thumb = "application-vnd.oasis.opendocument.presentation.png"; + } + for (i = 0; i < e.length; i += 1) { + if (e[i].filename === "Thumbnails/thumbnail.png") { + thumb = "data:image/png;base64," + + base64.convertUTF8ArrayToBase64(e[i].data); + break; + } + } + input.thumbnail = thumb; + callback(); + }; +} +function RelaxNGJob() { + "use strict"; + var parser = new xmldom.RelaxNGParser(), + validators = {}; + this.inputpattern = { file: {dom: null}, version: null }; + this.outputpattern = { errors: { relaxngErrors: [] } }; + function loadValidator(ns, version, callback) { + var rng; + if (ns === "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0") { + if (version === "1.2") { + rng = "OpenDocument-v1.2-cos01-manifest-schema.rng"; + } else if (version === "1.1") { + rng = "OpenDocument-manifest-schema-v1.1.rng"; + } else if (version === "1.0") { + rng = "OpenDocument-manifest-schema-v1.0-os.rng"; + } + } else if (ns === "urn:oasis:names:tc:opendocument:xmlns:office:1.0") { + if (version === "1.2") { + rng = "OpenDocument-v1.2-cos01-schema.rng"; + } else if (version === "1.1") { + rng = "OpenDocument-schema-v1.1.rng"; + } else if (version === "1.0") { + rng = "OpenDocument-schema-v1.0-os.rng"; + } + } + if (rng) { + runtime.loadXML(rng, function (err, dom) { + var relaxng; + if (err) { + runtime.log(err); + } else { + relaxng = new xmldom.RelaxNG(); + err = parser.parseRelaxNGDOM(dom, relaxng.makePattern); + if (err) { + runtime.log(err); + } else { + relaxng.init(parser.rootPattern); + } + } + validators[ns] = validators[ns] || {}; + validators[ns][version] = relaxng; + callback(relaxng); + }); + } else { + callback(null); + } + } + function getValidator(ns, version, callback) { + if (ns === "urn:oasis:names:tc:opendocument:xmlns:office:1.0" || + ns === "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0") { + if (!version) { + version = "1.1"; + } + } + if (validators[ns] && validators[ns][version]) { + return callback(validators[ns][version]); + } + loadValidator(ns, version, callback); + } + function validate(log, dom, filename, version, callback) { + var ns = dom.documentElement.namespaceURI; + getValidator(ns, version, function (relaxng) { + if (!relaxng) { + return callback(); + } + var walker = dom.createTreeWalker(dom.firstChild, 0xFFFFFFFF, + { acceptNode: function(node) { + return NodeFilter.FILTER_ACCEPT; } + }, false), + err; +runtime.log("START VALIDATING"); + err = relaxng.validate(walker, function (err) { +runtime.log("FINISHED VALIDATING"); + var i; + if (err) { + for (i = 0; i < err.length; i += 1) { + log.push(filename + ": " + err[i]); + } + } + callback(); + }); + }); + } + function validateEntries(log, entries, position, version, callback) { + if (position >= entries.length) { + return callback(); + } + var e = entries[position]; + if (e.dom) { + validate(log, e.dom, e.filename, version, function () { + window.setTimeout(function () { + validateEntries(log, entries, position + 1, version, + callback); + }, 0); + }); + } else { + validateEntries(log, entries, position + 1, version, callback); + } + } + this.run = function (input, callback) { + input.errors = input.errors || {}; + input.errors.relaxngErrors = []; + runtime.log(input.version); + if (input.file.dom) { + validate(input.errors.relaxngErrors, input.file.dom, + input.file.path, input.version, callback); + return; + } + var i, e = input.file.entries; + validateEntries(input.errors.relaxngErrors, input.file.entries, 0, + input.version, callback); + }; +} + +function DataRenderer(parentelement) { + "use strict"; + var doc = parentelement.ownerDocument, + element = doc.createElement("div"), + lastrendertime, + delayedRenderComing, + renderinterval = 300; // minimal milliseconds between renders + function clear(element) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + } + function addParagraph(div, text) { + var p = doc.createElement("p"); + p.appendChild(doc.createTextNode(text)); + div.appendChild(p); + } + function addSpan(parent, nodename, text) { + var e = doc.createElement(nodename); + e.appendChild(doc.createTextNode(text)); + parent.appendChild(e); + } + function addErrors(div, e, active) { + var i, o; + for (i in e) { + if (e.hasOwnProperty(i)) { + o = e[i]; + if (active && ((typeof o) === "string" + || o instanceof String)) { + addParagraph(div, o); + } else if (o && (typeof o) === "object" && + !(o instanceof Node) && + !(o.constructor && + o.constructor === window.Uint8Array)) { + addErrors(div, o, active || i === "errors"); + } + } + } + } + function renderFile(data) { + var div = doc.createElement("div"), + h1 = doc.createElement("h1"), + icon = doc.createElement("img"); + div.style.clear = "both"; + div.appendChild(h1); + div.appendChild(icon); + h1.appendChild(doc.createTextNode(data.file.path)); + element.appendChild(div); + if (data.thumbnail) { + icon.src = data.thumbnail; + } + icon.style.width = "128px"; + icon.style.float = "left"; + icon.style.mozBoxShadow = icon.style.webkitBoxShadow = + icon.style.boxShadow = "3px 3px 4px #000"; + icon.style.marginRight = icon.style.marginBottom = "10px"; + addParagraph(div, "mimetype: " + data.mimetype); + addParagraph(div, "version: " + data.version); + addParagraph(div, "document representation: " + + ((data.file.dom) ? "single XML document" :"package")); + addErrors(div, data, false); + } + function dorender(data) { + clear(element); + var i; + for (i = 0; i < data.length; i += 1) { + renderFile(data[i]); + } + } + this.render = function render(data) { + var now = Date.now(); + if (!lastrendertime || now - lastrendertime > renderinterval) { + lastrendertime = now; + dorender(data); + } else if (!delayedRenderComing) { + delayedRenderComing = true; + window.setTimeout(function () { + delayedRenderComing = false; + lastrendertime = now + renderinterval; + dorender(data); + }, renderinterval); + } + }; + parentelement.appendChild(element); +} + +function JobRunner(datarenderer) { + "use strict"; + var jobrunner = this, + jobtypes = [], + data, + busy = false, + todo = []; + + jobtypes.push(new UnpackJob()); + jobtypes.push(new MimetypeTestJob()); + jobtypes.push(new GetThumbnailJob()); + jobtypes.push(new VersionTestJob()); + jobtypes.push(new ParseXMLJob()); + jobtypes.push(new RelaxNGJob()); + + function run() { + if (busy) { + return; + } + var job = todo.shift(); + if (job) { + busy = true; + job.job.run(job.object, function () { + busy = false; + if (!conformsToPattern(job.object, job.job.outputpattern)) { + throw "Job does not give correct output."; + } + datarenderer.render(data); + window.setTimeout(run, 0); + }); + } + } + + function update(ignore, callback) { + var i, jobtype, j, inobjects, outobjects; + todo = []; + for (i = 0; i < jobtypes.length; i += 1) { + jobtype = jobtypes[i]; + inobjects = getConformingObjects(data, jobtype.inputpattern); + outobjects = getConformingObjects(data, jobtype.outputpattern); + for (j = 0; j < inobjects.length; j += 1) { + if (outobjects.indexOf(inobjects[j]) === -1) { + todo.push({job: jobtype, object: inobjects[j]}); + } + } + } + if (todo.length > 0) { + // run update again after all todos are done + todo.push({job: jobrunner, object: null}); + } + if (callback) { + callback(); + } else { + run(); + } + } + + this.run = update; + + this.setData = function setData(newdata) { + data = newdata; + if (busy) { + todo = []; + todo.push({job: jobrunner, object: null}); + } else { + update(); + } + }; +} +function LoadingFile(file) { + "use strict"; + var data, + error, + readRequests = []; + function load(callback) { + var reader = new FileReader(); + reader.onloadend = function(evt) { + data = runtime.byteArrayFromString(evt.target.result, "binary"); + error = evt.target.error && String(evt.target.error); + var i = 0; + for (i = 0; i < readRequests.length; i += 1) { + readRequests[i](); + } + readRequests = undefined; + reader = undefined; + callback(error, data); + }; + reader.readAsBinaryString(file); + } + this.file = file; + this.read = function (offset, length, callback) { + function read() { + if (error) { + return callback(error); + } + if (data) { + return callback(error, data.slice(offset, offset + length)); + } + readRequests.push(read); + } + read(); + }; + this.load = load; +} +function Docnosis(element) { + "use strict"; + var doc = element.ownerDocument, + form, + diagnoses = doc.createElement("div"), + openedFiles = {}, + datarenderer = new DataRenderer(diagnoses), + jobrunner = new JobRunner(datarenderer), + jobrunnerdata = []; + + function dragHandler(evt) { + var over = evt.type === "dragover" && evt.target.nodeName !== "INPUT"; + if (over || evt.type === "drop") { + evt.stopPropagation(); + evt.preventDefault(); + } + if (evt.target.style) { + evt.target.style.background = (over ? "#CCCCCC" : "inherit"); + } + } + + function fileSelectHandler(evt) { + // cancel event and hover styling + dragHandler(evt); + + function diagnoseFile(file) { + var loadingfile, path; + path = file.name; + loadingfile = new LoadingFile(file); + openedFiles[path] = loadingfile; + loadingfile.load(function (error, data) { + jobrunnerdata.push({file:{ + path: path, + data: data + }}); + jobrunner.setData(jobrunnerdata); + }); + } + // process all File objects + var i, files, div; + files = (evt.target && evt.target.files) || + (evt.dataTransfer && evt.dataTransfer.files); + if (files) { + for (i = 0; files && i < files.length; i += 1) { + div = doc.createElement("div"); + diagnoses.appendChild(div); + diagnoseFile(files[i]); + } + } else { + alert("File(s) could not be opened in this browser."); + } + } + + function createForm() { + var form = doc.createElement("form"), + fieldset = doc.createElement("fieldset"), + legend = doc.createElement("legend"), + input = doc.createElement("input"); + form = doc.createElement("form"); + form.appendChild(fieldset); + fieldset.appendChild(legend); + input.setAttribute("type", "file"); + input.setAttribute("name", "fileselect[]"); + input.setAttribute("multiple", "multiple"); + input.addEventListener("change", fileSelectHandler, false); + fieldset.appendChild(input); + fieldset.appendChild(doc.createTextNode("or drop files here")); + legend.appendChild(doc.createTextNode("docnosis")); + form.addEventListener("dragover", dragHandler, false); + form.addEventListener("dragleave", dragHandler, false); + form.addEventListener("drop", fileSelectHandler, false); + return form; + } + + function enhanceRuntime() { + var read = runtime.read, + getFileSize = runtime.getFileSize; + runtime.read = function (path, offset, length, callback) { + if (openedFiles.hasOwnProperty(path)) { + return openedFiles[path].read(offset, length, callback); + } else { + return read(path, offset, length, callback); + } + }; + runtime.getFileSize = function (path, callback) { + if (openedFiles.hasOwnProperty(path)) { + return callback(openedFiles[path].file.size); + } else { + return getFileSize(path, callback); + } + }; + } + + form = createForm(); + element.appendChild(form); + element.appendChild(diagnoses); + enhanceRuntime(); +} diff --git a/apps/files_odfviewer/src/webodf/programs/docnosis/index.html b/apps/files_odfviewer/src/webodf/programs/docnosis/index.html new file mode 100644 index 0000000000..cd56d4f746 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/docnosis/index.html @@ -0,0 +1,27 @@ + + + + + docnosis + + + + + + + +
    + + diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/firefoxextension/CMakeLists.txt new file mode 100644 index 0000000000..92d1e19f7c --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/firefoxextension/CMakeLists.txt @@ -0,0 +1,35 @@ +# the files that go into the extension +set(FIREFOXEXTENSIONFILES + bootstrap.js + chrome.manifest + skin/default/icon.png + content/odf.html + components/odfContentHandler.js +) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/install.rdf.in + ${CMAKE_CURRENT_SOURCE_DIR}/install.rdf) +set(WEBODFXPI ${CMAKE_CURRENT_BINARY_DIR}/webodf-${WEBODF_VERSION}.xpi) +add_custom_command( + OUTPUT ${WEBODFXPI} + # copy the common webodf.css and webodf.js + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different + ${CMAKE_SOURCE_DIR}/webodf/webodf.css + ${CMAKE_CURRENT_SOURCE_DIR}/content/webodf.css + COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different + ${CMAKE_BINARY_DIR}/webodf/webodf.js + ${CMAKE_CURRENT_SOURCE_DIR}/content/webodf.js + # zip using javascript code running in node.js + COMMAND ${NODE} ARGS ../../webodf/lib/runtime.js packextension.js + ${WEBODFXPI} + ${FIREFOXEXTENSIONFILES} + content/webodf.js + content/webodf.css + install.rdf + DEPENDS NodeJS + packextension.js ${FIREFOXEXTENSIONFILES} + install.rdf.in + ${CMAKE_SOURCE_DIR}/webodf/webodf.css + ${CMAKE_BINARY_DIR}/webodf/webodf.js + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) +add_custom_target(firefoxextension ALL DEPENDS ${WEBODFXPI}) diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/bootstrap.js b/apps/files_odfviewer/src/webodf/programs/firefoxextension/bootstrap.js new file mode 100644 index 0000000000..c95dbd4a90 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/firefoxextension/bootstrap.js @@ -0,0 +1,36 @@ +/*global Components: true, dump: true, Services: true*/ + +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cm = Components.manager; +var Cu = Components.utils; + +Cu["import"]('resource://gre/modules/Services.jsm'); + +function log(str) { + "use strict"; + dump(str + '\n'); +} + +function startup(aData, aReason) { + "use strict"; + var manifestPath = 'chrome.manifest', + file = Cc['@mozilla.org/file/local;1'].createInstance(Ci.nsILocalFile); + try { + file.initWithPath(aData.installPath.path); + file.append(manifestPath); + Cm.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file); + } catch (e) { + log(e); + } +} + +function shutdown(aData, aReason) { + "use strict"; +} + +function install(aData, aReason) { + "use strict"; + var url = 'chrome://webodf.js/content/odf.html?file=%s'; + Services.prefs.setCharPref('extensions.webodf.js.url', url); +} diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/chrome.manifest b/apps/files_odfviewer/src/webodf/programs/firefoxextension/chrome.manifest new file mode 100644 index 0000000000..b6f6e75cfb --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/firefoxextension/chrome.manifest @@ -0,0 +1,13 @@ +content webodf.js content/ +skin webodf.js default skin/default/ + +component {afe5fa21-709d-4916-b51c-56f60d574a0a} components/odfContentHandler.js +contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.text {afe5fa21-709d-4916-b51c-56f60d574a0a} +contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.spreadsheet {afe5fa21-709d-4916-b51c-56f60d574a0a} +contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.oasis.opendocument.presentation {afe5fa21-709d-4916-b51c-56f60d574a0a} +category ext-to-type-mapping odt application/vnd.oasis.opendocument.text +category ext-to-type-mapping fodt application/vnd.oasis.opendocument.text +category ext-to-type-mapping ods application/vnd.oasis.opendocument.spreadsheet +category ext-to-type-mapping fods application/vnd.oasis.opendocument.spreadsheet +category ext-to-type-mapping odp application/vnd.oasis.opendocument.presentation +category ext-to-type-mapping fodp application/vnd.oasis.opendocument.presentation diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/components/odfContentHandler.js b/apps/files_odfviewer/src/webodf/programs/firefoxextension/components/odfContentHandler.js new file mode 100644 index 0000000000..47a3d349ac --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/firefoxextension/components/odfContentHandler.js @@ -0,0 +1,196 @@ +/*jslint bitwise: true*/ +/*global Components: true, dump: true, Uint8Array: true, Services: true, + XPCOMUtils: true*/ +var Cc = Components.classes; +var Ci = Components.interfaces; +var Cr = Components.results; +var Cu = Components.utils; + +var ODF_CONTENT_TYPE_PREFIX = 'application/vnd.oasis.opendocument.'; +var NS_ERROR_WONT_HANDLE_CONTENT = 0x805d0001; + +Cu["import"]('resource://gre/modules/XPCOMUtils.jsm'); +Cu["import"]('resource://gre/modules/Services.jsm'); + +function log(aMsg) { + "use strict"; + var msg = 'odfContentHandler.js: ' + (aMsg.join ? aMsg.join('') : aMsg); + Cc['@mozilla.org/consoleservice;1'].getService(Ci.nsIConsoleService) + .logStringMessage(msg); + dump(msg + '\n'); +} + +function fireEventTo(aName, aData, aWindow) { + "use strict"; + var mywindow = aWindow.wrappedJSObject, + evt = mywindow.document.createEvent('CustomEvent'); + evt.initCustomEvent('odf' + aName, false, false, aData); + mywindow.document.dispatchEvent(evt); +} + +function loadDocument(aWindow, aDocumentUrl) { + "use strict"; + var xhr = Cc['@mozilla.org/xmlextras/xmlhttprequest;1'] + .createInstance(Ci.nsIXMLHttpRequest); + xhr.onprogress = function updateProgress(evt) { + if (evt.lengthComputable) { + fireEventTo(evt.type, evt.loaded / evt.total, aWindow); + } + }; + + xhr.onerror = function error(evt) { + fireEventTo(evt.type, false, aWindow); + }; + + xhr.onload = function load(evt) { + var data = (xhr.mozResponseArrayBuffer || xhr.mozResponse || + xhr.responseArrayBuffer || xhr.response), + view, + mywindow, + arrayBuffer, + view2, + array, + i; + try { + view = new Uint8Array(data); + mywindow = aWindow.wrappedJSObject; + arrayBuffer = new mywindow.ArrayBuffer(data.byteLength); + view2 = new mywindow.Uint8Array(arrayBuffer); + view2.set(view); + array = []; + array.length = view2.byteLength; + for (i = 0; i < view2.byteLength; i += 1) { + array[i] = view2[i]; + } + fireEventTo(evt.type, array, aWindow); + } catch (e) { + log('Error - ' + e); + } + }; + + xhr.open('GET', aDocumentUrl); + xhr.responseType = 'arraybuffer'; + xhr.send(null); +} + +var WebProgressListener = { + init: function WebProgressListenerInit(aWindow, aUrl) { + "use strict"; + this.locationHasChanged = false; + this.documentUrl = aUrl; + + var flags = Ci.nsIWebProgress.NOTIFY_LOCATION | + Ci.nsIWebProgress.NOTIFY_STATE_NETWORK | + Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT, + docShell = aWindow.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebNavigation) + .QueryInterface(Ci.nsIDocShell), + webProgress = docShell.QueryInterface(Ci.nsIInterfaceRequestor) + .getInterface(Ci.nsIWebProgress); + try { + webProgress.removeProgressListener(this); + } catch (e) { + } + webProgress.addProgressListener(this, flags); + }, + + onStateChange: function onStateChange(aWebProgress, aRequest, aStateFlags, + aStatus) { + "use strict"; + var complete = Ci.nsIWebProgressListener.STATE_IS_WINDOW + + Ci.nsIWebProgressListener.STATE_STOP; + if ((aStateFlags & complete) === complete && this.locationHasChanged) { + aWebProgress.removeProgressListener(this); + loadDocument(aWebProgress.DOMWindow, this.documentUrl); + } + }, + + onProgressChange: function onProgressChange(aWebProgress, aRequest, + aCurSelf, aMaxSelf, aCurTotal, + aMaxTotal) { + "use strict"; + }, + + onLocationChange: function onLocationChange(aWebProgress, aRequest, + aLocationURI) { + "use strict"; + this.locationHasChanged = true; + }, + + onStatusChange: function onStatusChange(aWebProgress, aRequest, aStatus, + aMessage) { + "use strict"; + }, + + onSecurityChange: function onSecurityChange(aWebProgress, aRequest, aState) { + "use strict"; + }, + + QueryInterface: function QueryInterface(aIID) { + "use strict"; + if (aIID.equals(Ci.nsIWebProgressListener) || + aIID.equals(Ci.nsISupportsWeakReference) || + aIID.equals(Ci.nsISupports)) { + return this; + } + throw Components.results.NS_ERROR_NO_INTERFACE; + } +}; + +function odfContentHandler() { + "use strict"; +} + +odfContentHandler.prototype = { + handleContent: function handleContent(aMimetype, aContext, aRequest) { + "use strict"; + + if (!(aMimetype.indexOf(ODF_CONTENT_TYPE_PREFIX) === 0 || + aMimetype === "application/octet-stream")) { + throw NS_ERROR_WONT_HANDLE_CONTENT; + } + + if (!(aRequest instanceof Ci.nsIChannel)) { + throw NS_ERROR_WONT_HANDLE_CONTENT; + } + + var mywindow = null, + callbacks, + uri = aRequest.URI, + targetUrl = uri.spec, + tail = targetUrl.substring(targetUrl.length-9), + url; + + // if the url ends with a download parameter, then do not handle it + if (tail === "#download") { + throw NS_ERROR_WONT_HANDLE_CONTENT; + } + + callbacks = aRequest.notificationCallbacks || + aRequest.loadGroup.notificationCallbacks; + if (!callbacks) { + return; + } + + mywindow = callbacks.getInterface(Ci.nsIDOMWindow); + + WebProgressListener.init(mywindow, uri.spec); + + try { + url = Services.prefs.getCharPref('extensions.webodf.js.url'); + //url = url.replace('%s', encodeURIComponent(targetUrl)); + url = url.replace('%s', targetUrl); + } catch (e) { + log('Error retrieving the webodf base url - ' + e); + throw NS_ERROR_WONT_HANDLE_CONTENT; + } + + aRequest.cancel(Cr.NS_BINDING_ABORTED); + mywindow.location = url; + }, + + classID: Components.ID('{afe5fa21-709d-4916-b51c-56f60d574a0a}'), + QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentHandler]) +}; + +var NSGetFactory = XPCOMUtils.generateNSGetFactory([odfContentHandler]); diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/content/odf.html b/apps/files_odfviewer/src/webodf/programs/firefoxextension/content/odf.html new file mode 100644 index 0000000000..0dc023aed8 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/firefoxextension/content/odf.html @@ -0,0 +1,89 @@ + + + + + + + + + + + + +
    +
    +
    + + diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/install.rdf.in b/apps/files_odfviewer/src/webodf/programs/firefoxextension/install.rdf.in new file mode 100644 index 0000000000..caf59198a2 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/firefoxextension/install.rdf.in @@ -0,0 +1,34 @@ + + + + + + uriloader@webodf.js + WebODF + 2 + @WEBODF_VERSION@ + chrome://webodf.js/skin/icon.png + + + + {ec8030f7-c20a-464f-9b0e-13a3a9e97384} + 3.6 + 9.* + + + + + + {a23983c0-fd0e-11dc-95ff-0800200c9a66} + 4.0 + 9.* + + + true + true + Jos van den Oever + OpenDocument Viewer + http://webodf.org/ + + diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/packextension.js b/apps/files_odfviewer/src/webodf/programs/firefoxextension/packextension.js new file mode 100644 index 0000000000..ce606817ea --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/firefoxextension/packextension.js @@ -0,0 +1,77 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true*/ +runtime.loadClass("core.Zip"); +runtime.loadClass("core.Base64"); + +function addFiles(zip, pos, files, callback) { + "use strict"; + if (pos >= files.length) { + zip.write(function (err) { + return callback(err); + }); + return; + } + var path = files[pos]; + runtime.readFile(path, "binary", function (err, data) { + var base64; + if (err) { + return callback(err); + } + if (path === "content/webodf.js") { + // replace eval() with evil(), since Firefox does not approve of it + base64 = new core.Base64(); + data = base64.convertUTF8ArrayToUTF16String(data); + data = data.replace(new RegExp('eval\\(', 'g'), 'evil('); + data = runtime.byteArrayFromString(data); + } + zip.save(path, data, false, new Date()); + addFiles(zip, pos + 1, files, callback); + }); +} + +var args = arguments, + filename = args[1], + zipmembers = [], + i, + zip = new core.Zip(filename, null); +for (i = 2; i < arguments.length; i += 1) { + zipmembers.push(arguments[i]); +} + +addFiles(zip, 0, zipmembers, function (err) { + "use strict"; + if (err) { + runtime.log(err); + } +}); diff --git a/apps/files_odfviewer/src/webodf/programs/firefoxextension/skin/default/icon.png b/apps/files_odfviewer/src/webodf/programs/firefoxextension/skin/default/icon.png new file mode 100644 index 0000000000..94d7d8da5d Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/firefoxextension/skin/default/icon.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/Default-Landscape~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/Default-Landscape~ipad.png new file mode 100644 index 0000000000..06bb96b394 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/Default-Landscape~ipad.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/Default-Portrait~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/Default-Portrait~ipad.png new file mode 100644 index 0000000000..dbfed967af Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/Default-Portrait~ipad.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF.xcodeproj/project.pbxproj b/apps/files_odfviewer/src/webodf/programs/ios/WebODF.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..d4a76518f3 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF.xcodeproj/project.pbxproj @@ -0,0 +1,512 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + CB099EC714DAC535000D7B99 /* Default-Portrait~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */; }; + CB099EC914DAC53D000D7B99 /* Default-Landscape~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */; }; + CB29ECBD14FFBBBB00CEAEE3 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */; }; + CB29ECBF14FFBC0500CEAEE3 /* ioapi.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */; }; + CB29ECC114FFBC1B00CEAEE3 /* mztools.c in Sources */ = {isa = PBXBuildFile; fileRef = CB29ECC014FFBC1B00CEAEE3 /* mztools.c */; }; + CB29ECC314FFBC5500CEAEE3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = CB29ECC214FFBC5500CEAEE3 /* libz.dylib */; }; + CB36D11814F68F7F0084BECB /* www in Resources */ = {isa = PBXBuildFile; fileRef = CB36D11714F68F7F0084BECB /* www */; }; + CB533D9114DABDA600C733F6 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9014DABDA600C733F6 /* Foundation.framework */; }; + CB533D9314DABDA600C733F6 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9214DABDA600C733F6 /* UIKit.framework */; }; + CB533D9514DABDA600C733F6 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9414DABDA600C733F6 /* CoreGraphics.framework */; }; + CB533D9714DABDA600C733F6 /* AddressBook.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9614DABDA600C733F6 /* AddressBook.framework */; }; + CB533D9914DABDA600C733F6 /* AddressBookUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9814DABDA600C733F6 /* AddressBookUI.framework */; }; + CB533D9B14DABDA600C733F6 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */; }; + CB533D9D14DABDA600C733F6 /* AVFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9C14DABDA600C733F6 /* AVFoundation.framework */; }; + CB533D9F14DABDA600C733F6 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533D9E14DABDA600C733F6 /* CoreLocation.framework */; }; + CB533DA114DABDA600C733F6 /* MediaPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA014DABDA600C733F6 /* MediaPlayer.framework */; }; + CB533DA314DABDA600C733F6 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA214DABDA600C733F6 /* QuartzCore.framework */; }; + CB533DA514DABDA600C733F6 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */; }; + CB533DA714DABDA600C733F6 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */; }; + CB533DA914DABDA600C733F6 /* CoreMedia.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DA814DABDA600C733F6 /* CoreMedia.framework */; }; + CB533DAF14DABDA600C733F6 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = CB533DAD14DABDA600C733F6 /* InfoPlist.strings */; }; + CB533DB114DABDA600C733F6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DB014DABDA600C733F6 /* main.m */; }; + CB533DB414DABDA600C733F6 /* PhoneGap.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB533DB314DABDA600C733F6 /* PhoneGap.framework */; }; + CB533DB914DABDA600C733F6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = CB533DB714DABDA600C733F6 /* Localizable.strings */; }; + CB533DC014DABDA600C733F6 /* icon.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DBF14DABDA600C733F6 /* icon.png */; }; + CB533DC214DABDA600C733F6 /* icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC114DABDA600C733F6 /* icon@2x.png */; }; + CB533DC414DABDA600C733F6 /* icon-72.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC314DABDA600C733F6 /* icon-72.png */; }; + CB533DC714DABDA600C733F6 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC614DABDA600C733F6 /* Default.png */; }; + CB533DC914DABDA600C733F6 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = CB533DC814DABDA600C733F6 /* Default@2x.png */; }; + CB533DCD14DABDA600C733F6 /* PhoneGap.plist in Resources */ = {isa = PBXBuildFile; fileRef = CB533DCC14DABDA600C733F6 /* PhoneGap.plist */; }; + CB533DD114DABDA600C733F6 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DD014DABDA600C733F6 /* AppDelegate.m */; }; + CB533DD414DABDA600C733F6 /* MainViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = CB533DD314DABDA600C733F6 /* MainViewController.m */; }; + CB533DD614DABDA600C733F6 /* MainViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = CB533DD514DABDA600C733F6 /* MainViewController.xib */; }; + CBD2B77314FF8E9700FC3A44 /* NativeZip.m in Sources */ = {isa = PBXBuildFile; fileRef = CBD2B77214FF8E9700FC3A44 /* NativeZip.m */; }; + CBDCA69D1504EAEB00C706C7 /* WebViewCache.m in Sources */ = {isa = PBXBuildFile; fileRef = CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Portrait~ipad.png"; path = "../Default-Portrait~ipad.png"; sourceTree = ""; }; + CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-Landscape~ipad.png"; path = "../Default-Landscape~ipad.png"; sourceTree = ""; }; + CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = unzip.c; path = WebODF/Classes/minizip/unzip.c; sourceTree = ""; }; + CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ioapi.c; path = WebODF/Classes/minizip/ioapi.c; sourceTree = ""; }; + CB29ECC014FFBC1B00CEAEE3 /* mztools.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mztools.c; path = WebODF/Classes/minizip/mztools.c; sourceTree = ""; }; + CB29ECC214FFBC5500CEAEE3 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = usr/lib/libz.dylib; sourceTree = SDKROOT; }; + CB36D11714F68F7F0084BECB /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; path = www; sourceTree = ""; }; + CB533D8C14DABDA500C733F6 /* KO Viewer.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "KO Viewer.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + CB533D9014DABDA600C733F6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; + CB533D9214DABDA600C733F6 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; + CB533D9414DABDA600C733F6 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; + CB533D9614DABDA600C733F6 /* AddressBook.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBook.framework; path = System/Library/Frameworks/AddressBook.framework; sourceTree = SDKROOT; }; + CB533D9814DABDA600C733F6 /* AddressBookUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AddressBookUI.framework; path = System/Library/Frameworks/AddressBookUI.framework; sourceTree = SDKROOT; }; + CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; + CB533D9C14DABDA600C733F6 /* AVFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AVFoundation.framework; path = System/Library/Frameworks/AVFoundation.framework; sourceTree = SDKROOT; }; + CB533D9E14DABDA600C733F6 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; }; + CB533DA014DABDA600C733F6 /* MediaPlayer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MediaPlayer.framework; path = System/Library/Frameworks/MediaPlayer.framework; sourceTree = SDKROOT; }; + CB533DA214DABDA600C733F6 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; + CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = System/Library/Frameworks/MobileCoreServices.framework; sourceTree = SDKROOT; }; + CB533DA814DABDA600C733F6 /* CoreMedia.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreMedia.framework; path = System/Library/Frameworks/CoreMedia.framework; sourceTree = SDKROOT; }; + CB533DAC14DABDA600C733F6 /* WebODF-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "WebODF-Info.plist"; sourceTree = ""; }; + CB533DAE14DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; + CB533DB014DABDA600C733F6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + CB533DB214DABDA600C733F6 /* WebODF-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "WebODF-Prefix.pch"; sourceTree = ""; }; + CB533DB314DABDA600C733F6 /* PhoneGap.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = PhoneGap.framework; path = /Users/Shared/PhoneGap/Frameworks/PhoneGap.framework; sourceTree = ""; }; + CB533DB814DABDA600C733F6 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = Resources/en.lproj/Localizable.strings; sourceTree = ""; }; + CB533DBF14DABDA600C733F6 /* icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = icon.png; path = Resources/icons/icon.png; sourceTree = ""; }; + CB533DC114DABDA600C733F6 /* icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon@2x.png"; path = "Resources/icons/icon@2x.png"; sourceTree = ""; }; + CB533DC314DABDA600C733F6 /* icon-72.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "icon-72.png"; path = "Resources/icons/icon-72.png"; sourceTree = ""; }; + CB533DC614DABDA600C733F6 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/splash/Default.png; sourceTree = ""; }; + CB533DC814DABDA600C733F6 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "Resources/splash/Default@2x.png"; sourceTree = ""; }; + CB533DCC14DABDA600C733F6 /* PhoneGap.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = PhoneGap.plist; sourceTree = ""; }; + CB533DCF14DABDA600C733F6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = Classes/AppDelegate.h; sourceTree = ""; }; + CB533DD014DABDA600C733F6 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = Classes/AppDelegate.m; sourceTree = ""; }; + CB533DD214DABDA600C733F6 /* MainViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MainViewController.h; path = Classes/MainViewController.h; sourceTree = ""; }; + CB533DD314DABDA600C733F6 /* MainViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MainViewController.m; path = Classes/MainViewController.m; sourceTree = ""; }; + CB533DD514DABDA600C733F6 /* MainViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = MainViewController.xib; path = Classes/MainViewController.xib; sourceTree = ""; }; + CBD2B77114FF8E9700FC3A44 /* NativeZip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NativeZip.h; path = Classes/NativeZip.h; sourceTree = ""; }; + CBD2B77214FF8E9700FC3A44 /* NativeZip.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NativeZip.m; path = Classes/NativeZip.m; sourceTree = ""; }; + CBDCA69B1504EAEB00C706C7 /* WebViewCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebViewCache.h; path = Classes/WebViewCache.h; sourceTree = ""; }; + CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WebViewCache.m; path = Classes/WebViewCache.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + CB533D8614DABDA500C733F6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + CB29ECC314FFBC5500CEAEE3 /* libz.dylib in Frameworks */, + CB533D9114DABDA600C733F6 /* Foundation.framework in Frameworks */, + CB533D9314DABDA600C733F6 /* UIKit.framework in Frameworks */, + CB533D9514DABDA600C733F6 /* CoreGraphics.framework in Frameworks */, + CB533D9714DABDA600C733F6 /* AddressBook.framework in Frameworks */, + CB533D9914DABDA600C733F6 /* AddressBookUI.framework in Frameworks */, + CB533D9B14DABDA600C733F6 /* AudioToolbox.framework in Frameworks */, + CB533D9D14DABDA600C733F6 /* AVFoundation.framework in Frameworks */, + CB533D9F14DABDA600C733F6 /* CoreLocation.framework in Frameworks */, + CB533DA114DABDA600C733F6 /* MediaPlayer.framework in Frameworks */, + CB533DA314DABDA600C733F6 /* QuartzCore.framework in Frameworks */, + CB533DA514DABDA600C733F6 /* SystemConfiguration.framework in Frameworks */, + CB533DA714DABDA600C733F6 /* MobileCoreServices.framework in Frameworks */, + CB533DA914DABDA600C733F6 /* CoreMedia.framework in Frameworks */, + CB533DB414DABDA600C733F6 /* PhoneGap.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CB533D8914DABDA500C733F6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + CB533D7E14DABDA500C733F6 = { + isa = PBXGroup; + children = ( + CB29ECC214FFBC5500CEAEE3 /* libz.dylib */, + CB29ECC014FFBC1B00CEAEE3 /* mztools.c */, + CB29ECBE14FFBC0500CEAEE3 /* ioapi.c */, + CB29ECBC14FFBBBB00CEAEE3 /* unzip.c */, + CB36D11714F68F7F0084BECB /* www */, + CB533DAA14DABDA600C733F6 /* WebODF */, + CB533D8F14DABDA500C733F6 /* Frameworks */, + CB533D8D14DABDA500C733F6 /* Products */, + ); + sourceTree = ""; + }; + CB533D8D14DABDA500C733F6 /* Products */ = { + isa = PBXGroup; + children = ( + CB533D8C14DABDA500C733F6 /* KO Viewer.app */, + ); + name = Products; + sourceTree = ""; + }; + CB533D8F14DABDA500C733F6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + CB533D9014DABDA600C733F6 /* Foundation.framework */, + CB533D9214DABDA600C733F6 /* UIKit.framework */, + CB533D9414DABDA600C733F6 /* CoreGraphics.framework */, + CB533D9614DABDA600C733F6 /* AddressBook.framework */, + CB533D9814DABDA600C733F6 /* AddressBookUI.framework */, + CB533D9A14DABDA600C733F6 /* AudioToolbox.framework */, + CB533D9C14DABDA600C733F6 /* AVFoundation.framework */, + CB533D9E14DABDA600C733F6 /* CoreLocation.framework */, + CB533DA014DABDA600C733F6 /* MediaPlayer.framework */, + CB533DA214DABDA600C733F6 /* QuartzCore.framework */, + CB533DA414DABDA600C733F6 /* SystemConfiguration.framework */, + CB533DA614DABDA600C733F6 /* MobileCoreServices.framework */, + CB533DA814DABDA600C733F6 /* CoreMedia.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + CB533DAA14DABDA600C733F6 /* WebODF */ = { + isa = PBXGroup; + children = ( + CB533DB314DABDA600C733F6 /* PhoneGap.framework */, + CB533DB514DABDA600C733F6 /* Resources */, + CB533DCE14DABDA600C733F6 /* Classes */, + CB533DAB14DABDA600C733F6 /* Supporting Files */, + ); + path = WebODF; + sourceTree = ""; + }; + CB533DAB14DABDA600C733F6 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + CB533DAC14DABDA600C733F6 /* WebODF-Info.plist */, + CB533DAD14DABDA600C733F6 /* InfoPlist.strings */, + CB533DB014DABDA600C733F6 /* main.m */, + CB533DB214DABDA600C733F6 /* WebODF-Prefix.pch */, + CB533DCC14DABDA600C733F6 /* PhoneGap.plist */, + CB533DD514DABDA600C733F6 /* MainViewController.xib */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + CB533DB514DABDA600C733F6 /* Resources */ = { + isa = PBXGroup; + children = ( + CB533DB614DABDA600C733F6 /* en.lproj */, + CB533DBE14DABDA600C733F6 /* icons */, + CB533DC514DABDA600C733F6 /* splash */, + ); + name = Resources; + sourceTree = ""; + }; + CB533DB614DABDA600C733F6 /* en.lproj */ = { + isa = PBXGroup; + children = ( + CB533DB714DABDA600C733F6 /* Localizable.strings */, + ); + name = en.lproj; + sourceTree = ""; + }; + CB533DBE14DABDA600C733F6 /* icons */ = { + isa = PBXGroup; + children = ( + CB533DBF14DABDA600C733F6 /* icon.png */, + CB533DC114DABDA600C733F6 /* icon@2x.png */, + CB533DC314DABDA600C733F6 /* icon-72.png */, + ); + name = icons; + sourceTree = ""; + }; + CB533DC514DABDA600C733F6 /* splash */ = { + isa = PBXGroup; + children = ( + CB099EC814DAC53D000D7B99 /* Default-Landscape~ipad.png */, + CB099EC614DAC535000D7B99 /* Default-Portrait~ipad.png */, + CB533DC614DABDA600C733F6 /* Default.png */, + CB533DC814DABDA600C733F6 /* Default@2x.png */, + ); + name = splash; + sourceTree = ""; + }; + CB533DCE14DABDA600C733F6 /* Classes */ = { + isa = PBXGroup; + children = ( + CBDCA69B1504EAEB00C706C7 /* WebViewCache.h */, + CBDCA69C1504EAEB00C706C7 /* WebViewCache.m */, + CB533DCF14DABDA600C733F6 /* AppDelegate.h */, + CB533DD014DABDA600C733F6 /* AppDelegate.m */, + CB533DD214DABDA600C733F6 /* MainViewController.h */, + CB533DD314DABDA600C733F6 /* MainViewController.m */, + CBD2B77114FF8E9700FC3A44 /* NativeZip.h */, + CBD2B77214FF8E9700FC3A44 /* NativeZip.m */, + ); + name = Classes; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + CB533D8B14DABDA500C733F6 /* KO Viewer */ = { + isa = PBXNativeTarget; + buildConfigurationList = CB533DDB14DABDA600C733F6 /* Build configuration list for PBXNativeTarget "KO Viewer" */; + buildPhases = ( + CB533D8514DABDA500C733F6 /* Sources */, + CB533D8614DABDA500C733F6 /* Frameworks */, + CB533D8714DABDA500C733F6 /* Resources */, + CB533D8814DABDA500C733F6 /* Sources */, + CB533D8914DABDA500C733F6 /* Frameworks */, + CB533D8A14DABDA500C733F6 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "KO Viewer"; + productName = WebODF; + productReference = CB533D8C14DABDA500C733F6 /* KO Viewer.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + CB533D8014DABDA500C733F6 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0420; + }; + buildConfigurationList = CB533D8314DABDA500C733F6 /* Build configuration list for PBXProject "WebODF" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + es, + ); + mainGroup = CB533D7E14DABDA500C733F6; + productRefGroup = CB533D8D14DABDA500C733F6 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + CB533D8B14DABDA500C733F6 /* KO Viewer */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + CB533D8714DABDA500C733F6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CB533DAF14DABDA600C733F6 /* InfoPlist.strings in Resources */, + CB533DB914DABDA600C733F6 /* Localizable.strings in Resources */, + CB533DC014DABDA600C733F6 /* icon.png in Resources */, + CB533DC214DABDA600C733F6 /* icon@2x.png in Resources */, + CB533DC414DABDA600C733F6 /* icon-72.png in Resources */, + CB533DC714DABDA600C733F6 /* Default.png in Resources */, + CB533DC914DABDA600C733F6 /* Default@2x.png in Resources */, + CB533DCD14DABDA600C733F6 /* PhoneGap.plist in Resources */, + CB533DD614DABDA600C733F6 /* MainViewController.xib in Resources */, + CB099EC714DAC535000D7B99 /* Default-Portrait~ipad.png in Resources */, + CB099EC914DAC53D000D7B99 /* Default-Landscape~ipad.png in Resources */, + CB36D11814F68F7F0084BECB /* www in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + CB533D8A14DABDA500C733F6 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "rsync -a ../touchui/app/ www/app/\ncp ../../webodf/webodf.css www/\ncp ../touchui/sencha-touch.* www/\ncp ../touchui/Zoom*.png www/\nif [ ! -e www/webodf.js ]; then\n # webodf.js should be built\n if [ ! -e build ]; then mkdir build; fi\n cd build\n cmake -G Xcode ../../.. && make && cp webodf/webodf.js ..\n if [ ! -e webodf.js ]; then\n echo \"put webodf.js in the ios/www directory\"\n exit 1;\n fi\nfi\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + CB533D8514DABDA500C733F6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + CB533DB114DABDA600C733F6 /* main.m in Sources */, + CB533DD114DABDA600C733F6 /* AppDelegate.m in Sources */, + CB533DD414DABDA600C733F6 /* MainViewController.m in Sources */, + CBD2B77314FF8E9700FC3A44 /* NativeZip.m in Sources */, + CB29ECBD14FFBBBB00CEAEE3 /* unzip.c in Sources */, + CB29ECBF14FFBC0500CEAEE3 /* ioapi.c in Sources */, + CB29ECC114FFBC1B00CEAEE3 /* mztools.c in Sources */, + CBDCA69D1504EAEB00C706C7 /* WebViewCache.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + CB533D8814DABDA500C733F6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + CB533DAD14DABDA600C733F6 /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + CB533DAE14DABDA600C733F6 /* en */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; + CB533DB714DABDA600C733F6 /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + CB533DB814DABDA600C733F6 /* en */, + ); + name = Localizable.strings; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + CB533DD914DABDA600C733F6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + }; + name = Debug; + }; + CB533DDA14DABDA600C733F6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ARCHS = "$(ARCHS_STANDARD_32_BIT)"; + CLANG_ENABLE_OBJC_ARC = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_VERSION = com.apple.compilers.llvmgcc42; + GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 3.0; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + CB533DDC14DABDA600C733F6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + CODE_SIGN_IDENTITY = "iPhone Developer: Jos van den Oever (GJ9RDPR233)"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "WebODF/WebODF-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + INFOPLIST_FILE = "WebODF/WebODF-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "8A253628-DC77-4EEA-8543-53315AA93987"; + TARGETED_DEVICE_FAMILY = "1,2"; + WRAPPER_EXTENSION = app; + }; + name = Debug; + }; + CB533DDD14DABDA600C733F6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = YES; + ARCHS = ( + armv6, + "$(ARCHS_STANDARD_32_BIT)", + ); + CODE_SIGN_IDENTITY = "iPhone Developer: Jos van den Oever (GJ9RDPR233)"; + COPY_PHASE_STRIP = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + FRAMEWORK_SEARCH_PATHS = /Users/Shared/PhoneGap/Frameworks; + GCC_PRECOMPILE_PREFIX_HEADER = YES; + GCC_PREFIX_HEADER = "WebODF/WebODF-Prefix.pch"; + GCC_PREPROCESSOR_DEFINITIONS = "PHONEGAP_FRAMEWORK=YES"; + GCC_VERSION = com.apple.compilers.llvm.clang.1_0; + INFOPLIST_FILE = "WebODF/WebODF-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 5.0; + OTHER_LDFLAGS = ( + "-weak_framework", + UIKit, + "-weak_framework", + AVFoundation, + "-weak_framework", + CoreMedia, + "-weak_library", + /usr/lib/libSystem.B.dylib, + ); + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = "8A253628-DC77-4EEA-8543-53315AA93987"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + WRAPPER_EXTENSION = app; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + CB533D8314DABDA500C733F6 /* Build configuration list for PBXProject "WebODF" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB533DD914DABDA600C733F6 /* Debug */, + CB533DDA14DABDA600C733F6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + CB533DDB14DABDA600C733F6 /* Build configuration list for PBXNativeTarget "KO Viewer" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + CB533DDC14DABDA600C733F6 /* Debug */, + CB533DDD14DABDA600C733F6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = CB533D8014DABDA500C733F6 /* Project object */; +} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.h new file mode 100644 index 0000000000..e2e93b0d9e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.h @@ -0,0 +1,52 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF 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. + */ + +// +// AppDelegate.h +// WebODF +// +// Created by KO GmbH on 2/2/12. +// Copyright __MyCompanyName__ 2012. All rights reserved. +// + +#import + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGViewController.h" +#endif + + +@interface AppDelegate : NSObject < UIApplicationDelegate, UIWebViewDelegate, PGCommandDelegate > { + + NSString* invokeString; +} + +// invoke string is passed to your app on launch, this is only valid if you +// edit FooBar.plist to add a protocol +// a simple tutorial can be found here : +// http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html + +@property (nonatomic, copy) NSString* invokeString; +@property (nonatomic, retain) IBOutlet UIWindow* window; +@property (nonatomic, retain) IBOutlet PGViewController* viewController; + +@end + diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.m new file mode 100644 index 0000000000..6845e95349 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/AppDelegate.m @@ -0,0 +1,202 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF 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. + */ + +// +// AppDelegate.m +// WebODF +// +// Created by KO GmbH on 2/2/12. +// Copyright __MyCompanyName__ 2012. All rights reserved. +// + +#import "AppDelegate.h" +#import "MainViewController.h" + +#ifdef PHONEGAP_FRAMEWORK + #import + #import +#else + #import "PGPlugin.h" + #import "PGURLProtocol.h" +#endif +#import "WebViewCache.h" + + +@implementation AppDelegate + +@synthesize invokeString, window, viewController; + +- (id) init +{ + /** If you need to do any extra app-specific initialization, you can do it here + * -jm + **/ + NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; + [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; + + [PGURLProtocol registerPGHttpURLProtocol]; + + return [super init]; +} + +#pragma UIApplicationDelegate implementation + +/** + * This is main kick off after the app inits, the views and Settings are setup here. (preferred - iOS4 and up) + */ +- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions +{ + NSURL* url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]; + if (url && [url isKindOfClass:[NSURL class]]) { + self.invokeString = [url absoluteString]; + NSLog(@"WebODF launchOptions = %@", url); + } + + CGRect screenBounds = [[UIScreen mainScreen] bounds]; + self.window = [[UIWindow alloc] initWithFrame:screenBounds]; + self.window.autoresizesSubviews = YES; + + CGRect viewBounds = [[UIScreen mainScreen] applicationFrame]; + + self.viewController = [[MainViewController alloc] init]; + self.viewController.useSplashScreen = YES; + self.viewController.wwwFolderName = @"www"; + self.viewController.startPage = @"index.html"; + self.viewController.view.frame = viewBounds; + + // over-ride delegates + self.viewController.webView.delegate = self; + self.viewController.commandDelegate = self; + + // check whether the current orientation is supported: if it is, keep it, rather than forcing a rotation + BOOL forceStartupRotation = YES; + UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation]; + + if (UIDeviceOrientationUnknown == curDevOrientation) { + // UIDevice isn't firing orientation notifications yet… go look at the status bar + curDevOrientation = (UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation]; + } + + if (UIDeviceOrientationIsValidInterfaceOrientation(curDevOrientation)) { + for (NSNumber *orient in self.viewController.supportedOrientations) { + if ([orient intValue] == curDevOrientation) { + forceStartupRotation = NO; + break; + } + } + } + + if (forceStartupRotation) { + NSLog(@"supportedOrientations: %@", self.viewController.supportedOrientations); + // The first item in the supportedOrientations array is the start orientation (guaranteed to be at least Portrait) + UIInterfaceOrientation newOrient = [[self.viewController.supportedOrientations objectAtIndex:0] intValue]; + NSLog(@"AppDelegate forcing status bar to: %d from: %d", newOrient, curDevOrientation); + [[UIApplication sharedApplication] setStatusBarOrientation:newOrient]; + } + + [self.window addSubview:self.viewController.view]; + [self.window makeKeyAndVisible]; + + + NSString *path = @"./cache"; + NSUInteger discCapacity = 1*1024*1024; + NSUInteger memoryCapacity = 0*1024*1024; + + WebViewCache *cache = + [[WebViewCache alloc] initWithMemoryCapacity: memoryCapacity + diskCapacity: discCapacity diskPath:path]; + [NSURLCache setSharedURLCache:cache]; + + + return YES; +} + +// this happens while we are running ( in the background, or from within our own app ) +// only valid if FooBar.plist specifies a protocol to handle +- (BOOL) application:(UIApplication*)application handleOpenURL:(NSURL*)url +{ + if (!url) { + return NO; + } + + // calls into javascript global function 'handleOpenURL' + NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", url]; + [self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString]; + + // all plugins will get the notification, and their handlers will be called + [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:PGPluginHandleOpenURLNotification object:url]]; + + return YES; +} + +#pragma PGCommandDelegate implementation + +- (id) getCommandInstance:(NSString*)className +{ + return [self.viewController getCommandInstance:className]; +} + +- (BOOL) execute:(InvokedUrlCommand*)command +{ + return [self.viewController execute:command]; +} + +- (NSString*) pathForResource:(NSString*)resourcepath; +{ + return [self.viewController pathForResource:resourcepath]; +} + +#pragma UIWebDelegate implementation + +- (void) webViewDidFinishLoad:(UIWebView*) theWebView +{ + // only valid if FooBar.plist specifies a protocol to handle + if (self.invokeString) + { + // this is passed before the deviceready event is fired, so you can access it in js when you receive deviceready + NSString* jsString = [NSString stringWithFormat:@"var invokeString = \"%@\";", self.invokeString]; + [theWebView stringByEvaluatingJavaScriptFromString:jsString]; + } + + // Black base color for background matches the native apps + theWebView.backgroundColor = [UIColor blackColor]; + + return [self.viewController webViewDidFinishLoad:theWebView]; +} + +- (void) webViewDidStartLoad:(UIWebView*)theWebView +{ + return [self.viewController webViewDidStartLoad:theWebView]; +} + +- (void) webView:(UIWebView*)theWebView didFailLoadWithError:(NSError*)error +{ + return [self.viewController webView:theWebView didFailLoadWithError:error]; +} + +- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType +{ + return [self.viewController webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType]; +} + +- (void) dealloc +{ +} + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.h new file mode 100644 index 0000000000..33ddbc2103 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.h @@ -0,0 +1,17 @@ +// +// MainViewController.h +// FooBar +// +// Created by Shazron Abdullah on 12-01-26. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#ifdef PHONEGAP_FRAMEWORK + #import +#else + #import "PGViewController.h" +#endif + +@interface MainViewController : PGViewController + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.m new file mode 100644 index 0000000000..550e4b25c2 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.m @@ -0,0 +1,47 @@ +// +// MainViewController.m +// WebODF +// +#import "MainViewController.h" + +@implementation MainViewController + +- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil +{ + self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; + if (self) { + // Custom initialization + } + return self; +} + +- (void)didReceiveMemoryWarning +{ + // Releases the view if it doesn't have a superview. + [super didReceiveMemoryWarning]; + + // Release any cached data, images, etc that aren't in use. +} + +#pragma mark - View lifecycle + +- (void)viewDidLoad +{ + [super viewDidLoad]; + // Do any additional setup after loading the view from its nib. +} + +- (void)viewDidUnload +{ + [super viewDidUnload]; + // Release any retained subviews of the main view. + // e.g. self.myOutlet = nil; +} + +- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation +{ + // Return YES for supported orientations + return (interfaceOrientation == UIInterfaceOrientationPortrait); +} + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.xib b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.xib new file mode 100644 index 0000000000..9837f578ca --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/MainViewController.xib @@ -0,0 +1,118 @@ + + + + 1280 + 11C25 + 1919 + 1138.11 + 566.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 916 + + + IBProxyObject + IBUIView + + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + PluginDependencyRecalculationVersion + + + + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + {{0, 20}, {320, 460}} + + + + 3 + MQA + + 2 + + + + IBCocoaTouchFramework + + + + + + + view + + + + 3 + + + + + + 0 + + + + + + 1 + + + + + -1 + + + File's Owner + + + -2 + + + + + + + MainViewController + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + + + 3 + + + + + MainViewController + UIViewController + + IBProjectSource + ./Classes/MainViewController.h + + + + + 0 + IBCocoaTouchFramework + YES + 3 + 916 + + diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.h new file mode 100644 index 0000000000..eb1ff485a7 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.h @@ -0,0 +1,33 @@ +// +// NSData+Base64.h +// base64 +// +// Created by Matt Gallagher on 2009/06/03. +// Copyright 2009 Matt Gallagher. All rights reserved. +// +// Permission is given to use this source code file, free of charge, in any +// project, commercial or otherwise, entirely at your risk, with the condition +// that any redistribution (in part or whole) of source code must retain +// this copyright and permission notice. Attribution in compiled projects is +// appreciated but not required. +// + +#import + +void *NewBase64Decode( + const char *inputBuffer, + size_t length, + size_t *outputLength); + +char *NewBase64Encode( + const void *inputBuffer, + size_t length, + bool separateLines, + size_t *outputLength); + +@interface NSData (Base64) + ++ (NSData *)dataFromBase64String:(NSString *)aString; +- (NSString *)base64EncodedString; + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.m new file mode 100644 index 0000000000..13f828d09c --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NSData+Base64.m @@ -0,0 +1,299 @@ +// +// NSData+Base64.m +// base64 +// +// Created by Matt Gallagher on 2009/06/03. +// Copyright 2009 Matt Gallagher. All rights reserved. +// +// Permission is given to use this source code file, free of charge, in any +// project, commercial or otherwise, entirely at your risk, with the condition +// that any redistribution (in part or whole) of source code must retain +// this copyright and permission notice. Attribution in compiled projects is +// appreciated but not required. +// + +#import "NSData+Base64.h" + +// +// Mapping from 6 bit pattern to ASCII character. +// +static unsigned char base64EncodeLookup[65] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +// +// Definition for "masked-out" areas of the base64DecodeLookup mapping +// +#define xx 65 + +// +// Mapping from ASCII character to 6 bit pattern. +// +static unsigned char base64DecodeLookup[256] = +{ + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx, + xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx, + xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, + xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, +}; + +// +// Fundamental sizes of the binary and base64 encode/decode units in bytes +// +#define BINARY_UNIT_SIZE 3 +#define BASE64_UNIT_SIZE 4 + +// +// NewBase64Decode +// +// Decodes the base64 ASCII string in the inputBuffer to a newly malloced +// output buffer. +// +// inputBuffer - the source ASCII string for the decode +// length - the length of the string or -1 (to specify strlen should be used) +// outputLength - if not-NULL, on output will contain the decoded length +// +// returns the decoded buffer. Must be free'd by caller. Length is given by +// outputLength. +// +void *NewBase64Decode( + const char *inputBuffer, + size_t length, + size_t *outputLength) +{ + if (length == -1) + { + length = strlen(inputBuffer); + } + + size_t outputBufferSize = (length / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE; + unsigned char *outputBuffer = (unsigned char *)malloc(outputBufferSize); + + size_t i = 0; + size_t j = 0; + while (i < length) + { + // + // Accumulate 4 valid characters (ignore everything else) + // + unsigned char accumulated[BASE64_UNIT_SIZE]; + bzero(accumulated, sizeof(unsigned char) * BASE64_UNIT_SIZE); + size_t accumulateIndex = 0; + while (i < length) + { + unsigned char decode = base64DecodeLookup[inputBuffer[i++]]; + if (decode != xx) + { + accumulated[accumulateIndex] = decode; + accumulateIndex++; + + if (accumulateIndex == BASE64_UNIT_SIZE) + { + break; + } + } + } + + // + // Store the 6 bits from each of the 4 characters as 3 bytes + // + outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4); + outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2); + outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3]; + j += accumulateIndex - 1; + } + + if (outputLength) + { + *outputLength = j; + } + return outputBuffer; +} + +// +// NewBase64Decode +// +// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced +// output buffer. +// +// inputBuffer - the source data for the encode +// length - the length of the input in bytes +// separateLines - if zero, no CR/LF characters will be added. Otherwise +// a CR/LF pair will be added every 64 encoded chars. +// outputLength - if not-NULL, on output will contain the encoded length +// (not including terminating 0 char) +// +// returns the encoded buffer. Must be free'd by caller. Length is given by +// outputLength. +// +char *NewBase64Encode( + const void *buffer, + size_t length, + bool separateLines, + size_t *outputLength) +{ + const unsigned char *inputBuffer = (const unsigned char *)buffer; + + #define MAX_NUM_PADDING_CHARS 2 + #define OUTPUT_LINE_LENGTH 64 + #define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE) + #define CR_LF_SIZE 0 + + // + // Byte accurate calculation of final buffer size + // + size_t outputBufferSize = + ((length / BINARY_UNIT_SIZE) + + ((length % BINARY_UNIT_SIZE) ? 1 : 0)) + * BASE64_UNIT_SIZE; + if (separateLines) + { + outputBufferSize += + (outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE; + } + + // + // Include space for a terminating zero + // + outputBufferSize += 1; + + // + // Allocate the output buffer + // + char *outputBuffer = (char *)malloc(outputBufferSize); + if (!outputBuffer) + { + return NULL; + } + + size_t i = 0; + size_t j = 0; + const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length; + size_t lineEnd = lineLength; + + while (true) + { + if (lineEnd > length) + { + lineEnd = length; + } + + for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE) + { + // + // Inner loop: turn 48 bytes into 64 base64 characters + // + outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; + outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) + | ((inputBuffer[i + 1] & 0xF0) >> 4)]; + outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2) + | ((inputBuffer[i + 2] & 0xC0) >> 6)]; + outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F]; + } + + if (lineEnd == length) + { + break; + } + + // + // Add the newline + // + //outputBuffer[j++] = '\r'; + //outputBuffer[j++] = '\n'; + lineEnd += lineLength; + } + + if (i + 1 < length) + { + // + // Handle the single '=' case + // + outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; + outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) + | ((inputBuffer[i + 1] & 0xF0) >> 4)]; + outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2]; + outputBuffer[j++] = '='; + } + else if (i < length) + { + // + // Handle the double '=' case + // + outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; + outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4]; + outputBuffer[j++] = '='; + outputBuffer[j++] = '='; + } + outputBuffer[j] = 0; + + // + // Set the output length and return the buffer + // + if (outputLength) + { + *outputLength = j; + } + return outputBuffer; +} + +@implementation NSData (Base64) + +// +// dataFromBase64String: +// +// Creates an NSData object containing the base64 decoded representation of +// the base64 string 'aString' +// +// Parameters: +// aString - the base64 string to decode +// +// returns the autoreleased NSData representation of the base64 string +// ++ (NSData *)dataFromBase64String:(NSString *)aString +{ + NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding]; + size_t outputLength; + void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength); + NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength]; + free(outputBuffer); + return result; +} + +// +// base64EncodedString +// +// Creates an NSString object that contains the base 64 encoding of the +// receiver's data. Lines are broken at 64 characters long. +// +// returns an autoreleased NSString being the base 64 representation of the +// receiver. +// +- (NSString *)base64EncodedString +{ + size_t outputLength; + char *outputBuffer = + NewBase64Encode([self bytes], [self length], true, &outputLength); + + NSString *result = + [[[NSString alloc] + initWithBytes:outputBuffer + length:outputLength + encoding:NSASCIIStringEncoding] + autorelease]; + free(outputBuffer); + return result; +} + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.h new file mode 100644 index 0000000000..44e296b8cf --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.h @@ -0,0 +1,13 @@ +#import + +@interface NativeZip : PGPlugin { + NSString* callbackID; +} + +@property (nonatomic, copy) NSString* callbackID; + +- (void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +- (void) loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; +- (void) loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; + +@end \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.m new file mode 100644 index 0000000000..d8c241cf0b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/NativeZip.m @@ -0,0 +1,79 @@ +#import "NativeZip.h" +#import "minizip/unzip.h" +#import "NSData+Base64.h" + +@implementation NativeZip +@synthesize callbackID; + +-(void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options +{ + self.callbackID = [arguments objectAtIndex:0]; + NSString *zipPath = [arguments objectAtIndex:1]; + NSString *entryPath = [arguments objectAtIndex:2]; + NSString *mimetype = nil; + if (base64 == TRUE) { + mimetype = [arguments objectAtIndex:3]; + } + + const char* path = [ zipPath cStringUsingEncoding:NSUTF8StringEncoding ]; + unzFile unzipFile = unzOpen(path); + NSString* jsString = nil; + BOOL error = TRUE; + if (!unzipFile) { + jsString = [[NSString alloc] initWithString: @"cannot open file"]; + } else { + path = [ entryPath cStringUsingEncoding:NSUTF8StringEncoding ]; + int r = unzLocateFile(unzipFile, path, 2); + if (r != UNZ_OK) { + jsString = [[NSString alloc] initWithString: @"cannot find entry"]; + } else { + unz_file_info info; + r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0); + if (r != UNZ_OK) { + jsString = [[NSString alloc] initWithString: @"cannot determine size"]; + } else { + r = unzOpenCurrentFile(unzipFile); + if (r != UNZ_OK) { + jsString = [[NSString alloc] initWithString: @"cannot open entry"]; + } else { + char* contents = malloc(info.uncompressed_size); + r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size); + if (r != info.uncompressed_size) { + jsString = [[NSString alloc] initWithString: @"cannot uncompress file"]; + } else { + if (base64) { + NSData* readData = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size]; + jsString = [NSString stringWithFormat:@"data:%@;base64,%@", mimetype, [readData base64EncodedString]]; + } else { + jsString = [[NSString alloc] initWithUTF8String: contents]; + } + } + unzCloseCurrentFile(unzipFile); + free(contents); + error = FALSE; + } + } + } + unzClose(unzipFile); + } + PluginResult* pluginResult = [PluginResult + resultWithStatus:PGCommandStatus_OK + messageAsString: jsString + ]; + if (!error) { + [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]]; + } else { + [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]]; + } +} + +-(void)loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options +{ + [self load:FALSE arguments:arguments withDict:options]; +} +-(void)loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options +{ + [self load:TRUE arguments:arguments withDict:options]; +} + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.h new file mode 100644 index 0000000000..216a0bf2bb --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.h @@ -0,0 +1,15 @@ +// +// WebCache.h +// KO Viewer +// +// Created by Tobias Hintze on 3/5/12. +// Copyright (c) 2012 KO GmbH. All rights reserved. +// + +#import + +@interface WebViewCache : NSURLCache + +- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry; + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.m new file mode 100644 index 0000000000..4de0bb3a0c --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/WebViewCache.m @@ -0,0 +1,72 @@ +// +// WebCache.m +// KO Viewer +// +// Created by Tobias Hintze on 3/5/12. +// Copyright (c) 2012 KO GmbH. All rights reserved. +// + +#import "WebViewCache.h" +#import "minizip/unzip.h" + +@implementation WebViewCache + +- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request +{ + [super removeAllCachedResponses]; + NSURL *url = [request URL]; + if ([url query]) { + NSData *somedata = [self getSomeData:[url path] entry:[url query]]; + NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url + MIMEType:@"text/xml" + expectedContentLength:[somedata length] + textEncodingName:nil]; + NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] + initWithResponse:response data:somedata]; + return cachedResponse; + } + return [super cachedResponseForRequest:request]; +} + +- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry +{ + NSLog(@"get some data: %@ %@", zip, entry); + const char* path = [ zip cStringUsingEncoding:NSUTF8StringEncoding ]; + unzFile unzipFile = unzOpen(path); + NSData *data = nil; + if (!unzipFile) { + NSLog(@"cannot open file %@", zip); + } else { + path = [ entry cStringUsingEncoding:NSUTF8StringEncoding ]; + int r = unzLocateFile(unzipFile, path, 2); + if (r != UNZ_OK) { + NSLog(@"cannot find entry %@", entry); + } else { + unz_file_info info; + r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0); + if (r != UNZ_OK) { + NSLog(@"cannot determine size of %@", entry); + } else { + r = unzOpenCurrentFile(unzipFile); + if (r != UNZ_OK) { + NSLog(@"cannot open entry %@", entry); + } else { + char* contents = malloc(info.uncompressed_size); + r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size); + if (r != info.uncompressed_size) { + NSLog(@"cannot uncompress file %@", entry); + } else { + data = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size]; + NSLog(@"read file entry %li %@", info.uncompressed_size, entry); + } + unzCloseCurrentFile(unzipFile); + free(contents); + } + } + } + unzClose(unzipFile); + } + return data; +} + +@end diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/crypt.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/crypt.h new file mode 100644 index 0000000000..622f4bc2ec --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/crypt.h @@ -0,0 +1,132 @@ +/* crypt.h -- base code for crypt/uncrypt ZIPfile + + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This code is a modified version of crypting code in Infozip distribution + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + + If you don't need crypting in your application, just define symbols + NOCRYPT and NOUNCRYPT. + + This code support the "Traditional PKWARE Encryption". + + The new AES encryption added on Zip format by Winzip (see the page + http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong + Encryption is not supported. +*/ + +#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) + +/*********************************************************************** + * Return the next byte in the pseudo-random sequence + */ +static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) +{ + unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an + * unpredictable manner on 16-bit systems; not a problem + * with any known compiler so far, though */ + + temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; + return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); +} + +/*********************************************************************** + * Update the encryption keys with the next byte of plain text + */ +static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) +{ + (*(pkeys+0)) = CRC32((*(pkeys+0)), c); + (*(pkeys+1)) += (*(pkeys+0)) & 0xff; + (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; + { + register int keyshift = (int)((*(pkeys+1)) >> 24); + (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); + } + return c; +} + + +/*********************************************************************** + * Initialize the encryption keys and the random header according to + * the given password. + */ +static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) +{ + *(pkeys+0) = 305419896L; + *(pkeys+1) = 591751049L; + *(pkeys+2) = 878082192L; + while (*passwd != '\0') { + update_keys(pkeys,pcrc_32_tab,(int)*passwd); + passwd++; + } +} + +#define zdecode(pkeys,pcrc_32_tab,c) \ + (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) + +#define zencode(pkeys,pcrc_32_tab,c,t) \ + (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) + +#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED + +#define RAND_HEAD_LEN 12 + /* "last resort" source for second part of crypt seed pattern */ +# ifndef ZCR_SEED2 +# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ +# endif + +static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) + const char *passwd; /* password string */ + unsigned char *buf; /* where to write header */ + int bufSize; + unsigned long* pkeys; + const unsigned long* pcrc_32_tab; + unsigned long crcForCrypting; +{ + int n; /* index in random header */ + int t; /* temporary */ + int c; /* random byte */ + unsigned char header[RAND_HEAD_LEN-2]; /* random header */ + static unsigned calls = 0; /* ensure different random header each time */ + + if (bufSize> 7) & 0xff; + header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); + } + /* Encrypt random header (last two bytes is high word of crc) */ + init_keys(passwd, pkeys, pcrc_32_tab); + for (n = 0; n < RAND_HEAD_LEN-2; n++) + { + buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); + } + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); + buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); + return n; +} + +#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.c b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.c new file mode 100644 index 0000000000..7f20c182f9 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.c @@ -0,0 +1,177 @@ +/* ioapi.c -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#include +#include +#include + +#include "zlib.h" +#include "ioapi.h" + + + +/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ + +#ifndef SEEK_CUR +#define SEEK_CUR 1 +#endif + +#ifndef SEEK_END +#define SEEK_END 2 +#endif + +#ifndef SEEK_SET +#define SEEK_SET 0 +#endif + +voidpf ZCALLBACK fopen_file_func OF(( + voidpf opaque, + const char* filename, + int mode)); + +uLong ZCALLBACK fread_file_func OF(( + voidpf opaque, + voidpf stream, + void* buf, + uLong size)); + +uLong ZCALLBACK fwrite_file_func OF(( + voidpf opaque, + voidpf stream, + const void* buf, + uLong size)); + +long ZCALLBACK ftell_file_func OF(( + voidpf opaque, + voidpf stream)); + +long ZCALLBACK fseek_file_func OF(( + voidpf opaque, + voidpf stream, + uLong offset, + int origin)); + +int ZCALLBACK fclose_file_func OF(( + voidpf opaque, + voidpf stream)); + +int ZCALLBACK ferror_file_func OF(( + voidpf opaque, + voidpf stream)); + + +voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) + voidpf opaque; + const char* filename; + int mode; +{ + FILE* file = NULL; + const char* mode_fopen = NULL; + if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) + mode_fopen = "rb"; + else + if (mode & ZLIB_FILEFUNC_MODE_EXISTING) + mode_fopen = "r+b"; + else + if (mode & ZLIB_FILEFUNC_MODE_CREATE) + mode_fopen = "wb"; + + if ((filename!=NULL) && (mode_fopen != NULL)) + file = fopen(filename, mode_fopen); + return file; +} + + +uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + + +uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) + voidpf opaque; + voidpf stream; + const void* buf; + uLong size; +{ + uLong ret; + ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); + return ret; +} + +long ZCALLBACK ftell_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + long ret; + ret = ftell((FILE *)stream); + return ret; +} + +long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) + voidpf opaque; + voidpf stream; + uLong offset; + int origin; +{ + int fseek_origin=0; + long ret; + switch (origin) + { + case ZLIB_FILEFUNC_SEEK_CUR : + fseek_origin = SEEK_CUR; + break; + case ZLIB_FILEFUNC_SEEK_END : + fseek_origin = SEEK_END; + break; + case ZLIB_FILEFUNC_SEEK_SET : + fseek_origin = SEEK_SET; + break; + default: return -1; + } + ret = 0; + fseek((FILE *)stream, offset, fseek_origin); + return ret; +} + +int ZCALLBACK fclose_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = fclose((FILE *)stream); + return ret; +} + +int ZCALLBACK ferror_file_func (opaque, stream) + voidpf opaque; + voidpf stream; +{ + int ret; + ret = ferror((FILE *)stream); + return ret; +} + +void fill_fopen_filefunc (pzlib_filefunc_def) + zlib_filefunc_def* pzlib_filefunc_def; +{ + pzlib_filefunc_def->zopen_file = fopen_file_func; + pzlib_filefunc_def->zread_file = fread_file_func; + pzlib_filefunc_def->zwrite_file = fwrite_file_func; + pzlib_filefunc_def->ztell_file = ftell_file_func; + pzlib_filefunc_def->zseek_file = fseek_file_func; + pzlib_filefunc_def->zclose_file = fclose_file_func; + pzlib_filefunc_def->zerror_file = ferror_file_func; + pzlib_filefunc_def->opaque = NULL; +} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.h new file mode 100644 index 0000000000..e73a3b2bd8 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/ioapi.h @@ -0,0 +1,75 @@ +/* ioapi.h -- IO base function header for compress/uncompress .zip + files using zlib + zip or unzip API + + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant +*/ + +#ifndef _ZLIBIOAPI_H +#define _ZLIBIOAPI_H + + +#define ZLIB_FILEFUNC_SEEK_CUR (1) +#define ZLIB_FILEFUNC_SEEK_END (2) +#define ZLIB_FILEFUNC_SEEK_SET (0) + +#define ZLIB_FILEFUNC_MODE_READ (1) +#define ZLIB_FILEFUNC_MODE_WRITE (2) +#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) + +#define ZLIB_FILEFUNC_MODE_EXISTING (4) +#define ZLIB_FILEFUNC_MODE_CREATE (8) + + +#ifndef ZCALLBACK + +#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) +#define ZCALLBACK CALLBACK +#else +#define ZCALLBACK +#endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); +typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); +typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); +typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); +typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); +typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); +typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); + +typedef struct zlib_filefunc_def_s +{ + open_file_func zopen_file; + read_file_func zread_file; + write_file_func zwrite_file; + tell_file_func ztell_file; + seek_file_func zseek_file; + close_file_func zclose_file; + testerror_file_func zerror_file; + voidpf opaque; +} zlib_filefunc_def; + + + +void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); + +#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) +#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) +#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) +#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) +#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) +#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) + + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.c b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.c new file mode 100644 index 0000000000..74e6c75778 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.c @@ -0,0 +1,28 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +/* Code */ +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#define READ_8(adr) ((unsigned char)*(adr)) +#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) +#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) + +#define WRITE_8(buff, n) do { \ + *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ +} while(0) +#define WRITE_16(buff, n) do { \ + WRITE_8((unsigned char*)(buff), n); \ + WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ +} while(0) +#define WRITE_32(buff, n) do { \ + WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ + WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ +} while(0) diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.h new file mode 100644 index 0000000000..82d1597ad7 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/mztools.h @@ -0,0 +1,31 @@ +/* + Additional tools for Minizip + Code: Xavier Roche '2004 + License: Same as ZLIB (www.gzip.org) +*/ + +#ifndef _zip_tools_H +#define _zip_tools_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#include "unzip.h" + +/* Repair a ZIP file (missing central directory) + file: file to recover + fileOut: output file after recovery + fileOutTmp: temporary file name used for recovery +*/ +extern int ZEXPORT unzRepair(const char* file, + const char* fileOut, + const char* fileOutTmp, + uLong* nRecovered, + uLong* bytesRecovered); + +#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.c b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.c new file mode 100644 index 0000000000..81aee6a149 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.c @@ -0,0 +1,1597 @@ +/* unzip.c -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + Read unzip.h for more info +*/ + +/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of +compatibility with older software. The following is from the original crypt.c. Code +woven in by Terry Thorsen 1/2003. +*/ +/* + Copyright (c) 1990-2000 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2000-Apr-09 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, all these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] + + The encryption/decryption parts of this source code (as opposed to the + non-echoing password parts) were originally written in Europe. The + whole source package can be freely distributed, including from the USA. + (Prior to January 2000, re-export from the US was a violation of US law.) + */ + +/* + This encryption code is a direct transcription of the algorithm from + Roger Schlafly, described by Phil Katz in the file appnote.txt. This + file (appnote.txt) is distributed with the PKZIP program (even in the + version without encryption capabilities). + */ + + +#include +#include +#include +#include "zlib.h" +#include "unzip.h" + +#ifdef STDC +# include +# include +# include +#endif +#ifdef NO_ERRNO_H + extern int errno; +#else +# include +#endif + + +#ifndef local +# define local static +#endif +/* compile with -Dlocal if your debugger can't find static symbols */ + + +#ifndef CASESENSITIVITYDEFAULT_NO +# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) +# define CASESENSITIVITYDEFAULT_NO +# endif +#endif + + +#ifndef UNZ_BUFSIZE +#define UNZ_BUFSIZE (16384) +#endif + +#ifndef UNZ_MAXFILENAMEINZIP +#define UNZ_MAXFILENAMEINZIP (256) +#endif + +#ifndef ALLOC +# define ALLOC(size) (malloc(size)) +#endif +#ifndef TRYFREE +# define TRYFREE(p) {if (p) free(p);} +#endif + +#define SIZECENTRALDIRITEM (0x2e) +#define SIZEZIPLOCALHEADER (0x1e) + + + + +const char unz_copyright[] = + " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; + +/* unz_file_info_interntal contain internal info about a file in zipfile*/ +typedef struct unz_file_info_internal_s +{ + uLong offset_curfile;/* relative offset of local header 4 bytes */ +} unz_file_info_internal; + + +/* file_in_zip_read_info_s contain internal information about a file in zipfile, + when reading and decompress it */ +typedef struct +{ + char *read_buffer; /* internal buffer for compressed data */ + z_stream stream; /* zLib stream structure for inflate */ + + uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ + uLong stream_initialised; /* flag set if stream structure is initialised*/ + + uLong offset_local_extrafield;/* offset of the local extra field */ + uInt size_local_extrafield;/* size of the local extra field */ + uLong pos_local_extrafield; /* position in the local extra field in read*/ + + uLong crc32; /* crc32 of all data uncompressed */ + uLong crc32_wait; /* crc32 we must obtain after decompress all */ + uLong rest_read_compressed; /* number of byte to be decompressed */ + uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + uLong compression_method; /* compression method (0==store) */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + int raw; +} file_in_zip_read_info_s; + + +/* unz_s contain internal information about the zipfile +*/ +typedef struct +{ + zlib_filefunc_def z_filefunc; + voidpf filestream; /* io structore of the zipfile */ + unz_global_info gi; /* public global information */ + uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ + uLong num_file; /* number of the current file in the zipfile*/ + uLong pos_in_central_dir; /* pos of the current file in the central dir*/ + uLong current_file_ok; /* flag about the usability of the current file*/ + uLong central_pos; /* position of the beginning of the central dir*/ + + uLong size_central_dir; /* size of the central directory */ + uLong offset_central_dir; /* offset of start of central directory with + respect to the starting disk number */ + + unz_file_info cur_file_info; /* public info about the current file in zip*/ + unz_file_info_internal cur_file_info_internal; /* private info about it*/ + file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current + file if we are decompressing it */ + int encrypted; +# ifndef NOUNCRYPT + unsigned long keys[3]; /* keys defining the pseudo-random sequence */ + const unsigned long* pcrc_32_tab; +# endif +} unz_s; + + +#ifndef NOUNCRYPT +#include "crypt.h" +#endif + +/* =========================================================================== + Read a byte from a gz_stream; update next_in and avail_in. Return EOF + for end of file. + IN assertion: the stream s has been sucessfully opened for reading. +*/ + + +local int unzlocal_getByte OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + int *pi)); + +local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + int *pi; +{ + unsigned char c; + int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); + if (err==1) + { + *pi = (int)c; + return UNZ_OK; + } + else + { + if (ZERROR(*pzlib_filefunc_def,filestream)) + return UNZ_ERRNO; + else + return UNZ_EOF; + } +} + + +/* =========================================================================== + Reads a long in LSB order from the given gz_stream. Sets +*/ +local int unzlocal_getShort OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + +local int unzlocal_getLong OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream, + uLong *pX)); + +local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; + uLong *pX; +{ + uLong x ; + int i; + int err; + + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x = (uLong)i; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<8; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<16; + + if (err==UNZ_OK) + err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); + x += ((uLong)i)<<24; + + if (err==UNZ_OK) + *pX = x; + else + *pX = 0; + return err; +} + + +/* My own strcmpi / strcasecmp */ +local int strcmpcasenosensitive_internal (fileName1,fileName2) + const char* fileName1; + const char* fileName2; +{ + for (;;) + { + char c1=*(fileName1++); + char c2=*(fileName2++); + if ((c1>='a') && (c1<='z')) + c1 -= 0x20; + if ((c2>='a') && (c2<='z')) + c2 -= 0x20; + if (c1=='\0') + return ((c2=='\0') ? 0 : -1); + if (c2=='\0') + return 1; + if (c1c2) + return 1; + } +} + + +#ifdef CASESENSITIVITYDEFAULT_NO +#define CASESENSITIVITYDEFAULTVALUE 2 +#else +#define CASESENSITIVITYDEFAULTVALUE 1 +#endif + +#ifndef STRCMPCASENOSENTIVEFUNCTION +#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal +#endif + +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) + +*/ +extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) + const char* fileName1; + const char* fileName2; + int iCaseSensitivity; +{ + if (iCaseSensitivity==0) + iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; + + if (iCaseSensitivity==1) + return strcmp(fileName1,fileName2); + + return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); +} + +#ifndef BUFREADCOMMENT +#define BUFREADCOMMENT (0x400) +#endif + +/* + Locate the Central directory of a zipfile (at the end, just before + the global comment) +*/ +local uLong unzlocal_SearchCentralDir OF(( + const zlib_filefunc_def* pzlib_filefunc_def, + voidpf filestream)); + +local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) + const zlib_filefunc_def* pzlib_filefunc_def; + voidpf filestream; +{ + unsigned char* buf; + uLong uSizeFile; + uLong uBackRead; + uLong uMaxBack=0xffff; /* maximum size of global comment */ + uLong uPosFound=0; + + if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) + return 0; + + + uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); + + if (uMaxBack>uSizeFile) + uMaxBack = uSizeFile; + + buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); + if (buf==NULL) + return 0; + + uBackRead = 4; + while (uBackReaduMaxBack) + uBackRead = uMaxBack; + else + uBackRead+=BUFREADCOMMENT; + uReadPos = uSizeFile-uBackRead ; + + uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? + (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); + if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) + break; + + if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) + break; + + for (i=(int)uReadSize-3; (i--)>0;) + if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && + ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) + { + uPosFound = uReadPos+i; + break; + } + + if (uPosFound!=0) + break; + } + TRYFREE(buf); + return uPosFound; +} + +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer + "zlib/zlib114.zip". + If the zipfile cannot be opened (file doesn't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ +extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) + const char *path; + zlib_filefunc_def* pzlib_filefunc_def; +{ + unz_s us; + unz_s *s; + uLong central_pos,uL; + + uLong number_disk; /* number of the current dist, used for + spaning ZIP, unsupported, always 0*/ + uLong number_disk_with_CD; /* number the the disk with central dir, used + for spaning ZIP, unsupported, always 0*/ + uLong number_entry_CD; /* total number of entries in + the central dir + (same than number_entry on nospan) */ + + int err=UNZ_OK; + + if (unz_copyright[0]!=' ') + return NULL; + + if (pzlib_filefunc_def==NULL) + fill_fopen_filefunc(&us.z_filefunc); + else + us.z_filefunc = *pzlib_filefunc_def; + + us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, + path, + ZLIB_FILEFUNC_MODE_READ | + ZLIB_FILEFUNC_MODE_EXISTING); + if (us.filestream==NULL) + return NULL; + + central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); + if (central_pos==0) + err=UNZ_ERRNO; + + if (ZSEEK(us.z_filefunc, us.filestream, + central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + /* the signature, already checked */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) + err=UNZ_ERRNO; + + /* number of the disk with the start of the central directory */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir on this disk */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) + err=UNZ_ERRNO; + + /* total number of entries in the central dir */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((number_entry_CD!=us.gi.number_entry) || + (number_disk_with_CD!=0) || + (number_disk!=0)) + err=UNZ_BADZIPFILE; + + /* size of the central directory */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* offset of start of central directory with respect to the + starting disk number */ + if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) + err=UNZ_ERRNO; + + /* zipfile comment length */ + if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) + err=UNZ_ERRNO; + + if ((central_pospfile_in_zip_read!=NULL) + unzCloseCurrentFile(file); + + ZCLOSE(s->z_filefunc, s->filestream); + TRYFREE(s); + return UNZ_OK; +} + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ +extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) + unzFile file; + unz_global_info *pglobal_info; +{ + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + *pglobal_info=s->gi; + return UNZ_OK; +} + + +/* + Translate date/time from Dos format to tm_unz (readable more easilty) +*/ +local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) + uLong ulDosDate; + tm_unz* ptm; +{ + uLong uDate; + uDate = (uLong)(ulDosDate>>16); + ptm->tm_mday = (uInt)(uDate&0x1f) ; + ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; + ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; + + ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); + ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; + ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; +} + +/* + Get Info about the current file in the zipfile, with internal only info +*/ +local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, + unz_file_info *pfile_info, + unz_file_info_internal + *pfile_info_internal, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); + +local int unzlocal_GetCurrentFileInfoInternal (file, + pfile_info, + pfile_info_internal, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + unz_file_info_internal *pfile_info_internal; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + unz_s* s; + unz_file_info file_info; + unz_file_info_internal file_info_internal; + int err=UNZ_OK; + uLong uMagic; + long lSeek=0; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (ZSEEK(s->z_filefunc, s->filestream, + s->pos_in_central_dir+s->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + err=UNZ_ERRNO; + + + /* we check the magic */ + if (err==UNZ_OK) + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x02014b50) + err=UNZ_BADZIPFILE; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) + err=UNZ_ERRNO; + + unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) + err=UNZ_ERRNO; + + lSeek+=file_info.size_filename; + if ((err==UNZ_OK) && (szFileName!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_filename0) && (fileNameBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek -= uSizeRead; + } + + + if ((err==UNZ_OK) && (extraField!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek += file_info.size_file_extra - uSizeRead; + } + else + lSeek+=file_info.size_file_extra; + + + if ((err==UNZ_OK) && (szComment!=NULL)) + { + uLong uSizeRead ; + if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) + lSeek=0; + else + err=UNZ_ERRNO; + if ((file_info.size_file_comment>0) && (commentBufferSize>0)) + if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) + err=UNZ_ERRNO; + lSeek+=file_info.size_file_comment - uSizeRead; + } + else + lSeek+=file_info.size_file_comment; + + if ((err==UNZ_OK) && (pfile_info!=NULL)) + *pfile_info=file_info; + + if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) + *pfile_info_internal=file_info_internal; + + return err; +} + + + +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. +*/ +extern int ZEXPORT unzGetCurrentFileInfo (file, + pfile_info, + szFileName, fileNameBufferSize, + extraField, extraFieldBufferSize, + szComment, commentBufferSize) + unzFile file; + unz_file_info *pfile_info; + char *szFileName; + uLong fileNameBufferSize; + void *extraField; + uLong extraFieldBufferSize; + char *szComment; + uLong commentBufferSize; +{ + return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, + szFileName,fileNameBufferSize, + extraField,extraFieldBufferSize, + szComment,commentBufferSize); +} + +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ +extern int ZEXPORT unzGoToFirstFile (file) + unzFile file; +{ + int err=UNZ_OK; + unz_s* s; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + s->pos_in_central_dir=s->offset_central_dir; + s->num_file=0; + err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ +extern int ZEXPORT unzGoToNextFile (file) + unzFile file; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ + if (s->num_file+1==s->gi.number_entry) + return UNZ_END_OF_LIST_OF_FILE; + + s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + + s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; + s->num_file++; + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} + + +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzipStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ +extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) + unzFile file; + const char *szFileName; + int iCaseSensitivity; +{ + unz_s* s; + int err; + + /* We remember the 'current' position in the file so that we can jump + * back there if we fail. + */ + unz_file_info cur_file_infoSaved; + unz_file_info_internal cur_file_info_internalSaved; + uLong num_fileSaved; + uLong pos_in_central_dirSaved; + + + if (file==NULL) + return UNZ_PARAMERROR; + + if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) + return UNZ_PARAMERROR; + + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + /* Save the current state */ + num_fileSaved = s->num_file; + pos_in_central_dirSaved = s->pos_in_central_dir; + cur_file_infoSaved = s->cur_file_info; + cur_file_info_internalSaved = s->cur_file_info_internal; + + err = unzGoToFirstFile(file); + + while (err == UNZ_OK) + { + char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; + err = unzGetCurrentFileInfo(file,NULL, + szCurrentFileName,sizeof(szCurrentFileName)-1, + NULL,0,NULL,0); + if (err == UNZ_OK) + { + if (unzStringFileNameCompare(szCurrentFileName, + szFileName,iCaseSensitivity)==0) + return UNZ_OK; + err = unzGoToNextFile(file); + } + } + + /* We failed, so restore the state of the 'current file' to where we + * were. + */ + s->num_file = num_fileSaved ; + s->pos_in_central_dir = pos_in_central_dirSaved ; + s->cur_file_info = cur_file_infoSaved; + s->cur_file_info_internal = cur_file_info_internalSaved; + return err; +} + + +/* +/////////////////////////////////////////// +// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) +// I need random access +// +// Further optimization could be realized by adding an ability +// to cache the directory in memory. The goal being a single +// comprehensive file read to put the file I need in a memory. +*/ + +/* +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; // offset in file + uLong num_of_file; // # of file +} unz_file_pos; +*/ + +extern int ZEXPORT unzGetFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_END_OF_LIST_OF_FILE; + + file_pos->pos_in_zip_directory = s->pos_in_central_dir; + file_pos->num_of_file = s->num_file; + + return UNZ_OK; +} + +extern int ZEXPORT unzGoToFilePos(file, file_pos) + unzFile file; + unz_file_pos* file_pos; +{ + unz_s* s; + int err; + + if (file==NULL || file_pos==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + /* jump to the right spot */ + s->pos_in_central_dir = file_pos->pos_in_zip_directory; + s->num_file = file_pos->num_of_file; + + /* set the current file */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + /* return results */ + s->current_file_ok = (err == UNZ_OK); + return err; +} + +/* +// Unzip Helper Functions - should be here? +/////////////////////////////////////////// +*/ + +/* + Read the local header of the current zipfile + Check the coherency of the local header and info in the end of central + directory about this file + store in *piSizeVar the size of extra info in local header + (filename and size of extra field data) +*/ +local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, + poffset_local_extrafield, + psize_local_extrafield) + unz_s* s; + uInt* piSizeVar; + uLong *poffset_local_extrafield; + uInt *psize_local_extrafield; +{ + uLong uMagic,uData,uFlags; + uLong size_filename; + uLong size_extra_field; + int err=UNZ_OK; + + *piSizeVar = 0; + *poffset_local_extrafield = 0; + *psize_local_extrafield = 0; + + if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + + s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + + if (err==UNZ_OK) + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) + err=UNZ_ERRNO; + else if (uMagic!=0x04034b50) + err=UNZ_BADZIPFILE; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; +/* + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) + err=UNZ_BADZIPFILE; +*/ + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) + err=UNZ_ERRNO; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) + err=UNZ_BADZIPFILE; + + if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ + err=UNZ_ERRNO; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && + ((uFlags & 8)==0)) + err=UNZ_BADZIPFILE; + + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) + err=UNZ_ERRNO; + else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) + err=UNZ_BADZIPFILE; + + *piSizeVar += (uInt)size_filename; + + if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) + err=UNZ_ERRNO; + *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + + SIZEZIPLOCALHEADER + size_filename; + *psize_local_extrafield = (uInt)size_extra_field; + + *piSizeVar += (uInt)size_extra_field; + + return err; +} + +/* + Open for reading data the current file in the zipfile. + If there is no error and the file is opened, the return value is UNZ_OK. +*/ +extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) + unzFile file; + int* method; + int* level; + int raw; + const char* password; +{ + int err=UNZ_OK; + uInt iSizeVar; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uLong offset_local_extrafield; /* offset of the local extra field */ + uInt size_local_extrafield; /* size of the local extra field */ +# ifndef NOUNCRYPT + char source[12]; +# else + if (password != NULL) + return UNZ_PARAMERROR; +# endif + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return UNZ_PARAMERROR; + + if (s->pfile_in_zip_read != NULL) + unzCloseCurrentFile(file); + + if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, + &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) + return UNZ_BADZIPFILE; + + pfile_in_zip_read_info = (file_in_zip_read_info_s*) + ALLOC(sizeof(file_in_zip_read_info_s)); + if (pfile_in_zip_read_info==NULL) + return UNZ_INTERNALERROR; + + pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); + pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; + pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; + pfile_in_zip_read_info->pos_local_extrafield=0; + pfile_in_zip_read_info->raw=raw; + + if (pfile_in_zip_read_info->read_buffer==NULL) + { + TRYFREE(pfile_in_zip_read_info); + return UNZ_INTERNALERROR; + } + + pfile_in_zip_read_info->stream_initialised=0; + + if (method!=NULL) + *method = (int)s->cur_file_info.compression_method; + + if (level!=NULL) + { + *level = 6; + switch (s->cur_file_info.flag & 0x06) + { + case 6 : *level = 1; break; + case 4 : *level = 2; break; + case 2 : *level = 9; break; + } + } + + if ((s->cur_file_info.compression_method!=0) && + (s->cur_file_info.compression_method!=Z_DEFLATED)) + err=UNZ_BADZIPFILE; + + pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; + pfile_in_zip_read_info->crc32=0; + pfile_in_zip_read_info->compression_method = + s->cur_file_info.compression_method; + pfile_in_zip_read_info->filestream=s->filestream; + pfile_in_zip_read_info->z_filefunc=s->z_filefunc; + pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; + + pfile_in_zip_read_info->stream.total_out = 0; + + if ((s->cur_file_info.compression_method==Z_DEFLATED) && + (!raw)) + { + pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; + pfile_in_zip_read_info->stream.zfree = (free_func)0; + pfile_in_zip_read_info->stream.opaque = (voidpf)0; + pfile_in_zip_read_info->stream.next_in = (voidpf)0; + pfile_in_zip_read_info->stream.avail_in = 0; + + err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); + if (err == Z_OK) + pfile_in_zip_read_info->stream_initialised=1; + else + { + TRYFREE(pfile_in_zip_read_info); + return err; + } + /* windowBits is passed < 0 to tell that there is no zlib header. + * Note that in this case inflate *requires* an extra "dummy" byte + * after the compressed stream in order to complete decompression and + * return Z_STREAM_END. + * In unzip, i don't wait absolutely Z_STREAM_END because I known the + * size of both compressed and uncompressed data + */ + } + pfile_in_zip_read_info->rest_read_compressed = + s->cur_file_info.compressed_size ; + pfile_in_zip_read_info->rest_read_uncompressed = + s->cur_file_info.uncompressed_size ; + + + pfile_in_zip_read_info->pos_in_zipfile = + s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + + iSizeVar; + + pfile_in_zip_read_info->stream.avail_in = (uInt)0; + + s->pfile_in_zip_read = pfile_in_zip_read_info; + +# ifndef NOUNCRYPT + if (password != NULL) + { + int i; + s->pcrc_32_tab = get_crc_table(); + init_keys(password,s->keys,s->pcrc_32_tab); + if (ZSEEK(s->z_filefunc, s->filestream, + s->pfile_in_zip_read->pos_in_zipfile + + s->pfile_in_zip_read->byte_before_the_zipfile, + SEEK_SET)!=0) + return UNZ_INTERNALERROR; + if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) + return UNZ_INTERNALERROR; + + for (i = 0; i<12; i++) + zdecode(s->keys,s->pcrc_32_tab,source[i]); + + s->pfile_in_zip_read->pos_in_zipfile+=12; + s->encrypted=1; + } +# endif + + + return UNZ_OK; +} + +extern int ZEXPORT unzOpenCurrentFile (file) + unzFile file; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); +} + +extern int ZEXPORT unzOpenCurrentFilePassword (file, password) + unzFile file; + const char* password; +{ + return unzOpenCurrentFile3(file, NULL, NULL, 0, password); +} + +extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) + unzFile file; + int* method; + int* level; + int raw; +{ + return unzOpenCurrentFile3(file, method, level, raw, NULL); +} + +/* + Read bytes from the current file. + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ +extern int ZEXPORT unzReadCurrentFile (file, buf, len) + unzFile file; + voidp buf; + unsigned len; +{ + int err=UNZ_OK; + uInt iRead = 0; + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if (pfile_in_zip_read_info->read_buffer == NULL) + return UNZ_END_OF_LIST_OF_FILE; + if (len==0) + return 0; + + pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; + + pfile_in_zip_read_info->stream.avail_out = (uInt)len; + + if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && + (!(pfile_in_zip_read_info->raw))) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_uncompressed; + + if ((len>pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in) && + (pfile_in_zip_read_info->raw)) + pfile_in_zip_read_info->stream.avail_out = + (uInt)pfile_in_zip_read_info->rest_read_compressed+ + pfile_in_zip_read_info->stream.avail_in; + + while (pfile_in_zip_read_info->stream.avail_out>0) + { + if ((pfile_in_zip_read_info->stream.avail_in==0) && + (pfile_in_zip_read_info->rest_read_compressed>0)) + { + uInt uReadThis = UNZ_BUFSIZE; + if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; + if (uReadThis == 0) + return UNZ_EOF; + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->pos_in_zipfile + + pfile_in_zip_read_info->byte_before_the_zipfile, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->read_buffer, + uReadThis)!=uReadThis) + return UNZ_ERRNO; + + +# ifndef NOUNCRYPT + if(s->encrypted) + { + uInt i; + for(i=0;iread_buffer[i] = + zdecode(s->keys,s->pcrc_32_tab, + pfile_in_zip_read_info->read_buffer[i]); + } +# endif + + + pfile_in_zip_read_info->pos_in_zipfile += uReadThis; + + pfile_in_zip_read_info->rest_read_compressed-=uReadThis; + + pfile_in_zip_read_info->stream.next_in = + (Bytef*)pfile_in_zip_read_info->read_buffer; + pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; + } + + if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) + { + uInt uDoCopy,i ; + + if ((pfile_in_zip_read_info->stream.avail_in == 0) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + return (iRead==0) ? UNZ_EOF : iRead; + + if (pfile_in_zip_read_info->stream.avail_out < + pfile_in_zip_read_info->stream.avail_in) + uDoCopy = pfile_in_zip_read_info->stream.avail_out ; + else + uDoCopy = pfile_in_zip_read_info->stream.avail_in ; + + for (i=0;istream.next_out+i) = + *(pfile_in_zip_read_info->stream.next_in+i); + + pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, + pfile_in_zip_read_info->stream.next_out, + uDoCopy); + pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; + pfile_in_zip_read_info->stream.avail_in -= uDoCopy; + pfile_in_zip_read_info->stream.avail_out -= uDoCopy; + pfile_in_zip_read_info->stream.next_out += uDoCopy; + pfile_in_zip_read_info->stream.next_in += uDoCopy; + pfile_in_zip_read_info->stream.total_out += uDoCopy; + iRead += uDoCopy; + } + else + { + uLong uTotalOutBefore,uTotalOutAfter; + const Bytef *bufBefore; + uLong uOutThis; + int flush=Z_SYNC_FLUSH; + + uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; + bufBefore = pfile_in_zip_read_info->stream.next_out; + + /* + if ((pfile_in_zip_read_info->rest_read_uncompressed == + pfile_in_zip_read_info->stream.avail_out) && + (pfile_in_zip_read_info->rest_read_compressed == 0)) + flush = Z_FINISH; + */ + err=inflate(&pfile_in_zip_read_info->stream,flush); + + if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) + err = Z_DATA_ERROR; + + uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; + uOutThis = uTotalOutAfter-uTotalOutBefore; + + pfile_in_zip_read_info->crc32 = + crc32(pfile_in_zip_read_info->crc32,bufBefore, + (uInt)(uOutThis)); + + pfile_in_zip_read_info->rest_read_uncompressed -= + uOutThis; + + iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); + + if (err==Z_STREAM_END) + return (iRead==0) ? UNZ_EOF : iRead; + if (err!=Z_OK) + break; + } + } + + if (err==Z_OK) + return iRead; + return err; +} + + +/* + Give the current position in uncompressed data +*/ +extern z_off_t ZEXPORT unztell (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + return (z_off_t)pfile_in_zip_read_info->stream.total_out; +} + + +/* + return 1 if the end of file was reached, 0 elsewhere +*/ +extern int ZEXPORT unzeof (file) + unzFile file; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + if (pfile_in_zip_read_info->rest_read_uncompressed == 0) + return 1; + else + return 0; +} + + + +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field that can be read + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ +extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) + unzFile file; + voidp buf; + unsigned len; +{ + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + uInt read_now; + uLong size_to_read; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + size_to_read = (pfile_in_zip_read_info->size_local_extrafield - + pfile_in_zip_read_info->pos_local_extrafield); + + if (buf==NULL) + return (int)size_to_read; + + if (len>size_to_read) + read_now = (uInt)size_to_read; + else + read_now = (uInt)len ; + + if (read_now==0) + return 0; + + if (ZSEEK(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + pfile_in_zip_read_info->offset_local_extrafield + + pfile_in_zip_read_info->pos_local_extrafield, + ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (ZREAD(pfile_in_zip_read_info->z_filefunc, + pfile_in_zip_read_info->filestream, + buf,read_now)!=read_now) + return UNZ_ERRNO; + + return (int)read_now; +} + +/* + Close the file in zip opened with unzipOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ +extern int ZEXPORT unzCloseCurrentFile (file) + unzFile file; +{ + int err=UNZ_OK; + + unz_s* s; + file_in_zip_read_info_s* pfile_in_zip_read_info; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + pfile_in_zip_read_info=s->pfile_in_zip_read; + + if (pfile_in_zip_read_info==NULL) + return UNZ_PARAMERROR; + + + if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && + (!pfile_in_zip_read_info->raw)) + { + if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) + err=UNZ_CRCERROR; + } + + + TRYFREE(pfile_in_zip_read_info->read_buffer); + pfile_in_zip_read_info->read_buffer = NULL; + if (pfile_in_zip_read_info->stream_initialised) + inflateEnd(&pfile_in_zip_read_info->stream); + + pfile_in_zip_read_info->stream_initialised = 0; + TRYFREE(pfile_in_zip_read_info); + + s->pfile_in_zip_read=NULL; + + return err; +} + + +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ +extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) + unzFile file; + char *szComment; + uLong uSizeBuf; +{ + unz_s* s; + uLong uReadThis ; + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + uReadThis = uSizeBuf; + if (uReadThis>s->gi.size_comment) + uReadThis = s->gi.size_comment; + + if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) + return UNZ_ERRNO; + + if (uReadThis>0) + { + *szComment='\0'; + if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) + return UNZ_ERRNO; + } + + if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) + *(szComment+s->gi.size_comment)='\0'; + return (int)uReadThis; +} + +/* Additions by RX '2004 */ +extern uLong ZEXPORT unzGetOffset (file) + unzFile file; +{ + unz_s* s; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + if (!s->current_file_ok) + return 0; + if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) + if (s->num_file==s->gi.number_entry) + return 0; + return s->pos_in_central_dir; +} + +extern int ZEXPORT unzSetOffset (file, pos) + unzFile file; + uLong pos; +{ + unz_s* s; + int err; + + if (file==NULL) + return UNZ_PARAMERROR; + s=(unz_s*)file; + + s->pos_in_central_dir = pos; + s->num_file = s->gi.number_entry; /* hack */ + err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, + &s->cur_file_info_internal, + NULL,0,NULL,0,NULL,0); + s->current_file_ok = (err == UNZ_OK); + return err; +} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.h new file mode 100644 index 0000000000..c3206a0589 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/minizip/unzip.h @@ -0,0 +1,354 @@ +/* unzip.h -- IO for uncompress .zip files using zlib + Version 1.01e, February 12th, 2005 + + Copyright (C) 1998-2005 Gilles Vollant + + This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g + WinZip, InfoZip tools and compatible. + + Multi volume ZipFile (span) are not supported. + Encryption compatible with pkzip 2.04g only supported + Old compressions used by old PKZip 1.x are not supported + + + I WAIT FEEDBACK at mail info@winimage.com + Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution + + Condition of use and distribution are the same than zlib : + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +*/ + +/* for more info about .ZIP format, see + http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip + http://www.info-zip.org/pub/infozip/doc/ + PkWare has also a specification at : + ftp://ftp.pkware.com/probdesc.zip +*/ + +#ifndef _unz_H +#define _unz_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef _ZLIB_H +#include "zlib.h" +#endif + +#ifndef _ZLIBIOAPI_H +#include "ioapi.h" +#endif + +#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) +/* like the STRICT of WIN32, we define a pointer that cannot be converted + from (void*) without cast */ +typedef struct TagunzFile__ { int unused; } unzFile__; +typedef unzFile__ *unzFile; +#else +typedef voidp unzFile; +#endif + + +#define UNZ_OK (0) +#define UNZ_END_OF_LIST_OF_FILE (-100) +#define UNZ_ERRNO (Z_ERRNO) +#define UNZ_EOF (0) +#define UNZ_PARAMERROR (-102) +#define UNZ_BADZIPFILE (-103) +#define UNZ_INTERNALERROR (-104) +#define UNZ_CRCERROR (-105) + +/* tm_unz contain date/time info */ +typedef struct tm_unz_s +{ + uInt tm_sec; /* seconds after the minute - [0,59] */ + uInt tm_min; /* minutes after the hour - [0,59] */ + uInt tm_hour; /* hours since midnight - [0,23] */ + uInt tm_mday; /* day of the month - [1,31] */ + uInt tm_mon; /* months since January - [0,11] */ + uInt tm_year; /* years - [1980..2044] */ +} tm_unz; + +/* unz_global_info structure contain global data about the ZIPfile + These data comes from the end of central dir */ +typedef struct unz_global_info_s +{ + uLong number_entry; /* total number of entries in + the central dir on this disk */ + uLong size_comment; /* size of the global comment of the zipfile */ +} unz_global_info; + + +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_info_s +{ + uLong version; /* version made by 2 bytes */ + uLong version_needed; /* version needed to extract 2 bytes */ + uLong flag; /* general purpose bit flag 2 bytes */ + uLong compression_method; /* compression method 2 bytes */ + uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ + uLong crc; /* crc-32 4 bytes */ + uLong compressed_size; /* compressed size 4 bytes */ + uLong uncompressed_size; /* uncompressed size 4 bytes */ + uLong size_filename; /* filename length 2 bytes */ + uLong size_file_extra; /* extra field length 2 bytes */ + uLong size_file_comment; /* file comment length 2 bytes */ + + uLong disk_num_start; /* disk number start 2 bytes */ + uLong internal_fa; /* internal file attributes 2 bytes */ + uLong external_fa; /* external file attributes 4 bytes */ + + tm_unz tmu_date; +} unz_file_info; + +extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, + const char* fileName2, + int iCaseSensitivity)); +/* + Compare two filename (fileName1,fileName2). + If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) + If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi + or strcasecmp) + If iCaseSenisivity = 0, case sensitivity is defaut of your operating system + (like 1 on Unix, 2 on Windows) +*/ + + +extern unzFile ZEXPORT unzOpen OF((const char *path)); +/* + Open a Zip file. path contain the full pathname (by example, + on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer + "zlib/zlib113.zip". + If the zipfile cannot be opened (file don't exist or in not valid), the + return value is NULL. + Else, the return value is a unzFile Handle, usable with other function + of this unzip package. +*/ + +extern unzFile ZEXPORT unzOpen2 OF((const char *path, + zlib_filefunc_def* pzlib_filefunc_def)); +/* + Open a Zip file, like unzOpen, but provide a set of file low level API + for read/write the zip file (see ioapi.h) +*/ + +extern int ZEXPORT unzClose OF((unzFile file)); +/* + Close a ZipFile opened with unzipOpen. + If there is files inside the .Zip opened with unzOpenCurrentFile (see later), + these files MUST be closed with unzipCloseCurrentFile before call unzipClose. + return UNZ_OK if there is no problem. */ + +extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, + unz_global_info *pglobal_info)); +/* + Write info about the ZipFile in the *pglobal_info structure. + No preparation of the structure is needed + return UNZ_OK if there is no problem. */ + + +extern int ZEXPORT unzGetGlobalComment OF((unzFile file, + char *szComment, + uLong uSizeBuf)); +/* + Get the global comment string of the ZipFile, in the szComment buffer. + uSizeBuf is the size of the szComment buffer. + return the number of byte copied or an error code <0 +*/ + + +/***************************************************************************/ +/* Unzip package allow you browse the directory of the zipfile */ + +extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); +/* + Set the current file of the zipfile to the first file. + return UNZ_OK if there is no problem +*/ + +extern int ZEXPORT unzGoToNextFile OF((unzFile file)); +/* + Set the current file of the zipfile to the next file. + return UNZ_OK if there is no problem + return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. +*/ + +extern int ZEXPORT unzLocateFile OF((unzFile file, + const char *szFileName, + int iCaseSensitivity)); +/* + Try locate the file szFileName in the zipfile. + For the iCaseSensitivity signification, see unzStringFileNameCompare + + return value : + UNZ_OK if the file is found. It becomes the current file. + UNZ_END_OF_LIST_OF_FILE if the file is not found +*/ + + +/* ****************************************** */ +/* Ryan supplied functions */ +/* unz_file_info contain information about a file in the zipfile */ +typedef struct unz_file_pos_s +{ + uLong pos_in_zip_directory; /* offset in zip file directory */ + uLong num_of_file; /* # of file */ +} unz_file_pos; + +extern int ZEXPORT unzGetFilePos( + unzFile file, + unz_file_pos* file_pos); + +extern int ZEXPORT unzGoToFilePos( + unzFile file, + unz_file_pos* file_pos); + +/* ****************************************** */ + +extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, + unz_file_info *pfile_info, + char *szFileName, + uLong fileNameBufferSize, + void *extraField, + uLong extraFieldBufferSize, + char *szComment, + uLong commentBufferSize)); +/* + Get Info about the current file + if pfile_info!=NULL, the *pfile_info structure will contain somes info about + the current file + if szFileName!=NULL, the filemane string will be copied in szFileName + (fileNameBufferSize is the size of the buffer) + if extraField!=NULL, the extra field information will be copied in extraField + (extraFieldBufferSize is the size of the buffer). + This is the Central-header version of the extra field + if szComment!=NULL, the comment string of the file will be copied in szComment + (commentBufferSize is the size of the buffer) +*/ + +/***************************************************************************/ +/* for reading the content of the current zipfile, you can open it, read data + from it, and close it (you can close it before reading all the file) + */ + +extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); +/* + Open for reading data the current file in the zipfile. + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, + const char* password)); +/* + Open for reading data the current file in the zipfile. + password is a crypting password + If there is no error, the return value is UNZ_OK. +*/ + +extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, + int* method, + int* level, + int raw)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + +extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, + int* method, + int* level, + int raw, + const char* password)); +/* + Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) + if raw==1 + *method will receive method of compression, *level will receive level of + compression + note : you can set level parameter as NULL (if you did not want known level, + but you CANNOT set method parameter as NULL +*/ + + +extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); +/* + Close the file in zip opened with unzOpenCurrentFile + Return UNZ_CRCERROR if all the file was read but the CRC is not good +*/ + +extern int ZEXPORT unzReadCurrentFile OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read bytes from the current file (opened by unzOpenCurrentFile) + buf contain buffer where data must be copied + len the size of buf. + + return the number of byte copied if somes bytes are copied + return 0 if the end of file was reached + return <0 with error code if there is an error + (UNZ_ERRNO for IO error, or zLib error for uncompress error) +*/ + +extern z_off_t ZEXPORT unztell OF((unzFile file)); +/* + Give the current position in uncompressed data +*/ + +extern int ZEXPORT unzeof OF((unzFile file)); +/* + return 1 if the end of file was reached, 0 elsewhere +*/ + +extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, + voidp buf, + unsigned len)); +/* + Read extra field from the current file (opened by unzOpenCurrentFile) + This is the local-header version of the extra field (sometimes, there is + more info in the local-header version than in the central-header) + + if buf==NULL, it return the size of the local extra field + + if buf!=NULL, len is the size of the buffer, the extra header is copied in + buf. + the return value is the number of bytes copied in buf, or (if <0) + the error code +*/ + +/***************************************************************************/ + +/* Get the current file offset */ +extern uLong ZEXPORT unzGetOffset (unzFile file); + +/* Set the current file offset */ +extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); + + + +#ifdef __cplusplus +} +#endif + +#endif /* _unz_H */ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/zip.h b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/zip.h new file mode 100644 index 0000000000..a4f0716054 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Classes/zip.h @@ -0,0 +1,15 @@ +// +// Header.h +// WebODF +// +// Created by KO GmbH on 3/1/12. +// Copyright (c) 2012 __MyCompanyName__. All rights reserved. +// + +#ifndef WebODF_Header_h +#define WebODF_Header_h + +void readZipEntry(const char* zippath, const char* entrypath) {} + + +#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/PhoneGap.plist b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/PhoneGap.plist new file mode 100644 index 0000000000..29011e6d11 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/PhoneGap.plist @@ -0,0 +1,57 @@ + + + + + TopActivityIndicator + gray + EnableLocation + + EnableViewportScale + + AutoHideSplashScreen + + ShowSplashScreenSpinner + + MediaPlaybackRequiresUserAction + + AllowInlineMediaPlayback + + OpenAllWhitelistURLsInWebView + + ExternalHosts + + zipserver + + Plugins + + ZipClass + NativeZip + com.phonegap.accelerometer + PGAccelerometer + com.phonegap.camera + PGCamera + com.phonegap.connection + PGConnection + com.phonegap.contacts + PGContacts + com.phonegap.debugconsole + PGDebugConsole + com.phonegap.file + PGFile + com.phonegap.filetransfer + PGFileTransfer + com.phonegap.geolocation + PGLocation + com.phonegap.notification + PGNotification + com.phonegap.media + PGSound + com.phonegap.mediacapture + PGCapture + com.phonegap.splashscreen + PGSplashScreen + com.phonegap.battery + PGBattery + + + diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/en.lproj/Localizable.strings b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/en.lproj/Localizable.strings new file mode 100644 index 0000000000..8972684435 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/en.lproj/Localizable.strings @@ -0,0 +1,25 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF 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. + */ + +// accessibility label for recording button +"toggle audio recording" = "toggle audio recording"; +// notification spoken by VoiceOver when timed recording finishes +"timed recording complete" = "timed recording complete"; +// accessibility hint for display of recorded elapsed time +"recorded time in minutes and seconds" = "recorded time in minutes and seconds"; \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon-72.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon-72.png new file mode 100644 index 0000000000..1aebf5d34b Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon-72.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon.png new file mode 100644 index 0000000000..9e654236c0 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon@2x.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon@2x.png new file mode 100644 index 0000000000..b7ccb848e3 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/icons/icon@2x.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png new file mode 100644 index 0000000000..06bb96b394 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png new file mode 100644 index 0000000000..dbfed967af Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default.png new file mode 100755 index 0000000000..fbf06e22d2 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default@2x.png b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default@2x.png new file mode 100755 index 0000000000..e845a3f0b0 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/Resources/splash/Default@2x.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Info.plist b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Info.plist new file mode 100644 index 0000000000..18518ec4c1 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Info.plist @@ -0,0 +1,122 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleDisplayName + ${PRODUCT_NAME} + CFBundleDocumentTypes + + + CFBundleTypeIconFiles + + icon.png + + CFBundleTypeName + OpenDocument Text + CFBundleTypeRole + Viewer + LSHandlerRank + Owner + LSItemContentTypes + + org.oasis.opendocument.text + + + + CFBundleTypeIconFiles + + icon.png + + CFBundleTypeName + OpenDocument Presentation + CFBundleTypeRole + Viewer + LSHandlerRank + Owner + LSItemContentTypes + + org.oasis.opendocument.presentation + + + + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + icon.png + CFBundleIconFiles + + icon.png + icon@2x.png + icon-72.png + + CFBundleIdentifier + WebODF-03 + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + LSRequiresIPhoneOS + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeRight + + UTExportedTypeDeclarations + + + UTTypeConformsTo + + org.gnu.gnu-zip-archive + + UTTypeDescription + OpenDocument Text + UTTypeIdentifier + org.oasis.opendocument.text + UTTypeTagSpecification + + public.filename-extension + odt + public.mime-type + application/vnd.oasis.opendocument.text + + + + UTTypeConformsTo + + org.gnu.gnu-zip-archive + + UTTypeDescription + OpenDocument Presentation + UTTypeIdentifier + org.oasis.opendocument.presentation + UTTypeTagSpecification + + public.filename-extension + odp + public.mime-type + application/vnd.oasis.opendocument.presentation + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Prefix.pch b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Prefix.pch new file mode 100644 index 0000000000..da48b6a1fd --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/WebODF-Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'WebODF' target in the 'WebODF' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/en.lproj/InfoPlist.strings b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/en.lproj/InfoPlist.strings new file mode 100644 index 0000000000..477b28ff8f --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/en.lproj/InfoPlist.strings @@ -0,0 +1,2 @@ +/* Localized versions of Info.plist keys */ + diff --git a/apps/files_odfviewer/src/webodf/programs/ios/WebODF/main.m b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/main.m new file mode 100644 index 0000000000..bda2f99ea3 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/WebODF/main.m @@ -0,0 +1,32 @@ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF 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. + */ +// +// main.m +// WebODF +// +// Created by KO GmbH on 2/2/12. +// Copyright __MyCompanyName__ 2012. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) { + int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); + return retVal; +} diff --git a/apps/files_odfviewer/src/webodf/programs/ios/www/index.html b/apps/files_odfviewer/src/webodf/programs/ios/www/index.html new file mode 100644 index 0000000000..ec998a1005 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/www/index.html @@ -0,0 +1,52 @@ + + + + WebODF + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/ios/www/nativezip.js b/apps/files_odfviewer/src/webodf/programs/ios/www/nativezip.js new file mode 100644 index 0000000000..04a8ff13c7 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/www/nativezip.js @@ -0,0 +1,84 @@ +/*global PhoneGap, core*/ + +var ZipPlugin = { + loadAsString: function (zippath, entrypath, success, fail) { + "use strict"; + return PhoneGap.exec(success, fail, "ZipClass", "loadAsString", [zippath, entrypath]); + }, + loadAsDataURL: function (zippath, entrypath, mimetype, success, fail) { + "use strict"; + return PhoneGap.exec(success, fail, "ZipClass", "loadAsDataURL", [zippath, entrypath, mimetype]); + } +}; +core.Zip = function (url, entriesReadCallback) { + "use strict"; + // remove 'odf:' prefix + url = url.substr(4); + var zip = this; + this.load = function (filename, callback) { + //alert(filename); + callback(null, ""); + }; + this.loadAsString = function (filename, callback) { + alert("loadAsString"); + }; + this.loadAsDOM = function (filename, callback) { + var xhr = new XMLHttpRequest(); + function handleResult() { + var xml; + console.log("loading " + filename + " status " + xhr.status + " readyState " + xhr.readyState); + if (xhr.readyState === 4) { + xml = xhr.responseXML; + console.log("done accessing responseXML " + xml + " " + (xhr.responseText && xhr.responseText.length) + + " " + xhr.statusText); + console.log("statusText " + xhr.statusText); + if (xhr.status === 0 && !xml) { + // empty files are considered as errors + callback("File " + path + " is not valid XML."); + } else if (xhr.status === 200 || xhr.status === 0) { + try { + callback(null, xml); + } catch (e) { + console.log(e); + } + } else { + // report error + callback(xhr.responseText || xhr.statusText); + } + } + } + xhr.open('GET', "http://zipserver" + url + "?" + filename, true); + xhr.onreadystatechange = handleResult; + xhr.send(null); + }; + this.loadAsDataURL = function (filename, mimetype, callback) { + callback(null, "http://zipserver" + url + "?" + filename); + /* + ZipPlugin.loadAsDataURL(url, filename, mimetype, + function (content) { + callback(null, content); + }, + function (err) { callback(err, null); } + ); + */ + }; + this.getEntries = function () { + alert("getEntries"); + }; + this.loadContentXmlAsFragments = function (filename, handler) { + // the javascript implementation simply reads the file + zip.loadAsString(filename, function (err, data) { + if (err) { + return handler.rootElementReady(err); + } + handler.rootElementReady(null, data, true); + }); + }; + this.save = function () { + alert("save"); + }; + this.write = function () { + alert("write"); + }; + entriesReadCallback(null, this); +}; diff --git a/apps/files_odfviewer/src/webodf/programs/ios/www/phonegap-1.4.1.js b/apps/files_odfviewer/src/webodf/programs/ios/www/phonegap-1.4.1.js new file mode 100644 index 0000000000..680e180209 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/ios/www/phonegap-1.4.1.js @@ -0,0 +1,4123 @@ +/* PhoneGap v1.4.1 */ +/* + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF 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. +*/ + + +/* + * Some base contributions + * Copyright (c) 2011, Proyectos Equis Ka, S.L. + */ + +if (typeof PhoneGap === "undefined") { + +if (typeof(DeviceInfo) !== 'object'){ + DeviceInfo = {}; +} +/** + * This represents the PhoneGap API itself, and provides a global namespace for accessing + * information about the state of PhoneGap. + * @class + */ +PhoneGap = { + // This queue holds the currently executing command and all pending + // commands executed with PhoneGap.exec(). + commandQueue: [], + // Indicates if we're currently in the middle of flushing the command + // queue on the native side. + commandQueueFlushing: false, + _constructors: [], + documentEventHandler: {}, // Collection of custom document event handlers + windowEventHandler: {} +}; + +/** + * List of resource files loaded by PhoneGap. + * This is used to ensure JS and other files are loaded only once. + */ +PhoneGap.resources = {base: true}; + +/** + * Determine if resource has been loaded by PhoneGap + * + * @param name + * @return + */ +PhoneGap.hasResource = function(name) { + return PhoneGap.resources[name]; +}; + +/** + * Add a resource to list of loaded resources by PhoneGap + * + * @param name + */ +PhoneGap.addResource = function(name) { + PhoneGap.resources[name] = true; +}; + +/** + * Boolean flag indicating if the PhoneGap API is available and initialized. + */ // TODO: Remove this, it is unused here ... -jm +PhoneGap.available = DeviceInfo.uuid != undefined; + +/** + * Add an initialization function to a queue that ensures it will run and initialize + * application constructors only once PhoneGap has been initialized. + * @param {Function} func The function callback you want run once PhoneGap is initialized + */ +PhoneGap.addConstructor = function(func) { + var state = document.readyState; + if ( ( state == 'loaded' || state == 'complete' ) && DeviceInfo.uuid != null ) + { + func(); + } + else + { + PhoneGap._constructors.push(func); + } +}; + +(function() + { + var timer = setInterval(function() + { + + var state = document.readyState; + + if ( ( state == 'loaded' || state == 'complete' ) && DeviceInfo.uuid != null ) + { + clearInterval(timer); // stop looking + // run our constructors list + while (PhoneGap._constructors.length > 0) + { + var constructor = PhoneGap._constructors.shift(); + try + { + constructor(); + } + catch(e) + { + if (typeof(console['log']) == 'function') + { + console.log("Failed to run constructor: " + console.processMessage(e)); + } + else + { + alert("Failed to run constructor: " + e.message); + } + } + } + // all constructors run, now fire the deviceready event + var e = document.createEvent('Events'); + e.initEvent('deviceready'); + document.dispatchEvent(e); + } + }, 1); +})(); + +// session id for calls +PhoneGap.sessionKey = 0; + +// centralized callbacks +PhoneGap.callbackId = 0; +PhoneGap.callbacks = {}; +PhoneGap.callbackStatus = { + NO_RESULT: 0, + OK: 1, + CLASS_NOT_FOUND_EXCEPTION: 2, + ILLEGAL_ACCESS_EXCEPTION: 3, + INSTANTIATION_EXCEPTION: 4, + MALFORMED_URL_EXCEPTION: 5, + IO_EXCEPTION: 6, + INVALID_ACTION: 7, + JSON_EXCEPTION: 8, + ERROR: 9 + }; + +/** + * Creates a gap bridge iframe used to notify the native code about queued + * commands. + * + * @private + */ +PhoneGap.createGapBridge = function() { + gapBridge = document.createElement("iframe"); + gapBridge.setAttribute("style", "display:none;"); + gapBridge.setAttribute("height","0px"); + gapBridge.setAttribute("width","0px"); + gapBridge.setAttribute("frameborder","0"); + document.documentElement.appendChild(gapBridge); + return gapBridge; +} + +/** + * Execute a PhoneGap command by queuing it and letting the native side know + * there are queued commands. The native side will then request all of the + * queued commands and execute them. + * + * Arguments may be in one of two formats: + * + * FORMAT ONE (preferable) + * The native side will call PhoneGap.callbackSuccess or + * PhoneGap.callbackError, depending upon the result of the action. + * + * @param {Function} success The success callback + * @param {Function} fail The fail callback + * @param {String} service The name of the service to use + * @param {String} action The name of the action to use + * @param {String[]} [args] Zero or more arguments to pass to the method + * + * FORMAT TWO + * @param {String} command Command to be run in PhoneGap, e.g. + * "ClassName.method" + * @param {String[]} [args] Zero or more arguments to pass to the method + * object parameters are passed as an array object + * [object1, object2] each object will be passed as + * JSON strings + */ +PhoneGap.exec = function() { + if (!PhoneGap.available) { + alert("ERROR: Attempting to call PhoneGap.exec()" + +" before 'deviceready'. Ignoring."); + return; + } + + var successCallback, failCallback, service, action, actionArgs; + var callbackId = null; + if (typeof arguments[0] !== "string") { + // FORMAT ONE + successCallback = arguments[0]; + failCallback = arguments[1]; + service = arguments[2]; + action = arguments[3]; + actionArgs = arguments[4]; + + // Since we need to maintain backwards compatibility, we have to pass + // an invalid callbackId even if no callback was provided since plugins + // will be expecting it. The PhoneGap.exec() implementation allocates + // an invalid callbackId and passes it even if no callbacks were given. + callbackId = 'INVALID'; + } else { + // FORMAT TWO + splitCommand = arguments[0].split("."); + action = splitCommand.pop(); + service = splitCommand.join("."); + actionArgs = Array.prototype.splice.call(arguments, 1); + } + + // Start building the command object. + var command = { + className: service, + methodName: action, + arguments: [] + }; + + // Register the callbacks and add the callbackId to the positional + // arguments if given. + if (successCallback || failCallback) { + callbackId = service + PhoneGap.callbackId++; + PhoneGap.callbacks[callbackId] = + {success:successCallback, fail:failCallback}; + } + if (callbackId != null) { + command.arguments.push(callbackId); + } + + for (var i = 0; i < actionArgs.length; ++i) { + var arg = actionArgs[i]; + if (arg == undefined || arg == null) { + continue; + } else if (typeof(arg) == 'object') { + command.options = arg; + } else { + command.arguments.push(arg); + } + } + + // Stringify and queue the command. We stringify to command now to + // effectively clone the command arguments in case they are mutated before + // the command is executed. + PhoneGap.commandQueue.push(JSON.stringify(command)); + + // If the queue length is 1, then that means it was empty before we queued + // the given command, so let the native side know that we have some + // commands to execute, unless the queue is currently being flushed, in + // which case the command will be picked up without notification. + if (PhoneGap.commandQueue.length == 1 && !PhoneGap.commandQueueFlushing) { + if (!PhoneGap.gapBridge) { + PhoneGap.gapBridge = PhoneGap.createGapBridge(); + } + + PhoneGap.gapBridge.src = "gap://ready"; + } +} + +/** + * Called by native code to retrieve all queued commands and clear the queue. + */ +PhoneGap.getAndClearQueuedCommands = function() { + json = JSON.stringify(PhoneGap.commandQueue); + PhoneGap.commandQueue = []; + return json; +} + +/** + * Called by native code when returning successful result from an action. + * + * @param callbackId + * @param args + * args.status - PhoneGap.callbackStatus + * args.message - return value + * args.keepCallback - 0 to remove callback, 1 to keep callback in PhoneGap.callbacks[] + */ +PhoneGap.callbackSuccess = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + + // If result is to be sent to callback + if (args.status == PhoneGap.callbackStatus.OK) { + try { + if (PhoneGap.callbacks[callbackId].success) { + PhoneGap.callbacks[callbackId].success(args.message); + } + } + catch (e) { + console.log("Error in success callback: "+callbackId+" = "+e); + } + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + +/** + * Called by native code when returning error result from an action. + * + * @param callbackId + * @param args + */ +PhoneGap.callbackError = function(callbackId, args) { + if (PhoneGap.callbacks[callbackId]) { + try { + if (PhoneGap.callbacks[callbackId].fail) { + PhoneGap.callbacks[callbackId].fail(args.message); + } + } + catch (e) { + console.log("Error in error callback: "+callbackId+" = "+e); + } + + // Clear callback if not expecting any more results + if (!args.keepCallback) { + delete PhoneGap.callbacks[callbackId]; + } + } +}; + + +/** + * Does a deep clone of the object. + * + * @param obj + * @return + */ +PhoneGap.clone = function(obj) { + if(!obj) { + return obj; + } + + if(obj instanceof Array){ + var retVal = new Array(); + for(var i = 0; i < obj.length; ++i){ + retVal.push(PhoneGap.clone(obj[i])); + } + return retVal; + } + + if (obj instanceof Function) { + return obj; + } + + if(!(obj instanceof Object)){ + return obj; + } + + if (obj instanceof Date) { + return obj; + } + + retVal = new Object(); + for(i in obj){ + if(!(i in retVal) || retVal[i] != obj[i]) { + retVal[i] = PhoneGap.clone(obj[i]); + } + } + return retVal; +}; + +// Intercept calls to document.addEventListener +PhoneGap.m_document_addEventListener = document.addEventListener; + +// Intercept calls to window.addEventListener +PhoneGap.m_window_addEventListener = window.addEventListener; + +/** + * Add a custom window event handler. + * + * @param {String} event The event name that callback handles + * @param {Function} callback The event handler + */ +PhoneGap.addWindowEventHandler = function(event, callback) { + PhoneGap.windowEventHandler[event] = callback; +} + +/** + * Add a custom document event handler. + * + * @param {String} event The event name that callback handles + * @param {Function} callback The event handler + */ +PhoneGap.addDocumentEventHandler = function(event, callback) { + PhoneGap.documentEventHandler[event] = callback; +} + +/** + * Intercept adding document event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +document.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If subscribing to an event that is handled by a plugin + if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { + if (PhoneGap.documentEventHandler[e](e, handler, true)) { + return; // Stop default behavior + } + } + + PhoneGap.m_document_addEventListener.call(document, evt, handler, capture); +}; + +/** + * Intercept adding window event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +window.addEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If subscribing to an event that is handled by a plugin + if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { + if (PhoneGap.windowEventHandler[e](e, handler, true)) { + return; // Stop default behavior + } + } + + PhoneGap.m_window_addEventListener.call(window, evt, handler, capture); +}; + +// Intercept calls to document.removeEventListener and watch for events that +// are generated by PhoneGap native code +PhoneGap.m_document_removeEventListener = document.removeEventListener; + +// Intercept calls to window.removeEventListener +PhoneGap.m_window_removeEventListener = window.removeEventListener; + +/** + * Intercept removing document event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +document.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If unsubcribing from an event that is handled by a plugin + if (typeof PhoneGap.documentEventHandler[e] !== "undefined") { + if (PhoneGap.documentEventHandler[e](e, handler, false)) { + return; // Stop default behavior + } + } + + PhoneGap.m_document_removeEventListener.call(document, evt, handler, capture); +}; + +/** + * Intercept removing window event listeners and handle our own + * + * @param {Object} evt + * @param {Function} handler + * @param capture + */ +window.removeEventListener = function(evt, handler, capture) { + var e = evt.toLowerCase(); + + // If unsubcribing from an event that is handled by a plugin + if (typeof PhoneGap.windowEventHandler[e] !== "undefined") { + if (PhoneGap.windowEventHandler[e](e, handler, false)) { + return; // Stop default behavior + } + } + + PhoneGap.m_window_removeEventListener.call(window, evt, handler, capture); +}; + +/** + * Method to fire document event + * + * @param {String} type The event type to fire + * @param {Object} data Data to send with event + */ +PhoneGap.fireDocumentEvent = function(type, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + document.dispatchEvent(e); +}; + +/** + * Method to fire window event + * + * @param {String} type The event type to fire + * @param {Object} data Data to send with event + */ +PhoneGap.fireWindowEvent = function(type, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + window.dispatchEvent(e); +}; + +/** + * Method to fire event from native code + * Leaving this generic version to handle problems with iOS 3.x. Is currently used by orientation and battery events + * Remove when iOS 3.x no longer supported and call fireWindowEvent or fireDocumentEvent directly + */ +PhoneGap.fireEvent = function(type, target, data) { + var e = document.createEvent('Events'); + e.initEvent(type); + if (data) { + for (var i in data) { + e[i] = data[i]; + } + } + target = target || document; + if (target.dispatchEvent === undefined) { // ie window.dispatchEvent is undefined in iOS 3.x + target = document; + } + + target.dispatchEvent(e); +}; +/** + * Create a UUID + * + * @return + */ +PhoneGap.createUUID = function() { + return PhoneGap.UUIDcreatePart(4) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(2) + '-' + + PhoneGap.UUIDcreatePart(6); +}; + +PhoneGap.UUIDcreatePart = function(length) { + var uuidpart = ""; + for (var i=0; i -1) { + me._batteryListener.splice(pos, 1); + } + } else if (eventType === "batterylow") { + var pos = me._lowListener.indexOf(handler); + if (pos > -1) { + me._lowListener.splice(pos, 1); + } + } else if (eventType === "batterycritical") { + var pos = me._criticalListener.indexOf(handler); + if (pos > -1) { + me._criticalListener.splice(pos, 1); + } + } + + // If there are no more registered event listeners stop the battery listener on native side. + if (me._batteryListener.length === 0 && me._lowListener.length === 0 && me._criticalListener.length === 0) { + PhoneGap.exec(null, null, "com.phonegap.battery", "stop", []); + } + } +}; + +/** + * Callback for battery status + * + * @param {Object} info keys: level, isPlugged + */ +Battery.prototype._status = function(info) { + if (info) { + var me = this; + if (me._level != info.level || me._isPlugged != info.isPlugged) { + // Fire batterystatus event + //PhoneGap.fireWindowEvent("batterystatus", info); + // use this workaround since iOS 3.x does have window.dispatchEvent + PhoneGap.fireEvent("batterystatus", window, info); + + // Fire low battery event + if (info.level == 20 || info.level == 5) { + if (info.level == 20) { + //PhoneGap.fireWindowEvent("batterylow", info); + // use this workaround since iOS 3.x does not have window.dispatchEvent + PhoneGap.fireEvent("batterylow", window, info); + } + else { + //PhoneGap.fireWindowEvent("batterycritical", info); + // use this workaround since iOS 3.x does not have window.dispatchEvent + PhoneGap.fireEvent("batterycritical", window, info); + } + } + } + me._level = info.level; + me._isPlugged = info.isPlugged; + } +}; + +/** + * Error callback for battery start + */ +Battery.prototype._error = function(e) { + console.log("Error initializing Battery: " + e); +}; + +PhoneGap.addConstructor(function() { + if (typeof navigator.battery === "undefined") { + navigator.battery = new Battery(); + PhoneGap.addWindowEventHandler("batterystatus", navigator.battery.eventHandler); + PhoneGap.addWindowEventHandler("batterylow", navigator.battery.eventHandler); + PhoneGap.addWindowEventHandler("batterycritical", navigator.battery.eventHandler); + } +}); +}if (!PhoneGap.hasResource("camera")) { + PhoneGap.addResource("camera"); + + +/** + * This class provides access to the device camera. + * @constructor + */ +Camera = function() { + +} +/** + * Available Camera Options + * {boolean} allowEdit - true to allow editing image, default = false + * {number} quality 0-100 (low to high) default = 100 + * {Camera.DestinationType} destinationType default = DATA_URL + * {Camera.PictureSourceType} sourceType default = CAMERA + * {number} targetWidth - width in pixels to scale image default = 0 (no scaling) + * {number} targetHeight - height in pixels to scale image default = 0 (no scaling) + * {Camera.EncodingType} - encodingType default = JPEG + * {boolean} correctOrientation - Rotate the image to correct for the orientation of the device during capture (iOS only) + * {boolean} saveToPhotoAlbum - Save the image to the photo album on the device after capture (iOS only) + */ +/** + * Format of image that is returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.DestinationType = { + DATA_URL: 0, // Return base64 encoded string + FILE_URI: 1 // Return file uri +}; +Camera.prototype.DestinationType = Camera.DestinationType; + +/** + * Source to getPicture from. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY}) + */ +Camera.PictureSourceType = { + PHOTOLIBRARY : 0, // Choose image from picture library + CAMERA : 1, // Take picture from camera + SAVEDPHOTOALBUM : 2 // Choose image from picture library +}; +Camera.prototype.PictureSourceType = Camera.PictureSourceType; + +/** + * Encoding of image returned from getPicture. + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.CAMERA, + * encodingType: Camera.EncodingType.PNG}) + */ +Camera.EncodingType = { + JPEG: 0, // Return JPEG encoded image + PNG: 1 // Return PNG encoded image +}; +Camera.prototype.EncodingType = Camera.EncodingType; + +/** + * Type of pictures to select from. Only applicable when + * PictureSourceType is PHOTOLIBRARY or SAVEDPHOTOALBUM + * + * Example: navigator.camera.getPicture(success, fail, + * { quality: 80, + * destinationType: Camera.DestinationType.DATA_URL, + * sourceType: Camera.PictureSourceType.PHOTOLIBRARY, + * mediaType: Camera.MediaType.PICTURE}) + */ +Camera.MediaType = { + PICTURE: 0, // allow selection of still pictures only. DEFAULT. Will return format specified via DestinationType + VIDEO: 1, // allow selection of video only, ONLY RETURNS URL + ALLMEDIA : 2 // allow selection from all media types +}; +Camera.prototype.MediaType = Camera.MediaType; + +/** + * Gets a picture from source defined by "options.sourceType", and returns the + * image as defined by the "options.destinationType" option. + + * The defaults are sourceType=CAMERA and destinationType=DATA_URL. + * + * @param {Function} successCallback + * @param {Function} errorCallback + * @param {Object} options + */ +Camera.prototype.getPicture = function(successCallback, errorCallback, options) { + // successCallback required + if (typeof successCallback != "function") { + console.log("Camera Error: successCallback is not a function"); + return; + } + + // errorCallback optional + if (errorCallback && (typeof errorCallback != "function")) { + console.log("Camera Error: errorCallback is not a function"); + return; + } + + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.camera","getPicture",[options]); +}; + + + +PhoneGap.addConstructor(function() { + if (typeof navigator.camera == "undefined") navigator.camera = new Camera(); +}); +}; + +if (!PhoneGap.hasResource("device")) { + PhoneGap.addResource("device"); + +/** + * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the + * phone, etc. + * @constructor + */ +Device = function() +{ + this.platform = null; + this.version = null; + this.name = null; + this.phonegap = null; + this.uuid = null; + try + { + this.platform = DeviceInfo.platform; + this.version = DeviceInfo.version; + this.name = DeviceInfo.name; + this.phonegap = DeviceInfo.gap; + this.uuid = DeviceInfo.uuid; + + } + catch(e) + { + // TODO: + } + this.available = PhoneGap.available = this.uuid != null; +} + +PhoneGap.addConstructor(function() { + if (typeof navigator.device === "undefined") { + navigator.device = window.device = new Device(); + } +}); +}; +if (!PhoneGap.hasResource("capture")) { + PhoneGap.addResource("capture"); +/** + * The CaptureError interface encapsulates all errors in the Capture API. + */ +function CaptureError() { + this.code = null; +}; + +// Capture error codes +CaptureError.CAPTURE_INTERNAL_ERR = 0; +CaptureError.CAPTURE_APPLICATION_BUSY = 1; +CaptureError.CAPTURE_INVALID_ARGUMENT = 2; +CaptureError.CAPTURE_NO_MEDIA_FILES = 3; +CaptureError.CAPTURE_NOT_SUPPORTED = 20; + +/** + * The Capture interface exposes an interface to the camera and microphone of the hosting device. + */ +function Capture() { + this.supportedAudioModes = []; + this.supportedImageModes = []; + this.supportedVideoModes = []; +}; + +/** + * Launch audio recorder application for recording audio clip(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureAudioOptions} options + * + * No audio recorder to launch for iOS - return CAPTURE_NOT_SUPPORTED + */ +Capture.prototype.captureAudio = function(successCallback, errorCallback, options) { + /*if (errorCallback && typeof errorCallback === "function") { + errorCallback({ + "code": CaptureError.CAPTURE_NOT_SUPPORTED + }); + }*/ + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureAudio", [options]); +}; + +/** + * Launch camera application for taking image(s). + * + * @param {Function} successCB + * @param {Function} errorCB + * @param {CaptureImageOptions} options + */ +Capture.prototype.captureImage = function(successCallback, errorCallback, options) { + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.mediacapture", "captureImage", [options]); +}; + +/** + * Casts a PluginResult message property (array of objects) to an array of MediaFile objects + * (used in Objective-C) + * + * @param {PluginResult} pluginResult + */ +Capture.prototype._castMediaFile = function(pluginResult) { + var mediaFiles = []; + var i; + for (i=0; i} categories +* @param {ContactField[]} urls contact's web sites +*/ +var Contact = function(id, displayName, name, nickname, phoneNumbers, emails, addresses, + ims, organizations, birthday, note, photos, categories, urls) { + this.id = id || null; + this.displayName = displayName || null; + this.name = name || null; // ContactName + this.nickname = nickname || null; + this.phoneNumbers = phoneNumbers || null; // ContactField[] + this.emails = emails || null; // ContactField[] + this.addresses = addresses || null; // ContactAddress[] + this.ims = ims || null; // ContactField[] + this.organizations = organizations || null; // ContactOrganization[] + this.birthday = birthday || null; // JS Date + this.note = note || null; + this.photos = photos || null; // ContactField[] + this.categories = categories || null; + this.urls = urls || null; // ContactField[] +}; + +/** +* Converts Dates to milliseconds before sending to iOS +*/ +Contact.prototype.convertDatesOut = function() +{ + var dates = new Array("birthday"); + for (var i=0; i][;base64], + * + * @param file {File} File object containing file properties + */ +FileReader.prototype.readAsDataURL = function(file) { + this.fileName = ""; + + if (typeof file.fullPath === "undefined") { + this.fileName = file; + } else { + this.fileName = file.fullPath; + } + + // LOADING state + this.readyState = FileReader.LOADING; + + // If loadstart callback + if (typeof this.onloadstart === "function") { + var evt = File._createEvent("loadstart", this); + this.onloadstart(evt); + } + + var me = this; + + // Read file + navigator.fileMgr.readAsDataURL(this.fileName, + + // Success callback + function(r) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileReader.DONE) { + return; + } + + // Save result + me.result = r; + + // If onload callback + if (typeof me.onload === "function") { + evt = File._createEvent("load", me); + me.onload(evt); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + evt = File._createEvent("loadend", me); + me.onloadend(evt); + } + }, + + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileReader.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileReader.DONE; + + // If onloadend callback + if (typeof me.onloadend === "function") { + evt = File._createEvent("loadend", me); + me.onloadend(evt); + } + } + ); +}; + +/** + * Read file and return data as a binary data. + * + * @param file The name of the file + */ +FileReader.prototype.readAsBinaryString = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +/** + * Read file and return data as a binary data. + * + * @param file The name of the file + */ +FileReader.prototype.readAsArrayBuffer = function(file) { + // TODO - Can't return binary data to browser. + this.fileName = file; +}; + +//----------------------------------------------------------------------------- +// File Writer +//----------------------------------------------------------------------------- + +/** + * This class writes to the mobile device file system. + * + @param file {File} a File object representing a file on the file system +*/ +FileWriter = function(file) { + this.fileName = ""; + this.length = 0; + if (file) { + this.fileName = file.fullPath || file; + this.length = file.size || 0; + } + + // default is to write at the beginning of the file + this.position = 0; + + this.readyState = 0; // EMPTY + + this.result = null; + + // Error + this.error = null; + + // Event handlers + this.onwritestart = null; // When writing starts + this.onprogress = null; // While writing the file, and reporting partial file data + this.onwrite = null; // When the write has successfully completed. + this.onwriteend = null; // When the request has completed (either in success or failure). + this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. + this.onerror = null; // When the write has failed (see errors). +} + +// States +FileWriter.INIT = 0; +FileWriter.WRITING = 1; +FileWriter.DONE = 2; + +/** + * Abort writing file. + */ +FileWriter.prototype.abort = function() { + // check for invalid state + if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { + throw FileError.INVALID_STATE_ERR; + } + + // set error + var error = new FileError(), evt; + error.code = error.ABORT_ERR; + this.error = error; + + // If error callback + if (typeof this.onerror === "function") { + evt = File._createEvent("error", this); + this.onerror(evt); + } + // If abort callback + if (typeof this.onabort === "function") { + evt = File._createEvent("abort", this); + this.onabort(evt); + } + + this.readyState = FileWriter.DONE; + + // If write end callback + if (typeof this.onwriteend == "function") { + evt = File._createEvent("writeend", this); + this.onwriteend(evt); + } +}; + +/** + * @Deprecated: use write instead + * + * @param file to write the data to + * @param text to be written + * @param bAppend if true write to end of file, otherwise overwrite the file + */ +FileWriter.prototype.writeAsText = function(file, text, bAppend) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + if (bAppend !== true) { + bAppend = false; // for null values + } + + this.fileName = file; + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + + // Write file + navigator.fileMgr.writeAsText(file, text, bAppend, + // Success callback + function(r) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save result + me.result = r; + + // If onwrite callback + if (typeof me.onwrite === "function") { + evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); +}; + +/** + * Writes data to the file + * + * @param text to be written + */ +FileWriter.prototype.write = function(text) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + // Write file + navigator.fileMgr.write(this.fileName, text, this.position, + + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + + // position always increases by bytes written because file would be extended + me.position += r; + // The length of the file is now where we are done writing. + me.length = me.position; + + // If onwrite callback + if (typeof me.onwrite === "function") { + evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + var evt; + + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); + +}; + +/** + * Moves the file pointer to the location specified. + * + * If the offset is a negative number the position of the file + * pointer is rewound. If the offset is greater than the file + * size the position is set to the end of the file. + * + * @param offset is the location to move the file pointer to. + */ +FileWriter.prototype.seek = function(offset) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + + if (!offset) { + return; + } + + // See back from end of file. + if (offset < 0) { + this.position = Math.max(offset + this.length, 0); + } + // Offset is bigger then file size so set position + // to the end of the file. + else if (offset > this.length) { + this.position = this.length; + } + // Offset is between 0 and file size so set the position + // to start writing. + else { + this.position = offset; + } +}; + +/** + * Truncates the file to the size specified. + * + * @param size to chop the file at. + */ +FileWriter.prototype.truncate = function(size) { + // Throw an exception if we are already writing a file + if (this.readyState === FileWriter.WRITING) { + throw FileError.INVALID_STATE_ERR; + } + // what if no size specified? + + // WRITING state + this.readyState = FileWriter.WRITING; + + var me = this; + + // If onwritestart callback + if (typeof me.onwritestart === "function") { + var evt = File._createEvent("writestart", me); + me.onwritestart(evt); + } + + // Write file + navigator.fileMgr.truncate(this.fileName, size, + + // Success callback + function(r) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Update the length of the file + me.length = r; + me.position = Math.min(me.position, r); + + // If onwrite callback + if (typeof me.onwrite === "function") { + evt = File._createEvent("write", me); + me.onwrite(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + }, + + // Error callback + function(e) { + var evt; + // If DONE (cancelled), then don't do anything + if (me.readyState === FileWriter.DONE) { + return; + } + + // Save error + me.error = e; + + // If onerror callback + if (typeof me.onerror === "function") { + evt = File._createEvent("error", me); + me.onerror(evt); + } + + // DONE state + me.readyState = FileWriter.DONE; + + // If onwriteend callback + if (typeof me.onwriteend === "function") { + evt = File._createEvent("writeend", me); + me.onwriteend(evt); + } + } + ); +}; + +LocalFileSystem = function() { +}; + +// File error codes +LocalFileSystem.TEMPORARY = 0; +LocalFileSystem.PERSISTENT = 1; +LocalFileSystem.RESOURCE = 2; +LocalFileSystem.APPLICATION = 3; + +/** + * Requests a filesystem in which to store application data. + * + * @param {int} type of file system being requested + * @param {Function} successCallback is called with the new FileSystem + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.requestFileSystem = function(type, size, successCallback, errorCallback) { + if (type < 0 || type > 3) { + if (typeof errorCallback == "function") { + errorCallback({ + "code": FileError.SYNTAX_ERR + }); + } + } + else { + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "requestFileSystem", [type, size]); + } +}; + +/** + * + * @param {DOMString} uri referring to a local file in a filesystem + * @param {Function} successCallback is called with the new entry + * @param {Function} errorCallback is called with a FileError + */ +LocalFileSystem.prototype.resolveLocalFileSystemURI = function(uri, successCallback, errorCallback) { + PhoneGap.exec(successCallback, errorCallback, "com.phonegap.file", "resolveLocalFileSystemURI", [uri]); +}; + +/** +* This function is required as we need to convert raw +* JSON objects into concrete File and Directory objects. +* +* @param a JSON Objects that need to be converted to DirectoryEntry or FileEntry objects. +* @returns an entry +*/ +LocalFileSystem.prototype._castFS = function(pluginResult) { + var entry = null; + entry = new DirectoryEntry(); + entry.isDirectory = pluginResult.message.root.isDirectory; + entry.isFile = pluginResult.message.root.isFile; + entry.name = pluginResult.message.root.name; + entry.fullPath = pluginResult.message.root.fullPath; + pluginResult.message.root = entry; + return pluginResult; +} + +LocalFileSystem.prototype._castEntry = function(pluginResult) { + var entry = null; + if (pluginResult.message.isDirectory) { + entry = new DirectoryEntry(); + } + else if (pluginResult.message.isFile) { + entry = new FileEntry(); + } + entry.isDirectory = pluginResult.message.isDirectory; + entry.isFile = pluginResult.message.isFile; + entry.name = pluginResult.message.name; + entry.fullPath = pluginResult.message.fullPath; + pluginResult.message = entry; + return pluginResult; +} + +LocalFileSystem.prototype._castEntries = function(pluginResult) { + var entries = pluginResult.message; + var retVal = []; + for (i=0; i") +foreach(FILE ${HTML5UIFILES} ${LIBJSFILES} index.html scripts.js webodf.css) + file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc + "www/${FILE}\n") +endforeach(FILE ${HTML5UIFILES}) +file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc + "") +COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/programs/touchui + ${CMAKE_CURRENT_BINARY_DIR}/www ${HTML5UIFILES}) +COPY_FILES(NATIVEDEPS ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/www scripts.js) +COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/programs/touchui + ${CMAKE_CURRENT_BINARY_DIR}/www index.html) +COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/webodf + ${CMAKE_CURRENT_BINARY_DIR}/www webodf.css) +COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/webodf + ${CMAKE_CURRENT_BINARY_DIR}/www ${LIBJSFILES}) +QT4_ADD_RESOURCES(NATIVEQTCLIENT_RES + ${CMAKE_CURRENT_BINARY_DIR}/application.qrc) + +add_custom_target(nativeQtClientDepencencies ALL DEPENDS ${NATIVEDEPS}) + +add_executable(nativeQtClient + main.cpp + odfview.cpp + ../qtjsruntime/nativeio.cpp + odfpage.cpp ${NATIVEQTCLIENT_MOC} ${NATIVEQTCLIENT_UI} + ${NATIVEQTCLIENT_RES}) + +target_link_libraries(nativeQtClient ${QT_LIBRARIES}) +add_dependencies(nativeQtClient nativeQtClientDepencencies) diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/README b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/README new file mode 100644 index 0000000000..4860fa1b00 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/README @@ -0,0 +1 @@ +This is a small app that can show ODF documents using mainly javascript. Some functions that are not fast in browers are provided in C++ and it gives the ability to open files on the file system. diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/application.qrc b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/application.qrc new file mode 100644 index 0000000000..5010cdb8a8 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/application.qrc @@ -0,0 +1,18 @@ + + + www/app/app.js + www/app/controller/Files.js + www/app/model/FileSystem.js + www/app/store/FileStore.js + www/app/views/FileDetail.js + www/app/views/FilesList.js + www/app/views/OdfView.js + www/app/views/Viewport.js + www/index.html + www/scripts.js + www/sencha-touch.css + www/sencha-touch.js + www/webodf.css + www/webodf.js + + diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/main.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/main.cpp new file mode 100644 index 0000000000..62e5fa18be --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/main.cpp @@ -0,0 +1,10 @@ +#include "odfview.h" +#include +#include + +int main(int argc, char *argv[]) { + QApplication a(argc, argv); + OdfView view; + view.show(); + return a.exec(); +} diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.cpp new file mode 100644 index 0000000000..861014399e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.cpp @@ -0,0 +1,173 @@ +#include "mainwindow.h" +#include "ui_mainwindow.h" +#include "odfview.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +MainWindow::MainWindow(QWidget *parent) : + QMainWindow(parent), + ui(new Ui::MainWindow) +{ + ui->setupUi(this); + + createActions(); + createToolBars(); + + QCoreApplication::setOrganizationName("KO"); + //QCoreApplication::setOrganizationDomain("example.com"); + QCoreApplication::setApplicationName("Odf Viewer"); + + QSettings settings; + + setWindowTitle(tr("Odf Viewer")); + setUnifiedTitleAndToolBarOnMac(true); + + QStringList odfNameFilter; + odfNameFilter << "*.odt" << "*.ods" << "*.odp"; + dirmodel = new QFileSystemModel(this); + dirmodel->setNameFilters(odfNameFilter); + dirmodel->setFilter(QDir::AllDirs|QDir::AllEntries|QDir::NoDotAndDotDot); + dirview = new QTreeView(this); + dirview->setModel(dirmodel); + dirview->setHeaderHidden(true); + dirview->setAnimated(true); + for (int i = 1; i < dirmodel->columnCount(); i++) { + dirview->setColumnHidden(i, true); + } + QString rootpath = settings.value("rootpath", QDir::homePath()).toString(); + dirmodel->setRootPath(rootpath); + const QModelIndex rootindex = dirmodel->index(rootpath); + dirview->setRootIndex(rootindex); + QLineEdit *dirPath = new QLineEdit(rootpath, this); + dirdock = new QDockWidget(this); + QWidget *w = new QWidget(dirdock); + QVBoxLayout *layout = new QVBoxLayout(w); + dirdock->setWidget(w); + layout->addWidget(dirPath); + layout->addWidget(dirview); + addDockWidget(Qt::LeftDockWidgetArea, dirdock); + + connect(dirview, SIGNAL(clicked(QModelIndex)), this, SLOT(loadOdf(QModelIndex))); + connect(dirPath, SIGNAL(textChanged(QString)), this, SLOT(setPath(QString))); +} + +MainWindow::~MainWindow() +{ + delete ui; +} + +void +MainWindow::openFile(const QString& path) +{ + QMdiSubWindow* w = findMdiChild(path); + OdfView* v = (w) ?dynamic_cast(w->widget()) :0; + if (v == 0) { + w = ui->mdiArea->activeSubWindow(); + v = (w) ?dynamic_cast(w->widget()) :0; + } + if (v == 0) { + v = new OdfView(this); + v->showMaximized(); + w = ui->mdiArea->addSubWindow(v); + w->showMaximized(); + } + ui->mdiArea->setActiveSubWindow(w); + v->loadFile(path); +} + +void MainWindow::changeEvent(QEvent *e) +{ + QMainWindow::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} +void MainWindow::open() +{ + QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), + tr("Office Files (*.odt *.odp *.ods)")); + if (!fileName.isEmpty()) { + QMdiSubWindow *existing = findMdiChild(fileName); + if (existing) { + ui->mdiArea->setActiveSubWindow(existing); + return; + } + + OdfView *child = createOdfView(); + if (child->loadFile(fileName)) { + statusBar()->showMessage(tr("File loaded"), 2000); + child->showMaximized(); + } else { + child->close(); + } + } +} +void MainWindow::createActions() +{ + //openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); + openAct = new QAction(tr("&Open..."), this); + openAct->setShortcuts(QKeySequence::Open); + openAct->setStatusTip(tr("Open an existing file")); + connect(openAct, SIGNAL(triggered()), this, SLOT(open())); +} +void MainWindow::createToolBars() +{ + fileToolBar = addToolBar(tr("File")); + fileToolBar->addAction(openAct); +} +QMdiSubWindow *MainWindow::findMdiChild(const QString &fileName) +{ + QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath(); + + foreach (QMdiSubWindow *window, ui->mdiArea->subWindowList()) { + OdfView *odfView = qobject_cast(window->widget()); + if (odfView->currentFile() == canonicalFilePath) + return window; + } + return 0; +} + +OdfView *MainWindow::createOdfView() +{ + OdfView *view = new OdfView(this); + ui->mdiArea->addSubWindow(view); + return view; +} + +void +MainWindow::loadOdf(const QModelIndex& index) { + if (dirmodel->isDir(index)) { + if (dirview->isExpanded(index)) { + dirview->collapse(index); + } else { + dirview->expand(index); + } + return; + } + QString path = dirmodel->filePath(index); + path = QFileInfo(path).canonicalFilePath(); + openFile(path); +} + +void MainWindow::setPath(const QString &path) +{ + dirmodel->setRootPath(path); + const QModelIndex rootindex = dirmodel->index(path); + dirview->setRootIndex(rootindex); + QSettings settings; + settings.setValue("rootpath", path); +} + + + diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.h b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.h new file mode 100644 index 0000000000..d0bc822d03 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.h @@ -0,0 +1,46 @@ +#ifndef MAINWINDOW_H +#define MAINWINDOW_H + +#include +#include + +namespace Ui { + class MainWindow; +} + +class OdfView; +class QFileSystemModel; +class QTreeView; +class QDockWidget; +class QModelIndex; + +class MainWindow : public QMainWindow { + Q_OBJECT +public: + MainWindow(QWidget *parent = 0); + ~MainWindow(); + void openFile(const QString& path); + +private slots: + void open(); + OdfView *createOdfView(); + void loadOdf(const QModelIndex& index); + void setPath(const QString &path); + +private: + QMdiSubWindow *findMdiChild(const QString &fileName); + void createActions(); + void createToolBars(); + QToolBar *fileToolBar; + QAction *openAct; +protected: + void changeEvent(QEvent *e); + +private: + Ui::MainWindow *ui; + QFileSystemModel* dirmodel; + QTreeView* dirview; + QDockWidget* dirdock; +}; + +#endif // MAINWINDOW_H diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.ui b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.ui new file mode 100644 index 0000000000..38682c7010 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/mainwindow.ui @@ -0,0 +1,46 @@ + + + MainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + + + + + + 0 + 0 + 800 + 23 + + + + + + TopToolBarArea + + + false + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.cpp new file mode 100644 index 0000000000..d87a8baa2b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.cpp @@ -0,0 +1 @@ +#include "odfpage.h" diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.h b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.h new file mode 100644 index 0000000000..487d169917 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfpage.h @@ -0,0 +1,15 @@ +#ifndef ODFPAGE_H +#define ODFPAGE_H + +#include +#include + +class OdfPage : public QWebPage { +public: + OdfPage(QObject* parent) :QWebPage(parent) {} + void javaScriptConsoleMessage(const QString& message, int lineNumber, const QString & sourceID) { + qDebug() << sourceID << ":" << lineNumber << ":" << message; + } +}; + +#endif // ODFPAGE_H diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.cpp b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.cpp new file mode 100644 index 0000000000..97125a5537 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.cpp @@ -0,0 +1,83 @@ +#include "odfview.h" + +#include "../qtjsruntime/nativeio.h" +#include "../qtjsruntime/nam.h" + +#include "odfpage.h" + +#include +#include +#include +#include +#include +#include +#include + +OdfView::OdfView(QWidget* parent) :QWebView(parent) +{ + QString prefix = "../android/assets/"; // set this to the right value when debugging + QString htmlfile = QDir(prefix).absoluteFilePath("www/index.html"); + if (!QFileInfo(htmlfile).exists()) { + prefix = "qrc:/"; + htmlfile = "qrc:/www/index.html"; + } + setPage(new OdfPage(this)); + nativeio = new NativeIO(this, QDir(prefix), QDir::current()); + connect(page(), SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool))); + page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); + + connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), + this, SLOT(slotInitWindowObjects())); + + // use our own networkaccessmanager that gives limited access to the local + // file system + networkaccessmanager = new NAM(this); + page()->setNetworkAccessManager(networkaccessmanager); + setUrl(QUrl(htmlfile)); + loaded = false; +} + +OdfView::~OdfView() { +} + +void +OdfView::slotInitWindowObjects() +{ + QWebFrame *frame = page()->mainFrame(); + frame->addToJavaScriptWindowObject("nativeio", nativeio); +} + +bool +OdfView::loadFile(const QString &fileName) { + curFile = fileName; + // odf->addFile(identifier, fileName); + // networkaccessmanager->setCurrentFile(odf->getOpenContainer(identifier)); + if (loaded) { + slotLoadFinished(true); + } + return true; +} +void +OdfView::slotLoadFinished(bool ok) { + if (!ok) return; + loaded = true; + QWebFrame *frame = page()->mainFrame(); + QString js = + "var originalReadFileSync = runtime.readFileSync;" + "runtime.readFileSync = function (path, encoding) {" + " if (path.substr(path.length - 3) === '.js') {" + " return originalReadFileSync.apply(runtime," + " [path, encoding]);" + " }" + " return nativeio.readFileSync(path, encoding);" + "};" + "runtime.read = function (path, offset, length, callback) {" + " var data = nativeio.read(path, offset, length);" + " data = runtime.byteArrayFromString(data, 'binary');" + " callback(nativeio.error()||null, data);" + "};" + "runtime.getFileSize = function (path, callback) {" + " callback(nativeio.getFileSize(path));" + "};"; + frame->evaluateJavaScript(js); +} diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.h b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.h new file mode 100644 index 0000000000..f61ba3c926 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/odfview.h @@ -0,0 +1,29 @@ +#ifndef ODFVIEW_H +#define ODFVIEW_H + +#include +#include +class NativeIO; + +class OdfView : public QWebView { +Q_OBJECT +public: + OdfView(QWidget* parent = 0); + ~OdfView(); + QString currentFile() { return curFile; } + +public slots: + bool loadFile(const QString &fileName); + +private slots: + void slotLoadFinished(bool ok); + void slotInitWindowObjects(); + +private: + bool loaded; + QString curFile; + QNetworkAccessManager* networkaccessmanager; + NativeIO* nativeio; +}; + +#endif // ODFVIEW_H diff --git a/apps/files_odfviewer/src/webodf/programs/nativeQtClient/scripts.js b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/scripts.js new file mode 100644 index 0000000000..ce2086bc7a --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/nativeQtClient/scripts.js @@ -0,0 +1,93 @@ +/*global alert, app, window, runtime*/ +var LocalFileSystem = { + PERSISTENT: 0, + TEMPORARY: 1 +}; +function FileEntry(name, fullPath) { + "use strict"; + this.isFile = true; + this.isDirectory = false; + this.name = name; + this.fullPath = fullPath; + this.file = function (onsuccess, onerror) { + function File(fullPath) { + this.name = name; + this.fullPath = fullPath; + this.type = ""; + this.size = -1; + this.lastModifiedDate = -1; + } + var file = new File(fullPath); + try { + onsuccess(file); + } catch (e) { + alert("Error on determining file properties: " + e); + onerror(e); + } + }; +} +function FileReader() { + "use strict"; + var fr = this; + this.readAsArrayBuffer = function (file) { + var path = file.fullPath.substr(7), + data = runtime.readFileSync(path, 'binary'); + data = runtime.byteArrayFromString(data, "binary"); + window.setTimeout(function () { + fr.onloadend({target: {result: data}}); + }, 1); + }; +} +var DirectoryReader; +function DirectoryEntry(name, fullPath) { + "use strict"; + this.isFile = false; + this.isDirectory = true; + this.name = name; + this.fullPath = fullPath; + this.createReader = function () { + var reader = new DirectoryReader(fullPath); + return reader; + }; +} +function DirectoryReader(fullPath) { + "use strict"; + this.readEntries = function (onsuccess, onerror) { + window.setTimeout(function () { + var entries = []; + entries[entries.length] = new FileEntry("welcome.odt", + "welcome.odt"); + entries[entries.length] = new FileEntry("Traktatenblad.odt", + "Traktatenblad.odt"); + try { + onsuccess(entries); + } catch (e) { + onerror(e); + } + }, 1); + }; +} +window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { + "use strict"; + var p = path.lastIndexOf("/"), + name = (p === -1) ? path : path.substr(p + 1); + onsuccess(new FileEntry(name, path)); +}; +window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { + "use strict"; + var dirs = [], shared, subfolder, path; + try { + if (filesystem === LocalFileSystem.PERSISTENT) { + path = ""; + onsuccess({ + name: "root", + root: new DirectoryEntry("root", path) + }); + } else { + onerror("not defined"); + } + } catch (e) { + onerror(e); + } +}; +var device = {}; diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/playbook/CMakeLists.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/build_sign.bat b/apps/files_odfviewer/src/webodf/programs/playbook/build_sign.bat new file mode 100644 index 0000000000..34e8deeab3 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/build_sign.bat @@ -0,0 +1,23 @@ +@echo on +set WWSDK=M:\blackberrysdk\webworkssdk +set BBWP=%WWSDK%\bbwp\bbwp +set DEPLOY=%WWSDK%\bbwp\blackberry-tablet-sdk\bin\blackberry-deploy +set JAVA_HOME=%WWSDK%\jre +set PATH=%PATH%;%JAVA_HOME%\bin + +mkdir bin +mkdir signed + +zip -r webodf.zip config.xml index.html icon.png scripts.js app sencha-touch.js sencha-touch.css webodf.js webodf.css ZoomIn.png ZoomOut.png + +rem MAKE A DEBUG VERSION +del bin\webodf.bar +%BBWP% webodf.zip -d -o bin +if %errorlevel% neq 0 exit /b %errorlevel% + +%DEPLOY% -installApp -password ko -device 192.168.1.111 -package bin\webodf.bar +if %errorlevel% neq 0 exit /b %errorlevel% + +rem MAKE A SIGNED VERSION, (can be done only once for each buildId!) +rem %BBWP% webodf.zip -g U9gXpJXbGC -buildId 2 -o signed + diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/config.xml b/apps/files_odfviewer/src/webodf/programs/playbook/config.xml new file mode 100644 index 0000000000..cab7788317 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/config.xml @@ -0,0 +1,26 @@ + + + KO GmbH + WebODF + + Viewer for OpenDocument files. + + + + + + + + + access_shared + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js new file mode 100644 index 0000000000..8c4d91c46e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js @@ -0,0 +1,17 @@ +(function () { + var CUSTOM_FILEREADER_API_URL = "blackberry/custom/filereader"; + + var ARGS_PATH = "path"; + var ARGS_DATA = "data"; + + function CustomFileReader() { + }; + + CustomFileReader.prototype.readAsDataURL = function(path) { + var remoteCall = new blackberry.transport.RemoteFunctionCall(CUSTOM_FILEREADER_API_URL + "/readAsDataURL"); + remoteCall.addParam(ARGS_PATH, path); + return remoteCall.makeSyncCall(); + }; + + blackberry.Loader.javascriptLoaded("blackberry.custom.filereader", CustomFileReader); +})(); diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js new file mode 100644 index 0000000000..2ae1ede11e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js @@ -0,0 +1,8 @@ +(function () { + + function CustomFileReader(disp) { + this.constructor.prototype.readAsDataURL = function(path) { return disp.readAsDataURL(path); }; + }; + + blackberry.Loader.javascriptLoaded("blackberry.custom.filereader", CustomFileReader); +})(); diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/library.xml b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/library.xml new file mode 100644 index 0000000000..1f3aa52d36 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/library.xml @@ -0,0 +1,22 @@ + + + + blackberry.custom.filereader.CustomFileReader + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as new file mode 100644 index 0000000000..3261fbcf45 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as @@ -0,0 +1,34 @@ +package blackberry.custom.filereader { + import flash.filesystem.File; + import flash.filesystem.FileMode; + import flash.filesystem.FileStream; + import flash.utils.ByteArray; + import mx.utils.Base64Encoder; + import webworks.extension.DefaultExtension; + + public class CustomFileReader extends DefaultExtension { + + public function CustomFileReader() { + super(); + } + + override public function getFeatureList():Array { + return new Array ("blackberry.custom.filereader"); + } + + public function readAsDataURL(path:String):String { + var file:File = new File(path); + if (!file.exists) { + return ""; + } + var bytes:ByteArray = new ByteArray(); + var stream:FileStream = new FileStream(); + stream.open(file, FileMode.READ); + stream.readBytes(bytes); + var btoa:Base64Encoder = new Base64Encoder(); + btoa.encodeBytes(bytes); + stream.close(); + return "data:;base64," + btoa.toString(); + } + } +} \ No newline at end of file diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/icon.png b/apps/files_odfviewer/src/webodf/programs/playbook/icon.png new file mode 100644 index 0000000000..b7ccb848e3 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/playbook/icon.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/index.html b/apps/files_odfviewer/src/webodf/programs/playbook/index.html new file mode 100644 index 0000000000..77d331c12e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/index.html @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + WebODF + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/playbook/scripts.js b/apps/files_odfviewer/src/webodf/programs/playbook/scripts.js new file mode 100644 index 0000000000..e7913527d6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/playbook/scripts.js @@ -0,0 +1,146 @@ +/*global blackberry, alert, document, window, app*/ +var LocalFileSystem = { + PERSISTENT: 0, + TEMPORARY: 1 +}; +function FileWriter(fullPath) { + "use strict"; + this.write = function (data) { + var blob; + try { + blob = blackberry.utils.stringToBlob(data, "UTF-8"); + blackberry.io.file.saveFile(fullPath, blob); + } catch (e) { + } + }; +} +function FileEntry(name, fullPath) { + "use strict"; + this.isFile = true; + this.isDirectory = false; + this.name = name; + this.fullPath = fullPath; + this.file = function (onsuccess, onerror) { + function File(fullPath) { + this.name = name; + this.fullPath = fullPath; + this.type = ""; + this.size = -1; + this.lastModifiedDate = -1; + } + var file = new File(fullPath), + properties; + try { + properties = blackberry.io.file.getFileProperties(fullPath); + file.type = properties.mimeType; + file.size = properties.size; + file.lastModifiedDate = properties.dateModified; + onsuccess(file); + } catch (e) { + alert("Error on determining file properties: " + e); + onerror(e); + } + }; + this.createWriter = function (onsuccess, onerror) { + onsuccess(new FileWriter(fullPath)); + }; +} +function FileReader() { + "use strict"; + var fr = this; + this.readAsDataURL = function (file) { + var path = file.fullPath.substr(7); + window.setTimeout(function () { + try { + var data = blackberry.custom.filereader.readAsDataURL(path); + fr.onloadend({target: {result: data}}); + } catch (e) { + alert("Error on reading file: " + e + " " + file.fullPath); + } + }, 1); + }; + this.readAsText = function (file) { + var path = file.fullPath.substr(7); + try { + blackberry.io.file.readFile(path, function (fullPath, blob) { + var str = blackberry.utils.blobToString(blob, "UTF-8"); + fr.onloadend({target: {result: str}}); + }, true); + } catch (e) { + fr.onloadend({target: {result: "[]"}}); + } + }; +} +var DirectoryReader; +function DirectoryEntry(name, fullPath) { + "use strict"; + this.isFile = false; + this.isDirectory = true; + this.name = name; + this.fullPath = fullPath; + this.createReader = function () { + var reader = new DirectoryReader(fullPath); + return reader; + }; +} +function DirectoryReader(fullPath) { + "use strict"; + this.readEntries = function (onsuccess, onerror) { + window.setTimeout(function () { + var entries = [], + dirs = blackberry.io.dir.listDirectories(fullPath), + files = blackberry.io.dir.listFiles(fullPath), + i; + try { + for (i = 0; i < dirs.length; i += 1) { + entries[entries.length] = new DirectoryEntry(dirs[i], + fullPath + "/" + dirs[i]); + } + for (i = 0; i < files.length; i += 1) { + entries[entries.length] = new FileEntry(files[i], + fullPath + "/" + files[i]); + } + onsuccess(entries); + } catch (e) { + onerror(e); + } + }, 1); + }; +} +window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { + "use strict"; + var p = path.lastIndexOf("/"), + name; + if (p === -1) { + name = path; + path = blackberry.io.dir.appDirs.shared.documents.path + "/" + path; + } else { + name = path.substr(p + 1); + } + onsuccess(new FileEntry(name, path)); +}; +window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { + "use strict"; + var dirs = [], shared, subfolder; + try { + if (filesystem === LocalFileSystem.PERSISTENT) { + shared = blackberry.io.dir.appDirs.shared; + for (subfolder in shared) { + if (shared.hasOwnProperty(subfolder)) { + dirs[dirs.length] = subfolder; + } + } + onsuccess({ + name: "root", + root: new DirectoryEntry("root", shared.documents.path + //+ "/kofficetests/odf/odt" + ) + }); + } else { + onerror("not defined"); + } + } catch (e) { + onerror(e); + } +}; +var device = {}; diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/CMakeLists.txt new file mode 100644 index 0000000000..ec8026741c --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/CMakeLists.txt @@ -0,0 +1,4 @@ +include(${QT_USE_FILE}) +QT4_WRAP_CPP(QTJSRUNTIME_MOC nam.h pagerunner.h nativeio.h) +add_executable(qtjsruntime qtjsruntime.cpp pagerunner.cpp nativeio.cpp ${QTJSRUNTIME_MOC}) +target_link_libraries(qtjsruntime ${QT_LIBRARIES}) diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nam.h b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nam.h new file mode 100644 index 0000000000..ebb62f261a --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nam.h @@ -0,0 +1,48 @@ +#ifndef NAM_H +#define NAM_H + +#include +#include + +class NAM : public QNetworkAccessManager { +Q_OBJECT +private: + const QString host; + const int port; + int outstandingRequests; +public: + NAM(QObject* parent, const QString& host_ = QString(), int port_ = -1) + :QNetworkAccessManager(parent), host(host_), port(port_) { + outstandingRequests = 0; + connect(this, SIGNAL(finished(QNetworkReply*)), + this, SLOT(requestFinished())); + } + QNetworkReply* createRequest(QNetworkAccessManager::Operation o, + QNetworkRequest const& r, QIODevice* d) { + outstandingRequests += 1; + bool samehost = false; + if (port > 0) { + samehost = r.url().host() == host + || r.url().host().endsWith("." + host) + || host.endsWith("." + r.url().host()); + samehost &= r.url().port() != port; + } else { + // use host string as a prefix + samehost = r.url().toString().startsWith(host); + } + if (!samehost) { + // if not same host or domain and port, block + return QNetworkAccessManager::createRequest(o, QNetworkRequest(), + d); + } + return QNetworkAccessManager::createRequest(o, r, d); + } + bool hasOutstandingRequests() { + return outstandingRequests > 0; + } +public slots: + void requestFinished() { + outstandingRequests -= 1; + } +}; +#endif diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.cpp b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.cpp new file mode 100644 index 0000000000..0657a0c711 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.cpp @@ -0,0 +1,106 @@ +#include "nativeio.h" +#include +#include +#include + +NativeIO::NativeIO(QObject* parent, const QDir& runtimedir_, + const QDir& cwd_, + const QMap& pathPermissions_) + :QObject(parent), runtimedir(runtimedir_), cwd(cwd_), + pathPermissions(pathPermissions_) { +} +QString +NativeIO::readFileSync(const QString& path, const QString& encoding) { + errstr = QString(); + QFile file(cwd.absoluteFilePath(path)); + QByteArray data; + if (file.open(QIODevice::ReadOnly)) { + data = file.readAll(); + } + QString out; + if (encoding != "binary") { + QTextCodec *codec = QTextCodec::codecForName(encoding.toAscii()); + if (codec) { + out = codec->toUnicode(data); + } + } + if (out.length() == 0 && data.length() > 0) { + out = QString(data.length(), 0); + for (int i = 0; i < data.length(); ++i) { + out[i] = data[i]; + } + } + return out; +} +QString +NativeIO::read(const QString& path, int offset, int length) { + errstr = QString(); + QFile file(cwd.absoluteFilePath(path)); + QByteArray data; + if (file.open(QIODevice::ReadOnly) && (offset == 0 || file.seek(offset))) { + int lastLength = 0; + do { + lastLength = data.length(); + data += file.read(length - data.length()); + } while (data.length() < length && data.length() != lastLength); + } + if (length != data.length()) { + errstr = "Not enough data: " + QString::number(length) + + " instead of " + QString::number(data.length()); + return QString(); + } + QString out(length, 0); + for (int i = 0; i < length; ++i) { + out[i] = data[i]; + } + return out; +} +void +NativeIO::writeFile(const QString& path, const QString& data) { + QFile file(cwd.absoluteFilePath(path)); + errstr = QString(); + if (!file.open(QIODevice::WriteOnly)) { + errstr = "Could not open file for writing."; + return; + } + int length = data.length(); + QByteArray out(length, 0); + for (int i = 0; i < length; ++i) { + out[i] = data[i].unicode(); + } + if (file.write(out) != out.length()) { + errstr = "Could not write to file."; + } + return; +} +void +NativeIO::unlink(const QString& path) { + errstr = QString(); + QFile file(cwd.absoluteFilePath(path)); + if (!file.remove()) { + errstr = "Could not delete file"; + } +} +int +NativeIO::getFileSize(const QString& path) { + errstr = QString(); + QFile file(cwd.absoluteFilePath(path)); + if (!file.exists()) { + errstr = "Could not determine file size."; + } + return file.size(); +} +void +NativeIO::exit(int exitcode) { + qApp->exit(exitcode); +} +QString +NativeIO::currentDirectory() const { + return QDir::currentPath(); +} +QStringList +NativeIO::libraryPaths() const { + QStringList paths; + paths << runtimedir.absolutePath() << cwd.absolutePath(); + return paths; +} diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.h b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.h new file mode 100644 index 0000000000..b699744226 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/nativeio.h @@ -0,0 +1,41 @@ +#ifndef NATIVEIO_H +#define NATIVEIO_H + +#include +#include +#include + +class QWebPage; + +// class that exposes filesystem to web environment +class NativeIO : public QObject { +Q_OBJECT +private: + QWebPage* webpage; + QString errstr; + const QDir runtimedir; + const QDir cwd; + const QMap pathPermissions; +public: + typedef QMap PathMap; + PathMap v; + NativeIO(QObject* parent, const QDir& runtimedir, const QDir& cwd, + const PathMap& pathPermissions = PathMap()); +public slots: + /** + * Return the last error. + */ + QString error() { + return errstr; + } + QString readFileSync(const QString& path, const QString& encoding); + QString read(const QString& path, int offset, int length); + void writeFile(const QString& path, const QString& data); + void unlink(const QString& path); + int getFileSize(const QString& path); + void exit(int exitcode); + QString currentDirectory() const; + QStringList libraryPaths() const; +}; + +#endif diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.cpp b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.cpp new file mode 100644 index 0000000000..a91794d9a2 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.cpp @@ -0,0 +1,191 @@ +#include "pagerunner.h" + +#include "nam.h" +#include "nativeio.h" +#include +#include +#include +#include +#include +#include +#include +#include + +QByteArray getRuntimeBindings() { + return + "if (typeof(runtime) !== 'undefined') {" + " runtime.readFileSync = function (path, encoding) {" + " return nativeio.readFileSync(path, encoding);" + " };" + " runtime.read = function (path, offset, length, callback) {" + " var data = nativeio.read(path, offset, length);" + " data = runtime.byteArrayFromString(data, 'binary');" + " callback(nativeio.error()||null, data);" + " };" + " runtime.writeFile = function (path, data, callback) {" + " data = runtime.byteArrayToString(data, 'binary');" + " nativeio.writeFile(path, data);" + " callback(nativeio.error()||null);" + " };" + " runtime.deleteFile = function (path, callback) {" + " nativeio.unlink(path);" + " callback(nativeio.error()||null);" + " };" + " runtime.getFileSize = function (path, callback) {" + " callback(nativeio.getFileSize(path));" + " };" + " runtime.exit = function (exitCode) {" + " nativeio.exit(exitCode);" + " };" + " runtime.currentDirectory = function () {" + " return nativeio.currentDirectory();" + " };" + "}"; +} + +PageRunner::PageRunner(const QStringList& args) + : QWebPage(0), + out(stdout), + err(stderr), + view(new QWidget()) { + + QMap settings = parseArguments(args); + QStringList arguments = args.mid(settings.size() * 2); + exportpdf = settings.value("export-pdf"); + exportpng = settings.value("export-png"); + url = QUrl(arguments[0]); + nativeio = new NativeIO(this, QFileInfo(arguments[0]).dir(), + QDir::current()); + if (url.scheme() == "file" || url.isRelative()) { + QFileInfo info(url.toLocalFile()); + if (!info.isReadable() || !info.isFile()) { + QTextStream err(stderr); + err << "Cannot read file '" + url.toString() + "'.\n"; + qApp->exit(1); + } + } + nam = new NAM(this, QUrl(url).host(), QUrl(url).port()); + + setNetworkAccessManager(nam); + connect(this, SIGNAL(loadFinished(bool)), this, SLOT(finished(bool))); + connect(mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), + this, SLOT(slotInitWindowObjects())); + sawJSError = false; + + setView(view); + scriptMode = arguments[0].endsWith(".js"); + if (scriptMode) { + QByteArray html = "'" + arguments[0].toUtf8().replace('\'', "\\'") + + "'"; + for (int i = 1; i < arguments.length(); ++i) { + html += ",'" + arguments[i].toUtf8().replace('\'', "\\'") + "'"; + } + html = "" + "" + "" + ""; + if (arguments[0].endsWith("runtime.js")) { + // add runtime modification + html += ""; + } + html += "\n"; + QTemporaryFile tmp("XXXXXX.html"); + tmp.setAutoRemove(true); + tmp.open(); + tmp.write(html); + tmp.close(); + mainFrame()->load(tmp.fileName()); + } else { + // Make the url absolute. If it is not done here, QWebFrame will do + // it, and it will lose the query and fragment part. + QUrl absurl; + if (url.isRelative()) { + absurl = QUrl::fromLocalFile(QFileInfo(url.toLocalFile()).absoluteFilePath()); + absurl.setQueryItems(url.queryItems()); + absurl.setFragment(url.fragment()); + } else { + absurl = url; + } + mainFrame()->load(absurl); + } +} +PageRunner::~PageRunner() { + delete view; +} +void PageRunner::finished(bool ok) { + // bind nativeio + if (!ok) { + qApp->exit(1); + } + if (!scriptMode) { + mainFrame()->evaluateJavaScript(getRuntimeBindings()); + } + + // connect signals + connect(this, SIGNAL(contentsChanged()), this, SLOT(noteChange())); + connect(this, SIGNAL(downloadRequested(QNetworkRequest)), + this, SLOT(noteChange())); + connect(this, SIGNAL(repaintRequested(QRect)), + this, SLOT(noteChange())); + connect(mainFrame(), SIGNAL(pageChanged()), this, SLOT(noteChange())); + connect(this, SIGNAL(geometryChangeRequested(QRect)), + this, SLOT(noteChange())); + QTimer::singleShot(150, this, SLOT(reallyFinished())); + changed = false; + time.start(); +} +void PageRunner::reallyFinished() { + int latency = time.restart(); + // err << latency << " " << changed << " " << nam->hasOutstandingRequests() << endl; + if (changed || latency >= 152 || nam->hasOutstandingRequests()) { + QTimer::singleShot(150, this, SLOT(reallyFinished())); + changed = false; + return; + } + if (!exportpdf.isEmpty() || !exportpng.isEmpty()) { + setViewportSize(mainFrame()->contentsSize()); + } + if (!exportpng.isEmpty()) { + renderToFile(exportpng); + } + if (!exportpdf.isEmpty()) { + printToFile(exportpdf); + } + qApp->exit(sawJSError); +} +QMap PageRunner::parseArguments(const QStringList& args) { + int i = 0; + QMap settings; + while (i + 2 < args.length()) { + if (args[i].startsWith("--")) { + settings[args[i].mid(2)] = args[i+1]; + } + i += 2; + } + return settings; +} +void PageRunner::slotInitWindowObjects() { + mainFrame()->addToJavaScriptWindowObject("nativeio", nativeio); +} +void PageRunner::renderToFile(const QString& filename) { + QImage pixmap(mainFrame()->contentsSize().boundedTo(QSize(10000,10000)), + QImage::Format_ARGB32_Premultiplied); + QPainter painter(&pixmap); + mainFrame()->render(&painter, QWebFrame::ContentsLayer); + painter.end(); + pixmap.save(filename); +} +void PageRunner::printToFile(const QString& filename) { + QPrinter printer(QPrinter::HighResolution); + printer.setFontEmbeddingEnabled(true); + printer.setOutputFormat(QPrinter::PdfFormat); + printer.setOutputFileName(filename); + mainFrame()->print(&printer); +} diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.h b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.h new file mode 100644 index 0000000000..9c848acc10 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/pagerunner.h @@ -0,0 +1,68 @@ +#ifndef PAGERUNNER_H +#define PAGERUNNER_H + +#include +#include +#include + +class NAM; +class NativeIO; + +class PageRunner : public QWebPage { +Q_OBJECT +private: + QUrl url; + NAM* nam; + QTextStream out; + QTextStream err; + bool changed; + QWidget* const view; + QTime time; + bool scriptMode; + NativeIO* nativeio; + QString exportpdf; + QString exportpng; + bool sawJSError; +public: + PageRunner(const QStringList& args); + ~PageRunner(); +private slots: + void finished(bool ok); + void noteChange() { + changed = true; + } + void reallyFinished(); + void slotInitWindowObjects(); + bool shouldInterruptJavaScript() { + changed = true; + return false; + } +private: + void javaScriptConsoleMessage(const QString& message, int lineNumber, + const QString& sourceID) { + changed = true; + if (scriptMode) { + err << message << endl; + } else { + err << sourceID << ":" << lineNumber << " " << message << endl; + } + sawJSError = true; + } + void javaScriptAlert(QWebFrame* /*frame*/, const QString& msg) { + changed = true; + err << "ALERT: " << msg << endl; + } + bool javaScriptPrompt(QWebFrame*, const QString&, const QString&, QString*){ + changed = true; + return false; + } + void renderToFile(const QString& filename); + void printToFile(const QString& filename); + // overload because default impl was causing a crash + QString userAgentForUrl(const QUrl&) const { + return QString(); + } + QMap parseArguments(const QStringList& args); +}; + +#endif diff --git a/apps/files_odfviewer/src/webodf/programs/qtjsruntime/qtjsruntime.cpp b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/qtjsruntime.cpp new file mode 100644 index 0000000000..35d04da146 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/qtjsruntime/qtjsruntime.cpp @@ -0,0 +1,20 @@ +/** + * Small executable that loads a javascript or html page from local a URI. + * If the URI ends in .js it will be run in QtScript engine, otherwise, it will + * be assumed to be a webpage that will be opened in + */ +#include "pagerunner.h" +#include +int +main(int argc, char** argv) { + if (argc < 2) { + QTextStream err(stderr); + err << "Usage: " << argv[0] << " [--export-pdf pdffile] " + "[--export-png pngfile] html/javascripfile [arguments]\n"; + return 1; + } + QApplication app(argc, argv); + app.setApplicationName(argv[0]); + PageRunner p(QCoreApplication::arguments().mid(1)); + return app.exec(); +} diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/CMakeLists.txt b/apps/files_odfviewer/src/webodf/programs/touchui/CMakeLists.txt new file mode 100644 index 0000000000..0a18076273 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/CMakeLists.txt @@ -0,0 +1,7 @@ +COPY_FILES(TOUCHUIDEPS ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} ${HTML5UIFILES}) +COPY_FILES(TOUCHUIDEPS ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR} index.html scripts.js welcome.odt) +COPY_FILES(TOUCHUIDEPS ${CMAKE_SOURCE_DIR}/webodf + ${CMAKE_CURRENT_BINARY_DIR} webodf.css ${LIBJSFILES}) +add_custom_target(touchuiDepencencies ALL DEPENDS ${TOUCHUIDEPS}) diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/ZoomIn.png b/apps/files_odfviewer/src/webodf/programs/touchui/ZoomIn.png new file mode 100644 index 0000000000..6041c6ff93 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/touchui/ZoomIn.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/ZoomOut.png b/apps/files_odfviewer/src/webodf/programs/touchui/ZoomOut.png new file mode 100644 index 0000000000..733a4e1ada Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/touchui/ZoomOut.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/app.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/app.js new file mode 100644 index 0000000000..60da480a5f --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/app.js @@ -0,0 +1,40 @@ +/*global Ext, invokeString, document*/ +/** + * When the application has been initialized, this function is called, if + * it has been set. By default, it will start scanning the files in the + * files sytem. It can be overridden by e.g. PhoneGap to wait until the device + * is ready. + */ +var onApplicationLaunch = function (app) { + "use strict"; + app.startScanningDirectories(); +}; +Ext.application({ + name : 'WebODFApp', + models: ['FileSystem'], + views: ['Viewport', 'FilesList', 'FileDetail', 'OdfView'], + controllers: ['Files'], + stores: ['FileStore'], + launch: function () { + 'use strict'; + var app = this; + Ext.create('WebODFApp.view.Viewport'); + app.openUrl = function (url) { + var proxy = Ext.getStore("FileStore").getProxy(); + proxy.getRecord(url, function (record) { + var controller; + if (!record) { + alert("Cannot open " + url); + } else { + controller = app.getController('Files'); + controller.show(null, null, null, record); + } + }); + }; + this.startScanningDirectories = function () { + var proxy = Ext.getStore("FileStore").getProxy(); + proxy.startScanningDirectories(); + }; + onApplicationLaunch(this); + } +}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/controller/Files.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/controller/Files.js new file mode 100644 index 0000000000..22e06f85b6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/controller/Files.js @@ -0,0 +1,82 @@ +/*global Ext, runtime*/ +Ext.define('WebODFApp.controller.Files', { + extend: 'Ext.app.Controller', + + config: { + refs: { + mainView: 'mainview', + filesList: 'fileslist list', + fileDetail: 'filedetail', + openButton: '#openButton', + odfView: 'odfview', + title: 'titlebar' + }, + control: { + mainView: { + pop: 'pop', + push: 'push', + back: 'back' + }, + filesList: { + itemtap: 'show' + }, + openButton: { + tap: 'open' + } + } + }, + back: function () { + "use strict"; + this.odfView.hideCanvas(); + }, + push: function (view, item) { + "use strict"; + if (item.xtype === "filedetail") { + this.getOpenButton().show(); + } else { + this.getOpenButton().hide(); + } + }, + pop: function (view, item) { + "use strict"; + if (item.xtype === "odfview") { // going to filedetail + this.getOpenButton().show(); + } else { + this.getOpenButton().hide(); + } + this.getFilesList().deselectAll(); + }, + show: function (list, index, target, record, e) { + "use strict"; + // set the record in the details view and the file view + // this way, document starts loading in the background + var c = this; + if (!this.fileDetail) { + this.fileDetail = Ext.create('WebODFApp.view.FileDetail'); + } + if (!this.odfView) { + this.odfView = Ext.create('WebODFApp.view.OdfView'); + this.odfView.addCanvasListener(this.fileDetail.canvasListener); + } + this.odfView.hideCanvas(); + this.fileDetail.odfView = this.odfView; + this.fileDetail.setRecord(record); + this.getMainView().push(this.fileDetail); + runtime.setTimeout(function () { + c.odfView.setRecord(record); + }, 300); + }, + open: function (options) { + "use strict"; + var c = this; + if (!this.odfView) { + this.odfView = Ext.create('WebODFApp.view.OdfView'); + } + this.odfView.hideCanvas(); + this.odfView.setRecord(this.fileDetail.getRecord()); + this.getMainView().push(this.odfView); + runtime.setTimeout(function () { + c.odfView.showCanvas(); + }, 300); + } +}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/model/FileSystem.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/model/FileSystem.js new file mode 100644 index 0000000000..3346008f1a --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/model/FileSystem.js @@ -0,0 +1,265 @@ +/*global Ext, console, app, window, LocalFileSystem, JSON, FileReader, runtime*/ +Ext.define("WebODFApp.model.FileSystemProxy", (function () { + "use strict"; + var self = this, + scanner; + function Scanner(proxy) { + var todo = [], + done = false, + fileSystems, + files, + cachedList = [], + dirs = {}, + lastUpdate = 0, + lastUpdateTime = new Date(); + + function getFileId(fullPath) { + var i; + if (!files) { + return -1; + } + for (i = 0; i < files.length; i += 1) { + if (files[i].get('fullPath') === fullPath) { + return i; + } + } + return -1; + } + this.getFileId = getFileId; + function addFileEntry(entry, callback) { + function fail() { + callback(-1); + } + var id = getFileId(entry.fullPath); + if (id !== -1) { + return callback(id); + } + entry.file(function (file) { + var id = files.length; + files.push(Ext.create('WebODFApp.model.FileSystem', { + id: id, + fileName: entry.name, + fullPath: entry.fullPath, + size: file.size + })); + callback(id); + }, fail); + } + function parseCachedFileList(pos, callback) { + if (pos === cachedList.length) { + return callback(); + } + window.resolveLocalFileSystemURI(cachedList[pos], function (entry) { + addFileEntry(entry, function () { + parseCachedFileList(pos + 1, callback); + }); + }, function () { + parseCachedFileList(pos + 1, callback); + }); + } + function readCachedFileList(callback) { + window.resolveLocalFileSystemURI("cachedODFList.json", + function (fileentry) { + var reader = new FileReader(); + reader.onloadend = function (evt) { + cachedList = []; + try { + cachedList = JSON.parse(evt.target.result); + } catch (e) { + alert(e); + } + parseCachedFileList(0, callback); + }; + reader.readAsText(fileentry); + }, function () { + callback(); + }); + } + function writeCachedFileList() { + var i, + l = files.length; + cachedList.length = files.length; + for (i = 0; i < l; i += 1) { + cachedList[i] = files[i].get('fullPath'); + } + window.resolveLocalFileSystemURI("cachedODFList.json", + function (fileentry) { + fileentry.createWriter(function (writer) { + writer.write(JSON.stringify(cachedList)); + }, function (e) { + runtime.log(JSON.stringify(e)); + }); + }, function (e) { + runtime.log(JSON.stringify(e)); + }); + } + function filter(name) { + var suffix = name.substr(name.length - 4); + return suffix === ".odt" || suffix === ".odp" || suffix === ".ods"; + } + function errorCallback(err) { + console.log("FILE READ ERROR " + err + " " + todo.length); + done = true; + } + function load(entry, callback) { + function fail() { + callback(-1); + } + if (entry.isDirectory) { + entry.createReader().readEntries(function (entries) { + var i = 0; + for (i = 0; i < entries.length; i += 1) { + entry = entries[i]; + if (entry.isDirectory + && !dirs.hasOwnProperty(entry.fullPath)) { + todo.push(entry); + dirs[entry.fullPath] = entry; + } else if (filter(entry.name)) { + todo.push(entry); + } + } + callback(-1); + }, fail); + } else if (entry.isFile) { + addFileEntry(entry, callback); + } else { + fail(); + } + } + function addFileSystem(fileSystem) { + var dir = fileSystems[fileSystem.name] = {}; + todo.push(fileSystem.root); + function callback() { + var now = new Date(), + // a limit is needed, otherwise the # of files too large to + // be handled by sencha touch + done = todo.length === 0 || files.length > 2000, + store = Ext.getStore('FileStore'); + if (done || lastUpdate === 0 || (files.length - lastUpdate > 0 + && now - lastUpdateTime > files.length * 100)) { + store.load(); + lastUpdate = files.length; + lastUpdateTime = now; + } + if (done) { + writeCachedFileList(); + } else { + load(todo.shift(), callback); + } + } + load(todo.shift(), callback); + } + function addFileSystems() { + window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, + addFileSystem, errorCallback); + window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, + addFileSystem, function () {}); + } + this.scan = function () { + if (fileSystems !== undefined) { + return; + } + fileSystems = {}; + readCachedFileList(function () { + addFileSystems(); + }); + }; + this.load = load; + this.files = files = []; + } + function finishOperation(proxy, operation, callback, scope) { + if (operation) { + var i = 0, + recs = operation.getRecords(), + len = recs.length; + + for (i; i < len; i += 1) { + recs[i].commit(); + } + operation.setSuccessful(); + + Ext.callback(callback, scope || proxy, [operation]); + } + } + return { + extend: "Ext.data.proxy.Proxy", + xtype: 'filesystemproxy', + constructor: function (config) { + this.initConfig(config); + scanner = new Scanner(this); + this.startScanningDirectories = function () { + scanner.scan(); + }; + this.getRecord = function (url, callback) { + var id = scanner.getFileId(url); + if (id !== -1) { + return callback(scanner.files[id]); + } + window.resolveLocalFileSystemURI(url, + function (fileentry) { + scanner.load(fileentry, function (id) { + Ext.getStore('FileStore').load(); + callback(scanner.files[id]); + }); + }, + function (evt) { + callback(null); + }); + }; + }, + + create: function (operation, callback, scope) { + finishOperation(this, operation, callback, scope); + }, + + read: function (operation, callback, scope) { + var me = this, + records = scanner.files; + if (!records) { + return; + } + // return model instances in a resultset + operation.setResultSet(new Ext.data.ResultSet({ + //total: records.length, + count: records.length, + records: records, + success: true + })); + + // announce success + operation.setSuccessful(); + operation.setCompleted(); + + // finish with callback + Ext.callback(callback, scope || me, [operation]); + }, + + update: function (operation, callback, scope) { + finishOperation(this, operation, callback, scope); + }, + + destroy: function (operation, callback, scope) { + finishOperation(this, operation, callback, scope); + } + }; +}())); + +Ext.define("WebODFApp.model.FileSystem", { + extend: 'Ext.data.Model', + config: { + idProperty: 'id', + fields: [ { + name: "id", + type: "auto" + }, { + name: "fullPath", + type: "string" + }, { + name: "fileName", + type: "string" + }, { + name: "size", + type: "int" + } ] + } +}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/store/FileStore.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/store/FileStore.js new file mode 100644 index 0000000000..d2932c8989 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/store/FileStore.js @@ -0,0 +1,30 @@ +/*global Ext*/ +Ext.define('WebODFApp.store.FileStore', { + extend: 'Ext.data.Store', + config: { + storeId: 'FileStore', + model: 'WebODFApp.model.FileSystem', + autoLoad: true, + grouper: { + groupFn: function (record) { + "use strict"; + return record.get('fileName')[0].toUpperCase(); + } + }, + proxy: { + xtype: 'filesystemproxy' + }, + sorters: function (a, b) { + "use strict"; + a = a.get('fileName').toUpperCase(); + b = b.get('fileName').toUpperCase(); + if (a > b) { + return 1; + } + if (a < b) { + return -1; + } + return 0; + } + } +}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FileDetail.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FileDetail.js new file mode 100644 index 0000000000..b79876c6de --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FileDetail.js @@ -0,0 +1,122 @@ +/*global Ext, app, runtime, xmldom, odf*/ +runtime.loadClass("xmldom.XPath"); +runtime.loadClass("odf.Style2CSS"); +Ext.define('WebODFApp.view.FileDetail', (function () { + "use strict"; + var panel, + style2CSS = new odf.Style2CSS(), + xpath = new xmldom.XPath(), + fileDetail, + title, + image, + list, + emptyImageUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAAXNSR0IArs4c6QAAAAtJREFUCB1jYGAAAAADAAFPSAqvAAAAAElFTkSuQmCC"; + function getTitle(body) { + var ps, + title; + ps = xpath.getODFElementsWithXPath(body, + ".//text:h", style2CSS.namespaceResolver); + title = ""; + if (ps && ps.length) { + title = ps[0].nodeValue; + } else { + ps = xpath.getODFElementsWithXPath(body, + ".//text:p", style2CSS.namespaceResolver); + if (ps && ps.length) { + title = ps[0].nodeValue; + } + } + return title; + } + function metaToJSON(body, meta) { + var json = [], + title = body && getTitle(body), + e = meta && meta.firstChild, + name; + if (title) { + json.push({name: "title", value: title}); + } + while (e) { + if (e.nodeType === 1 && e.textContent) { + if (e.localName === "user-defined") { + name = e.getAttributeNS( + "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", + "name" + ); + } else { + name = e.localName; + } + json.push({ + name: name, + value: e.textContent + }); + } + e = e.nextSibling; + } + return json; + } + return { + extend: 'Ext.Panel', + xtype: 'filedetail', + config: { + title: 'File details', + layout: 'vbox', + items: [{ + id: "title", + dock: 'top', + xtype: 'toolbar' + }, { + id: 'details', + xtype: 'container', + layout: 'hbox', + flex: 1, + items: [{ + id: 'thumbnail', + xtype: 'image', + width: 256, + maxWidth: "50%" + }, { + id: 'metalist', + xtype: 'list', + store: { + fields: ["name", "value"], + data: [] + }, + itemTpl: "{name}: {value}", + flex: 1 + }] + }], + listeners: { + initialize: function () { + fileDetail = this.query("#details")[0]; + title = this.query("#title")[0]; + image = fileDetail.query('#thumbnail')[0]; + list = fileDetail.query('#metalist')[0]; + } + } + }, + updateRecord: function (record) { + if (record) { + fileDetail.setMasked({ + xtype: 'loadmask', + message: 'Loading...' + }); + title.setTitle(record.get('fileName')); + } + }, + canvasListener: function (odfcanvas) { + var view = this, + odfcontainer = odfcanvas.odfContainer(), + part = odfcontainer.getPart("Thumbnails/thumbnail.png"), + metajson = []; + metajson = metaToJSON(odfcontainer.rootElement.body, + odfcontainer.rootElement.meta); + part.onstatereadychange = function (part) { + image.setSrc(part.url || emptyImageUrl); + }; + part.load(); + list.getStore().setData(metajson); + fileDetail.unmask(); + } + }; +}())); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FilesList.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FilesList.js new file mode 100644 index 0000000000..1a82a2e8b6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/FilesList.js @@ -0,0 +1,47 @@ +/*global Ext, app, filestore */ +Ext.define("WebODFApp.view.FilesList", { + extend: "Ext.Panel", + xtype: 'fileslist', + config: { + layout: 'fit', + items: [{ + xtype: 'list', + store: 'FileStore', +/* + store: { + fields: ['fileName', 'fullPath'], + grouper: { + groupFn: function (record) { + "use strict"; + return record.get('fileName')[0].toUpperCase(); + } + }, + data: [ + {fileName: 'Cowper', fullPath: '-'}, + {fileName: 'Everett', fullPath: '-'}, + {fileName: 'University', fullPath: '-'}, + {fileName: 'Forest', fullPath: '-'} + ] + }, +*/ +/* + listeners: { + 'itemtap': function (view, number, item) { + "use strict"; + var record = view.getStore().getAt(number); + if (record) { + Ext.app.dispatch({ + controller: 'Files', //app.controllers.files, + action: 'show', + id: record.getId() + }); + } + } + }, +*/ + itemTpl: '{fileName}
    {fullPath}', + grouped: true, + indexBar: true + }] + } +}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/OdfView.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/OdfView.js new file mode 100644 index 0000000000..2098304d32 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/OdfView.js @@ -0,0 +1,170 @@ +/*global Ext, runtime, core, odf, window, FileReader, PhoneGap, gui*/ +runtime.loadClass('odf.OdfCanvas'); + +Ext.define('WebODFApp.view.OdfView', (function () { + "use strict"; + var currentPath, + overridePath, + overridePathPrefix = "odf:", + data, + globalreadfunction, + globalfilesizefunction, + odfcanvas, + zoom = 1, + dom, + canvasListeners = [], + view; + function signalCanvasChange() { + var i; + for (i = 0; i < canvasListeners.length; i += 1) { + canvasListeners[i](odfcanvas); + } + } + function initCanvas() { + var cmp; + if (globalreadfunction === undefined) { + // overload the global read function with one that only reads + // the data from this canvas + globalreadfunction = runtime.read; + globalfilesizefunction = runtime.getFileSize; + runtime.read = function (path, offset, length, callback) { + if (path !== overridePath) { + globalreadfunction.apply(runtime, + [path, offset, length, callback]); + } else { + callback(null, data.slice(offset, offset + length)); + } + }; + runtime.getFileSize = function (path, callback) { + if (path !== overridePath) { + globalfilesizefunction.apply(runtime, [path, callback]); + } else { + callback(data.length); + } + }; + dom = Ext.getCmp('webodf').element.dom; + odfcanvas = new odf.OdfCanvas(dom); + odfcanvas.addListener("statereadychange", signalCanvasChange); + } + } + function load(path) { + if (path === currentPath) { + return; + } + currentPath = path; + overridePath = overridePathPrefix + path; + data = null; + window.resolveLocalFileSystemURI("file://" + path, function (file) { + var reader = new FileReader(); + // so far phonegap is very limited, ideally it would implement + // readAsArrayBuffer and slice() on the File object + // right now, it has a dummy function, hence breaking simple + // detection of which features are implemented + if (reader.readAsArrayBuffer + && (typeof PhoneGap === "undefined")) { + reader.onloadend = function (evt) { + data = evt.target.result; + odfcanvas.load(overridePath); + }; + reader.readAsArrayBuffer(file); + } else { + reader.onloadend = function (evt) { + var b = new core.Base64(); + data = evt.target.result; + data = data.substr(data.indexOf(",") + 1); + data = b.convertBase64ToUTF8Array(data); + odfcanvas.load(overridePath); + }; + reader.readAsDataURL(file); + } + }, function () { + runtime.log("COULD NOT RESOLVE " + path); + }); + } + function tapHandler(button) { + var id = button.getId(), + dom = Ext.getCmp('odfcontainer').element.dom, + width = dom.offsetWidth, + height = dom.offsetHeight; + if (id === 'zoomin') { + odfcanvas.setZoomLevel(odfcanvas.getZoomLevel() * 1.25); + } else if (id === 'zoomout') { + odfcanvas.setZoomLevel(odfcanvas.getZoomLevel() * 0.8); + } else if (id === 'fit-best') { + odfcanvas.fitToContainingElement(width, height); + } else if (id === 'fit-width') { + odfcanvas.fitToWidth(width); + } else if (id === 'fit-height') { + odfcanvas.fitToHeight(height); + } else if (id === 'next') { + odfcanvas.showNextPage(); + } else if (id === 'previous') { + odfcanvas.showPreviousPage(); + } + } + return { + extend: 'Ext.Container', + xtype: 'odfview', + id: 'odfcontainer', + config: { + scrollable: 'both', + items: [{ + id: 'webodf' + }, { + xtype : 'toolbar', + docked: 'bottom', + scrollable: false, + defaults: { + iconMask: false, + ui : 'plain', + handler: tapHandler + }, + items: [ + { id: 'previous', icon: 'go-previous.png'}, + { id: 'next', icon: 'go-next.png' }, + { id: 'zoomin', icon: 'ZoomIn.png'}, + { id: 'zoomout', icon: 'ZoomOut.png' }, + { id: 'fit-best', icon: 'zoom-fit-best.png' }, + { id: 'fit-height', icon: 'zoom-fit-height.png' }, + { id: 'fit-width', icon: 'zoom-fit-width.png' } + ], + layout: { + pack : 'center', + align: 'center' + } + }], + listeners: { + painted: function () { + // make sure the viewport is the right size + odfcanvas.setZoomLevel(odfcanvas.getZoomLevel()); + } + } + }, + updateRecord: function (record) { + view = this; + initCanvas(); + load(record.get('fullPath')); + }, + addCanvasListener: function (listener) { + canvasListeners.push(listener); + }, + hideCanvas: function () { + if (dom) { + dom.style.display = "none"; + } + if (view) { + view.setMasked({ + xtype: 'loadmask', + message: 'Loading...' + }); + } + }, + showCanvas: function () { + if (view) { + view.unmask(); + } + dom.style.display = "inline-block"; + odfcanvas.setZoomLevel(odfcanvas.getZoomLevel()); + } + }; +}())); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/app/views/Viewport.js b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/Viewport.js new file mode 100644 index 0000000000..3023ddc017 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/app/views/Viewport.js @@ -0,0 +1,54 @@ +/*global Ext, app*/ +Ext.define("WebODFApp.view.Viewport", { + extend: "Ext.navigation.View", + xtype: "mainview", + requires: [ + "WebODFApp.view.FilesList", + "WebODFApp.view.FileDetail" + ], + config: { + fullscreen: true, + autoDestroy: false, + navigationBar: { + items: [{ + xtype: 'button', + id: 'openButton', + text: 'Open', + align: 'right', + hidden: true + }] + }, + items: [ + { title: 'Files', xtype: 'fileslist' } + ] + } +/* + initComponent: function () { + + //put instances of cards into app.views namespace + Ext.apply(app.views, { + filesList: new app.views.FilesList(), + fileDetail: new app.views.FileDetail(), + odfView: new app.views.OdfView() + }); + //put instances of cards into viewport + Ext.apply(this, { + items: [ + app.views.filesList, + app.views.fileDetail, + app.views.odfView + ] + }); + app.views.Viewport.superclass.initComponent.apply(this, arguments); + }, + listeners: { + afterlayout: function () { + if (app.stores.filesystem.initialUrl) { + app.openUrl(app.stores.filesystem.initialUrl); + app.stores.filesystem.initialUrl = undefined; + } + } + } + }; +*/ +}); diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/go-next.png b/apps/files_odfviewer/src/webodf/programs/touchui/go-next.png new file mode 100644 index 0000000000..c4da8a9a3d Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/touchui/go-next.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/go-previous.png b/apps/files_odfviewer/src/webodf/programs/touchui/go-previous.png new file mode 100644 index 0000000000..68ed8a13eb Binary files /dev/null and b/apps/files_odfviewer/src/webodf/programs/touchui/go-previous.png differ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/index.html b/apps/files_odfviewer/src/webodf/programs/touchui/index.html new file mode 100644 index 0000000000..49b8a31f44 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/index.html @@ -0,0 +1,22 @@ + + + + + WebODF + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/scripts.js b/apps/files_odfviewer/src/webodf/programs/touchui/scripts.js new file mode 100644 index 0000000000..2683bc83b4 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/scripts.js @@ -0,0 +1,130 @@ +/*global alert, app, window, runtime*/ +var LocalFileSystem = { + PERSISTENT: 0, + TEMPORARY: 1 +}; +function FileWriter(fullPath) { + "use strict"; + this.write = function (data) { + data = runtime.byteArrayFromString(data, "utf8"); + runtime.writeFile(fullPath, data, function () {}); + }; +} +function FileEntry(name, fullPath) { + "use strict"; + this.isFile = true; + this.isDirectory = false; + this.name = name; + this.fullPath = fullPath; + this.file = function (onsuccess, onerror) { + function File(fullPath) { + this.name = name; + this.fullPath = fullPath; + this.type = ""; + this.size = -1; + this.lastModifiedDate = -1; + } + var file = new File(fullPath); + try { + onsuccess(file); + } catch (e) { + alert("Error on determining file properties: " + e); + onerror(e); + } + }; + this.createWriter = function (onsuccess, onerror) { + onsuccess(new FileWriter(fullPath)); + }; +} +function FileReader() { + "use strict"; + var fr = this; + this.readAsArrayBuffer = function (file) { + var path = file.fullPath; + if (path.substr(0, 7) === "file://") { + path = path.substr(7); + } + runtime.readFile(path, 'binary', function (error, data) { + fr.onloadend({target: {result: data}}); + }); + }; + this.readAsText = function (file) { + var path = file.fullPath; + if (path.substr(0, 7) === "file://") { + path = path.substr(7); + } + runtime.readFile(path, 'utf8', function (error, data) { + fr.onloadend({target: {result: data}}); + }); + }; +} +var DirectoryReader; +function DirectoryEntry(name, fullPath) { + "use strict"; + this.isFile = false; + this.isDirectory = true; + this.name = name; + this.fullPath = fullPath; + this.createReader = function () { + var reader = new DirectoryReader(fullPath); + return reader; + }; +} +function DirectoryReader(fullPath) { + "use strict"; + this.readEntries = function (onsuccess, onerror) { + window.setTimeout(function () { + var entries = []; + entries[entries.length] = new FileEntry("welcome.odt", + "welcome.odt"); + entries[entries.length] = new FileEntry("Traktatenblad.odt", + "Traktatenblad.odt"); + entries[entries.length] = new FileEntry("DanskTest01.odt", + "DanskTest01.odt"); + entries[entries.length] = new FileEntry("plugfest-gouda.odp", + "plugfest-gouda.odp"); + entries[entries.length] = new FileEntry("OpenDocument-v1.2.odt", + "OpenDocument-v1.2.odt"); + entries[entries.length] = new FileEntry("OpenDocument-v1.2-part1.odt", + "OpenDocument-v1.2-part1.odt"); + entries[entries.length] = new FileEntry("OpenDocument-v1.2-part2.odt", + "OpenDocument-v1.2-part2.odt"); + try { + onsuccess(entries); + } catch (e) { + onerror(e); + } + }, 1); + }; +} +window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { + "use strict"; + var p = path.lastIndexOf("/"), + name = (p === -1) ? path : path.substr(p + 1); + onsuccess(new FileEntry(name, path)); +}; +window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { + "use strict"; + var dirs = [], shared, subfolder, path; + try { + if (filesystem === LocalFileSystem.PERSISTENT) { + path = ""; + onsuccess({ + name: "root", + root: new DirectoryEntry("root", path) + }); + } else { + onerror("not defined"); + } + } catch (e) { + onerror(e); + } +}; +var device = {}; +/* + * override launch function to quickly open a file for testing +onApplicationLaunch = function (app) { + "use strict"; + app.openUrl("plugfest-gouda.odp"); +}; +*/ diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.css b/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.css new file mode 100644 index 0000000000..7227e268be --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.css @@ -0,0 +1 @@ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;position:relative;-webkit-text-size-adjust:none}body.x-desktop{overflow:hidden}*,*:after,*:before{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);-webkit-user-select:none;-webkit-touch-callout:none;-webkit-user-drag:none}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-ios{-webkit-backface-visibility:hidden}body.x-android.x-phone{font-size:116%}body.x-android.x-phone.x-silk{font-size:130%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}input,textarea{-webkit-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-fullscreen{position:absolute !important}.x-desktop .x-body-stretcher{margin-bottom:0px}.x-mask{position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:-webkit-box;display:box;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;background:rgba(0, 0, 0, 0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0, 0, 0, 0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{background:rgba(0, 0, 0, 0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold;-webkit-border-radius:0.5em;border-radius:0.5em}.x-mask .x-loading-spinner-outer{display:-webkit-box;display:box;-webkit-box-orient:vertical;box-orient:vertical;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;width:100%;min-width:8.5em;height:8.5em}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask .x-mask-message{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0;-webkit-box-flex:0 !important;max-width:13em;min-width:8.5em}.x-draggable{z-index:1}.x-dragging{opacity:0.7}.x-panel-list{background-color:#bacfe8}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#333333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{display:inline;float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{display:inline;float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#0066cc}.x-html a:visited{color:#004c99}.x-html a:focus{color:#0099ff}.x-html a:hover{color:#0099ff}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono", "lucida console", monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eeeeee}.x-html .quiet{color:#666666}.x-html .loud{color:#111111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}.x-video{background-color:#000}.x-sortable .x-dragging{opacity:1;z-index:5}.x-layout-card-item{background:#eeeeee}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-img{background-repeat:no-repeat}.x-video{height:100%;width:100%}.x-video > *{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:black url() center center no-repeat}audio{width:100%}.x-panel,.x-msgbox,.x-panel-body{position:relative}.x-panel.x-floating,.x-msgbox.x-floating,.x-form.x-floating{padding:6px;-webkit-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0, 0, 0, 0.8) 0 0.2em 0.6em;background-color:black;background-image:none}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating.x-floating-light,.x-form.x-floating.x-floating-light{background-color:#354f6e;background-image:none}.x-panel.x-floating > .x-panel-inner,.x-panel.x-floating .x-scroll-view,.x-panel.x-floating .x-body,.x-msgbox.x-floating > .x-panel-inner,.x-msgbox.x-floating .x-scroll-view,.x-msgbox.x-floating .x-body,.x-form.x-floating > .x-panel-inner,.x-form.x-floating .x-scroll-view,.x-form.x-floating .x-body{background-color:#fff;-webkit-border-radius:0.3em;border-radius:0.3em}.x-anchor{width:1.631em;height:0.7em;position:absolute;left:0;top:0;z-index:1;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em 0.7em;overflow:hidden;background-color:black;-webkit-transform-origin:0% 0%}.x-anchor.x-anchor-top{margin-left:-0.816em;margin-top:-0.7em}.x-anchor.x-anchor-bottom{-webkit-transform:rotate(180deg);margin-left:0.816em;margin-top:0.6em}.x-anchor.x-anchor-left{-webkit-transform:rotate(270deg);margin-left:-0.7em;margin-top:-0.1em}.x-anchor.x-anchor-right{-webkit-transform:rotate(90deg);margin-left:0.7em;margin-top:0}.x-floating.x-panel-light:after{background-color:#354f6e}.x-button{-webkit-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.4em;border-radius:0.4em;display:-webkit-box;display:box;-webkit-box-align:center;box-align:center;min-height:1.8em !important;padding:.3em .6em;position:relative;overflow:hidden;-webkit-user-select:none}.x-button,.x-toolbar .x-button{border:1px solid #999999;border-top-color:#a6a6a6;color:black}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-color:#ccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #dedede), color-stop(100%, #bababa));background-image:-webkit-linear-gradient(#ffffff,#dedede 2%,#bababa);background-image:linear-gradient(#ffffff,#dedede 2%,#bababa)}.x-button .x-button-icon.x-icon-mask,.x-toolbar .x-button .x-button-icon.x-icon-mask{background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(2%, #121212), color-stop(100%, #000000));background-image:-webkit-linear-gradient(#4d4d4d,#121212 2%,#000000);background-image:linear-gradient(#4d4d4d,#121212 2%,#000000)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-color:#c4c4c4;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ababab), color-stop(10%, #b8b8b8), color-stop(65%, #c4c4c4), color-stop(100%, #c6c6c6));background-image:-webkit-linear-gradient(#ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:linear-gradient(#ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:2.1em;height:2.1em;background-repeat:no-repeat;background-position:center;display:block}.x-button .x-button-icon.x-icon-mask{width:1.3em;height:1.3em;-webkit-mask-size:1.3em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-hasbadge .x-badge,.x-hasbadge .x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round,.x-button.x-button-action-round,.x-button.x-button-confirm-round,.x-button.x-button-decline-round{-webkit-border-radius:0.9em;border-radius:0.9em;padding:0.1em 0.9em}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;box-orient:horizontal}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;box-orient:vertical}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;box-direction:reverse}.x-iconalign-center{-webkit-box-pack:center;box-pack:center}.x-iconalign-left .x-button-label,.x-iconalign-left .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-left .x-badge{margin-left:0.3em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-right .x-badge{margin-right:0.3em}.x-iconalign-top .x-button-label,.x-iconalign-top .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-top .x-badge{margin-top:0.3em}.x-iconalign-bottom .x-button-label,.x-iconalign-bottom .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-bottom .x-badge{margin-bottom:0.3em}.x-button-label,.x-hasbadge .x-badge{-webkit-box-flex:1;box-flex:1;-webkit-box-align:center;box-align:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;font-weight:bold;line-height:1.2em;display:block;overflow:hidden}.x-toolbar .x-button{margin:0 .2em;padding:.3em .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button .x-badge{font-size:.7em}.x-button-small,.x-button.x-button-action-small,.x-button.x-button-confirm-small,.x-button.x-button-decline-small,.x-toolbar .x-button-small,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-decline-small{-webkit-border-radius:0.3em;border-radius:0.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button.x-button-action-small .x-button-label,.x-button.x-button-confirm-small .x-button-label,.x-button.x-button-decline-small .x-button-label,.x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-button-small .x-badge,.x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-action-small .x-badge,.x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-confirm-small .x-badge,.x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-decline-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button.x-button-action-small .x-button-label,.x-toolbar .x-button.x-button-confirm-small .x-button-label,.x-toolbar .x-button.x-button-decline-small .x-button-label,.x-toolbar .x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button-small .x-badge,.x-toolbar .x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-action-small .x-badge,.x-toolbar .x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-confirm-small .x-badge,.x-toolbar .x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-decline-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-button.x-button-action-small .x-button-icon,.x-button.x-button-confirm-small .x-button-icon,.x-button.x-button-decline-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon,.x-toolbar .x-button.x-button-action-small .x-button-icon,.x-toolbar .x-button.x-button-confirm-small .x-button-icon,.x-toolbar .x-button.x-button-decline-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.8em;z-index:1}.x-button-forward:before,.x-button-forward:after,.x-button-back:before,.x-button-back:after{content:"";position:absolute;width:0.773em;height:1.8em;top:-0.1em;left:auto;z-index:2;-webkit-mask:0.145em 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:0.773em 1.8em;overflow:hidden}.x-button-back,.x-toolbar .x-button-back{margin-left:0.828em;padding-left:.4em}.x-button-back:before,.x-toolbar .x-button-back:before{left:-0.693em}.x-button-back:after,.x-toolbar .x-button-back:after{left:-0.628em}.x-button-forward,.x-toolbar .x-button-forward{margin-right:0.828em;padding-right:.4em}.x-button-forward:before,.x-button-forward:after,.x-toolbar .x-button-forward:before,.x-toolbar .x-button-forward:after{-webkit-mask:-0.145em 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat}.x-button-forward:before,.x-toolbar .x-button-forward:before{right:-0.693em}.x-button-forward:after,.x-toolbar .x-button-forward:after{right:-0.628em}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;-webkit-border-radius:none;border-radius:none;min-height:0;text-shadow:none;line-height:auto;height:auto;padding:0.5em}.x-button.x-button-plain > *,.x-toolbar .x-button.x-button-plain > *{overflow:visible}.x-button.x-button-plain .x-button-icon,.x-toolbar .x-button.x-button-plain .x-button-icon{-webkit-mask-size:1.4em;width:1.4em;height:1.4em}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-gradient(radial, 50% 50%, 0, 50% 50%, 24, color-stop(0%, rgba(119,178,248,0.7)), color-stop(100%, rgba(119,178,248,0)));background-image:-webkit-radial-gradient(rgba(119,178,248,0.7),rgba(119,178,248,0) 24px);background-image:radial-gradient(rgba(119,178,248,0.7),rgba(119,178,248,0) 24px)}.x-button.x-button-plain.x-button-pressing .x-button-icon.x-button-mask,.x-button.x-button-plain.x-button-pressed .x-button-icon.x-button-mask,.x-toolbar .x-button.x-button-plain.x-button-pressing .x-button-icon.x-button-mask,.x-toolbar .x-button.x-button-plain.x-button-pressed .x-button-icon.x-button-mask{background-color:#fff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e6e6e6), color-stop(10%, #f2f2f2), color-stop(65%, #ffffff), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(#e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:linear-gradient(#e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff)}.x-segmentedbutton .x-button{margin:0;-webkit-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-segmentedbutton .x-button.x-last{-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-segmentedbutton .x-button:not(:first-child){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{-webkit-border-radius:1em;border-radius:1em;-webkit-background-clip:padding;background-clip:padding-box;padding:.15em .25em;z-index:2;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0;-webkit-box-shadow:#000 0 .1em .2em;overflow:hidden;color:#fff;border:2px solid #fff;position:absolute;width:auto;min-width:2em;height:2em;line-height:1.2em;font-size:.6em;top:-0.15em;right:0px;max-width:100%;background-color:#990000;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e60000), color-stop(50%, #b30000), color-stop(51%, #990000), color-stop(100%, #800000));background-image:-webkit-linear-gradient(#e60000,#b30000 50%,#990000 51%,#800000);background-image:linear-gradient(#e60000,#b30000 50%,#990000 51%,#800000);display:inline-block}.x-tab .x-button-icon.action,.x-button .x-button-icon.x-icon-mask.action{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFI0lEQVRoBe2YW4hVVRjHZ0yzq6lFEaMlE0PShYRAJIl6iEqKHnqI6WJB0IvdICkfEk0aIyo0KFCph8giCitI7CkoohQL7SoZDaQmXSgKo4uWNf1+zt7DOXvOOXuvvc85bc+cD36ssy/r+77/Xmt9e+3TOzIy0jORbNJEEqvWruBOH/HuCHdHuMOeQOmmdO+ozaA5oxXPunSC2Re4MbgCNiB6vvqbKbx0giNxp9BeBU/BIJqnRecLN2UVrLDj4GIYgscRfSltYSuzYMUdA/0wCI8ieglM5XduK7vgWJhTegGshucRfQHkyj1XpziLNrfmOh2ug1dhMaJn0gbZZDpNpsexQb2y3azfKXCAwns4W5dMd7m2B2ANLCT/x/A/nKknN5mUhWFp1g4Z7vM14jrbBZvgEwi1tAdkDEf3ZrgI0S/RrkP4IdqGpuA+cJo0yw7iyNfJmzAcMrokfjp93HC4XrPYCdzkgPXDPPqvJN7eRh0VrBWqfKMuev6k3Qzr4SP4HWqOFIkZ73iYA/NhLpwPZ4LLS+FZzUp+GtwAA/heS/sGwv+irWnXc9bdTRF20/8eOBWmEKwnCectOrPhSlgF2+Bb+Bl+AxP8B/6FvLn8Td8fYQXMSubgsVZU8Cv4mAeNhC7k+jLYCopzrRURlvZA9P8WLIJJlcI5zi1Ypw+Dr4oqp3EAzlsbLCjfg1PeEUxLtlnXXU4/wQboq8gpl2BHx2l5UuyosuW8I6rQb8Bp1iwRefy4VN6FReaopU3pX7jnhwSO7MmVIiNnJ3L+DtgHCm3ltA0RH4/26rhKk1tdu4kr7yeuHkKgU3rMqI5ncfAQDIKbg14oi1nJv4OvTShthC9LjmTyGB8XwhZw+oQ8+Xbc68C8AOboK6+YYPpfDV+B06YdAkJiuMtzhvrOP1JYafMLpu/Z8CmEJNGOe60fz0J/cjZmWcP0G2+sWZ/aUnCqhFosOq7gyf6uOT888th+Ot0HmxF7MOkgt2AcXQNLkg5rHPv+dffjVvPX6PdeWtf7MJhUssD578ZtEGL6sY4MIfTjeh1zCWZ0Z+DwQXAkapkjtzviPdoPYB+JuJVMNfy7QQkR7MbGPfRaYhi7ruUSjLcbwe1k0tw2vgivwy6C70/ekPE4JK+N+HySWDuz+A5xXOnvlsqD6Lf/QjwBnxNc4a02YwzBeuIdyBosWDDT7RKcn1MRYA+/V8ImAv9Rcb5VP53ufoQ8AB8S0+PMFiwYz5fDzCjCF7SLCbojOm514zZ3HViYLIZVxmD4h8B0rtWtFXkEn4tTv22thPe2SawVeDs8TTz/NqoyhLqDGoC7wervt3lNCxKMY/fIc+BLuJXgn9G20pyuVuA1sJF4vt7GjHx8nZnT7XAXzIXnoK4FCcbLVHAqLW+DWF8v78Aq2EY8v7zGDK2+EmfBI3AtTAPNTU1dCxXs/a6ht+t6bM4FNykvw/0IdYSrDLHu8iyeQ7Cg6mLKQahgd0pbSOJwit/cl6Np6p+BrxGn6hNUp1z3m/tOWAH+DrIgwSTQcBcTFLnOzcRwSjZ6j/vdvQyCxRrSanu0mWvZqp3LjkbBuYTGnSac4CxreCQqJPFD+r/bhq+dtOSyCO7DyWzIcm9avKLXXb+FcskiYjlBfB0lP9KLJp+nv6N7ZL+cp7N9sgg+L6/zMvabcEWrK7iM07CZOXVHuJlPs4y+rNJ74JkyJpczp62N+vWOfpw0uqWzrnXXcGeN53g13REe/0w660x3hDtrPMer+Q9LNCcV91c+jgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.add,.x-button .x-button-icon.x-icon-mask.add{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAABqUlEQVRoBe2awWnDUBBE843B4NxcQSAFOC4lJeTkoxtJDykgvRhcgCFNJCFgIs+ChEHSJX93YT6ZD4ssmR3NztNFH5Wu6+6iVynlEZpbp+4J3s5OjWm7DRxZuMMCdUB9oyzNmrJe01hEejMtM5exIh6bCI3JbFkDT27EckEDs5DI8iHCWcmy6IowC4ksHyKclSyLrgizkMjyIcJZybLoijALiSwfIpyVLItuOGFso/xiuEvAgJdeK0DqJrHEhtsTTh9ul9y/ChR2KE+Y1ruDt2ccI7d6PszcK+oFFblWELt3Cn6i/8epMW5/W+LKGrUZ/0NwboF5QxuPsfY8dmOxJs41cBOYHCZF2BFeE60i3AQmh0kRdoTXRKsIN4HJYVKEHeE10frvCNvr4RH1HojH3rGHr3hqA7VdkxPKvuKJ3AA4hn7BM3xxA5N71Fdv1gz/tax3P+hFHmsJwM/8wraMadqOh5GuXda76rVqNWb7wgeevQvRRQ1MBCPFiginxEokKsJEMFKsiHBKrESiIkwEI8WKCKfESiQqwkQwUqyIcEqsRKIiTAQjxcoVrP83/9czD9EAAAAASUVORK5CYII=')}.x-tab .x-button-icon.arrow_down,.x-button .x-button-icon.x-icon-mask.arrow_down{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.arrow_left,.x-button .x-button-icon.x-icon-mask.arrow_left{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGMDZEQTFBREFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGMDZEQTFBQ0FDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FXGmxAAAAghJREFUeNrsm09ERFEUxt+rxBAxqyFm1SqiRYpMSpFapUVaRGpTRIpIbWLaFJEoRZtilChRWiRKsyklilYRERERERGZvsN57Wfmvnnnznkfv+WM+bn3e/ePN24mk3E0pcRRllC42FOWy4dc1w30R+fz3LFthEs1TelZ0KlBuAIcgmRgHS5gqlm2RsNTmqbvrUlZycLT4BhUiliWfEwEbII+UeuwT4nzqNZq2Gm1gTu/ZaUIj4NTEBW7tTTY1zUwKH4vbaive6BBw2kpAa6DkA1CeBicgZhVx8McUg5WWNi+83CWiXFfE9ZeAGQR6ukBqJKyu/Gzw7TcXEiS9UuYbiWWeU8ckXYqMT2lozyFW6SeOU0K1/FhPS75RsHUlKbj3KV0WRPC1Nd5sCuxr6anNPV12zFwk2jLCCdtk81XeAIsahL+BVOgH3xrEPayA5rAixZhyj2oB2ktwpR30A5WtQh7vR4DQ+BHg7CXLdAMXrUIU26411dahClvoBVsaBF2uMsjYFRCrwt5a7kOOnjUVQg7vE43cr9VCDu8I6Nep7QIO7z3HgCTvHYXvbCXJe71hxZhyjmv1w9ahCnP/DDb1yLs9boXzGgR9rIAusCnFmHKCff6UYsw5Ymlj7QIU75AN5gz9YVuLu8eB/S+dA+v1+l83pe2Sfg/BRe2OeGfPELhUDgUtip/AgwAw4tbozZtKFwAAAAASUVORK5CYII=')}.x-tab .x-button-icon.arrow_right,.x-button .x-button-icon.x-icon-mask.arrow_right{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGMDZEQTFCMUFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGMDZEQTFCMEFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+xvZexwAAAhhJREFUeNrsm8FHRFEUxu9rxhARsxqiVauYXWoTpTYtUkRqlWkz0WaiTW2iNi3atGhTm4k2E5GYSJRaZcZQtIqIISIiYhgyfZdv/oF59913X+cdfst5733u+c495743XqvVUpKiSwmLWPB/j2QnP/I8L9SH9lN3/KxwQlpKT4FtaR7eAhegR1LRmgEVMCCpSg+CGtNczLbUC8pgQ9I+rCv3LiiBbkmNxwJ93S+p08qCRzAhqbVMg2tQkNRLa1/vg6ILvrY5POTAXdi+tj0tDbOYjUoaDzPgBuQlzcMpcEhSkg4A8lztjBTBin6u0d8iBOvoYwXPSRGsuEcXuWcnJAhuR4G+TksRrGOMfXhWimDFjqzCyUuE4LavS5yxExIEt0OfopRN+DpKbx6MHAtHSfAeWPN7kWQEhDbAMjg1cTHXBdfBLHiSUKXvwZBJsS4LPgCT4NP0hV1L6SZYAcdB3cAlwe9gDlQlTEsP9Gs16Bu5IPgIjIOP/34AoP26Ss82bd00LA/r1Vzk1mM1whCsfTrPpsJ62E7pE/q1HpaPbAn+Betgib1xaGEjpb+Ywrcu7H9BC35m8//mSncTZEqfgRGXxAYpeJNp3FCOhemU/ub+euXqzGlS8AuYBq8unyiYSulLNv9OizUleIcr+6MiEF4n3x7ze2n9OkSfE5/bfmg/30v7ERxaWBcc5Yj/5BELjgXHgiMVfwIMAGPkXbHq6ClAAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.arrow_up,.x-button .x-button-icon.x-icon-mask.arrow_up{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDQUZBQUM3NEFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDQUZBQUM3M0FDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+ar3jxgAAAbFJREFUeNrs2j9ExGEcx/H71YmmpoiIaIq4KSKi6dabbo1oiqamm1qboimiNZpuuikiIqLppiPipqYjIuLp+/D95vy6X/frfr/n730e3sst53XP9x7u+V2ilKpM05qpTNkCGGCAAQYYYIABBhhggAEGeNSqpl9IkiQKWNbvfBc7PDdNIz1PPVK7Trd+OMPrRr8l9Uat2nT9+CyCW4yVnnnHowTXqa8UWHcdI3iNGozASscxgReo7h9YxTtfjwXcHoOVBjwJQYNPcmKlLk9EkODGP7FSO0TwOvU+IVjxZAQD1iPZK4CVGiGAZ6lOCVjFE7LhO/i0JKzUK3KImQY3S8ZKHZ4cr8A16sMQWPHkeANepF4MYqWmD2A9arcWsIonqOYafGYJK73yRDkB71nGSnd5r4jKBG9Sn47AunOb4CWq7xAr7dsA61G69wCreMK2TIMvPMFKfZ44I+ADz7DSQ9YhVgS87fiQGtdlmeBlvkNWnndYBljfGT8FgJVDbKco+CoQrBp6mrEyKfgoMOyvpxlZ4CT9vcXj0shWNe8nE8vCfzwABhhggAEGGGCATa1vAQYAZekAmr8OukgAAAAASUVORK5CYII=')}.x-tab .x-button-icon.compose,.x-button .x-button-icon.x-icon-mask.compose{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAF/0lEQVRoBe2aW4hVVRjH54xa6nSzm92sHiZNorJowMpxrDEoyECiUUpztIkeeumpoCB6rAwi6FHwIXqKXkqiEE0no0QNLWwyspmGsruWlVqp0+9/2t9hz3Lty+mcfTnpB/9Za397Xf7//a219lr7TGVsbKztZLL2k0mstJ4S/H+P+ESfwEqlMhn/VNAJpoOjoGibAIFfwDbWnT/DZOCrex34D4b9vvw4wVScRKEu0AcWgQtBmYb9DvgsA6OganCWhgFwL/lHEf35v3ci/mqVFrAO8AT4FugJHge6URZsg0s3aDfOAe+H8f0INAo3gavD9928iT2bgqvBYVAWgWEeG+E1G0wwAeQ18hTZ/cDKSvROECnaBD9Iod9DFa2BMqSDEgAqjtiH8H3v4XwM32ZwlZUPp/jbLgHDoAziXA7r4aXIhsVqgZLYA8Atb9eK9BbQGRarvOwxEDdfdU9D/UiOUH9bwTixAWGJ/QmYuKhUojU6xomu4HgL3AV89ipO3ZdYlc3LJOJTsAeR1bAEr56V+J4H00Aa0/D+BNxPM0NW4Wcyvqe0G7+Gu5b9IhAexnrYq8A+4OMa55PoDaA6p0kjG1jHvVqnetBFQBxAP9CrJ27qxYm2OX25IhdlxxGoRgqzYFOxHAIvgHMbIKKF7iIwVe+yMtsA5F4CjYiVPu2+lhG/z3QRNRTeKGIIB4NKgXgEHIrhF8Xb9WuxmmVayhphLVDPgimgEdtL5VWI3RNuxH0idp17hCGlAOg924zISmyXRdbSskVYYjVnmxFZvXt14DjBLKJummuEYXU3iNsuuvyirnXam2cRddNSRJjXj1bjteAc0Ih9QeU+RG6JayTqSeUSYYhpu/griOKR1j9MGze7EXWvKRPZUaaC6VebAYltxrFUYue64nzXRQ7pfki+CDpAI6bVWJuKD9M0Ere1TFO/7jLMV+2NbTXWh8JGTDuoxYjVySqVFRFhfV15DjQqdoQ2BuoRS/mqRS0KTZ3D9KTISuxvIKrPtP5R2rjFnaP4Ek93lInsvGmC6eM00A+asRp/RTu3esRej3+G63evKZOL4HvoJ/x1MW0k3XI/0E6PR0Q3/o/AHPeee53XHO6DzDRgw5ls3fYlNZYgYHO4JmvgfVy/DjqBPhDEWuaCIXQpDOYELNaQPg4SiQXlLfmazErEvmsOpbQ9j+RlcAH4G6Qyd9jYdVPmMAx6wDEgkXOBHrK+lIqg9RWXSmy3OzTxzQcjwOrq29x1bjn3mjK1ClbR0oYF07Z2U08FfewiPV8EMK3YOu8midYCNd9DWpHVSm1clZZC8HkQ2R4Qe4Z0kpEnr5Vb36oU+TBxy2uB6rXyluK7AehAb+UsTSU46zl8BcRuBBrSg5CuzTPyf+HTfPbNaUVvKWU2kLq2BMdM15n2OmvBd0BEw3cHGPaQ0r1XwNuhe/r2vAKxG0O+cNbWg7AvdT6zvTQrqH5rXhowWYeAqmD8Z+DTqroA9IKFYDqQSewDlN2kiywsM8GQnR3gCOkQQmeRanhL4J1Av2qY6SP7XvBklmLVWZaCV9D+6eAQ0DxVVK8EZiNkPgDvAS1sQ4jV2ThTy0Qw0ZwM69sD5joVdQV5iV8P9DOOxO5DpL5j5WaZCIb9AqAV+ij4A+hw/maA/XlEkr68lpXga+ltKxgE2sDs9vZegDMrwWsQuboAPYldtieW+A8F8p6X9VDMRHA9BPIuGyd4LG8yKfuL46WdW6xJcFQDU3i96LRTGoOPBGmnligsirQWre/AxZ4C1+DrpY/3PfeKcl1Gxz3AJ1inrsR3uiquBf3AZ9/g1FFMjZXBZkBCW1Sf7WSx1NEx0bSv1QZBQ7tVoYA8jeDEf7yhXNuZ4B2gSq0qeBjuM1MJViGsB6hSK4rW598BMO6/bKPE14YAFXQ2HQWtMrwVnINAYmufjqKEmr8mOIj0bVTWSUYb/qQPbBoaRUABOQz03znLwUQTkyat/hZDpZrxGjqLi4VgMbgJ6L1XFlNUPwYKymvgACL10FPbCYJT12zRgnFbyxaVFE/7lOD459P6d/8Bhs9x6sTqrJgAAAAASUVORK5CYII=')}.x-tab .x-button-icon.delete,.x-button .x-button-icon.x-icon-mask.delete{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGcElEQVRoBdWbzYscRRjGexY1EPK9u9mVoJH4cVBPCYR8mB0IbkISyB/gOYIeFSUQQaIX8eBBDKuCsBFFxJuieFCMEb9RiZrcxKOgB7+i0RjN+vwm9Q41Nd0z1d3Vk9mGh6rufut93l93dc9katNaWlrKymytVmuD4mek7zX2YpmxqWJVwwrl2iL9qBp+LpN3okywjNYo/qh0Sjqi/ZVlxqeIdZ5HXA1HXU3xqbnDMVJGYJ+UzktMi1+le6VrY8aniMHLeeJNDdRCTWti88fCTirpSemChJHpT/Uflq6LNawah4fzwtP8aanppDQZk3sosBJNS4tSCGumf+jcMWlFjGGVGHI7D7zM12+pjRqnh+UfCKwE66SXpL8k3yDsc/4+KfmdJqfLHVMDta4bBF0IrIFrpaeloqsaQvM83S8lgyaXy2nvjdAz3KdWal5bBJ0LrAGz0rPS31KYdNA+8Y9Jtac3OVyuKjVQ+2wedB+wAqekE9Iv0iC4onNMvUelytCMdTmGTeOiGqgdhqkQugdYAdzZBakqrBXAXXlCWhkaDttnjBtb9s6at7UwwNJzp7vAOsE3KKaCfcbZwKrtP8r1oBR9p4l1Yxhb1dcfBwtMG+xCd4A5IHFHfpL8AXX7fFw8YGbDWmIlxtT19cfDBFsHWm22UVqUfpP8wFR97tbxCNjjikt1Z8PaYYMR1uwRidd5GJRyn39k8PaeCME55s4Rk9IzzAUjrNmcdEb6VwqDUu5fUv6npGsMmr47xrmUXmEu2GCcs2d4v3Y+kZqaUlbAf/J4SOKuIvocs/NNtDDBtp8L7b+lt+vgaWkU0M/IB40CFqbt3VllnQ59lu3Tyc+kpqfYZXmgJu6o5YQBln09jD07WdZSwF6JKdA0tBXWREvtMMDS6mH0d6yvoLb0sdT0lGsClpqpvW08ftt9hv2D9LVxdb6Vmn57p4SmVmreG/LYfiGwg96hwd8sE2hgqXWHweW1A4Ed9AElOTfm0MBS44E8SP/YUGAHzfQ+O6bQwFJb4TQuDexBj9v0tmkcBdvh8OmH9XUVt0nvSE1/7415kVEDtWwbVrd/PmpK9wzIsq0y+VLi6sYU1kQM3tSw1a8tpl8amKTa2s7wakAbbDsGMIypBOygdwr6C6npr4j+DMELz50hSOx+ZWAHvVvmX0mj+EaGB167Y+Hy4iaUoM7GW/sHiSvf9IYHXnhW3/KuQswxOa6SFqSqP6X6UzW2jxeeq2JqzIupNKVlyEri81K4sBVbeJ04PPGOXjH0wUsDy2i19IJ0QapTeJ2xeFPDah8mpl8KWAbc2cel36U6BacYSw3UUupORwMr8aS0KF3NOxteKGqhpqi1YWZAFLASrpdelMYJ1uCpidrWJ5nSSjQtvSyNI6wPTY1JFsRJNMqPHoMo21IjtVZeEJ9xCZYDrF0cg54pmt65z7BAp6QT0nKC9aGpvW9tOPel5WAX1KZaNrVCRtlSOwx90D13WAEsiD8nLWdYu7AwwDJwQZypUHf13wwHtWfkgwbFpDhnf/rQtyC+SeZ8Px3FnX1LPpud6KcAG5QDJtg2dZ5hdTZKi1JTC+J+MZ/K5yZ7g9KXOObHNNHvWRA/JsPzIzB9Xx53GKy1HJM41wSonxNGWLN56Wupyd+nTiv/rQYZtpyTiPELTNmHDcb5zltanTnplHRRSmlErjek60PIcJ8YF5vaHybY5vDsfizpwB4p9TLp68p5SwhXtE+sxJhU0JeUC6Y95tkF7tBn2SGd/FxK8VcAHyjPzVLP+qwZ57XEujGMrQsNAyyHfK8eYAfNM82bsw40KwJ3Sn1/teOb5/UZ48aSoyo0tcMwH3r0ATvogwrmzwWq/Pz6nsbdLpWGteIY63KQqyw0NVP7Qcvnt7nADpq1YZYzeA5iTV9T7I1S9DT2i/H75HC5yBnrT63UXLhGXAjsoNsafFaKudOvKG6zVBvWwMnlcpJ7GDQ1Umvbxue1A4EZoO2wSzToc/ptxdwgJYO1YsnpcuNRBE1twB62cUXtUGAHzTN9TsqDflPHb5OSw1rR5HYeeIXQ1ERtuc+s5bA2CthB80yHn9P8pDIrNQbbLfQKNF54GjTPLDUVPrM23tpoYAe9S8k/kjB6VdoiNQ7bLfYKNJ54UwO17LLzMW2nWA2K3vQ/we5S8N0SL5LvZHI5enCCQPnzkcU3snukd+X/YZm0/wPdHqnTTpY+CgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.organize,.x-button .x-button-icon.x-icon-mask.organize{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEdUlEQVRoBe2aS2xMURjHjbbqUaLoI7RChQUiGo9YaEqkoolIkCASSki68dixsLIVYmHbkJA03UgkFRI2QgRBKl4RgtJFK0jUI+o5fv/p68ztmUlHzpzO9PZLfjP3fOfcO9//fOeee+69E4lGo6PCZKPDJFZaQyc4N1mGI5FIMfUVkAfZMPaVwE54yqn6i+8BllQwravgAEyEv5DppsQ8gYPw3hqsJi0bNJ4El0GZzSa6iHcbjLbpsp7DDGX5V8ByyDbLJ+CdUGQLPNGQnkzj3TDFspN68BNkwhDPIY5poG/T1lBYR+LOkuW4uSeR4KXssN48grF9h20NdeukYLRL96Y6vAD2wCwwbQyFvXARPpoVA85fKnXiN4HtvP2Gf0tPG3XWUKNYT4E6PxjvD3x1EDHPZZvgxTTSDBc8gMrKbql5gKHeJh7NM6/AFu91/EVmjHGTFmN+HA3qYSoE7SuO8+zcEawY4vJdfr8Z/ljiqMS3AV2RvjpTPc7V0A623rqJv8RsnynbxDUXXieJuy/LfRmmEzSd7wKtroL2Hcc5BL4LVmRCmbheEIfmHduVQ1muQV/3BN2bJZyqaANbdm/jL+xtm4nfxKcsP08Q/zX8MxV3TDXqx+PYBGUQNHVAI9AsYrsuB9sPVflDT5xH+O7OZn8kK9msJf6G3ooFOOr66+O2NOVL6A7oP/njmmREQcN5LGhy1cLJtBwK++FSLqrVSGvPcrCZGu8DZTqTBSs+zUkarTZTUrerYh50gHYY7rSpRxZCCYTByvouS2FQK42hE9w7S/tKsOaIt/AGfoMWO3OgFLyYb8FaGByHl6C1r27jlsAh8HaN14LD1+x8jN/KNVdqlAvhgq8YfJ/DLYjVUDatk8J905HObd+Cf1rEaHTp5sSL+RacaKWWyO+8E3wLdi4g1QOOCE61x7Kt/UiGsy1jqcY7kuFUeyzF9ok6WA8ZvJjLtbQWEI/hXpLIW4N1rLyiPHV5hP9MsM4or2V7hlH+702XghWE3gAcTRKN3mjY7AZOdZbNCnAug4wTrNXSItCrmmYSZ3tGTNVAo+1nvCLOyLyeT9WC7WlqXNtUCq7vlpTlGkQMeG+Vio9j6NbxMOjtn8u7udjzaJcH1H3uLViVikCzLftqEtsKbeAyNh3LuWAdVM+yr8JsU8hgt9mvGh6ATousEKwgdcvXCMWDFap2mOYBTWK6b3YtNvYDrs9hM0i9BTgB+YMRTbvp0AS6bzaP43I7LUPaDFBvHPVmIy+ZaOp1+TkJX8Dc3/V22gUrYF1jN4L1r0T4NSPXg+sZ2dZZXgRr5m6BymCW8en6rc54BrYAXfu8CFbQmoQ0c1eYoilXw0NQp7gWZzueN8H68S44DbG/IPA9H66AL7FR12tpYk9qetOwGfSaVjcMNVAFie6iqHJv6bws2YaUfLpctYP+S5WoTVr8vjOMvphN4FN4N69Dybs6yw+OCLZ0yrByhS7DmrRaoQE0Kw5707JOf/UvH/ZKewTG/kscFrHSGbpzOHSC/wHSRhVOrpN3ggAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.refresh,.x-button .x-button-icon.x-icon-mask.refresh{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAG1ElEQVRoBc2aa6hVRRiGO17yrmloWpqhllH2wyKSEIsIo8QorLSbqVRgJd3DyFAQIyIiKQz61cUgpB+B0EWii4VkGFRUJpWKphZaaVZeutjz6FmwOnuvNbPWXvvs88HD2nvNzDfzrpn55tvrnLYjR44c1wpra2vrRr8jYC9j+KOzxmCnrTL7ng2LEN+rswbRSsH/ItL+Fwqij+8M0a0UrD5Fa0vg2c4Q3WrBik3sVj480WzRXUlwG4Lnw9OI7p08haqvXUmw2tzH8+AhRPf1RtXW1QSrz4i9CJYjepA3qrSuKFh9PeEWcE9XOtMtE0yyYYROojQfa0zRc8GZ7l9TWvJGj5LtCjdj0AYll6uD90HLQMizZKZ70vzOKjKypgpmkONQMxpGwWlwAvg9STLG8jlkip4FO/H3GKJ/DzXIK2/DQV554TIGdQaNpsNkmAAjoYpj5i/8rIIFjPlXruVMwY1Czy7X8+Al+B4OgU+yag7i0wjereyYqxDrDD4Ku6FqgfX87aGfR6BPGdENCabTqfAh/A31Btesez/T32LoXVR0KcF0NByeBPdSs0SF/Nr33VBIdOEoTVDyKFkCN0OlSQH+Ys2HsReMF66ueCuyJPDqzD4HvqEIzUCzyk1WtsAcKBy8opc0zgfBU+A52CwxIb+K3Qw3FJmodN0owXTgseNxsA9Cg2pm+S76vyktoOjn2D3sfjVAhFJBqmSax8km+BZ2gBnUlXAmhMyH+B3cj8DVocq55aEnROOJsB7MdIrOnnt9DVwD48G3lAPAB21evRRCPl3G22FaaKwx5blLmk4c2DNQdN+aaa2DKdAvayCULYQ8wYnYhpZxuv+QYGf3a/gnMLD0oH+h7mIYnO6o42fK/bX0MKTbpj8nYmd1bNvI98w9zHnbh8FcDSPBwcWYe/ReWMOgfEhlTbH6ugs/75Z1Urdd1tOi8qnwGcTO7j7qXgU9snym71Mva4bt70uYmq5f1ee6M8zsOphJoOiY2XVGlsEbDKxY5kOjlLmkt4Iz+z7Xyi1LjD/QJ4PLOsbWUmklGMkbsc00fqBZYh1Y3RnmvjnyWeDREbL9VHgVdjNQZ6is/URDxb5e1kFMuyzBij0ZzLBC5n5bzUAbmV2Titvx8V6os0bLs5b0aBz3j3CuyA/A36dlzK2zFTpFrAPMmuFRlPWzQsDMpN6BMoGqO+2+h9tiZ7Y9mBpXQivPIHoYvzXjyhKsUwcUsoNU2IRjj5JCRhtXx8rYRohV5Bh4EExP8+KFK24VfAT/syzBLmeT+5Ap9LdQpYrKFTwMrgcF55k/Tj6FGsFZe/gUKhupu5q5VGOCo7Nv3RrLEryLmgdqarf2hjPsyssac9ToshobjGKepO1jzuqowQQqGVNOj+zvMPVMdWssS/Cf1IwJRAa3CcSTmABX03nBG451DMTEFleniUyNZQneQk0zqJC5xHw3HTOIkK9QuYHqQsgKtOn2Ct6ZvpF8zhK8jQou65DZ+UXQ1ADHCrKfyTAWQubK/AH8XV5jWYI3UtOzLMZMQ2cyqGbOshnZDPBYCpn79xuouyWzBLskPodDEDJf394IXiu39vgwEccXQyjDsn/H/gkovMayBCt0Hdg4xi6g0rVNmuUT8b0AzA1C5vnryjT7q3sOZ77TopH7ZQOYj+oohH89NAuKeuPBgDL7Tsrw5SmwHEJ9J+W+bLR+/8RHx2tmpzRy3yyCfZA4DF23UfcK6Nmxo6Lf8WFUfhzM10P9JuUeRZfl9ZUp2EaYeycJAInT0NU/ct0HQ/M6ziqjnft0PLwCsavLMbkNV8OQLN9HNeUWHjtfn8eJiUhIaLrcCPkaTIHo2aau+3UmbIS0v5jPnrtz8vQEBR+tcOxVz3qcmWrGdJyu42y/BXfAJKjZW9w7CaaBy/djKDKrSV/mDCsg+HCj/qmF6DsPZ8tgOJQxV8geMBnwszPobCp2IAyFYVDGXE1fwAwmaEvQQWgJtM+ySYWC90PyVLvC1aPHQHl5jI6jWqIrHpuFl3F+oAuJ/pGxzIXoP4znRumODwPHI+BFcFm2eoZ907IEBnQcZ973QoJ1hLnnXoBWiXYZ74D50CtPXL2ywoLbRRtwloKBqDNnWrEGvOugVEZXSnC76O506o8GX8QbKZst3KPnTTi33szF3istOOmAAZgVrYBm/SeeD/MruAf6Jv2WvUadw3QUNM5q30ZcCrNhDMT8lKNapil0LayCtxG4JbNmgYLKBNsnortxccbPh+lgBuUvnlhzW3iumpaaofkzbzvXyqxSwelRIb4f3w1u58AlMA6GwNkwGEwhN4PZl0vWWLABDEr7EVr3BzxlDdl/zhnCj3tOo0oAAAAASUVORK5CYII=')}.x-tab .x-button-icon.reply,.x-button .x-button-icon.x-icon-mask.reply{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAES0lEQVRoBe2ZSWgUQRSGM24YTdSo4AYRTcxBEZJDJCoigrtGg6CIgihqogfRgEERguhB40UP6kHw4kEET4J4E9wPAdeg4ALigjuKcSMuMX7/mAmdSU/SXdM9PTPpBx/T3al67/31urq6K5G2trac3mR9epNYaQ0FZ3vFwwqHFc6yEQhv6SwraBc5YYW7DEmWXUhZhSORSC7UwKIgxzAlghE5CZFHoAEKgxTcz8/gCI3gfzHsh6l+xnLq2zfBaC0miXpYDvmgu+kXBGqeC0aohK2D7TAF+kPamKeCETseZdugGgZDSp4RxHFsnghGqKo4H/aB5uoASEtLWjBiZ6KsFlaAHlJpbUkJRmwl6rTcFKW1SktyRoIROhofdbARhlr8OTkMdBPNlWCE6iG0AA5AqRN1Nm1cxbTpn9Qlx8ERO4pIG0Br6yDDqH3pV4kvPdRewCd4C+/ZPdWx7xZxsk1LgqvIZDeUeZzRT/xJ8Dt4BQ/gGjSSVzO/3psEJ4JoY+A4fATNvVTwhjh34RSshMGJ8jO5biuWIJqrc6AJ/kIqhNrF+EFs3fqHYRoMMxFp7dNFME5Hwi5QMLskgrqmgb8M+hgZYRXh5riTYBxpFM9CUKKcxlWOSyHPjVi1jQqmYy7shQ/gNGjQ7f6Q6yWY7UY07XNK4CK0QtAiTOK/J29tLOQ7EU67nIGgtfU1mARMhz6a3zegtCfRHXOYxhXtndJBgGkOT9FQ1Z3oDsFqhBXAFngJpkGD7veN3NclEt1JcKwRHaaD3niCTt40vh6+q2N6rL+2gtUA03p8FL6AaeAg++ntsNwqNqor/kL8OZ2WgF71vEpeq8FvC36uDveJM8qqyenHwzg67oE1MAxMTeLOQyNod0SDqO2hCaDVIma6u3R9OAxq/9WxW9PT+wRsQ7RiE7Gbj4f4v9F8Fujxb1ptfR2tj/cbf04bfbbqZWgsFEM5LITNcBLc3HF6iM2IxXAlWJ0wJXEQfoFb4RJcEwtu8kv/PCiEGdAAevFQJbvL5Rh/j351uRbcLloVmA83ewgUn0TSgq2DRGzloVt9E9yDFoiPqfOvUBHN3erA7TFOtG6fBqdfVp4KtuZLDqr8DrgDdqIPcb2/UYXjAmmu1cLDBIGswX0THMuJHIrgDGglsMZu4nxI0oItgcbjUHP7MyRaanwXrHywvlAFj8E6v+dqZ8MTI9BzHO2DtaC9KY1wIEYurXCO4JrbjyA6CvzO80wwznS3tMAFDpfBKdArnkY4ECOXqwTWUqZvA1mJp4L/+4wKf8ZxDeyE26AlLBBD9HUC14GWr8mezWEc2/oiiNZM/TumGbRLkdQ6nChOT9eJWw3ffakwjjuMRF5wUg9b4QnE5hOHKTVNsSuO3qW9SosN/Yn4KmAQbnnl040f4pelVLCb5Pxq6/st7Vfipn5DwaYjlyn9wgpnSqVM8wwrbDpymdIvrHCmVMo0z15X4X9rh8wHLEjawQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.search,.x-button .x-button-icon.x-icon-mask.search{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGdElEQVRoBdWaa4ycUxjHd9rpbm2bqKhiUavbVZdo0LCyLl3iHhGEkkZsKBYJX4RISHwQIYIPNJoQlUjTuCakUZ9oVGRF0GywslvqbgkpDarqsn7/6XsmM5n38pzzvtudeZL/nplznvM8z//cz5ktTU5OtuWRUqk0i/qdoAN0gcXgP+CkzIcx8APYBXbi82/SaZFSKGGILiTibnA+GADHgbkgSXZT8CF4GwyDEXxvI92r4k0Yoj1EeAG4CvSDEggRkX8VbID4lhADQXXUwxZgfAF4CGwFmgdFYQJb68HJljjy6mSSJZAZ4CLwESiKZJydb7A/CGblJZVWP5UwzueBB8AfIC7IovO0mK0B89KCzlOWSBinWoBeAkWTstiT3948xJLqxhLG2Xzw4jSRdQ0yiv/upMBD8xsI40Rzdu00k3WknyeO+aHk4urFEb4TJ/80CWEdYB4BhS1kdfswe+zpGNf80RYUIr9QSdgOdNCYCfaLcABpqFxBbymu3FIlDFkdD18B5wRYHaHOJvAeGCU4fa8IdnXUPAaoMZeDk4CvfEKFM7CrhswnbpxjZQX4C7j5Y0m1d64EXc5OWoqeFsPLwTvAYt/p/Iv+6jTb1rLKHMbYgWCjZxCb0T/e6qhWj3o6hz8HRMSRykp17l5WayfksyN8oafzTegfHOLQ1aG+blc6ZGQRdeVawB4GlWno7Pim1G9rB08AZzgrfRfdw3wdxelHvl/38K01Itc2Rf22Q8BPIIuoynXQL/SQj71DwcfA4n8nev1xjWfN0yGjD2gxsYh6432LolWHQL9F91Gj/j7oacUPFhE+11hbLxbrCFBzqWh5A4PDRqN90RZqVK9XE+ET67MSv41D9s3E0nwFX1Ndu4RFjkZpjkUxTkeEdTDIEvXqW1lKoeU0pOavXj10OsuSI1CYnaWUVC7COvpliR7f9CQzlaK5/LPBQRc6mstBIsIW0WXiO4tiDh35mIr1oS4kK2ENOctwqzPu+SX0MdDLjZWw9Pb1suyv7EPYR7cuEithLRLL6moW/0VriaVRtT1qTQkSER411Cyjc4pBL4/KEirPNRj4FZ3gXy5EWM+vWaIhtJQNf2GWYkg5dtWzui9bhuqn6OkVNUhE+ANjTZG91Kjrq6bDxHnGStqvcxHWsU5bQpZ0orCK3rDs21m2quXY6+DLTWBBNTP9wxbOKZZ4E63omLYZWG4r0nkQtOtwVASwdYeH723o9uTxS/3Ks+ytHk5/R3cI5LqIK2hEDw86XVkb+wV0Z+YiHDnWCjnu4Vj3Ug3DzhDn1NPacTX4HljJ6gFPr5e5RpZ74tFz6l0ezhWk5tFTYJFPEOjrLKxhrEazktWR8zVQ9vEVp1ttLYyplyeANQinN0ydIXBUnAOXR7nsrwAbgatrTbX3nu1s5Ul1oKgIRsZYMR/jy72gY0+u6a8OJMJX1P+C9MsaqDcPAseCHtANQkRTwHIoybZd21qR0Q2k1pZP0tNJSIubLhxJOr75egO/sjbekM/VIe0qY1RDb6p//PYl6/QniO0sF2tI2kBYRpBTgVrUOWqm9DPiGgghW+GWVBGj/UCvEM1E1sWinr4sKfa0/NgedhUwqsVITzvOUTOl6gxv0qmERRw5HOi/bHz2zb3VMHp28hremYQj0rq23QhGwFSQ0ZVPu8NvAfa3Use8kJkI1wzxxRhfDcYDAotrKF0GngYnRA17D599f7KVXcVzmoszLfUi7AxhfBG4GKwFPudhBacnmpfBStDwnzrkrQIhpDW8L3ExJqXV/wBA2Vs4WelquT9Qzy8FvdHnDlKR01RQ8OrJMaAp8TnYQUA7SBsEm6pzPXgcyI6PaCG7Hdu6VcVLUkuE5ONBR8ByDGb42sPGteBPEDcV0vK0ZZ2Z5C9oSCcZKzqfwO8OJK2FbCAunqYmrICRQaA3rLRejSvTWtGwTzc94Yj0DQS/O4C05nQd6VYhrIVMpEN6Wqv3crBngY4b582aR9DXgJCFTPt05T+AtKq2jNARzxLs/UBbnY/0onwLO97sXPuwj8cidQn8OuytAe0edjUyuluqh2vIPcNnPS1rIbOKfkRf0pKEGdqSJyFwM/AZ3j+2JGHXpZDWWf4+sMvlpaTal7e3xLYEsdQ4ITIIsras29AppxrKctRM5ZDRLUvv13GnLl1p5yjellylCb5BolvWkRQMgT6g6apXmnVgPWQrc/1/boJCaHVWyukAAAAASUVORK5CYII=')}.x-tab .x-button-icon.settings,.x-button .x-button-icon.x-icon-mask.settings{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAIkklEQVRoBdWZd6yeUxjAe2lLUbVKrFaLUhUVo1pbQtqqESOECGLGH2IkCP8YQewYtUoTKmkJ/2hVEDFixN5FadXWBjFaq0b9fl/vuc5973nf9xtvez9P8rtnPeec5zn7/W7HsmXL+vzfpKOjYxVs3hR2hlXhT/gcX94iLBYd/r+BR2vB+eBsyVJ4FPqX+eJItbUwm8rmMEZDTRAMhG1Nd4p+bABbmUZlAGwLI0D9Lmlrh7HV5boHOHuPkL6LcCisDztCEJ1aBxwYwyvgMbgfToD/pGwJ9FY5FjoZ42AuhKX7N/HX4Er4Psq33PQ0eBz+APP+gbfhAOjQl7bdvxjYH86F4Gwc/pWT74DEesYXwWWwtg6385L25J0FH0JWXOopyfrjDC+AmTj7sxWyCua1hWCgs6Ox58GPTRr1FfVmwBuhfts6rIH47NJ9Eu6BWBwM9+xU8HqaDA5OLL+ReAmm044zXZPlGzmk2iDklHUSvF4mwU4wHEbCuqDo7OdwKXgK/w4DwEfIdVC7vgjVcxnPg/fhHZjVdocWRmn8faDBKRaTf4srPoa81eFocABS9cy7ra2XNAam5BcyvZqy4vL/Er7OFsTpdnW4yK5+OBCWd+yLjw9neY04Mxsvajiru7LS3qXut2/Aq8mZ6zp0iPuOnsBeH0wYi1thL8jmW99l7ux/1G0fxHui2TiNOojdaLQt6vcF38tbwyHg0zLel57AD8Io2Ay2h+sh3r++tl6AI2AbWBv62XAlwogPoyFPVhvuJpRpyCwc/7hbQU4CPWdlMfWWEFrX2YvFpXskTIRFsD4Mgqy4Qr6gPZ+ny6XR0c/Tp7Up4GdaPBNx/KG8unn5tOV+vLOgzbj9VNwD7gHYMPRRyR5mJpyBIVDU3lD0/ISrS9B19U2A4+uqkFZywMbCYbTnqig00PJ6xYNCPCnzZD0KRuQVJvJty089PyJicdY+hfggs7y2fAl/MBGJk+DJ7grgb+YCz6ZRceY8OHaEftly08ho+AQ0IrW0zPsWjkrV72zDg+VwGB50iHse3AbhpJ5P/AzYBz6E0Jf9egqfDieBZ4Vl38E1MKirzRBJhSh6ED0D7k0bvAA2gVVifdITwQd+MCAVOgMXx/WMIx42J8M88Ep6E7YJesSd5SthBuwOzvxweBhCPw6IV5nL1y+pPWEqXAJd+7fWX2g4G6K4HTwHGhoaNnwZDoLVQh3iZ4NXRayXinuV1N7vtc779NmN9NOZejr9FowL7WdDyjyVb4TQhzY+A7Vv3qBPuquvrrwQiUMUR8JMyDobOlhI2dXgIbQaXAvhV4agkwqfQs+DxH11PrhqUnou0TkwNrYrxMn3ADoMXgUnwIm5Ano4GOqEsMceppJ76REomzGX0bNwCrgMnZmU8XGeA3UizIK8wQz6Ou0+HROMjUPyXboOngyArhUX62XjKYcvp7IHTOi4N0MH5eGs0a2kXVpZ8fBYnM3spbSrxqVdnWRHi5Y9Ne+Gn6E3Z1dnn4fBWRtbSfdY0jaGjAYf3u6j3nLabbVfK86l6qaWNP3UllGYZdMrWzzxJ8OLVXdcO8ZTjfL29CP7VvD4r71DU3qJvPnkfQ1hZWxGfMuEXl7WXxQ8AacwQ9/kKTWdn5r2kEejO8DbUM+V8yR6x8II8CM9XBdbEffJ6FVXtkUsXwC7BhuqDpN7OHRCx951flgvgTBj2XApZX7CDYHci5+ywXAOFD1QbGsq9A02VB32pXH/26Zj/cEL3JkZCs6MT7+DwfyU6PwUuBDDCq8yyr+ln5vQ3RB8ZaXOD+2xv2XovkK4AD4CB9yB+o12XG1Niw/xLeBA2Alcji5jr6Z6xJfWQRihQXULzsxG2T7rER8fbqu54J08m/7eIWxarqJm0TLLLuGQ1pCjYFUMKNwa2XLq7Au/Q2ir3tDZfQoa7jPY4LLym9Pl3Kg42q/TUDNLzDv+tUY7RF973RJNS2of1duYDv9Sr3JGz9P4jUxePUlXgnWbllYcdmY1oFnxvl3p0orDrdTV0VbrNzVYrXS6NT3mXVdlxng7bF+mlCi3Xkuiw57QzRw8Xl9DuGKaGbSNqbsrNCpuIX+YaFq86KfDuuA97AnorPl2Lju51TkTXoe6Dy8GyFm6CLwdysSJ0EH5CfwFZEqTNwNVO5+CtcjymRpKfDsY1UlI+6NZaiZ19CyYhhHey6WCv0egdDf4a2RKfiDzPVgI78OczvAD+mjphKYdjtmSRwMqPh1/VTWHz8g/AZK/Wcfto7MfzIO8thy0B+M6VccLHaZzD6aXQEPyjDTfc8CtcQD0eAWRtwdMBWevqB1n0FkdVbWjob2i7+GBdHwpnAZrQj3yPUoLQKMXwXowEhy4wVCPOLjT4AKMtL1qJXieDellEvgzS9GMrKgyz4ZTszZVkU4uaTobBrPB19CKcqqoXZf2fBhdhZNxGz0cphOvm5uhbL8VGVxFmYP9BAyMDW41nrpqDqGT8ZB3bVC0UsQfJfYGr73KJOXwLrS+QQM9NHo3NqLvw2hcA7aUqqYcdu/6ovG0LJM5KNwBX4LLuEz8Geh28OebMrE9T/p7yhQbKk/tCRrw55eXwaddaj/6a8VMGAP+93AyeBendOO85zr1hxNOA5+McXmIuwr8ifaklH2t5PU4tEJjdDYWfCdnHx1zyTsG1lAX6YAzIc/44ITh/epHffhQ8feqWEdnXWGTgl6VYa7Dnc7sQ8fvgiems3ov+M7u9poifSh4d8aGp+JXZ42nzibgP7eXgM5+CuOzelWlCx3udNqZvgGOg+QVQb467mMNTjlqnl87J6cMJ9+zZH+4BfZN6VSVV+pwPR1hpA+VNyFvz+vwJ7B3Pe2tSJ3UKY1dDctX1PBzTsfyxGeq26NXpRKHmZGleOEV4pLOk4Xo+XrrVfFir0r8bh4EG0E8057i3r8eTL0u/wJCZSL2DoplLgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.star,.x-button .x-button-icon.x-icon-mask.star{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFfUlEQVRoBd2aXahVRRTHz/Ujv+2mZRGZB7W6mtpFikC7+UWUZiqBD0JPFdRL1EMFPfjoU4baS0FUD/UWZBEVShA+BCpmWApRSkgllNpDmZWZt9//eOay72afvWfWOTPn3rvgz8yeWbPW+s/XmT379AwODtZSSQ+CryVgA/gVfIx/pelEhFMBVlvBOaBeFo6Cean8y09KsnMg932TqCOs9M2UhMfhMJVsxtHcAmcbmekLCsqjFKUkvAYG1xSwmEHZqoLyKEVJCDOCNxH9HUCbVl6mULAuXxjrOQlhgl8Bbi0h0Uen3FBS37GqVIQHiHh2SdR16jTlo0t0woycpuxiUDSdHcFeMv3uIWYanTDB3wIWVZBQHP10zuQKvbarUxDWT1HRz1E++Ds99fLtgp6jEmbExhPNcs+IbkZPiCpRCRP5TPCQJ4MJ6A3QSUqjSWzC2ozuC4j+fnSnB+gHq8YmvJKIJgVEpRPX9QH6waqxCa8PjEhHT981H2j6qno0wqzF63BhOUxsom3Zb7aJqGsUjTAONFJlpysXQz7VuXpavrBTzzEJaz1adlzNjHs6RTBvJyZhjZTF/kTaWZZCnlvhsyWgQkPZQpagzsX1bFlAXjGtDdAPUu1p3PPQhCCXkdwG/mta0PWLds060AuAnqtEOjpdbQR3VymX1P9F3UfgGJA9X9F92c/ADaQ2P8V0DJ4/kDbeYKaSvgI2AN0+OGJK1VAbSIhTOXEOybYll2kte77yD4rqrHyb85S9Cl4HtReAyI11/A7HpRq5PSD6oR0f3Rad+H7S1DvV7UgS+tc1cU3n3V/AWJ/SX8BxVuMinow2rNNjlPQVeH0GFg378kDBfLAPXARjZbTPwmUXmOG+bgz71EKFfqKeAUWfREZbJxyCxyOOqEuHER4qrNUWovwy0CFktBHV4eNZMNvxyaaFhKWAaBt/HJwEo4W0luSKLMF8viVhp4iBeeBd8CcYqcQ1qi+CKS7uVmklYdcQY0+C42Ckkf6EmO51cVal3oRlCFkCdKgfCWtbo7obDO3AVWQbHHyUsjo40E6uq9cvQbdG+wN892fj8s0HjXDWKA51/t4JUo72H/jTDtybjSUkbyYsJ0gdfAtSjfTn+JoWQjCv2+57a4M1QaQSvZvrMsIs7RJejGcdUlLJUhzpZsYsZsJcCen6ZwCE3IaYA2021OfUdU3fJltmwni7Fvh+KDMF16KR3ux0lWuSdgjPxeNdJq/tNdKNqJaSSUyEmVK6JNPomtqbIh3eSKNsEmvAarfJ5LEzjbbR59MtpqyEb8eZjpndkhtxvNri3Er4YZxpx+yW6Jdhi8V5MOHm+n0QZ9afo0u0fQO8A5S3iPaQ1cTSG9w4f/SqesZBH/gRWI6T+gyyxfkgvw2cMdrS+/lTzpZvGnyWxsnTwHLRd4R2a/OBqQyoztKBe/P2qp6DCBOUptKHhuA+pU1fq2Co0/F0L9CVaghxXTbWW9ktKg8lrFfCrwODeh/9wgu1bEDo6OT2Fvgb+JLWq+nQEsnaa5UPJbwKBxc8A9KXPG1O3u+u6E4F24GvD3XMDjCxFcF8uTdhjGpHfwn49L42lCeAdyDZwGi3HpwAPr6+Q29htn1ZPoSwfuz3ewShXVcBNz62lzkvq6O9DjZHgQ9p72kdQljvob9VBPAN9Q+UEQmpw5b+Sf8e0FotI/4a9ZN8bIcQXlnh9AD1y3ychuhgU0tpJyhb14epn+ljN+Sk9S9G1ct50d8SdgF9x9EO3lHB5hXwPEYfA8dbGD9LuWZBtfj0inSQWUDTKzu1dAB5Dkz2tdOOHn70LvwVyMag/FYwzse295Rukq5j+G1wEOib66PAy5FPMD46+NPmqTV7CpwGGvkJPm2l8z8GWDNDloqpGQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.trash,.x-button .x-button-icon.x-icon-mask.trash{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFBElEQVRoBe2aS4gdRRRA8+L/m0QIJkYNLlQUNOAvigpRcCEIcSsiCLoLLoILcaM7QVBX4koRshDxt9CFKCoiuvGDCP5QkxCiJhInRo2Ovzie80gPNWX1dL3uesM09IUz3V1169a9daur+031aG5ubkUpGY1GK7G1Dq4Cz9vKiIY74Sv8+72tkWQ7Ay4Bxo+Hu2E3/AuOZBf+ov2TsL6Ef5WNUsGazXvgEHQJMm77N/aeg3Mrh7seOweMM2bWYH+B2OES1/9g9w0oEnSngHHCYO+FGSgRXJ0NM/0idA565BRpKyxSt9J2B5xWY+Mw5Udq6uqKT6XimESlmX4d7sTnA4n6rKJjs7QSSgTrSno7nJyodtFyGr4AP4G6TeLIHweb4A44C0LR1xtgCzwP7aTtIkBvLlSfQjwNZyl7FNa0sU077V4DX0Js25X7cRjPzDb2Nd5FnK7xPbGXskdwxsxOLLRzdnwIj8GvkQFnypqobKLLrgGnOjMzP6cqJijzfn0NXPljmXRNWNC+dcBHM7HA2NELp10nwbaz5iC4OsdidTyrYp3a68ZFi7XJFfNsOBGcUmFnPpbiBWkVZefT7g+OXcTF0EUsFPtaje0Lw0LOzfoM49B4Gy36WMKwK+WDcC2cAmGwXK7YAAYdym9c+NiIdUOdnHODc6DjpPioix9LBvwtPE3QOzjWi7MjBS0M8CGY1huUA1ISg/4cNqXiqcqSwVqJ3AQ/QEmnpm3LR+IzsLYKMD4mA6bBOfAKuFpO28nS9v0Bcxckn9V1Ad9Pg2m/H5cONLT3Mf5fFGfX63hBQG8s7/LXxcdV0nvjMtgKp0MojuaroM60xYB8Z78ZTog6c515B1ylXey+ARe3/0tqFNCy0RjrkdvgOwhH0TeiB2A1uMBNGx9Ta+FZiP34mrIrQR39cECSUzqZYYIcR0mjJtmFwmHUvdenLjwmnUl7Eh05+LP40fjvoGTACYN1Rc6CecGhM7lw2lt+AA7Fg4fOespXgYO0j3pvnXmh3rY+/52+vrXtRSd841rQJ/WV1JVX9eNj14DnjeHnJVw8DBeAnX8A2ynfXwXN+cWUPQUOjNl6i7Jt1I9nCOe+1V0NT4AB/wkvw31QRIoFjDfnwRXgfVbJGZzsry44boTNUGVjlvOToPpV5FvbjXApKE7VLZ6UkpWlDGHH+96pV93/4TSsujGA8MeF51Xw6njuO3soKTth/UTnJQOeqONFlKsBW0SlfdVyDLh9NBkth4AzBqnXKkOGe52+DOeHDGcMUq9Vhgz3On0Zzg8ZzhikXqsMGe51+jKcHzKcMUi9Vhky3Ov0ZTg/ZDhjkHqtMmS41+nLcH7IcMYg9VplOWY4/Md88cEtHbDOVg5Xx9jpsM9Yx52JeAcw1ontTXRdcm9pFz3vBveHdNJN6YPVRhrnivtMlruZ5g7DFxBuXLut8j7sA/d43Yr5CIpJsYAJ7DN2/27Bsw1gwAb3I8wLOp+g4w6+nw/6HddOyszqWDg/Qv2bXFwH4+1SyhyUYtI1YLc85wXn/ORAagWdPVRKUqh3AJwtdTLeWq2rbCoP76cm3bjeLG6ELjZim03XJujyJqXF6rtmeDvGNzMN/ajEAZi2rKOD67t00jVgN7+3dnFgqdsu5XRc6tiS/eUGvBTTNengBIVZPuYG7LcYPjdluYk++bTw++pGyQ34bSy9B35Vs5zEYGfgJfg+x7H/ADoy2VfnrtXoAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.maps,.x-button .x-button-icon.x-icon-mask.maps{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADl0lEQVRoBe2b24tNURzHjfutXEPycDAltwhJbuMSJUqSB/HiES/+AK9ePc6T8uCFkImQW5KGkdwSxYyMGkZu45bbDOPzyZyTrJnjnDkGrVm/+szas2bv397f33ftPS+/Vdba2toj5igj0NcfRkG/3qWIJdcIrs/AO6gDq7cKPkOjUNAmxr8ePJsix8NUWAvLoapowSQawIUzYCZUwAqohF3QAjtgGTyCy5x/nfEu1MNDCmAxuiS4Vy8ST4DZMB9WwiTIRUGC26q1gKtWwyyYBsPB5aLIL5CNTxzotDeWTeA5DUKuO4xXoQbxHpcUbSIzJFkDi0EzdLYnBNGuYJJ4ch+YAhvB5TAORsKvib4x97vwPpk2FjJuhibu85zxAlyCangBLRQib06u68t5vk4uVYVqgO+oqy9v5ASTRLd0LQNLYB24bAfBnw5zikX0HtuhGW5ANY9ylvEBvIY3FOArcz7rWHCpboBFMAxyGjguKIZy1jzYCqfAD5BLslB8J3dCP/AdOgo+fKHXd3Sebh+EctCMieBK6Oj8QuYrXZ7roQr88PiSD4b/IVyyfhB9jQy/uppTUijYhANLytJ1F/sxzL7POpg97vQdFfwVTNYtQsHdKpLg2O1ODieHI6tAWtKRGRrISQ4HJYlsIjkcmaGBnORwUJLIJpLDkRkayEkOByWJbCI5HJmhgZzkcFCSyCaSw5EZGshJDgcliWwiORyZoYGc5HBQksgmksORGRrISQ4HJYlsIjkcmaGBnORwUJLIJpLDkRkayEkOByWJbKLbOVx0r3E7httIbttwNvzddt//JWxIfQynYX8pgu2TbgBbjw9Ds53sNHJv49gOehu5bUe2DfjXojDVpWG/9iu4CEegBp7xfO+LFfyGC5+AiQ7BFXj/c8s+xw+Z24PwvYwKnQxLoQLccGEB7Hsu9t5ckjcU2QjuozgA5+Apz9PCmItCbvqWs2vhJpwBl8ZrEuVtOebPtiWLbf2ymyL0ZVT8XJgDbgHIgFsPOhPmr4d7oAnHue9txg6jI8EfueIaHIOrcAuafieSc/IG19vw7TYD6UEBbE4vhwxMB7cizIYhYPT6MeR+WjBFPoCToEgF1hb6bD8LNpHLwT0L56EOGkhUchc6edoNcruvQWoQ7/6GMTAa3E2zACxGNjRhH9wHV4zP9oGxqCjj7C0wA06Ay/YliRT/T4MCuGnEfQ4feJ5mfvdfaG+OXSWdju+VpAoIK3D9tAAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.locate,.x-button .x-button-icon.x-icon-mask.locate{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAIDklEQVRoBe2aaaxeQxiA3eqCltpLkWotLUUtsUuJrbUFtSSaiIjljz8kQhOJiAQRQYREYvmFSPrDFiSExFpL49JSS6u0Re1bLUVRz3N7ph1z53zfud8956sf3uS5s7/zvjNzZuac7/asXr16g25IT0/PKPrZAfaFXWAMvAEL4GNYgS1/EjYqPU07jKNb4sGZcBocB0MhlYVkPAgPYM+itLDWtA43BYY6m7PBZVSFXuqd2ZQ96m3S2ZkY/0lFR+PBcFlf3ZTTjTiMwQfCR4WzfxO+D8/BTxA7Vxb/nXqzmnC6docxdDg8WTj2F+EtMBrMPxiqzvqn1N2nbqebcHg6hoaZfJn4sNho0hdB2cym+bOoOzRuP9j4EBTWJuzII1F2OngEuZQfwcBVhLG8FifaxM+jfHybOgMqrtVhet4OfH6VHsjpn9xXWu3PRKrtXK1qtVo5g6q1zNfyzJ1UFOnwCcz6ZqEq8bHErwzpCqE6JtHOsBap2+FNsGrjyLIjid+PvYfBDOJPwJSovEp0wyqVqtbJ3Xqqts3Vy83EKVSUTiWns1Nd2WesY2U0XAHfDkZBpu3vbHzu3rVI3Uv6G6z6oBbL1il5b1108LG6Hf4ak+YO3qy1Gl4ltnhtqoZIrQ6z8lZi06PwWw22qUJdn9Wkq09NrQ4Xhs0hfLgGI99Fx30MotfT+sT9oG6wbhzMAzebTviRdufUbZf6anc2GInBh8A7HTj8A23Ogw2DrjrDxhzuG80118KHMP7XCo57934Ljq/TwVRX4594cGADblmXEEyDqeCrYiy+XPhC8RzcioHfETYmXXE4WI/jXi1PDOkiXE44CUd9pWxcmtilWxnt0k5lVbecteNuO+xsplLrOZsqT9PddviL1ADSn2fyGsvqtsO5N59c3v8O1zUC3Z7hDzHcm1cs5nVNuu2wr4+pNHrupp3V/cUj1d+X5vwdTsS+RmYqjKDcT0N/cjz9kSmvNav2iwfGj8HCfcDflXaGbcGPezpsuBfEsoTEMvAnFmf7K1gCXjPnMwhfEtYmg3YYB30s9oeT4TDYCbYocGY7EWf6+wJ/qZgDj0MvA+Cdu2PpyOFiifrJ9SS4AHYDv1bW+oURfUF8J/bjgj+l3gteUZd38ggMyGEc1aHJcDb4k4nLtZW4RMMy/YW4LwonQHz29hZ1NiV0yW9VhASl4rK/G2bDAhyv/JGgssM4668K58OFMB5io0muFZ+518CPb34EWAga9VuxMvxlMIhH1FGUvUCZb1G7wu4wBfaAg8E9ISe2/RjugbvQUe1rKRXbvhOj8Ax4AxxJO0pxw3kEnHk3pezLO/mbgV81Q3v17ZmzgXxXk7rU+TSENmlo3y/C9JyeNK+lsyix08vAWUs7Mq3BL8GxMDpVnqapMwqc/aDL9lum9dI0ddwETwX7ctMK7UNonndybc0OdtBZ6jANh8GV4DMYFMfhj+TfCBsFZe1C6urwXAh6Kjkc9NLO5/wW+DXSEXQZausVUPoTa9ZhGvh8OqI+F7HCEP+I/JnBkKohbXS4N9HZdoZT/bR3JssmwpmelrYJ6aEU5mRPMp09l1JOlpI5lo1mFmHYvDyPXfqzUb6CMCc+b4thv6LQgTMvK8VGdhaFblwu2yD2uQRy9m1L/s20XYYd7xH/twTPQ0ipl4XrwY/pYUbT0DKPmBgNnwc7BV1pSJm674Sg73Xio9J6IW0Z+MyrO+7Li0nZsla39unD8KArhLkZ9iw8F0ZAmbQq+6asEfnO0nx4rIgvIiydYYz8mZnSATfPVNxjysSB9X/DboWv40o5h4+igod/Tj4j02XoaOdkHkauzBWYR5nOOcNSVeZQ0UtLTrR/AuyYFLrkvQn66HikrZMw1SGk5BooW84ukxGh7voOsWUjuBnCIxKHDvylqY1uNKnEm0Na5kiOTjPXR5ql7ixuD3uU9G/55mlZzuGfqeRI5cQb11T6yj0KufpN5vlcHwRHl3TixH2YluUMf5NKXghysgmZHuzzcXoRy6VsYHJt/QXCAZ4A6gkyoMu/jQo9vm9fBWUbqD4shH9LusYp9WxbBo5Q/EzE8Qcom5i2bZemjTelBYnerdq1S8tpvzf4Y3lsUxzXdk+ALfq17ZexZiO4g8q+1cRK0vjblM9I27dKawD8EOl1FgZ006L+TNCZ1J44re03Qb8Ntt/Vkko+7FOh7OoWK/bMdefeoZWjoYx6nvFx+8oO2wdcB98nOmJ9Ie6V+PDQbxz2c9hCZGNwhNrNspU1+hO4FiZDq5uTDls/GGZ869igOK4uUKe67SNuG3SkoUeq9fvdsvp8izuI4zTYBeZClU5Cp559D8GFcCCMh82DXuJukrE+nzV/OewbeOuCbQ4FdahLnUF/u9CLzfMwLuhMw5ZfPNgNp9H4NtgdXOoDkRVUfh/cKX3mloM76u0QdOmA1793wSW7G0yEKTAcBiIOnndzLxvev/OSjkCappVL6hlw9NqN8PoqX4Vt3s/Hp/an6ewz3K/SmhvNDSj86T/otDZp25jU7ly6ksM2RIbADHgFBvJcNTXrOvpCYdOQnHO5vMoOh8Z0sA1cDi9Cq3fSphy1z2fhYsjuxMHWXNhy00JhqbCheWtyJ54Ox8D+0KT0ovwp0NmXcMYjc8DSscOhJxwfRnxHGAfHwQFwBIyEwcgvNNY5HyHxHF6Kox5rHcugHY57xnnPWS8t4lHmIHjEeNyMBXf67WACeJNbDH+Ag+ax5fE1D5YWcd/cVuKkR04t8g94XuILUVeybgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.home,.x-button .x-button-icon.x-icon-mask.home{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEK0lEQVRoBe2Zy28NURzHe/vwqEepYkFIQzxWaCOC2HhELEgQImhXIrqyIEXikVQi+gdIwx9AItg1NiJELMSGhKQbobY2VY9Srfp8m5lmTO/cOXN7Zu656f0ln8zMnTNnft/z+505j5sbGxurmk5WPZ3ESuu0E1xbigjncrka3jsbftClIvsU5RZ65aLK5Lj/C75SzSjHWCuJYLxqhPXwBgYhylq4sRaixChDP8EzGIJ4UwNnCR6tgFswANegKer93LsLim4herm/JKqO8O+ZRdhL42acOwunYAacg2Hu3ePYj3Ph1A1fU2ySmZSZeCiTjxaC1LAboRs6QGJl8+AKXIU1kLqlHmHEqlFboQv2gD40QdPHqx3qKdtJkD8Hb9o+TzXCXmT1cboB+cT6evTVPgIXeWYl6DoVSy3COF2Hx0rjTthp4L0a/4xXrofn33OeqH8avKMqFcE4O4uXb4ULsNfEEa+M0v00LIIuCKc/P03NrAtGrD5Iiuh10Dia1JTOR0EZsjjpw3HlrQpGbD0v3AzFig36e4CLkeAPNs6tCUbsHBxS+mpsLSayYT2KtLBqVgQjdgFe7QP1u9VWPbRc2ZQFe2LV5zSBWG7ZP+vVTUkwYhvx6DicB+fFqvWKFuyJ1QxJ00It48rCNNgnNi+N23hQaVw2YiU0cYQRq9Q9CJdBKV1q02zMeEaWSDBil1L5JTgBDeCCzcUJ8cXImfACOeqayjbBffgDfqu6cPyJP3dgVZTvwd9jdzuoSFmgicRDGAYXRIZ9+I5fPbA6KC7feUHBVKD5rJZ1EutaZMOiv+HjbWjJJ9T/LVIwDyqyh+ApuC7WFy/RCk4r5HyRwWNewRSW2N3wGv6CX2E5HBWcB9AaFOqfTxJMQa1lNewosqNQDiLDPmqv+hFsgzpfrI7/CeamVjwnQZEtV7G+eEX6MeyHGl/0hGB+1MJdYt+B/1C5H9UdX8J2qJ6IMBfz4Ri8hXIXGfZfmdoLWr5W1zJ7ktg2aId18BuiTHNvDVUumQSNxDikLSdtBzdok0yCD8MyiLNmCqhxXBL9An+egNI3yqRT9z+O92FO/O2UuOMuymoqF06bUl53489MQw21Gm8lWmkRa6R/oVaMfT6lAmrsUVMNRa2HU3I8k2orgjNp5hK+ZLwPp/x+fR+0ONfMp9BfJ+qLmulpyze1zMtC8AACbkI/xAneQZkO0JiZimUheAjPn0MfxAnWVo3RiEG5oiwLwXJsmGFDK5iCxrCnGZNSOzVLra+EPDZ9T6EMCFVZ3KWpI8XV7uBTFcEOBsWqS5UIW21OByurRNjBoFh1qRJhq83pYGWVCDsYFKsuVSJstTkdrGz8L0VTv1i+NVF2CyTJDC0LX7E8HIx7D/Vrb3wDaLvY1D5QsI/6jXZUEwk29cDlckki5bIOY9+mneB/GfbU3e4Ey5kAAAAASUVORK5CYII=')}.x-button.x-button-action,.x-toolbar .x-button.x-button-action,.x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round,.x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small{border:1px solid #010509;border-top-color:#021022;color:white}.x-button.x-button-action.x-button-back:before,.x-button.x-button-action.x-button-forward:before,.x-toolbar .x-button.x-button-action.x-button-back:before,.x-toolbar .x-button.x-button-action.x-button-forward:before,.x-button.x-button-action-round.x-button-back:before,.x-button.x-button-action-round.x-button-forward:before,.x-toolbar .x-button.x-button-action-round.x-button-back:before,.x-toolbar .x-button.x-button-action-round.x-button-forward:before,.x-button.x-button-action-small.x-button-back:before,.x-button.x-button-action-small.x-button-forward:before,.x-toolbar .x-button.x-button-action-small.x-button-back:before,.x-toolbar .x-button.x-button-action-small.x-button-forward:before{background:#010509}.x-button.x-button-action,.x-button.x-button-action.x-button-back:after,.x-button.x-button-action.x-button-forward:after,.x-toolbar .x-button.x-button-action,.x-toolbar .x-button.x-button-action.x-button-back:after,.x-toolbar .x-button.x-button-action.x-button-forward:after,.x-button.x-button-action-round,.x-button.x-button-action-round.x-button-back:after,.x-button.x-button-action-round.x-button-forward:after,.x-toolbar .x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round.x-button-back:after,.x-toolbar .x-button.x-button-action-round.x-button-forward:after,.x-button.x-button-action-small,.x-button.x-button-action-small.x-button-back:after,.x-button.x-button-action-small.x-button-forward:after,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small.x-button-back:after,.x-toolbar .x-button.x-button-action-small.x-button-forward:after{background-color:#06346a;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #167bf3), color-stop(2%, #07448c), color-stop(100%, #042348));background-image:-webkit-linear-gradient(#167bf3,#07448c 2%,#042348);background-image:linear-gradient(#167bf3,#07448c 2%,#042348)}.x-button.x-button-action .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action .x-button-icon.x-icon-mask,.x-button.x-button-action-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action-round .x-button-icon.x-icon-mask,.x-button.x-button-action-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action-small .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #ddecfd));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#ddecfd);background-image:linear-gradient(#ffffff,#ffffff 2%,#ddecfd)}.x-button.x-button-action.x-button-pressing,.x-button.x-button-action.x-button-pressing:after,.x-button.x-button-action.x-button-pressed,.x-button.x-button-action.x-button-pressed:after,.x-button.x-button-action.x-button-active,.x-button.x-button-action.x-button-active:after,.x-toolbar .x-button.x-button-action.x-button-pressing,.x-toolbar .x-button.x-button-action.x-button-pressing:after,.x-toolbar .x-button.x-button-action.x-button-pressed,.x-toolbar .x-button.x-button-action.x-button-pressed:after,.x-toolbar .x-button.x-button-action.x-button-active,.x-toolbar .x-button.x-button-action.x-button-active:after,.x-button.x-button-action-round.x-button-pressing,.x-button.x-button-action-round.x-button-pressing:after,.x-button.x-button-action-round.x-button-pressed,.x-button.x-button-action-round.x-button-pressed:after,.x-button.x-button-action-round.x-button-active,.x-button.x-button-action-round.x-button-active:after,.x-toolbar .x-button.x-button-action-round.x-button-pressing,.x-toolbar .x-button.x-button-action-round.x-button-pressing:after,.x-toolbar .x-button.x-button-action-round.x-button-pressed,.x-toolbar .x-button.x-button-action-round.x-button-pressed:after,.x-toolbar .x-button.x-button-action-round.x-button-active,.x-toolbar .x-button.x-button-action-round.x-button-active:after,.x-button.x-button-action-small.x-button-pressing,.x-button.x-button-action-small.x-button-pressing:after,.x-button.x-button-action-small.x-button-pressed,.x-button.x-button-action-small.x-button-pressed:after,.x-button.x-button-action-small.x-button-active,.x-button.x-button-action-small.x-button-active:after,.x-toolbar .x-button.x-button-action-small.x-button-pressing,.x-toolbar .x-button.x-button-action-small.x-button-pressing:after,.x-toolbar .x-button.x-button-action-small.x-button-pressed,.x-toolbar .x-button.x-button-action-small.x-button-pressed:after,.x-toolbar .x-button.x-button-action-small.x-button-active,.x-toolbar .x-button.x-button-action-small.x-button-active:after{background-color:#052d5c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #02152b), color-stop(10%, #042144), color-stop(65%, #052d5c), color-stop(100%, #052e5e));background-image:-webkit-linear-gradient(#02152b,#042144 10%,#052d5c 65%,#052e5e);background-image:linear-gradient(#02152b,#042144 10%,#052d5c 65%,#052e5e)}.x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm,.x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round,.x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small{border:1px solid #263501;border-top-color:#374e02;color:white}.x-button.x-button-confirm.x-button-back:before,.x-button.x-button-confirm.x-button-forward:before,.x-toolbar .x-button.x-button-confirm.x-button-back:before,.x-toolbar .x-button.x-button-confirm.x-button-forward:before,.x-button.x-button-confirm-round.x-button-back:before,.x-button.x-button-confirm-round.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-round.x-button-back:before,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:before,.x-button.x-button-confirm-small.x-button-back:before,.x-button.x-button-confirm-small.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-small.x-button-back:before,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:before{background:#263501}.x-button.x-button-confirm,.x-button.x-button-confirm.x-button-back:after,.x-button.x-button-confirm.x-button-forward:after,.x-toolbar .x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm.x-button-back:after,.x-toolbar .x-button.x-button-confirm.x-button-forward:after,.x-button.x-button-confirm-round,.x-button.x-button-confirm-round.x-button-back:after,.x-button.x-button-confirm-round.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round.x-button-back:after,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:after,.x-button.x-button-confirm-small,.x-button.x-button-confirm-small.x-button-back:after,.x-button.x-button-confirm-small.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small.x-button-back:after,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:after{background-color:#6c9804;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c2fa3b), color-stop(2%, #85bb05), color-stop(100%, #547503));background-image:-webkit-linear-gradient(#c2fa3b,#85bb05 2%,#547503);background-image:linear-gradient(#c2fa3b,#85bb05 2%,#547503)}.x-button.x-button-confirm .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm .x-button-icon.x-icon-mask,.x-button.x-button-confirm-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm-round .x-button-icon.x-icon-mask,.x-button.x-button-confirm-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm-small .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #f4fedc));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#f4fedc);background-image:linear-gradient(#ffffff,#ffffff 2%,#f4fedc)}.x-button.x-button-confirm.x-button-pressing,.x-button.x-button-confirm.x-button-pressing:after,.x-button.x-button-confirm.x-button-pressed,.x-button.x-button-confirm.x-button-pressed:after,.x-button.x-button-confirm.x-button-active,.x-button.x-button-confirm.x-button-active:after,.x-toolbar .x-button.x-button-confirm.x-button-pressing,.x-toolbar .x-button.x-button-confirm.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm.x-button-pressed,.x-toolbar .x-button.x-button-confirm.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm.x-button-active,.x-toolbar .x-button.x-button-confirm.x-button-active:after,.x-button.x-button-confirm-round.x-button-pressing,.x-button.x-button-confirm-round.x-button-pressing:after,.x-button.x-button-confirm-round.x-button-pressed,.x-button.x-button-confirm-round.x-button-pressed:after,.x-button.x-button-confirm-round.x-button-active,.x-button.x-button-confirm-round.x-button-active:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-round.x-button-active,.x-toolbar .x-button.x-button-confirm-round.x-button-active:after,.x-button.x-button-confirm-small.x-button-pressing,.x-button.x-button-confirm-small.x-button-pressing:after,.x-button.x-button-confirm-small.x-button-pressed,.x-button.x-button-confirm-small.x-button-pressed:after,.x-button.x-button-confirm-small.x-button-active,.x-button.x-button-confirm-small.x-button-active:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-small.x-button-active,.x-toolbar .x-button.x-button-confirm-small.x-button-active:after{background-color:#628904;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3e5702), color-stop(10%, #507003), color-stop(65%, #628904), color-stop(100%, #648c04));background-image:-webkit-linear-gradient(#3e5702,#507003 10%,#628904 65%,#648c04);background-image:linear-gradient(#3e5702,#507003 10%,#628904 65%,#648c04)}.x-button.x-button-decline,.x-toolbar .x-button.x-button-decline,.x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round,.x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small{border:1px solid #630303;border-top-color:#7c0303;color:white}.x-button.x-button-decline.x-button-back:before,.x-button.x-button-decline.x-button-forward:before,.x-toolbar .x-button.x-button-decline.x-button-back:before,.x-toolbar .x-button.x-button-decline.x-button-forward:before,.x-button.x-button-decline-round.x-button-back:before,.x-button.x-button-decline-round.x-button-forward:before,.x-toolbar .x-button.x-button-decline-round.x-button-back:before,.x-toolbar .x-button.x-button-decline-round.x-button-forward:before,.x-button.x-button-decline-small.x-button-back:before,.x-button.x-button-decline-small.x-button-forward:before,.x-toolbar .x-button.x-button-decline-small.x-button-back:before,.x-toolbar .x-button.x-button-decline-small.x-button-forward:before{background:#630303}.x-button.x-button-decline,.x-button.x-button-decline.x-button-back:after,.x-button.x-button-decline.x-button-forward:after,.x-toolbar .x-button.x-button-decline,.x-toolbar .x-button.x-button-decline.x-button-back:after,.x-toolbar .x-button.x-button-decline.x-button-forward:after,.x-button.x-button-decline-round,.x-button.x-button-decline-round.x-button-back:after,.x-button.x-button-decline-round.x-button-forward:after,.x-toolbar .x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round.x-button-back:after,.x-toolbar .x-button.x-button-decline-round.x-button-forward:after,.x-button.x-button-decline-small,.x-button.x-button-decline-small.x-button-back:after,.x-button.x-button-decline-small.x-button-forward:after,.x-toolbar .x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small.x-button-back:after,.x-toolbar .x-button.x-button-decline-small.x-button-forward:after{background-color:#c70505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fb6a6a), color-stop(2%, #ea0606), color-stop(100%, #a40404));background-image:-webkit-linear-gradient(#fb6a6a,#ea0606 2%,#a40404);background-image:linear-gradient(#fb6a6a,#ea0606 2%,#a40404)}.x-button.x-button-decline .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline .x-button-icon.x-icon-mask,.x-button.x-button-decline-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline-round .x-button-icon.x-icon-mask,.x-button.x-button-decline-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline-small .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #fedcdc));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#fedcdc);background-image:linear-gradient(#ffffff,#ffffff 2%,#fedcdc)}.x-button.x-button-decline.x-button-pressing,.x-button.x-button-decline.x-button-pressing:after,.x-button.x-button-decline.x-button-pressed,.x-button.x-button-decline.x-button-pressed:after,.x-button.x-button-decline.x-button-active,.x-button.x-button-decline.x-button-active:after,.x-toolbar .x-button.x-button-decline.x-button-pressing,.x-toolbar .x-button.x-button-decline.x-button-pressing:after,.x-toolbar .x-button.x-button-decline.x-button-pressed,.x-toolbar .x-button.x-button-decline.x-button-pressed:after,.x-toolbar .x-button.x-button-decline.x-button-active,.x-toolbar .x-button.x-button-decline.x-button-active:after,.x-button.x-button-decline-round.x-button-pressing,.x-button.x-button-decline-round.x-button-pressing:after,.x-button.x-button-decline-round.x-button-pressed,.x-button.x-button-decline-round.x-button-pressed:after,.x-button.x-button-decline-round.x-button-active,.x-button.x-button-decline-round.x-button-active:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressing,.x-toolbar .x-button.x-button-decline-round.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressed,.x-toolbar .x-button.x-button-decline-round.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-round.x-button-active,.x-toolbar .x-button.x-button-decline-round.x-button-active:after,.x-button.x-button-decline-small.x-button-pressing,.x-button.x-button-decline-small.x-button-pressing:after,.x-button.x-button-decline-small.x-button-pressed,.x-button.x-button-decline-small.x-button-pressed:after,.x-button.x-button-decline-small.x-button-active,.x-button.x-button-decline-small.x-button-active:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressing,.x-toolbar .x-button.x-button-decline-small.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressed,.x-toolbar .x-button.x-button-decline-small.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-small.x-button-active,.x-toolbar .x-button.x-button-decline-small.x-button-active:after{background-color:#b80505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #860303), color-stop(10%, #9f0404), color-stop(65%, #b80505), color-stop(100%, #ba0505));background-image:-webkit-linear-gradient(#860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:linear-gradient(#860303,#9f0404 10%,#b80505 65%,#ba0505)}.x-sheet,.x-sheet-action{padding:0.7em;border-top:1px solid #030507;height:auto;background-color:rgba(0, 0, 0, 0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(50,74,103,0.9)), color-stop(2%, rgba(12,17,24,0.9)), color-stop(100%, rgba(0,0,0,0.9)));background-image:-webkit-linear-gradient(rgba(50,74,103,0.9),rgba(12,17,24,0.9) 2%,rgba(0,0,0,0.9));background-image:linear-gradient(rgba(50,74,103,0.9),rgba(12,17,24,0.9) 2%,rgba(0,0,0,0.9));-webkit-border-radius:0;border-radius:0}.x-sheet-inner > .x-button,.x-sheet-action-inner > .x-button{margin-bottom:0.5em}.x-sheet-inner > .x-button:last-child,.x-sheet-action-inner > .x-button:last-child{margin-bottom:0}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{position:relative;background-color:#fff;-webkit-border-radius:0.4em;border-radius:0.4em;-webkit-background-clip:padding;background-clip:padding-box;overflow:hidden;margin:0.7em}.x-sheet.x-picker .x-sheet-inner:before,.x-sheet.x-picker .x-sheet-inner:after{z-index:1;content:"";position:absolute;width:100%;height:30%;top:0;left:0}.x-sheet.x-picker .x-sheet-inner:before{top:auto;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;bottom:0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #bbbbbb));background-image:-webkit-linear-gradient(#ffffff,#bbbbbb);background-image:linear-gradient(#ffffff,#bbbbbb)}.x-sheet.x-picker .x-sheet-inner:after{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bbbbbb), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(#bbbbbb,#ffffff);background-image:linear-gradient(#bbbbbb,#ffffff)}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot:first-child .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot:last-child .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative;-webkit-box-shadow:rgba(0, 0, 0, 0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-webkit-box-shadow:none}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:-webkit-box;display:box;-webkit-box-align:stretch;box-align:stretch;-webkit-box-orient:vertical;box-orient:vertical;-webkit-box-pack:center;box-pack:center;pointer-events:none}.x-picker-bar{border-top:0.12em solid #06346a;border-bottom:0.12em solid #06346a;height:2.5em;background-color:rgba(13, 117, 242, 0.3);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(158,200,250,0.3)), color-stop(2%, rgba(47,137,244,0.3)), color-stop(100%, rgba(11,101,208,0.3)));background-image:-webkit-linear-gradient(rgba(158,200,250,0.3),rgba(47,137,244,0.3) 2%,rgba(11,101,208,0.3));background-image:linear-gradient(rgba(158,200,250,0.3),rgba(47,137,244,0.3) 2%,rgba(11,101,208,0.3));-webkit-box-shadow:rgba(0, 0, 0, 0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;position:relative;z-index:2;background-color:#345b89;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #85a7d1), color-stop(2%, #3e6ca3), color-stop(100%, #2a496f));background-image:-webkit-linear-gradient(#85a7d1,#3e6ca3 2%,#2a496f);background-image:linear-gradient(#85a7d1,#3e6ca3 2%,#2a496f);border-top:1px solid #345b89;border-bottom:1px solid #182a3f;-webkit-box-shadow:0px 0.1em 0.3em rgba(0, 0, 0, 0.3);padding:0.2em 1.02em}.x-picker-slot-title > div{font-weight:bold;font-size:0.8em;color:#0d1116;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-picker-slot .x-dataview-inner{width:100%}.x-picker-slot .x-dataview-item{vertical-align:middle;height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-tabbar.x-docked-top{border-bottom:.1em solid;height:2.6em;padding:0 .8em}.x-tabbar.x-docked-top .x-tab{padding:0.4em 0.8em;height:1.8em;-webkit-border-radius:0.9em;border-radius:0.9em}.x-tabbar.x-docked-top .x-button-label,.x-tabbar.x-docked-top .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-top .x-badge{font-size:.8em;line-height:1.2em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tabbar.x-docked-bottom{border-top:.1em solid;height:3em;padding:0}.x-tabbar.x-docked-bottom .x-tab{-webkit-border-radius:0.25em;border-radius:0.25em;min-width:3.3em;position:relative;padding-top:.2em}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{-webkit-mask-size:1.65em;width:1.65em;height:1.65em;display:block;margin:0 auto;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-label,.x-tabbar.x-docked-bottom .x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-bottom .x-tab .x-badge{margin:0;padding:.1em 0 .2em 0;font-size:9px;line-height:12px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tab .x-button-icon.bookmarks,.x-button .x-button-icon.x-icon-mask.bookmarks{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAHC0lEQVRoBe2aW4hVVRiAx8t4qXFMvGZGeLcblUVWdJEoiTIhI9KoHiIyKyh6SOvBh166vPTQQ2IXkKyIktIyLQzLUoMkSbKoVEwtK2+VZWrl9H3bs4Y1e/a5eDxzDsycHz7X2muv9f/r//+11p6zt91aWloaupJ070rO6mvd4c6e8XqGO3uGe5biYDck188y1LOGeuS3Hvs8AVrrWZ0LtUU27VbIbrCRlMVsluQwBptgHEyHS+BcGAxBDlLZCOvhY/gQ/oD/oFxxuw2Fy2AKTIIJ0AuUf2EbrIF18A7shcOQX0xCPhh1KsyEVWAES+U7+j4Co/PpLtTOOB2bA7uhVJu/0fdZmFRQd9ZNBvWB6+AjKNVgVr+vGX8fNEO3LFuhzftgRu+HrZClr5S2fYydC8Ohe9AfynbZpdPJ8CTsgSwDLiWXjcs4cIj6P3AUssYsoH0kZDptO4yHFZA13rYjoJ1g8+9cWz6bn3D/UmjjdDIBGhPhoOhL5WmYBY1J47F/gkGNfAEb4Ptjt5J9ehp19/XF4N7uDToRxL28Gu4m0mavVXKH02ganoGprTeOVXTG4Bp8HdgEv4L7WxsT4WoYlLvuQRmLc50Nn2NXHwhnbg9T9QDTWTMYR9nM7YTH4WzoDy55HQp4kPQDHX8AvgEzEuuxvhD6BZu5OZxO23JIZ8rxHkj3wDBoApMQbOq0q3E43AKr4U9I61lP25hgM3GYBpVMASMZT/IvrpdCwYMgKAsl/UfAc+CKiPUZPAPXI+esWZqf6mP//eD4gUFnsZK+JuEx2AGxTesvQHNiM2fYCfooiTsaYU+9IcWMZd1nnBl4Anw8xXpdkpPB+zMgvaJ09mHI3O9ZtuI2xt0EuyC2adZd2tpM9oKHVNzBTLwKJ8XKyqmjw1PXgybWv5LrK+CrVPsBrm8rx048Bh3T4KeUbgM9CZI9kI7Il7SPjZWUW0ePS+098OAKTptF92ccCIP8FPQs11YYhw4zOQ888IJNy9eh4cZUo0tsdhhciRJ90+GXlJ14ItYN8qhK2FMH0gye7LGdI0aiF8RipN+IGypQfxcdnxXQo81lTHRrgT7HdQtdnh2LUoMadTgJR3TDa5daxQTjHoBvgqd+lvjYW5Z14wTb2vmRnFoZSn1MVVqWoNBHRloMsEtvXfpGBa7b+ZHP4QrYaqsit8QWt21Nrn7n35e576Ojw6VqDuc8WUuZdsy95oldFam2w+7ltBwlu/5FVhWptsPt9lRVvIyMVNvhyHRtqnWHaxP36lmtZ7h6sa6NpXqGaxP36lmtZ7h6sa6NpXqGaxP36lntchn25XtJkvtC0JfOvhLyxVz8Q8Af8f4SksP8+vGVTUUk9zVEm841/TrKn5q+qNNmSb+4ijqMwQEoHA5nwjlwBoyHeHX4RnI7+PbzW8b4iWMHk/iZ8riF8QZUm+PgPBgDg8EvELEc4sL3YNsYs4FyC+zCrm9FMyWfw4dQ0MSIa+F6uAb6gxH2c0c60jQl35XMrFl2Ip+iYznlKibgpIoK/Z3PRXADTIFRoPPa9F4PiMWV5Qcz7WrTd2YfoOctSl8ZOZd24itUBwZcGnfB27AbVOLSCfdLLZ3APlgLD0JvmAzx+2l1bSEgFMmHsYWUm8G3IOkvEqXadb6+dPcD+SuQHpe8M44bde5HcMJxe1y3T0AHCgXE6DsBjT8EaUd20nYnuA0MdiFd3tNeMZvO1b3tx7V43i0ePGY4/XLNTvGhxGWDX9j3ghnbAlvBfhofASPB5egydN93h1gMoJkbEjdSNwDqHQTpJWsAfMm3AQyIifDaubmtxsBYuBAc3wwFxX2RJbGzLmv3w4uwHpy4WZMg6hH323i4AybDaAjiPUmL44amGn2fvBH8ILAEDJQZMzhmWXGOjTk8b66EaXA5DIO8YobbpD26XkHdyRu9Xu61YtBPB8ywE1gE+yGf/qz2TfR/FAxWUzF74T59DeZAmAFrIEu3be32sI1Ocg64RMr6uMU4l7TP7anwA+SbQGg3c/NhApQU3OBsXDLWgJvhueAqDPpD2c5h9+pM6BMrKreOHidwFbgHg9F0qbMvgSuprO/C6fmhx6fCLNgDsb02Duvs7dCYVnAi1+jzMDofXK6x8VB/nvZTTsRG1lh0erDNBvd/sNXqsI33QkWdDRNBr0vc88KgBuOWK2Fw6FfpEt06vQB8mmiv4eZc5X3KAZU2GOtDv8t7HriENe7z+YK4T0fUsXEW+GhLHL6VymaY2BHG0jqx0w9eA4273Nr8P6p0/0pcawOmwEEj7jNvPoo9VDpcsHOAv3VdYp7gS7k22x0qORv+jb3Yh/co2E+jj6KqCIZ93PnM3I5d91ZVBLtjdVj8gyJZ39WwjOHEZi3stvmvh9VwttY23MxdSuoOd/Z01zPc2TP8PxKYOEKWmL1pAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.download,.x-button .x-button-icon.x-icon-mask.download{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGb0lEQVRoBd2aX4gVVRzH3V1dU5JMk9Q2wVxCo0QNTYRYS4l6CBFBomA1qjcjSOgPPUgR0VNBFBT0Bx96qAiSXipCH4rKIhGNUqE2SK3MqKwsLbXPZ7rnMo73jnPnzF6v9wefPefMnPP7/b7z58yZudtz6tSpMaNlPT09E/DdDxPhMpgNJyBtfTRG4AAchePk9BflqFhP1YIRqbCZsACWwjWwGIrYZ3TaDZ/ATjhIfh6IyqwywQhdRlaLYBVcB5Mgxn5n8HbYAjsQ/lGMs/pYz3AMOFLgG/AzeH+MBvo2xqqYXB1bSiyBe2EJvAaH4SSMhtC0T2MYy5jG7i0jvmXBBJoMj4D3VjuEpkVbN6axzWFyq6JbEkyAhfAqOJtmE2l32xzMZWErogsLxvE62As+Vtotrlk8czGndUVFFxKMw41wEM7FJdxMbNhuTua2sYjoXME4cVHwEDhZhACdWpqjufblCW8qmIHOxHfCT9CpIrN5mas5N53B8wS7kPgKOumezQrMts3VnJc1O8sNV1qsmq5k0LNwI3hZx9ovONgEPk4amcvRR+HiRjtb3KborbAB0fvOGJs9EnRwwf88HIHsESzbVuisbKzQdh/Yp6z/7DhzV8OEECOU3qd148z20FgDK+DC+o74in59Y2pm7rNPVWbualhT01T3e5pgts6D9eARrzIB3LXVzF0N60FNdasL5kj0sXUtzIf+eo/zt6IGtaytaUuU1AXTugKuhyomjsR5B/xRi5rUllgimCMwltYQzAHr3WJqUdNQTWOyuFDcpbASptnoMlOT2tQ4phfl3uBzwes9byZl93lpalLbXLV6SXtzr4BuPLvISkxtauxX8DjwW5Qv9t1qalPjOAX7vJoB3TRZIec0U5saZyl4ELr57CIvMTUOKngAqlxGJt478I8aBxQ8Hbpxds4eczVOV/BUuCC7twvbapyq4Ha8JPQVOIBF+hRwk9slWVLm9miy8xjbj0PRA/YHfU828eVm99mnyFziu6/9XT+Mh5as7KPIoE/BB/BPgYgeoP05/dx3OxQR4LrBF4IHoWUrK9j7wZeNzXxJGGk5amYAPvyovj2zuWGT1eEcdjwOpeYdL8mytpyBr5BAW5akroOxy4n5MiyFUqZg78W8+yvPsZfWEyQy3WzyOsbsq/n2Q9+TYMwypsbjCj4EXlJlzPHDcD/48W+0TN8PgF9kyh5YNR4y4e/AGbKsOVveC8OcCSeUSg2fir0H7oayc445qVGtY5bBHnDmjeFXxt8GY8Mn0dhSX+Ds/RvE5OZYNao1eQ/+kNJrPNapoocg9/edIgdCH3AL6DM2L7WpcZqXtKd6L/wJsXYRDl6ABVyK+i5ltbGLGfw06DPW1KbG5NY1MS+bbyD2SIbxO/G1HFo+046BG+ALCP5iS7WpsTf5MY3KPPgYTkCs8zD+XXzNLHL5hj70dwb2WbsNgp/YUk1qm2ecINh/MXoMfoTYAGG8gV6ES4Kgs5X2hZegivkk5KEmtU2qC04q/082u9gROlZRmvgmSH6lzBNMHx9pJlZF3LQPNQ2F2PXfh9noEvF18AGdHhBb/xd/d4SAzUr63AX2jY2XHq8WNU0LceuC3YCtBiecqgP7HF0XgmZL9m2AI5BONrauBrWsTsfLCnbV9AxU8ezLJnwAv2vSwa27DX6AbP/YthrU0p+OeZrgWgLO2FvB99zYoNnx+/B5dUiA+kL4FrL9YtvmroZkZg7xEn3pRqjTcRhGIDZwo/E+rpyNZ4D1Rn1it43gdzjoSZdnnGF3Yq5h74Oq76sg5D18b4PQrrI0Z3NvuKZvKLgmegqDNkPVs3aV4rK+zNWcp6TParreVHBN9ACDt8DfkHXeaW1zNNeBtMBsPVdwTfQgTt6CThZtbuY4mBWYbZ9VcEr0mx0qWrHmdlaxiZbsEWjWxuFkeBhcm7pkPNeXtDmYizkV/r/pQmc4HAQc+934ZtgBVa/GWjmAxjYHcxkf8itStiQ4OCTIbHgO9kM7z7axjGns2SGfVspSgkMAgq4EZ0b/i3U0hevbGMZaGeKXKRv+cylOCxufY/xCcS3cCl5ii6AXqjCFeum+A2/D54j0Pbu0RQsOkRHu+6zP7avgJvDsz4VWxStyD7wPrsi+hP0ILfIbFl3zrTLB6TCId3KbCK6X58MSmAOuocW69jUcrmH9U9gF38NRRB6jrNT+AwkLDdxcvfCRAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.favorites,.x-button .x-button-icon.x-icon-mask.favorites{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFfUlEQVRoBd2aXahVRRTHz/Ujv+2mZRGZB7W6mtpFikC7+UWUZiqBD0JPFdRL1EMFPfjoU4baS0FUD/UWZBEVShA+BCpmWApRSkgllNpDmZWZt9//eOay72afvWfWOTPn3rvgz8yeWbPW+s/XmT379AwODtZSSQ+CryVgA/gVfIx/pelEhFMBVlvBOaBeFo6Cean8y09KsnMg932TqCOs9M2UhMfhMJVsxtHcAmcbmekLCsqjFKUkvAYG1xSwmEHZqoLyKEVJCDOCNxH9HUCbVl6mULAuXxjrOQlhgl8Bbi0h0Uen3FBS37GqVIQHiHh2SdR16jTlo0t0woycpuxiUDSdHcFeMv3uIWYanTDB3wIWVZBQHP10zuQKvbarUxDWT1HRz1E++Ds99fLtgp6jEmbExhPNcs+IbkZPiCpRCRP5TPCQJ4MJ6A3QSUqjSWzC2ozuC4j+fnSnB+gHq8YmvJKIJgVEpRPX9QH6waqxCa8PjEhHT981H2j6qno0wqzF63BhOUxsom3Zb7aJqGsUjTAONFJlpysXQz7VuXpavrBTzzEJaz1adlzNjHs6RTBvJyZhjZTF/kTaWZZCnlvhsyWgQkPZQpagzsX1bFlAXjGtDdAPUu1p3PPQhCCXkdwG/mta0PWLds060AuAnqtEOjpdbQR3VymX1P9F3UfgGJA9X9F92c/ADaQ2P8V0DJ4/kDbeYKaSvgI2AN0+OGJK1VAbSIhTOXEOybYll2kte77yD4rqrHyb85S9Cl4HtReAyI11/A7HpRq5PSD6oR0f3Rad+H7S1DvV7UgS+tc1cU3n3V/AWJ/SX8BxVuMinow2rNNjlPQVeH0GFg378kDBfLAPXARjZbTPwmUXmOG+bgz71EKFfqKeAUWfREZbJxyCxyOOqEuHER4qrNUWovwy0CFktBHV4eNZMNvxyaaFhKWAaBt/HJwEo4W0luSKLMF8viVhp4iBeeBd8CcYqcQ1qi+CKS7uVmklYdcQY0+C42Ckkf6EmO51cVal3oRlCFkCdKgfCWtbo7obDO3AVWQbHHyUsjo40E6uq9cvQbdG+wN892fj8s0HjXDWKA51/t4JUo72H/jTDtybjSUkbyYsJ0gdfAtSjfTn+JoWQjCv2+57a4M1QaQSvZvrMsIs7RJejGcdUlLJUhzpZsYsZsJcCen6ZwCE3IaYA2021OfUdU3fJltmwni7Fvh+KDMF16KR3ux0lWuSdgjPxeNdJq/tNdKNqJaSSUyEmVK6JNPomtqbIh3eSKNsEmvAarfJ5LEzjbbR59MtpqyEb8eZjpndkhtxvNri3Er4YZxpx+yW6Jdhi8V5MOHm+n0QZ9afo0u0fQO8A5S3iPaQ1cTSG9w4f/SqesZBH/gRWI6T+gyyxfkgvw2cMdrS+/lTzpZvGnyWxsnTwHLRd4R2a/OBqQyoztKBe/P2qp6DCBOUptKHhuA+pU1fq2Co0/F0L9CVaghxXTbWW9ktKg8lrFfCrwODeh/9wgu1bEDo6OT2Fvgb+JLWq+nQEsnaa5UPJbwKBxc8A9KXPG1O3u+u6E4F24GvD3XMDjCxFcF8uTdhjGpHfwn49L42lCeAdyDZwGi3HpwAPr6+Q29htn1ZPoSwfuz3ewShXVcBNz62lzkvq6O9DjZHgQ9p72kdQljvob9VBPAN9Q+UEQmpw5b+Sf8e0FotI/4a9ZN8bIcQXlnh9AD1y3ychuhgU0tpJyhb14epn+ljN+Sk9S9G1ct50d8SdgF9x9EO3lHB5hXwPEYfA8dbGD9LuWZBtfj0inSQWUDTKzu1dAB5Dkz2tdOOHn70LvwVyMag/FYwzse295Rukq5j+G1wEOib66PAy5FPMD46+NPmqTV7CpwGGvkJPm2l8z8GWDNDloqpGQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.info,.x-button .x-button-icon.x-icon-mask.info{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAHOElEQVRoBdWbXYgVZRjHXdf8ysjUQl011lbRIFEjM6Uu0iyiEDG86EItKoIuuhDJCgoioouugqKbgi4CKwulILG0mxLTUtMyTWQNPzLTPszU1cx+v+OZw9nZM3POmZl3zQd+zMz7zvs8z//MvF+z2nLhwoU+oaylpWUQvvvDYGiDdjgP1dbKRSccglNwlpxOcwxiLUULRqTCRsNUmAk3wS3QiG3hpp2wCbbDYfLzhyjMChOM0FlkNR3mw61wFeSxv2j8FayBrQjfmMdZpa1POA84UuD7cBzsHyHQtzHm58nVtpnEErgvzIB34Rj8CyGEVvs0hrGMaey+WcQ3LZhAQ+FZsG/1htBq0Z4b09jmMLRZ0U0JJsA0eAccTeOJ9Pa1OZjLtGZENywYx0tgDzit9La4pHjmYk5LGhXdkGAcLoPDcCle4SSxUbk5mduyRkSnCsaJi4IV4GARBSj6eALfR8sxunLEMUdzbU0TniiYho7ED8GvULRI/UV9cDbnrsauheXQCVnjmas5J47gaYJdSPwAIfqsPlfEnwRl/eBBOAlZROvXnGfFfUfXNQXTYCKsg38gS+B6bT6MEogfiTcKNuaIa87mPjHu2+segrnRBf8bYN+ql3jW+ntrJVNK6OJGw+VkVt+2M3c1DIrHsZ9WjPVwCxcLYQ4MqVQUf/Jjikt3VnnX4eauhoVlTZVw3QRTOhmWwjhQfCi7ppZjkjOf62FCrfomysxdDUtBTRWrCCZYK6WLYAo4aoa0JxKcu2x9CsYk1DdTrAa1LCpru9g2ese58lddD+cgT/9ppK2j8ONR7HLf9Um8B0XOCmpR04QoVmnQosDp4BHYD40kXMQ9zsPfgSI/hyNQhN+4j/34VVu/0g9b/nXbKFgJf0O8weV+rSa1tam1b3kUm0SB77sj5KUw18OhTE1qm6RWBy07t0O4S7veto8J6FLwbng+YHC1qbE0GDtnrYXeGKzsHj7NT2AejKgMJn36DODaASZEF1KbGof4hJ2vXM45cIW2nwjwKDyA0HXgDicyl4RpC5LovixHtalxnCcd4PwX0hTjcvEFRO5ICBRyoWNINXYo2Ek+5DJyP/6fgZWI9XVNs3r1aW3r1alxjIJHQqjR+Vt8L0fnpxzrmU+45pKzXsMG69U4UsHDYWCDjRq9zYFpCzwGLi5K5qyA+KQpSMHt5VtDHNQ4XMEh+s5R/L4CuxSIUKeDO8BX1pG4lrlDmlqrosCy0jxcoL+KK5PvgFbEOka8CKsgbRd0u/dDUPMJh7ArcXon/A4PwwxwyvkKkuwuKi5bwYqaDbdBNAP8wvn3kGQ+4RDdq1u8UE/YINUjv313L/35bLfo5Qte+xs5va5WXdFlrrRMImnkLCreaRxtSnE2i7q8n3VS3Jeq1HhWwY6o7k1Dmn/r3ZgSYCZ1g1Lqi6hS41EFHwC/QIQ0P5D7vbiH8Tq7DnD7Frr/qvGAgvfBnxDSNqcsOJx7Xe2FNjXuU/BeOAah1rHn8f0FJJkDlk85pKlNjXsV7KPeA34KCWUuM5OsN760qE2NJxXcBevBfhbCOnFqsB5G/72aQj8vVVuIN01tauyKFvPbuHBhEGJ6+hK/SSLaqBsPmrFfhZe9KND0q7ZtjiM+Ye0guIXzPS/atuPQflzLxlI4Go6AOys/wq+Gn6EoU5Pa1Fj6G7Dfpp0nfeT+EkXaOZx9jf+kJ+xqbAPcxy1vwhnOd8MuKMrUtB7fauz2HcsgBuuAQVCEHcLJ8RRHrr42kExpWqRPu3mYDTektGmmyhVe9x+QYJU/mVK5AHwF/QblU8nLWnyMrY6Rds69T4Kvd964tleDWhZUx6yItRBzo+7A8QcUEXQVfkZVB6x1zj3GfQ587YqIqw81qKV/dcxugsuiJ3OT/cr+lzf4S/gYXB0wfk69HwX8YRxN88aL2pu7Gib3iBcv8BpbDJ0QOch6fB0fNf+1HOVXwD2wE7L6T2rXic/FNbXVLLw4mNmfTuRMZi/tx8djUDYHPgAHlaSks5abs7mX/lrYI3a8ILqmwTB4G9xWZQ1uu7egHQbC/aBQR+88PpPamqs5D4t0xI89+nD1DTT0A9waOANJQeqVu+j4Ddx3u26vd3/WenM01zHVGuLnqYK9GXNeXg15RGcV0Wg7czPHjrjA+HVdwVWifRX/j6LNydzqii1pif8CSdc4HApPg0u1IqeQRp9i/D5zMBdzqjkT1NLS0BOOGuLYv+E6lWyFolZjcSGNXBvbHMxlQJRfI8emBEcOCeKo+xq4A+nNp20sYxq7PcqnmWMmwVEAgs4FR0Y32CGF69sYxpobxc9yzP3feMo7nJtJxDnWV2w6RPtsTnOZQn1118JH8A0ik/bWVNe33IKjEAh3qei87Ue5eeDTnwTNilfkbvgM1oHb1oMIdX2c2woTXJ0J4h3c3NyPgikwA9zjjigT7Xf3ce0XCfF8M+wAv3icQmQXx0LtP/qKurS9uZqyAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.more,.x-button .x-button-icon.x-icon-mask.more{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADJ0lEQVRoBe2YS2sUQRSFp5MgvmLU+CAMiBJFDBHcCeoPEFciuHMjroMK4lZBcONG0JW60U1UEgRx59IXuNMoKEElKL7GRwyIqNHxO0N66FT3UNU9IHRNFXz0VNW5t+vW6RcT1ev1Sie1rk4qVrWGgn13PDgcHPZsB8Il7ZmhqXKCw6kt8WwgOOyZoalygsOpLfFsIDjsmaGpcoLDqS3xbCA47JmhqXKCw6kt8Wyg6XAURV2wEy7BM5iFtzAKu2BB0dqJ7YEtcBYmQblfwzjshUVt5O4mfhjOwwQodw3GYA8snpd77n9pFXMYvoP+qDaZZewcVKXPAzE64Qn4CmZe9f/AFSiSu4e4IzANrXJfZ24gXjO/KxEcg9+QFZQcU/CSONh2RKsraMQhr85xE/psOeN5tCr2APyA5Bqzfl9D06tYtX3wC7KE5pg2ZX98UtsR7XZo5ayZW/1DENnyzi18CO1nyMqTNXYcrTapcitHkBLJiZW2RaGRuxcg6+Stxu6i73fI3Y3uZM7cU+hXQeVvzsBP6Dc5LupxztzaiEGH3AvR3S+Qe4dc0D2cp/Uj1oPI1pR7g030n+erWlTe9pMA3cu2Jre+2ERtzBdZe01BL3Ke9Al6vQZsTbfKQ5vImH9PXxtqa3qVPbWJjHk94J6r4DPGhK17A8EHm4j7UAWP2nTG/GX6NWMs1SW3rrCroLeLaxtDqDdG4368zbHVkzM5Polus+2hEs+j7YNxx9zv0FkfhoncvegvOuZ+iW6rYhtfTXTWgV7OyeLM3w+Y3xaf0PVIzAqwFf0IzW7XnLGOmLUg58y1JvsTzA83Y5o/eLcyMQISJAN0z56G9bE275HYNXAU7kAy9xv6p2Bj3pyxntjVcBDuQTL3FH19Dg/FWh0bXzUMNhsf23JkOQzCK9B1P4NY39OFG3kjgpeB8g/AR/gG0+3mJkeF9Lp9lkIVZkDfC1r3vPs8VTAir1uRd1mpNyQUXGr7HBYfHHbYpFJLgsOlts9h8cFhh00qtSQ4XGr7HBYfHHbYpFJLgsOlts9h8cFhh00qtSQ4XGr7HBYfHHbYpFJLOs7hf5j4Vg3iLoGkAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.time,.x-button .x-button-icon.x-icon-mask.time{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAIPElEQVRoBdWae4gVVRzH97qr66vyhWbmurY+MA111dRMkLIXRuhG/pMVSUKGBGYPMTLDR0iaJBFUlIp/FJJlpWJS6vrAlCwTe1iaippSZipmPjL7fC/3XGbnzjkzc3fudTvwYWbO73d+jzlnzjkz96YuX75cUqiSSqWaYVs0hvZQBY3AW/7gYg/8A+fgPDFd5FiQkko6YZJUYj2hNwyDAXADlIOrHEO4A3bDVvgZ9hLfBY6JlUQSJkn14CAYAiNgFPh7kqpY5SDay2EjbCfxo7Fa25TVw/UBuw/BWvgT9HwUgl3YnQXX1ydWtc0rWRyr9zRcV8FpKESSfpuX8LMXnoDm+SYeO2GcXQfz4Cz4gyrGtSa3TaDHp1HcxGMljIN+sAGKkViYj+PEMRkax0k6csIYfgoOQVggxZa/R0ydoiYdaZZmFp6C0ZmgNTVu0YSzBQ6A1tuTYEqKk5ugA/SFkdAU4pbVNHiYpLWmu4vrztBSy83TcAai9pyeba2lz0E1tIFysD5vyMrgKugIY0GToW5MVJ/SWwltXPlIZh3SNNbdV9B/QRTH59GrhQehSZhjl5z2pucXc/4rRPEvHfV0B6dtm5CGI+B3iOLse/SehVgTiM23tx6bGuafwb8QJRY909ZlK7CHadATtOZFcfAmel28QSZ9jn0914/AYQiLScvW45Cen/yx5CSMYhNYA2GGtdGfDS38Rm3X6GpO0PNsKLPpBtXTbij8BGGxaWQODrThr0RxEuguuYzqeZ0Opf72tmt09TKxHU57+JLz7rY2QfXo3wpRkt6MXs7QrtPDKHSDfeBKVpPYjKBgXHW0mQVBz+HzrnZBMuwo6b3gilNb0Yn+9v6E30UpKCiv4WnoBD4ffuPea9q8YrE91asX9Rxb2loeBG9s/nO9YlZ6bWZf4dhc9EB4B2hJsBXtYd/AgAzHLfm0cfnYhvBlUE/aSlcE473CdMIkqyTvhU5eoe9cE8E8cvXulHwqxbvM3PRFeFzn8FqKbDTpdTQ6pof1BlQDtt5V7yzDySemYUM4Eo8mz4WgFwlb0RJbbYQm4e5U6JmwFe125tiEV7KepLWlFJp7goqW2WH0spbEkkacqOJ+UPfbylIMK+mGWl4lsLOO4DR69Tynv1y04DhSF5aiDcY7FllDqdbLSq0jmB7IKiXXkNYDrXFuK+sRHLMJG0I9o09zzEeOWDQ3DWI0lyphPbuqsJU1CFzDxdau2PVfhMSpiaupEh7uiEyJfsUNtE0IjqZFF2mmdi1R+j6eTriLI7T9yLT+/h/KBYLUHttWtPSWqYevtWlQfxjOOORJiJIaPRcJ5pAjIC1LnZVwL4fSEWSFTvhqh//IoszEtSekQYUSdpUTCLUsFbI8wOw5HvRNq75Fb3LOEpawa/Z2Gg4Q2mxpjdQ6v4KkBwa0i1Nl85G1EZZwVjGBE/Mx0GbqNgQfkvQECA3cZiSkPqWEtQG3lQoEiTxj2FkCW8E1SXVG/josJecqjnGLNlGuck4Jf+PQaIcsn4/vOSaZVLTE3Q0LwLVz095en3rXknQNlHMeWtBTLl1DFHdIri2ZtmZBaFnqo51bkmBT79660UE+vXV6DOZCVZh/dJrDUvC2956fRtYeSmaAV+A/vy/MWT5yfGr4PQNa9vw+/df6VDMRrB8NkWk0/gL+tuZ6G7JroOQeh5KU50Csz6lRbwB2NQyHwhYI+1Kqbe770D7IPvXaOmp+MAn6j5pDmkH6hywZ8yuY653I2gY5SaoO+y1hKujHMOPXdnwJnZwOoG52SNsJildFzlaCzYHqRyWVnMsOfsaAetsVyzTkdX674lrP7z5HO80F/U3CGlb6G4HLSS3ynLvqCj5fGX5ag37o/g38MX1HXc6Qzui7HolPTbv07MtFPzgKfgfm+m9kY/JNIp92+BsCmmhMDJrcJvltUaeXn689ekbfe3wSefrnWpOw9rHa3nmV/OebkLf2OyzkNf606XkNDsLbkPPrJHUa4hfAH6+51kipNnFm11cqtTa6Gko20zRsCEfiuREOgEku6LgKeXY58yasRTlsaGgjkr1bVzJp4tDHx8UQlKSp0+ozzhtnNmFVUh6DsI3At+hUeo0U+xz/KVgIJjHbcTU6dR4Df8Lat34cwdAGdDoWO9FMp5Tiezq4Hj/dAHVceinyxlkn4YxB7ViibADWo1fUnsafOmQW6KOErVdN/Yvo5PzKmZNwJmmtg6ah66gXgAHeO1ioc/y0g7kR49qIXqugWGwJl9EgyjOim6GJbCaE/mUoKIAoddgeDdvBdfONTDuuXja7gQlLmdIKwrZ5xol2ObqrYyC7BNicRq3HVm9YBPpUbHy5jifQe9Rl35pwJunBGNgV0ZkC0Z5V29BR0AHKXc79MvS1zdVmoy/Mg+PgStAr0yQ1BZw3PP1Qo2QtfEnQJLYY+liVggVHqF4O60DDXjsezax6ETf7Xo0iTUQ6toZb4Ha4E+IUbX1f4AbOD2sUmrAMkLR6egHo3TWfcopGO0G9oG2ieR2t4lw92g0qIZ+iz0XzSVYjIrz4h5XtGkvqgagTmXeoFfJcb0+B/8ey5mETBNVjvClMhjjPViES1s8qy6AiKE5XnXPSCmqIE23rBsIK0PNYiIRcNn/E53jI6/08dsLem4DTcbADdMddQSYh0we6t6BeW9pIkxZOrIUJrS3Cm6EG7gJ9TE+qaFbXLP8BbOZm76mv4XonbAIg8ZacV0B/GAvDQRNdPkVfOvQe+znsJ1HXh/tY9hNL2OuV5PWu2hyqQZsIra/6FCO6gClapn6AU7AbtDfXxuUknCHRSxwTLf8Bgi31NJnvpzwAAAAASUVORK5CYII=')}.x-tab .x-button-icon.user,.x-button .x-button-icon.x-icon-mask.user{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEWElEQVRoBe2aS0gVYRiGO1lmF8nQQlETutGFokAiqEV0ISKwgmrdMtzUpnW7drWKbFGbQAKpJIhuUGIUFUkW0T1Jq4V2U4ui7GLPexpDD+ecuX1jHqcPHseZ+f9vvnf++e8n0d/fPyZONjZOYqU1doLHRV3CiURCz5gMxTANJsJg+8XJJ+iBt9BHNdO1SCwRZR1GbAFRl8F8WAFLoRwGLME/ffAM7kETvIYPxPWDo7lFIhiheURaCVtgBywHXXOzbhJcggZoRvR7twy+76uELSEAtQsqySPwGdQN+KWDPHuh2DI2+TIVm3T455M9G0Bk6ktRvd4NBZaiTQUT3AQnSNW/VAFBzl/iZw0kq56FcOtuaQHB7QIv9ZVkrqZ2YA9Mck3pMYGZYKeh2sBz1SJb2mqcmfk0E0xQ6l9rwNoKcWjm11JwEYFVW6t1/K218mspeB5B5VsFluKnIuU88Kml4PGBo3DPqBGZiVkKNgvKRFkGJ5aCv2Z4xoi6bCm4DWUaXERhZhMJS8FfolDq+DSbRFgKjrIOa8poYpaCTQKK2sl/wSHfcFSNlll1sSzhn7ys3pAvLFP275lu+L1uKVhBPfYbgMf0zz2mc01mKfgbT7vi+kT/CeT3sv9s6XNYCtbg4CJ0pX9U4Kv3yXk3cO6UjGaCWX5Rg/UArqY8I8yp1qdPQ08YJ4Pzmgl2nCqwc2DVyKjunuddqkE0MVPBBKYSuQ7tJtEhFj9apDczU8FOVB0ctZiuHYUw9obMjbxErW2bmblgApTQengVIkq1B83QEsJH2qzmgp2n3ObYCEGndZ3krbcuXcUWiWACldCjoA0yv6a8J6HJb0Yv6SMRrAcj+gmHA+B3aneDPHXk/8jR3LR3a2rOfnAlTmfDVPDb6Khrq8bPDI5PoRPxZpMSk+1SgtOKpTa8l8BC0JaLmAkloA1xr/aOhJqEtINGWeqW7jjHXrQHbRdw4WxSJf8L8Aeh2m1QaWoBfiUsA61PTwGtUYeZ1qlP1zhan3YraBSnz/0mdAUVHqiEESoxKs0a2AxloJIMI5DsWU0vQH2z2oZToAnFI7+fu2/BiF3PgzbCKqgC1bXhNH3S6rba4BocR7TquifzLBih5XjcCSrROaAGKbJWHt9uJuGq67fgAki4zrNaVsGIzCP3dNgE20B1VJ+uro8UUz3Xr39UvxugCeEZl3UzCkZsBZn1+W6HRaB6qtZ4pJp2PtTna+58DFoR3sVxqHFxyM8euFsIW6EeXoDeoPrBXEEbAlpqqoN1kD9YY6rYxSQ4DGoE9KOSXBGZLk4NYB7CfigZEP1XMBfVEJ0BJUznIFevaSBzEEolOimYkyo4AfocclVYtrjViB0C9SzJEdE+jrn+CWcTrHvdUKuRUSm0gPrZ0W7tGjjMhTiIVWFWSbAGEnGxhAT/y+HhsL9oiVWFjo3FqnRVqrETrG5pFmiSEAuTYC3TFMVCLSIzTg9H6wuIXR2OneDfMJq1NmzzbS8AAAAASUVORK5CYII=')}.x-tab .x-button-icon.team,.x-button .x-button-icon.x-icon-mask.team{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFI0lEQVRoBe2ZSYgdVRSG+yUmnagRQYU4NbZKNLYKWTgg4gQOaDYqJIIGl4LixhBwoy50LSIiulEjCkpAUBBRURpdGceFMQ7YtgkOJE4xTjGa9vuedUl1Vd2qevSrFqvrwJ97695zzj3/PXd6nd7MzMzIQpJFC4msXDvCbc94l+Euwy2bgW5JtyyhOTpdhnNT0rKGLsMtS2iOTpfh3JS0rOGQ+eLT6/VWMNYJ4NjUmN9T/xLs4WfqvPxO7TU9DkTdNmvBbeAskJ7kv/n+AjwKXiSW7yibFQk3BSIPZHdTl5xZzML238DDYFlTsQS/jZF1AGQ1mAZZkkXfe9FbGwJrqmz6lL4cEmOgjhyO0jq2gGVj0hhhAl9M1FeB3gDRn4Pu/5NwQnJ0ALKqrgKHDmgzkHpjGR4oioPKP1H96+Dn8GvpKyLqneV5Lp0XgnHggTMFJjlYPqAcpnyLsz/LHBLL0fRfCzwbvNN3gLeI5WXKaik7DbF2/20A28HPYF+CPZQfg9tj9vS5h18DRSdyrO0j9FeW+PQenwTe138AJ+d34OPFa215zDa0l15LOLgamM0DIBukbQ60JjhLl7RL+HWQtSv7jhLGz1FgM3DJZ30Yy69gYzqGonrVHr4eJ+OgB7Ji2xi4lGUW8+PsD0vOwNGNwInMirF42K0nlmXZzvR3LNARDN3fx6WVI3VJF50Fzvr7EZtY8zQdLtUiOYXGIrJpXUmvTDdk61HCKEqiagD9SSwnLCeX3RYwSJafRd/zoUj2FzVm2hyzMJ6gV0Y46Myl/BzjeqfnyMg36G5NJqpoTPvnLGWEnS0f9lVStL/7NgT/C5XNoHTW6XesV4En/1wlGo+Oo4QJ1ivoxxqju+fKCG2lf1uFH7P3eEl2K8xndRt3VKKEE4sPKWOHiCreg28TaPR1RN/X6GwEO0GReJ3cg95kUWeqzT8W6KtMpujcVaZQRfgFjL8qcbCDvndi/Zz0h4Hr6L8JHBHRW0L7DejdAU6K6Nj8CfBQi4mH4xYmrmy1sXlK/gCAAyfkQaAT91kWj9HW/6tJ8MO3NmeC+4CHlqdu1q7o25Xk5Hqynw+WBp+hpO1K4JItsnfr5GyCbSirCHstnQpcKulBXMK+o1frCPGgWAomwL2gLsm0z3S9ny38XARWgEXJOI7xNMiS9ns9MN5ZCQhEQ1lIGCOXmZf4ZeAW8C4IAblv3wBXAIn6sjkZ3Arc80FvGKW/nu4H/nhZDiR0IngI+LYPY3i43gWuAeNgFBQSn0UYJZejRH3CPQ8cMDi19Jp6AviuVfd48ADwRZXWG3Z9J/6fApeAJUm2TYRE02OZjPfA3WAM9HVDdvt2iXHI1HkoPQd2g7SjUHef+NyU7AXgFRD65qOcZrybQXgFmtUDIDu2xE3CBuCWWBxIU+8vk9MozdQukDUO3x4qm5IJOp36ZyW6waaJci/jrkviWEV9qiQOdd8Ebr/+T0fKkYvBp6AqOB2fnQz0SA39Kn9z6Z9mfPeze/UlUOXrB3Q2AW36a77KwP7tYCwh7Mupjk1TOmZuNInlyZqxuN8n3ItrQF1xryvRl9W/3Y3/60QGCTGF71h5JB0Tbn7vsDqyP6Vkva5dymxoVQ+lIE6+3+lJCH3Zcp+E78y2Fny7Evw7kstC8YA7BtQZRP1hiwTDKnuGun8aSiekaDxXwrbG/zOtaOT/ss3MLSjpCLc93V2Guwy3bAa6Jd2yhObodBnOTUnLGroMtyyhOTpdhnNT0rKGfwD3f6JVZi/xSQAAAABJRU5ErkJggg==')}.x-tabbar-light{background-color:#475c76;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #96a9c0), color-stop(2%, #546e8c), color-stop(100%, #394b5f));background-image:-webkit-linear-gradient(#96a9c0,#546e8c 2%,#394b5f);background-image:linear-gradient(#96a9c0,#546e8c 2%,#394b5f);border-color:#3d5066}.x-tabbar-light .x-tab{color:#b6c3d3}.x-tabbar-light .x-tab-active{color:white}.x-tabbar-light .x-tab-pressed{color:white}.x-tabbar-light.x-docked-bottom .x-tab{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-light.x-docked-bottom .x-tab .x-button-icon{background-color:#768fad;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d5dde6), color-stop(2%, #8ca1ba), color-stop(100%, #607d9f));background-image:-webkit-linear-gradient(#d5dde6,#8ca1ba 2%,#607d9f);background-image:linear-gradient(#d5dde6,#8ca1ba 2%,#607d9f)}.x-tabbar-light.x-docked-bottom .x-tab-active{background-color:#506986;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a6b6c9), color-stop(2%, #5e7a9c), color-stop(100%, #43576f));background-image:-webkit-linear-gradient(#a6b6c9,#5e7a9c 2%,#43576f);background-image:linear-gradient(#a6b6c9,#5e7a9c 2%,#43576f);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-light.x-docked-bottom .x-tab-active .x-button-icon{background-color:#003370;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0056bd), color-stop(50%, #003f8a), color-stop(51%, #003370), color-stop(100%, #002757));background-image:-webkit-linear-gradient(#0056bd,#003f8a 50%,#003370 51%,#002757);background-image:linear-gradient(#0056bd,#003f8a 50%,#003370 51%,#002757)}.x-tabbar-light.x-docked-top .x-tab-active{background-color:#3d5066;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #2a3746), color-stop(10%, #344356), color-stop(65%, #3d5066), color-stop(100%, #3e5167));background-image:-webkit-linear-gradient(#2a3746,#344356 10%,#3d5066 65%,#3e5167);background-image:linear-gradient(#2a3746,#344356 10%,#3d5066 65%,#3e5167);color:white}.x-tabbar-dark{background-color:#141e29;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #466890), color-stop(2%, #1f2f41), color-stop(100%, #080c11));background-image:-webkit-linear-gradient(#466890,#1f2f41 2%,#080c11);background-image:linear-gradient(#466890,#1f2f41 2%,#080c11);border-color:#0c1118}.x-tabbar-dark .x-tab{color:#5a81af}.x-tabbar-dark .x-tab-active{color:white}.x-tabbar-dark .x-tab-pressed{color:white}.x-tabbar-dark.x-docked-bottom .x-tab{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-dark.x-docked-bottom .x-tab .x-button-icon{background-color:#354f6e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #7c9bc0), color-stop(2%, #416086), color-stop(100%, #293e56));background-image:-webkit-linear-gradient(#7c9bc0,#416086 2%,#293e56);background-image:linear-gradient(#7c9bc0,#416086 2%,#293e56)}.x-tabbar-dark.x-docked-bottom .x-tab-active{background-color:#1c2a3a;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4e74a2), color-stop(2%, #283b52), color-stop(100%, #111922));background-image:-webkit-linear-gradient(#4e74a2,#283b52 2%,#111922);background-image:linear-gradient(#4e74a2,#283b52 2%,#111922);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-dark.x-docked-bottom .x-tab-active .x-button-icon{background-color:#0a7aff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #57a3ff), color-stop(50%, #2488ff), color-stop(51%, #0a7aff), color-stop(100%, #006df0));background-image:-webkit-linear-gradient(#57a3ff,#2488ff 50%,#0a7aff 51%,#006df0);background-image:linear-gradient(#57a3ff,#2488ff 50%,#0a7aff 51%,#006df0)}.x-tabbar-dark.x-docked-top .x-tab-active{background-color:#0c1118;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #000000), color-stop(10%, #030507), color-stop(65%, #0c1118), color-stop(100%, #0c121a));background-image:-webkit-linear-gradient(#000000,#030507 10%,#0c1118 65%,#0c121a);background-image:linear-gradient(#000000,#030507 10%,#0c1118 65%,#0c121a);color:white}.x-tab.x-item-disabled span.x-button-label,.x-tab.x-item-disabled .x-hasbadge span.x-badge,.x-hasbadge .x-tab.x-item-disabled span.x-badge,.x-tab.x-item-disabled .x-button-icon{opacity:.5}.x-tab.x-draggable{opacity:.7}.x-tab{-webkit-user-select:none;overflow:visible !important}.x-toolbar{padding:0 0.2em;overflow:hidden;position:relative;height:2.6em}.x-toolbar > *{z-index:1}.x-toolbar.x-docked-top{border-bottom:.1em solid}.x-toolbar.x-docked-bottom{border-top:.1em solid}.x-toolbar.x-docked-left{width:7em;height:auto;padding:0.2em;border-right:.1em solid}.x-toolbar.x-docked-right{width:7em;height:auto;padding:0.2em;border-left:.1em solid}.x-title{line-height:2.1em;font-size:1.2em;text-align:center;font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 0.3em;max-width:100%}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 .3em}.x-toolbar-dark{background-color:#24364c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5a81af), color-stop(2%, #304864), color-stop(100%, #192533));background-image:-webkit-linear-gradient(#5a81af,#304864 2%,#192533);background-image:linear-gradient(#5a81af,#304864 2%,#192533);border-color:black}.x-toolbar-dark .x-title{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-dark.x-docked-top{border-bottom-color:black}.x-toolbar-dark.x-docked-bottom{border-top-color:black}.x-toolbar-dark.x-docked-left{border-right-color:black}.x-toolbar-dark.x-docked-right{border-left-color:black}.x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before{border:1px solid black;border-top-color:black;color:white}.x-toolbar-dark .x-button.x-button-back:before,.x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-button.x-button-back:before,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before{background:black}.x-toolbar-dark .x-button,.x-toolbar-dark .x-button.x-button-back:after,.x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button.x-button-back:after,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after{background-color:#141e29;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #466890), color-stop(2%, #1f2f41), color-stop(100%, #080c11));background-image:-webkit-linear-gradient(#466890,#1f2f41 2%,#080c11);background-image:linear-gradient(#466890,#1f2f41 2%,#080c11)}.x-toolbar-dark .x-button .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-button .x-button-icon.x-icon-mask,.x-toolbar-dark .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar-dark .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #e7edf3));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#e7edf3);background-image:linear-gradient(#ffffff,#ffffff 2%,#e7edf3)}.x-toolbar-dark .x-button.x-button-pressing,.x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar-dark .x-button.x-button-pressed,.x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar-dark .x-button.x-button-active,.x-toolbar-dark .x-button.x-button-active:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-button.x-button-active,.x-toolbar .x-toolbar-dark .x-button.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after{background-color:#0f161f;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #000000), color-stop(10%, #070a0e), color-stop(65%, #0f161f), color-stop(100%, #101721));background-image:-webkit-linear-gradient(#000000,#070a0e 10%,#0f161f 65%,#101721);background-image:linear-gradient(#000000,#070a0e 10%,#0f161f 65%,#101721)}.x-toolbar-dark .x-form-label{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-light{background-color:#354f6e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #7c9bc0), color-stop(2%, #416086), color-stop(100%, #293e56));background-image:-webkit-linear-gradient(#7c9bc0,#416086 2%,#293e56);background-image:linear-gradient(#7c9bc0,#416086 2%,#293e56);border-color:black}.x-toolbar-light .x-title{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-light.x-docked-top{border-bottom-color:black}.x-toolbar-light.x-docked-bottom{border-top-color:black}.x-toolbar-light.x-docked-left{border-right-color:black}.x-toolbar-light.x-docked-right{border-left-color:black}.x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before{border:1px solid #030507;border-top-color:#0c1118;color:white}.x-toolbar-light .x-button.x-button-back:before,.x-toolbar-light .x-button.x-button-forward:before,.x-toolbar .x-toolbar-light .x-button.x-button-back:before,.x-toolbar .x-toolbar-light .x-button.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before{background:#030507}.x-toolbar-light .x-button,.x-toolbar-light .x-button.x-button-back:after,.x-toolbar-light .x-button.x-button-forward:after,.x-toolbar .x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button.x-button-back:after,.x-toolbar .x-toolbar-light .x-button.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after{background-color:#24364c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5a81af), color-stop(2%, #304864), color-stop(100%, #192533));background-image:-webkit-linear-gradient(#5a81af,#304864 2%,#192533);background-image:linear-gradient(#5a81af,#304864 2%,#192533)}.x-toolbar-light .x-button .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-button .x-button-icon.x-icon-mask,.x-toolbar-light .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar-light .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask{background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #e7edf3));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#e7edf3);background-image:linear-gradient(#ffffff,#ffffff 2%,#e7edf3)}.x-toolbar-light .x-button.x-button-pressing,.x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar-light .x-button.x-button-pressed,.x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar-light .x-button.x-button-active,.x-toolbar-light .x-button.x-button-active:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressing,.x-toolbar .x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressed,.x-toolbar .x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-button.x-button-active,.x-toolbar .x-toolbar-light .x-button.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after{background-color:#1f2f41;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0f161f), color-stop(10%, #172330), color-stop(65%, #1f2f41), color-stop(100%, #203043));background-image:-webkit-linear-gradient(#0f161f,#172330 10%,#1f2f41 65%,#203043);background-image:linear-gradient(#0f161f,#172330 10%,#1f2f41 65%,#203043)}.x-toolbar-light .x-form-label{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-navigation-bar .x-container{overflow:visible}.x-desktop .x-toolbar .x-field-search{padding-left:1.06em}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255, 255, 255, 0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-field{width:13em;margin:.5em;min-height:0;border-bottom:0}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.3em;border-radius:0.3em;background-color:white;-webkit-box-shadow:inset rgba(0, 0, 0, 0.5) 0 0.1em 0, inset rgba(0, 0, 0, 0.5) 0 -0.1em 0, inset rgba(0, 0, 0, 0.5) 0.1em 0 0, inset rgba(0, 0, 0, 0.5) -0.1em 0 0, inset rgba(0, 0, 0, 0.5) 0 0.15em 0.4em}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:black}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.8em;border-radius:0.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-webkit-border-top-right-radius:0.8em;border-top-right-radius:0.8em;-webkit-border-bottom-right-radius:0.8em;border-bottom-right-radius:0.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-indexbar-wrapper{-webkit-box-pack:end !important;box-pack:end !important;pointer-events:none}.x-indexbar-vertical{width:1.1em;-webkit-box-orient:vertical;box-orient:vertical;margin-right:8px}.x-indexbar-horizontal{height:1.1em;-webkit-box-orient:horizontal;box-orient:horizontal;margin-bottom:8px}.x-indexbar{pointer-events:auto;z-index:2;padding:.3em 0;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important}.x-indexbar > div{color:#1e2a38;font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-phone.x-landscape .x-indexbar > div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{-webkit-border-radius:0.55em;border-radius:0.55em;background-color:rgba(143, 152, 163, 0.8)}.x-list{position:relative;background-color:#f7f7f7}.x-list .x-list-inner{width:100%}.x-list .x-list-disclosure{position:absolute;bottom:0.44em;right:0.44em}.x-list .x-list-disclosure{overflow:visible;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFNkNCM0JGNTZFMjI2ODExQkNGQjkwMzk3MDc3MkZFQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3M0MzQUU1QUFDQkQxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3M0MzQUU1OUFDQkQxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU3Q0IzQkY1NkUyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU2Q0IzQkY1NkUyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+uoWjuwAACh9JREFUeNrUm2toVdkVx7eJRqPRaHzFGBOjidGYaLQaX9GREXXAkloYQVpT+qFYBkcqLS0zTKFQWpwv86F0KLRfHFqnWDq0UCsMFYqlqHSwGo2v4Du+X9FoNL5P12/N3rLn9Cb33HNvrnHDujfnnHvO2f+91l57/dfaGWBe8xYEQUq/H5ilftWIVIoU2+Ov2e/jIt0inSKnRVpEnvdlR/oK8CKRt0QaRd4QyU3hXkDvFvmXyOeZHoABGXzWWJF3RL4rUuFfKC4uNmPHjjUjRozQ44kTJ+r3jRs3zNOnT013d7e5deuWuXTpknnx4oV/602RP4n8TqQ1EyadCcBlIh9YoHmcqKioMFOnTjXl5eVm1KhR5smTJwrs+fPnCohvOjpw4ECTk5Ojwt/5+fnmzp075vr16+bkyZPm1KlT/nv+KvJLkf++KsCAe89KPidmz55t5s6dawoLC839+/fNo0ePFCwgHjx4oMe0u3fv6vfw4cNNbm6uGTRokCkoKNDBycvLU+DDhg3TQTp27Jg5fPiwuXfvnnvvJyI/EunIJmCczqci1RzMmzfPLFiwQF9Ox65cuWKuXr2qZoqk0ikGa/z48WbcuHFm0qRJOihDhw41LS0tZu/evToI1sl9W2RXNgC/K/IRGp42bZpZsmSJasSZ4fnz51WbmWiDBw9W0NXV1TrvOd6zZ49pbX05nd8XwB/2FWA87a+tYzKLFi0yixcvVoCY3NmzZ8MOJ6OttLRUpwy+4dy5c2bnzp3u0h9FvifAuzMJmPm6Q+SbHGzYsEHn3P79+83Ro0fVCWWrVVZWmqVLl+rfO3bsUA8v7QuRbwjoa5l6z2/xD7KsBJs3bw7WrVsXiINh8rwSGTJkSLBmzRrtS1lZmTv/H5wnc7o3iTpnA1k69AXLli0LZAmJ1VGeQWfFEek3x3FBc684ymDLli0+6E/TBfymyDMeJmasL4jbSe4bPXp0MGvWLJX6+vpAApJAlqTYoAcMGBDU1NQEmzZtCsRxuvPvxQVM7Hubh4gnDsRJxdYsInM+kOUrkHVXj/lmAGVOBuJ909K0rBZBc3OzO4eCmuIA/jcPkEAiWLVqVVqdQjA7WWLc8TZ3ns7W1tYGstaqxuI8m8GbM2dOIKuGO3dDpCAVwCw9QUlJSbB+/XrfXGLLzJkzffMtFNko8pjjyZMnq4njFONOGRSyevVqNXF77hdRARc4U167dm0wZsyYjHhW5m0IsLFMCm0EEl0FDQ0NgZCMl2afqjBgTU1N7vg+PCUK4B9yw/Tp0wNZ6NOatxEAO/JxxC03mCWmH8eZMVBVVVVBXV2dO/ebMOCcEFhIwI/5g1j2woUL5tmzZ30dS7SLLBb5DHKxb98+jaVhXDIAKT2IAIgYnnjcto3iF6r934QBr4G+Tpkyxdy+fdt0dXVlK4DiRetEfs7BgQMHtPPE6rAm6XTkBz18+FDJC2GoDYc39ga4mQ9ZL5UMZEG74fYzC7zrzJkzSitlaqnG4MxRGvH8zZs3daBs+5YMWG6iFE+R1bA+HD6bNBCXkcfsioqKNJsBl+1JGwT9J06ciNLnz0TaRP5+8eLFMvohnlfJCVQzihLQMoMF05JnFNsAanf4dxCDoLy8XIOBKGsiyxXLjUyBQEY0FQdTGDFltMdFVAQ+MmiR4wGiONZme7w1kdNayYcsQ0rio8SdaBa2wuhnigOH8lmryGfRF5gZaSDYEvw7qVMQ/4PF+djCc7iBD9ItUTtPNoK5blu5pZtRpDMi6Cci3xfZjBNua2tTc8WZ8e7e5jWK8GhrvVhJng841+aOdY643FPSjEBubrac2cciK8hjQf6vXbumzowcWE99ACyKGzlypMNX6QNmYueTO3r8+HFWCX0KjTz1AtK1WNXx48c19TNhwgS1ykQNLFiCR4ZeAsZBqMe1SbL+2k7bIGUX2iNIIectsbjmu8INLN7yNNEHXKBrlDiFfqrdcJDydZEPXZDinG0is/YcV6EPWA+42JeJuAy390XW49hI2JNjC8cAYEGJvlJzzOvb8mztStPFeOUkS2muH2l1OxOIGsK94kZU+BdLL1W7xM/hBhYvMuv0NdzhvFoWl5q4rY6pC1iWnIULFxI+6vocbpizt8R2+IDb/egkFXaS5Ub4u496HYU64b2GYARml8j3hIKo9rCGOyh84d69id6f2gfWjAsIOgAMGaEwlwisIzaucGe+LL5/hS1RiH4Tk+5n6zGB8+9F3uaAWhZ9O3ToUK+MDqURSFkNd4lDaw976f18YPPeYp00w9DHrcxWFN6GMKxYsUKJzZEjR5LSV8B6DviLROThn3wQtuEMonhrXko6xrYLGaaHb1iwdSUlJapZ4mjMOEqsT0jZ2fmSo+xOBBgNd7icUBQK1tHRob8jJeTFrJlopGX+QYxP4qCqqkqLdlQqoyQAMGeXtbFtV6KMR7fNNmzExZPBSEYTGWm4MLy4trZWHV4iD8854t3t27frjoAkwcRHtp6lmQ46jgnjfKIWw1iXWW3IeuCb5L7WRIBpnwAY+kUBmpRKb86LDhDhXL58WcH3Ng0izPevBBPLly/XKXPw4MGUkgs4XTKunnb/kOweFnWtBGQqCZ8kL+2CibNcE2sJVq5cGQj1i1XeIRlPzcpLxhf1lpemsVNGQzWSYB7byEowIQOtjglCQOSXSmPuwo897X4sIDt6S9PS2B7Uwh4qzBAvnIn4uof593/BBPOVKRKHteE48T04N0sjfxX13kY/W0gBO12TnjFjhl+UI8PyZ3eNcix1pXTeQ5mGSqfMX3fuB6mWS3Wbg5iI1pjSLZeWlpZqldAen3JpXgkmtBZEh+M+G99ATQmx5w7hv1IFDGE+aWwNFw2lA5r6L46LEqyx9WKcU0VFRVoFOwposqKohdhz0KaauFse6o2t4eI1SYTH7RzTg2Q9SXuhdLobAPOLWwQ3tvpPebWxsdE/35zuphaCdt3nQSmTykQ6+zLoJLXgdIvsaNaB9erJWzOxi4f2jnvR/Pnz1cTTmXNxC95OZKnUGnII7LZkYFPdpviueyHOAUeGV01n61GcaYFlUKzHI3vXtvXkpNIB7Mz7ofPemDhOJ50NKalolXcSReEHvGtbowB1EieXgyNjG6JW1mEylDwIFoi9U42OkjXSNLA3oj6Ykle4g/t9R0D8LZXnxU1esWRttXM7lwwJNA6qCL2EpMO44iYIXNaFyMlFeu3t7Zq78ugeBbZz2d4RX2mBa/oFTRPLQs+ggfBlGA/gYV09hYvQR5eScRvF+Zt7iOm92JjMxU9snam3kLXPALvWYHlsoztBmgjtIGiazkMhw6ABC4+GpADa/QuA5bJ+Temn5sv/f4gSo/c5YNfYKd9kGVBdOCmO5hI1pkAC3t1uExKfmwTbFfoL4HACDlN/y5p+RZLfU/Fvs+BgbK1psLBXAjhR+qauh2unTfRdAa8N4D5pqQL+nwADAKGFDQ//Deb9AAAAAElFTkSuQmCC') no-repeat;-webkit-mask-size:1.7em;background-color:#003370;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0a7aff), color-stop(2%, #004394), color-stop(100%, #00234c));background-image:-webkit-linear-gradient(#0a7aff,#004394 2%,#00234c);background-image:linear-gradient(#0a7aff,#004394 2%,#00234c);width:1.7em;height:1.7em}.x-list.x-list-indexed .x-list-disclosure{margin-right:1em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-list-item{position:relative;color:black}.x-list .x-list-item .x-list-item-label{min-height:2.6em;padding:0.7em 0.8em}.x-list .x-list-item.x-item-pressed .x-list-item-label{background:#77b2f8 none}.x-list .x-list-item.x-item-selected .x-list-item-label{background-color:#06346a;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #167bf3), color-stop(2%, #07448c), color-stop(100%, #042348));background-image:-webkit-linear-gradient(#167bf3,#07448c 2%,#042348);background-image:linear-gradient(#167bf3,#07448c 2%,#042348);color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-list-header{position:relative}.x-list-header-swap{position:absolute;left:0;width:100%;z-index:1}.x-ios .x-list-header-swap{-webkit-transform:translate3d(0, 0, 0)}.x-list-normal .x-list-header{background-color:#4d80bc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bccfe6), color-stop(2%, #6792c5), color-stop(100%, #3f6ea6));background-image:-webkit-linear-gradient(#bccfe6,#6792c5 2%,#3f6ea6);background-image:linear-gradient(#bccfe6,#6792c5 2%,#3f6ea6);color:#1f3651;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;border-top:1px solid #4d80bc;border-bottom:1px solid #2d4e76;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-list-normal .x-list-item .x-list-item-label{border-top:1px solid #d1d1d1}.x-list-normal .x-list-item:first-child{border-top:none}.x-list-normal .x-list-item:last-child .x-list-item-label{border-bottom:1px solid #d1d1d1}.x-list-normal .x-list-item.x-item-pressed .x-list-item-label{border-top-color:#77b2f8}.x-list-normal .x-list-item.x-item-selected .x-list-item-label{border-top-color:#084b9b;border-bottom-color:#021022}.x-list-round .x-scroll-view{background-color:#EEEEEE !important}.x-list-round .x-list-disclosure{-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAtpJREFUeNrs2k2IVlUYAODndZyaUfMnakxsERU5JChUCBIG0s8iaNGPBa0sSkUQJdq0CGnRzypyJS0SddPCsFr0QxtxlURmbcW0NlqgZg6CyuRp4RmYxUz3Bvf7Zo6eF87qu3zffXjPPe97zv0ipeRmijlusqjgCq7gCq7gCq7gCq7gCi4BHBHLIuKpiFh0Q4PjeoziLXyAjRExPBvAc3uAHcCj2IRnMQ+LcTYivkopXZhJcHS5H46I2/AMXsVjGJz08S84gD0ppTPFZzgi7szQjRid4pLVWIahiNidUjpd+jM8H89Pg52IEbyOrRExUjr4LD7FiYbrlmb0loi4p+/ilFJnA4vwCn5EahhnsBururyHxnvs/Au5BS/iaAv0JezHymLBGT2MF/ATxhvQY9iDhyaqRnHgjB7MdfhrXGlAX8QXeKRYcEbPyU3Il/inAT2Og3i4WPAk9Nqc6csN6Kv4HOuKBWd05Ezva4Eex7d4EgNd38vcPpW+FBFHcB7X8FJe2KaKATyOBbmDO5RSGp+VdbhltkfxSV6d/yvT13AYT2OoqCk9BXpFLlmpxfgGS7v67b6feETErbgvNyhN8Rd+zWWtvCmdkRtwpEVtHsNHuL+4VTpjh3L3dazFNB7DXtxbalmayGyb5/ZcbjVXltp4LMmHAm2wp/AuHiy1tVyIHTjeAvsn3sRIqZuHhdiO31pg/8B7uKPU7eFibGuJPY13sLzUA4Db8UZL7Em8jbuKPADAcuzE7y2wP2Nzr5/ZnoHzNH4/l5Um7Am8jOF+t7Vd7pYCd+cGY9rGLmM/xMGU0uViTy0zeA0+xoVpMns0T+MFM7Fp6TTD6br6h4g4n/e9z+GBSZccxi58l1K6NGMvl3pUlkbwGr7PmT2GJ3pxgvF/R/Tqz6URMR/r88u1Q/is05OL2fD2cAr0YK7Lf8/IAtVvcP2PRwVXcAVXcAVXcAVXcAVX8I0T/w4ADBKP+GttJ+EAAAAASUVORK5CYII=') no-repeat;background-color:#777777;background-image:none}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(30%, rgba(238,238,238,0.9)), color-stop(100%, rgba(238,238,238,0.4)));background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-label,.x-list-round.x-list-grouped .x-list-item-label{border:solid #DDDDDD;border-width:1px 1px 0 1px;background:#fff}.x-list-round.x-list-ungrouped .x-list-item:first-child .x-list-item-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-ungrouped .x-list-item:last-child{margin-bottom:13px}.x-list-round.x-list-ungrouped .x-list-item:last-child .x-list-item-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;border-width:1px}.x-list-round.x-list-grouped .x-list-header-item .x-list-item-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-footer-item{margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-item .x-list-item-label{border-width:1px;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-dataview-inlineblock .x-dataview-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-paging{height:50px}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;color:#06346a;padding-top:10px;-webkit-border-radius:6px;border-radius:6px}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:-webkit-box;display:box;-webkit-box-orient:horizontal;box-orient:horizontal;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background:center center url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAA8CAYAAAAUufjgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjFJREFUeNrsmU8oREEYwOexdtNuKBfFwdVhCyfuysnFiXISS+1BLopyUpKLXETkRLaUi1LK3Q2lpPbiQLnIn03a/Hm+z86Ttv0zM++bfbOar36Hbad5v535Zp7v47iuy0wOpyoEHccRHV9L9NxPkUE/bhKCOKiOSPAdn69DsJ5I8E2HYA0QJRJ8Bb50CDYRCT7pEMQD0kwk+CByUFQEW4gE73UIhoA2IsFb4ENEMCQ5MdU1IxwygpT3oKNLMGyyYFVscdhusc8tDpu+xRG7xf95BW0O2kNiV1AgIvaQ2BzUJNgJNJYZGyUU7OG1cal4Bi68oqkDPszy2teEwJp5Cdyu/lZ1g8CwIYJ7wEF+2YmrNw90Byx3BizgKhaqizEP1wg7CLLxCEzy/CtauMeBlQDyEfNuGrgU6SyM8F9SyVgHdmRaH6tAb4XkToEp2d4M5mOK0TWMigU2koa8vJMRZPxEb2ss2LEVPMpPLlMRxBgDZjQJLgNbxb6Uab9tAn3EcifAeKkBMoLY+j0GWonk7oB+lmsFkwhidAGHBPmIeTcAnJcbKCuIMQEs+hScAzZEBqoIYuzyFVCJI36lMJ2CDfxibZeUu+EX/4uMIFP8ZyLejxkgK0hG5a8kP4IYSZbr1IuQVHmAX0HGX4VuGfZVJ6cQxPd1uoRcWqDW0SroFVzZAnJZ/h0LWhAjUUAw4XdSSsH8fExRTEgtGAOuOTETBb16Jk412e+bxOSwglYw6PgWYABvLk8P7zGJFwAAAABJRU5ErkJggg==') no-repeat;background-size:2em 3em;-webkit-transform:rotate(0deg)}.x-list-pullrefresh-release .x-list-pullrefresh-arrow{-webkit-transform:rotate(-180deg)}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;margin-bottom:0.1em;text-align:center}.x-list-pullrefresh-updated{text-align:center}html,body{width:100%;height:100%}.x-translatable{position:absolute;top:100%;left:100%;z-index:1}.x-translatable-container{position:relative}.x-translatable-wrapper{width:100%;height:100%;position:absolute;overflow:hidden}.x-translatable-stretcher{width:300%;height:300%;position:absolute;visibility:hidden;z-index:-1}.x-translatable-nested-stretcher{width:100%;height:100%;left:100%;top:100%;position:absolute;visibility:hidden;z-index:-1}.x-layout-fit,.x-layout-card{position:relative;overflow:hidden}.x-layout-fit-item,.x-layout-card-item{position:absolute !important;width:100%;height:100%}.x-layout-hbox,.x-layout-vbox{display:-webkit-box}.x-layout-hbox > *,.x-layout-vbox > *{-webkit-box-flex:0}.x-layout-hbox{-webkit-box-orient:horizontal}.x-layout-vbox{-webkit-box-orient:vertical}.x-layout-hbox > .x-layout-box-item{width:0 !important}.x-layout-vbox > .x-layout-box-item{height:0 !important}.x-table-inner{display:table !important;width:100%;height:100%}.x-table-inner.x-table-fixed{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-row > *{display:table-cell !important;vertical-align:middle}.x-container,.x-body{display:-webkit-box}.x-body{overflow:hidden;-webkit-box-flex:1;min-width:100%;min-height:100%}.x-body > .x-inner,.x-container > .x-inner{-webkit-box-flex:1;min-width:100%;min-height:100%;position:relative}.x-docking-horizontal{display:-webkit-box;-webkit-box-flex:1;-webkit-box-orient:horizontal;min-width:100%;min-height:100%}.x-docking-vertical{display:-webkit-box;-webkit-box-flex:1;-webkit-box-orient:vertical;min-width:100%;min-height:100%}.x-centered{position:absolute !important;width:100%;height:100%;display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-floating{position:absolute !important}.x-centered > *{position:relative !important;-webkit-box-flex:0 !important}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector > *{visibility:hidden}.x-size-change-detector-shrink > *{width:200%;height:200%}.x-size-change-detector-expand > *{width:100000px;height:100000px}.x-scroll-view{position:relative;display:block}.x-scroll-container{position:absolute;overflow:hidden;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid > *{display:table-row}.x-scroll-bar-grid > * > *{display:table-cell}.x-scroll-bar-grid > :first-child > :first-child{width:100%;height:100%}.x-scroll-bar-grid > :first-child > :nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid > :nth-child(2) > :first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x > .x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y > .x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:2;opacity:0.5}.x-scroll-indicator.default{-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff;opacity:1}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.csstransform{background:none}.x-scroll-indicator.csstransform > *{position:absolute;background-color:#333}.x-scroll-indicator.csstransform > :nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.csstransform.x-scroll-indicator-light > *{background-color:#eee}.x-scroll-indicator.csstransform.x-scroll-indicator-light > :nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.csstransform.x-scroll-indicator-y > *{width:100%}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :first-child{height:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :nth-child(2){height:1px}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :last-child{height:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > *{height:100%}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :first-child{width:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :nth-child(2){width:1px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :last-child{width:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-carousel{position:relative;overflow:hidden}.x-carousel-item{position:absolute;width:100%;height:100%}.x-carousel-item > *{position:absolute;width:100%;height:100%}.x-carousel-indicator{padding:0;-webkit-border-radius:0;border-radius:0;-webkit-box-shadow:none;background-color:transparent;background-image:none}.x-carousel-indicator{-webkit-box-flex:1;display:-webkit-box;display:box;-webkit-box-pack:center;box-pack:center;-webkit-box-align:center;box-align:center}.x-carousel-indicator span{display:block;width:0.5em;height:0.5em;-webkit-border-radius:0.25em;border-radius:0.25em;margin:0.2em}.x-carousel-indicator-horizontal{height:1.5em;width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;box-orient:vertical;width:1.5em;height:100%}.x-carousel-indicator-light span{background-color:rgba(255, 255, 255, 0.1);background-image:none}.x-carousel-indicator-light span.x-carousel-indicator-active{background-color:rgba(255, 255, 255, 0.3);background-image:none}.x-carousel-indicator-dark span{background-color:rgba(0, 0, 0, 0.1);background-image:none}.x-carousel-indicator-dark span.x-carousel-indicator-active{background-color:rgba(0, 0, 0, 0.3);background-image:none}.x-form .x-scroll-container{background-color:#eeeeee}.x-form .x-scroll-container > .x-inner{padding:1em}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333333;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;padding:0.6em;display:none !important;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-form-label span{font-size:.8em;font-weight:bold}.x-field{min-height:2.5em}.x-field .x-field-input{position:relative}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field:last-child{border-bottom:0}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;box-flex:1}.x-label-align-left:first-child .x-form-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em}.x-label-align-left:last-child .x-form-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-label-align-right{-webkit-box-direction:reverse;box-direction:reverse}.x-label-align-right:first-child .x-form-label{-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;box-orient:vertical}.x-label-align-top:first-child .x-form-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-bottom:last-child .x-form-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-input-el{padding:.4em;min-height:2.5em;display:block;border-width:0;background:transparent;-webkit-appearance:none}.x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-required label:after,.x-field-required .x-form-label:after{content:"*";display:inline}.x-item-disabled label:after,.x-item-disabled .x-form-label:after{color:#666 !important}.x-field-textarea textarea{min-height:6em;padding-top:.5em}.x-checkmark-base,.x-field .x-input-radio:after,.x-field .x-input-checkbox:after,.x-field .x-input-radio:checked:after,.x-field .x-input-checkbox:checked:after,.x-field.x-item-disabled .x-input-radio:checked:after,.x-field.x-item-disabled .x-input-checkbox:checked:after,.x-select-overlay .x-item-selected .x-list-item-label:before,.x-select-overlay .x-item-selected .x-list-item-label:after{content:"";position:absolute;width:1.4em;height:1.4em;top:50%;left:auto;right:1.1em;-webkit-mask-size:1.4em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAE+klEQVRoBe2aS28URxRGsY0h2FmwCQuEWLHjvUNgZAQ4PMwrEkIRIGEgySKwB8QvYIvEP+ANO0CwsJAA88wGBEKBZJUVQkJCQrwJ5nxN31Z5pnpc7e4ZT9vT0peqqanquqfurVvlIW3Dw8NTJtPTPplgxdoCnugeb3m45eEJtgJTJwJPGw8cP8V6TfmC4/Z/H9uEAAZsIdqHZiMBn2UNbvigSw8M2AIAD6PtqBPpmYe+8t1NoL9GLfYf3bTKKhiWo9PoA9KV0dUgn/tRh8tXWg/Hnj0KUB8yz1JNnjXUuhFd264A/f0O7dKXpQ7EIiTPfkKuVyvrSlx3US+KPF26cMbwxeg8Gg3W4LWHFd6rUUepQprQnI/Rh9A25AtjmqseHVkK7w59UxpgYFdg7wH0CwqFpWvyrKI23GZ7OWluwgqwOnqOobVoWh4Tm97DwCpBHUFp2TiUX3v5QVMnLQzMmqAsUVWWyta3UX/TAmOcwjjk6KmE830W7GbU0ZTAGKYEJdj3yAcQ2qYw1jmsG9e0KF8122UDw/SHwFX0EYWC+fpZGG/hPcn1sqk8jGHas+dQ6KXCB6o2g91IPfKsObZpgDGsqAT1hXdpz25A7QZqZU1gBsxFSh5zbEA9yniOU5R5PSvvCnYTSsLYtdkLTGf9uKdD/gS6gI6jPndgUXXe24OKSFAK4zsoSVA+G6uAGaC758/oBrIs+Zb6rbg9up35Xpa1jffpUqEEldezysbJ0VPLjhHADOpEfUiw2gtuUtAKDiGtYNXeqDWJ7zveYQnqM3V3nqx1s2s97xmRoLzzWqMgkLLaTVQJa0ZoJe+hXjRmaMYKVlslr2dlp5wgu4PsiTyszmg5qgVr0CqvoZW2WFlKxhV5gxJsdIMKtYH+Eew6yksoNLy0soJeFzqR+vEI9gx6h9wFzFoPSlA+25g3SlChnnUNU3grkWmxRg0n+ihBnUR5w9j2bCbPGjzzR3sgbc+6gL66TV4zkTHHEqSfZSzr+94V0mbzKUF1GkSWknG5QktGyoj7qBdVeZo2S1Ch2yUNXOMVUcEJyrcQjOeP4vzQCu9BpBtOck5T70HybN4w1iJcR7ouem9QPjhfG+On7EBPUNrKhrYLWp7+FS1FCjtdKvJ6VvM/Q9o2uWC1AHq60QB6hELh0voJ+im6iHReF+FZwe5HP/g8lrXNzuEfeeFu9C9Kg8nSrr9lBZ9ljK/v37xjL5qRFSytf3K15KXy9EH0D/JN3ui2Qj1rC5AAq4FnJvoDPUSNBnTnUy4YQF1maFHlCOAYuouJFN6PkWtEo+ryrH5sL2TPVi5UFXAMrfDegxrtae3ZfWh6paFFffYCx9BKZLtQo/a0YLXIhSUo3yKlAsfQ8vSBBkALtrCjxwdqbTWBY2glst9REee0Lw/ULUEZpFuOChxD1yuRybNbUV0SlAtq9SDgGFp7ushEJlhdKuqWoAzSLYOBHeidGPkc+cIztE2wA6iuCcoFtXom4Bha4f0nGmv2FqyOnoaFscFG9rsfQusYq0T2G8qayASrbdEdOlfR/TJ72AzAaHla5/QD9BnVCucvfK/fjZXtx8WzZneu/+WBf53XOb0G6XetHjQXyfv2vKLyH7qLLqMhJn5DOW5PLmBZDfRUilloGUoD/ovvXgIrT4/rkxt4XK0fw+TtYxhT6iEt4FK7L8D4locDFqnUXSadh78Bx5bEl2CLG+8AAAAASUVORK5CYII=');margin-top:-0.7em}.x-field .x-input-radio,.x-field .x-input-checkbox{position:relative}.x-field .x-input-radio:after,.x-field .x-input-checkbox:after{background-color:#dddddd}.x-field .x-input-radio:checked:after,.x-field .x-input-checkbox:checked:after{background-color:#06346a}.x-field.x-item-disabled .x-input-radio:checked:after,.x-field.x-item-disabled .x-input-checkbox:checked:after{background-color:#9caaba}.x-spinner .x-component-outer{display:-webkit-box;display:box}.x-spinner .x-component-outer > *{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000;padding:0;width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;color:black}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-color:#f7f7f7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #ffffff), color-stop(100%, #e5e5e5));background-image:-webkit-linear-gradient(#ffffff,#ffffff 2%,#e5e5e5);background-image:linear-gradient(#ffffff,#ffffff 2%,#e5e5e5)}.x-spinner.x-item-disabled .x-spinner-button .x-button-icon.x-icon-mask,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button .x-button-icon.x-icon-mask{background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(2%, #121212), color-stop(100%, #000000));background-image:-webkit-linear-gradient(#4d4d4d,#121212 2%,#000000);background-image:linear-gradient(#4d4d4d,#121212 2%,#000000)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-color:#efefef;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d5d5d5), color-stop(10%, #e2e2e2), color-stop(65%, #efefef), color-stop(100%, #f0f0f0));background-image:-webkit-linear-gradient(#d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:linear-gradient(#d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{width:3em;padding:.65em 0;font-weight:bold;text-align:center}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #aaaaaa;border-top-color:#b7b7b7;color:black}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#aaaaaa}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #efefef), color-stop(100%, #cbcbcb));background-image:-webkit-linear-gradient(#ffffff,#efefef 2%,#cbcbcb);background-image:linear-gradient(#ffffff,#efefef 2%,#cbcbcb)}.x-spinner .x-spinner-button .x-button-icon.x-icon-mask,.x-toolbar .x-spinner .x-spinner-button .x-button-icon.x-icon-mask{background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4d4d4d), color-stop(2%, #121212), color-stop(100%, #000000));background-image:-webkit-linear-gradient(#4d4d4d,#121212 2%,#000000);background-image:linear-gradient(#4d4d4d,#121212 2%,#000000)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-color:#d5d5d5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bcbcbc), color-stop(10%, #c9c9c9), color-stop(65%, #d5d5d5), color-stop(100%, #d7d7d7));background-image:-webkit-linear-gradient(#bcbcbc,#c9c9c9 10%,#d5d5d5 65%,#d7d7d7);background-image:linear-gradient(#bcbcbc,#c9c9c9 10%,#d5d5d5 65%,#d7d7d7)}.x-spinner .x-spinner-button-down{border:0 !important;border-right:1px solid #dddddd !important}.x-spinner .x-spinner-button-up{border:0 !important;border-left:1px solid #dddddd !important}.x-phone .x-select-overlay{min-width:14em;min-height:12.5em}.x-select-overlay{min-width:18em;min-height:22em}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected .x-list-item-label:before{background-color:rgba(0, 0, 0, 0.3);margin-top:-0.8em}.x-select-overlay .x-item-selected .x-list-item-label:after{background-color:#dddddd}.x-slider-field .x-component-outer,.x-toggle-field .x-component-outer{padding:0.6em}.x-slider,.x-toggle{position:relative;height:2.2em;min-height:0;min-width:0}.x-slider > *,.x-toggle > *{position:absolute;width:100%;height:100%}.x-slider.x-item-disabled{opacity:.6}.x-thumb{position:absolute;height:2.2em;width:2.2em}.x-thumb:before{content:"";position:absolute;width:1.85em;height:1.85em;top:0.175em;left:0.175em;border:1px solid #919191;-webkit-border-radius:0.925em;border-radius:0.925em;background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #efefef), color-stop(100%, #cbcbcb));background-image:-webkit-linear-gradient(#ffffff,#efefef 2%,#cbcbcb);background-image:linear-gradient(#ffffff,#efefef 2%,#cbcbcb);-webkit-background-clip:padding;background-clip:padding-box}.x-thumb.x-dragging{opacity:1}.x-thumb.x-dragging:before{background-color:#d0d0d0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(2%, #e2e2e2), color-stop(100%, #bebebe));background-image:-webkit-linear-gradient(#ffffff,#e2e2e2 2%,#bebebe);background-image:linear-gradient(#ffffff,#e2e2e2 2%,#bebebe)}.x-slider:after{content:"";position:absolute;width:auto;height:0.8em;top:0.737em;left:0;right:0;margin:0 0.925em;background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);border:0.1em solid rgba(0, 0, 0, 0.1);border-bottom:0;-webkit-box-shadow:rgba(255, 255, 255, 0.7) 0 0.1em 0;-webkit-border-radius:0.4em;border-radius:0.4em}.x-toggle{width:4.4em;-webkit-border-radius:1.1em;border-radius:1.1em;overflow:hidden;border:1px solid #b7b7b7;background-color:#ddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(#c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-webkit-box-flex:0}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:0.175em}.x-toggle-on{background-color:#92cf00;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #6e9c00), color-stop(10%, #80b500), color-stop(65%, #92cf00), color-stop(100%, #94d200));background-image:-webkit-linear-gradient(#6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:linear-gradient(#6e9c00,#80b500 10%,#92cf00 65%,#94d200)}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{content:"";position:absolute;width:0.86em;height:0.86em;top:50%;left:0.5em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAGdElEQVRoBdWaa4ycUxjHd9rpbm2bqKhiUavbVZdo0LCyLl3iHhGEkkZsKBYJX4RISHwQIYIPNJoQlUjTuCakUZ9oVGRF0GywslvqbgkpDarqsn7/6XsmM5n38pzzvtudeZL/nplznvM8z//cz5ktTU5OtuWRUqk0i/qdoAN0gcXgP+CkzIcx8APYBXbi82/SaZFSKGGILiTibnA+GADHgbkgSXZT8CF4GwyDEXxvI92r4k0Yoj1EeAG4CvSDEggRkX8VbID4lhADQXXUwxZgfAF4CGwFmgdFYQJb68HJljjy6mSSJZAZ4CLwESiKZJydb7A/CGblJZVWP5UwzueBB8AfIC7IovO0mK0B89KCzlOWSBinWoBeAkWTstiT3948xJLqxhLG2Xzw4jSRdQ0yiv/upMBD8xsI40Rzdu00k3WknyeO+aHk4urFEb4TJ/80CWEdYB4BhS1kdfswe+zpGNf80RYUIr9QSdgOdNCYCfaLcABpqFxBbymu3FIlDFkdD18B5wRYHaHOJvAeGCU4fa8IdnXUPAaoMZeDk4CvfEKFM7CrhswnbpxjZQX4C7j5Y0m1d64EXc5OWoqeFsPLwTvAYt/p/Iv+6jTb1rLKHMbYgWCjZxCb0T/e6qhWj3o6hz8HRMSRykp17l5WayfksyN8oafzTegfHOLQ1aG+blc6ZGQRdeVawB4GlWno7Pim1G9rB08AZzgrfRfdw3wdxelHvl/38K01Itc2Rf22Q8BPIIuoynXQL/SQj71DwcfA4n8nev1xjWfN0yGjD2gxsYh6432LolWHQL9F91Gj/j7oacUPFhE+11hbLxbrCFBzqWh5A4PDRqN90RZqVK9XE+ET67MSv41D9s3E0nwFX1Ndu4RFjkZpjkUxTkeEdTDIEvXqW1lKoeU0pOavXj10OsuSI1CYnaWUVC7COvpliR7f9CQzlaK5/LPBQRc6mstBIsIW0WXiO4tiDh35mIr1oS4kK2ENOctwqzPu+SX0MdDLjZWw9Pb1suyv7EPYR7cuEithLRLL6moW/0VriaVRtT1qTQkSER411Cyjc4pBL4/KEirPNRj4FZ3gXy5EWM+vWaIhtJQNf2GWYkg5dtWzui9bhuqn6OkVNUhE+ANjTZG91Kjrq6bDxHnGStqvcxHWsU5bQpZ0orCK3rDs21m2quXY6+DLTWBBNTP9wxbOKZZ4E63omLYZWG4r0nkQtOtwVASwdYeH723o9uTxS/3Ks+ytHk5/R3cI5LqIK2hEDw86XVkb+wV0Z+YiHDnWCjnu4Vj3Ug3DzhDn1NPacTX4HljJ6gFPr5e5RpZ74tFz6l0ezhWk5tFTYJFPEOjrLKxhrEazktWR8zVQ9vEVp1ttLYyplyeANQinN0ydIXBUnAOXR7nsrwAbgatrTbX3nu1s5Ul1oKgIRsZYMR/jy72gY0+u6a8OJMJX1P+C9MsaqDcPAseCHtANQkRTwHIoybZd21qR0Q2k1pZP0tNJSIubLhxJOr75egO/sjbekM/VIe0qY1RDb6p//PYl6/QniO0sF2tI2kBYRpBTgVrUOWqm9DPiGgghW+GWVBGj/UCvEM1E1sWinr4sKfa0/NgedhUwqsVITzvOUTOl6gxv0qmERRw5HOi/bHz2zb3VMHp28hremYQj0rq23QhGwFSQ0ZVPu8NvAfa3Use8kJkI1wzxxRhfDcYDAotrKF0GngYnRA17D599f7KVXcVzmoszLfUi7AxhfBG4GKwFPudhBacnmpfBStDwnzrkrQIhpDW8L3ExJqXV/wBA2Vs4WelquT9Qzy8FvdHnDlKR01RQ8OrJMaAp8TnYQUA7SBsEm6pzPXgcyI6PaCG7Hdu6VcVLUkuE5ONBR8ByDGb42sPGteBPEDcV0vK0ZZ2Z5C9oSCcZKzqfwO8OJK2FbCAunqYmrICRQaA3rLRejSvTWtGwTzc94Yj0DQS/O4C05nQd6VYhrIVMpEN6Wqv3crBngY4b582aR9DXgJCFTPt05T+AtKq2jNARzxLs/UBbnY/0onwLO97sXPuwj8cidQn8OuytAe0edjUyuluqh2vIPcNnPS1rIbOKfkRf0pKEGdqSJyFwM/AZ3j+2JGHXpZDWWf4+sMvlpaTal7e3xLYEsdQ4ITIIsras29AppxrKctRM5ZDRLUvv13GnLl1p5yjellylCb5BolvWkRQMgT6g6apXmnVgPWQrc/1/boJCaHVWyukAAAAASUVORK5CYII=');-webkit-mask-size:.86em;background-color:#ccc;-webkit-mask-repeat:no-repeat;margin-top:-0.43em}.x-field-search .x-field-input .x-form-field{margin-left:1.0em}.x-field-input .x-clear-icon{display:none;background:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADHmlDQ1BJQ0MgUHJvZmlsZQAAeAGFVN9r01AU/tplnbDhizpnEQk+aJFuZFN0Q5y2a1e6zVrqNrchSJumbVyaxiTtfrAH2YtvOsV38Qc++QcM2YNve5INxhRh+KyIIkz2IrOemzRNJ1MDufe73/nuOSfn5F6g+XFa0xQvDxRVU0/FwvzE5BTf8gFeHEMr/GhNi4YWSiZHQA/Tsnnvs/MOHsZsdO5v36v+Y9WalQwR8BwgvpQ1xCLhWaBpXNR0E+DWie+dMTXCzUxzWKcECR9nOG9jgeGMjSOWZjQ1QJoJwgfFQjpLuEA4mGng8w3YzoEU5CcmqZIuizyrRVIv5WRFsgz28B9zg/JfsKiU6Zut5xCNbZoZTtF8it4fOX1wjOYA1cE/Xxi9QbidcFg246M1fkLNJK4RJr3n7nRpmO1lmpdZKRIlHCS8YlSuM2xp5gsDiZrm0+30UJKwnzS/NDNZ8+PtUJUE6zHF9fZLRvS6vdfbkZMH4zU+pynWf0D+vff1corleZLw67QejdX0W5I6Vtvb5M2mI8PEd1E/A0hCgo4cZCjgkUIMYZpjxKr4TBYZIkqk0ml0VHmyONY7KJOW7RxHeMlfDrheFvVbsrj24Pue3SXXjrwVhcW3o9hR7bWB6bqyE5obf3VhpaNu4Te55ZsbbasLCFH+iuWxSF5lyk+CUdd1NuaQU5f8dQvPMpTuJXYSWAy6rPBe+CpsCk+FF8KXv9TIzt6tEcuAcSw+q55TzcbsJdJM0utkuL+K9ULGGPmQMUNanb4kTZyKOfLaUAsnBneC6+biXC/XB567zF3h+rkIrS5yI47CF/VFfCHwvjO+Pl+3b4hhp9u+02TrozFa67vTkbqisXqUj9sn9j2OqhMZsrG+sX5WCCu0omNqSrN0TwADJW1Ol/MFk+8RhAt8iK4tiY+rYleQTysKb5kMXpcMSa9I2S6wO4/tA7ZT1l3maV9zOfMqcOkb/cPrLjdVBl4ZwNFzLhegM3XkCbB8XizrFdsfPJ63gJE722OtPW1huos+VqvbdC5bHgG7D6vVn8+q1d3n5H8LeKP8BqkjCtbCoV8yAAAACXBIWXMAAAsTAAALEwEAmpwYAAABbmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iWE1QIENvcmUgNC40LjAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iPgogICAgICAgICA8ZGM6c3ViamVjdD4KICAgICAgICAgICAgPHJkZjpCYWcvPgogICAgICAgICA8L2RjOnN1YmplY3Q+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgrlPw1BAAAIWklEQVRoBdVbS2hVRxiee83LmJeaRBOTCKWgtIiJoQYNFAnSRSF205AqKEJ3urDQlq7aECuuCqUUzK5gS20XBUMLlQYaH3TRoGJsaTURN0mMryQGE40mJun3He65zL2ZmTPnZZOBm3POzPz//N/MN/88k1hcXBRxh2vXrlUsLCxsWbVq1WaUV5JIJIpRZi5+0/iewvc40gdvI7S1tc3GaU8iDsBXr17dlpOTsxeGt+C3G791NiBgyzzA30De83jvffLkye/Nzc1TNrK2eSIDDJBVAHkIhh6E0a/bGmDKB10zSO9G659ubGzswXdoOoYGfOXKlVcA9BOAPAzj8kwAwqQB67+QP3nr1q0fQfv5oLoCA+7r6yvJz88/joKPAmxOUAMCyN2cn58/umPHjt4AsiIQ4P7+/ndQWBeAVgUpNAoZtPgP0HOkvr5+0o8+X4ABMAGP+xkeHSgk4aegmPIOQO++7du3D9rqtwYMp1SIYeU0wL5rq/xl5ENLT8KmdoDusSkvaZPp8uXLtXBMfyw3sLQdNpUB9K/oZsdssHi2MMHm5ub2QfH/1l9tgDAPhq8TDQ0Nn5ryGwGTxmxZKGgwKVlOaQB9AKDp0JRBS2m0aIJ9FlIrBiwRJpPJb0DvN5Roma5LSHnjZeWgdLZmxRfguxv2V2fFO59KwBxn0cAcelZkgO3V+J29cOHCkgnRkojUDKoLSI3jbF1dnVi7dq22QsbGxsSdO3e06aaE2tpasW6dfr0xMjIixsfHTSrovXeWlZV9gExfyBmXtDCni8js6ZEJZm5uTtaV8b5+/XpRVFSUEWfzQRlTRT5+/FhMTEzYqCLoDjRgjZw5AzAXAkg8KmfQvWM+K4aGhnTJLEzU1NTQiWjzZCe4MnyqwosXLwRbF+OuKlkVV1RQUNApJ2RYk1r1LKG5LCC/Y70qHj58KEdlvIMtoqrKkyxpmY0bNwrK6ALBmlilkkPlHMTwWuempQFzPYuaPewm2DxZ0/fv3xfPnj3TZmdftKF2YWGhKC8v1+ohjUlnvwGYctGQH7lyacCIPIRI3+tZUnt4eNjVt+RJSm/atMmh+JJEKYJ5dPSfnZ0Vd+/e9UNlSbOg3MFz58451EkDZmRGLh8fMzMzjkE6EdK0ulo5LDoiGzZsEKtXr9aJO/2W/TdoQCuXobu0Ut4BDDpvQ2TgbRlSm8ME+7QqQLfjeVXUhlNxqMw8qvDgwQMxPT2tSvIVB/bsp4ADGHTe60takZnU5lCFuawiVQhMU51WzqYtWx7lK2XIHDpFVmjYAB0tnZ2d6TGjJaxCytN5sa/pAluTntgNprGaIFmBYajslsMnad3a2trg9uFmOTHoO4189OiR1pvK1M7LyxOVlZVaZ3bv3j3x9OnToKYo5VD+7hxukoNm+jmiUlQfSWqzlTnMqKjKOI7N9LwErQpTU1PObCoKKsv6AXhrEkq3ypFRvHtRmx65pKREWRQpzNaNispyIQC8JcnjDzkyqvfJyUmH3ip9pHa283LzcSITNZVd3WjczUl4VZ7zRB7orTmkPH/+3Fq3qZKslRgyoqJLkvgTC2CWS2qzxWz6IiuGeekD4gqwo5hemqd4sQWOpXRQXoEOzDTb8pK3TM8l4PDTGE1pnGxw2mhaAbmi7NfMy7E6xjBNLx3pcaRsLBfy2HWQo4zvrBiOzayoOAIqdYp92LxXErBkjsNsMVWgQ9P1a1ZSaWmpSix0HMocp5ceDK0pSwEnF5xCqiYezMp1Lfu2LnBiElN/HkzymgGQR+Ya2Re56C8uVjt/d23L2ZhucuFWWNTUhm0DSd6pwMsNXW37jSeV5QWCLE8ac2wmaC75OO/WUZszMdKbFRhVAJuvu4uH81EoZcuYdjcIUt5e5RTStD1EakfotRcB+KIDGLUc6DRdriS2REVFhbbvkb6jo6OyiLN2ZpxussHpJyswCmoD41+4JzLmAOZtGUTovUiGmeoP7mZwSFEF0pYLeVVrelF7zZo1guvmsNSGDb/QNgdw6mpQt8pYmzhSmXvQukCPzL6rC2xl05w7Cq8NtnzH8t0+THp9qzPIFM+ap0G6tS30eh65kAGm7SGWz+OXENT+070WkQYMfv+Ggnk1yFegNzWdA/GMyWa5R2qbjlDovDiRCUjtL11QacAAy52yk26CzRM3A4xUJk3piW0Dx2YTtekU2ad9hoHu7u6fXJk0YEbw0hceN91E05M1zX6rm02x/nyeAzle20uGp5Z+qA07jnd0dKS3UjMA84YbgtVhGmms26ZhRXFSQZr6DdljdbY8WcWhyiYA7CXc4zoj51Xe8cCB+Bm0oLNxLWdeSe8AOwcMDXBW/8h2Z7SwlHAE7wPS94p7BeBj2WAJQgk4dZ1vH4R8XetbLrUCu0/hJk+Xyh4lYGbkuAVKtEM4spWUyoAY4nqxGai9pKYFnALdg+eHMRgVi0o0zm2M+W179uzRHjUaAdMq0PsrzJZOxGJhhEoJFox8e9euXcYLIJ6AaROv8wH0Abzqj/ojNN6vKoA9j/n6TnZDL1krwFTC63xQ/CZ+mWs8rxJiToc9p9Bn3/JqWdcM5TjsJqqevOEG6pzFb6cq/WXFAegcfsd03lhnh3ULuwpQwChqtBmFfYw4/1MpV1GIJ8q+hAqHKeqhx6TadwvLynjpC6uYThjA/2SJ9QQjVe4AyvocjvR72Q4/775bWFbe1NQ0AkfxPubfryL+axgT10SlD/rbsep5LQxY2h6qhalADrwahM2AfWjt9wC+BU/7YwdZkXPTaPFv6PiZOxU23jdTXP8VKWC5GF4g4Z0KgG7Gbwt+WwFgM57FeHLTml1gGt/8d7wxvHNmN4Dh7zp+F7nhJuuL6v0/Vc+vwPfknLsAAAAASUVORK5CYII=') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;position:absolute;top:50%;right:-0.5em}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:2.2em}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-item-disabled .x-form-label span,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;-webkit-text-fill-color:#b3b3b3;pointer-events:none}.x-form-fieldset{margin:0 0 1.5em}.x-form-fieldset .x-form-label{background-color:#f7f7f7;border-top:1px solid white}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #dddddd;background:#fff;padding:0;-webkit-border-radius:0.4em;border-radius:0.4em;overflow:hidden}.x-form-fieldset .x-field{border-bottom:1px solid #dddddd}.x-form-fieldset .x-field:first-child{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333333;margin:1em 0.7em 0.3em;color:#333333;font-weight:bold;white-space:nowrap}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333333;color:gray;margin:1em 0.7em 0.3em;font-size:.8em;text-align:center}.x-selectmark-base,.x-field-select .x-component-outer:after{content:"";position:absolute;width:1em;height:1em;top:50%;left:auto;right:0.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-0.5em}.x-field-select{position:relative}.x-field-select .x-component-outer:after{background-color:#dddddd;z-index:2}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-field-select .x-component-outer:before{content:"";position:absolute;width:4em;height:auto;top:0;left:auto;right:0;bottom:0;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255, 255, 255, 0)), color-stop(0.5, white));z-index:1}.x-msgbox{min-width:15em;max-width:20em;padding:0.8em;-webkit-box-shadow:rgba(0, 0, 0, 0.4) 0 0.1em 0.5em;-webkit-border-radius:0.3em;border-radius:0.3em;border:0.15em solid #354f6e}.x-msgbox .x-icon{margin-left:1.3em}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-webkit-box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0;height:1.3em}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-msgbox .x-field{min-height:2em;background:#fff;-webkit-border-radius:0.2em;border-radius:0.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{text-align:center;padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button{min-width:4.5em}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(186, 202, 222, 0.9);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-color:rgba(186, 202, 222, 0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(152,176,205,0.9)), color-stop(10%, rgba(169,189,214,0.9)), color-stop(65%, rgba(186,202,222,0.9)), color-stop(100%, rgba(188,204,223,0.9)));background-image:-webkit-linear-gradient(rgba(152,176,205,0.9),rgba(169,189,214,0.9) 10%,rgba(186,202,222,0.9) 65%,rgba(188,204,223,0.9));background-image:linear-gradient(rgba(152,176,205,0.9),rgba(169,189,214,0.9) 10%,rgba(186,202,222,0.9) 65%,rgba(188,204,223,0.9));border:0.1em solid rgba(66, 99, 138, 0.9)}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:0.5em 0.5em}.x-loading-spinner > span,.x-loading-spinner > span:before,.x-loading-spinner > span:after{display:block;position:absolute;width:0.1em;height:0.25em;top:0;-webkit-transform-origin:0.05em 0.5em;-webkit-border-radius:0.05em;border-radius:0.05em;content:" "}.x-loading-spinner > span.x-loading-top{background-color:rgba(170, 170, 170, 0.99)}.x-loading-spinner > span.x-loading-top::after{background-color:rgba(170, 170, 170, 0.9)}.x-loading-spinner > span.x-loading-left::before{background-color:rgba(170, 170, 170, 0.8)}.x-loading-spinner > span.x-loading-left{background-color:rgba(170, 170, 170, 0.7)}.x-loading-spinner > span.x-loading-left::after{background-color:rgba(170, 170, 170, 0.6)}.x-loading-spinner > span.x-loading-bottom::before{background-color:rgba(170, 170, 170, 0.5)}.x-loading-spinner > span.x-loading-bottom{background-color:rgba(170, 170, 170, 0.4)}.x-loading-spinner > span.x-loading-bottom::after{background-color:rgba(170, 170, 170, 0.35)}.x-loading-spinner > span.x-loading-right::before{background-color:rgba(170, 170, 170, 0.3)}.x-loading-spinner > span.x-loading-right{background-color:rgba(170, 170, 170, 0.25)}.x-loading-spinner > span.x-loading-right::after{background-color:rgba(170, 170, 170, 0.2)}.x-loading-spinner > span.x-loading-top::before{background-color:rgba(170, 170, 170, 0.15)}.x-loading-spinner > span{left:50%;margin-left:-0.05em}.x-loading-spinner > span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg)}.x-loading-spinner > span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg)}.x-loading-spinner > span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg)}.x-loading-spinner > span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg)}.x-loading-spinner > span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg)}.x-loading-spinner > span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}} diff --git a/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.js b/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.js new file mode 100644 index 0000000000..caf8e4541d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/programs/touchui/sencha-touch.js @@ -0,0 +1,15 @@ +/* + +This file is part of Sencha Touch 2 + +Copyright (c) 2012 Sencha Inc + +Contact: http://www.sencha.com/contact + +Commercial Usage +Licensees holding valid commercial licenses may use this file in accordance with the Commercial Software License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and Sencha. + +If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. + +*/ +(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()},});Ext.type=Ext.typeOf})();(function(){var a="4.1.0",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("core",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;ee){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){if(!d){d=this}if(!c){c=Array.prototype.slice.call(arguments)}if(a){clearTimeout(a);a=null}a=setTimeout(function(){e.apply(d,c)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){var e=c.apply(this,arguments);d.apply(this,arguments);return e}},interceptAfter:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){d.apply(this,arguments);return c.apply(this,arguments)}}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){return encodeString(o)}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(l===k){return n[l]}m=n[l];k=k.substring(l.length+1)}if(m.length>0){m+="/"}return m.replace(/\/\.\//g,"/")+k.replace(/\./g,"/")+".js"},getPrefix:function(l){var n=this.config.paths,m,k="";if(n.hasOwnProperty(l)){return l}for(m in n){if(n.hasOwnProperty(m)&&m+"."===l.substring(0,m.length+1)){if(m.length>k.length){k=m}}}return k},require:function(m,l,k,n){if(l){l.call(k)}},syncRequire:function(){},exclude:function(l){var k=this;return{require:function(o,n,m){return k.require(o,n,m,l)},syncRequire:function(o,n,m){return k.syncRequire(o,n,m,l)}}},onReady:function(n,m,o,k){var l;if(o!==false&&Ext.onDocumentReady){l=n;n=function(){Ext.onDocumentReady(l,m,k)}}n.call(m)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var k=this.queue,q=k.length,n,p,l,o,m;if(q===0){this.triggerReady();return}for(n=0;nthis.numLoadedFiles){continue}l=0;do{if(a.isCreated(o[l])){f(o,l,1)}else{l++}}while(l=200&&o<300){Ext.globalEval(u.responseText+"\n//@ sourceURL="+l);s.call(w)}else{}}u=null}},syncRequire:function(){var k=this.syncModeEnabled;if(!k){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!k){this.syncModeEnabled=false}this.refreshQueue()},require:function(F,t,n,q){var v={},m={},y=this.queue,C=this.classNameToFilePathMap,A=this.isClassFileLoaded,s=[],H=[],E=[],l=[],r,G,x,w,k,p,D,B,z,u,o;if(q){q=h(q);for(B=0,u=q.length;B0){s=a.getNamesByExpression(k);for(z=0,o=s.length;z0){r=function(){var K=[],J,L,I;for(J=0,L=l.length;J0){H=a.getNamesByExpression(w);o=H.length;for(z=0;z0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((E.length>1)?"es":"")+": "+E.join(", "))}}else{r.call(n);return this}G=this.syncModeEnabled;if(!G){y.push({requires:E.slice(),callback:r,scope:n})}u=E.length;for(B=0;B');document.write('');document.write('');if(Ext.isString(d)){document.write('')}if(l&&j){document.write('')}if(q&&!j){document.write('')}if(Ext.isString(o)||Ext.isString(k)||Ext.isString(m)){o={"57":k||m||o,"72":m||k||o,"114":k||m||o}}g=(s.glossOnIcon===false)?"-precomposed":"";if(o){var t=o["72"],e=o["57"],h=o["114"],r='')}else{if(!j){if(e){document.write(r+g+'" href="'+e+'">')}if(h){document.write(r+g+'" sizes="114x114" href="'+h+'">')}}}}}},application:function(a){var c,b;if(!a){a={}}Ext.Loader.setPath(a.name,a.appFolder||"app");a.requires=Ext.Array.from(a.requires);a.requires.push("Ext.app.Application");c=a.onReady;b=a.scope;a.onReady=function(){new Ext.app.Application(a);if(c){c.call(b)}};Ext.setup(a)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}else{if(typeof b=="string"){return Ext.getCmp(b)}}if(b===true){if(a){return a}else{return d.instantiate(e)}}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}if("xclass" in b){c=d.instantiate(b.xclass,b)}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){return this[a]},set:function(e){this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){return this[h].apply(this,arguments)}}else{e=function(){return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{requires:["Ext.Version"],statics:{names:{ios:"iOS",android:"Android",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",linux:"Linux",bada:"Bada",other:"Other"},prefixes:{ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",blackberry:"BlackBerry(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/"}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(m,b){var k=this.statics(),j=k.names,c=k.prefixes,a,h="",d,g,f,l,e;e=this.is=function(i){return this.is[i]===true};for(d in c){if(c.hasOwnProperty(d)){g=c[d];f=m.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[d];if(f[1]&&(f[1]=="HTC_"||f[1]=="Silk/")){h=new Ext.Version("2.3")}else{h=new Ext.Version(f[f.length-1])}break}}}if(!a){a=j[(m.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b)}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(d in j){if(j.hasOwnProperty(d)){l=j[d];if(!e.hasOwnProperty(a)){this.setFlag(l,(a===l))}}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&/Windows|Linux|MacOS/.test(g)){d="Desktop"}else{if(b.is.iPad||b.is.Android3||(b.is.Android4&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{requires:["Ext.env.Browser","Ext.env.OS"],constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};return this},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOSX|Linux/))},Orientation:function(){return("orientation" in window)&&this.isEventSupported("orientationchange")},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.os.is.Android2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}this.self.cache[b]=this}return b},setId:function(c){var a=this.id,b=this.self.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:function(){return Boolean(this.dom.offsetParent)},set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(d,b){var e=null,c=a._flyweights;b=b||"_global";d=Ext.getDom(d);if(d){e=c[b]||(c[b]=new a.Fly());e.dom=d;e.isSynchronized=false}return e}});Ext.get=function(b){return a.get.call(a,b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(Ext.isNumber(b)){return b+(a||this.defaultUnit||"px")}if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(!this.unitRe.test(b)){return b||""}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:parseFloat(c[0])||0,right:parseFloat(c[1])||0,bottom:parseFloat(c[2])||0,left:parseFloat(c[3])||0}},unitizeBox:function(f,e){var d=this.addUnits,c=this.parseBox(f);return d(c.top,e)+" "+d(c.right,e)+" "+d(c.bottom,e)+" "+d(c.left,e)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.core.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.core.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.get(a);this.insertBefore(a);a.remove();return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a,b.dom)}else{a=Ext.core.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);Ext.dom.Element.addToCache(b.isFlyweight?new Ext.dom.Element(b.dom):b);return b},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.core.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.core.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},insertHtml:function(b,c,a){var d=Ext.core.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(a){return this.getXY(a)[0]},getY:function(a){return this.getXY(a)[1]},getXY:function(){var a=window.webkitConvertPointFromNodeToPage;if(a){return function(){var b=a(this.dom,new WebKitPoint(0,0));return[b.x,b.y]}}else{return function(){var c=this.dom.getBoundingClientRect(),b=Math.round;return[b(c.left+window.pageXOffset),b(c.top+window.pageYOffset)]}}}(),getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom,j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(!c){return new Ext.util.Region()}if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],requires:["Ext.dom.Element"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a)},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){c[e]=c[e]||function(){return this.invoke(e,arguments)}}).call(c,b)}}c.on=c.addListener;if(Ext.DomQuery){a.selectorFunction=Ext.DomQuery.select}a.select=function(e,f){var g;if(typeof e=="string"){g=a.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{}}return new Ext.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.define("Ext.ComponentManager",{alternateClassName:"Ext.ComponentMgr",singleton:true,constructor:function(){var a={};this.all={map:a,getArray:function(){var b=[],c;for(c in a){b.push(a[c])}return b}};this.map=a},register:function(a){this.map[a.getId()]=a},unregister:function(a){delete this.map[a.getId()]},isRegistered:function(a){return this.map[a]!==undefined},get:function(a){return this.map[a]},create:function(a,c){if(a.isComponent){return a}else{if(Ext.isString(a)){return Ext.createByAlias("widget."+a)}else{var b=a.xtype||c;return Ext.createByAlias("widget."+b,a)}}},registerType:Ext.emptyFn});Ext.define("Ext.ComponentQuery",{singleton:true,uses:["Ext.ComponentManager"]},function(){var g=this,j=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),e=function(o,n){return n.method.apply(this,[o].concat(n.args))},a=function(p,t){var n=[],q=0,s=p.length,r,o=t!==">";for(;q\^])\s?|\s|$)/,c=/^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,b=[{re:/^\.([\w\-]+)(?:\((true|false)\))?/,method:l},{re:/^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,method:m},{re:/^#([\w\-]+)/,method:d},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:k},{re:/^(?:\{([^\}]+)\})/,method:j}];g.Query=Ext.extend(Object,{constructor:function(n){n=n||{};Ext.apply(this,n)},execute:function(o){var q=this.operations,r=0,s=q.length,p,n;if(!o){n=Ext.ComponentManager.all.getArray()}else{if(Ext.isArray(o)){n=o}}for(;r1){for(q=0,r=s.length;q1){r=q.length;for(p=0;p]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|exec|switch|case|eval)\s*\=\s*(?:(?:["]([^"]*)["])|(?:[']([^']*)[']))\s*/g,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/});Ext.define("Ext.app.Action",{config:{scope:null,application:null,controller:null,action:null,args:[],url:undefined,data:{},title:null,beforeFilters:[],currentFilterIndex:-1},constructor:function(a){this.initConfig(a);this.getUrl()},execute:function(){this.resume()},resume:function(){var b=this.getCurrentFilterIndex()+1,c=this.getBeforeFilters(),a=this.getController(),d=c[b];if(d){this.setCurrentFilterIndex(b);d.call(a,this)}else{a[this.getAction()].apply(a,this.getArgs())}},applyUrl:function(a){if(a===null||a===undefined){a=this.urlEncode()}return a},applyController:function(a){var c=this.getApplication(),b=c.getCurrentProfile();if(Ext.isString(a)){a=c.getController(a,b?b.getNamespace():null)}return a},urlEncode:function(){var a=this.getController(),b;if(a instanceof Ext.app.Controller){b=a.$className.split(".");a=b[b.length-1]}return a+"/"+this.getAction()}});Ext.define("Ext.app.Route",{config:{conditions:{},url:null,controller:null,action:null,initialized:false},constructor:function(a){this.initConfig(a)},recognize:function(b){if(!this.getInitialized()){this.initialize()}if(this.recognizes(b)){var c=this.matchesFor(b),a=b.match(this.matcherRegex);a.shift();return Ext.applyIf(c,{controller:this.getController(),action:this.getAction(),historyUrl:b,args:a})}},initialize:function(){this.paramMatchingRegex=new RegExp(/:([0-9A-Za-z\_]*)/g);this.paramsInMatchString=this.getUrl().match(this.paramMatchingRegex)||[];this.matcherRegex=this.createMatcherRegex(this.getUrl());this.setInitialized(true)},recognizes:function(a){return this.matcherRegex.test(a)},matchesFor:function(b){var f={},e=this.paramsInMatchString,a=b.match(this.matcherRegex),d=e.length,c;a.shift();for(c=0;c0){f.timeout=setTimeout(Ext.bind(i.handleTimeout,i,[f]),l)}i.setupErrorHandling(f);i[k]=Ext.bind(i.handleResponse,i,[f],true);i.loadScript(f);return f},abort:function(b){var c=this.statics().requests,a;if(b){if(!b.id){b=c[b]}this.abort(b)}else{for(a in c){if(c.hasOwnProperty(a)){this.abort(c[a])}}}},setupErrorHandling:function(a){a.script.onerror=Ext.bind(this.handleError,this,[a])},handleAbort:function(a){a.errorType="abort";this.handleResponse(null,a)},handleError:function(a){a.errorType="error";this.handleResponse(null,a)},cleanupErrorHandling:function(a){a.script.onerror=null},handleTimeout:function(a){a.errorType="timeout";this.handleResponse(null,a)},handleResponse:function(a,b){var c=true;if(b.timeout){clearTimeout(b.timeout)}delete this[b.callbackName];delete this.statics()[b.id];this.cleanupErrorHandling(b);Ext.fly(b.script).destroy();if(b.errorType){c=false;Ext.callback(b.failure,b.scope,[b.errorType])}else{Ext.callback(b.success,b.scope,[a])}Ext.callback(b.callback,b.scope,[c,a,b.errorType])},createScript:function(c,d,b){var a=document.createElement("script");a.setAttribute("src",Ext.urlAppend(c,Ext.Object.toQueryString(d)));a.setAttribute("async",true);a.setAttribute("type","text/javascript");return a},loadScript:function(a){Ext.getHead().appendChild(a.script)}});Ext.define("Ext.data.Operation",{config:{synchronous:true,action:null,filters:null,sorters:null,grouper:null,start:null,limit:null,batch:null,callback:null,scope:null,resultSet:null,records:null,request:null,response:null,withCredentials:null,params:null,url:null,page:null,node:null,model:undefined,addRecords:false},started:false,running:false,complete:false,success:undefined,exception:false,error:undefined,constructor:function(a){this.initConfig(a)},applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},getRecords:function(){var a=this.getResultSet();return this._records||(a?a.getRecords():[])},setStarted:function(){this.started=true;this.running=true},setCompleted:function(){this.complete=true;this.running=false},setSuccessful:function(){this.success=true},setException:function(a){this.exception=true;this.success=false;this.running=false;this.error=a},hasException:function(){return this.exception===true},getError:function(){return this.error},isStarted:function(){return this.started===true},isRunning:function(){return this.running===true},isComplete:function(){return this.complete===true},wasSuccessful:function(){return this.isComplete()&&this.success===true},allowWrite:function(){return this.getAction()!="read"},process:function(d,b,c,a){if(b.getSuccess()!==false){this.setResponse(a);this.setResultSet(b);this.setCompleted();this.setSuccessful()}else{return false}return this["process"+Ext.String.capitalize(d)].call(this,b,c,a)},processRead:function(d){var b=d.getRecords(),g=[],f=this.getModel(),e=b.length,c,a;for(c=0;c]+>/gi,none:function(a){return a},asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){a=parseFloat(String(a).replace(/,/g,""));return isNaN(a)?0:a},asInt:function(a){a=parseInt(String(a).replace(/,/g,""),10);return isNaN(a)?0:a}});Ext.define("Ext.data.Types",{singleton:true,requires:["Ext.data.SortTypes"],stripRe:/[\$,%]/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/},function(){var b=this,a=Ext.data.SortTypes;Ext.apply(b,{AUTO:{convert:function(c){return c},sortType:a.none,type:"auto"},STRING:{convert:function(c){return(c===undefined||c===null)?(this.getAllowNull()?null:""):String(c)},sortType:a.asUCString,type:"string"},INT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?parseInt(c,10):parseInt(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"int"},FLOAT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?c:parseFloat(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"float"},BOOL:{convert:function(c){if((c===undefined||c===null||c==="")&&this.getAllowNull()){return null}return c===true||c==="true"||c==1},sortType:a.none,type:"bool"},DATE:{convert:function(e){var c=this.getDateFormat(),d;if(!e){return null}if(Ext.isDate(e)){return e}if(c){if(c=="timestamp"){return new Date(e*1000)}if(c=="time"){return new Date(parseInt(e,10))}return Ext.Date.parse(e,c)}d=new Date(Date.parse(e));if(isNaN(d)){if(b.iso8601TestRe.test(e)){d=e.split(b.iso8601SplitRe);d=new Date(d[0],d[1]-1,d[2],d[3],d[4],d[5])}if(isNaN(d)){d=new Date(Date.parse(e.replace(this.dashesRe,"/")))}}return isNaN(d)?null:d},sortType:a.asDate,type:"date"}});Ext.apply(b,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})});Ext.define("Ext.data.Validations",{alternateClassName:"Ext.data.validations",singleton:true,config:{presenceMessage:"must be present",lengthMessage:"is the wrong length",formatMessage:"is the wrong format",inclusionMessage:"is not included in the list of acceptable values",exclusionMessage:"is not an acceptable value",emailMessage:"is not a valid email address"},constructor:function(a){this.initConfig(a)},getMessage:function(a){var b=this["get"+a[0].toUpperCase()+a.slice(1)+"Message"];if(b){return b.call(this)}return""},emailRe:/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,presence:function(a,b){if(b===undefined){b=a}return !!b||b===0},length:function(b,e){if(e===undefined||e===null){return false}var d=e.length,c=b.min,a=b.max;if((c&&da)){return false}else{return true}},email:function(b,a){return Ext.data.validations.emailRe.test(a)},format:function(a,b){return !!(a.matcher&&a.matcher.test(b))},inclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)!=-1},exclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)==-1}});Ext.define("Ext.data.identifier.Simple",{alias:"data.identifier.simple",statics:{AUTO_ID:1},config:{prefix:"ext-record-"},constructor:function(a){this.initConfig(a)},generate:function(a){return this._prefix+this.self.AUTO_ID++}});Ext.define("Ext.data.identifier.Uuid",{extend:"Ext.data.identifier.Simple",alias:"data.identifier.uuid",config:{id:undefined,salt:null,timestamp:null,version:4},applyId:function(a){if(a===undefined){return Ext.data.identifier.Uuid.Global}return a},constructor:function(){var a=this;a.callParent(arguments);a.parts=[];a.init()},reconfigure:function(a){this.setConfig(a);this.init()},generate:function(){var c=this,e=c.parts,a=c.getVersion(),b=c.getSalt(),d=c.getTimestamp();e[0]=c.toHex(d.lo,8);e[1]=c.toHex(d.hi&65535,4);e[2]=c.toHex(((d.hi>>>16)&4095)|(a<<12),4);e[3]=c.toHex(128|((c.clockSeq>>>8)&63),2)+c.toHex(c.clockSeq&255,2);e[4]=c.toHex(b.hi,4)+c.toHex(b.lo,8);if(a==4){c.init()}else{++d.lo;if(d.lo>=c.twoPow32){d.lo=0;++d.hi}}return e.join("-").toLowerCase()},init:function(){var b=this,a=b.getSalt(),c=b.getTimestamp();if(b.getVersion()==4){b.clockSeq=b.rand(0,b.twoPow14-1);if(!a){a={};b.setSalt(a)}if(!c){c={};b.setTimestamp(c)}a.lo=b.rand(0,b.twoPow32-1);a.hi=b.rand(0,b.twoPow16-1);c.lo=b.rand(0,b.twoPow32-1);c.hi=b.rand(0,b.twoPow28-1)}else{b.setSalt(b.split(b.getSalt()));b.setTimestamp(b.split(b.getTimestamp()));b.getSalt().hi|=256}},twoPow14:Math.pow(2,14),twoPow16:Math.pow(2,16),twoPow28:Math.pow(2,28),twoPow32:Math.pow(2,32),toHex:function(c,b){var a=c.toString(16);if(a.length>b){a=a.substring(a.length-b)}else{if(a.length")}for(;c");for(j in k){if(k.hasOwnProperty(j)){d.push("<",j,">",k[j],"")}}d.push("")}if(h){d.push("")}a.setXmlData(d.join(""));return a}});Ext.define("Ext.direct.RemotingMethod",{config:{name:null,params:null,formHandler:null,len:null,ordered:true},constructor:function(a){this.initConfig(a)},applyParams:function(f){if(Ext.isNumber(f)){this.setLen(f)}else{if(Ext.isArray(f)){this.setOrdered(false);var d=f.length,b=[],c,e,a;for(c=0;c0){if(a){for(c=0,d=a.length;c0){k.apply(m,l)}if(a){k.call(m,e)}if(c.length>0){k.apply(m,c)}if(b){k.call(m,e)}if(o.length>0){k.apply(m,o)}}else{for(f=0;f0){k.apply(m,l)}}if(a){k.call(m,e)}for(f=0;f0){k.apply(m,c)}}if(b){k.call(m,e)}for(f=0;f0){k.apply(m,o)}}}if(m.length===0){return this}if(!h){h=[]}d.length=0;d.push.apply(d,h);d.push(null,this);this.doFire();return this},doFire:function(){var k=this.firingListeners,c=this.firingArguments,g=c.length-2,d,f,b,o,h,n,a,j,l,e,m;this.isPausing=false;this.isPaused=false;this.isStopped=false;this.isFiring=true;for(d=0,f=k.length;d0){this.isPaused=false;this.doFire()}if(a){a.resume()}return this},isInterrupted:function(){return this.isStopped||this.isPaused},stop:function(){var a=this.connectingController;this.isStopped=true;if(a){this.connectingController=null;a.stop()}this.isFiring=false;this.listenerStacks=null;return this},pause:function(){var a=this.connectingController;this.isPausing=true;if(a){a.pause()}return this}});Ext.define("Ext.event.Event",{alternateClassName:"Ext.EventObject",isStopped:false,set:function(a,b){if(arguments.length===1&&typeof a!="string"){var c=a;for(a in c){if(c.hasOwnProperty(a)){this[a]=c[a]}}}else{this[a]=c[a]}},stopEvent:function(){return this.stopPropagation()},stopPropagation:function(){this.isStopped=true;return this}});Ext.define("Ext.event.ListenerStack",{currentOrder:"current",length:0,constructor:function(){this.listeners={before:[],current:[],after:[]};this.lateBindingMap={};return this},add:function(h,j,k,e){var a=this.lateBindingMap,g=this.getAll(e),f=g.length,b,d,c;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();b=a[c];if(b){if(b[h]){return false}else{b[h]=true}}else{a[c]=b={};b[h]=true}}else{if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){d.options=k;return false}}}}d=this.create(h,j,k,e);if(k&&k.prepend){delete k.prepend;g.unshift(d)}else{g.push(d)}this.length++;return true},getAt:function(b,a){return this.getAll(a)[b]},getAll:function(a){if(!a){a=this.currentOrder}return this.listeners[a]},count:function(a){return this.getAll(a).length},create:function(d,c,b,a){return{stack:this,fn:d,firingFn:false,boundFn:false,isLateBinding:typeof d=="string",scope:c,options:b||{},order:a}},remove:function(h,j,e){var g=this.getAll(e),f=g.length,b=false,a=this.lateBindingMap,d,c;if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){g.splice(f,1);b=true;this.length--;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();if(a[c]&&a[c][h]){delete a[c][h]}}break}}}return b}});Ext.define("Ext.event.publisher.Publisher",{targetType:"",idSelectorRegex:/^#([\w\-]+)$/i,constructor:function(){var b=this.handledEvents,a,c,e,d;a=this.handledEventsMap={};for(c=0,e=b.length;cb){this.isEnded=true;return this.getEndValue()}else{return this.getStartValue()+((a/b)*this.distance)}}});Ext.define("Ext.fx.easing.Momentum",{extend:"Ext.fx.easing.Abstract",config:{acceleration:30,friction:0,startVelocity:0},alpha:0,updateFriction:function(b){var a=Math.log(1-(b/10));this.theta=a;this.alpha=a/this.getAcceleration()},updateStartVelocity:function(a){this.velocity=a*this.getAcceleration()},updateAcceleration:function(a){this.velocity=this.getStartVelocity()*a;this.alpha=this.theta/a},getValue:function(){return this.getStartValue()-this.velocity*(1-this.getFrictionFactor())/this.theta},getFrictionFactor:function(){var a=Ext.Date.now()-this.getStartTime();return Math.exp(a*this.alpha)},getVelocity:function(){return this.getFrictionFactor()*this.velocity}});Ext.define("Ext.mixin.Mixin",{onClassExtended:function(b,e){var a=e.mixinConfig,d,f,c;if(a){d=b.superclass.mixinConfig;if(d){a=e.mixinConfig=Ext.merge({},d,a)}e.mixinId=a.id;f=a.beforeHooks;c=a.hooks||a.afterHooks;if(f||c){Ext.Function.interceptBefore(e,"onClassMixedIn",function(h){var g=this.prototype;if(f){Ext.Object.each(f,function(j,i){h.override(i,function(){if(g[j].apply(this,arguments)!==false){return this.callOverridden(arguments)}})})}if(c){Ext.Object.each(c,function(j,i){h.override(i,function(){var k=this.callOverridden(arguments);g[j].apply(this,arguments);return k})})}})}}}});Ext.define("Ext.mixin.Selectable",{extend:"Ext.mixin.Mixin",mixinConfig:{id:"selectable",hooks:{updateStore:"updateStore"}},config:{disableSelection:null,mode:"SINGLE",allowDeselect:false,lastSelected:null,lastFocused:null,deselectOnContainerClick:true},modes:{SINGLE:true,SIMPLE:true,MULTI:true},selectableEventHooks:{addrecords:"onSelectionStoreAdd",removerecords:"onSelectionStoreRemove",updaterecord:"onSelectionStoreUpdate",load:"refreshSelection",refresh:"refreshSelection"},constructor:function(){this.selected=new Ext.util.MixedCollection();this.callParent(arguments)},applyMode:function(a){a=a?a.toUpperCase():"SINGLE";return this.modes[a]?a:"SINGLE"},updateStore:function(a,c){var b=this,d=Ext.apply({},b.selectableEventHooks,{scope:b});if(c&&Ext.isObject(c)&&c.isStore){if(c.autoDestroy){c.destroy()}else{c.un(d)}}if(a){a.on(d);b.refreshSelection()}},selectAll:function(a){var e=this,c=e.getStore().getRange(),d=c.length,b=0;for(;bd){f=d;d=l;l=f}for(e=l;e<=d;e++){if(g.isSelected(k.getAt(e))){c++}}if(!b){a=-1}else{a=(b=="up")?l:d}for(e=l;e<=d;e++){if(c==(d-l+1)){if(e!=a){g.deselect(e,true)}}else{g.select(e,true)}}},select:function(c,e,b){var d=this,a;if(d.getDisableSelection()){return}if(typeof c==="number"){c=[d.getStore().getAt(c)]}if(!c){return}if(d.getMode()=="SINGLE"&&c){a=c.length?c[0]:c;d.doSingleSelect(a,b)}else{d.doMultiSelect(c,e,b)}},doSingleSelect:function(a,b){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(d.isSelected(a)){return}if(c.getCount()>0){d.deselect(d.getLastSelected(),b)}c.add(a);d.setLastSelected(a);d.onItemSelect(a,b);d.setLastFocused(a);d.fireSelectionChange(!b)},doMultiSelect:function(a,j,h){if(a===null||this.getDisableSelection()){return}a=!Ext.isArray(a)?[a]:a;var f=this,b=f.selected,e=a.length,g=false,c=0,d;if(!j&&b.getCount()>0){g=true;f.deselect(f.getSelection(),true)}for(;c0},refreshSelection:function(){var b=this,a=b.getSelection();b.deselectAll(true);if(a.length){b.select(a,false,true)}},onSelectionStoreClear:function(){var b=this,a=b.selected;if(a.getCount()>0){a.clear();b.setLastSelected(null);b.setLastFocused(null);b.fireSelectionChange(true)}},onSelectionStoreRemove:function(b,a){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(c.remove(a)){if(d.getLastSelected()==a){d.setLastSelected(null)}if(d.getLastFocused()==a){d.setLastFocused(null)}d.fireSelectionChange(true)}},getSelectionCount:function(){return this.selected.getCount()},onSelectionStoreAdd:Ext.emptyFn,onSelectionStoreUpdate:Ext.emptyFn,onItemSelect:Ext.emptyFn,onItemDeselect:Ext.emptyFn,onLastFocusChanged:Ext.emptyFn,onEditorKey:Ext.emptyFn},function(){});Ext.define("Ext.mixin.Traversable",{extend:"Ext.mixin.Mixin",mixinConfig:{id:"traversable"},setParent:function(a){this.parent=a;return this},hasParent:function(){return Boolean(this.parent)},getParent:function(){return this.parent},getAncestors:function(){var b=[],a=this.getParent();while(a){b.push(a);a=a.getParent()}return b},getAncestorIds:function(){var b=[],a=this.getParent();while(a){b.push(a.getId());a=a.getParent()}return b}});Ext.define("Ext.util.DelayedTask",{config:{interval:null,delay:null,fn:null,scope:null,args:null},constructor:function(d,c,b){var a={fn:d,scope:c,args:b};this.initConfig(a)},delay:function(b,f,e,a){var d=this;d.cancel();d.setConfig({delay:b,fn:f,scope:e,args:a});var c=function(){d.getFn().apply(d.getScope(),d.getArgs()||[]);d.cancel()};d.setInterval(setInterval(c,d.getDelay()))},cancel:function(){this.setInterval(null)},updateInterval:function(a,b){if(b){clearInterval(b)}},applyArgs:function(a){if(!Ext.isArray(a)){a=[a]}return a}});Ext.define("Ext.util.Filter",{isFilter:true,config:{property:null,value:null,filterFn:Ext.emptyFn,anyMatch:false,exactMatch:false,caseSensitive:false,root:null,id:undefined,scope:null},applyId:function(a){if(!a){if(this.getProperty()){a=this.getProperty()+"-"+String(this.getValue())}if(!a){a=Ext.id(null,"ext-filter-")}}return a},constructor:function(a){this.initConfig(a)},applyFilterFn:function(b){if(b===Ext.emptyFn){b=this.getInitialConfig("filter");if(b){return b}var a=this.getValue();if(!this.getProperty()&&!a&&a!==0){return Ext.emptyFn}else{return this.createFilterFn()}}return b},createFilterFn:function(){var a=this,b=a.createValueMatcher();return function(d){var c=a.getRoot(),e=a.getProperty();if(c){d=d[c]}return b.test(d[e])}},createValueMatcher:function(){var d=this,e=d.getValue(),f=d.getAnyMatch(),c=d.getExactMatch(),a=d.getCaseSensitive(),b=Ext.String.escapeRegex;if(e===null||e===undefined||!e.exec){e=String(e);if(f===true){e=b(e)}else{e="^"+b(e);if(c===true){e+="$"}}e=new RegExp(e,a?"":"i")}return e}});Ext.define("Ext.util.Point",{radianToDegreeConstant:180/Math.PI,statics:{fromEvent:function(b){var a=b.changedTouches,c=(a&&a.length>0)?a[0]:b;return this.fromTouch(c)},fromTouch:function(a){return new this(a.pageX,a.pageY)},from:function(a){if(!a){return new this(0,0)}if(!(a instanceof this)){return new this(a.x,a.y)}return a}},constructor:function(a,b){if(typeof a=="undefined"){a=0}if(typeof b=="undefined"){b=0}this.x=a;this.y=b;return this},clone:function(){return new this.self(this.x,this.y)},copy:function(){return this.clone.apply(this,arguments)},copyFrom:function(a){this.x=a.x;this.y=a.y;return this},toString:function(){return"Point["+this.x+","+this.y+"]"},equals:function(a){return(this.x===a.x&&this.y===a.y)},isCloseTo:function(c,b){if(typeof b=="number"){b={x:b};b.y=b.x}var a=c.x,f=c.y,e=b.x,d=b.y;return(this.x<=a+e&&this.x>=a-e&&this.y<=f+d&&this.y>=f-d)},isWithin:function(){return this.isCloseTo.apply(this,arguments)},translate:function(a,b){this.x+=a;this.y+=b;return this},roundedEquals:function(a){return(Math.round(this.x)===Math.round(a.x)&&Math.round(this.y)===Math.round(a.y))},getDistanceTo:function(b){var c=this.x-b.x,a=this.y-b.y;return Math.sqrt(c*c+a*a)},getAngleTo:function(b){var c=this.x-b.x,a=this.y-b.y;return Math.atan2(a,c)*this.radianToDegreeConstant}});Ext.define("Ext.util.Region",{statics:{getRegion:function(a){return Ext.fly(a).getPageBox(true)},from:function(a){return new this(a.top,a.right,a.bottom,a.left)}},constructor:function(d,f,a,c){var e=this;e.top=d;e[1]=d;e.right=f;e.bottom=a;e.left=c;e[0]=c},contains:function(b){var a=this;return(b.left>=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom)},intersect:function(g){var f=this,d=Math.max(f.top,g.top),e=Math.min(f.right,g.right),a=Math.min(f.bottom,g.bottom),c=Math.max(f.left,g.left);if(a>d&&e>c){return new Ext.util.Region(d,e,a,c)}else{return false}},union:function(g){var f=this,d=Math.min(f.top,g.top),e=Math.max(f.right,g.right),a=Math.max(f.bottom,g.bottom),c=Math.min(f.left,g.left);return new Ext.util.Region(d,e,a,c)},constrainTo:function(b){var a=this,c=Ext.util.Numbers.constrain;a.top=c(a.top,b.top,b.bottom);a.bottom=c(a.bottom,b.top,b.bottom);a.left=c(a.left,b.left,b.right);a.right=c(a.right,b.left,b.right);return a},adjust:function(d,f,a,c){var e=this;e.top+=d;e.left+=c;e.right+=f;e.bottom+=a;return e},getOutOfBoundOffset:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.getOutOfBoundOffsetX(b)}else{return this.getOutOfBoundOffsetY(b)}}else{b=a;var c=new Ext.util.Offset();c.x=this.getOutOfBoundOffsetX(b.x);c.y=this.getOutOfBoundOffsetY(b.y);return c}},getOutOfBoundOffsetX:function(a){if(a<=this.left){return this.left-a}else{if(a>=this.right){return this.right-a}}return 0},getOutOfBoundOffsetY:function(a){if(a<=this.top){return this.top-a}else{if(a>=this.bottom){return this.bottom-a}}return 0},isOutOfBound:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.isOutOfBoundX(b)}else{return this.isOutOfBoundY(b)}}else{b=a;return(this.isOutOfBoundX(b.x)||this.isOutOfBoundY(b.y))}},isOutOfBoundX:function(a){return(athis.right)},isOutOfBoundY:function(a){return(athis.bottom)},restrict:function(b,d,a){if(Ext.isObject(b)){var c;a=d;d=b;if(d.copy){c=d.copy()}else{c={x:d.x,y:d.y}}c.x=this.restrictX(d.x,a);c.y=this.restrictY(d.y,a);return c}else{if(b=="x"){return this.restrictX(d,a)}else{return this.restrictY(d,a)}}},restrictX:function(b,a){if(!a){a=1}if(b<=this.left){b-=(b-this.left)*a}else{if(b>=this.right){b-=(b-this.right)*a}}return b},restrictY:function(b,a){if(!a){a=1}if(b<=this.top){b-=(b-this.top)*a}else{if(b>=this.bottom){b-=(b-this.bottom)*a}}return b},getSize:function(){return{width:this.right-this.left,height:this.bottom-this.top}},copy:function(){return new Ext.util.Region(this.top,this.right,this.bottom,this.left)},toString:function(){return"Region["+this.top+","+this.right+","+this.bottom+","+this.left+"]"},translateBy:function(a){this.left+=a.x;this.right+=a.x;this.top+=a.y;this.bottom+=a.y;return this},round:function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this},equals:function(a){return(this.top==a.top&&this.right==a.right&&this.bottom==a.bottom&&this.left==a.left)}});Ext.define("Ext.util.Sorter",{isSorter:true,config:{property:null,sorterFn:null,root:null,transform:null,direction:"ASC",id:undefined},constructor:function(a){this.initConfig(a)},applyId:function(a){if(!a){a=this.getProperty();if(!a){a=Ext.id(null,"ext-sorter-")}}return a},createSortFunction:function(b){var c=this,a=c.getDirection().toUpperCase()=="DESC"?-1:1;return function(e,d){return a*b.call(c,e,d)}},defaultSortFn:function(e,c){var g=this,f=g._transform,b=g._root,d,a,h=g._property;if(b!==null){e=e[b];c=c[b]}d=e[h];a=c[h];if(f){d=f(d);a=f(a)}return d>a?1:(d -1 || Ext.isDate(values) ? values : ""'}else{if(e=="#"){c="xindex"}else{if(e.substr(0,7)=="parent."){c=e}else{if((e.indexOf(".")!==-1)&&(e.indexOf("-")===-1)){c="values."+e}else{c="values['"+e+"']"}}}}if(f){c="("+c+f+")"}if(g&&this.useFormat){d=d?","+d:"";if(g.substr(0,5)!="this."){g="fm."+g+"("}else{g+="("}}else{d="";g="("+c+" === undefined ? '' : "}return g+c+d+")"},evalTpl:function($){eval($);return $},newLineRe:/\r\n|\r|\n/g,aposRe:/[']/g,intRe:/^\s*(\d+)\s*$/,tagRe:/([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?/},function(){var a=this.prototype;a.fnArgs="out,values,parent,xindex,xcount";a.callFn=".call(this,"+a.fnArgs+")"});Ext.define("Ext.data.Field",{requires:["Ext.data.Types","Ext.data.SortTypes"],alias:"data.field",isField:true,config:{name:null,type:"auto",convert:undefined,dateFormat:null,allowNull:true,defaultValue:undefined,mapping:null,sortType:undefined,sortDir:"ASC",allowBlank:true,persist:true,encode:null,decode:null},constructor:function(a){if(Ext.isString(a)){a={name:a}}this.initConfig(a)},applyType:function(c){var b=Ext.data.Types,a=b.AUTO;if(c){if(Ext.isString(c)){return b[c.toUpperCase()]||a}else{return c}}return a},updateType:function(a,b){var c=this.getConvert();if(b&&c===b.convert){this.setConvert(a.convert)}},applySortType:function(d){var c=Ext.data.SortTypes,a=this.getType(),b=a.sortType;if(d){if(Ext.isString(d)){return c[d]||b}else{return d}}return b},applyConvert:function(b){var a=this.getType().convert;if(b&&b!==a){this._hasCustomConvert=true;return b}else{this._hasCustomConvert=false;return a}},hasCustomConvert:function(){return this._hasCustomConvert}});Ext.define("Ext.data.identifier.Sequential",{extend:"Ext.data.identifier.Simple",alias:"data.identifier.sequential",config:{prefix:"",seed:1},constructor:function(){var a=this;a.callParent(arguments);a.parts=[a.getPrefix(),""]},generate:function(b){var c=this,d=c.parts,a=c.getSeed()+1;c.setSeed(a);d[1]=a;return d.join("")}});Ext.define("Ext.data.writer.Json",{extend:"Ext.data.writer.Writer",alternateClassName:"Ext.data.JsonWriter",alias:"writer.json",config:{root:undefined,encode:false,allowSingle:true,encodeRequest:false},applyRoot:function(a){if(!a&&(this.getEncode()||this.getEncodeRequest())){a="data"}return a},writeRecords:function(d,e){var a=this.getRoot(),f=d.getParams(),b=this.getAllowSingle(),c;if(this.getAllowSingle()&&e&&e.length==1){e=e[0]}if(this.getEncodeRequest()){c=d.getJsonData()||{};if(e&&(e.length||(b&&Ext.isObject(e)))){c[a]=e}d.setJsonData(Ext.apply(c,f||{}));d.setParams(null);d.setMethod("POST");return d}if(!e||!(e.length||(b&&Ext.isObject(e)))){return d}if(this.getEncode()){if(a){f[a]=Ext.encode(e)}else{}}else{c=d.getJsonData()||{};if(a){c[a]=e}else{c=e}d.setJsonData(c)}return d}});Ext.define("Ext.event.Dispatcher",{requires:["Ext.event.ListenerStack","Ext.event.Controller"],statics:{getInstance:function(){if(!this.instance){this.instance=new this()}return this.instance},setInstance:function(a){this.instance=a;return this}},config:{publishers:{}},wildcard:"*",constructor:function(a){this.listenerStacks={};this.activePublishers={};this.publishersCache={};this.noActivePublishers=[];this.controller=null;this.initConfig(a);return this},getListenerStack:function(e,g,c,b){var d=this.listenerStacks,f=d[e],a;b=Boolean(b);if(!f){if(b){d[e]=f={}}else{return null}}f=f[g];if(!f){if(b){d[e][g]=f={}}else{return null}}a=f[c];if(!a){if(b){f[c]=a=new Ext.event.ListenerStack()}else{return null}}return a},getController:function(d,f,c,b){var a=this.controller,e={targetType:d,target:f,eventName:c};if(!a){this.controller=a=new Ext.event.Controller()}if(a.isFiring){a=new Ext.event.Controller()}a.setInfo(e);if(b&&a!==b){a.connect(b)}return a},applyPublishers:function(c){var a,b;this.publishersCache={};for(a in c){if(c.hasOwnProperty(a)){b=c[a];this.registerPublisher(b)}}return c},registerPublisher:function(b){var a=this.activePublishers,c=b.getTargetType(),d=a[c];if(!d){a[c]=d=[]}d.push(b);b.setDispatcher(this);return this},getCachedActivePublishers:function(c,b){var a=this.publishersCache,d;if((d=a[c])&&(d=d[b])){return d}return null},cacheActivePublishers:function(c,b,d){var a=this.publishersCache;if(!a[c]){a[c]={}}a[c][b]=d;return d},getActivePublishers:function(f,b){var g,a,c,e,d;if((g=this.getCachedActivePublishers(f,b))){return g}a=this.activePublishers[f];if(a){g=[];for(c=0,e=a.length;c0}return false},addListener:function(d,e,a){var f=this.getActivePublishers(d,a),c=f.length,b;if(c>0){for(b=0;b0){for(b=0;b0){for(b=0;b0)){return true}delete d[f];if(--d.$length===0){delete this.subscribers[a]}return true},onBeforeComponentRenderedChange:function(b,d,g){var f=this.eventNames,c=g?f.painted:f.erased,e=this.getSubscribers(c),a;if(e&&e.$length>0){this.renderedQueue[d.getId()]=a=[];this.publish(e,d,c,a)}},onBeforeComponentHiddenChange:function(c,d){var f=this.eventNames,b=d?f.erased:f.painted,e=this.getSubscribers(b),a;if(e&&e.$length>0){this.hiddenQueue[c.getId()]=a=[];this.publish(e,c,b,a)}},onComponentRenderedChange:function(b,c){var d=this.renderedQueue,e=c.getId(),a;if(!d.hasOwnProperty(e)){return}a=d[e];delete d[e];if(a.length>0){this.dispatchQueue(a)}},onComponentHiddenChange:function(c){var b=this.hiddenQueue,d=c.getId(),a;if(!b.hasOwnProperty(d)){return}a=b[d];delete b[d];if(a.length>0){this.dispatchQueue(a)}},dispatchQueue:function(g){var l=this.dispatcher,a=this.targetType,b=this.eventNames,e=g.slice(),f=e.length,c,k,h,d,j;g.length=0;if(f>0){for(c=0;c0)){return true}delete c[i];c.$length--}else{if(!d.hasOwnProperty(i)||(!j&&--d[i]>0)){return true}delete d[i];d.$length--}}else{if(g===this.SELECTOR_ALL){if(j){a.all=0}else{a.all--}}else{if(!b.hasOwnProperty(g)||(!j&&--b[g]>0)){return true}delete b[g];Ext.Array.remove(b,g)}}a.$length--;return true},getElementTarget:function(a){if(a.nodeType!==1){a=a.parentNode;if(!a||a.nodeType!==1){return null}}return a},getBubblingTargets:function(b){var a=[];if(!b){return a}do{a[a.length]=b;b=b.parentNode}while(b&&b.nodeType===1);return a},dispatch:function(c,a,b){b.push(b[0].target);this.callParent(arguments)},publish:function(b,a,c){var d=this.getSubscribers(b),e;if(d.$length===0||!this.doPublish(d,b,a,c)){e=this.getSubscribers("*");if(e.$length>0){this.doPublish(e,b,a,c)}}return this},doPublish:function(f,h,x,u){var r=f.id,g=f.className,b=f.selector,p=r.$length>0,a=g.$length>0,l=b.length>0,o=f.all>0,y={},e=[u],q=false,m=this.classNameSplitRegex,v,k,t,d,z,n,c,w,s;for(v=0,k=x.length;v0){c=a.slice(0);a.length=0;for(b=0;b0){this.processEvent(this.mergeEvents(d));d.length=0}this.processEvent(e)}}if(d.length>0){this.processEvent(this.mergeEvents(d));d.length=0}}},mergeEvents:function(c){var b=[],f=c.length,a,e,d;d=c[f-1];if(f===1){return d}for(a=0;ah){for(d=0;dh){return}}for(d=0;da){this.end(d)}}},onTouchEnd:function(a){this.end(a)},start:function(){if(!this.isTracking){this.isTracking=true;this.isStarted=false}},end:function(a){if(this.isTracking){this.isTracking=false;if(this.isStarted){this.isStarted=false;this.fireEnd(a)}}}});Ext.define("Ext.event.recognizer.Pinch",{extend:"Ext.event.recognizer.MultiTouch",requiredTouchesCount:2,handledEvents:["pinchstart","pinch","pinchend"],startDistance:0,lastTouches:null,onTouchMove:function(c){if(!this.isTracking){return}var b=Array.prototype.slice.call(c.touches),d,a,f;d=b[0].point;a=b[1].point;f=d.getDistanceTo(a);if(f===0){return}if(!this.isStarted){this.isStarted=true;this.startDistance=f;this.fire("pinchstart",c,b,{touches:b,distance:f,scale:1})}else{this.fire("pinch",c,b,{touches:b,distance:f,scale:f/this.startDistance})}this.lastTouches=b},fireEnd:function(a){this.fire("pinchend",a,this.lastTouches)},fail:function(){return this.callParent(arguments)}});Ext.define("Ext.event.recognizer.Rotate",{extend:"Ext.event.recognizer.MultiTouch",requiredTouchesCount:2,handledEvents:["rotatestart","rotate","rotateend"],startAngle:0,lastTouches:null,lastAngle:null,onTouchMove:function(h){if(!this.isTracking){return}var g=Array.prototype.slice.call(h.touches),b=this.lastAngle,d,f,c,a,i,j;d=g[0].point;f=g[1].point;c=d.getAngleTo(f);if(b!==null){j=Math.abs(b-c);a=c+360;i=c-360;if(Math.abs(a-b)1){return this.fail(this.self.NOT_SINGLE_TOUCH)}}});Ext.define("Ext.event.recognizer.DoubleTap",{extend:"Ext.event.recognizer.SingleTouch",config:{maxDuration:300},handledEvents:["singletap","doubletap"],singleTapTimer:null,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}this.startTime=a.time;clearTimeout(this.singleTapTimer)},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onEnd:function(g){var c=this,b=this.getMaxDuration(),h=g.changedTouches[0],f=g.time,a=this.lastTapTime,d;this.lastTapTime=f;if(a){d=f-a;if(d<=b){this.lastTapTime=0;this.fire("doubletap",g,[h],{touch:h,duration:d});return}}if(f-this.startTime>b){this.fireSingleTap(g,h)}else{this.singleTapTimer=setTimeout(function(){c.fireSingleTap(g,h)},b)}},fireSingleTap:function(a,b){this.fire("singletap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.Drag",{extend:"Ext.event.recognizer.SingleTouch",isStarted:false,startPoint:null,previousPoint:null,lastPoint:null,handledEvents:["dragstart","drag","dragend"],onTouchStart:function(b){var c,a;if(this.callParent(arguments)===false){if(this.isStarted&&this.lastMoveEvent!==null){this.onTouchEnd(this.lastMoveEvent)}return false}this.startTouches=c=b.changedTouches;this.startTouch=a=c[0];this.startPoint=a.point},onTouchMove:function(d){var c=d.changedTouches,f=c[0],a=f.point,b=d.time;if(this.lastPoint){this.previousPoint=this.lastPoint}if(this.lastTime){this.previousTime=this.lastTime}this.lastTime=b;this.lastPoint=a;this.lastMoveEvent=d;if(!this.isStarted){this.isStarted=true;this.startTime=b;this.previousTime=b;this.previousPoint=this.startPoint;this.fire("dragstart",d,this.startTouches,this.getInfo(d,this.startTouch))}else{this.fire("drag",d,c,this.getInfo(d,f))}},onTouchEnd:function(c){if(this.isStarted){var b=c.changedTouches,d=b[0],a=d.point;this.isStarted=false;this.lastPoint=a;this.fire("dragend",c,b,this.getInfo(c,d));this.startTime=0;this.previousTime=0;this.lastTime=0;this.startPoint=null;this.previousPoint=null;this.lastPoint=null;this.lastMoveEvent=null}},getInfo:function(j,i){var d=j.time,a=this.startPoint,f=this.previousPoint,b=this.startTime,k=this.previousTime,l=this.lastPoint,h=l.x-a.x,g=l.y-a.y,c={touch:i,startX:a.x,startY:a.y,previousX:f.x,previousY:f.y,pageX:l.x,pageY:l.y,deltaX:h,deltaY:g,absDeltaX:Math.abs(h),absDeltaY:Math.abs(g),previousDeltaX:l.x-f.x,previousDeltaY:l.y-f.y,time:d,startTime:b,previousTime:k,deltaTime:d-b,previousDeltaTime:d-k};return c}});Ext.define("Ext.event.recognizer.LongPress",{extend:"Ext.event.recognizer.SingleTouch",inheritableStatics:{DURATION_NOT_ENOUGH:32},config:{minDuration:1000},handledEvents:["longpress"],fireLongPress:function(a){var b=a.changedTouches[0];this.fire("longpress",a,[b],{touch:b,duration:this.getMinDuration()});this.isLongPress=true},onTouchStart:function(b){var a=this;if(this.callParent(arguments)===false){return false}this.isLongPress=false;this.timer=setTimeout(function(){a.fireLongPress(b)},this.getMinDuration())},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onTouchEnd:function(){if(!this.isLongPress){return this.fail(this.self.DURATION_NOT_ENOUGH)}},fail:function(){clearTimeout(this.timer);return this.callParent(arguments)}},function(){});Ext.define("Ext.event.recognizer.Tap",{handledEvents:["tap"],extend:"Ext.event.recognizer.SingleTouch",onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onTouchEnd:function(a){var b=a.changedTouches[0];this.fire("tap",a,[b])}},function(){});(function(){function b(d){var c=Array.prototype.slice.call(arguments,1);return d.replace(/\{(\d+)\}/g,function(e,f){return c[f]})}Ext.DateExtras={now:Date.now||function(){return +new Date()},getElapsed:function(d,c){return Math.abs(d-(c||new Date()))},useStrict:false,formatCodeToRegex:function(d,c){var e=a.parseCodes[d];if(e){e=typeof e=="function"?e():e;a.parseCodes[d]=e}return e?Ext.applyIf({c:e.c?b(e.c,c||"{0}"):e.c},e):{g:0,c:null,s:Ext.String.escapeRegex(d)}},parseFunctions:{MS:function(d,c){var e=new RegExp("\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/");var f=(d||"").match(e);return f?new Date(((f[1]||"")+f[2])*1):null}},parseRegexes:[],formatFunctions:{MS:function(){return"\\/Date("+this.getTime()+")\\/"}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},defaultFormat:"m/d/Y",getShortMonthName:function(c){return a.monthNames[c].substring(0,3)},getShortDayName:function(c){return a.dayNames[c].substring(0,3)},getMonthNumber:function(c){return a.monthNumbers[c.substring(0,1).toUpperCase()+c.substring(1,3).toLowerCase()]},formatCodes:{d:"Ext.String.leftPad(this.getDate(), 2, '0')",D:"Ext.Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Ext.Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"Ext.Date.getSuffix(this)",w:"this.getDay()",z:"Ext.Date.getDayOfYear(this)",W:"Ext.String.leftPad(Ext.Date.getWeekOfYear(this), 2, '0')",F:"Ext.Date.monthNames[this.getMonth()]",m:"Ext.String.leftPad(this.getMonth() + 1, 2, '0')",M:"Ext.Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"Ext.Date.getDaysInMonth(this)",L:"(Ext.Date.isLeapYear(this) ? 1 : 0)",o:"(this.getFullYear() + (Ext.Date.getWeekOfYear(this) == 1 && this.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var j="Y-m-dTH:i:sP",g=[],f=0,d=j.length;f= 0 && y >= 0){","v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);","}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(l){var e=a.parseRegexes.length,m=1,f=[],k=[],j=false,d="";for(var h=0;h Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)"},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a.formatCodeToRegex("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a.formatCodeToRegex("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a.formatCodeToRegex("Y",1),a.formatCodeToRegex("m",2),a.formatCodeToRegex("d",3),a.formatCodeToRegex("h",4),a.formatCodeToRegex("i",5),a.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a.formatCodeToRegex("P",8).c,"}else{",a.formatCodeToRegex("O",8).c,"}","}"].join("\n")}];for(var f=0,d=c.length;f0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(e)/60),2,"0")+(d?":":"")+Ext.String.leftPad(Math.abs(e%60),2,"0")},getDayOfYear:function(f){var e=0,h=Ext.Date.clone(f),c=f.getMonth(),g;for(g=0,h.setDate(1),h.setMonth(0);g28){e=Math.min(e,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(g),"mo",h)).getDate())}i.setDate(e);i.setMonth(g.getMonth()+h);break;case Ext.Date.YEAR:i.setFullYear(g.getFullYear()+h);break}return i},between:function(d,f,c){var e=d.getTime();return f.getTime()<=e&&e<=c.getTime()}};var a=Ext.DateExtras;Ext.apply(Ext.Date,a)})();Ext.define("Ext.fx.Easing",{requires:["Ext.fx.easing.Linear"],constructor:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")}});Ext.define("Ext.fx.easing.BoundMomentum",{extend:"Ext.fx.easing.Abstract",requires:["Ext.fx.easing.Momentum","Ext.fx.easing.Bounce"],config:{momentum:null,bounce:null,minMomentumValue:0,maxMomentumValue:0,minVelocity:0.01,startVelocity:0},applyMomentum:function(a,b){return Ext.factory(a,Ext.fx.easing.Momentum,b)},applyBounce:function(a,b){return Ext.factory(a,Ext.fx.easing.Bounce,b)},updateStartTime:function(a){this.getMomentum().setStartTime(a);this.callParent(arguments)},updateStartVelocity:function(a){this.getMomentum().setStartVelocity(a)},updateStartValue:function(a){this.getMomentum().setStartValue(a)},reset:function(){this.lastValue=null;this.isBouncingBack=false;this.isOutOfBound=false;return this.callParent(arguments)},getValue:function(){var a=this.getMomentum(),j=this.getBounce(),e=a.getStartVelocity(),f=e>0?1:-1,g=this.getMinMomentumValue(),d=this.getMaxMomentumValue(),c=(f==1)?d:g,h=this.lastValue,i,b;if(e===0){return this.getStartValue()}if(!this.isOutOfBound){i=a.getValue();b=a.getVelocity();if(Math.abs(b)=g&&i<=d){return i}this.isOutOfBound=true;j.setStartTime(Ext.Date.now()).setStartVelocity(b).setStartValue(c)}i=j.getValue();if(!this.isEnded){if(!this.isBouncingBack){if(h!==null){if((f==1&&ih)){this.isBouncingBack=true}}}else{if(Math.round(i)==c){this.isEnded=true}}}this.lastValue=i;return i}});Ext.define("Ext.fx.easing.EaseIn",{extend:"Ext.fx.easing.Linear",alias:"easing.ease-in",config:{exponent:4,duration:1500},getValue:function(){var c=Ext.Date.now()-this.getStartTime(),g=this.getDuration(),b=this.getStartValue(),a=this.getEndValue(),h=this.distance,e=c/g,d=Math.pow(e,this.getExponent()),f=b+(d*h);if(c>=g){this.isEnded=true;return a}return f}});Ext.define("Ext.fx.easing.EaseOut",{extend:"Ext.fx.easing.Linear",alias:"easing.ease-out",config:{exponent:4,duration:1500},getValue:function(){var f=Ext.Date.now()-this.getStartTime(),d=this.getDuration(),b=this.getStartValue(),h=this.getEndValue(),a=this.distance,c=f/d,g=1-c,e=1-Math.pow(g,this.getExponent()),i=b+(e*a);if(f>=d){this.isEnded=true;return h}return i}});Ext.define("Ext.mixin.Filterable",{extend:"Ext.mixin.Mixin",requires:["Ext.util.Filter"],mixinConfig:{id:"filterable"},config:{filters:null,filterRoot:null},dirtyFilterFn:false,filterFn:null,filtered:false,applyFilters:function(a,b){if(!b){b=this.createFiltersCollection()}b.clear();this.filtered=false;this.dirtyFilterFn=true;if(a){this.addFilters(a)}return b},createFiltersCollection:function(){this._filters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._filters},addFilter:function(a){this.addFilters([a])},addFilters:function(b){var a=this.getFilters();return this.insertFilters(a?a.length:0,b)},insertFilter:function(a,b){return this.insertFilters(a,[b])},insertFilters:function(h,c){if(!Ext.isArray(c)){c=[c]}var j=c.length,a=this.getFilterRoot(),d=this.getFilters(),e=[],f,g,b;if(!d){d=this.createFiltersCollection()}for(g=0;g=200&&a<300)||a==304||a==0,b=false;if(!c){switch(a){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:b=true;break}}return{success:c,isException:b}},createResponse:function(c){var g=c.xhr,a={},h,d,i,e,f,b;if(c.timedout||c.aborted){c.success=false;h=[]}else{h=g.getAllResponseHeaders().replace(this.lineBreakRe,"\n").split("\n")}d=h.length;while(d--){i=h[d];e=i.indexOf(":");if(e>=0){f=i.substr(0,e).toLowerCase();if(i.charAt(e+1)==" "){++e}a[f]=i.substr(e+1)}}c.xhr=null;delete c.xhr;b={request:c,requestId:c.id,status:g.status,statusText:g.statusText,getResponseHeader:function(j){return a[j.toLowerCase()]},getAllResponseHeaders:function(){return a},responseText:g.responseText,responseXML:g.responseXML};g=null;return b},createException:function(a){return{request:a,requestId:a.id,status:a.aborted?-1:0,statusText:a.aborted?"transaction aborted":"communication failure",aborted:a.aborted,timedout:a.timedout}}});Ext.define("Ext.Ajax",{extend:"Ext.data.Connection",singleton:true,autoAbort:false});Ext.define("Ext.data.reader.Reader",{requires:["Ext.data.ResultSet"],alternateClassName:["Ext.data.Reader","Ext.data.DataReader"],mixins:["Ext.mixin.Observable"],isReader:true,config:{idProperty:undefined,clientIdProperty:"clientId",totalProperty:"total",successProperty:"success",messageProperty:null,rootProperty:"",implicitIncludes:true,model:undefined},constructor:function(a){this.initConfig(a)},fieldCount:0,applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},applyIdProperty:function(a){if(!a&&this.getModel()){a=this.getModel().getIdProperty()}return a},updateModel:function(a){if(a){if(!this.getIdProperty()){this.setIdProperty(a.getIdProperty())}this.buildExtractors()}},createAccessor:Ext.emptyFn,createFieldAccessExpression:function(){return"undefined"},buildExtractors:function(){if(!this.getModel()){return}var b=this,c=b.getTotalProperty(),a=b.getSuccessProperty(),d=b.getMessageProperty();if(c){b.getTotal=b.createAccessor(c)}if(a){b.getSuccess=b.createAccessor(a)}if(d){b.getMessage=b.createAccessor(d)}b.extractRecordData=b.buildRecordDataExtractor()},buildRecordDataExtractor:function(){var k=this,e=k.getModel(),g=e.getFields(),j=g.length,a=[],h=k.getModel().getClientIdProperty(),f="__field",b=["var me = this,\n"," fields = me.getModel().getFields(),\n"," idProperty = me.getIdProperty(),\n",' idPropertyIsFn = (typeof idProperty == "function"),'," value,\n"," internalId"],d,l,c,m;g=g.items;for(d=0;d=0){return Ext.functionFactory("obj","var value; try {value = obj"+(b>0?".":"")+c+"} catch(e) {}; return value;")}}return function(d){return d[c]}}}(),createFieldAccessExpression:function(g,b,c){var f=this,h=f.objectRe,e=(g.getMapping()!==null),a=e?g.getMapping():g.getName(),i,d;if(typeof a==="function"){i=b+".getMapping()("+c+", this)"}else{if(f.getUseSimpleAccessors()===true||((d=String(a).search(h))<0)){if(!e||isNaN(a)){a='"'+a+'"'}i=c+"["+a+"]"}else{i=c+(d>0?".":"")+a}}return i}});Ext.define("Ext.data.proxy.Proxy",{extend:"Ext.Evented",alias:"proxy.proxy",alternateClassName:["Ext.data.DataProxy","Ext.data.Proxy"],requires:["Ext.data.reader.Json","Ext.data.writer.Json"],uses:["Ext.data.Batch","Ext.data.Operation","Ext.data.Model"],config:{batchOrder:"create,update,destroy",batchActions:true,model:null,reader:{type:"json"},writer:{type:"json"}},isProxy:true,applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},updateModel:function(b){if(b){var a=this.getReader();if(a&&!a.getModel()){a.setModel(b)}}},applyReader:function(b,a){return Ext.factory(b,Ext.data.Reader,a,"reader")},updateReader:function(a){if(a){var b=this.getModel();if(!b){b=a.getModel();if(b){this.setModel(b)}}else{a.setModel(b)}if(a.onMetaChange){a.onMetaChange=Ext.Function.createSequence(a.onMetaChange,this.onMetaChange,this)}}},onMetaChange:function(b){var a=this.getReader().getModel();if(!this.getModel()&&a){this.setModel(a)}this.fireEvent("metachange",this,b)},applyWriter:function(b,a){return Ext.factory(b,Ext.data.Writer,a,"writer")},create:Ext.emptyFn,read:Ext.emptyFn,update:Ext.emptyFn,destroy:Ext.emptyFn,onDestroy:function(){Ext.destroy(this.getReader(),this.getWriter())},batch:function(e,f){var g=this,d=g.getBatchActions(),c=this.getModel(),b,a;if(e.operations===undefined){e={operations:e,batch:{listeners:f}}}if(e.batch){if(e.batch.isBatch){e.batch.setProxy(g)}else{e.batch.proxy=g}}else{e.batch={proxy:g,listeners:e.listeners||{}}}if(!b){b=new Ext.data.Batch(e.batch)}b.on("complete",Ext.bind(g.onBatchComplete,g,[e],0));Ext.each(g.getBatchOrder().split(","),function(h){a=e.operations[h];if(a){if(d){b.add(new Ext.data.Operation({action:h,records:a,model:c}))}else{Ext.each(a,function(i){b.add(new Ext.data.Operation({action:h,records:[i],model:c}))})}}},g);b.start();return b},onBatchComplete:function(a,b){var c=a.scope||this;if(b.hasException){if(Ext.isFunction(a.failure)){Ext.callback(a.failure,c,[b,a])}}else{if(Ext.isFunction(a.success)){Ext.callback(a.success,c,[b,a])}}if(Ext.isFunction(a.callback)){Ext.callback(a.callback,c,[b,a])}}},function(){});Ext.define("Ext.data.proxy.Client",{extend:"Ext.data.proxy.Proxy",alternateClassName:"Ext.proxy.ClientProxy",clear:function(){}});Ext.define("Ext.data.proxy.Memory",{extend:"Ext.data.proxy.Client",alias:"proxy.memory",alternateClassName:"Ext.data.MemoryProxy",isMemoryProxy:true,config:{data:[]},finishOperation:function(b,f,d){if(b){var c=0,e=b.getRecords(),a=e.length;for(c;c0){if(o){h[e]=m[0].getProperty();h[b]=m[0].getDirection()}else{h[e]=n.encodeSorters(m)}}if(c&&f&&f.length>0){h[c]=n.encodeFilters(f)}return h},buildUrl:function(c){var b=this,a=b.getUrl(c);if(b.getNoCache()){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",b.getCacheString(),Ext.Date.now()))}return a},getUrl:function(a){return a?a.getUrl()||this.getApi()[a.getAction()]||this._url:this._url},doRequest:function(a,c,b){},afterRequest:Ext.emptyFn});Ext.define("Ext.data.proxy.JsonP",{extend:"Ext.data.proxy.Server",alternateClassName:"Ext.data.ScriptTagProxy",alias:["proxy.jsonp","proxy.scripttag"],requires:["Ext.data.JsonP"],config:{defaultWriterType:"base",callbackKey:"callback",recordParam:"records",autoAppendParams:true},doRequest:function(a,g,b){var d=this,e=d.getWriter(),c=d.buildRequest(a),f=c.getParams();if(a.allowWrite()){c=e.write(c)}c.setConfig({callbackKey:d.getCallbackKey(),timeout:d.getTimeout(),scope:d,callback:d.createRequestCallback(c,a,g,b)});if(d.getAutoAppendParams()){c.setParams({})}c.setJsonP(Ext.data.JsonP.request(c.getCurrentConfig()));c.setParams(f);a.setStarted();d.lastRequest=c;return c},createRequestCallback:function(d,a,e,b){var c=this;return function(h,f,g){delete c.lastRequest;c.processResponse(h,a,d,f,e,b)}},setException:function(b,a){b.setException(b.getRequest().getJsonP().errorType)},buildUrl:function(f){var h=this,a=h.callParent(arguments),e=Ext.apply({},f.getParams()),c=e.filters,d,b,g,j;delete e.filters;if(h.getAutoAppendParams()){a=Ext.urlAppend(a,Ext.Object.toQueryString(e))}if(c&&c.length){for(g=0;g0){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",h.getRecordParam(),h.encodeRecords(d)))}return a},destroy:function(){this.abort();this.callParent(arguments)},abort:function(){var a=this.lastRequest;if(a){Ext.data.JsonP.abort(a.getJsonP())}},encodeRecords:function(b){var d="",c=0,a=b.length;for(;c1){this.endAnimationCounter=0;this.fireEvent("animationend",this)}},applyInAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},applyOutAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},updateInAnimation:function(a){a.setScope(this)},updateOutAnimation:function(a){a.setScope(this)},onActiveItemChange:function(a,e,h,i,d){var b=this.getInAnimation(),g=this.getOutAnimation(),f,c;if(e&&h&&h.isPainted()){f=e.renderElement;c=h.renderElement;b.setElement(f);g.setElement(c);g.setOnBeforeEnd(function(j,k){if(k||Ext.Animator.hasRunningAnimations(j)){d.firingArguments[1]=null;d.firingArguments[2]=null}});g.setOnEnd(function(){d.resume()});f.dom.style.setProperty("visibility","hidden","!important");e.show();Ext.Animator.run([g,b]);d.pause()}}});Ext.define("Ext.fx.layout.card.Cover",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.cover",config:{reverse:null,inAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out"},outAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1},out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Cube",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.cube",config:{reverse:null,inAnimation:{type:"cube"},outAnimation:{type:"cube",out:true}}});Ext.define("Ext.fx.layout.card.Fade",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.fade",config:{reverse:null,inAnimation:{type:"fade",easing:"ease-out"},outAnimation:{type:"fade",easing:"ease-out",out:true}}});Ext.define("Ext.fx.layout.card.Flip",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.flip",config:{duration:500,inAnimation:{type:"flip",half:true,easing:"ease-out",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null}},outAnimation:{type:"flip",half:true,easing:"ease-in",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null},out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Pop",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.pop",config:{duration:500,inAnimation:{type:"pop",easing:"ease-out"},outAnimation:{type:"pop",easing:"ease-in",out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Reveal",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.reveal",config:{inAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1}},outAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Slide",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.slide",config:{inAnimation:{type:"slide",easing:"ease-out"},outAnimation:{type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.Card",{requires:["Ext.fx.layout.card.Slide","Ext.fx.layout.card.Cover","Ext.fx.layout.card.Reveal","Ext.fx.layout.card.Fade","Ext.fx.layout.card.Flip","Ext.fx.layout.card.Pop","Ext.fx.layout.card.Cube","Ext.fx.layout.card.Scroll"],constructor:function(b){var a=Ext.fx.layout.card.Abstract,c;if(!b){return null}if(typeof b=="string"){c=b;b={}}else{if(b.type){c=b.type}}b.elementBox=false;if(c){if(Ext.os.is.Android2){if(c!="fade"){c="scroll"}}else{if(c==="slide"&&Ext.browser.is.ChromeMobile){c="scroll"}}a=Ext.ClassManager.getByAlias("fx.layout.card."+c)}return Ext.factory(b,a)}});Ext.define("Ext.fx.runner.Css",{extend:"Ext.Evented",requires:["Ext.fx.Animation"],prefixedProperties:{transform:true,"transform-origin":true,perspective:true,"transform-style":true,transition:true,"transition-property":true,"transition-duration":true,"transition-timing-function":true,"transition-delay":true,animation:true,"animation-name":true,"animation-duration":true,"animation-iteration-count":true,"animation-direction":true,"animation-timing-function":true,"animation-delay":true},lengthProperties:{top:true,right:true,bottom:true,left:true,width:true,height:true,"max-height":true,"max-width":true,"min-height":true,"min-width":true,"margin-bottom":true,"margin-left":true,"margin-right":true,"margin-top":true,"padding-bottom":true,"padding-left":true,"padding-right":true,"padding-top":true,"border-bottom-width":true,"border-left-width":true,"border-right-width":true,"border-spacing":true,"border-top-width":true,"border-width":true,"outline-width":true,"letter-spacing":true,"line-height":true,"text-indent":true,"word-spacing":true,"font-size":true,translate:true,translateX:true,translateY:true,translateZ:true,translate3d:true},durationProperties:{"transition-duration":true,"transition-delay":true,"animation-duration":true,"animation-delay":true},angleProperties:{rotate:true,rotateX:true,rotateY:true,rotateZ:true,skew:true,skewX:true,skewY:true},lengthUnitRegex:/([a-z%]*)$/,DEFAULT_UNIT_LENGTH:"px",DEFAULT_UNIT_ANGLE:"deg",DEFAULT_UNIT_DURATION:"ms",formattedNameCache:{},constructor:function(){var a=Ext.feature.has.Css3dTransforms;if(a){this.transformMethods=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","skewX","skewY","scaleX","scaleY","scaleZ"]}else{this.transformMethods=["translateX","translateY","rotate","skewX","skewY","scaleX","scaleY"]}this.vendorPrefix=Ext.browser.getStyleDashPrefix();this.ruleStylesCache={};return this},getStyleSheet:function(){var c=this.styleSheet,a,b;if(!c){a=document.createElement("style");a.type="text/css";(document.head||document.getElementsByTagName("head")[0]).appendChild(a);b=document.styleSheets;this.styleSheet=c=b[b.length-1]}return c},applyRules:function(i){var g=this.getStyleSheet(),k=this.ruleStylesCache,j=g.cssRules,c,e,h,b,d,a,f;for(c in i){e=i[c];h=k[c];if(h===undefined){d=j.length;g.insertRule(c+"{}",d);h=k[c]=j.item(d).style}b=h.$cache;if(!b){b=h.$cache={}}for(a in e){f=this.formatValue(e[a],a);a=this.formatName(a);if(b[a]!==f){b[a]=f;if(f===null){h.removeProperty(a)}else{h.setProperty(a,f,"important")}}}}return this},applyStyles:function(d){var g,c,f,b,a,e;for(g in d){c=document.getElementById(g);if(!c){return this}f=c.style;b=d[g];for(a in b){e=this.formatValue(b[a],a);a=this.formatName(a);if(e===null){f.removeProperty(a)}else{f.setProperty(a,e,"important")}}}return this},formatName:function(b){var a=this.formattedNameCache,c=a[b];if(!c){if(this.prefixedProperties[b]){c=this.vendorPrefix+b}else{c=b}a[b]=c}return c},formatValue:function(j,b){var g=typeof j,l=this.DEFAULT_UNIT_LENGTH,e,a,d,f,c,k,h;if(g=="string"){if(this.lengthProperties[b]){h=j.match(this.lengthUnitRegex)[1];if(h.length>0){}else{return j+l}}return j}else{if(g=="number"){if(j==0){return"0"}if(this.lengthProperties[b]){return j+l}if(this.angleProperties[b]){return j+this.DEFAULT_UNIT_ANGLE}if(this.durationProperties[b]){return j+this.DEFAULT_UNIT_DURATION}}else{if(b==="transform"){e=this.transformMethods;c=[];for(d=0,f=e.length;d0)?k.join(", "):"none"}}}}return j}});Ext.define("Ext.fx.runner.CssTransition",{extend:"Ext.fx.runner.Css",listenersAttached:false,constructor:function(){this.runningAnimationsData={};return this.callParent(arguments)},attachListeners:function(){this.listenersAttached=true;this.getEventDispatcher().addListener("element","*","transitionend","onTransitionEnd",this)},onTransitionEnd:function(b){var a=b.target,c=a.id;if(c&&this.runningAnimationsData.hasOwnProperty(c)){this.refreshRunningAnimationsData(Ext.get(a),[b.browserEvent.propertyName])}},onAnimationEnd:function(g,f,d,j,n){var b=g.getId(),k=this.runningAnimationsData[b],c=k.nameMap,o={},m={},h,e,l,a;o[b]=m;if(f.onBeforeEnd){f.onBeforeEnd.call(f.scope||this,g,j)}d.fireEvent("animationbeforeend",d,g,j);this.fireEvent("animationbeforeend",this,d,g,j);if(n||(!j&&!f.preserveEndState)){h=f.toPropertyNames;for(e=0,l=h.length;e0},refreshRunningAnimationsData:function(d,k,t,p){var g=d.getId(),q=this.runningAnimationsData,a=q[g],m=a.nameMap,s=a.nameList,b=a.sessions,f,h,e,u,l,c,r,o,n=false;t=Boolean(t);p=Boolean(p);if(!b){return this}f=b.length;if(f===0){return this}if(p){a.nameMap={};s.length=0;for(l=0;l");d.close();this.testElement=c=d.createElement("div");c.style.setProperty("position","absolute","!important");d.body.appendChild(c);this.testElementComputedStyle=window.getComputedStyle(c)}return c},getCssStyleValue:function(b,e){var d=this.getTestElement(),a=this.testElementComputedStyle,c=d.style;c.setProperty(b,e);e=a.getPropertyValue(b);c.removeProperty(b);return e},run:function(o){var E=this,h=this.lengthProperties,w={},D={},F={},d,r,x,e,t,H,u,p,q,a,z,y,n,A,l,s,g,B,G,k,f,v,m,c,C,b;if(!this.listenersAttached){this.attachListeners()}o=Ext.Array.from(o);for(z=0,n=o.length;z0){this.refreshRunningAnimationsData(d,Ext.Array.merge(H,u),true,F.replacePrevious)}c=a.nameMap;C=a.nameList;s={};for(y=0;y0){H=Ext.Array.difference(C,H);u=Ext.Array.merge(H,u);x["transition-property"]=H}D[r]=e=Ext.Object.chain(e);e["transition-property"]=u;e["transition-duration"]=F.duration;e["transition-timing-function"]=F.easing;e["transition-delay"]=F.delay;A.startTime=Date.now()}q=this.$className;this.applyStyles(w);p=function(i){if(i.data===q&&i.source===window){window.removeEventListener("message",p,false);E.applyStyles(D)}};window.addEventListener("message",p,false);window.postMessage(q,"*")}});Ext.define("Ext.fx.Runner",{requires:["Ext.fx.runner.CssTransition"],constructor:function(){return new Ext.fx.runner.CssTransition()}});(function(a){Ext.define("Ext.layout.Default",{extend:"Ext.Evented",alternateClassName:["Ext.layout.AutoContainerLayout","Ext.layout.ContainerLayout"],alias:["layout.auto","layout.default"],isLayout:true,hasDockedItemsCls:a+"hasdocked",centeredItemCls:a+"centered",floatingItemCls:a+"floating",dockingWrapperCls:a+"docking",dockingInnerCls:a+"docking-inner",maskCls:a+"mask",positionMap:{top:"start",left:"start",bottom:"end",right:"end"},positionDirectionMap:{top:"vertical",bottom:"vertical",left:"horizontal",right:"horizontal"},DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",POSITION_START:"start",POSITION_END:"end",config:{animation:null},constructor:function(b,c){this.container=b;this.innerItems=[];this.centeringWrappers={};this.initConfig(c)},reapply:Ext.emptyFn,unapply:Ext.emptyFn,onItemAdd:function(){this.doItemAdd.apply(this,arguments)},onItemRemove:function(){this.doItemRemove.apply(this,arguments)},onItemMove:function(){this.doItemMove.apply(this,arguments)},onItemCenteredChange:function(){this.doItemCenteredChange.apply(this,arguments)},onItemFloatingChange:function(){this.doItemFloatingChange.apply(this,arguments)},onItemDockedChange:function(){this.doItemDockedChange.apply(this,arguments)},doItemAdd:function(c,b){var d=c.getDocked();if(d!==null){this.dockItem(c,d)}else{if(c.isCentered()){this.centerItem(c,b)}else{this.insertItem(c,b)}}if(c.isFloating()){this.onItemFloatingChange(c,true)}},doItemRemove:function(b){if(b.isDocked()){this.undockItem(b)}else{if(b.isCentered()){this.uncenterItem(b)}}Ext.Array.remove(this.innerItems,b);this.container.innerElement.dom.removeChild(b.renderElement.dom)},doItemMove:function(c,d,b){if(c.isCentered()){c.setZIndex((d+1)*2)}else{if(c.isFloating()){c.setZIndex((d+1)*2)}this.insertItem(c,d)}},doItemCenteredChange:function(c,b){if(b){this.centerItem(c)}else{this.uncenterItem(c)}},doItemFloatingChange:function(d,e){var c=d.element,b=this.floatingItemCls;if(e){if(d.getZIndex()===null){d.setZIndex((this.container.indexOf(d)+1)*2)}c.addCls(b)}else{d.setZIndex(null);c.removeCls(b)}},doItemDockedChange:function(b,d,c){if(c){this.undockItem(b,c)}if(d){this.dockItem(b,d)}},centerItem:function(b){this.insertItem(b,0);if(b.getZIndex()===null){b.setZIndex((this.container.indexOf(b)+1)*2)}this.createCenteringWrapper(b);b.element.addCls(this.floatingItemCls)},uncenterItem:function(b){this.destroyCenteringWrapper(b);b.setZIndex(null);this.insertItem(b,this.container.indexOf(b));b.element.removeCls(this.floatingItemCls)},dockItem:function(f,b){var c=this.container,g=f.renderElement,e=f.element,d=this.dockingInnerElement;if(!d){c.setUseBodyElement(true);this.dockingInnerElement=d=c.bodyElement}this.getDockingWrapper(b);if(this.positionMap[b]===this.POSITION_START){g.insertBefore(d)}else{g.insertAfter(d)}e.addCls(a+"docked-"+b)},undockItem:function(b,c){this.insertItem(b,this.container.indexOf(b));b.element.removeCls(a+"docked-"+c)},getDockingWrapper:function(b){var e=this.currentDockingDirection,d=this.positionDirectionMap[b],c=this.dockingWrapper;if(e!==d){this.currentDockingDirection=d;this.dockingWrapper=c=this.createDockingWrapper(d)}return c},createDockingWrapper:function(b){return this.dockingInnerElement.wrap({classList:[this.dockingWrapperCls+"-"+b]},true)},createCenteringWrapper:function(c){var f=c.getId(),d=this.centeringWrappers,b=c.renderElement,e;d[f]=e=b.wrap({className:this.centeredItemCls});return e},destroyCenteringWrapper:function(c){var f=c.getId(),d=this.centeringWrappers,b=c.renderElement,e=d[f];b.unwrap();e.destroy();delete d[f];return this},insertItem:function(k,g){var d=this.container,j=d.getItems().items,e=this.innerItems,c=d.innerElement.dom,i=k.renderElement.dom,h,f,b;if(d.has(k)){Ext.Array.remove(e,k)}if(typeof g=="number"){h=j[g];if(h===k){h=j[++g]}while(h&&(h.isCentered()||h.isDocked())){h=j[++g]}if(h){b=e.indexOf(h);if(b!==-1){while(h&&(h.isCentered()||h.isDocked())){h=e[++b]}if(h){e.splice(b,0,k);f=h.renderElement.dom;c.insertBefore(i,f);return this}}}}e.push(k);c.appendChild(i);return this}})})(Ext.baseCSSPrefix);Ext.define("Ext.layout.AbstractBox",{extend:"Ext.layout.Default",config:{align:"stretch",pack:null},flexItemCls:Ext.baseCSSPrefix+"layout-box-item",positionMap:{middle:"center",left:"start",top:"start",right:"end",bottom:"end"},constructor:function(a){this.callParent(arguments);a.innerElement.addCls(this.cls);a.on(this.sizeChangeEventName,"onItemSizeChange",this,{delegate:"> component"})},reapply:function(){this.container.innerElement.addCls(this.cls);this.updatePack(this.getPack());this.updateAlign(this.getAlign())},unapply:function(){this.container.innerElement.removeCls(this.cls);this.updatePack(null);this.updateAlign(null)},doItemAdd:function(d,b){this.callParent(arguments);if(d.isInnerItem()){var c=d.getConfig(this.sizePropertyName),a=d.config;if(!c&&("flex" in a)){this.setItemFlex(d,a.flex)}}},doItemRemove:function(a){if(a.isInnerItem()){this.setItemFlex(a,null)}this.callParent(arguments)},onItemSizeChange:function(a){this.setItemFlex(a,null)},doItemCenteredChange:function(b,a){if(a){this.setItemFlex(b,null)}this.callParent(arguments)},doItemFloatingChange:function(a,b){if(b){this.setItemFlex(a,null)}this.callParent(arguments)},doItemDockedChange:function(a,b){if(b){this.setItemFlex(a,null)}this.callParent(arguments)},redrawContainer:function(){var a=this.container,b=a.renderElement.dom.parentNode;if(b&&b.nodeType!==11){a.innerElement.redraw()}},setItemFlex:function(c,a){var b=c.element,d=this.flexItemCls;if(a){b.addCls(d)}else{if(b.hasCls(d)){this.redrawContainer();b.removeCls(d)}}b.dom.style.webkitBoxFlex=a},convertPosition:function(a){if(this.positionMap.hasOwnProperty(a)){return this.positionMap[a]}return a},applyAlign:function(a){return this.convertPosition(a)},updateAlign:function(a){this.container.innerElement.dom.style.webkitBoxAlign=a},applyPack:function(a){return this.convertPosition(a)},updatePack:function(a){this.container.innerElement.dom.style.webkitBoxPack=a}});Ext.define("Ext.layout.Fit",{extend:"Ext.layout.Default",alternateClassName:"Ext.layout.FitLayout",alias:"layout.fit",cls:Ext.baseCSSPrefix+"layout-fit",itemCls:Ext.baseCSSPrefix+"layout-fit-item",constructor:function(a){this.callParent(arguments);this.apply()},apply:function(){this.container.innerElement.addCls(this.cls)},reapply:function(){this.apply()},unapply:function(){this.container.innerElement.removeCls(this.cls)},doItemAdd:function(b,a){if(b.isInnerItem()){b.addCls(this.itemCls)}this.callParent(arguments)},doItemRemove:function(a){if(a.isInnerItem()){a.removeCls(this.itemCls)}this.callParent(arguments)}});Ext.define("Ext.layout.Card",{extend:"Ext.layout.Fit",alternateClassName:"Ext.layout.CardLayout",isCard:true,requires:["Ext.fx.layout.Card"],alias:"layout.card",cls:Ext.baseCSSPrefix+"layout-card",itemCls:Ext.baseCSSPrefix+"layout-card-item",constructor:function(){this.callParent(arguments);this.container.onInitialized(this.onContainerInitialized,this)},applyAnimation:function(a){return new Ext.fx.layout.Card(a)},updateAnimation:function(b,a){if(b&&b.isAnimation){b.setLayout(this)}if(a){a.destroy()}},doItemAdd:function(b,a){if(b.isInnerItem()){b.hide()}this.callParent(arguments)},doItemRemove:function(c,a,b){this.callParent(arguments);if(!b&&c.isInnerItem()){c.show()}},onContainerInitialized:function(a){var b=a.getActiveItem();if(b){b.show()}a.on("activeitemchange","onContainerActiveItemChange",this)},onContainerActiveItemChange:function(a){this.relayEvent(arguments,"doActiveItemChange")},doActiveItemChange:function(b,c,a){if(a){a.hide()}if(c){c.show()}},doItemDockedChange:function(b,c){var a=b.element;if(c){a.removeCls(this.itemCls)}else{a.addCls(this.itemCls)}this.callParent(arguments)}});Ext.define("Ext.layout.HBox",{extend:"Ext.layout.AbstractBox",alternateClassName:"Ext.layout.HBoxLayout",alias:"layout.hbox",sizePropertyName:"width",sizeChangeEventName:"widthchange",cls:Ext.baseCSSPrefix+"layout-hbox"});Ext.define("Ext.layout.VBox",{extend:"Ext.layout.AbstractBox",alternateClassName:"Ext.layout.VBoxLayout",alias:"layout.vbox",sizePropertyName:"height",sizeChangeEventName:"heightchange",cls:Ext.baseCSSPrefix+"layout-vbox"});Ext.define("Ext.layout.Layout",{requires:["Ext.layout.Fit","Ext.layout.Card","Ext.layout.HBox","Ext.layout.VBox"],constructor:function(a,b){var c=Ext.layout.Default,d,e;if(typeof b=="string"){d=b;b={}}else{if("type" in b){d=b.type}}if(d){c=Ext.ClassManager.getByAlias("layout."+d)}return new c(a,b)}});Ext.define("Ext.mixin.Sortable",{extend:"Ext.mixin.Mixin",requires:["Ext.util.Sorter"],mixinConfig:{id:"sortable"},config:{sorters:null,defaultSortDirection:"ASC",sortRoot:null},dirtySortFn:false,sortFn:null,sorted:false,applySorters:function(a,b){if(!b){b=this.createSortersCollection()}b.clear();this.sorted=false;if(a){this.addSorters(a)}return b},createSortersCollection:function(){this._sorters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._sorters},addSorter:function(b,a){this.addSorters([b],a)},addSorters:function(c,a){var b=this.getSorters();return this.insertSorters(b?b.length:0,c,a)},insertSorter:function(a,c,b){return this.insertSorters(a,[c],b)},insertSorters:function(e,h,a){if(!Ext.isArray(h)){h=[h]}var f=h.length,j=a||this.getDefaultSortDirection(),c=this.getSortRoot(),k=this.getSorters(),l=[],g,b,m,d;if(!k){k=this.createSortersCollection()}for(b=0;b>1;f=d(e,b[c]);if(f>=0){h=c+1}else{if(f<0){a=c-1}}}return h}});Ext.define("Ext.util.AbstractMixedCollection",{requires:["Ext.util.Filter"],mixins:{observable:"Ext.util.Observable"},constructor:function(b,a){var c=this;c.items=[];c.map={};c.keys=[];c.length=0;c.allowFunctions=b===true;if(a){c.getKey=a}c.mixins.observable.constructor.call(c)},allowFunctions:false,add:function(b,e){var d=this,f=e,c=b,a;if(arguments.length==1){f=c;c=d.getKey(f)}if(typeof c!="undefined"&&c!==null){a=d.map[c];if(typeof a!="undefined"){return d.replace(c,f)}d.map[c]=f}d.length++;d.items.push(f);d.keys.push(c);d.fireEvent("add",d.length-1,f,c);return f},getKey:function(a){return a.id},replace:function(c,e){var d=this,a,b;if(arguments.length==1){e=arguments[0];c=d.getKey(e)}a=d.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return d.add(c,e)}b=d.indexOfKey(c);d.items[b]=e;d.map[c]=e;d.fireEvent("replace",c,a,e);return e},addAll:function(f){var e=this,d=0,b,a,c;if(arguments.length>1||Ext.isArray(f)){b=arguments.length>1?arguments:f;for(a=b.length;d=d.length){return d.add(c,f)}d.length++;Ext.Array.splice(d.items,a,0,f);if(typeof c!="undefined"&&c!==null){d.map[c]=f}Ext.Array.splice(d.keys,a,0,c);d.fireEvent("add",a,f,c);return f},remove:function(a){return this.removeAt(this.indexOf(a))},removeAll:function(a){Ext.each(a||[],function(b){this.remove(b)},this);return this},removeAt:function(a){var c=this,d,b;if(a=0){c.length--;d=c.items[a];Ext.Array.erase(c.items,a,1);b=c.keys[a];if(typeof b!="undefined"){delete c.map[b]}Ext.Array.erase(c.keys,a,1);c.fireEvent("remove",d,b);return d}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return Ext.Array.indexOf(this.items,a)},indexOfKey:function(a){return Ext.Array.indexOf(this.keys,a)},get:function(b){var d=this,a=d.map[b],c=a!==undefined?a:(typeof b=="number")?d.items[b]:undefined;return typeof c!="function"||d.allowFunctions?c:null},getAt:function(a){return this.items[a]},getByKey:function(a){return this.map[a]},contains:function(a){return Ext.Array.contains(this.items,a)},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){var a=this;a.length=0;a.items=[];a.keys=[];a.map={};a.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},sum:function(g,b,h,a){var c=this.extractValues(g,b),f=c.length,e=0,d;h=h||0;a=(a||a===0)?a:f-1;for(d=h;d<=a;d++){e+=c[d]}return e},collect:function(j,e,g){var k=this.extractValues(j,e),a=k.length,b={},c=[],h,f,d;for(d=0;d=a;d--){b[b.length]=c[d]}}return b},filter:function(d,c,f,a){var b=[],e;if(Ext.isString(d)){b.push(Ext.create("Ext.util.Filter",{property:d,value:c,anyMatch:f,caseSensitive:a}))}else{if(Ext.isArray(d)||d instanceof Ext.util.Filter){b=b.concat(d)}}e=function(g){var m=true,n=b.length,h;for(h=0;h=e.length||(a&&e.getAutoSort())){return e.add(d,f)}this.all.push(f);if(typeof d!="undefined"&&d!==null){e.map[d]=f}if(b&&this.getAutoFilter()&&filterable.isFiltered.call(e,f)){return null}e.length++;Ext.Array.splice(e.items,c,0,f);Ext.Array.splice(e.keys,c,0,d);e.dirtyIndices=true;return f},insertAll:function(g,d){if(g>=this.items.length||(this.sorted&&this.getAutoSort())){return this.addAll(d)}var s=this,h=this.filtered,a=this.sorted,b=this.all,m=this.items,l=this.keys,r=this.map,n=this.getAutoFilter(),o=this.getAutoSort(),t=[],j=[],f=[],c=this.mixins.filterable,e=false,k,u,p,q;if(a&&this.getAutoSort()){}if(Ext.isObject(d)){for(u in d){if(d.hasOwnProperty(u)){j.push(m[u]);t.push(u)}}}else{j=d;k=d.length;for(p=0;p=0){e=a[b];c=f[b];if(typeof c!="undefined"){delete g.map[c]}Ext.Array.erase(a,b,1);Ext.Array.erase(f,b,1);Ext.Array.remove(d,e);g.length--;this.dirtyIndices=true;return e}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[this.getKey(b)];return(a===undefined)?-1:a},indexOfKey:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[b];return(a===undefined)?-1:a},updateIndices:function(){var a=this.items,e=a.length,f=this.indices={},c,d,b;for(c=0;c=a;d--){b[b.length]=c[d]}}return b},findIndexBy:function(d,c,h){var g=this,f=g.keys,a=g.items,b=h||0,e=a.length;for(;b1){for(c=a.length;ba){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!=-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.util.Format.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.util.Format.escapeRe,"\\$1")},toggle:function(b,c,a){return b==c?a:c},trim:function(a){return a.replace(Ext.util.Format.trimRe,"")},leftPad:function(d,b,c){var a=String(d);c=c||" ";while(a.length/g,">").replace(/").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&")},date:function(b,c){var a=b;if(!b){return""}if(!Ext.isDate(b)){a=new Date(Date.parse(b));if(isNaN(a)){if(this.iso8601TestRe.test(b)){a=b.split(this.iso8601SplitRe);a=new Date(a[0],a[1]-1,a[2],a[3],a[4],a[5])}if(isNaN(a)){a=new Date(Date.parse(b.replace(this.dashesRe,"/")))}}b=a}return Ext.Date.format(b,c||Ext.util.Format.defaultDateFormat)}});Ext.define("Ext.Template",{requires:["Ext.dom.Helper","Ext.util.Format"],inheritableStatics:{from:function(b,a){b=Ext.getDom(b);return new this(b.value||b.innerHTML,a||"")}},constructor:function(d){var f=this,b=arguments,a=[],c=0,e=b.length,g;f.initialConfig={};if(e>1){for(;cf)?1:((ba?1:(d0},isExpandable:function(){var a=this;if(a.get("expandable")){return !(a.isLeaf()||(a.isLoaded()&&!a.hasChildNodes()))}return false},appendChild:function(b,j,h){var f=this,c,e,d,g,a;if(Ext.isArray(b)){for(c=0,e=b.length;c0){Ext.Array.sort(d,f);for(c=0;cMath.max(c,b)||jMath.max(a,q)||eMath.max(p,n)||eMath.max(k,h)){return null}return new Ext.util.Point(j,e)},toString:function(){return this.point1.toString()+" "+this.point2.toString()}});Ext.define("Ext.util.SizeMonitor",{extend:"Ext.Evented",config:{element:null,detectorCls:Ext.baseCSSPrefix+"size-change-detector",callback:Ext.emptyFn,scope:null,args:[]},constructor:function(d){this.initConfig(d);this.doFireSizeChangeEvent=Ext.Function.bind(this.doFireSizeChangeEvent,this);var g=this,e=this.getElement().dom,b=this.getDetectorCls(),c=Ext.Element.create({classList:[b,b+"-expand"],children:[{}]},true),h=Ext.Element.create({classList:[b,b+"-shrink"],children:[{}]},true),a=function(i){g.onDetectorScroll("expand",i)},f=function(i){g.onDetectorScroll("shrink",i)};e.appendChild(c);e.appendChild(h);c.addEventListener("scroll",a,true);h.addEventListener("scroll",f,true);this.detectors={expand:c,shrink:h};this.position={expand:{left:0,top:0},shrink:{left:0,top:0}};this.listeners={expand:a,shrink:f};this.refresh()},applyElement:function(a){if(a){return Ext.get(a)}},refreshPosition:function(b){var e=this.detectors[b],a=this.position[b],d,c;a.left=d=e.scrollWidth-e.offsetWidth;a.top=c=e.scrollHeight-e.offsetHeight;e.scrollLeft=d;e.scrollTop=c},refresh:function(){this.refreshPosition("expand");this.refreshPosition("shrink")},onDetectorScroll:function(b){var c=this.detectors[b],a=this.position[b];if(c.scrollLeft!==a.left||c.scrollTop!==a.top){this.refresh();this.fireSizeChangeEvent()}},fireSizeChangeEvent:function(){clearTimeout(this.sizeChangeThrottleTimer);this.sizeChangeThrottleTimer=setTimeout(this.doFireSizeChangeEvent,1)},doFireSizeChangeEvent:function(){this.getCallback().apply(this.getScope(),this.getArgs())},destroyDetector:function(a){var c=this.detectors[a],b=this.listeners[a];c.removeEventListener("scroll",b,true);Ext.removeNode(c)},destroy:function(){this.callParent(arguments);this.destroyDetector("expand");this.destroyDetector("shrink");delete this.listeners;delete this.detectors}});Ext.define("Ext.event.publisher.ComponentSize",{extend:"Ext.event.publisher.Publisher",requires:["Ext.ComponentManager","Ext.util.SizeMonitor"],targetType:"component",handledEvents:["resize"],constructor:function(){this.callParent(arguments);this.sizeMonitors={}},subscribe:function(g){var c=g.match(this.idSelectorRegex),f=this.subscribers,a=this.sizeMonitors,d=this.dispatcher,e=this.targetType,b;if(!c){return false}if(!f.hasOwnProperty(g)){f[g]=0;d.addListener(e,g,"painted","onComponentPainted",this,null,"before");b=Ext.ComponentManager.get(c[1]);a[g]=new Ext.util.SizeMonitor({element:b.element,callback:this.onComponentSizeChange,scope:this,args:[this,g]})}f[g]++;return true},unsubscribe:function(h,b,e){var c=h.match(this.idSelectorRegex),g=this.subscribers,d=this.dispatcher,f=this.targetType,a=this.sizeMonitors;if(!c){return false}if(!g.hasOwnProperty(h)||(!e&&--g[h]>0)){return true}a[h].destroy();delete a[h];d.removeListener(f,h,"painted","onComponentPainted",this,"before");delete g[h];return true},onComponentPainted:function(b){var c=b.getObservableId(),a=this.sizeMonitors[c];a.refresh()},onComponentSizeChange:function(a,b){this.dispatcher.doDispatchEvent(this.targetType,b,"resize",[a])}});Ext.define("Ext.util.Sortable",{isSortable:true,defaultSortDirection:"ASC",requires:["Ext.util.Sorter"],initSortable:function(){var a=this,b=a.sorters;a.sorters=Ext.create("Ext.util.AbstractMixedCollection",false,function(c){return c.id||c.property});if(b){a.sorters.addAll(a.decodeSorters(b))}},sort:function(g,f,c,e){var d=this,h,b,a;if(Ext.isArray(g)){e=c;c=f;a=g}else{if(Ext.isObject(g)){e=c;c=f;a=[g]}else{if(Ext.isString(g)){h=d.sorters.get(g);if(!h){h={property:g,direction:f};a=[h]}else{if(f===undefined){h.toggle()}else{h.setDirection(f)}}}}}if(a&&a.length){a=d.decodeSorters(a);if(Ext.isString(c)){if(c==="prepend"){g=d.sorters.clone().items;d.sorters.clear();d.sorters.addAll(a);d.sorters.addAll(g)}else{d.sorters.addAll(a)}}else{d.sorters.clear();d.sorters.addAll(a)}if(e!==false){d.onBeforeSort(a)}}if(e!==false){g=d.sorters.items;if(g.length){b=function(l,k){var j=g[0].sort(l,k),n=g.length,m;for(m=1;me?1:(f0){g=f.data.items;r=g.length;for(k=0;k0){b.create=e;f=true}if(c.length>0){b.update=c;f=true}if(a.length>0){b.destroy=a;f=true}if(f&&d.fireEvent("beforesync",this,b)!==false){d.getProxy().batch({operations:b,listeners:d.getBatchListeners()})}return{added:e,updated:c,removed:a}},first:function(){return this.data.first()},last:function(){return this.data.last()},sum:function(e){var d=0,c=0,b=this.data.items,a=b.length;for(;c0){c=b[0].get(f)}for(;d0){a=c[0].get(f)}for(;da){a=e}}return a},average:function(e){var c=0,b=this.data.items,a=b.length,d=0;if(b.length>0){for(;ce){return 1}else{if(fa.data.index)?1:-1},applyFilters:function(b){var a=this;return function(c){return a.isVisible(c)}},applyProxy:function(a){},applyNode:function(a){if(a){a=Ext.data.NodeInterface.decorate(a)}return a},updateNode:function(a,c){if(c){c.un({append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad",scope:this});c.unjoin(this)}if(a){a.on({scope:this,append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad"});a.join(this);var b=[];if(a.childNodes.length){b=b.concat(this.retrieveChildNodes(a))}if(this.getRootVisible()){b.push(a)}else{if(a.isLoaded()||a.isLoading()){a.set("expanded",true)}}this.data.clear();this.fireEvent("clear",this);this.suspendEvents();this.add(b);this.resumeEvents();this.fireEvent("refresh",this,this.data)}},retrieveChildNodes:function(a){var d=this.getNode(),b=this.getRecursive(),c=[],e=a;if(!a.childNodes.length||(!b&&a!==d)){return c}if(!b){return a.childNodes}while(e){if(e._added){delete e._added;if(e===a){break}else{e=e.nextSibling||e.parentNode}}else{if(e!==a){c.push(e)}if(e.firstChild){e._added=true;e=e.firstChild}else{e=e.nextSibling||e.parentNode}}}return c},isVisible:function(b){var a=b.parentNode;while(a){if(!a.isExpanded()){return false}if(a===this.getNode()){break}a=a.parentNode}return true}});Ext.define("Ext.data.TreeStore",{extend:"Ext.data.NodeStore",alias:"store.tree",config:{root:undefined,clearOnLoad:true,nodeParam:"node",defaultRootId:"root",defaultRootProperty:"children",recursive:true},applyProxy:function(){return Ext.data.Store.prototype.applyProxy.apply(this,arguments)},applyRoot:function(a){var b=this;a=a||{};a=Ext.apply({},a);if(!a.isModel){Ext.applyIf(a,{id:b.getDefaultRootId(),text:"Root",allowDrag:false});a=Ext.data.ModelManager.create(a,b.getModel())}Ext.data.NodeInterface.decorate(a);a.set(a.raw);return a},handleTreeInsertionIndex:function(a,b,d,c){if(b.parentNode){b.parentNode.sort(d.getSortFn(),true,true)}return this.callParent(arguments)},handleTreeSort:function(a,b){if(this._sorting){return a}this._sorting=true;this.getNode().sort(b.getSortFn(),true,true);delete this._sorting;return this.callParent(arguments)},updateRoot:function(a,b){if(b){b.unBefore({expand:"onNodeBeforeExpand",scope:this});b.unjoin(this)}a.onBefore({expand:"onNodeBeforeExpand",scope:this});this.onNodeAppend(null,a);this.setNode(a);if(!a.isLoaded()&&!a.isLoading()&&a.isExpanded()){this.load({node:a})}this.fireEvent("rootchange",this,a,b)},getNodeById:function(a){return this.data.getByKey(a)},onNodeBeforeExpand:function(b,a,c){if(b.isLoading()){c.pause();this.on("load",function(){c.resume()},this,{single:true})}else{if(!b.isLoaded()){c.pause();this.load({node:b,callback:function(){c.resume()}})}}},onNodeAppend:function(l,b){var j=this.getProxy(),g=j.getReader(),e=b.raw,c=[],a=g.getRootProperty(),k,f,d,h;if(!b.isLeaf()){k=g.getRoot(e);if(k){f=g.extractData(k);for(d=0,h=f.length;d0){this.sendRequest(b==1?a[0]:a);this.callBuffer=[]}}});Ext.define("Ext.util.TapRepeater",{requires:["Ext.DateExtras"],mixins:{observable:"Ext.mixin.Observable"},config:{el:null,accelerate:true,interval:10,delay:250,preventDefault:true,stopDefault:false,timer:0,pressCls:null},constructor:function(a){var b=this;b.initConfig(a)},updateEl:function(c,b){var a={touchstart:"onTouchStart",touchend:"onTouchEnd",tap:"eventOptions",scope:this};if(b){b.un(a)}c.on(a)},eventOptions:function(a){if(this.getPreventDefault()){a.preventDefault()}if(this.getStopDefault()){a.stopEvent()}},destroy:function(){this.clearListeners();Ext.destroy(this.el)},onTouchStart:function(c){var b=this,a=b.getPressCls();clearTimeout(b.getTimer());if(a){b.getEl().addCls(a)}b.tapStartTime=new Date();b.fireEvent("touchstart",b,c);b.fireEvent("tap",b,c);if(b.getAccelerate()){b.delay=400}b.setTimer(Ext.defer(b.tap,b.getDelay()||b.getInterval(),b,[c]))},tap:function(b){var a=this;a.fireEvent("tap",a,b);a.setTimer(Ext.defer(a.tap,a.getAccelerate()?a.easeOutExpo(Ext.Date.getElapsed(a.tapStartTime),400,-390,12000):a.getInterval(),a,[b]))},easeOutExpo:function(e,a,g,f){return(e==f)?a+g:g*(-Math.pow(2,-10*e/f)+1)+a},onTouchEnd:function(b){var a=this;clearTimeout(a.getTimer());a.getEl().removeCls(a.getPressCls());a.fireEvent("touchend",a,b)}});Ext.define("Ext.util.translatable.Abstract",{extend:"Ext.Evented",requires:["Ext.fx.easing.Linear"],config:{element:null,easing:null,easingX:null,easingY:null,fps:60},constructor:function(a){var b;this.doAnimationFrame=Ext.Function.bind(this.doAnimationFrame,this);this.x=0;this.y=0;this.activeEasingX=null;this.activeEasingY=null;this.initialConfig=a;if(a&&a.element){b=a.element;this.setElement(b)}},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initConfig(this.initialConfig);this.refresh()},factoryEasing:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")},applyEasing:function(a){if(!this.getEasingX()){this.setEasingX(this.factoryEasing(a))}if(!this.getEasingY()){this.setEasingY(this.factoryEasing(a))}},applyEasingX:function(a){return this.factoryEasing(a)},applyEasingY:function(a){return this.factoryEasing(a)},updateFps:function(a){this.animationInterval=1000/a},doTranslate:function(a,b){if(typeof a=="number"){this.x=a}if(typeof b=="number"){this.y=b}return this},translate:function(a,c,b){if(Ext.isObject(a)){throw new Error()}this.stopAnimation();if(b!==undefined){return this.translateAnimated(a,c,b)}return this.doTranslate(a,c)},animate:function(b,a){this.activeEasingX=b;this.activeEasingY=a;this.isAnimating=true;this.animationTimer=setInterval(this.doAnimationFrame,this.animationInterval);this.fireEvent("animationstart",this,this.x,this.y);return this},translateAnimated:function(b,g,e){if(Ext.isObject(b)){throw new Error()}if(!Ext.isObject(e)){e={}}var d=Ext.Date.now(),f=e.easing,c=(typeof b=="number")?(e.easingX||this.getEasingX()||f||true):null,a=(typeof g=="number")?(e.easingY||this.getEasingY()||f||true):null;if(c){c=this.factoryEasing(c);c.setStartTime(d);c.setStartValue(this.x);c.setEndValue(b);if("duration" in e){c.setDuration(e.duration)}}if(a){a=this.factoryEasing(a);a.setStartTime(d);a.setStartValue(this.y);a.setEndValue(g);if("duration" in e){a.setDuration(e.duration)}}return this.animate(c,a)},doAnimationFrame:function(){if(!this.isAnimating){return}var c=this.activeEasingX,b=this.activeEasingY,a,d;if(c===null&&b===null){this.stopAnimation();return}if(c!==null){this.x=a=Math.round(c.getValue());if(c.isEnded){this.activeEasingX=null;this.fireEvent("axisanimationend",this,"x",a)}}else{a=this.x}if(b!==null){this.y=d=Math.round(b.getValue());if(b.isEnded){this.activeEasingY=null;this.fireEvent("axisanimationend",this,"y",d)}}else{d=this.y}this.doTranslate(a,d);this.fireEvent("animationframe",this,a,d)},stopAnimation:function(){if(!this.isAnimating){return}this.activeEasingX=null;this.activeEasingY=null;this.isAnimating=false;clearInterval(this.animationTimer);this.fireEvent("animationend",this,this.x,this.y)},refresh:function(){this.translate(this.x,this.y)}});Ext.define("Ext.util.translatable.CssTransform",{extend:"Ext.util.translatable.Abstract",doTranslate:function(a,c){var b=this.getElement().dom.style;if(typeof a!="number"){a=this.x}if(typeof c!="number"){c=this.y}b.webkitTransform="translate3d("+a+"px, "+c+"px, 0px)";return this.callParent(arguments)},destroy:function(){var a=this.getElement();if(a&&!a.isDestroyed){a.dom.style.webkitTransform=null}this.callParent(arguments)}});Ext.define("Ext.util.translatable.ScrollPosition",{extend:"Ext.util.translatable.Abstract",wrapperWidth:0,wrapperHeight:0,baseCls:"x-translatable",config:{useWrapper:true},getWrapper:function(){var e=this.wrapper,c=this.baseCls,b=this.getElement(),d,a;if(!e){a=b.getParent();if(!a){return null}if(this.getUseWrapper()){e=b.wrap({className:c+"-wrapper"},true)}else{e=a.dom}e.appendChild(Ext.Element.create({className:c+"-stretcher"},true));this.nestedStretcher=d=Ext.Element.create({className:c+"-nested-stretcher"},true);b.appendChild(d);b.addCls(c);a.addCls(c+"-container");this.container=a;this.wrapper=e;this.refresh()}return e},doTranslate:function(a,c){var b=this.getWrapper();if(b){if(typeof a=="number"){b.scrollLeft=this.wrapperWidth-a}if(typeof c=="number"){b.scrollTop=this.wrapperHeight-c}}return this.callParent(arguments)},refresh:function(){var a=this.getWrapper();if(a){this.wrapperWidth=a.offsetWidth;this.wrapperHeight=a.offsetHeight;this.callParent(arguments)}},destroy:function(){var b=this.getElement(),a=this.baseCls;if(this.wrapper){if(this.getUseWrapper()){b.unwrap()}this.container.removeCls(a+"-container");b.removeCls(a);b.removeChild(this.nestedStretcher)}this.callParent(arguments)}});Ext.define("Ext.util.Translatable",{requires:["Ext.util.translatable.CssTransform","Ext.util.translatable.ScrollPosition"],constructor:function(a){var c=Ext.util.translatable,e=c.CssTransform,d=c.ScrollPosition,b;if(typeof a=="object"&&"translationMethod" in a){if(a.translationMethod==="scrollposition"){b=d}else{if(a.translationMethod==="csstransform"){b=e}}}if(!b){if(Ext.os.is.Android2||Ext.browser.is.ChromeMobile){b=d}else{b=e}}return new b(a)}});Ext.define("Ext.behavior.Translatable",{extend:"Ext.behavior.Behavior",requires:["Ext.util.Translatable"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.translatable.refresh()},setConfig:function(c){var a=this.translatable,b=this.component;if(c){if(!a){this.translatable=a=new Ext.util.Translatable(c);a.setElement(b.renderElement);a.on("destroy","onTranslatableDestroy",this);if(b.isPainted()){this.onComponentPainted(b)}b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getTranslatable:function(){return this.translatable},onTranslatableDestroy:function(){var a=this.component;delete this.translatable;a.un(this.listeners)},onComponentDestroy:function(){var a=this.translatable;if(a){a.destroy()}}});Ext.define("Ext.scroll.Scroller",{extend:"Ext.Evented",requires:["Ext.fx.easing.BoundMomentum","Ext.fx.easing.EaseOut","Ext.util.SizeMonitor","Ext.util.Translatable"],config:{element:null,direction:"auto",translationMethod:"auto",fps:"auto",disabled:null,directionLock:false,momentumEasing:{momentum:{acceleration:30,friction:0.5},bounce:{acceleration:30,springTension:0.3},minVelocity:1},bounceEasing:{duration:400},outOfBoundRestrictFactor:0.5,startMomentumResetTime:300,maxAbsoluteVelocity:6,containerSize:"auto",containerScrollSize:"auto",size:"auto",autoRefresh:true,initialOffset:{x:0,y:0},slotSnapSize:{x:0,y:0},slotSnapOffset:{x:0,y:0},slotSnapEasing:{duration:150}},cls:Ext.baseCSSPrefix+"scroll-scroller",containerCls:Ext.baseCSSPrefix+"scroll-container",dragStartTime:0,dragEndTime:0,isDragging:false,isAnimating:false,constructor:function(a){var b=a&&a.element;this.doAnimationFrame=Ext.Function.bind(this.doAnimationFrame,this);this.stopAnimation=Ext.Function.bind(this.stopAnimation,this);this.listeners={scope:this,touchstart:"onTouchStart",touchend:"onTouchEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd"};this.minPosition={x:0,y:0};this.startPosition={x:0,y:0};this.size={x:0,y:0};this.position={x:0,y:0};this.velocity={x:0,y:0};this.isAxisEnabledFlags={x:false,y:false};this.flickStartPosition={x:0,y:0};this.flickStartTime={x:0,y:0};this.lastDragPosition={x:0,y:0};this.dragDirection={x:0,y:0};this.initialConfig=a;if(b){this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initialize();a.addCls(this.cls);if(!this.getDisabled()){this.attachListeneners()}this.onConfigUpdate(["containerSize","size"],"refreshMaxPosition");this.on("maxpositionchange","snapToBoundary");this.on("minpositionchange","snapToBoundary");return this},getTranslatable:function(){if(!this.hasOwnProperty("translatable")){var a=this.getBounceEasing();this.translatable=new Ext.util.Translatable({translationMethod:this.getTranslationMethod(),element:this.getElement(),easingX:a.x,easingY:a.y,useWrapper:false,listeners:{animationframe:"onAnimationFrame",animationend:"onAnimationEnd",axisanimationend:"onAxisAnimationEnd",scope:this}})}return this.translatable},updateFps:function(a){if(a!=="auto"){this.getTranslatable().setFps(a)}},attachListeneners:function(){this.getContainer().on(this.listeners)},detachListeners:function(){this.getContainer().un(this.listeners)},updateDisabled:function(a){if(a){this.detachListeners()}else{this.attachListeneners()}},updateInitialOffset:function(c){if(typeof c=="number"){c={x:c,y:c}}var b=this.position,a,d;b.x=a=c.x;b.y=d=c.y;this.getTranslatable().doTranslate(-a,-d)},applyDirection:function(a){var e=this.getMinPosition(),d=this.getMaxPosition(),c,b;this.givenDirection=a;if(a==="auto"){c=d.x>e.x;b=d.y>e.y;if(c&&b){a="both"}else{if(c){a="horizontal"}else{a="vertical"}}}return a},updateDirection:function(b){var a=this.isAxisEnabledFlags;a.x=(b==="both"||b==="horizontal");a.y=(b==="both"||b==="vertical")},isAxisEnabled:function(a){this.getDirection();return this.isAxisEnabledFlags[a]},applyMomentumEasing:function(b){var a=Ext.fx.easing.BoundMomentum;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applyBounceEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applySlotSnapEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},getMinPosition:function(){var a=this.minPosition;if(!a){this.minPosition=a={x:0,y:0};this.fireEvent("minpositionchange",this,a)}return a},getMaxPosition:function(){var c=this.maxPosition,a,b;if(!c){a=this.getSize();b=this.getContainerSize();this.maxPosition=c={x:Math.max(0,a.x-b.x),y:Math.max(0,a.y-b.y)};this.fireEvent("maxpositionchange",this,c)}return c},refreshMaxPosition:function(){this.maxPosition=null;this.getMaxPosition()},applyContainerSize:function(b){var c,a,d;this.givenContainerSize=b;if(b==="auto"){c=this.getContainer().dom;a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applySize:function(b){var c,a,d;this.givenSize=b;if(b==="auto"){c=this.getElement().dom;a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applyContainerScrollSize:function(b){var c,a,d;this.givenContainerScrollSize=b;if(b==="auto"){c=this.getContainer().dom;a=c.scrollWidth;d=c.scrollHeight}else{a=b.x;d=b.y}return{x:a,y:d}},updateAutoRefresh:function(b){var c=Ext.util.SizeMonitor,a;if(b){this.sizeMonitors={element:new c({element:this.getElement(),callback:this.doRefresh,scope:this}),container:new c({element:this.getContainer(),callback:this.doRefresh,scope:this})}}else{a=this.sizeMonitors;if(a){a.element.destroy();a.container.destroy()}}},applySlotSnapSize:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},applySlotSnapOffset:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},getContainer:function(){var a=this.container;if(!a){this.container=a=this.getElement().getParent();a.addCls(this.containerCls)}return a},doRefresh:function(){this.stopAnimation();this.getTranslatable().refresh();this.setSize(this.givenSize);this.setContainerSize(this.givenContainerSize);this.setContainerScrollSize(this.givenContainerScrollSize);this.setDirection(this.givenDirection);this.fireEvent("refresh",this)},refresh:function(){var a=this.sizeMonitors;if(a){a.element.refresh();a.container.refresh()}this.doRefresh();return this},scrollTo:function(c,h,g){var b=this.getTranslatable(),a=this.position,d=false,f,e;if(this.isAxisEnabled("x")){if(typeof c!="number"){c=a.x}else{if(a.x!==c){a.x=c;d=true}}f=-c}if(this.isAxisEnabled("y")){if(typeof h!="number"){h=a.y}else{if(a.y!==h){a.y=h;d=true}}e=-h}if(d){if(g!==undefined){b.translateAnimated(f,e,g)}else{this.fireEvent("scroll",this,a.x,a.y);b.doTranslate(f,e)}}return this},scrollToTop:function(b){var a=this.getInitialOffset();return this.scrollTo(a.x,a.y,b)},scrollToEnd:function(a){return this.scrollTo(0,this.getSize().y-this.getContainerSize().y,a)},scrollBy:function(b,d,c){var a=this.position;b=(typeof b=="number")?b+a.x:null;d=(typeof d=="number")?d+a.y:null;return this.scrollTo(b,d,c)},onTouchStart:function(){this.isTouching=true;this.stopAnimation()},onTouchEnd:function(){var a=this.position;this.isTouching=false;if(!this.isDragging&&this.snapToSlot()){this.fireEvent("scrollstart",this,a.x,a.y)}},onDragStart:function(l){var o=this.getDirection(),g=l.absDeltaX,f=l.absDeltaY,j=this.getDirectionLock(),i=this.startPosition,d=this.flickStartPosition,k=this.flickStartTime,h=this.lastDragPosition,c=this.position,b=this.dragDirection,n=c.x,m=c.y,a=Ext.Date.now();this.isDragging=true;if(j&&o!=="both"){if((o==="horizontal"&&g>f)||(o==="vertical"&&f>g)){l.stopPropagation()}else{this.isDragging=false;return}}h.x=n;h.y=m;d.x=n;d.y=m;i.x=n;i.y=m;k.x=a;k.y=a;b.x=0;b.y=0;this.dragStartTime=a;this.isDragging=true;this.fireEvent("scrollstart",this,n,m)},onAxisDrag:function(i,q){if(!this.isAxisEnabled(i)){return}var h=this.flickStartPosition,l=this.flickStartTime,j=this.lastDragPosition,e=this.dragDirection,g=this.position[i],k=this.getMinPosition()[i],o=this.getMaxPosition()[i],d=this.startPosition[i],p=j[i],n=d-q,c=e[i],m=this.getOutOfBoundRestrictFactor(),f=this.getStartMomentumResetTime(),b=Ext.Date.now(),a;if(no){a=n-o;n=o+a*m}}if(n>p){e[i]=1}else{if(nf){h[i]=g;l[i]=b}j[i]=n},onDrag:function(b){if(!this.isDragging){return}var a=this.lastDragPosition;this.onAxisDrag("x",b.deltaX);this.onAxisDrag("y",b.deltaY);this.scrollTo(a.x,a.y)},onDragEnd:function(c){var b,a;if(!this.isDragging){return}this.dragEndTime=Ext.Date.now();this.onDrag(c);this.isDragging=false;b=this.getAnimationEasing("x");a=this.getAnimationEasing("y");if(b||a){this.getTranslatable().animate(b,a)}else{this.onScrollEnd()}},getAnimationEasing:function(g){if(!this.isAxisEnabled(g)){return null}var e=this.position[g],f=this.flickStartPosition[g],k=this.flickStartTime[g],c=this.getMinPosition()[g],j=this.getMaxPosition()[g],a=this.getMaxAbsoluteVelocity(),d=null,b=this.dragEndTime,l,i,h;if(ej){d=j}}if(d!==null){l=this.getBounceEasing()[g];l.setConfig({startTime:b,startValue:-e,endValue:-d});return l}h=b-k;if(h===0){return null}i=(e-f)/(b-k);if(i===0){return null}if(i<-a){i=-a}else{if(i>a){i=a}}l=this.getMomentumEasing()[g];l.setConfig({startTime:b,startValue:-e,startVelocity:-i,minMomentumValue:-j,maxMomentumValue:0});return l},onAnimationFrame:function(c,b,d){var a=this.position;a.x=-b;a.y=-d;this.fireEvent("scroll",this,a.x,a.y)},onAxisAnimationEnd:function(a){},onAnimationEnd:function(){this.snapToBoundary();this.onScrollEnd()},stopAnimation:function(){this.getTranslatable().stopAnimation()},onScrollEnd:function(){var a=this.position;if(this.isTouching||!this.snapToSlot()){this.fireEvent("scrollend",this,a.x,a.y)}},snapToSlot:function(){var b=this.getSnapPosition("x"),a=this.getSnapPosition("y"),c=this.getSlotSnapEasing();if(b!==null||a!==null){this.scrollTo(b,a,{easingX:c.x,easingY:c.y});return true}return false},getSnapPosition:function(c){var g=this.getSlotSnapSize()[c],d=null,a,f,e,b;if(g!==0&&this.isAxisEnabled(c)){a=this.position[c];f=this.getSlotSnapOffset()[c];e=this.getMaxPosition()[c];b=(a-f)%g;if(b!==0){if(Math.abs(b)>g/2){d=a+((b>0)?g-b:b-g);if(d>e){d=a-b}}else{d=a-b}}}return d},snapToBoundary:function(){var g=this.position,c=this.getMinPosition(),f=this.getMaxPosition(),e=c.x,d=c.y,b=f.x,a=f.y,i=Math.round(g.x),h=Math.round(g.y);if(ib){i=b}}if(ha){h=a}}this.scrollTo(i,h)},destroy:function(){var b=this.getElement(),a=this.sizeMonitors;if(a){a.element.destroy();a.container.destroy()}if(b&&!b.isDestroyed){b.removeCls(this.cls);this.getContainer().removeCls(this.containerCls)}Ext.destroy(this.translatable);this.callParent(arguments)}},function(){});Ext.define("Ext.util.Draggable",{isDraggable:true,mixins:["Ext.mixin.Observable"],requires:["Ext.util.SizeMonitor","Ext.util.Translatable"],config:{cls:Ext.baseCSSPrefix+"draggable",draggingCls:Ext.baseCSSPrefix+"dragging",element:null,constraint:"container",disabled:null,direction:"both",translatable:{}},DIRECTION_BOTH:"both",DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",constructor:function(a){var b;this.sizeMonitors={};this.extraConstraint={};this.initialConfig=a;this.offset={x:0,y:0};this.listeners={dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",scope:this};if(a&&a.element){b=a.element;delete a.element;this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){a.on(this.listeners);this.sizeMonitors.element=new Ext.util.SizeMonitor({element:a,callback:this.doRefresh,scope:this});this.initConfig(this.initialConfig)},updateCls:function(a){this.getElement().addCls(a)},applyTranslatable:function(a,b){a=Ext.factory(a,Ext.util.Translatable,b);a.setElement(this.getElement());return a},setExtraConstraint:function(a){this.extraConstraint=a||{};this.refreshConstraint();return this},addExtraConstraint:function(a){Ext.merge(this.extraConstraint,a);this.refreshConstraint();return this},applyConstraint:function(b,a){this.currentConstraint=b;if(b==="container"){return Ext.merge(this.getContainerConstraint(),this.extraConstraint)}return Ext.merge({},this.extraConstraint,b)},updateConstraint:function(){this.refreshOffset()},getContainerConstraint:function(){var b=this.getContainer();if(!b){return{min:{x:-Infinity,y:-Infinity},max:{x:Infinity,y:Infinity}}}var g=this.getElement().dom,f=b.dom,c=g.offsetWidth,a=g.offsetHeight,e=f.offsetWidth,d=f.offsetHeight;return{min:{x:0,y:0},max:{x:e-c,y:d-a}}},getContainer:function(){var a=this.container;if(!a){a=this.getElement().getParent();if(a){this.sizeMonitors.container=new Ext.util.SizeMonitor({element:a,callback:this.doRefresh,scope:this});this.container=a}}return a},detachListeners:function(){this.getElement().un(this.listeners)},isAxisEnabled:function(a){var b=this.getDirection();if(a==="x"){return(b===this.DIRECTION_BOTH||b===this.DIRECTION_HORIZONTAL)}return(b===this.DIRECTION_BOTH||b===this.DIRECTION_VERTICAL)},onDragStart:function(a){if(this.getDisabled()){return false}var b=this.offset;this.fireAction("dragstart",[this,a,b.x,b.y],this.initDragStart)},initDragStart:function(b,c,a,d){this.dragStartOffset={x:a,y:d};this.isDragging=true;this.getElement().addCls(this.getDraggingCls())},onDrag:function(b){if(!this.isDragging){return}var a=this.dragStartOffset;this.fireAction("drag",[this,b,a.x+b.deltaX,a.y+b.deltaY],this.doDrag)},doDrag:function(b,c,a,d){b.setOffset(a,d)},onDragEnd:function(a){if(!this.isDragging){return}this.onDrag(a);this.isDragging=false;this.getElement().removeCls(this.getDraggingCls());this.fireEvent("dragend",this,a,this.offset.x,this.offset.y)},setOffset:function(i,h,b){var f=this.offset,a=this.getConstraint(),e=a.min,c=a.max,d=Math.min,g=Math.max;if(this.isAxisEnabled("x")&&typeof i=="number"){i=d(g(i,e.x),c.x)}else{i=f.x}if(this.isAxisEnabled("y")&&typeof h=="number"){h=d(g(h,e.y),c.y)}else{h=f.y}f.x=i;f.y=h;this.getTranslatable().translate(i,h,b)},getOffset:function(){return this.offset},refreshConstraint:function(){this.setConstraint(this.currentConstraint)},refreshOffset:function(){var a=this.offset;this.setOffset(a.x,a.y)},doRefresh:function(){this.refreshConstraint();this.getTranslatable().refresh();this.refreshOffset()},refresh:function(){var a=this.sizeMonitors;if(a.element){a.element.refresh()}if(a.container){a.container.refresh()}this.doRefresh()},enable:function(){return this.setDisabled(false)},disable:function(){return this.setDisabled(true)},destroy:function(){var b=this.sizeMonitors,a=this.getTranslatable();if(b.element){b.element.destroy()}if(b.container){b.container.destroy()}var c=this.getElement();if(c&&!c.isDestroyed){c.removeCls(this.getCls())}this.detachListeners();if(a){a.destroy()}}},function(){});Ext.define("Ext.behavior.Draggable",{extend:"Ext.behavior.Behavior",requires:["Ext.util.Draggable"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.draggable.refresh()},setConfig:function(c){var a=this.draggable,b=this.component;if(c){if(!a){b.setTranslatable(true);this.draggable=a=new Ext.util.Draggable(c);a.setTranslatable(b.getTranslatable());a.setElement(b.renderElement);a.on("destroy","onDraggableDestroy",this);if(b.isPainted()){this.onComponentPainted(b)}b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getDraggable:function(){return this.draggable},onDraggableDestroy:function(){var a=this.component;delete this.draggable;a.un(this.listeners)},onComponentDestroy:function(){var a=this.draggable;if(a){a.destroy()}}});(function(a){Ext.define("Ext.Component",{extend:"Ext.AbstractComponent",alternateClassName:"Ext.lib.Component",mixins:["Ext.mixin.Traversable"],requires:["Ext.ComponentManager","Ext.XTemplate","Ext.dom.Element","Ext.behavior.Translatable","Ext.behavior.Draggable"],xtype:"component",observableType:"component",cachedConfig:{baseCls:null,cls:null,floatingCls:null,hiddenCls:a+"item-hidden",ui:null,margin:null,padding:null,border:null,styleHtmlCls:a+"html",styleHtmlContent:null},eventedConfig:{left:null,top:null,right:null,bottom:null,width:null,height:null,minWidth:null,minHeight:null,maxWidth:null,maxHeight:null,docked:null,centered:null,hidden:null,disabled:null},config:{style:null,html:null,draggable:null,translatable:null,renderTo:null,zIndex:null,tpl:null,enterAnimation:null,exitAnimation:null,showAnimation:null,hideAnimation:null,tplWriteMode:"overwrite",data:null,disabledCls:a+"item-disabled",contentEl:null,itemId:undefined,record:null,plugins:null},listenerOptionsRegex:/^(?:delegate|single|delay|buffer|args|prepend|element)$/,alignmentRegex:/^([a-z]+)-([a-z]+)(\?)?$/,isComponent:true,floating:false,rendered:false,dockPositions:{top:true,right:true,bottom:true,left:true},innerElement:null,element:null,template:[],constructor:function(c){var d=this,b=d.config,e;d.onInitializedListeners=[];d.initialConfig=c;if(c!==undefined&&"id" in c){e=c.id}else{if("id" in b){e=b.id}else{e=d.getId()}}d.id=e;d.setId(e);Ext.ComponentManager.register(d);d.initElement();d.initConfig(d.initialConfig);d.initialize();d.triggerInitialized();if("fullscreen" in d.config){d.fireEvent("fullscreen",d)}d.fireEvent("initialize",d)},beforeInitConfig:function(b){this.beforeInitialize.apply(this,arguments)},beforeInitialize:Ext.emptyFn,initialize:Ext.emptyFn,getTemplate:function(){return this.template},getElementConfig:function(){return{reference:"element",children:this.getTemplate()}},triggerInitialized:function(){var c=this.onInitializedListeners,d=c.length,e,b;if(!this.initialized){this.initialized=true;if(d>0){for(b=0;b0){this.pressedTimeout=setTimeout(function(){if(a){a.addCls(b)}},c)}else{a.addCls(b)}}},onTouchMove:function(a){return},onRelease:function(a){this.fireAction("release",[this,a],"doRelease")},doRelease:function(a,b){if(!a.isPressed){return}a.isPressed=false;if(a.hasOwnProperty("pressedTimeout")){clearTimeout(a.pressedTimeout);delete a.pressedTimeout}a.releasedTimeout=setTimeout(function(){if(a&&a.element){a.element.removeCls(a.getPressedCls())}},10)},onTap:function(a){if(this.getDisabled()){return false}this.fireAction("tap",[this,a],"doTap")},doTap:function(c,d){var b=c.getHandler(),a=c.getScope()||c;if(!b){return}if(typeof b=="string"){b=a[b]}d.preventDefault();b.apply(a,arguments)}},function(){});Ext.define("Ext.Decorator",{extend:"Ext.Component",isDecorator:true,config:{component:{}},statics:{generateProxySetter:function(a){return function(c){var b=this.getComponent();b[a].call(b,c);return this}},generateProxyGetter:function(a){return function(){var b=this.getComponent();return b[a].call(b)}}},onClassExtended:function(c,e){if(!e.hasOwnProperty("proxyConfig")){return}var f=Ext.Class,i=e.proxyConfig,d=e.config;e.config=(d)?Ext.applyIf(d,i):i;var b,h,g,a;for(b in i){if(i.hasOwnProperty(b)){h=f.getConfigNameMap(b);g=h.set;a=h.get;e[g]=this.generateProxySetter(g);e[a]=this.generateProxyGetter(a)}}},applyComponent:function(a){return Ext.factory(a,Ext.Component)},updateComponent:function(a,b){if(b){if(this.isRendered()&&b.setRendered(false)){b.fireAction("renderedchange",[this,b,false],"doUnsetComponent",this,{args:[b]})}else{this.doUnsetComponent(b)}}if(a){if(this.isRendered()&&a.setRendered(true)){a.fireAction("renderedchange",[this,a,true],"doSetComponent",this,{args:[a]})}else{this.doSetComponent(a)}}},doUnsetComponent:function(a){if(a.renderElement.dom){this.innerElement.dom.removeChild(a.renderElement.dom)}},doSetComponent:function(a){if(a.renderElement.dom){this.innerElement.dom.appendChild(a.renderElement.dom)}},setRendered:function(b){var a;if(this.callParent(arguments)){a=this.getComponent();if(a){a.setRendered(b)}return true}return false},setDisabled:function(a){this.callParent(arguments);this.getComponent().setDisabled(a)},destroy:function(){Ext.destroy(this.getComponent());this.callParent()}});Ext.define("Ext.Img",{extend:"Ext.Component",xtype:["image","img"],config:{src:null,baseCls:Ext.baseCSSPrefix+"img",mode:"background"},beforeInitialize:function(){var a=this;a.onLoad=Ext.Function.bind(a.onLoad,a);a.onError=Ext.Function.bind(a.onError,a)},initialize:function(){var a=this;a.callParent();a.relayEvents(a.renderElement,"*");a.element.on({tap:"onTap",scope:a})},hide:function(){this.callParent();this.hiddenSrc=this.hiddenSrc||this.getSrc();this.setSrc(null)},show:function(){this.callParent();if(this.hiddenSrc){this.setSrc(this.hiddenSrc);delete this.hiddenSrc}},updateMode:function(a){if(a==="background"){if(this.imageElement){this.imageElement.destroy();delete this.imageElement;this.updateSrc(this.getSrc())}}else{this.imageElement=this.element.createChild({tag:"img"})}},onTap:function(a){this.fireEvent("tap",this,a)},onAfterRender:function(){this.updateSrc(this.getSrc())},updateSrc:function(a){var b=this,c;if(b.getMode()==="background"){c=this.imageObject||new Image()}else{c=b.imageElement.dom}this.imageObject=c;c.setAttribute("src",Ext.isString(a)?a:"");c.addEventListener("load",b.onLoad,false);c.addEventListener("error",b.onError,false)},detachListeners:function(){var a=this.imageObject;if(a){a.removeEventListener("load",this.onLoad,false);a.removeEventListener("error",this.onError,false)}},onLoad:function(a){this.detachListeners();if(this.getMode()==="background"){this.element.dom.style.backgroundImage='url("'+this.imageObject.src+'")'}this.fireEvent("load",this,a)},onError:function(a){this.detachListeners();this.fireEvent("error",this,a)},doSetWidth:function(b){var a=(this.getMode()==="background")?this.element:this.imageElement;a.setWidth(b);this.callParent(arguments)},doSetHeight:function(b){var a=(this.getMode()==="background")?this.element:this.imageElement;a.setHeight(b);this.callParent(arguments)},destroy:function(){this.detachListeners();Ext.destroy(this.imageObject);delete this.imageObject;this.callParent()}});Ext.define("Ext.Label",{extend:"Ext.Component",xtype:"label",config:{}});Ext.define("Ext.Map",{extend:"Ext.Component",xtype:"map",requires:["Ext.util.GeoLocation"],isMap:true,config:{baseCls:Ext.baseCSSPrefix+"map",useCurrentLocation:false,map:null,geo:null,mapOptions:{}},constructor:function(){this.callParent(arguments);this.options={};this.element.setVisibilityMode(Ext.Element.OFFSETS);if(!(window.google||{}).maps){this.setHtml("Google Maps API is required")}},initialize:function(){this.callParent();this.on({painted:"doResize",scope:this});this.element.on("touchstart","onTouchStart",this)},onTouchStart:function(a){a.makeUnpreventable()},applyMapOptions:function(a){return Ext.merge({},this.options,a)},updateMapOptions:function(c){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){a.setOptions(c)}},getMapOptions:function(){return Ext.merge({},this.options)},updateUseCurrentLocation:function(a){this.setGeo(a);if(!a){this.renderMap()}},applyGeo:function(a){return Ext.factory(a,Ext.util.GeoLocation,this.getGeo())},updateGeo:function(b,a){var c={locationupdate:"onGeoUpdate",locationerror:"onGeoError",scope:this};if(a){a.un(c)}if(b){b.on(c);b.updateLocation()}},doResize:function(){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){b.event.trigger(a,"resize")}},renderMap:function(){var d=this,f=(window.google||{}).maps,b=d.element,a=d.getMapOptions(),e=d.getMap(),c;if(f){if(Ext.os.is.iPad){Ext.merge({navigationControlOptions:{style:f.NavigationControlStyle.ZOOM_PAN}},a)}a=Ext.merge({zoom:12,mapTypeId:f.MapTypeId.ROADMAP},a);if(!a.hasOwnProperty("center")){a.center=new f.LatLng(37.381592,-122.135672)}if(b.dom.firstChild){Ext.fly(b.dom.firstChild).destroy()}if(e){f.event.clearInstanceListeners(e)}d.setMap(new f.Map(b.dom,a));e=d.getMap();c=f.event;c.addListener(e,"zoom_changed",Ext.bind(d.onZoomChange,d));c.addListener(e,"maptypeid_changed",Ext.bind(d.onTypeChange,d));c.addListener(e,"center_changed",Ext.bind(d.onCenterChange,d));d.fireEvent("maprender",d,e)}},onGeoUpdate:function(a){if(a){this.setMapCenter(new google.maps.LatLng(a.getLatitude(),a.getLongitude()))}},onGeoError:Ext.emptyFn,setMapCenter:function(d){var a=this,c=a.getMap(),b=(window.google||{}).maps;if(b){if(!a.isPainted()){a.un("painted","setMapCenter",this);a.on("painted","setMapCenter",this,{single:true,args:[d]});return}d=d||new b.LatLng(37.381592,-122.135672);if(d&&!(d instanceof b.LatLng)&&"longitude" in d){d=new b.LatLng(d.latitude,d.longitude)}if(!c){a.renderMap();c=a.getMap()}if(c&&d instanceof b.LatLng){c.panTo(d)}else{this.options=Ext.apply(this.getMapOptions(),{center:d})}}},onZoomChange:function(){var a=this.getMapOptions(),c=this.getMap(),b;b=(c&&c.getZoom)?c.getZoom():a.zoom||10;this.options=Ext.apply(a,{zoom:b});this.fireEvent("zoomchange",this,c,b)},onTypeChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getMapTypeId)?c.getMapTypeId():b.mapTypeId;this.options=Ext.apply(b,{mapTypeId:a});this.fireEvent("typechange",this,c,a)},onCenterChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getCenter)?c.getCenter():b.center;this.options=Ext.apply(b,{center:a});this.fireEvent("centerchange",this,c,a)},destroy:function(){Ext.destroy(this.getGeo());var a=this.getMap();if(a&&(window.google||{}).maps){google.maps.event.clearInstanceListeners(a)}this.callParent()}},function(){});Ext.define("Ext.Mask",{extend:"Ext.Component",xtype:"mask",config:{baseCls:Ext.baseCSSPrefix+"mask",transparent:false,top:0,left:0,right:0,bottom:0},initialize:function(){this.callParent();this.on({painted:"onPainted",erased:"onErased"})},onPainted:function(){this.element.on("*","onEvent",this)},onErased:function(){this.element.un("*","onEvent",this)},onEvent:function(b){var a=arguments[arguments.length-1];if(a.info.eventName==="tap"){this.fireEvent("tap",this,b);return false}if(b&&b.stopEvent){b.stopEvent()}return false},updateTransparent:function(a){this[a?"addCls":"removeCls"](this.getBaseCls()+"-transparent")}});Ext.define("Ext.LoadMask",{extend:"Ext.Mask",xtype:"loadmask",config:{message:"Loading...",messageCls:Ext.baseCSSPrefix+"mask-message",indicator:true,listeners:{painted:"onPainted",erased:"onErased"}},getTemplate:function(){var a=Ext.baseCSSPrefix;return[{reference:"innerElement",cls:a+"mask-inner",children:[{reference:"indicatorElement",cls:a+"loading-spinner-outer",children:[{cls:a+"loading-spinner",children:[{tag:"span",cls:a+"loading-top"},{tag:"span",cls:a+"loading-right"},{tag:"span",cls:a+"loading-bottom"},{tag:"span",cls:a+"loading-left"}]}]},{reference:"messageElement"}]}]},updateMessage:function(a){this.messageElement.setHtml(a)},updateMessageCls:function(b,a){this.messageElement.replaceCls(a,b)},updateIndicator:function(a){this[a?"removeCls":"addCls"](Ext.baseCSSPrefix+"indicator-hidden")},onPainted:function(){this.getParent().on({scope:this,resize:this.refreshPosition});this.refreshPosition()},onErased:function(){this.getParent().un({scope:this,resize:this.refreshPosition})},refreshPosition:function(){var c=this.getParent(),d=c.getScrollable(),a=(d)?d.getScroller():null,f=(a)?a.position:{x:0,y:0},e=c.element.getSize(),b=this.element.getSize();this.innerElement.setStyle({marginTop:Math.round(e.height-b.height+(f.y*2))+"px",marginLeft:Math.round(e.width-b.width+f.x)+"px"})}},function(){});Ext.define("Ext.Media",{extend:"Ext.Component",xtype:"media",config:{url:"",enableControls:Ext.os.is.Android?false:true,autoResume:false,autoPause:true,preload:true,loop:false,media:null,playing:false,volume:1,muted:false},initialize:function(){var a=this;a.callParent();a.on({scope:a,activate:a.onActivate,deactivate:a.onDeactivate});a.addMediaListener({play:"onPlay",pause:"onPause",ended:"onEnd",volumechange:"onVolumeChange",timeupdate:"onTimeUpdate"})},addMediaListener:function(d,b){var c=this,e=c.media.dom,f=Ext.Function.bind;if(!Ext.isObject(d)){var a=d;d={};d[a]=b}Ext.Object.each(d,function(h,g){if(typeof g!=="function"){g=c[g]}if(typeof g=="function"){g=f(g,c);e.addEventListener(h,g)}})},onPlay:function(){this.fireEvent("play",this)},onPause:function(){this.fireEvent("pause",this,this.getCurrentTime())},onEnd:function(){this.fireEvent("ended",this,this.getCurrentTime())},onVolumeChange:function(){this.fireEvent("volumechange",this,this.media.dom.volume)},onTimeUpdate:function(){this.fireEvent("timeupdate",this,this.getCurrentTime())},isPlaying:function(){return this.getPlaying()},onActivate:function(){var a=this;if(a.getAutoResume()&&!a.isPlaying()){a.play()}},onDeactivate:function(){var a=this;if(a.getAutoResume()&&a.isPlaying()){a.pause()}},updateUrl:function(a){var b=this.media.dom;b.src=a;b.load();if(this.getPlaying()){this.play()}},updateEnableControls:function(a){this.media.dom.controls=a?"controls":false},updateLoop:function(a){this.media.dom.loop=a?"loop":false},play:function(){this.media.dom.play();this.setPlaying(true)},pause:function(){this.media.dom.pause();this.setPlaying(false)},toggle:function(){if(this.isPlaying()){this.pause()}else{this.play()}},stop:function(){var a=this;a.setCurrentTime(0);a.fireEvent("stop",a);a.pause()},updateVolume:function(a){this.media.dom.volume=a},updateMuted:function(a){this.fireEvent("mutedchange",this,a);this.media.dom.muted=a},getCurrentTime:function(){return this.media.dom.currentTime},setCurrentTime:function(a){this.media.dom.currentTime=a;return a},getDuration:function(){return this.media.dom.duration},destroy:function(){var a=this;Ext.Object.each(event,function(c,b){if(typeof b!=="function"){b=a[b]}if(typeof b=="function"){b=bind(b,a);dom.removeEventListener(c,b)}})}});Ext.define("Ext.Audio",{extend:"Ext.Media",xtype:"audio",config:{cls:Ext.baseCSSPrefix+"audio"},onActivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.show()}},onDeactivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.hide()}},template:[{reference:"media",preload:"auto",tag:"audio",cls:Ext.baseCSSPrefix+"component"}]});Ext.define("Ext.Spacer",{extend:"Ext.Component",alias:"widget.spacer",config:{},constructor:function(a){a=a||{};if(!a.width){a.flex=1}this.callParent([a])}});Ext.define("Ext.Title",{extend:"Ext.Component",xtype:"title",config:{baseCls:"x-title",title:""},updateTitle:function(a){this.setHtml(a)}});Ext.define("Ext.Video",{extend:"Ext.Media",xtype:"video",config:{posterUrl:null,cls:Ext.baseCSSPrefix+"video"},template:[{reference:"ghost",classList:[Ext.baseCSSPrefix+"video-ghost"]},{tag:"video",reference:"media",classList:[Ext.baseCSSPrefix+"media"]}],initialize:function(){var a=this;a.callParent();a.media.hide();a.onBefore({erased:"onErased",scope:a});a.ghost.on({tap:"onGhostTap",scope:a});a.media.on({pause:"onPause",scope:a});if(Ext.os.is.Android4||Ext.os.is.iPad){this.isInlineVideo=true}},applyUrl:function(a){return[].concat(a)},updateUrl:function(f){var c=this,e=c.media,g=f.length,d=e.query("source"),b=d.length,a;for(a=0;a0){a.pop().destroy()}},setActiveIndex:function(b){var e=this.indicators,d=this.activeIndex,a=e[d],f=e[b],c=this.getBaseCls();if(a){a.removeCls(c,null,"active")}if(f){f.addCls(c,null,"active")}this.activeIndex=b;return this},onTap:function(f){var g=f.touch,a=this.element.getPageBox(),d=a.left+(a.width/2),b=a.top+(a.height/2),c=this.getDirection();if((c==="horizontal"&&g.pageX>=d)||(c==="vertical"&&g.pageY>=b)){this.fireEvent("next",this)}else{this.fireEvent("previous",this)}},destroy:function(){var d=this.indicators,b,c,a;for(b=0,c=d.length;bd.bottom||a.yd.right||a.x div",scope:this})},initialize:function(){this.callParent();this.doInitialize()},updateBaseCls:function(a,b){var c=this;c.callParent([a+"-container",b])},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,Ext.get(c),a,d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,Ext.get(c),a,d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtouchmove",b,Ext.get(c),a,d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtap",b,Ext.get(c),a,d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtaphold",b,Ext.get(c),a,d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemdoubletap",b,Ext.get(c),a,d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemswipe",b,Ext.get(c),a,d)},updateListItem:function(b,d){var c=this,a=c.dataview,e=a.prepareData(b.getData(true),a.getStore().indexOf(b),b);d.innerHTML=c.dataview.getItemTpl().apply(e)},addListItem:function(e,c){var h=this,d=h.dataview,a=d.prepareData(c.getData(true),d.getStore().indexOf(c),c),b=h.element,i=b.dom.childNodes,g=i.length,f;f=Ext.Element.create(this.getItemElementConfig(e,a));if(!g||e==g){f.appendTo(b)}else{f.insertBefore(i[e])}},getItemElementConfig:function(c,e){var b=this.dataview,d=b.getItemCls(),a=b.getBaseCls()+"-item";if(d){a+=" "+d}return{cls:a,html:b.getItemTpl().apply(e)}},doRemoveItemCls:function(a){var d=this.getViewItems(),c=d.length,b=0;for(;b=0;b--){c=a[f+b];c.parentNode.removeChild(c)}if(d.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(d){var g=this,b=g.dataview,c=b.getStore(),f=d.length,e,a;if(f){b.hideEmptyText()}for(e=0;eh._tmpIndex?1:-1});for(e=0;e(?:[\s]*)|(?:\s*))([\w\-]+)$/i,handledEvents:["*"],getSubscribers:function(b,a){var d=this.subscribers,c=d[b];if(!c&&a){c=d[b]={type:{$length:0},selector:[],$length:0}}return c},subscribe:function(g,f){if(this.idSelectorRegex.test(g)){return false}var e=g.match(this.optimizedSelectorRegex),a=this.getSubscribers(f,true),k=a.type,c=a.selector,d,i,j,b,h;if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=k[j];if(!b){k[j]=b={descendents:{$length:0},children:{$length:0},$length:0}}h=i?b.descendents:b.children;if(h.hasOwnProperty(d)){h[d]++;return true}h[d]=1;h.$length++;b.$length++;k.$length++}else{if(c.hasOwnProperty(g)){c[g]++;return true}c[g]=1;c.push(g)}a.$length++;return true},unsubscribe:function(g,f,k){var a=this.getSubscribers(f);if(!a){return false}var e=g.match(this.optimizedSelectorRegex),l=a.type,c=a.selector,d,i,j,b,h;k=Boolean(k);if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=l[j];if(!b){return true}h=i?b.descendents:b.children;if(!h.hasOwnProperty(d)||(!k&&--h[d]>0)){return true}delete h[d];h.$length--;b.$length--;l.$length--}else{if(!c.hasOwnProperty(g)||(!k&&--c[g]>0)){return true}delete c[g];Ext.Array.remove(c,g)}if(--a.$length===0){delete this.subscribers[f]}return true},notify:function(d,a){var c=this.getSubscribers(a),e,b;if(!c||c.$length===0){return false}e=d.substr(1);b=Ext.ComponentManager.get(e);if(b){this.dispatcher.doAddListener(this.targetType,d,a,"publish",this,{args:[a,b]},"before")}},matchesSelector:function(b,a){return Ext.ComponentQuery.is(b,a)},dispatch:function(d,b,c,a){this.dispatcher.doDispatchEvent(this.targetType,d,b,c,null,a)},publish:function(g,k){var e=this.getSubscribers(g);if(!e){return}var p=arguments[arguments.length-1],o=e.type,b=e.selector,d=Array.prototype.slice.call(arguments,2,-2),l=k.xtypesChain,s,n,t,a,m,v,r,u,h,f,q,c;for(u=0,h=l.length;u0){s=e.descendents;if(s.$length>0){if(!a){a=k.getAncestorIds()}for(q=0,c=a.length;q0){if(!t){if(a){t=a[0]}else{v=k.getParent();if(v){t=v.getId()}}}if(t){if(n.hasOwnProperty(t)){this.dispatch("#"+t+" > "+f,g,d,p)}}}}}h=b.length;if(h>0){for(u=0;uf){d=e}}c.setValue(d);d=c.getValue();c.fireEvent("spin",c,d,g);c.fireEvent("spin"+g,c,d)},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){this.setValue(this.getDefaultValue())},destroy:function(){var a=this;Ext.destroy(a.downRepeater,a.upRepeater,a.spinDownButton,a.spinUpButton);a.callParent(arguments)}},function(){});Ext.define("Ext.field.TextAreaInput",{extend:"Ext.field.Input",xtype:"textareainput",tag:"textarea"});Ext.define("Ext.field.TextArea",{extend:"Ext.field.Text",xtype:"textareafield",requires:["Ext.field.TextAreaInput"],alternateClassName:"Ext.form.TextArea",config:{ui:"textarea",autoCapitalize:false,component:{xtype:"textareainput"},maxRows:null},updateMaxRows:function(a){this.getComponent().setMaxRows(a)},doSetHeight:function(a){this.callParent(arguments);var b=this.getComponent();b.input.setHeight(a)},doSetWidth:function(b){this.callParent(arguments);var a=this.getComponent();a.input.setWidth(b)},doKeyUp:function(a){var b=a.getValue();a[b?"showClearIcon":"hideClearIcon"]()}});Ext.define("Ext.field.Url",{extend:"Ext.field.Text",xtype:"urlfield",alternateClassName:"Ext.form.Url",config:{autoCapitalize:false,component:{type:"url"}}});Ext.define("Ext.plugin.ListPaging",{extend:"Ext.Component",alias:"plugin.listpaging",config:{autoPaging:false,loadMoreText:"Load More...",noMoreRecordsText:"No More Records",loadTpl:['
    ','','','','',"
    ",'
    {message}
    '].join(""),loadMoreCmp:{xtype:"component",baseCls:Ext.baseCSSPrefix+"list-paging"},loadMoreCmpAdded:false,loadingCls:Ext.baseCSSPrefix+"loading",list:null,scroller:null,loading:false},init:function(c){var a=c.getScrollable().getScroller(),b=c.getStore();this.setList(c);this.setScroller(a);this.bindStore(c.getStore());if(b){this.disableDataViewMask(b)}c.updateStore=Ext.Function.createInterceptor(c.updateStore,this.bindStore,this);if(this.getAutoPaging()){a.on({scrollend:this.onScrollEnd,scope:this})}},bindStore:function(a,b){if(b){b.un({load:this.onStoreLoad,beforeload:this.onStoreBeforeLoad,scope:this})}if(a){a.on({load:this.onStoreLoad,beforeload:this.onStoreBeforeLoad,scope:this})}},disableDataViewMask:function(a){var b=this.getList();if(a.isAutoLoading()){b.setLoadingText(null)}else{a.on({load:{single:true,fn:function(){b.setLoadingText(null)}}})}},applyLoadTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},applyLoadMoreCmp:function(a){a=Ext.merge(a,{html:this.getLoadTpl().apply({cssPrefix:Ext.baseCSSPrefix,message:this.getLoadMoreText()}),listeners:{tap:{fn:this.loadNextPage,scope:this,element:"element"}}});return Ext.factory(a,Ext.Component,this.getLoadMoreCmp())},onScrollEnd:function(b,a,c){if(!this.getLoading()&&c>=b.maxPosition.y){if(!this.storeFullyLoaded()){this.loadNextPage()}}},updateLoading:function(a){var b=this.getLoadMoreCmp(),c=this.getLoadingCls();if(a){b.addCls(c)}else{b.removeCls(c)}},onStoreBeforeLoad:function(a){if(a.getCount()===0){this.getLoadMoreCmp().hide()}},onStoreLoad:function(a){var d=this.addLoadMoreCmp(),b=this.getLoadTpl(),c=this.storeFullyLoaded()?this.getNoMoreRecordsText():this.getLoadMoreText();this.getLoadMoreCmp().show();this.setLoading(false);if(this.scrollY){this.getScroller().scrollTo(null,this.scrollY);delete this.scrollY}d.setHtml(b.apply({cssPrefix:Ext.baseCSSPrefix,message:c}))},addLoadMoreCmp:function(){var b=this.getList(),a=this.getLoadMoreCmp();if(!this.getLoadMoreCmpAdded()){b.add(a);this.setLoadMoreCmpAdded(true)}return a},storeFullyLoaded:function(){var a=this.getList().getStore(),b=a.getTotalCount();return b!==null?a.getTotalCount()<=(a.currentPage*a.getPageSize()):false},loadNextPage:function(){var a=this.getList().getStore();this.setLoading(true);this.scrollY=this.getScroller().position.y;a.nextPage({addRecords:true})}});Ext.define("Ext.plugin.PullRefresh",{extend:"Ext.Component",alias:"plugin.pullrefresh",requires:["Ext.DateExtras"],config:{list:null,pullRefreshText:"Pull down to refresh...",releaseRefreshText:"Release to refresh...",loadingText:"Loading...",snappingAnimationDuration:150,refreshFn:null,pullTpl:['
    ','
    ','
    ','','','','',"
    ",'
    ','

    {message}

    ','
    Last Updated: {lastUpdated:date("m/d/Y h:iA")}
    ',"
    ","
    "].join("")},isRefreshing:false,currentViewState:"",initialize:function(){this.callParent();this.on({painted:"onPainted",scope:this})},init:function(f){var d=this,b=f.getStore(),e=d.getPullTpl(),c=d.element,a=f.getScrollable().getScroller();d.setList(f);d.lastUpdated=new Date();f.insert(0,d);if(b){if(b.isAutoLoading()){f.setLoadingText(null)}else{b.on({load:{single:true,fn:function(){f.setLoadingText(null)}}})}}e.overwrite(c,{message:d.getPullRefreshText(),lastUpdated:d.lastUpdated},true);d.loadingElement=c.getFirstChild();d.messageEl=c.down(".x-list-pullrefresh-message");d.updatedEl=c.down(".x-list-pullrefresh-updated > span");d.maxScroller=a.getMaxPosition();a.on({maxpositionchange:d.setMaxScroller,scroll:d.onScrollChange,scope:d})},fetchLatest:function(){var b=this.getList().getStore(),c=b.getProxy(),a;a=Ext.create("Ext.data.Operation",{page:1,start:0,model:b.getModel(),limit:b.getPageSize(),action:"read",filters:b.getRemoteFilter()?b.getFilters():[]});c.read(a,this.onLatestFetched,this)},onLatestFetched:function(d){var j=this.getList().getStore(),b=j.getData(),c=d.getRecords(),a=c.length,g=[],h,f,e;for(e=0;ethis.maxScroller.y){this.onBounceBottom(c)}},applyPullTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onBounceTop:function(d){var b=this,c=b.getList(),a=c.getScrollable().getScroller();if(!b.isReleased){if(!b.isRefreshing&&-d>=b.pullHeight+10){b.isRefreshing=true;b.setViewState("release");a.getContainer().onBefore({dragend:"onScrollerDragEnd",single:true,scope:b})}else{if(b.isRefreshing&&-d=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)},setOffset:function(c){var a=this.getAxis(),b=this.element.dom.style;c=Math.round(c);if(a==="x"){b.webkitTransform="translate3d("+c+"px, 0, 0)"}else{b.webkitTransform="translate3d(0, "+c+"px, 0)"}}});Ext.define("Ext.scroll.indicator.Default",{extend:"Ext.scroll.indicator.Abstract",config:{cls:"default"},setOffset:function(c){var b=this.getAxis(),a=this.element.dom.style;if(b==="x"){a.webkitTransform="translate3d("+c+"px, 0, 0)"}else{a.webkitTransform="translate3d(0, "+c+"px, 0)"}},applyLength:function(a){return Math.round(Math.max(0,a))},updateValue:function(f){var b=this.barLength,c=this.gapLength,d=this.getLength(),e,g,a;if(f<=0){g=0;this.updateLength(this.applyLength(d+f*b))}else{if(f>=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)}});Ext.define("Ext.scroll.indicator.ScrollPosition",{extend:"Ext.scroll.indicator.Abstract",config:{cls:"scrollposition"},getElementConfig:function(){var a=this.callParent(arguments);a.children.unshift({className:"x-scroll-bar-stretcher"});return a},updateValue:function(a){if(this.gapLength===0){if(a>1){a=a-1}this.setOffset(this.barLength*a)}else{this.setOffset(this.gapLength*a)}},setLength:function(e){var c=this.getAxis(),a=this.barLength,d=this.barElement.dom,b=this.element;this.callParent(arguments);if(c==="x"){d.scrollLeft=a;b.setLeft(a)}else{d.scrollTop=a;b.setTop(a)}},setOffset:function(d){var b=this.getAxis(),a=this.barLength,c=this.barElement.dom;d=a-d;if(b==="x"){c.scrollLeft=d}else{c.scrollTop=d}}});Ext.define("Ext.scroll.Indicator",{requires:["Ext.scroll.indicator.Default","Ext.scroll.indicator.ScrollPosition","Ext.scroll.indicator.CssTransform"],alternateClassName:"Ext.util.Indicator",constructor:function(a){if(Ext.os.is.Android2||Ext.browser.is.ChromeMobile){return new Ext.scroll.indicator.ScrollPosition(a)}else{if(Ext.os.is.iOS){return new Ext.scroll.indicator.CssTransform(a)}else{return new Ext.scroll.indicator.Default(a)}}}});Ext.define("Ext.scroll.View",{extend:"Ext.Evented",alternateClassName:"Ext.util.ScrollView",requires:["Ext.scroll.Scroller","Ext.scroll.Indicator"],config:{indicatorsUi:"dark",element:null,scroller:{},indicators:{x:{axis:"x"},y:{axis:"y"}},indicatorsHidingDelay:100,cls:Ext.baseCSSPrefix+"scroll-view"},processConfig:function(c){if(!c){return null}if(typeof c=="string"){c={direction:c}}c=Ext.merge({},c);var a=c.scroller,b;if(!a){c.scroller=a={}}for(b in c){if(c.hasOwnProperty(b)){if(!this.hasConfig(b)){a[b]=c[b];delete c[b]}}}return c},constructor:function(a){a=this.processConfig(a);this.useIndicators={x:true,y:true};this.doHideIndicators=Ext.Function.bind(this.doHideIndicators,this);this.initConfig(a)},setConfig:function(a){return this.callParent([this.processConfig(a)])},updateIndicatorsUi:function(a){var b=this.getIndicators();b.x.setUi(a);b.y.setUi(a)},applyScroller:function(a,b){return Ext.factory(a,Ext.scroll.Scroller,b)},applyIndicators:function(b,d){var a=Ext.scroll.Indicator,c=this.useIndicators;if(!b){b={}}if(!b.x){c.x=false;b.x={}}if(!b.y){c.y=false;b.y={}}return{x:Ext.factory(b.x,a,d&&d.x),y:Ext.factory(b.y,a,d&&d.y)}},updateIndicators:function(a){this.indicatorsGrid=Ext.Element.create({className:"x-scroll-bar-grid-wrapper",children:[{className:"x-scroll-bar-grid",children:[{children:[{},{children:[a.y.barElement]}]},{children:[{children:[a.x.barElement]},{}]}]}]})},updateScroller:function(a){a.on({scope:this,scrollstart:"onScrollStart",scroll:"onScroll",scrollend:"onScrollEnd",refresh:"refreshIndicators"})},isAxisEnabled:function(a){return this.getScroller().isAxisEnabled(a)&&this.useIndicators[a]},applyElement:function(a){if(a){return Ext.get(a)}},updateElement:function(c){var b=c.getFirstChild().getFirstChild(),a=this.getScroller();c.addCls(this.getCls());c.insertFirst(this.indicatorsGrid);a.setElement(b);this.refreshIndicators();return this},showIndicators:function(){var a=this.getIndicators();if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(this.isAxisEnabled("x")){a.x.show()}if(this.isAxisEnabled("y")){a.y.show()}},hideIndicators:function(){var a=this.getIndicatorsHidingDelay();if(a>0){this.indicatorsHidingTimer=setTimeout(this.doHideIndicators,a)}else{this.doHideIndicators()}},doHideIndicators:function(){var a=this.getIndicators();if(this.isAxisEnabled("x")){a.x.hide()}if(this.isAxisEnabled("y")){a.y.hide()}},onScrollStart:function(){this.onScroll.apply(this,arguments);this.showIndicators()},onScrollEnd:function(){this.hideIndicators()},onScroll:function(b,a,c){this.setIndicatorValue("x",a);this.setIndicatorValue("y",c)},setIndicatorValue:function(b,f){if(!this.isAxisEnabled(b)){return this}var a=this.getScroller(),c=a.getMaxPosition()[b],e=a.getContainerSize()[b],d;if(c===0){d=f/e;if(f>=0){d+=1}}else{if(f>c){d=1+((f-c)/e)}else{if(f<0){d=f/e}else{d=f/c}}}this.getIndicators()[b].setValue(d)},refreshIndicator:function(d){if(!this.isAxisEnabled(d)){return this}var a=this.getScroller(),b=this.getIndicators()[d],e=a.getContainerSize()[d],f=a.getSize()[d],c=e/f;b.setRatio(c);b.refresh()},refresh:function(){return this.getScroller().refresh()},refreshIndicators:function(){var a=this.getIndicators();a.x.setActive(this.isAxisEnabled("x"));a.y.setActive(this.isAxisEnabled("y"));this.refreshIndicator("x");this.refreshIndicator("y")},destroy:function(){var a=this.getElement(),b=this.getIndicators();if(a&&!a.isDestroyed){a.removeCls(this.getCls())}b.x.destroy();b.y.destroy();Ext.destroy(this.getScroller(),this.indicatorsGrid);delete this.indicatorsGrid;this.callParent(arguments)}});Ext.define("Ext.behavior.Scrollable",{extend:"Ext.behavior.Behavior",requires:["Ext.scroll.View"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.scrollView.refresh()},setConfig:function(d){var b=this.scrollView,c=this.component,f,e,a;if(d){if(!b){this.scrollView=b=new Ext.scroll.View(d);b.on("destroy","onScrollViewDestroy",this);c.setUseBodyElement(true);this.scrollerElement=a=c.innerElement;this.scrollContainer=e=a.wrap();this.scrollViewElement=f=c.bodyElement;b.setElement(f);if(c.isPainted()){this.onComponentPainted(c)}c.on(this.listeners)}else{if(Ext.isObject(d)){b.setConfig(d)}}}else{if(b){b.destroy()}}return this},getScrollView:function(){return this.scrollView},onScrollViewDestroy:function(){var b=this.component,a=this.scrollerElement;if(!a.isDestroyed){this.scrollerElement.unwrap()}this.scrollContainer.destroy();b.un(this.listeners);delete this.scrollerElement;delete this.scrollView;delete this.scrollContainer},onComponentDestroy:function(){var a=this.scrollView;if(a){a.destroy()}}});Ext.define("Ext.Container",{extend:"Ext.Component",alternateClassName:"Ext.lib.Container",requires:["Ext.layout.Layout","Ext.ItemCollection","Ext.behavior.Scrollable","Ext.Mask"],xtype:"container",eventedConfig:{activeItem:0},config:{layout:null,control:{},defaults:null,items:null,autoDestroy:true,defaultType:null,scrollable:null,useBodyElement:null,masked:null,modal:null,hideOnMaskTap:null},isContainer:true,delegateListeners:{delegate:"> component",centeredchange:"onItemCenteredChange",dockedchange:"onItemDockedChange",floatingchange:"onItemFloatingChange"},constructor:function(a){var b=this;b._items=b.items=new Ext.ItemCollection();b.innerItems=[];b.onItemAdd=b.onFirstItemAdd;b.callParent(arguments)},getElementConfig:function(){return{reference:"element",className:"x-container",children:[{reference:"innerElement",className:"x-inner"}]}},applyMasked:function(a,b){b=Ext.factory(a,Ext.Mask,b);if(b){this.add(b)}return b},mask:function(a){this.setMasked(a||true)},unmask:function(){this.setMasked(false)},applyModal:function(a,b){if(!a&&!b){return}return Ext.factory(a,Ext.Mask,b)},updateModal:function(c,a){var b={painted:"refreshModalMask",erased:"destroyModalMask"};if(c){this.on(b);c.on("destroy","onModalDestroy",this);if(this.getTop()===null&&this.getBottom()===null&&this.getRight()===null&&this.getLeft()===null&&!this.getCentered()){this.setTop(0);this.setLeft(0)}if(this.isPainted()){this.refreshModalMask()}}else{if(a){a.un("destroy","onModalDestroy",this);this.un(b)}}},onModalDestroy:function(){this.setModal(null)},refreshModalMask:function(){var b=this.getModal(),a=this.getParent();if(!this.painted){this.painted=true;if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1)}}},destroyModalMask:function(){var b=this.getModal(),a=this.getParent();if(this.painted){this.painted=false;if(b){a.remove(b,false)}}},updateZIndex:function(b){var a=this.getModal();this.callParent(arguments);if(a){a.setZIndex(b-1)}},updateHideOnMaskTap:function(b){var a=this.getModal();if(a){a[b?"on":"un"].call(a,"tap","hide",this)}},updateBaseCls:function(a,b){var c=this,d=c.getUi();if(a){this.element.addCls(a);this.innerElement.addCls(a,null,"inner");if(d){this.element.addCls(a,null,d)}}if(b){this.element.removeCls(b);this.innerElement.removeCls(a,null,"inner");if(d){this.element.removeCls(b,null,d)}}},updateUseBodyElement:function(a){if(a){this.bodyElement=this.innerElement.wrap({cls:"x-body"});this.referenceList.push("bodyElement")}},applyItems:function(a,b){if(a){this.getDefaultType();this.getDefaults();if(this.initialized&&b.length>0){this.removeAll()}this.add(a)}},applyControl:function(c){var a,b,e,d;for(a in c){d=c[a];for(b in d){e=d[b];if(Ext.isObject(e)){e.delegate=a}}d.delegate=a;this.addListener(d)}return c},onFirstItemAdd:function(){delete this.onItemAdd;this.setLayout(new Ext.layout.Layout(this,this.getLayout()||"default"));if(this.innerHtmlElement&&!this.getHtml()){this.innerHtmlElement.destroy();delete this.innerHtmlElement}this.on(this.delegateListeners);return this.onItemAdd.apply(this,arguments)},updateDefaultType:function(a){this.defaultItemClass=Ext.ClassManager.getByAlias("widget."+a)},applyDefaults:function(a){if(a){this.factoryItem=this.factoryItemWithDefaults;return a}},factoryItem:function(a){return Ext.factory(a,this.defaultItemClass)},factoryItemWithDefaults:function(c){var b=this,d=b.getDefaults(),a;if(!d){return Ext.factory(c,b.defaultItemClass)}if(c.isComponent){a=c;if(d&&c.isInnerItem()&&!b.has(a)){a.setConfig(d,true)}}else{if(d&&!c.ignoreDefaults){if(!(c.hasOwnProperty("left")&&c.hasOwnProperty("right")&&c.hasOwnProperty("top")&&c.hasOwnProperty("bottom")&&c.hasOwnProperty("docked")&&c.hasOwnProperty("centered"))){c=Ext.mergeIf({},c,d)}}a=Ext.factory(c,b.defaultItemClass)}return a},add:function(a){var e=this,b,d,c,f;a=Ext.Array.from(a);d=a.length;for(b=0;b0&&c.isInnerItem()){f=c}}if(f){this.setActiveItem(f)}return c},doAdd:function(d){var c=this,a=c.getItems(),b;if(!a.has(d)){b=a.length;a.add(d);if(d.isInnerItem()){c.insertInner(d)}d.setParent(c);c.onItemAdd(d,b)}},remove:function(d,b){var c=this,a=c.indexOf(d),e=this.getInnerItems(),f;if(b===undefined){b=c.getAutoDestroy()}if(a!==-1){if(!this.removingAll&&e.length>1&&d===this.getActiveItem()){this.on({activeitemchange:"doRemove",scope:this,single:true,order:"after",args:[d,a,b]});f=e.indexOf(d);if(f===0){this.setActiveItem(1)}else{this.setActiveItem(0)}}else{this.doRemove(d,a,b)}}return c},doRemove:function(d,a,b){var c=this;c.items.remove(d);if(d.isInnerItem()){c.removeInner(d)}c.onItemRemove(d,a,b);d.setParent(null);if(b){d.destroy()}},removeAll:function(c,f){var a=this.items,e=a.length,b=0,d;if(c===undefined){c=this.getAutoDestroy()}f=Boolean(f);this.removingAll=true;for(;b=0;b--){c.insert(a,d[b])}return c}d=this.factoryItem(d);this.doInsert(a,d);return d},doInsert:function(d,f){var e=this,b=e.items,c=b.length,a,g;g=f.isInnerItem();if(d>c){d=c}if(b[d-1]===f){return e}a=e.indexOf(f);if(a!==-1){if(a "+a)[0]||null},down:function(a){return this.query(a)[0]||null},destroy:function(){var a=this.getModal();if(a){a.destroy()}this.removeAll(true,true);Ext.destroy(this.getScrollable(),this.bodyElement);this.callParent()}},function(){this.addMember("defaultItemClass",this)});Ext.define("Ext.Panel",{extend:"Ext.Container",requires:["Ext.util.LineSegment"],alternateClassName:"Ext.lib.Panel",xtype:"panel",isPanel:true,config:{baseCls:Ext.baseCSSPrefix+"panel",bodyPadding:null,bodyMargin:null,bodyBorder:null},getElementConfig:function(){var a=this.callParent();a.children.push({reference:"tipElement",className:"x-anchor",hidden:true});return a},applyBodyPadding:function(a){if(a===true){a=5}a=Ext.dom.Element.unitizeBox(a);return a},updateBodyPadding:function(a){this.element.setStyle("padding",a)},applyBodyMargin:function(a){if(a===true){a=5}a=Ext.dom.Element.unitizeBox(a);return a},updateBodyMargin:function(a){this.element.setStyle("margin",a)},applyBodyBorder:function(a){if(a===true){a=1}a=Ext.dom.Element.unitizeBox(a);return a},updateBodyBorder:function(a){this.element.setStyle("border-width",a)},alignTo:function(m){var w=this.tipElement;w.hide();if(this.currentTipPosition){w.removeCls("x-anchor-"+this.currentTipPosition)}this.callParent(arguments);var f=Ext.util.LineSegment,d=m.isComponent?m.renderElement:m,a=this.renderElement,n=d.getPageBox(),k=a.getPageBox(),b=k.left,t=k.top,C=k.right,h=k.bottom,j=b+(k.width/2),i=t+(k.height/2),o={x:b,y:t},l={x:C,y:t},B={x:b,y:h},D={x:C,y:h},y={x:j,y:i},s=n.left+(n.width/2),q=n.top+(n.height/2),v={x:s,y:q},c=new f(y,v),g=0,A=0,e,z,r,p,x,u;w.setVisibility(false);w.show();e=w.getSize();z=e.width;r=e.height;if(c.intersects(new f(o,l))){x=Math.min(Math.max(s,b),C-(z/2));u=t;A=r+10;p="top"}else{if(c.intersects(new f(o,B))){x=b;u=Math.min(Math.max(q+(z/2),t),h);g=r+10;p="left"}else{if(c.intersects(new f(B,D))){x=Math.min(Math.max(s,b),C-(z/2));u=h;A=-r-10;p="bottom"}else{if(c.intersects(new f(l,D))){x=C;u=Math.min(Math.max(q-(z/2),t),h);g=-r-10;p="right"}}}}if(x||u){this.currentTipPosition=p;w.addCls("x-anchor-"+p);w.setLeft(x-b);w.setTop(u-t);w.setVisibility(true);this.setLeft(this.getLeft()+g);this.setTop(this.getTop()+A)}}});Ext.define("Ext.SegmentedButton",{extend:"Ext.Container",xtype:"segmentedbutton",requires:["Ext.Button"],config:{baseCls:Ext.baseCSSPrefix+"segmentedbutton",pressedCls:Ext.baseCSSPrefix+"button-pressed",allowMultiple:false,allowDepress:null,pressedButtons:null,layout:{type:"hbox",align:"stretch"},defaultType:"button"},initialize:function(){var a=this;a.callParent();a.on({delegate:"> button",scope:a,tap:"onButtonRelease"});a.onAfter({delegate:"> button",scope:a,hiddenchange:"onButtonHiddenChange"})},updateAllowMultiple:function(){if(!this.initialized&&!this.getInitialConfig().hasOwnProperty("allowDepress")){this.setAllowDepress(true)}},applyItems:function(){var e=this,f=[],d,b,c,a;e.callParent(arguments);a=this.getItems();d=a.length;for(b=0;b=0;b--){c=a.items[b];if(!c.isHidden()){c.addCls(e+"last");break}}},applyPressedButtons:function(a){var e=this,f=[],c,d,b;if(Ext.isArray(a)){d=a.length;for(b=0;bm){c.renderElement.setWidth(m)}}var j=this.spacer.renderElement.getPageBox(),k=f.getPageBox(),g=k.width-j.width,d=k.left,i=k.right,b,l,e;if(g>0){f.setWidth(j.width);b=g/2;d+=b;i-=b}l=j.left-d;e=i-j.right;if(l>0){f.setLeft(l)}else{if(e>0){f.setLeft(-e)}}f.repaint()},updateTitle:function(a){this.titleComponent.setTitle(a);this.titleBox=null;if(this.painted){this.refreshTitlePosition()}},destroy:function(){this.callParent();var a=this.sizeMonitors;a.leftBox.destroy();a.spacer.destroy();a.rightBox.destroy()}});Ext.define("Ext.Toolbar",{extend:"Ext.Container",xtype:"toolbar",requires:["Ext.Button","Ext.Title","Ext.Spacer"],isToolbar:true,config:{baseCls:Ext.baseCSSPrefix+"toolbar",ui:"dark",title:null,defaultType:"button",layout:{type:"hbox",align:"center"}},constructor:function(a){a=a||{};if(a.docked=="left"||a.docked=="right"){a.layout={type:"vbox",align:"stretch"}}this.callParent([a])},applyTitle:function(a){if(typeof a=="string"){a={title:a,centered:true}}return Ext.factory(a,Ext.Title,this.getTitle())},updateTitle:function(b,a){if(b){this.add(b);this.getLayout().setItemFlex(b,1)}if(a){a.destroy()}},showTitle:function(){var a=this.getTitle();if(a){a.show()}},hideTitle:function(){var a=this.getTitle();if(a){a.hide()}}},function(){});Ext.define("Ext.MessageBox",{extend:"Ext.Sheet",requires:["Ext.Toolbar","Ext.field.Text","Ext.field.TextArea"],config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"msgbox",iconCls:null,showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:10,defaultTextHeight:75,title:null,buttons:null,message:null,prompt:null,layout:{type:"vbox",pack:"center"}},statics:{OK:{text:"OK",itemId:"ok",ui:"action"},YES:{text:"Yes",itemId:"yes",ui:"action"},NO:{text:"No",itemId:"no"},CANCEL:{text:"Cancel",itemId:"cancel"},INFO:Ext.baseCSSPrefix+"msgbox-info",WARNING:Ext.baseCSSPrefix+"msgbox-warning",QUESTION:Ext.baseCSSPrefix+"msgbox-question",ERROR:Ext.baseCSSPrefix+"msgbox-error",OKCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"OK",itemId:"ok",ui:"action"}],YESNOCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}],YESNO:[{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}]},constructor:function(a){a=a||{};if(a.hasOwnProperty("promptConfig")){Ext.applyIf(a,{prompt:a.promptConfig});delete a.promptConfig}if(a.hasOwnProperty("multiline")||a.hasOwnProperty("multiLine")){a.prompt=a.prompt||{};Ext.applyIf(a.prompt,{multiLine:a.multiline||a.multiLine});delete a.multiline;delete a.multiLine}this.callParent([a])},applyTitle:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"top",cls:this.getBaseCls()+"-title"});return Ext.factory(a,Ext.Toolbar,this.getTitle())},updateTitle:function(a){if(a){this.add(a)}},updateButtons:function(a){var b=this;if(a){if(b.buttonsToolbar){b.buttonsToolbar.removeAll();b.buttonsToolbar.setItems(a)}else{b.buttonsToolbar=Ext.create("Ext.Toolbar",{docked:"bottom",defaultType:"button",layout:{type:"hbox",pack:"center"},ui:b.getUi(),cls:b.getBaseCls()+"-buttons",items:a});b.add(b.buttonsToolbar)}}},applyMessage:function(a){a={html:a,cls:this.getBaseCls()+"-text"};return Ext.factory(a,Ext.Component,this._message)},updateMessage:function(a){if(a){this.add(a)}},getMessage:function(){if(this._message){return this._message.getHtml()}return null},applyIconCls:function(a){a={xtype:"component",docked:"left",width:40,height:40,baseCls:Ext.baseCSSPrefix+"icon",hidden:(a)?false:true,cls:a};return Ext.factory(a,Ext.Component,this._iconCls)},updateIconCls:function(a,b){var c=this;this.getTitle();this.getButtons();if(a&&!b){this.add(a)}else{this.remove(b)}},getIconCls:function(){var b=this._iconCls,a;if(b){a=b.getCls();return(a)?a[0]:null}return null},applyPrompt:function(a){if(a){var b={label:false};if(Ext.isObject(a)){Ext.apply(b,a)}if(b.multiLine){b.height=Ext.isNumber(b.multiLine)?parseFloat(b.multiLine):this.getDefaultTextHeight();return Ext.factory(b,Ext.field.TextArea,this.getPrompt())}else{return Ext.factory(b,Ext.field.Text,this.getPrompt())}}return a},updatePrompt:function(a,b){if(a){this.add(a)}if(b){this.remove(b)}},onClick:function(c){if(c){var b=c.config.userConfig||{},d=c.getInitialConfig(),a=this.getPrompt();if(typeof b.fn=="function"){this.on({hiddenchange:function(){b.fn.call(b.scope||null,d.itemId||d.text,a?a.getValue():null,b)},single:true,scope:this})}if(b.cls){this.el.removeCls(b.cls)}if(b.input){b.input.dom.blur()}}this.hide()},show:function(f){if(!this.getParent()&&Ext.Viewport){Ext.Viewport.add(this)}if(!f){return this.callParent()}var b=Ext.Object.merge({},{value:""},f);var e=f.buttons||Ext.MessageBox.OK||[],d=[],c=f;Ext.each(e,function(g){if(!g){return}d.push(Ext.apply({userConfig:c,scope:this,handler:"onClick"},g))},this);b.buttons=d;if(b.promptConfig){}b.prompt=(b.promptConfig||b.prompt)||null;if(b.multiLine){b.prompt=b.prompt||{};b.prompt.multiLine=b.multiLine;delete b.multiLine}this.setConfig(b);var a=this.getPrompt();if(a){a.setValue(f.value||"")}this.callParent();return this},alert:function(d,c,b,a){return this.show({title:d,message:c,buttons:Ext.MessageBox.OK,promptConfig:false,fn:function(e){if(b){b.call(a,e)}},scope:a})},confirm:function(d,c,b,a){return this.show({title:d,message:c,buttons:Ext.MessageBox.YESNO,promptConfig:false,scope:a,fn:function(e){if(b){b.call(a,e)}}})},prompt:function(g,d,c,b,f,e,a){return this.show({title:g,message:d,buttons:Ext.MessageBox.OKCANCEL,scope:b,prompt:a||true,multiLine:f,value:e,fn:function(i,h){if(c){c.call(b,i,h)}}})}},function(a){Ext.onSetup(function(){Ext.Msg=new a})});Ext.define("Ext.carousel.Carousel",{extend:"Ext.Container",alternateClassName:"Ext.Carousel",xtype:"carousel",requires:["Ext.fx.easing.EaseOut","Ext.carousel.Item","Ext.carousel.Indicator"],config:{baseCls:"x-carousel",direction:"horizontal",directionLock:false,animation:{duration:250,easing:{type:"ease-out"}},indicator:true,ui:"dark",itemConfig:{},bufferSize:1,itemLength:null},itemLength:0,offset:0,flickStartOffset:0,flickStartTime:0,dragDirection:0,count:0,painted:false,activeIndex:-1,beforeInitialize:function(){this.animationListeners={animationframe:"onActiveItemAnimationFrame",animationend:"onActiveItemAnimationEnd",scope:this};this.element.on({dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",scope:this});this.on({painted:"onPainted",erased:"onErased",resize:"onSizeChange"});this.carouselItems=[];this.orderedCarouselItems=[];this.inactiveCarouselItems=[];this.hiddenTranslation=0},updateBufferSize:function(n){var l=Ext.carousel.Item,h=n*2+1,m=this.isRendered(),c=this.innerElement,g=this.carouselItems,f=g.length,e=this.getItemConfig(),d=this.getItemLength(),j=this.getDirection(),b=j==="horizontal"?"setWidth":"setHeight",a,k;for(a=f;a=a-c&&b<=a+c)},onDragStart:function(f){var d=this.getDirection(),b=f.absDeltaX,a=f.absDeltaY,c=this.getDirectionLock();this.isDragging=true;if(c){if((d==="horizontal"&&b>a)||(d==="vertical"&&a>b)){f.stopPropagation()}else{this.isDragging=false;return}}if(this.isAnimating){this.getActiveCarouselItem().getTranslatable().stopAnimation()}this.dragStartOffset=this.offset;this.dragDirection=0},onDrag:function(j){if(!this.isDragging){return}var k=this.dragStartOffset,l=this.getDirection(),m=l==="horizontal"?j.deltaX:j.deltaY,a=this.offset,i=this.flickStartTime,c=this.dragDirection,b=Ext.Date.now(),h=this.getActiveIndex(),f=this.getMaxItemIndex(),d=c,g;if((h===0&&m>0)||(h===f&&m<0)){m*=0.5}g=k+m;if(g>a){c=1}else{if(g300){this.flickStartOffset=a;this.flickStartTime=b}this.dragDirection=c;this.setOffset(g)},onDragEnd:function(j){if(!this.isDragging){return}this.onDrag(j);this.isDragging=false;var a=Ext.Date.now(),i=this.itemLength,g=i/2,f=this.offset,m=this.getActiveIndex(),c=this.getMaxItemIndex(),h=0,l=f-this.flickStartOffset,b=a-this.flickStartTime,k=this.getIndicator(),d;if(b>0&&Math.abs(l)>=10){d=l/b;if(Math.abs(d)>=1){if(d<0&&m0&&m>0){h=1}}}}if(h===0){if(m0&&f>g){h=1}}}if(k){k.setActiveIndex(m-h)}this.animationDirection=h;this.setOffsetAnimated(h*i)},applyAnimation:function(a){a.easing=Ext.factory(a.easing,Ext.fx.easing.EaseOut);return a},updateDirection:function(b){var a=this.getIndicator();this.currentAxis=(b==="horizontal")?"x":"y";if(a){a.setDirection(b)}},setOffset:function(e){var k=this.orderedCarouselItems,c=this.getBufferSize(),g=k[c],j=this.itemLength,d=this.currentAxis,a,h,b,f;this.offset=e;e+=this.itemOffset;if(g){g.translateAxis(d,e);for(f=1,b=0;f<=c;f++){h=k[c-f];if(h){b+=j;h.translateAxis(d,e-b)}}for(f=1,b=0;f<=c;f++){a=k[c+f];if(a){b+=j;a.translateAxis(d,e+b)}}}return this},setOffsetAnimated:function(c){var b=this.orderedCarouselItems[this.getBufferSize()],a=this.getIndicator();if(a){a.setActiveIndex(this.getActiveIndex()-this.animationDirection)}this.offset=c;c+=this.itemOffset;if(b){this.isAnimating=true;b.getTranslatable().on(this.animationListeners);b.translateAxis(this.currentAxis,c,this.getAnimation())}return this},onActiveItemAnimationFrame:function(k){var j=this.orderedCarouselItems,c=this.getBufferSize(),h=this.itemLength,d=this.currentAxis,e=k[d],g,a,f,b;for(f=1,b=0;f<=c;f++){g=j[c-f];if(g){b+=h;g.translateAxis(d,e-b)}}for(f=1,b=0;f<=c;f++){a=j[c+f];if(a){b+=h;a.translateAxis(d,e+b)}}},onActiveItemAnimationEnd:function(b){var c=this.getActiveIndex(),a=this.animationDirection,e=this.currentAxis,f=b[e],d=this.itemLength,g;this.isAnimating=false;b.un(this.animationListeners);if(a===-1){g=d+f}else{if(a===1){g=f-d}else{g=f}}g-=this.itemOffset;this.offset=g;this.setActiveItem(c-a)},refresh:function(){this.refreshSizing();this.refreshActiveItem()},refreshSizing:function(){var a=this.element,b=this.getItemLength(),c,d;if(this.getDirection()==="horizontal"){d=a.getWidth()}else{d=a.getHeight()}this.hiddenTranslation=-d;if(b===null){b=d;c=0}else{c=(d-b)/2}this.itemLength=b;this.itemOffset=c},refreshOffset:function(){this.setOffset(this.offset)},refreshActiveItem:function(){this.doSetActiveItem(this.getActiveItem())},getActiveIndex:function(){return this.activeIndex},refreshActiveIndex:function(){this.activeIndex=this.getInnerItemIndex(this.getActiveItem())},refreshCarouselItems:function(){var a=this.carouselItems,b,d,c;for(b=0,d=a.length;b0){for(f=1;f<=c;f++){h=q-f;if(h>=0){a=this.getInnerItemAt(h);b=a.getId();o[b]=a;p[b]=c-f}else{break}}}if(qb){this.setActiveItem(b)}else{this.rebuildInnerIndexes(a);this.refreshActiveItem()}}},rebuildInnerIndexes:function(n){var c=this.innerIndexToItem,g=this.innerIdToIndex,j=this.innerItems.slice(),h=j.length,b=this.getBufferSize(),d=this.getMaxItemIndex(),l=[],e,k,f,a,m;if(n===undefined){this.innerIndexToItem=c={};this.innerIdToIndex=g={};for(e=0;e=0&&e<=d){if(c.hasOwnProperty(e)){Ext.Array.remove(j,c[e]);continue}l.push(e)}}for(e=0,h=l.length;e ."+Ext.baseCSSPrefix+"data-item",scope:this})},initialize:function(){this.callParent();this.doInitialize()},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,a,b.indexOf(a),d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtouchmove",b,a,b.indexOf(a),d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,a,b.indexOf(a),d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtap",b,a,b.indexOf(a),d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtaphold",b,a,b.indexOf(a),d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemdoubletap",b,a,b.indexOf(a),d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemswipe",b,a,b.indexOf(a),d)},moveItemsToCache:function(j,k){var h=this,c=h.dataview,a=c.getMaxItemCache(),g=h.getViewItems(),f=h.itemCache,e=f.length,l=c.getPressedCls(),d=c.getSelectedCls(),b=k-j,m;for(;b>=0;b--){m=g[j+b];if(e!==a){h.remove(m,false);m.removeCls([l,d]);f.push(m);e++}else{m.destroy()}}if(h.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(b){var l=this,e=l.dataview,m=e.getStore(),k=b.length,a=e.getDefaultType(),h=e.getItemConfig(),g=l.itemCache,f=g.length,j=[],c,n,d;if(k){e.hideEmptyText()}for(c=0;ci._tmpIndex?1:-1});for(c=0;c{text}",pressedCls:"x-item-pressed",itemCls:null,selectedCls:"x-item-selected",triggerEvent:"itemtap",triggerCtEvent:"tap",deselectOnContainerClick:true,scrollable:true,inline:null,pressedDelay:100,loadingText:"Loading...",useComponents:null,itemConfig:{},maxItemCache:20,defaultType:"dataitem",scrollToTopOnRefresh:true},constructor:function(a){var b=this;b.hasLoadedStore=false;b.mixins.selectable.constructor.apply(b,arguments);b.callParent(arguments)},updateItemCls:function(c,b){var a=this.container;if(a){if(b){a.doRemoveItemCls(b)}if(c){a.doAddItemCls(c)}}},storeEventHooks:{beforeload:"onBeforeLoad",load:"onLoad",refresh:"refresh",addrecords:"onStoreAdd",removerecords:"onStoreRemove",updaterecord:"onStoreUpdate"},initialize:function(){this.callParent();var b=this,a;b.on(b.getTriggerCtEvent(),b.onContainerTrigger,b);a=b.container=this.add(new Ext.dataview[b.getUseComponents()?"component":"element"].Container({baseCls:this.getBaseCls()}));a.dataview=b;b.on(b.getTriggerEvent(),b.onItemTrigger,b);a.on({itemtouchstart:"onItemTouchStart",itemtouchend:"onItemTouchEnd",itemtap:"onItemTap",itemtaphold:"onItemTapHold",itemtouchmove:"onItemTouchMove",itemdoubletap:"onItemDoubleTap",itemswipe:"onItemSwipe",scope:b});if(this.getStore()){this.refresh()}},applyInline:function(a){if(Ext.isObject(a)){a=Ext.apply({},a)}return a},updateInline:function(c,b){var a=this.getBaseCls();if(b){this.removeCls([a+"-inlineblock",a+"-nowrap"])}if(c){this.addCls(a+"-inlineblock");if(Ext.isObject(c)&&c.wrap===false){this.addCls(a+"-nowrap")}else{this.removeCls(a+"-nowrap")}}},prepareData:function(c,b,a){return c},onContainerTrigger:function(b){var a=this;if(b.target!=a.element.dom){return}if(a.getDeselectOnContainerClick()&&a.getStore()){a.deselectAll()}},onItemTrigger:function(b,a){this.selectWithEvent(this.getStore().getAt(a))},doAddPressedCls:function(a){var c=this,b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.addCls(c.getPressedCls())}},onItemTouchStart:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireAction("itemtouchstart",[f,d,h,a,g],"doItemTouchStart")},doItemTouchStart:function(c,b,e,a){var d=c.getPressedDelay();if(a){if(d>0){c.pressedTimeout=Ext.defer(c.doAddPressedCls,d,c,[a])}else{c.doAddPressedCls(a)}}},onItemTouchEnd:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(this.hasOwnProperty("pressedTimeout")){clearTimeout(this.pressedTimeout);delete this.pressedTimeout}if(a&&h){h.removeCls(f.getPressedCls())}f.fireEvent("itemtouchend",f,d,h,a,g)},onItemTouchMove:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(f.hasOwnProperty("pressedTimeout")){clearTimeout(f.pressedTimeout);delete f.pressedTimeout}if(a&&h){h.removeCls(f.getPressedCls())}f.fireEvent("itemtouchmove",f,d,h,a,g)},onItemTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtap",f,d,h,a,g)},onItemTapHold:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtaphold",f,d,h,a,g)},onItemDoubleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemdoubletap",f,d,h,a,g)},onItemSwipe:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemswipe",f,d,h,a,g)},onItemSelect:function(a,b){var c=this;if(b){c.doItemSelect(c,a)}else{c.fireAction("select",[c,a],"doItemSelect")}},doItemSelect:function(c,a){if(c.container){var b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.removeCls(c.getPressedCls());b.addCls(c.getSelectedCls())}}},onItemDeselect:function(a,b){var c=this;if(c.container){if(b){c.doItemDeselect(c,a)}else{c.fireAction("deselect",[c,a,b],"doItemDeselect")}}},doItemDeselect:function(c,a){var b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.removeCls([c.getPressedCls(),c.getSelectedCls()])}},updateData:function(b){var a=this.getStore();if(!a){this.setStore(Ext.create("Ext.data.Store",{data:b}))}else{a.add(b)}},applyStore:function(b){var d=this,e=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(b){b=Ext.data.StoreManager.lookup(b);if(b&&Ext.isObject(b)&&b.isStore){b.on(e);c=b.getProxy();if(c){a=c.getReader();if(a){a.on("exception","handleException",this)}}}}return b},handleException:function(){this.setMasked(false)},updateStore:function(b,e){var d=this,f=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(e&&Ext.isObject(e)&&e.isStore){if(e.autoDestroy){e.destroy()}else{e.un(f);c=e.getProxy();if(c){a=c.getReader();if(a){a.un("exception","handleException",this)}}}}if(b){if(b.isLoaded()){this.hasLoadedStore=true}if(b.isLoading()){d.onBeforeLoad()}if(d.container){d.refresh()}}},onBeforeLoad:function(){var b=this.getScrollable();if(b){b.getScroller().stopAnimation()}var a=this.getLoadingText();if(a){this.setMasked({xtype:"loadmask",message:a});if(b){b.getScroller().setDisabled(true)}}this.hideEmptyText()},updateEmptyText:function(b){var a=this;if(b){a.emptyTextCmp=a.add({xtype:"component",cls:a.getBaseCls()+"-emptytext",html:b,hidden:true})}else{if(a.emptyTextCmp){a.remove(a.emptyTextCmp,true);delete a.emptyTextCmp}}},onLoad:function(a){var b=this.getScrollable();this.hasLoadedStore=true;this.setMasked(false);if(b){b.getScroller().setDisabled(false)}if(!a.getCount()){this.showEmptyText()}},refresh:function(){var b=this,a=b.container;if(!b.getStore()){if(!b.hasLoadedStore&&!b.getDeferEmptyText()){b.showEmptyText()}return}if(a){b.fireAction("refresh",[b],"doRefresh")}},applyItemTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onAfterRender:function(){var a=this;a.callParent(arguments);a.updateStore(a.getStore())},getViewItems:function(){return this.container.getViewItems()},doRefresh:function(f){var a=f.container,j=f.getStore(),b=j.getRange(),e=a.getViewItems(),h=b.length,l=e.length,c=h-l,g=f.getScrollable(),d,k;if(this.getScrollToTopOnRefresh()&&g){g.getScroller().scrollToTop()}if(h<1){f.onStoreClear();return}if(c<0){a.moveItemsToCache(l+c,l-1);e=a.getViewItems();l=e.length}else{if(c>0){a.moveItemsFromCache(j.getRange(l))}}for(d=0;dh.y){c=g;break}f=g}return{current:f,next:c}},doRefreshHeaders:function(){if(!this.getGrouped()||!this.container){return false}var l=this.findGroupHeaderIndices(),f=l.length,g=this.container.getViewItems(),j=this.pinHeaderInfo={offsets:[]},a=j.offsets,h=this.getScrollable(),e,k,b,d,c;if(f){for(b=0;bd.offset)||(f&&h0&&d.offset-h<=c){var k=c-(d.offset-h);this.translateHeader(k)}else{this.translateHeader(null)}},translateHeaderTransform:function(a){this.header.renderElement.dom.style.webkitTransform=(a===null)?null:"translate3d(0px, -"+a+"px, 0px)"},translateHeaderCssPosition:function(a){this.header.renderElement.dom.style.top=(a===null)?null:"-"+Math.round(a)+"px"},setActiveGroup:function(b){var a=this,c=a.header;if(c){if(b){if(!a.activeGroup||a.activeGroup.header!=b.header){c.show();if(c.element){c.setHtml(b.header.innerHTML)}}}else{if(c&&c.dom){c.hide()}}}this.activeGroup=b},onIndex:function(o,c){var r=this,s=c.toLowerCase(),b=r.getStore(),q=b.getGroups(),f=q.length,h=r.getScrollable(),n,e,m,g,k,p;if(h){n=r.getScrollable().getScroller()}else{return}for(m=0;ms){g=e;break}else{g=e}}if(h&&g){p=r.container.getViewItems()[b.indexOf(g.children[0])];n.stopAnimation();var l=n.getContainerSize().y,j=n.getSize().y,d=j-l,a=(p.offsetTop>d)?d:p.offsetTop;n.scrollTo(0,a)}},applyOnItemDisclosure:function(a){if(Ext.isFunction(a)){return{scope:this,handler:a}}return a},handleItemDisclosure:function(f){var d=this,c=f.getTarget().parentNode,b=d.container.getViewItems().indexOf(c),a=d.getStore().getAt(b);d.fireAction("disclose",[d,a,c,b,f],"doDisclose")},doDisclose:function(f,a,d,c,g){var b=f.getOnItemDisclosure();if(b&&b.handler){b.handler.call(f,a,d,c,g)}},findGroupHeaderIndices:function(){if(!this.getGrouped()){return[]}var h=this,k=h.getStore();if(!k){return[]}var b=h.container,d=k.getGroups(),m=d.length,g=b.getViewItems(),c=[],l=b.footerClsShortCache,e,a,f,n,j;b.doRemoveHeaders();b.doRemoveFooterCls();if(g.length){for(e=0;e class="x-list-item-leaf">'+a.getItemTextTpl(b)+""},this.getListConfig())}},function(){});Ext.define("Ext.form.FieldSet",{extend:"Ext.Container",alias:"widget.fieldset",requires:["Ext.Title"],config:{baseCls:Ext.baseCSSPrefix+"form-fieldset",title:null,instructions:null},applyTitle:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"top",baseCls:this.getBaseCls()+"-title"});return Ext.factory(a,Ext.Title,this.getTitle())},updateTitle:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}},applyInstructions:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"bottom",baseCls:this.getBaseCls()+"-instructions"});return Ext.factory(a,Ext.Title,this.getInstructions())},updateInstructions:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}}});Ext.define("Ext.form.Panel",{alternateClassName:"Ext.form.FormPanel",extend:"Ext.Panel",xtype:"formpanel",requires:["Ext.XTemplate","Ext.field.Checkbox","Ext.Ajax"],config:{baseCls:Ext.baseCSSPrefix+"form",standardSubmit:false,url:null,baseParams:null,submitOnAction:true,record:null,method:"post",scrollable:{translationMethod:"scrollposition"}},getElementConfig:function(){var a=this.callParent();a.tag="form";return a},initialize:function(){var a=this;a.callParent();a.on({action:"onFieldAction",scope:a});a.element.on({submit:"onSubmit",scope:a})},updateRecord:function(c){var a,b,d;if(c&&(a=c.fields)){b=this.getValues();for(d in b){if(b.hasOwnProperty(d)&&a.containsKey(d)){c.set(d,b[d])}}}return this},setRecord:function(a){var b=this;if(a&&a.data){b.setValues(a.data)}b._record=a;return this},onSubmit:function(b){var a=this;if(b&&!a.getStandardSubmit()){b.stopEvent()}a.fireAction("submit",[a,a.getValues(true),b],"doSubmit")},doSubmit:function(b,a,c){if(c){c.stopEvent()}},onFieldAction:function(a){if(this.getSubmitOnAction()){a.blur();this.submit()}},submit:function(a){var c=this,b=c.element.dom||{},d;a=Ext.apply({url:c.getUrl()||b.action,submit:false,method:c.getMethod()||b.method||"post",autoAbort:false,params:null,waitMsg:null,headers:null,success:null,failure:null},a||{});d=c.getValues(c.getStandardSubmit()||!a.submitDisabled);return c.fireAction("beforesubmit",[c,d,a],"doBeforeSubmit")},doBeforeSubmit:function(c,d,a){var b=c.element.dom||{};if(c.getStandardSubmit()){if(a.url&&Ext.isEmpty(b.action)){b.action=a.url}b.method=(a.method||b.method).toLowerCase();b.submit()}else{if(a.waitMsg){c.setMasked(a.waitMsg)}return Ext.Ajax.request({url:a.url,method:a.method,rawData:Ext.urlEncode(Ext.apply(Ext.apply({},c.getBaseParams()||{}),a.params||{},d)),autoAbort:a.autoAbort,headers:Ext.apply({"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},a.headers||{}),scope:c,callback:function(e,j,f){var h=this,i=f.responseText,g;h.setMasked(false);g=function(){if(Ext.isFunction(a.failure)){a.failure.call(a.scope||h,h,f,i)}h.fireEvent("exception",h,f)};if(j){f=Ext.decode(i);j=!!f.success;if(j){if(Ext.isFunction(a.success)){a.success.call(a.scope||h,h,f,i)}h.fireEvent("submit",h,f)}else{g()}}else{g()}}})}},setValues:function(b){var a=this.getFields(),c,e,d;b=b||{};for(c in b){if(b.hasOwnProperty(c)){e=a[c];d=b[c];if(e){if(Ext.isArray(e)){e.forEach(function(g){if(g.isRadio){g.setGroupValue(d)}else{if(Ext.isArray(b[c])){g.setChecked((d.indexOf(g.getValue())!=-1))}else{g.setChecked((d==g.getValue()))}}})}else{if(e.setChecked){e.setChecked(d)}else{e.setValue(d)}}}}}return this},getValues:function(d){var a=this.getFields(),b={},g,c,f,e;for(c in a){if(a.hasOwnProperty(c)){if(Ext.isArray(a[c])){b[c]=[];f=a[c].length;for(e=0;e1){this.pushBackButtonAnimated(this.getBackButtonText())}this.pushTitleAnimated(this.getTitleText())}else{if(this.backButtonStack.length>1){this.pushBackButton(this.getBackButtonText())}this.pushTitle(this.getTitleText())}},onViewRemove:function(a,c,b){var d=a.getLayout().getAnimation();this.endAnimation();this.backButtonStack.pop();this.refreshNavigationBarProxy();if(d&&d.isAnimation&&a.isPainted()){this.popBackButtonAnimated(this.getBackButtonText());this.popTitleAnimated(this.getTitleText())}else{this.popBackButton(this.getBackButtonText());this.popTitle(this.getTitleText())}},endAnimation:function(){var c=this.lastAnimationProperties,d,b,a;if(c){for(d in c){b=Ext.get(d);for(a in c[d].to){b.setStyle(a,c[d][a])}if(c[d].onEnd){c[d].onEnd.call(this)}}}},applyBackButton:function(a){return Ext.factory(a,Ext.Button,this.getBackButton())},updateBackButton:function(a,b){if(b){this.remove(b)}if(a){this.add(a);a.on({scope:this,tap:this.onBackButtonTap})}},onBackButtonTap:function(){this.fireEvent("back",this)},updateUseTitleForBackButtonText:function(a){var b=this.getBackButton();if(b){b.setText(this.getBackButtonText())}this.onSizeMonitorChange()},onPainted:function(){this.painted=true;this.sizeMonitor.refresh();this.onSizeMonitorChange()},onErased:function(){this.painted=false},applyItems:function(c){var e=this;if(!e.initialized){var f=e.getDefaults()||{},a,b,d;e.leftBox=a=e.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"}});e.spacer=d=e.add({xtype:"component",style:"position: relative",flex:1});e.rightBox=b=e.add({xtype:"container",style:"position: relative",layout:{type:"hbox",align:"center"}});e.titleComponent=e.add({xtype:"title",hidden:f.hidden,centered:true});e.sizeMonitor=new Ext.util.SizeMonitor({element:e.element,callback:e.onSizeMonitorChange,scope:e});e.doAdd=e.doBoxAdd;e.doInsert=e.doBoxInsert}e.callParent(arguments)},doBoxAdd:function(a){if(a.config.align=="right"){this.rightBox.add(a)}else{this.leftBox.add(a)}},doBoxInsert:function(a,b){if(b.config.align=="right"){this.rightBox.add(b)}else{this.leftBox.add(b)}},onSizeMonitorChange:function(){if(!this.rendered){return}var c=this.getBackButton(),a=this.titleComponent;if(c&&c.rendered){c.setWidth(null)}this.refreshNavigationBarProxy();var b=this.getNavigationBarProxyProperties();if(c&&c.rendered){c.setWidth(b.backButton.width)}a.setStyle("-webkit-transform",null);a.setWidth(b.title.width);a.element.setLeft(b.title.left)},getBackButtonAnimationProperties:function(){var c=this,b=c.element,h=c.getBackButton().element,e=c.titleComponent.element,g=Math.min(b.getWidth()/3,200),a=this.getNavigationBarProxyProperties(),d,f;d=e.getX()-b.getX();f=b.getX()-h.getX()-h.getWidth();d=Math.min(d,g);return{element:{from:{left:d,width:a.backButton.width,opacity:0},to:{left:0,width:a.backButton.width,opacity:1}},ghost:{from:null,to:{left:f,opacity:0}}}},getBackButtonAnimationReverseProperties:function(){var d=this,c=d.element,h=d.getBackButton().element,f=d.titleComponent.element,b=Math.min(c.getWidth()/3,200),a=this.getNavigationBarProxyProperties(),e,g;e=c.getX()-h.getX()-h.getWidth();g=f.getX()-h.getWidth();g=Math.min(g,b);return{element:{from:{left:e,width:a.backButton.width,opacity:0},to:{left:0,width:a.backButton.width,opacity:1}},ghost:{from:null,to:{left:g,opacity:0}}}},getTitleAnimationProperties:function(){var c=this,b=c.element,e=c.titleComponent.element,a=this.getNavigationBarProxyProperties(),d,f;d=b.getWidth()-e.getX();f=b.getX()-e.getX()+a.backButton.width;if((a.backButton.left+e.getWidth())>e.getX()){f=b.getX()-e.getX()-e.getWidth()}return{element:{from:{left:d,width:a.title.width,opacity:0},to:{left:a.title.left,width:a.title.width,opacity:1}},ghost:{from:e.getLeft(),to:{left:f,opacity:0}}}},getTitleAnimationReverseProperties:function(){var d=this,c=d.element,f=d.titleComponent.element,a=this.getNavigationBarProxyProperties(),b=0,e,g;b=f.getLeft();f.setLeft(0);e=c.getX()-f.getX()+a.backButton.width;g=c.getX()+c.getWidth();if((a.backButton.left+f.getWidth())>f.getX()){e=c.getX()-f.getX()-f.getWidth()}return{element:{from:{left:e,width:a.title.width,opacity:0},to:{left:a.title.left,width:a.title.width,opacity:1}},ghost:{from:b,to:{left:g,opacity:0}}}},animate:function(c,d,h,g,b){var e=this,a={element:d,easing:"ease-in-out",duration:this.getAnimation().duration,replacePrevious:true,preserveEndState:true},f;this.lastAnimationProperties[d.id]={to:g,onEnd:b};d.setLeft(0);if(Ext.os.is.Android){if(h){a.from={left:h.left,opacity:h.opacity};if(h.width){a.from.width=h.width}}if(g){a.to={left:g.left,opacity:g.opacity};if(g.width){a.to.width=g.width}}}else{if(h){a.from={transform:{translateX:h.left},opacity:h.opacity};if(h.width){a.from.width=h.width}}if(g){a.to={transform:{translateX:g.left},opacity:g.opacity};if(g.width){a.to.width=g.width}}}fn=function(){if(b){b.call(e)}if(c&&Ext.isNumber(g.width)){c.setWidth(g.width)}e.lastAnimationProperties={}};f=new Ext.fx.Animation(a);f.on("animationend",fn,this);Ext.Animator.run(f)},getBackButtonText:function(){var b=this.backButtonStack[this.backButtonStack.length-2],a=this.getUseTitleForBackButtonText();if(!a){if(b){b=this.getDefaultBackButtonText()}}return b},getTitleText:function(){return this.backButtonStack[this.backButtonStack.length-1]},pushBackButton:function(c){var b=this.getBackButton();b.setText(c);b.show();var a=this.getBackButtonAnimationProperties(),d=a.element.to;if(d.left){b.setLeft(d.left)}if(d.width){b.setWidth(d.width)}},pushBackButtonAnimated:function(f){var e=this;var d=e.getBackButton(),b=d.getText(),g=d.element,c=e.getBackButtonAnimationProperties(),a;if(b){a=e.createProxy(d)}d.setText(this.getBackButtonText());d.show();e.animate(d,g,c.element.from,c.element.to,function(){e.animating=false});if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy()})}},popBackButton:function(c){var b=this.getBackButton();b.setText(null);if(c){b.setText(this.getBackButtonText())}else{b.hide()}var a=this.getBackButtonAnimationReverseProperties(),d=a.element.to;if(d.left){b.setLeft(d.left)}if(d.width){b.setWidth(d.width)}},popBackButtonAnimated:function(f){var e=this;var d=e.getBackButton(),b=d.getText(),g=d.element,c=e.getBackButtonAnimationReverseProperties(),a;if(b){a=e.createProxy(d)}if(f&&e.backButtonStack.length){d.setText(this.getBackButtonText());d.show();e.animate(d,g,c.element.from,c.element.to)}else{d.hide()}if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy();if(!f){d.setText(null)}})}},pushTitle:function(e){var c=this.titleComponent,b=c.element,a=this.getTitleAnimationProperties(),d=a.element.to;c.setTitle(e);if(d.left){b.setLeft(d.left)}if(d.width){c.setWidth(d.width)}},pushTitleAnimated:function(h){var e=this;var d=e.getBackButton(),b=(d)?d.getText():null,g=e.titleComponent,f=g.element,c,a;if(b){a=e.createProxy(g,true)}g.setTitle(h);c=e.getTitleAnimationProperties();e.animate(g,f,c.element.from,c.element.to);if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy()})}},popTitle:function(e){var c=this.titleComponent,b=c.element,a=this.getTitleAnimationReverseProperties(),d=a.element.to;c.setTitle(e);if(d.left){b.setLeft(d.left)}if(d.width){c.setWidth(d.width)}},popTitleAnimated:function(h){var e=this;var d=e.getBackButton(),b=e.titleComponent.getTitle(),g=e.titleComponent,f=g.element,c=e.getTitleAnimationReverseProperties(),a;if(b){a=e.createProxy(g,true)}g.setTitle(h||"");e.animate(g,f,c.element.from,c.element.to,function(){e.animating=false});if(a){e.animate(null,a,c.ghost.from,c.ghost.to,function(){a.destroy()})}},createNavigationBarProxy:function(){var a=this.proxy;if(a){return}this.proxy=a=Ext.create("Ext.TitleBar",{items:[{xtype:"button",ui:"back",text:""}],title:this.backButtonStack[0]});a.backButton=a.down("button[ui=back]");Ext.getBody().appendChild(a.element);a.element.setStyle("position","absolute");a.element.setStyle("visibility","hidden");a.element.setX(0);a.element.setY(-1000)},getNavigationBarProxyProperties:function(){return{title:{left:this.proxy.titleComponent.element.getLeft(),width:this.proxy.titleComponent.element.getWidth()},backButton:{left:this.proxy.backButton.element.getLeft(),width:this.proxy.backButton.element.getWidth()}}},refreshNavigationBarProxy:function(){var c=this.proxy,b=this.element,a=this.backButtonStack,e=a[a.length-1],d=this.getBackButtonText();if(!c){this.createNavigationBarProxy();c=this.proxy}c.element.setWidth(b.getWidth());c.element.setHeight(b.getHeight());c.setTitle(e);if(d){c.backButton.setText(d);c.backButton.show()}else{c.backButton.hide()}c.refreshTitlePosition()},onBeforePop:function(b){b--;for(var a=0;a1&&d===this.getActiveItem()){this.on({activeitemchange:"doRemove",scope:this,single:true,order:"after",args:[d,a,b]});g=f.indexOf(d);if(g>0){if(e&&e.isAnimation){e.setReverse(true)}this.setActiveItem(g-1);this.getNavigationBar().onViewRemove(this,f[g],g)}}else{this.doRemove(d,a,b)}}return c},doRemove:function(){var a=this.getLayout().getAnimation();if(a&&a.isAnimation){a.setReverse(false)}this.callParent(arguments)},onItemAdd:function(b,a){this.doItemLayoutAdd(b,a);if(!this.isItemsInitializing&&b.isInnerItem()){this.setActiveItem(b);this.getNavigationBar().onViewAdd(this,b,a)}if(this.initialized){this.fireEvent("add",this,b,a)}},reset:function(){this.pop(this.getInnerItems().length)}});Ext.define("Ext.picker.Slot",{extend:"Ext.DataView",xtype:"pickerslot",alternateClassName:"Ext.Picker.Slot",requires:["Ext.XTemplate","Ext.data.Store","Ext.Component","Ext.data.StoreManager"],isSlot:true,config:{title:null,showTitle:true,cls:Ext.baseCSSPrefix+"picker-slot",name:null,value:null,flex:1,align:"left",displayField:"text",valueField:"value",scrollable:{direction:"vertical",indicators:false,momentumEasing:{minVelocity:2},slotSnapEasing:{duration:100}}},constructor:function(){this.selectedIndex=0;this.callParent(arguments)},applyTitle:function(a){if(a){a=Ext.create("Ext.Component",{cls:Ext.baseCSSPrefix+"picker-slot-title",docked:"top",html:a})}return a},updateTitle:function(b,a){if(b){this.add(b);this.setupBar()}if(a){this.remove(a)}},updateShowTitle:function(a){var b=this.getTitle();if(b){b[a?"show":"hide"]();this.setupBar()}},updateDisplayField:function(a){this.setItemTpl('
    '+Ext.baseCSSPrefix+'picker-invalid">{'+a+"}
    ")},updateAlign:function(a,c){var b=this.element;b.addCls(Ext.baseCSSPrefix+"picker-"+a);b.removeCls(Ext.baseCSSPrefix+"picker-"+c)},applyData:function(d){var f=[],c=d&&d.length,a,b,e;if(d&&Ext.isArray(d)&&c){for(a=0;a{'+this.getDisplayField()+"}",listeners:{select:this.onListSelect,itemtap:this.onListTap,scope:this}}},a))}return this.listPanel},onMaskTap:function(){if(this.getDisabled()){return false}this.showPicker();return false},showPicker:function(){if(this.getStore().getCount()===0){return}if(this.getReadOnly()){return}this.isFocused=true;if(this.getUsePicker()){var e=this.getPhonePicker(),d=this.getName(),h={};h[d]=this.record.get(this.getValueField());e.setValue(h);if(!e.getParent()){Ext.Viewport.add(e)}e.show()}else{var f=this.getTabletPicker(),g=f.down("list"),b=g.getStore(),c=b.find(this.getValueField(),this.getValue(),null,null,null,true),a=b.getAt((c==-1)?0:c);if(!f.getParent()){Ext.Viewport.add(f)}f.showBy(this.getComponent());g.select(a,null,true)}},onListSelect:function(c,a){var b=this;if(a){b.setValue(a)}},onListTap:function(){this.listPanel.hide({type:"fade",out:true,scope:this})},onPickerChange:function(d,f){var e=this,g=f[e.getName()],b=e.getStore(),c=b.find(e.getValueField(),g,null,null,null,true),a=b.getAt(c);e.setValue(a)},updateOptions:function(b){var a=this.getStore();if(!b){a.clearData()}else{a.setData(b);this.onStoreDataChanged(a)}},applyStore:function(a){if(a===true){a=Ext.create("Ext.data.Store",{fields:[this.getValueField(),this.getDisplayField()]})}if(a){a=Ext.data.StoreManager.lookup(a);a.on({scope:this,addrecords:this.onStoreDataChanged,removerecords:this.onStoreDataChanged,updaterecord:this.onStoreDataChanged,refresh:this.onStoreDataChanged})}return a},updateStore:function(a){if(a){this.onStoreDataChanged(a)}},onStoreDataChanged:function(a){var c=this.getInitialConfig(),b=this.getValue();if(Ext.isDefined(b)){this.updateValue(this.applyValue(b))}if(this.getValue()===null){if(c.hasOwnProperty("value")){this.setValue(c.value)}if(this.getValue()===null){if(a.getCount()>0){this.setValue(a.getAt(0))}}}},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){var b=this.getStore(),a=(this.originalValue)?this.originalValue:b.getAt(0);if(b&&a){this.setValue(a)}return this},onFocus:function(a){this.fireEvent("focus",this,a);this.isFocused=true;this.showPicker()},destroy:function(){this.callParent(arguments);Ext.destroy(this.listPanel,this.picker,this.hiddenField)}});Ext.define("Ext.picker.Date",{extend:"Ext.picker.Picker",xtype:"datepicker",alternateClassName:"Ext.DatePicker",requires:["Ext.DateExtras"],config:{yearFrom:1980,yearTo:new Date().getFullYear(),monthText:"Month",dayText:"Day",yearText:"Year",slotOrder:["month","day","year"]},initialize:function(){this.callParent();this.on({scope:this,delegate:"> slot",slotpick:this.onSlotPick})},setValue:function(b,a){if(Ext.isDate(b)){b={day:b.getDate(),month:b.getMonth()+1,year:b.getFullYear()}}this.callParent([b,a])},getValue:function(){var h={},a,g,c,f,e=this.getItems().items,d=e.length,j,b;for(b=0;bf){e=m;m=f;f=e}for(d=m;d<=f;d++){g.push({text:d,value:d})}a=this.getDaysInMonth(1,new Date().getFullYear());for(d=0;d thumb",dragstart:"onThumbDragStart",drag:"onThumbDrag",dragend:"onThumbDragEnd"});this.on({painted:"refresh",resize:"refresh"})},factoryThumb:function(){return Ext.factory(this.getThumbConfig(),Ext.slider.Thumb)},getThumbs:function(){return this.innerItems},getThumb:function(a){if(typeof a!="number"){a=0}return this.innerItems[a]},refreshOffsetValueRatio:function(){var b=this.getMaxValue()-this.getMinValue(),a=this.elementWidth-this.thumbWidth;this.offsetValueRatio=a/b},refreshElementWidth:function(){this.elementWidth=this.element.dom.offsetWidth;this.thumbWidth=this.getThumb(0).getElementWidth()},refresh:function(){this.refreshElementWidth();this.refreshValue()},setActiveThumb:function(b){var a=this.activeThumb;if(a&&a!==b){a.setZIndex(null)}this.activeThumb=b;b.setZIndex(2);return this},onThumbDragStart:function(a,b){if(b.absDeltaX<=b.absDeltaY){return false}else{b.stopPropagation()}if(this.getAllowThumbsOverlapping()){this.setActiveThumb(a)}this.dragStartValue=this.getValue()[this.getThumbIndex(a)];this.fireEvent("dragstart",this,a,this.dragStartValue,b)},onThumbDrag:function(c,g,a){var d=this.getThumbIndex(c),f=this.offsetValueRatio,b=this.constrainValue(a/f);g.stopPropagation();this.setIndexValue(d,b);this.fireEvent("drag",this,c,this.getValue(),g);return false},setIndexValue:function(d,g,f){var c=this.getThumb(d),b=this.getValue(),e=this.offsetValueRatio,a=c.getDraggable();a.setOffset(g*e,null,f);b[d]=this.constrainValue(a.getOffset().x/e)},onThumbDragEnd:function(a,f){this.refreshThumbConstraints(a);var c=this.getThumbIndex(a),d=this.getValue()[c],b=this.dragStartValue;this.fireEvent("dragend",this,a,this.getValue(),f);if(b!==d){this.fireEvent("change",this,a,d,b)}},getThumbIndex:function(a){return this.getThumbs().indexOf(a)},refreshThumbConstraints:function(d){var b=this.getAllowThumbsOverlapping(),a=d.getDraggable().getOffset().x,c=this.getThumbs(),e=this.getThumbIndex(d),g=c[e-1],h=c[e+1],f=this.thumbWidth;if(g){g.getDraggable().addExtraConstraint({max:{x:a-((b)?0:f)}})}if(h){h.getDraggable().addExtraConstraint({min:{x:a+((b)?0:f)}})}},onTap:function(j){if(this.isDisabled()){return}var k=Ext.get(j.target);if(!k||k.hasCls("x-thumb")){return}var n=j.touch.point.x,h=this.element,c=h.getX(),d=n-c-(this.thumbWidth/2),o=this.constrainValue(d/this.offsetValueRatio),r=this.getValue(),q=Infinity,m=r.length,g,f,l,p,b,a;if(m===1){p=0}else{for(g=0;g=(a/2)){e+=(c>0)?a:-a}e=Math.max(d,e);e=Math.min(f,e);return e},setThumbsCount:function(e){var a=this.getThumbs(),f=a.length,c,d,b;if(f>e){for(c=0,d=f-e;c0,b=d.getMaxValueCls(),e=d.getMinValueCls();this.element.addCls(g?b:e);this.element.removeCls(g?e:b)}});Ext.define("Ext.field.Toggle",{extend:"Ext.field.Slider",xtype:"togglefield",alternateClassName:"Ext.form.Toggle",requires:["Ext.slider.Toggle"],config:{cls:"x-toggle-field"},proxyConfig:{minValueCls:"x-toggle-off",maxValueCls:"x-toggle-on"},applyComponent:function(a){return Ext.factory(a,Ext.slider.Toggle)},setValue:function(a){if(a===true){a=1}this.getComponent().setValue(a);return this},toggle:function(){var a=this.getValue();this.setValue((a==1)?0:1);return this}});Ext.define("Ext.tab.Tab",{extend:"Ext.Button",xtype:"tab",alternateClassName:"Ext.Tab",isTab:true,config:{baseCls:Ext.baseCSSPrefix+"tab",pressedCls:Ext.baseCSSPrefix+"tab-pressed",activeCls:Ext.baseCSSPrefix+"tab-active",active:false,title:" "},template:[{tag:"span",reference:"badgeElement",hidden:true},{tag:"span",className:Ext.baseCSSPrefix+"button-icon",reference:"iconElement",style:"visibility: hidden !important"},{tag:"span",reference:"textElement",hidden:true}],updateTitle:function(a){this.setText(a)},hideIconElement:function(){this.iconElement.dom.style.setProperty("visibility","hidden","!important")},showIconElement:function(){this.iconElement.dom.style.setProperty("visibility","visible","!important")},updateActive:function(c,b){var a=this.getActiveCls();if(c&&!b){this.element.addCls(a);this.fireEvent("activate",this)}else{if(b){this.element.removeCls(a);this.fireEvent("deactivate",this)}}}},function(){this.override({activate:function(){this.setActive(true)},deactivate:function(){this.setActive(false)}})});Ext.define("Ext.tab.Bar",{extend:"Ext.Toolbar",alternateClassName:"Ext.TabBar",xtype:"tabbar",requires:["Ext.tab.Tab"],config:{baseCls:Ext.baseCSSPrefix+"tabbar",defaultType:"tab",layout:{type:"hbox",align:"middle"}},eventedConfig:{activeTab:null},initialize:function(){var a=this;a.callParent();a.on({tap:"onTabTap",delegate:"> tab",scope:a})},onTabTap:function(a){this.setActiveTab(a)},applyActiveTab:function(a,c){if(!a&&a!==0){return}var b=this.parseActiveTab(a);if(!b){return}return b},doSetDocked:function(a){var c=this.getLayout(),b=a=="bottom"?"center":"left";if(c.isLayout){c.setPack(b)}else{c.pack=(c&&c.pack)?c.pack:b}},doSetActiveTab:function(b,a){if(b){b.setActive(true)}if(a){a.setActive(false)}},parseActiveTab:function(a){if(typeof a=="number"){return this.getInnerItems()[a]}else{if(typeof a=="string"){a=Ext.getCmp(a)}}return a}});Ext.define("Ext.tab.Panel",{extend:"Ext.Container",xtype:"tabpanel",alternateClassName:"Ext.TabPanel",requires:["Ext.tab.Bar"],config:{ui:"dark",tabBar:true,tabBarPosition:"top",layout:{type:"card",animation:{type:"slide",direction:"left"}},cls:Ext.baseCSSPrefix+"tabpanel"},delegateListeners:{delegate:"> component",centeredchange:"onItemCenteredChange",dockedchange:"onItemDockedChange",floatingchange:"onItemFloatingChange",disabledchange:"onItemDisabledChange"},initialize:function(){this.callParent();this.on({order:"before",activetabchange:"doTabChange",delegate:"> tabbar",scope:this})},applyScrollable:function(){return false},updateUi:function(a,b){this.callParent(arguments);if(this.initialized){this.getTabBar().setUi(a)}},doSetActiveItem:function(d,j){if(d){var f=this.getInnerItems(),g=f.indexOf(j),i=f.indexOf(d),e=g>i,c=this.getLayout().getAnimation(),b=this.getTabBar(),h=b.parseActiveTab(g),a=b.parseActiveTab(i);if(c&&c.setReverse){c.setReverse(e)}this.callParent(arguments);if(i!=-1){this.getTabBar().setActiveTab(i);if(h){h.setActive(false)}if(a){a.setActive(true)}}}},doTabChange:function(a,b){this.setActiveItem(a.indexOf(b))},applyTabBar:function(a){if(a===true){a={}}if(a){Ext.applyIf(a,{ui:this.getUi(),docked:this.getTabBarPosition()})}return Ext.factory(a,Ext.tab.Bar,this.getTabBar())},updateTabBar:function(a){if(a){this.add(a);this.setTabBarPosition(a.getDocked())}},updateTabBarPosition:function(b){var a=this.getTabBar();if(a){a.setDocked(b)}},onItemAdd:function(e){var k=this;if(!e.isInnerItem()){return k.callParent(arguments)}var c=k.getTabBar(),o=e.getInitialConfig(),d=o.tab||{},g=o.title,i=o.iconCls,j=o.hidden,n=o.disabled,p=o.badgeText,b=k.getInnerItems(),h=b.indexOf(e),l=c.getItems(),a=k.getInnerItems(),m=(l.length>=a.length)&&l.getAt(h),f;if(g&&!d.title){d.title=g}if(i&&!d.iconCls){d.iconCls=i}if(j&&!d.hidden){d.hidden=j}if(n&&!d.disabled){d.disabled=n}if(p&&!d.badgeText){d.badgeText=p}f=Ext.factory(d,Ext.tab.Tab,m);if(!m){c.insert(h,f)}e.tab=f;k.callParent(arguments)},onItemDisabledChange:function(a,b){if(a&&a.tab){a.tab.setDisabled(b)}},onItemRemove:function(b,a){this.getTabBar().remove(b.tab,this.getAutoDestroy());this.callParent(arguments)}},function(){});Ext.define("Ext.table.Cell",{extend:"Ext.Container",xtype:"tablecell",config:{baseCls:"x-table-cell"},getElementConfig:function(){var a=this.callParent();a.children.length=0;return a}});Ext.define("Ext.table.Row",{extend:"Ext.table.Cell",xtype:"tablerow",config:{baseCls:"x-table-row",defaultType:"tablecell"}});Ext.define("Ext.table.Table",{extend:"Ext.Container",requires:["Ext.table.Row"],xtype:"table",config:{baseCls:"x-table",defaultType:"tablerow"},cachedConfig:{fixedLayout:false},fixedLayoutCls:"x-table-fixed",updateFixedLayout:function(a){this.innerElement[a?"addCls":"removeCls"](this.fixedLayoutCls)}});Ext.define("Ext.viewport.Default",{extend:"Ext.Container",xtype:"viewport",PORTRAIT:"portrait",LANDSCAPE:"landscape",requires:["Ext.LoadMask"],config:{autoMaximize:false,autoBlurInput:true,preventPanning:true,preventZooming:true,autoRender:true,layout:"card",width:"100%",height:"100%"},isReady:false,isViewport:true,isMaximizing:false,id:"ext-viewport",isInputRegex:/^(input|textarea|select|a)$/i,focusedElement:null,fullscreenItemCls:Ext.baseCSSPrefix+"fullscreen",constructor:function(a){var b=Ext.Function.bind;this.doPreventPanning=b(this.doPreventPanning,this);this.doPreventZooming=b(this.doPreventZooming,this);this.doBlurInput=b(this.doBlurInput,this);this.maximizeOnEvents=["ready","orientationchange"];this.orientation=this.determineOrientation();this.windowWidth=this.getWindowWidth();this.windowHeight=this.getWindowHeight();this.windowOuterHeight=this.getWindowOuterHeight();if(!this.stretchHeights){this.stretchHeights={}}this.callParent([a]);if(this.supportsOrientation()){this.addWindowListener("orientationchange",b(this.onOrientationChange,this))}else{this.addWindowListener("resize",b(this.onResize,this))}document.addEventListener("focus",b(this.onElementFocus,this),true);document.addEventListener("blur",b(this.onElementBlur,this),true);Ext.onDocumentReady(this.onDomReady,this);this.on("ready",this.onReady,this,{single:true});this.getEventDispatcher().addListener("component","*","fullscreen","onItemFullscreenChange",this);return this},onDomReady:function(){this.isReady=true;this.updateSize();this.fireEvent("ready",this)},onReady:function(){if(this.getAutoRender()){this.render()}},onElementFocus:function(a){this.focusedElement=a.target},onElementBlur:function(){this.focusedElement=null},render:function(){if(!this.rendered){var a=Ext.getBody(),b=Ext.baseCSSPrefix,h=[],d=Ext.os,g=d.name.toLowerCase(),f=Ext.browser.name.toLowerCase(),e=d.version.getMajor(),c=this.getOrientation();this.renderTo(a);h.push(b+d.deviceType.toLowerCase());if(d.is.iPad){h.push(b+"ipad")}h.push(b+g);h.push(b+f);if(e){h.push(b+g+"-"+e)}if(d.is.BlackBerry){h.push(b+"bb")}if(Ext.browser.is.Standalone){h.push(b+"standalone")}h.push(b+c);a.addCls(h)}},applyAutoBlurInput:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doBlurInput,false)}else{this.removeWindowListener(b,this.doBlurInput,false)}return a},applyAutoMaximize:function(a){if(a){this.on("ready","doAutoMaximizeOnReady",this,{single:true});this.on("orientationchange","doAutoMaximizeOnOrientationChange",this)}else{this.un("ready","doAutoMaximizeOnReady",this);this.un("orientationchange","doAutoMaximizeOnOrientationChange",this)}return a},applyPreventPanning:function(a){if(a){this.addWindowListener("touchmove",this.doPreventPanning,false)}else{this.removeWindowListener("touchmove",this.doPreventPanning,false)}return a},applyPreventZooming:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doPreventZooming,false)}else{this.removeWindowListener(b,this.doPreventZooming,false)}return a},doAutoMaximizeOnReady:function(){var a=arguments[arguments.length-1];a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();a.resume();this.fireEvent("ready",this)},this,{single:true});this.maximize()},doAutoMaximizeOnOrientationChange:function(){var a=arguments[arguments.length-1],b=a.firingArguments;a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();b[1]=this.windowWidth;b[2]=this.windowHeight;a.resume()},this,{single:true});this.maximize()},doBlurInput:function(b){var a=b.target,c=this.focusedElement;if(c&&!this.isInputRegex.test(a.tagName)){delete this.focusedElement;c.blur()}},doPreventPanning:function(a){a.preventDefault()},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},addWindowListener:function(b,c,a){window.addEventListener(b,c,Boolean(a))},removeWindowListener:function(b,c,a){window.removeEventListener(b,c,Boolean(a))},doAddListener:function(a,d,c,b){if(a==="ready"&&this.isReady&&!this.isMaximizing){d.call(c);return this}this.mixins.observable.doAddListener.apply(this,arguments)},supportsOrientation:function(){return Ext.feature.has.Orientation},onResize:function(){var c=this.windowWidth,f=this.windowHeight,e=this.getWindowWidth(),a=this.getWindowHeight(),d=this.getOrientation(),b=this.determineOrientation();if((c!==e||f!==a)&&d!==b){this.fireOrientationChangeEvent(b,d)}},onOrientationChange:function(){var b=this.getOrientation(),a=this.determineOrientation();if(a!==b){this.fireOrientationChangeEvent(a,b)}},fireOrientationChangeEvent:function(b,c){var a=Ext.baseCSSPrefix;Ext.getBody().replaceCls(a+c,a+b);this.orientation=b;this.updateSize();this.fireEvent("orientationchange",this,b,this.windowWidth,this.windowHeight)},updateSize:function(b,a){this.windowWidth=b!==undefined?b:this.getWindowWidth();this.windowHeight=a!==undefined?a:this.getWindowHeight();return this},waitUntil:function(h,e,g,a,f){if(!a){a=50}if(!f){f=2000}var c=this,b=0;setTimeout(function d(){b+=a;if(h.call(c)===true){if(e){e.call(c)}}else{if(b>=f){if(g){g.call(c)}}else{setTimeout(d,a)}}},a)},maximize:function(){this.fireMaximizeEvent()},fireMaximizeEvent:function(){this.updateSize();this.fireEvent("maximize",this)},doSetHeight:function(a){Ext.getBody().setHeight(a);this.callParent(arguments)},doSetWidth:function(a){Ext.getBody().setWidth(a);this.callParent(arguments)},scrollToTop:function(){window.scrollTo(0,-1)},getWindowWidth:function(){return window.innerWidth},getWindowHeight:function(){return window.innerHeight},getWindowOuterHeight:function(){return window.outerHeight},getWindowOrientation:function(){return window.orientation},getOrientation:function(){return this.orientation},getSize:function(){return{width:this.windowWidth,height:this.windowHeight}},determineOrientation:function(){var b=this.PORTRAIT,a=this.LANDSCAPE;if(this.supportsOrientation()){if(this.getWindowOrientation()%180===0){return b}return a}else{if(this.getWindowHeight()>=this.getWindowWidth()){return b}return a}},onItemFullscreenChange:function(a){a.addCls(this.fullscreenItemCls);this.add(a)}});Ext.define("Ext.viewport.Android",{extend:"Ext.viewport.Default",constructor:function(){this.on("orientationchange","doFireOrientationChangeEvent",this,{prepend:true});this.on("orientationchange","hideKeyboardIfNeeded",this,{prepend:true});return this.callParent(arguments)},getDummyInput:function(){var a=this.dummyInput,c=this.focusedElement,b=Ext.fly(c).getPageBox();if(!a){this.dummyInput=a=document.createElement("input");a.style.position="absolute";a.style.opacity="0";document.body.appendChild(a)}a.style.left=b.left+"px";a.style.top=b.top+"px";a.style.display="";return a},doBlurInput:function(c){var b=c.target,d=this.focusedElement,a;if(d&&!this.isInputRegex.test(b.tagName)){a=this.getDummyInput();delete this.focusedElement;a.focus();setTimeout(function(){a.style.display="none"},100)}},hideKeyboardIfNeeded:function(){var a=arguments[arguments.length-1],b=this.focusedElement;if(b){delete this.focusedElement;a.pause();if(Ext.os.version.lt("4")){b.style.display="none"}else{b.blur()}setTimeout(function(){b.style.display="";a.resume()},1000)}},doFireOrientationChangeEvent:function(){var a=arguments[arguments.length-1];this.orientationChanging=true;a.pause();this.waitUntil(function(){return this.getWindowOuterHeight()!==this.windowOuterHeight},function(){this.windowOuterHeight=this.getWindowOuterHeight();this.updateSize();a.firingArguments[1]=this.windowWidth;a.firingArguments[2]=this.windowHeight;a.resume();this.orientationChanging=false},function(){});return this},applyAutoMaximize:function(a){this.callParent(arguments);this.on("add","fixSize",this,{single:true});if(!a){this.on("ready","fixSize",this,{single:true});this.onAfter("orientationchange","doFixSize",this)}else{this.un("ready","fixSize",this);this.unAfter("orientationchange","doFixSize",this)}},fixSize:function(){this.doFixSize()},doFixSize:function(){this.setHeight(this.getWindowHeight())},getActualWindowOuterHeight:function(){return Math.round(this.getWindowOuterHeight()/window.devicePixelRatio)},maximize:function(){var c=this.stretchHeights,b=this.orientation,a;a=c[b];if(!a){c[b]=a=this.getActualWindowOuterHeight()}if(!this.addressBarHeight){this.addressBarHeight=a-this.getWindowHeight()}this.setHeight(a);var d=Ext.Function.bind(this.isHeightMaximized,this,[a]);this.scrollToTop();this.waitUntil(d,this.fireMaximizeEvent,this.fireMaximizeEvent)},isHeightMaximized:function(a){this.scrollToTop();return this.getWindowHeight()===a}},function(){if(!Ext.os.is.Android){return}var a=Ext.os.version,b=Ext.browser.userAgent,c=/(htc|desire|incredible|ADR6300)/i.test(b)&&a.lt("2.3");if(c){this.override({constructor:function(d){if(!d){d={}}d.autoMaximize=false;this.watchDogTick=Ext.Function.bind(this.watchDogTick,this);setInterval(this.watchDogTick,1000);return this.callParent([d])},watchDogTick:function(){this.watchDogLastTick=Ext.Date.now()},doPreventPanning:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)},doPreventZooming:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)}})}if(a.match("2")){this.override({onReady:function(){this.addWindowListener("resize",Ext.Function.bind(this.onWindowResize,this));this.callParent(arguments)},scrollToTop:function(){document.body.scrollTop=100},onWindowResize:function(){var e=this.windowWidth,g=this.windowHeight,f=this.getWindowWidth(),d=this.getWindowHeight();if(this.getAutoMaximize()&&!this.isMaximizing&&!this.orientationChanging&&window.scrollY===0&&e===f&&d=g-this.addressBarHeight)||!this.focusedElement)){this.scrollToTop()}},fixSize:function(){var d=this.getOrientation(),f=window.outerHeight,g=window.outerWidth,e;if(d==="landscape"&&(f=g)){e=this.getActualWindowOuterHeight()}else{e=this.getWindowHeight()}this.waitUntil(function(){return e>this.getWindowHeight()},this.doFixSize,this.doFixSize,50,1000)}})}else{if(a.gtEq("3.1")){this.override({isHeightMaximized:function(d){this.scrollToTop();return this.getWindowHeight()===d-1}})}else{if(a.match("3")){this.override({isHeightMaximized:function(){this.scrollToTop();return true}})}}}if(a.gtEq("4")){this.override({doBlurInput:Ext.emptyFn})}});Ext.define("Ext.viewport.Ios",{extend:"Ext.viewport.Default",isFullscreen:function(){return this.isHomeScreen()},isHomeScreen:function(){return window.navigator.standalone===true},constructor:function(){this.callParent(arguments);if(this.getAutoMaximize()&&!this.isFullscreen()){this.addWindowListener("touchstart",Ext.Function.bind(this.onTouchStart,this))}},maximize:function(){if(this.isFullscreen()){return this.callParent()}var c=this.stretchHeights,b=this.orientation,d=this.getWindowHeight(),a=c[b];if(window.scrollY>0){this.scrollToTop();if(!a){c[b]=a=this.getWindowHeight()}this.setHeight(a);this.fireMaximizeEvent()}else{if(!a){a=this.getScreenHeight()}this.setHeight(a);this.waitUntil(function(){this.scrollToTop();return d!==this.getWindowHeight()},function(){if(!c[b]){a=c[b]=this.getWindowHeight();this.setHeight(a)}this.fireMaximizeEvent()},function(){a=c[b]=this.getWindowHeight();this.setHeight(a);this.fireMaximizeEvent()},50,1000)}},getScreenHeight:function(){return window.screen[this.orientation===this.PORTRAIT?"height":"width"]},onElementFocus:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){clearTimeout(this.scrollToTopTimer)}this.callParent(arguments)},onElementBlur:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){this.scrollToTopTimer=setTimeout(this.scrollToTop,500)}this.callParent(arguments)},onTouchStart:function(){if(this.focusedElement===null){this.scrollToTop()}},scrollToTop:function(){window.scrollTo(0,0)}},function(){if(!Ext.os.is.iOS){return}if(Ext.os.version.lt("3.2")){this.override({constructor:function(){var a=this.stretchHeights={};a[this.PORTRAIT]=416;a[this.LANDSCAPE]=268;return this.callOverridden(arguments)}})}if(Ext.os.version.lt("5")){this.override({fieldMaskClsTest:"-field-mask",doPreventZooming:function(b){var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&a.className.indexOf(this.fieldMaskClsTest)==-1){b.preventDefault()}}})}if(Ext.os.is.iPad){this.override({isFullscreen:function(){return true}})}});Ext.define("Ext.viewport.Viewport",{requires:["Ext.viewport.Ios","Ext.viewport.Android"],constructor:function(b){var c=Ext.os.name,d,a;switch(c){case"Android":d="Android";break;case"iOS":d="Ios";break;default:d="Default"}a=Ext.create("Ext.viewport."+d,b);return a}});Ext.define("Ext.event.recognizer.Swipe",{extend:"Ext.event.recognizer.SingleTouch",handledEvents:["swipe"],inheritableStatics:{MAX_OFFSET_EXCEEDED:16,MAX_DURATION_EXCEEDED:17,DISTANCE_NOT_ENOUGH:18},config:{minDistance:80,maxOffset:35,maxDuration:1000},onTouchStart:function(a){if(this.callParent(arguments)===false){return false}var b=a.changedTouches[0];this.startTime=a.time;this.isHorizontal=true;this.isVertical=true;this.startX=b.pageX;this.startY=b.pageY},onTouchMove:function(f){var h=f.changedTouches[0],b=h.pageX,g=h.pageY,c=Math.abs(b-this.startX),a=Math.abs(g-this.startY),d=f.time;if(d-this.startTime>this.getMaxDuration()){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(this.isVertical&&c>this.getMaxOffset()){this.isVertical=false}if(this.isHorizontal&&a>this.getMaxOffset()){this.isHorizontal=false}if(!this.isHorizontal&&!this.isVertical){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(i){if(this.onTouchMove(i)===false){return false}var h=i.changedTouches[0],l=h.pageX,j=h.pageY,g=l-this.startX,f=j-this.startY,c=Math.abs(g),b=Math.abs(f),m=this.getMinDistance(),d=i.time-this.startTime,k,a;if(this.isVertical&&bc){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(a>b){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(f){if(this.onTouchMove(f)!==false){var i=f.changedTouches[0],a=i.pageX,b=a-this.startX,h=Math.abs(b),d=f.time-this.startTime,g=this.getMinDistance(),c;if(h= 0 + Code = Code + CodeIncrement + if BitLength(i) <> LastBitLength then + LastBitLength=BitLength(i) + CodeIncrement = 1 shifted left (16 - LastBitLength) + ShannonCode(i) = Code + i <- i - 1 + end loop + +3) Reverse the order of all the bits in the above ShannonCode() + vector, so that the most significant bit becomes the least + significant bit. For example, the value 0x1234 (hex) would + become 0x2C48 (hex). + +4) Restore the order of Shannon-Fano codes as originally stored + within the file. + +Example: + + This example will show the encoding of a Shannon-Fano tree + of size 8. Notice that the actual Shannon-Fano trees used + for Imploding are either 64 or 256 entries in size. + +Example: 0x02, 0x42, 0x01, 0x13 + + The first byte indicates 3 values in this table. Decoding the + bytes: + 0x42 = 5 codes of 3 bits long + 0x01 = 1 code of 2 bits long + 0x13 = 2 codes of 4 bits long + + This would generate the original bit length array of: + (3, 3, 3, 3, 3, 2, 4, 4) + + There are 8 codes in this table for the values 0 thru 7. Using + the algorithm to obtain the Shannon-Fano codes produces: + + Reversed Order Original +Val Sorted Constructed Code Value Restored Length +--- ------ ----------------- -------- -------- ------ +0: 2 1100000000000000 11 101 3 +1: 3 1010000000000000 101 001 3 +2: 3 1000000000000000 001 110 3 +3: 3 0110000000000000 110 010 3 +4: 3 0100000000000000 010 100 3 +5: 3 0010000000000000 100 11 2 +6: 4 0001000000000000 1000 1000 4 +7: 4 0000000000000000 0000 0000 4 + +The values in the Val, Order Restored and Original Length columns +now represent the Shannon-Fano encoding tree that can be used for +decoding the Shannon-Fano encoded data. How to parse the +variable length Shannon-Fano values from the data stream is beyond +the scope of this document. (See the references listed at the end of +this document for more information.) However, traditional decoding +schemes used for Huffman variable length decoding, such as the +Greenlaw algorithm, can be successfully applied. + +The compressed data stream begins immediately after the +compressed Shannon-Fano data. The compressed data stream can be +interpreted as follows: + +loop until done + read 1 bit from input stream. + + if this bit is non-zero then (encoded data is literal data) + if Literal Shannon-Fano tree is present + read and decode character using Literal Shannon-Fano tree. + otherwise + read 8 bits from input stream. + copy character to the output stream. + otherwise (encoded data is sliding dictionary match) + if 8K dictionary size + read 7 bits for offset Distance (lower 7 bits of offset). + otherwise + read 6 bits for offset Distance (lower 6 bits of offset). + + using the Distance Shannon-Fano tree, read and decode the + upper 6 bits of the Distance value. + + using the Length Shannon-Fano tree, read and decode + the Length value. + + Length <- Length + Minimum Match Length + + if Length = 63 + Minimum Match Length + read 8 bits from the input stream, + add this value to Length. + + move backwards Distance+1 bytes in the output stream, and + copy Length characters from this position to the output + stream. (if this position is before the start of the output + stream, then assume that all the data before the start of + the output stream is filled with zeros). +end loop + +Tokenizing - Method 7 +--------------------- + +This method is not used by PKZIP. + +Deflating - Method 8 +-------------------- + +The Deflate algorithm is similar to the Implode algorithm using +a sliding dictionary of up to 32K with secondary compression +from Huffman/Shannon-Fano codes. + +The compressed data is stored in blocks with a header describing +the block and the Huffman codes used in the data block. The header +format is as follows: + + Bit 0: Last Block bit This bit is set to 1 if this is the last + compressed block in the data. + Bits 1-2: Block type + 00 (0) - Block is stored - All stored data is byte aligned. + Skip bits until next byte, then next word = block + length, followed by the ones compliment of the block + length word. Remaining data in block is the stored + data. + + 01 (1) - Use fixed Huffman codes for literal and distance codes. + Lit Code Bits Dist Code Bits + --------- ---- --------- ---- + 0 - 143 8 0 - 31 5 + 144 - 255 9 + 256 - 279 7 + 280 - 287 8 + + Literal codes 286-287 and distance codes 30-31 are + never used but participate in the huffman construction. + + 10 (2) - Dynamic Huffman codes. (See expanding Huffman codes) + + 11 (3) - Reserved - Flag a "Error in compressed data" if seen. + +Expanding Huffman Codes +----------------------- +If the data block is stored with dynamic Huffman codes, the Huffman +codes are sent in the following compressed format: + + 5 Bits: # of Literal codes sent - 256 (256 - 286) + All other codes are never sent. + 5 Bits: # of Dist codes - 1 (1 - 32) + 4 Bits: # of Bit Length codes - 3 (3 - 19) + +The Huffman codes are sent as bit lengths and the codes are built as +described in the implode algorithm. The bit lengths themselves are +compressed with Huffman codes. There are 19 bit length codes: + + 0 - 15: Represent bit lengths of 0 - 15 + 16: Copy the previous bit length 3 - 6 times. + The next 2 bits indicate repeat length (0 = 3, ... ,3 = 6) + Example: Codes 8, 16 (+2 bits 11), 16 (+2 bits 10) will + expand to 12 bit lengths of 8 (1 + 6 + 5) + 17: Repeat a bit length of 0 for 3 - 10 times. (3 bits of length) + 18: Repeat a bit length of 0 for 11 - 138 times (7 bits of length) + +The lengths of the bit length codes are sent packed 3 bits per value +(0 - 7) in the following order: + + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 + +The Huffman codes should be built as described in the Implode algorithm +except codes are assigned starting at the shortest bit length, i.e. the +shortest code should be all 0's rather than all 1's. Also, codes with +a bit length of zero do not participate in the tree construction. The +codes are then used to decode the bit lengths for the literal and +distance tables. + +The bit lengths for the literal tables are sent first with the number +of entries sent described by the 5 bits sent earlier. There are up +to 286 literal characters; the first 256 represent the respective 8 +bit character, code 256 represents the End-Of-Block code, the remaining +29 codes represent copy lengths of 3 thru 258. There are up to 30 +distance codes representing distances from 1 thru 32k as described +below. + + Length Codes + ------------ + Extra Extra Extra Extra + Code Bits Length Code Bits Lengths Code Bits Lengths Code Bits Length(s) + ---- ---- ------ ---- ---- ------- ---- ---- ------- ---- ---- --------- + 257 0 3 265 1 11,12 273 3 35-42 281 5 131-162 + 258 0 4 266 1 13,14 274 3 43-50 282 5 163-194 + 259 0 5 267 1 15,16 275 3 51-58 283 5 195-226 + 260 0 6 268 1 17,18 276 3 59-66 284 5 227-257 + 261 0 7 269 2 19-22 277 4 67-82 285 0 258 + 262 0 8 270 2 23-26 278 4 83-98 + 263 0 9 271 2 27-30 279 4 99-114 + 264 0 10 272 2 31-34 280 4 115-130 + + Distance Codes + -------------- + Extra Extra Extra Extra + Code Bits Dist Code Bits Dist Code Bits Distance Code Bits Distance + ---- ---- ---- ---- ---- ------ ---- ---- -------- ---- ---- -------- + 0 0 1 8 3 17-24 16 7 257-384 24 11 4097-6144 + 1 0 2 9 3 25-32 17 7 385-512 25 11 6145-8192 + 2 0 3 10 4 33-48 18 8 513-768 26 12 8193-12288 + 3 0 4 11 4 49-64 19 8 769-1024 27 12 12289-16384 + 4 1 5,6 12 5 65-96 20 9 1025-1536 28 13 16385-24576 + 5 1 7,8 13 5 97-128 21 9 1537-2048 29 13 24577-32768 + 6 2 9-12 14 6 129-192 22 10 2049-3072 + 7 2 13-16 15 6 193-256 23 10 3073-4096 + +The compressed data stream begins immediately after the +compressed header data. The compressed data stream can be +interpreted as follows: + +do + read header from input stream. + + if stored block + skip bits until byte aligned + read count and 1's compliment of count + copy count bytes data block + otherwise + loop until end of block code sent + decode literal character from input stream + if literal < 256 + copy character to the output stream + otherwise + if literal = end of block + break from loop + otherwise + decode distance from input stream + + move backwards distance bytes in the output stream, and + copy length characters from this position to the output + stream. + end loop +while not last block + +if data descriptor exists + skip bits until byte aligned + read crc and sizes +endif + +Enhanced Deflating - Method 9 +----------------------------- + +The Enhanced Deflating algorithm is similar to Deflate but +uses a sliding dictionary of up to 64K. Deflate64(tm) is supported +by the Deflate extractor. + +BZIP2 - Method 12 +----------------- + +BZIP2 is an open-source data compression algorithm developed by +Julian Seward. Information and source code for this algorithm +can be found on the internet. + +LZMA - Method 14 (EFS) +---------------------- + +LZMA is a block-oriented, general purpose data compression algorithm +developed and maintained by Igor Pavlov. It is a derivative of LZ77 +that utilizes Markov chains and a range coder. Information and +source code for this algorithm can be found on the internet. Consult +with the author of this algorithm for information on terms or +restrictions on use. + +Support for LZMA within the ZIP format is defined as follows: + +The Compression method field within the ZIP Local and Central +Header records will be set to the value 14 to indicate data was +compressed using LZMA. + +The Version needed to extract field within the ZIP Local and +Central Header records will be set to 6.3 to indicate the +minimum ZIP format version supporting this feature. + +File data compressed using the LZMA algorithm must be placed +immediately following the Local Header for the file. If a +standard ZIP encryption header is required, it will follow +the Local Header and will precede the LZMA compressed file +data segment. The location of LZMA compressed data segment +within the ZIP format will be as shown: + + [local header file 1] + [encryption header file 1] + [LZMA compressed data segment for file 1] + [data descriptor 1] + [local header file 2] + +The encryption header and data descriptor records may +be conditionally present. The LZMA Compressed Data Segment +will consist of an LZMA Properties Header followed by the +LZMA Compressed Data as shown: + + [LZMA properties header for file 1] + [LZMA compressed data for file 1] + +The LZMA Compressed Data will be stored as provided by the +LZMA compression library. Compressed size, uncompressed +size and other file characteristics about the file being +compressed must be stored in standard ZIP storage format. + +The LZMA Properties Header will store specific data required to +decompress the LZMA compressed Data. This data is set by the +LZMA compression engine using the function WriteCoderProperties() +as documented within the LZMA SDK. + +Storage fields for the property information within the LZMA +Properties Header are as follows: + + LZMA Version Information 2 bytes + LZMA Properties Size 2 bytes + LZMA Properties Data variable, defined by "LZMA Properties Size" + +LZMA Version Information - this field identifies which version of + the LZMA SDK was used to compress a file. The first byte will + store the major version number of the LZMA SDK and the second + byte will store the minor number. + +LZMA Properties Size - this field defines the size of the remaining + property data. Typically this size should be determined by the + version of the SDK. This size field is included as a convenience + and to help avoid any ambiguity should it arise in the future due + to changes in this compression algorithm. + +LZMA Property Data - this variable sized field records the required + values for the decompressor as defined by the LZMA SDK. The + data stored in this field should be obtained using the + WriteCoderProperties() in the version of the SDK defined by + the "LZMA Version Information" field. + +The layout of the "LZMA Properties Data" field is a function of the +LZMA compression algorithm. It is possible that this layout may be +changed by the author over time. The data layout in version 4.32 +of the LZMA SDK defines a 5 byte array that uses 4 bytes to store +the dictionary size in little-endian order. This is preceded by a +single packed byte as the first element of the array that contains +the following fields: + + PosStateBits + LiteralPosStateBits + LiteralContextBits + +Refer to the LZMA documentation for a more detailed explanation of +these fields. + +Data compressed with method 14, LZMA, may include an end-of-stream +(EOS) marker ending the compressed data stream. This marker is not +required, but its use is highly recommended to facilitate processing +and implementers should include the EOS marker whenever possible. +When the EOS marker is used, general purpose bit 1 must be set. If +general purpose bit 1 is not set, the EOS marker is not present. + +WavPack - Method 97 +------------------- + +Information describing the use of compression method 97 is +provided by WinZIP International, LLC. This method relies on the +open source WavPack audio compression utility developed by David Bryant. +Information on WavPack is available at www.wavpack.com. Please consult +with the author of this algorithm for information on terms and +restrictions on use. + +WavPack data for a file begins immediately after the end of the +local header data. This data is the output from WavPack compression +routines. Within the ZIP file, the use of WavPack compression is +indicated by setting the compression method field to a value of 97 +in both the local header and the central directory header. The Version +needed to extract and version made by fields use the same values as are +used for data compressed using the Deflate algorithm. + +An implementation note for storing digital sample data when using +WavPack compression within ZIP files is that all of the bytes of +the sample data should be compressed. This includes any unused +bits up to the byte boundary. An example is a 2 byte sample that +uses only 12 bits for the sample data with 4 unused bits. If only +12 bits are passed as the sample size to the WavPack routines, the 4 +unused bits will be set to 0 on extraction regardless of their original +state. To avoid this, the full 16 bits of the sample data size +should be provided. + +PPMd - Method 98 +---------------- + +PPMd is a data compression algorithm developed by Dmitry Shkarin +which includes a carryless rangecoder developed by Dmitry Subbotin. +This algorithm is based on predictive phrase matching on multiple +order contexts. Information and source code for this algorithm +can be found on the internet. Consult with the author of this +algorithm for information on terms or restrictions on use. + +Support for PPMd within the ZIP format currently is provided only +for version I, revision 1 of the algorithm. Storage requirements +for using this algorithm are as follows: + +Parameters needed to control the algorithm are stored in the two +bytes immediately preceding the compressed data. These bytes are +used to store the following fields: + +Model order - sets the maximum model order, default is 8, possible + values are from 2 to 16 inclusive + +Sub-allocator size - sets the size of sub-allocator in MB, default is 50, + possible values are from 1MB to 256MB inclusive + +Model restoration method - sets the method used to restart context + model at memory insufficiency, values are: + + 0 - restarts model from scratch - default + 1 - cut off model - decreases performance by as much as 2x + 2 - freeze context tree - not recommended + +An example for packing these fields into the 2 byte storage field is +illustrated below. These values are stored in Intel low-byte/high-byte +order. + +wPPMd = (Model order - 1) + + ((Sub-allocator size - 1) << 4) + + (Model restoration method << 12) + + +VII. Traditional PKWARE Encryption +---------------------------------- + +The following information discusses the decryption steps +required to support traditional PKWARE encryption. This +form of encryption is considered weak by today's standards +and its use is recommended only for situations with +low security needs or for compatibility with older .ZIP +applications. + +Decryption +---------- + +PKWARE is grateful to Mr. Roger Schlafly for his expert contribution +towards the development of PKWARE's traditional encryption. + +PKZIP encrypts the compressed data stream. Encrypted files must +be decrypted before they can be extracted. + +Each encrypted file has an extra 12 bytes stored at the start of +the data area defining the encryption header for that file. The +encryption header is originally set to random values, and then +itself encrypted, using three, 32-bit keys. The key values are +initialized using the supplied encryption password. After each byte +is encrypted, the keys are then updated using pseudo-random number +generation techniques in combination with the same CRC-32 algorithm +used in PKZIP and described elsewhere in this document. + +The following is the basic steps required to decrypt a file: + +1) Initialize the three 32-bit keys with the password. +2) Read and decrypt the 12-byte encryption header, further + initializing the encryption keys. +3) Read and decrypt the compressed data stream using the + encryption keys. + +Step 1 - Initializing the encryption keys +----------------------------------------- + +Key(0) <- 305419896 +Key(1) <- 591751049 +Key(2) <- 878082192 + +loop for i <- 0 to length(password)-1 + update_keys(password(i)) +end loop + +Where update_keys() is defined as: + +update_keys(char): + Key(0) <- crc32(key(0),char) + Key(1) <- Key(1) + (Key(0) & 000000ffH) + Key(1) <- Key(1) * 134775813 + 1 + Key(2) <- crc32(key(2),key(1) >> 24) +end update_keys + +Where crc32(old_crc,char) is a routine that given a CRC value and a +character, returns an updated CRC value after applying the CRC-32 +algorithm described elsewhere in this document. + +Step 2 - Decrypting the encryption header +----------------------------------------- + +The purpose of this step is to further initialize the encryption +keys, based on random data, to render a plaintext attack on the +data ineffective. + +Read the 12-byte encryption header into Buffer, in locations +Buffer(0) thru Buffer(11). + +loop for i <- 0 to 11 + C <- buffer(i) ^ decrypt_byte() + update_keys(C) + buffer(i) <- C +end loop + +Where decrypt_byte() is defined as: + +unsigned char decrypt_byte() + local unsigned short temp + temp <- Key(2) | 2 + decrypt_byte <- (temp * (temp ^ 1)) >> 8 +end decrypt_byte + +After the header is decrypted, the last 1 or 2 bytes in Buffer +should be the high-order word/byte of the CRC for the file being +decrypted, stored in Intel low-byte/high-byte order. Versions of +PKZIP prior to 2.0 used a 2 byte CRC check; a 1 byte CRC check is +used on versions after 2.0. This can be used to test if the password +supplied is correct or not. + +Step 3 - Decrypting the compressed data stream +---------------------------------------------- + +The compressed data stream can be decrypted as follows: + +loop until done + read a character into C + Temp <- C ^ decrypt_byte() + update_keys(temp) + output Temp +end loop + + +VIII. Strong Encryption Specification +------------------------------------- + +The Strong Encryption technology defined in this specification is +covered under a pending patent application. The use or implementation +in a product of certain technological aspects set forth in the current +APPNOTE, including those with regard to strong encryption, patching, +or extended tape operations requires a license from PKWARE. Portions +of this Strong Encryption technology are available for use at no charge. +Contact PKWARE for licensing terms and conditions. Refer to section II +of this APPNOTE (Contacting PKWARE) for information on how to +contact PKWARE. + +Version 5.x of this specification introduced support for strong +encryption algorithms. These algorithms can be used with either +a password or an X.509v3 digital certificate to encrypt each file. +This format specification supports either password or certificate +based encryption to meet the security needs of today, to enable +interoperability between users within both PKI and non-PKI +environments, and to ensure interoperability between different +computing platforms that are running a ZIP program. + +Password based encryption is the most common form of encryption +people are familiar with. However, inherent weaknesses with +passwords (e.g. susceptibility to dictionary/brute force attack) +as well as password management and support issues make certificate +based encryption a more secure and scalable option. Industry +efforts and support are defining and moving towards more advanced +security solutions built around X.509v3 digital certificates and +Public Key Infrastructures(PKI) because of the greater scalability, +administrative options, and more robust security over traditional +password based encryption. + +Most standard encryption algorithms are supported with this +specification. Reference implementations for many of these +algorithms are available from either commercial or open source +distributors. Readily available cryptographic toolkits make +implementation of the encryption features straight-forward. +This document is not intended to provide a treatise on data +encryption principles or theory. Its purpose is to document the +data structures required for implementing interoperable data +encryption within the .ZIP format. It is strongly recommended that +you have a good understanding of data encryption before reading +further. + +The algorithms introduced in Version 5.0 of this specification +include: + + RC2 40 bit, 64 bit, and 128 bit + RC4 40 bit, 64 bit, and 128 bit + DES + 3DES 112 bit and 168 bit + +Version 5.1 adds support for the following: + + AES 128 bit, 192 bit, and 256 bit + + +Version 6.1 introduces encryption data changes to support +interoperability with Smartcard and USB Token certificate storage +methods which do not support the OAEP strengthening standard. + +Version 6.2 introduces support for encrypting metadata by compressing +and encrypting the central directory data structure to reduce information +leakage. Information leakage can occur in legacy ZIP applications +through exposure of information about a file even though that file is +stored encrypted. The information exposed consists of file +characteristics stored within the records and fields defined by this +specification. This includes data such as a files name, its original +size, timestamp and CRC32 value. + +Version 6.3 introduces support for encrypting data using the Blowfish +and Twofish algorithms. These are symmetric block ciphers developed +by Bruce Schneier. Blowfish supports using a variable length key from +32 to 448 bits. Block size is 64 bits. Implementations should use 16 +rounds and the only mode supported within ZIP files is CBC. Twofish +supports key sizes 128, 192 and 256 bits. Block size is 128 bits. +Implementations should use 16 rounds and the only mode supported within +ZIP files is CBC. Information and source code for both Blowfish and +Twofish algorithms can be found on the internet. Consult with the author +of these algorithms for information on terms or restrictions on use. + +Central Directory Encryption provides greater protection against +information leakage by encrypting the Central Directory structure and +by masking key values that are replicated in the unencrypted Local +Header. ZIP compatible programs that cannot interpret an encrypted +Central Directory structure cannot rely on the data in the corresponding +Local Header for decompression information. + +Extra Field records that may contain information about a file that should +not be exposed should not be stored in the Local Header and should only +be written to the Central Directory where they can be encrypted. This +design currently does not support streaming. Information in the End of +Central Directory record, the Zip64 End of Central Directory Locator, +and the Zip64 End of Central Directory records are not encrypted. Access +to view data on files within a ZIP file with an encrypted Central Directory +requires the appropriate password or private key for decryption prior to +viewing any files, or any information about the files, in the archive. + +Older ZIP compatible programs not familiar with the Central Directory +Encryption feature will no longer be able to recognize the Central +Directory and may assume the ZIP file is corrupt. Programs that +attempt streaming access using Local Headers will see invalid +information for each file. Central Directory Encryption need not be +used for every ZIP file. Its use is recommended for greater security. +ZIP files not using Central Directory Encryption should operate as +in the past. + +This strong encryption feature specification is intended to provide for +scalable, cross-platform encryption needs ranging from simple password +encryption to authenticated public/private key encryption. + +Encryption provides data confidentiality and privacy. It is +recommended that you combine X.509 digital signing with encryption +to add authentication and non-repudiation. + + +Single Password Symmetric Encryption Method: +------------------------------------------- + +The Single Password Symmetric Encryption Method using strong +encryption algorithms operates similarly to the traditional +PKWARE encryption defined in this format. Additional data +structures are added to support the processing needs of the +strong algorithms. + +The Strong Encryption data structures are: + +1. General Purpose Bits - Bits 0 and 6 of the General Purpose bit +flag in both local and central header records. Both bits set +indicates strong encryption. Bit 13, when set indicates the Central +Directory is encrypted and that selected fields in the Local Header +are masked to hide their actual value. + + +2. Extra Field 0x0017 in central header only. + + Fields to consider in this record are: + + Format - the data format identifier for this record. The only + value allowed at this time is the integer value 2. + + AlgId - integer identifier of the encryption algorithm from the + following range + + 0x6601 - DES + 0x6602 - RC2 (version needed to extract < 5.2) + 0x6603 - 3DES 168 + 0x6609 - 3DES 112 + 0x660E - AES 128 + 0x660F - AES 192 + 0x6610 - AES 256 + 0x6702 - RC2 (version needed to extract >= 5.2) + 0x6720 - Blowfish + 0x6721 - Twofish + 0x6801 - RC4 + 0xFFFF - Unknown algorithm + + Bitlen - Explicit bit length of key + + 32 - 448 bits + + Flags - Processing flags needed for decryption + + 0x0001 - Password is required to decrypt + 0x0002 - Certificates only + 0x0003 - Password or certificate required to decrypt + + Values > 0x0003 reserved for certificate processing + + +3. Decryption header record preceding compressed file data. + + -Decryption Header: + + Value Size Description + ----- ---- ----------- + IVSize 2 bytes Size of initialization vector (IV) + IVData IVSize Initialization vector for this file + Size 4 bytes Size of remaining decryption header data + Format 2 bytes Format definition for this record + AlgID 2 bytes Encryption algorithm identifier + Bitlen 2 bytes Bit length of encryption key + Flags 2 bytes Processing flags + ErdSize 2 bytes Size of Encrypted Random Data + ErdData ErdSize Encrypted Random Data + Reserved1 4 bytes Reserved certificate processing data + Reserved2 (var) Reserved for certificate processing data + VSize 2 bytes Size of password validation data + VData VSize-4 Password validation data + VCRC32 4 bytes Standard ZIP CRC32 of password validation data + + IVData - The size of the IV should match the algorithm block size. + The IVData can be completely random data. If the size of + the randomly generated data does not match the block size + it should be complemented with zero's or truncated as + necessary. If IVSize is 0,then IV = CRC32 + Uncompressed + File Size (as a 64 bit little-endian, unsigned integer value). + + Format - the data format identifier for this record. The only + value allowed at this time is the integer value 3. + + AlgId - integer identifier of the encryption algorithm from the + following range + + 0x6601 - DES + 0x6602 - RC2 (version needed to extract < 5.2) + 0x6603 - 3DES 168 + 0x6609 - 3DES 112 + 0x660E - AES 128 + 0x660F - AES 192 + 0x6610 - AES 256 + 0x6702 - RC2 (version needed to extract >= 5.2) + 0x6720 - Blowfish + 0x6721 - Twofish + 0x6801 - RC4 + 0xFFFF - Unknown algorithm + + Bitlen - Explicit bit length of key + + 32 - 448 bits + + Flags - Processing flags needed for decryption + + 0x0001 - Password is required to decrypt + 0x0002 - Certificates only + 0x0003 - Password or certificate required to decrypt + + Values > 0x0003 reserved for certificate processing + + ErdData - Encrypted random data is used to store random data that + is used to generate a file session key for encrypting + each file. SHA1 is used to calculate hash data used to + derive keys. File session keys are derived from a master + session key generated from the user-supplied password. + If the Flags field in the decryption header contains + the value 0x4000, then the ErdData field must be + decrypted using 3DES. If the value 0x4000 is not set, + then the ErdData field must be decrypted using AlgId. + + + Reserved1 - Reserved for certificate processing, if value is + zero, then Reserved2 data is absent. See the explanation + under the Certificate Processing Method for details on + this data structure. + + Reserved2 - If present, the size of the Reserved2 data structure + is located by skipping the first 4 bytes of this field + and using the next 2 bytes as the remaining size. See + the explanation under the Certificate Processing Method + for details on this data structure. + + VSize - This size value will always include the 4 bytes of the + VCRC32 data and will be greater than 4 bytes. + + VData - Random data for password validation. This data is VSize + in length and VSize must be a multiple of the encryption + block size. VCRC32 is a checksum value of VData. + VData and VCRC32 are stored encrypted and start the + stream of encrypted data for a file. + + +4. Useful Tips + +Strong Encryption is always applied to a file after compression. The +block oriented algorithms all operate in Cypher Block Chaining (CBC) +mode. The block size used for AES encryption is 16. All other block +algorithms use a block size of 8. Two ID's are defined for RC2 to +account for a discrepancy found in the implementation of the RC2 +algorithm in the cryptographic library on Windows XP SP1 and all +earlier versions of Windows. It is recommended that zero length files +not be encrypted, however programs should be prepared to extract them +if they are found within a ZIP file. + +A pseudo-code representation of the encryption process is as follows: + +Password = GetUserPassword() +MasterSessionKey = DeriveKey(SHA1(Password)) +RD = CryptographicStrengthRandomData() +For Each File + IV = CryptographicStrengthRandomData() + VData = CryptographicStrengthRandomData() + VCRC32 = CRC32(VData) + FileSessionKey = DeriveKey(SHA1(IV + RD) + ErdData = Encrypt(RD,MasterSessionKey,IV) + Encrypt(VData + VCRC32 + FileData, FileSessionKey,IV) +Done + +The function names and parameter requirements will depend on +the choice of the cryptographic toolkit selected. Almost any +toolkit supporting the reference implementations for each +algorithm can be used. The RSA BSAFE(r), OpenSSL, and Microsoft +CryptoAPI libraries are all known to work well. + + +Single Password - Central Directory Encryption: +----------------------------------------------- + +Central Directory Encryption is achieved within the .ZIP format by +encrypting the Central Directory structure. This encapsulates the metadata +most often used for processing .ZIP files. Additional metadata is stored for +redundancy in the Local Header for each file. The process of concealing +metadata by encrypting the Central Directory does not protect the data within +the Local Header. To avoid information leakage from the exposed metadata +in the Local Header, the fields containing information about a file are masked. + +Local Header: + +Masking replaces the true content of the fields for a file in the Local +Header with false information. When masked, the Local Header is not +suitable for streaming access and the options for data recovery of damaged +archives is reduced. Extra Data fields that may contain confidential +data should not be stored within the Local Header. The value set into +the Version needed to extract field should be the correct value needed to +extract the file without regard to Central Directory Encryption. The fields +within the Local Header targeted for masking when the Central Directory is +encrypted are: + + Field Name Mask Value + ------------------ --------------------------- + compression method 0 + last mod file time 0 + last mod file date 0 + crc-32 0 + compressed size 0 + uncompressed size 0 + file name (variable size) Base 16 value from the + range 1 - 0xFFFFFFFFFFFFFFFF + represented as a string whose + size will be set into the + file name length field + +The Base 16 value assigned as a masked file name is simply a sequentially +incremented value for each file starting with 1 for the first file. +Modifications to a ZIP file may cause different values to be stored for +each file. For compatibility, the file name field in the Local Header +should never be left blank. As of Version 6.2 of this specification, +the Compression Method and Compressed Size fields are not yet masked. +Fields having a value of 0xFFFF or 0xFFFFFFFF for the ZIP64 format +should not be masked. + +Encrypting the Central Directory: + +Encryption of the Central Directory does not include encryption of the +Central Directory Signature data, the Zip64 End of Central Directory +record, the Zip64 End of Central Directory Locator, or the End +of Central Directory record. The ZIP file comment data is never +encrypted. + +Before encrypting the Central Directory, it may optionally be compressed. +Compression is not required, but for storage efficiency it is assumed +this structure will be compressed before encrypting. Similarly, this +specification supports compressing the Central Directory without +requiring that it also be encrypted. Early implementations of this +feature will assume the encryption method applied to files matches the +encryption applied to the Central Directory. + +Encryption of the Central Directory is done in a manner similar to +that of file encryption. The encrypted data is preceded by a +decryption header. The decryption header is known as the Archive +Decryption Header. The fields of this record are identical to +the decryption header preceding each encrypted file. The location +of the Archive Decryption Header is determined by the value in the +Start of the Central Directory field in the Zip64 End of Central +Directory record. When the Central Directory is encrypted, the +Zip64 End of Central Directory record will always be present. + +The layout of the Zip64 End of Central Directory record for all +versions starting with 6.2 of this specification will follow the +Version 2 format. The Version 2 format is as follows: + +The leading fixed size fields within the Version 1 format for this +record remain unchanged. The record signature for both Version 1 +and Version 2 will be 0x06064b50. Immediately following the last +byte of the field known as the Offset of Start of Central +Directory With Respect to the Starting Disk Number will begin the +new fields defining Version 2 of this record. + +New fields for Version 2: + +Note: all fields stored in Intel low-byte/high-byte order. + + Value Size Description + ----- ---- ----------- + Compression Method 2 bytes Method used to compress the + Central Directory + Compressed Size 8 bytes Size of the compressed data + Original Size 8 bytes Original uncompressed size + AlgId 2 bytes Encryption algorithm ID + BitLen 2 bytes Encryption key length + Flags 2 bytes Encryption flags + HashID 2 bytes Hash algorithm identifier + Hash Length 2 bytes Length of hash data + Hash Data (variable) Hash data + +The Compression Method accepts the same range of values as the +corresponding field in the Central Header. + +The Compressed Size and Original Size values will not include the +data of the Central Directory Signature which is compressed or +encrypted. + +The AlgId, BitLen, and Flags fields accept the same range of values +the corresponding fields within the 0x0017 record. + +Hash ID identifies the algorithm used to hash the Central Directory +data. This data does not have to be hashed, in which case the +values for both the HashID and Hash Length will be 0. Possible +values for HashID are: + + Value Algorithm + ------ --------- + 0x0000 none + 0x0001 CRC32 + 0x8003 MD5 + 0x8004 SHA1 + 0x8007 RIPEMD160 + 0x800C SHA256 + 0x800D SHA384 + 0x800E SHA512 + +When the Central Directory data is signed, the same hash algorithm +used to hash the Central Directory for signing should be used. +This is recommended for processing efficiency, however, it is +permissible for any of the above algorithms to be used independent +of the signing process. + +The Hash Data will contain the hash data for the Central Directory. +The length of this data will vary depending on the algorithm used. + +The Version Needed to Extract should be set to 62. + +The value for the Total Number of Entries on the Current Disk will +be 0. These records will no longer support random access when +encrypting the Central Directory. + +When the Central Directory is compressed and/or encrypted, the +End of Central Directory record will store the value 0xFFFFFFFF +as the value for the Total Number of Entries in the Central +Directory. The value stored in the Total Number of Entries in +the Central Directory on this Disk field will be 0. The actual +values will be stored in the equivalent fields of the Zip64 +End of Central Directory record. + +Decrypting and decompressing the Central Directory is accomplished +in the same manner as decrypting and decompressing a file. + +Certificate Processing Method: +----------------------------- + +The Certificate Processing Method of for ZIP file encryption +defines the following additional data fields: + +1. Certificate Flag Values + +Additional processing flags that can be present in the Flags field of both +the 0x0017 field of the central directory Extra Field and the Decryption +header record preceding compressed file data are: + + 0x0007 - reserved for future use + 0x000F - reserved for future use + 0x0100 - Indicates non-OAEP key wrapping was used. If this + this field is set, the version needed to extract must + be at least 61. This means OAEP key wrapping is not + used when generating a Master Session Key using + ErdData. + 0x4000 - ErdData must be decrypted using 3DES-168, otherwise use the + same algorithm used for encrypting the file contents. + 0x8000 - reserved for future use + + +2. CertData - Extra Field 0x0017 record certificate data structure + +The data structure used to store certificate data within the section +of the Extra Field defined by the CertData field of the 0x0017 +record are as shown: + + Value Size Description + ----- ---- ----------- + RCount 4 bytes Number of recipients. + HashAlg 2 bytes Hash algorithm identifier + HSize 2 bytes Hash size + SRList (var) Simple list of recipients hashed public keys + + + RCount This defines the number intended recipients whose + public keys were used for encryption. This identifies + the number of elements in the SRList. + + HashAlg This defines the hash algorithm used to calculate + the public key hash of each public key used + for encryption. This field currently supports + only the following value for SHA-1 + + 0x8004 - SHA1 + + HSize This defines the size of a hashed public key. + + SRList This is a variable length list of the hashed + public keys for each intended recipient. Each + element in this list is HSize. The total size of + SRList is determined using RCount * HSize. + + +3. Reserved1 - Certificate Decryption Header Reserved1 Data: + + Value Size Description + ----- ---- ----------- + RCount 4 bytes Number of recipients. + + RCount This defines the number intended recipients whose + public keys were used for encryption. This defines + the number of elements in the REList field defined below. + + +4. Reserved2 - Certificate Decryption Header Reserved2 Data Structures: + + + Value Size Description + ----- ---- ----------- + HashAlg 2 bytes Hash algorithm identifier + HSize 2 bytes Hash size + REList (var) List of recipient data elements + + + HashAlg This defines the hash algorithm used to calculate + the public key hash of each public key used + for encryption. This field currently supports + only the following value for SHA-1 + + 0x8004 - SHA1 + + HSize This defines the size of a hashed public key + defined in REHData. + + REList This is a variable length of list of recipient data. + Each element in this list consists of a Recipient + Element data structure as follows: + + + Recipient Element (REList) Data Structure: + + Value Size Description + ----- ---- ----------- + RESize 2 bytes Size of REHData + REKData + REHData HSize Hash of recipients public key + REKData (var) Simple key blob + + + RESize This defines the size of an individual REList + element. This value is the combined size of the + REHData field + REKData field. REHData is defined by + HSize. REKData is variable and can be calculated + for each REList element using RESize and HSize. + + REHData Hashed public key for this recipient. + + REKData Simple Key Blob. The format of this data structure + is identical to that defined in the Microsoft + CryptoAPI and generated using the CryptExportKey() + function. The version of the Simple Key Blob + supported at this time is 0x02 as defined by + Microsoft. + +Certificate Processing - Central Directory Encryption: +------------------------------------------------------ + +Central Directory Encryption using Digital Certificates will +operate in a manner similar to that of Single Password Central +Directory Encryption. This record will only be present when there +is data to place into it. Currently, data is placed into this +record when digital certificates are used for either encrypting +or signing the files within a ZIP file. When only password +encryption is used with no certificate encryption or digital +signing, this record is not currently needed. When present, this +record will appear before the start of the actual Central Directory +data structure and will be located immediately after the Archive +Decryption Header if the Central Directory is encrypted. + +The Archive Extra Data record will be used to store the following +information. Additional data may be added in future versions. + +Extra Data Fields: + +0x0014 - PKCS#7 Store for X.509 Certificates +0x0016 - X.509 Certificate ID and Signature for central directory +0x0019 - PKCS#7 Encryption Recipient Certificate List + +The 0x0014 and 0x0016 Extra Data records that otherwise would be +located in the first record of the Central Directory for digital +certificate processing. When encrypting or compressing the Central +Directory, the 0x0014 and 0x0016 records must be located in the +Archive Extra Data record and they should not remain in the first +Central Directory record. The Archive Extra Data record will also +be used to store the 0x0019 data. + +When present, the size of the Archive Extra Data record will be +included in the size of the Central Directory. The data of the +Archive Extra Data record will also be compressed and encrypted +along with the Central Directory data structure. + +Certificate Processing Differences: + +The Certificate Processing Method of encryption differs from the +Single Password Symmetric Encryption Method as follows. Instead +of using a user-defined password to generate a master session key, +cryptographically random data is used. The key material is then +wrapped using standard key-wrapping techniques. This key material +is wrapped using the public key of each recipient that will need +to decrypt the file using their corresponding private key. + +This specification currently assumes digital certificates will follow +the X.509 V3 format for 1024 bit and higher RSA format digital +certificates. Implementation of this Certificate Processing Method +requires supporting logic for key access and management. This logic +is outside the scope of this specification. + +OAEP Processing with Certificate-based Encryption: + +OAEP stands for Optimal Asymmetric Encryption Padding. It is a +strengthening technique used for small encoded items such as decryption +keys. This is commonly applied in cryptographic key-wrapping techniques +and is supported by PKCS #1. Versions 5.0 and 6.0 of this specification +were designed to support OAEP key-wrapping for certificate-based +decryption keys for additional security. + +Support for private keys stored on Smartcards or Tokens introduced +a conflict with this OAEP logic. Most card and token products do +not support the additional strengthening applied to OAEP key-wrapped +data. In order to resolve this conflict, versions 6.1 and above of this +specification will no longer support OAEP when encrypting using +digital certificates. + +Versions of PKZIP available during initial development of the +certificate processing method set a value of 61 into the +version needed to extract field for a file. This indicates that +non-OAEP key wrapping is used. This affects certificate encryption +only, and password encryption functions should not be affected by +this value. This means values of 61 may be found on files encrypted +with certificates only, or on files encrypted with both password +encryption and certificate encryption. Files encrypted with both +methods can safely be decrypted using the password methods documented. + +IX. Change Process +------------------ + +In order for the .ZIP file format to remain a viable definition, this +specification should be considered as open for periodic review and +revision. Although this format was originally designed with a +certain level of extensibility, not all changes in technology +(present or future) were or will be necessarily considered in its +design. If your application requires new definitions to the +extensible sections in this format, or if you would like to +submit new data structures, please forward your request to +zipformat@pkware.com. All submissions will be reviewed by the +ZIP File Specification Committee for possible inclusion into +future versions of this specification. Periodic revisions +to this specification will be published to ensure interoperability. +We encourage comments and feedback that may help improve clarity +or content. + +X. Incorporating PKWARE Proprietary Technology into Your Product +---------------------------------------------------------------- + +PKWARE is committed to the interoperability and advancement of the +.ZIP format. PKWARE offers a free license for certain technological +aspects described above under certain restrictions and conditions. +However, the use or implementation in a product of certain technological +aspects set forth in the current APPNOTE, including those with regard to +strong encryption, patching, or extended tape operations requires a +license from PKWARE. Please contact PKWARE with regard to acquiring +a license. + +XI. Acknowledgements +--------------------- + +In addition to the above mentioned contributors to PKZIP and PKUNZIP, +I would like to extend special thanks to Robert Mahoney for suggesting +the extension .ZIP for this software. + +XII. References +--------------- + + Fiala, Edward R., and Greene, Daniel H., "Data compression with + finite windows", Communications of the ACM, Volume 32, Number 4, + April 1989, pages 490-505. + + Held, Gilbert, "Data Compression, Techniques and Applications, + Hardware and Software Considerations", John Wiley & Sons, 1987. + + Huffman, D.A., "A method for the construction of minimum-redundancy + codes", Proceedings of the IRE, Volume 40, Number 9, September 1952, + pages 1098-1101. + + Nelson, Mark, "LZW Data Compression", Dr. Dobbs Journal, Volume 14, + Number 10, October 1989, pages 29-37. + + Nelson, Mark, "The Data Compression Book", M&T Books, 1991. + + Storer, James A., "Data Compression, Methods and Theory", + Computer Science Press, 1988 + + Welch, Terry, "A Technique for High-Performance Data Compression", + IEEE Computer, Volume 17, Number 6, June 1984, pages 8-19. + + Ziv, J. and Lempel, A., "A universal algorithm for sequential data + compression", Communications of the ACM, Volume 30, Number 6, + June 1987, pages 520-540. + + Ziv, J. and Lempel, A., "Compression of individual sequences via + variable-rate coding", IEEE Transactions on Information Theory, + Volume 24, Number 5, September 1978, pages 530-536. + + +APPENDIX A - AS/400 Extra Field (0x0065) Attribute Definitions +-------------------------------------------------------------- + +Field Definition Structure: + + a. field length including length 2 bytes + b. field code 2 bytes + c. data x bytes + +Field Code Description + 4001 Source type i.e. CLP etc + 4002 The text description of the library + 4003 The text description of the file + 4004 The text description of the member + 4005 x'F0' or 0 is PF-DTA, x'F1' or 1 is PF_SRC + 4007 Database Type Code 1 byte + 4008 Database file and fields definition + 4009 GZIP file type 2 bytes + 400B IFS code page 2 bytes + 400C IFS Creation Time 4 bytes + 400D IFS Access Time 4 bytes + 400E IFS Modification time 4 bytes + 005C Length of the records in the file 2 bytes + 0068 GZIP two words 8 bytes + +APPENDIX B - z/OS Extra Field (0x0065) Attribute Definitions +------------------------------------------------------------ + +Field Definition Structure: + + a. field length including length 2 bytes + b. field code 2 bytes + c. data x bytes + +Field Code Description + 0001 File Type 2 bytes + 0002 NonVSAM Record Format 1 byte + 0003 Reserved + 0004 NonVSAM Block Size 2 bytes Big Endian + 0005 Primary Space Allocation 3 bytes Big Endian + 0006 Secondary Space Allocation 3 bytes Big Endian + 0007 Space Allocation Type1 byte flag + 0008 Modification Date Retired with PKZIP 5.0 + + 0009 Expiration Date Retired with PKZIP 5.0 + + 000A PDS Directory Block Allocation 3 bytes Big Endian binary value + 000B NonVSAM Volume List variable + 000C UNIT Reference Retired with PKZIP 5.0 + + 000D DF/SMS Management Class 8 bytes EBCDIC Text Value + 000E DF/SMS Storage Class 8 bytes EBCDIC Text Value + 000F DF/SMS Data Class 8 bytes EBCDIC Text Value + 0010 PDS/PDSE Member Info. 30 bytes + 0011 VSAM sub-filetype 2 bytes + 0012 VSAM LRECL 13 bytes EBCDIC "(num_avg num_max)" + 0013 VSAM Cluster Name Retired with PKZIP 5.0 + + 0014 VSAM KSDS Key Information 13 bytes EBCDIC "(num_length num_position)" + 0015 VSAM Average LRECL 5 bytes EBCDIC num_value padded with blanks + 0016 VSAM Maximum LRECL 5 bytes EBCDIC num_value padded with blanks + 0017 VSAM KSDS Key Length 5 bytes EBCDIC num_value padded with blanks + 0018 VSAM KSDS Key Position 5 bytes EBCDIC num_value padded with blanks + 0019 VSAM Data Name 1-44 bytes EBCDIC text string + 001A VSAM KSDS Index Name 1-44 bytes EBCDIC text string + 001B VSAM Catalog Name 1-44 bytes EBCDIC text string + 001C VSAM Data Space Type 9 bytes EBCDIC text string + 001D VSAM Data Space Primary 9 bytes EBCDIC num_value left-justified + 001E VSAM Data Space Secondary 9 bytes EBCDIC num_value left-justified + 001F VSAM Data Volume List variable EBCDIC text list of 6-character Volume IDs + 0020 VSAM Data Buffer Space 8 bytes EBCDIC num_value left-justified + 0021 VSAM Data CISIZE 5 bytes EBCDIC num_value left-justified + 0022 VSAM Erase Flag 1 byte flag + 0023 VSAM Free CI % 3 bytes EBCDIC num_value left-justified + 0024 VSAM Free CA % 3 bytes EBCDIC num_value left-justified + 0025 VSAM Index Volume List variable EBCDIC text list of 6-character Volume IDs + 0026 VSAM Ordered Flag 1 byte flag + 0027 VSAM REUSE Flag 1 byte flag + 0028 VSAM SPANNED Flag 1 byte flag + 0029 VSAM Recovery Flag 1 byte flag + 002A VSAM WRITECHK Flag 1 byte flag + 002B VSAM Cluster/Data SHROPTS 3 bytes EBCDIC "n,y" + 002C VSAM Index SHROPTS 3 bytes EBCDIC "n,y" + 002D VSAM Index Space Type 9 bytes EBCDIC text string + 002E VSAM Index Space Primary 9 bytes EBCDIC num_value left-justified + 002F VSAM Index Space Secondary 9 bytes EBCDIC num_value left-justified + 0030 VSAM Index CISIZE 5 bytes EBCDIC num_value left-justified + 0031 VSAM Index IMBED 1 byte flag + 0032 VSAM Index Ordered Flag 1 byte flag + 0033 VSAM REPLICATE Flag 1 byte flag + 0034 VSAM Index REUSE Flag 1 byte flag + 0035 VSAM Index WRITECHK Flag 1 byte flag Retired with PKZIP 5.0 + + 0036 VSAM Owner 8 bytes EBCDIC text string + 0037 VSAM Index Owner 8 bytes EBCDIC text string + 0038 Reserved + 0039 Reserved + 003A Reserved + 003B Reserved + 003C Reserved + 003D Reserved + 003E Reserved + 003F Reserved + 0040 Reserved + 0041 Reserved + 0042 Reserved + 0043 Reserved + 0044 Reserved + 0045 Reserved + 0046 Reserved + 0047 Reserved + 0048 Reserved + 0049 Reserved + 004A Reserved + 004B Reserved + 004C Reserved + 004D Reserved + 004E Reserved + 004F Reserved + 0050 Reserved + 0051 Reserved + 0052 Reserved + 0053 Reserved + 0054 Reserved + 0055 Reserved + 0056 Reserved + 0057 Reserved + 0058 PDS/PDSE Member TTR Info. 6 bytes Big Endian + 0059 PDS 1st LMOD Text TTR 3 bytes Big Endian + 005A PDS LMOD EP Rec # 4 bytes Big Endian + 005B Reserved + 005C Max Length of records 2 bytes Big Endian + 005D PDSE Flag 1 byte flag + 005E Reserved + 005F Reserved + 0060 Reserved + 0061 Reserved + 0062 Reserved + 0063 Reserved + 0064 Reserved + 0065 Last Date Referenced 4 bytes Packed Hex "yyyymmdd" + 0066 Date Created 4 bytes Packed Hex "yyyymmdd" + 0068 GZIP two words 8 bytes + 0071 Extended NOTE Location 12 bytes Big Endian + 0072 Archive device UNIT 6 bytes EBCDIC + 0073 Archive 1st Volume 6 bytes EBCDIC + 0074 Archive 1st VOL File Seq# 2 bytes Binary + +APPENDIX C - Zip64 Extensible Data Sector Mappings (EFS) +-------------------------------------------------------- + + -Z390 Extra Field: + + The following is the general layout of the attributes for the + ZIP 64 "extra" block for extended tape operations. Portions of + this extended tape processing technology is covered under a + pending patent application. The use or implementation in a + product of certain technological aspects set forth in the + current APPNOTE, including those with regard to strong encryption, + patching or extended tape operations, requires a license from + PKWARE. Please contact PKWARE with regard to acquiring a license. + + + Note: some fields stored in Big Endian format. All text is + in EBCDIC format unless otherwise specified. + + Value Size Description + ----- ---- ----------- + (Z390) 0x0065 2 bytes Tag for this "extra" block type + Size 4 bytes Size for the following data block + Tag 4 bytes EBCDIC "Z390" + Length71 2 bytes Big Endian + Subcode71 2 bytes Enote type code + FMEPos 1 byte + Length72 2 bytes Big Endian + Subcode72 2 bytes Unit type code + Unit 1 byte Unit + Length73 2 bytes Big Endian + Subcode73 2 bytes Volume1 type code + FirstVol 1 byte Volume + Length74 2 bytes Big Endian + Subcode74 2 bytes FirstVol file sequence + FileSeq 2 bytes Sequence + +APPENDIX D - Language Encoding (EFS) +------------------------------------ + +The ZIP format has historically supported only the original IBM PC character +encoding set, commonly referred to as IBM Code Page 437. This limits storing +file name characters to only those within the original MS-DOS range of values +and does not properly support file names in other character encodings, or +languages. To address this limitation, this specification will support the +following change. + +If general purpose bit 11 is unset, the file name and comment should conform +to the original ZIP character encoding. If general purpose bit 11 is set, the +filename and comment must support The Unicode Standard, Version 4.1.0 or +greater using the character encoding form defined by the UTF-8 storage +specification. The Unicode Standard is published by the The Unicode +Consortium (www.unicode.org). UTF-8 encoded data stored within ZIP files +is expected to not include a byte order mark (BOM). + +Applications may choose to supplement this file name storage through the use +of the 0x0008 Extra Field. Storage for this optional field is currently +undefined, however it will be used to allow storing extended information +on source or target encoding that may further assist applications with file +name, or file content encoding tasks. Please contact PKWARE with any +requirements on how this field should be used. + +The 0x0008 Extra Field storage may be used with either setting for general +purpose bit 11. Examples of the intended usage for this field is to store +whether "modified-UTF-8" (JAVA) is used, or UTF-8-MAC. Similarly, other +commonly used character encoding (code page) designations can be indicated +through this field. Formalized values for use of the 0x0008 record remain +undefined at this time. The definition for the layout of the 0x0008 field +will be published when available. Use of the 0x0008 Extra Field provides +for storing data within a ZIP file in an encoding other than IBM Code +Page 437 or UTF-8. + +General purpose bit 11 will not imply any encoding of file content or +password. Values defining character encoding for file content or +password must be stored within the 0x0008 Extended Language Encoding +Extra Field. + +Ed Gordon of the Info-ZIP group has defined a pair of "extra field" records +that can be used to store UTF-8 file name and file comment fields. These +records can be used for cases when the general purpose bit 11 method +for storing UTF-8 data in the standard file name and comment fields is +not desirable. A common case for this alternate method is if backward +compatibility with older programs is required. + +Definitions for the record structure of these fields are included above +in the section on 3rd party mappings for "extra field" records. These +records are identified by Header ID's 0x6375 (Info-ZIP Unicode Comment +Extra Field) and 0x7075 (Info-ZIP Unicode Path Extra Field). + +The choice of which storage method to use when writing a ZIP file is left +to the implementation. Developers should expect that a ZIP file may +contain either method and should provide support for reading data in +either format. Use of general purpose bit 11 reduces storage requirements +for file name data by not requiring additional "extra field" data for +each file, but can result in older ZIP programs not being able to extract +files. Use of the 0x6375 and 0x7075 records will result in a ZIP file +that should always be readable by older ZIP programs, but requires more +storage per file to write file name and/or file comment fields. + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/CMakeLists.txt b/apps/files_odfviewer/src/webodf/webodf/CMakeLists.txt new file mode 100644 index 0000000000..247ff5c625 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/CMakeLists.txt @@ -0,0 +1,201 @@ +string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}" + WRONGCMAKEDIR) +if(WRONGCMAKEDIR) + message(FATAL_ERROR "You should point CMake to the parent directory.") +endif(WRONGCMAKEDIR) + +set(TESTJSFILES tests/core/ZipTests.js + tests/core/Base64Tests.js + tests/core/CursorTests.js + tests/core/PointWalkerTests.js + tests/core/RuntimeTests.js + tests/gui/CaretTests.js + tests/gui/SelectionMoverTests.js + tests/gui/XMLEditTests.js + tests/xmldom/OperationalTransformDOMTests.js + tests/xmldom/XPathTests.js + tests/tests.js +) + +add_custom_target(jslintcheck ALL + COMMAND ${NODE} lib/runtime.js tools/runjslint.js + ${LIBJSFILES} ${TESTJSFILES} + DEPENDS NodeJS + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + SOURCES ${LIBJSFILES} ${TESTJSFILES} +) + +if (Java_JAVA_EXECUTABLE) + # nonStandardJsDocs is not used because we use @licstart @licend and @source + set(SHARED_CLOSURE_ARGS --warning_level VERBOSE --jscomp_error accessControls --jscomp_error ambiguousFunctionDecl --jscomp_error checkRegExp --jscomp_error checkTypes --jscomp_error checkVars --jscomp_error constantProperty --jscomp_error deprecated --jscomp_error externsValidation --jscomp_error fileoverviewTags --jscomp_error globalThis --jscomp_error invalidCasts --jscomp_error missingProperties --jscomp_error strictModuleDepCheck --jscomp_error typeInvalidation --jscomp_error undefinedVars --jscomp_error unknownDefines --jscomp_error uselessCode --jscomp_error visibility --jscomp_off nonStandardJsDocs --summary_detail_level 3) + + foreach(JSFILE ${LIBJSFILES}) + set(LIB_CLOSURE_ARGS ${LIB_CLOSURE_ARGS} + --js ${CMAKE_CURRENT_SOURCE_DIR}/${JSFILE}) + endforeach(JSFILE ${LIBJSFILES}) + + foreach(JSFILE ${TESTJSFILES}) + set(TEST_CLOSURE_ARGS ${TEST_CLOSURE_ARGS} + --js ${CMAKE_CURRENT_SOURCE_DIR}/${JSFILE}) + endforeach(JSFILE ${TESTJSFILES}) + + add_custom_command( + OUTPUT simplecompiled.js + COMMAND ${Java_JAVA_EXECUTABLE} + ARGS -jar ${CLOSURE_JAR} + ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} ${TEST_CLOSURE_ARGS} + --compilation_level WHITESPACE_ONLY + --formatting PRETTY_PRINT + --js_output_file simplecompiled.js + DEPENDS ClosureCompiler ${LIBJSFILES} ${TESTJSFILES} + ) + + add_custom_command( + OUTPUT compiled.js + COMMAND ${Java_JAVA_EXECUTABLE} + ARGS -jar ${CLOSURE_JAR} + --define IS_COMPILED_CODE=true + ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} ${TEST_CLOSURE_ARGS} + --compilation_level ADVANCED_OPTIMIZATIONS + --formatting PRETTY_PRINT + --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js + --js_output_file compiled.js + DEPENDS ClosureCompiler ${LIBJSFILES} ${TESTJSFILES} tools/externs.js + ) + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + COMMAND ${Java_JAVA_EXECUTABLE} + ARGS -jar ${CLOSURE_JAR} + --define IS_COMPILED_CODE=true + ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} + --compilation_level SIMPLE_OPTIMIZATIONS + --formatting PRINT_INPUT_DELIMITER + --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js + --js_output_file ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + DEPENDS ClosureCompiler ${LIBJSFILES} tools/externs.js + ) + add_custom_target(webodf.js + SOURCES ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + ) + + # too hardcore for now... + # add_custom_command( + # OUTPUT webodf-experimental.js + # COMMAND ${Java_JAVA_EXECUTABLE} + # ARGS -jar ${CLOSURE_JAR} + # --define IS_COMPILED_CODE=true + # ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} + # --js ${CMAKE_CURRENT_SOURCE_DIR}/lib/export.js + # --compilation_level ADVANCED_OPTIMIZATIONS + # --formatting PRINT_INPUT_DELIMITER + # --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js + # --js_output_file webodf-experimental.js + # DEPENDS ClosureCompiler ${LIBJSFILES} lib/export.js tools/externs.js + # ) + + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/webodf-debug.js + COMMAND ${Java_JAVA_EXECUTABLE} + ARGS -jar ${CLOSURE_JAR} + --define IS_COMPILED_CODE=true + ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} + --compilation_level WHITESPACE_ONLY + --formatting PRETTY_PRINT + --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js + --js_output_file ${CMAKE_CURRENT_BINARY_DIR}/webodf-debug.js + DEPENDS ClosureCompiler ${LIBJSFILES} tools/externs.js + ) + add_custom_target(webodf-debug.js + SOURCES ${CMAKE_CURRENT_BINARY_DIR}/webodf-debug.js + ) + + add_custom_command( + OUTPUT odfedit.js + COMMAND ${Java_JAVA_EXECUTABLE} + ARGS -jar ${CLOSURE_JAR} + --define IS_COMPILED_CODE=true + ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} + --js ${CMAKE_CURRENT_SOURCE_DIR}/odfedit.js + --compilation_level ADVANCED_OPTIMIZATIONS + --formatting PRETTY_PRINT + --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js + --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/extjsexterns.js + --js_output_file odfedit.js + DEPENDS ClosureCompiler ${LIBJSFILES} ${APPJSFILES} tools/externs.js tools/extjsexterns.js odfedit.js + ) + + add_custom_command( + OUTPUT gui.js + COMMAND ${Java_JAVA_EXECUTABLE} + ARGS -jar ${CLOSURE_JAR} + --define IS_COMPILED_CODE=true + ${SHARED_CLOSURE_ARGS} ${LIB_CLOSURE_ARGS} + --js ${CMAKE_CURRENT_SOURCE_DIR}/filelister.js + --js ${CMAKE_CURRENT_SOURCE_DIR}/gui.js + --compilation_level ADVANCED_OPTIMIZATIONS + --formatting PRETTY_PRINT + --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/externs.js + --externs ${CMAKE_CURRENT_SOURCE_DIR}/tools/extjsexterns.js + --js_output_file gui.js + DEPENDS ClosureCompiler ${LIBJSFILES} ${APPJSFILES} tools/externs.js tools/extjsexterns.js filelister.js gui.js + ) + + add_custom_target(syntaxcheck ALL + DEPENDS simplecompiled.js webodf.js webodf-debug.js compiled.js + ) + + add_custom_target(rhinotest + COMMAND ${Java_JAVA_EXECUTABLE} -jar ${RHINO} + -debug lib/runtime.js tests/tests.js + DEPENDS Rhino + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + SOURCES ${LIBJSFILES} + ) + add_custom_target(simplerhinotest + COMMAND ${Java_JAVA_EXECUTABLE} -jar ${RHINO} + ${CMAKE_CURRENT_BINARY_DIR}/simplecompiled.js + DEPENDS Rhino simplecompiled.js + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests + ) + add_custom_command( + OUTPUT docs/index.html + COMMAND ${Java_JAVA_EXECUTABLE} + ARGS -jar ${JSDOCDIR}/jsrun.jar + ${JSDOCDIR}/app/run.js -d=${CMAKE_CURRENT_BINARY_DIR}/docs + -t=${JSDOCDIR}/templates/jsdoc ${LIBJSFILES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${LIBJSFILES} JsDoc + ) + add_custom_target(doc DEPENDS docs/index.html) + add_custom_target(simplenodetest ALL + COMMAND ${NODE} ${CMAKE_CURRENT_BINARY_DIR}/simplecompiled.js + DEPENDS NodeJS simplecompiled.js + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests + ) + +endif (Java_JAVA_EXECUTABLE) + +add_custom_target(nodetest ALL + COMMAND ${NODE} lib/runtime.js tests/tests.js + DEPENDS NodeJS + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + SOURCES ${LIBJSFILES} +) +if (QT4_FOUND) + add_custom_target(qtjsruntimetest ALL + COMMAND ${CMAKE_BINARY_DIR}/programs/qtjsruntime/qtjsruntime ../lib/runtime.js tests.js + DEPENDS qtjsruntime jslintcheck + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests + SOURCES ${LIBJSFILES} + ) +endif (QT4_FOUND) +add_custom_command( + OUTPUT instrumented/index.html + COMMAND ${JSCOVERAGE} + ARGS --exclude=extjs --exclude=extjs/.git ${CMAKE_CURRENT_SOURCE_DIR} + ${CMAKE_CURRENT_BINARY_DIR}/instrumented + DEPENDS ${LIBJSFILES} jslintcheck JSCoverage +) +add_custom_target(instrumented ALL DEPENDS instrumented/index.html) +# vim:expandtab diff --git a/apps/files_odfviewer/src/webodf/webodf/README b/apps/files_odfviewer/src/webodf/webodf/README new file mode 100644 index 0000000000..a4dde2fee7 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/README @@ -0,0 +1,43 @@ +This directory contains the javacript code to WebODF as well as applications that use it. The applications are browser applications, commandline applications and unit tests. + +lib/ +lib/core/ Parts of WebODF that also work on JavaScript runtimes without a + document window. +lib/gui/ Parts of WebODF that require a domtree + +The library should be able to run in a number of different runtimes. Currently these are: + - a webbrowser + - node.js + - rhino +A common API is implemented for these three environments in the files lib/browser.js, lib/node.js and lib/rhino.js respectively. + + + +Requirements on the code + +There are several requirements that need to met before code can be considered for inclusion in WebODF. Most requirements can be checked automatically, a few have to be checked by hand. A contribution must: + - be contributed under the appropriate license + - be javascript + - not give any warnings in a JSLint check + - be unchanged when passed through jsbeautifier + - compile with the closure compiler + - must pass all the unit tests that were passed before + - as separate js files in the currenlty used Node.JS implementation + - as a single compiled file in the currenlty used Node.JS implementation + - as separate js files in the currenlty used Rhino implementation + - as a single compiled file Rhino implementation + - must have equal or greater code coverage for the each of the test runs + +The automatic checks can be performed by running a dedicated command that reports in an xml file. This report is compared to the previous report. + +runtests.js is the command that creates a report. + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/compare.html b/apps/files_odfviewer/src/webodf/webodf/compare.html new file mode 100644 index 0000000000..0cf1cc80af --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/compare.html @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + +
    + + diff --git a/apps/files_odfviewer/src/webodf/webodf/compare.js b/apps/files_odfviewer/src/webodf/webodf/compare.js new file mode 100644 index 0000000000..16bf5e333f --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/compare.js @@ -0,0 +1,45 @@ +/*global runtime: true, odf: true*/ +/*jslint white: false*/ +function getURIParameters(window) { + "use strict"; + var params = {}, + query = window.location.search.substring(1), + parms = query.split('&'), + i, + pos, + key, + val; + for (i = 0; i < parms.length; i += 1) { + pos = parms[i].indexOf('='); + if (pos > 0) { + key = parms[i].substring(0, pos); + val = parms[i].substring(pos + 1); + params[key] = val; + } + } + return params; +} +function init(window, document) { + "use strict"; + runtime.loadClass("odf.OdfCanvas"); + var params = getURIParameters(window), + odfelement = document.getElementById("odf"), + odfcanvas = new odf.OdfCanvas(odfelement); + if (!params.odf) { + return; + } + odfcanvas.addListener("statereadychange", function () { + var s = odfelement.style, + bgzoom = "100% auto", + pos; + s.backgroundImage = "url(" + params.bg + ")"; + s.backgroundRepeat = "no-repeat"; + if (params.bgzoom) { + bgzoom = params.bgzoom + "% auto"; + } + s.backgroundSize = bgzoom; + pos = (params.x || "0") + "px " + (params.y || "0") + "px"; + s.backgroundPosition = pos; + }); + odfcanvas.load(params.odf); +} diff --git a/apps/files_odfviewer/src/webodf/webodf/deflateinmozilla.txt b/apps/files_odfviewer/src/webodf/webodf/deflateinmozilla.txt new file mode 100644 index 0000000000..866b29de77 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/deflateinmozilla.txt @@ -0,0 +1,69 @@ +Found this in a mozilla forum. +http://forums.mozillazine.org/viewtopic.php?f=27&t=313496&start=0# + +Another implementation under MIT license can be found here: +http://www.codeproject.com/KB/scripting/Javascript_binaryenc.aspx + + //listener for the converted data + var listener = + { + onDataAvailable : function(request, context, inputStream, offset, count) + { + //write the data + var output = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); + + //outputFile is a file which will contain the gunzipped data + if(!outputFile.exists()) + output.init(outputFile, 0x02 | 0x08, 0644, 0); + + else + output.init(outputFile, 0x02 | 0x10, 0644, 0); + + var scriptable = Components.classes["@mozilla.org/scriptableinputstream;1"].createInstance(Components.interfaces.nsIScriptableInputStream); + scriptable.init(inputStream); + + var data = scriptable.read(inputStream.available()); + output.write(data, data.length); + + output.close(); + }, + + onStartRequest : function(request, context) + { + }, + + onStopRequest : function(request, context) + { + } + }; + + //fake uri needed to create a channel + var uri = Components.classes["@mozilla.org/network/simple-uri;1"].createInstance(Components.interfaces.nsIURI); + uri.scheme = "http://gunzip"; + + //fake channel needed to create a request + var chan = Components.classes["@mozilla.org/network/input-stream-channel;1"].createInstance(Components.interfaces.nsIInputStreamChannel); + chan.setURI(uri); + chan.contentLength = decrypted.length; + chan.contentType = "gzip"; + chan.contentStream = null; + + var request = chan.QueryInterface(Components.interfaces.nsIRequest); + + // Attempt to gunzip + var conv = Components.classes["@mozilla.org/streamconv;1?from=gzip&to=uncompressed"].createInstance(Components.interfaces.nsIStreamConverter); + + conv.asyncConvertData("gzip", "uncompressed", listener, null); + + conv.onStartRequest(request, null); + + //input is an inputstream which contains the gzipped data + var avail = input.available(); + + //really do the conversion + conv.onDataAvailable(request, null, input, 0, avail); + + var status = {}; + conv.onStopRequest(request, null, status); + + input.close(); diff --git a/apps/files_odfviewer/src/webodf/webodf/embedodf.html b/apps/files_odfviewer/src/webodf/webodf/embedodf.html new file mode 100644 index 0000000000..96bb25cc2b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/embedodf.html @@ -0,0 +1,2 @@ + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/filelister.js b/apps/files_odfviewer/src/webodf/webodf/filelister.js new file mode 100644 index 0000000000..08f6cd3cb0 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/filelister.js @@ -0,0 +1,200 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global XMLHttpRequest*/ +/*jslint regexp: true*/ +/** asynchroneous function that lists all files **/ +function listFiles(startdir, filepattern, fileCallback, doneCallback) { + "use strict"; + + var todoList = [], + doneList = [], + dirpattern = /\/$/, + hasWEBDAV = false; + + function getHref(responseElement) { + var n = responseElement.firstChild; + while (n && !(n.namespaceURI === 'DAV:' && n.localName === 'href')) { + n = n.nextSibling; + } + return n && n.firstChild && n.firstChild.nodeValue; + } + + function isDirectory(responseElement) { + var n = responseElement.firstChild; + while (n && + !(n.namespaceURI === 'DAV:' && n.localName === 'propstat')) { + n = n.nextSibling; + } + n = n && n.firstChild; + while (n && + !(n.namespaceURI === 'DAV:' && n.localName === 'prop')) { + n = n.nextSibling; + } + n = n && n.firstChild; + while (n && !(n.namespaceURI === 'DAV:' && + n.localName === 'resourcetype')) { + n = n.nextSibling; + } + n = n && n.firstChild; + while (n && + !(n.namespaceURI === 'DAV:' && n.localName === 'collection')) { + n = n.nextSibling; + } + return n; + } + + function processWebDavResponse(xml) { + if (!xml) { + throw new Error('No proper XML response.'); + } + + var refs = xml.getElementsByTagNameNS('DAV:', 'response'), + directories = [], + files = [], + i, + d, + href; + if (refs.length === 0) { + throw new Error('No proper XML response.'); + } + for (i = 0; i < refs.length; i += 1) { + href = getHref(refs[i]); + if (isDirectory(refs[i])) { + directories.push(href); + } else if (filepattern.test(href)) { + files.push(href); + } + } + for (i = 0; i < directories.length; i += 1) { + d = directories[i]; + if (doneList.indexOf(d) === -1 && todoList.indexOf(d) === -1) { + todoList.push(d); + } + } + fileCallback(directories, files); + } + + function processIndexHtmlResponse(base, text) { + // use regex because index.html is usually not valid xml + var re = /href="([^\/\?"][^"]*)"/ig, + matches, + files = [], + directories = [], + name, + d, + i; + while ((matches = re.exec(text)) !== null) { + name = matches[1]; + if (dirpattern.test(name)) { + directories.push(base + name); + } else if (filepattern.test(name)) { + files.push(base + name); + } + } + for (i = 0; i < directories.length; i += 1) { + d = directories[i]; + if (doneList.indexOf(d) === -1 && todoList.indexOf(d) === -1) { + todoList.push(d); + } + } + fileCallback(directories, files); + } + + function getNextFileListWithIndexHtml() { + var url = todoList.shift(), + req; + while (url && typeof url !== 'string') { + url = todoList.shift(); + } + if (!url) { + if (doneCallback) { + doneCallback(); + } + return; + } + req = new XMLHttpRequest(); + req.open('GET', url, true); + req.onreadystatechange = function (evt) { + if (req.readyState !== 4) { + return; + } + if (req.status >= 200 && req.status < 300) { + processIndexHtmlResponse(url, req.responseText); + } + getNextFileListWithIndexHtml(); + }; + req.send(null); + + doneList.push(url); + } + + function getNextFileListWithWebDav() { + var url = todoList.shift(), + req; + if (!url) { + if (doneCallback) { + doneCallback(); + } + return; + } + + req = new XMLHttpRequest(); + req.open('PROPFIND', url, true); + req.onreadystatechange = function (evt) { + if (req.readyState !== 4) { + return; + } + if (req.status >= 200 && req.status < 300) { + try { + processWebDavResponse(req.responseXML); + hasWEBDAV = true; + } catch (e) { + } + } + if (hasWEBDAV) { + getNextFileListWithWebDav(); + } else { + todoList.push(url); + doneList = []; + getNextFileListWithIndexHtml(); + } + }; + req.setRequestHeader('Depth', '1'); + req.send(null); + + doneList.push(url); + } + + todoList.push(startdir); + getNextFileListWithWebDav(); +} diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/Makefile b/apps/files_odfviewer/src/webodf/webodf/flashput/Makefile new file mode 100644 index 0000000000..291eef04b6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/flashput/Makefile @@ -0,0 +1,2 @@ +all: + /tmp/flex/bin/mxmlc PUT.as diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.as b/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.as new file mode 100644 index 0000000000..451d8a0fd0 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.as @@ -0,0 +1,18 @@ +package { + import flash.display.Sprite; + import flash.display.LoaderInfo; + import flash.external.ExternalInterface; + public class PUT extends Sprite { + public function PUT() { + ExternalInterface.addCallback("put", this.put); + var callback:String = LoaderInfo(root.loaderInfo).parameters["readyCallback"]; + ExternalInterface.call(callback); + } + public function put(host:String, port:uint, path:String, + data:String, callbackFunctionName:String, + callbackId:String):void { + new Request(host, port, path, data, + callbackFunctionName, callbackId); + } + } +} diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.swf b/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.swf new file mode 100644 index 0000000000..466d0a1316 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/webodf/flashput/PUT.swf differ diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/Request.as b/apps/files_odfviewer/src/webodf/webodf/flashput/Request.as new file mode 100644 index 0000000000..3217dde25d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/flashput/Request.as @@ -0,0 +1,83 @@ +package { + import flash.events.*; + import flash.external.ExternalInterface; + import flash.net.Socket; + import flash.utils.ByteArray; + import mx.utils.Base64Decoder; + import mx.utils.Base64Encoder; + internal class Request { + private var id:String; + private var header:String; + private var data:ByteArray; + private var callbackName:String; + private var socket:Socket; + public function Request(host:String, port:uint, path:String, + data:String, callbackName:String, + callbackId:String) { + var atob:Base64Decoder = new Base64Decoder(); + atob.decode(data); + this.data = atob.toByteArray(); + this.header = + "PUT " + path + " HTTP/1.1\r\n" + + "Host: " + host + "\r\n" + + "Content-Length: " + this.data.length + "\r\n" + + "\r\n"; + this.callbackName = callbackName; + this.id = callbackId; + this.socket = new Socket(); + this.socket.timeout = 1000; + this.socket.addEventListener(Event.CONNECT, + connectHandler); + this.socket.addEventListener(IOErrorEvent.IO_ERROR, + ioErrorHandler); + this.socket.addEventListener( + SecurityErrorEvent.SECURITY_ERROR, + securityErrorHandler); + this.socket.addEventListener(Event.CLOSE, closeHandler); + this.socket.addEventListener(ProgressEvent.SOCKET_DATA, + dataHandler); + this.socket.connect(host, port); + } + private function connectHandler(connect:Event):void { + this.socket.writeBytes(toByteArray(this.header)); + this.socket.writeBytes(this.data); + this.socket.flush(); + this.header = null; + this.data.length = 0; + } + private function ioErrorHandler(ioError:IOErrorEvent):void { + ExternalInterface.call(this.callbackName, this.id, + null); + this.socket.close(); + } + private function securityErrorHandler( + securityError:SecurityErrorEvent):void { + ExternalInterface.call(this.callbackName, this.id, + null); + this.socket.close(); + } + private function closeHandler(close:Event):void { + ExternalInterface.call(this.callbackName, this.id, + null); + } + private function dataHandler(data:ProgressEvent):void { + // assume it went well, TODO: parse reply, handle error + this.socket.readBytes(this.data); + var btoa:Base64Encoder = new Base64Encoder(); + btoa.encodeBytes(this.data); + ExternalInterface.call(this.callbackName, this.id, + btoa.toString()); + this.data.length = 0; + this.socket.close(); + } + public function toByteArray(str:String):ByteArray { + var length:uint = str.length; + var i:uint = 0; + var data:ByteArray = new ByteArray(); + for (i; i < length; i++) { + data.writeByte(str.charCodeAt(i) & 0xff); + } + return data; + } + } +} diff --git a/apps/files_odfviewer/src/webodf/webodf/flashput/test.html b/apps/files_odfviewer/src/webodf/webodf/flashput/test.html new file mode 100644 index 0000000000..349f7680ba --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/flashput/test.html @@ -0,0 +1,96 @@ + + + hi + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/gui.js b/apps/files_odfviewer/src/webodf/webodf/gui.js new file mode 100644 index 0000000000..5fce22f51e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/gui.js @@ -0,0 +1,263 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global Ext:true, runtime:true, core:true, listFiles:true*/ +runtime.loadClass("core.Zip"); +runtime.loadClass("core.Base64"); + +/** + * @param {Ext.data.Model} node + * @return {undefined} + */ +function addThumbnail(node) { + "use strict"; + var url = node.get('id'), zip; +/* + zip = new core.Zip(url, function (err, zipobject) { + zip = zipobject; + if (err) { + return; + } + zip.load('Thumbnails/thumbnail.png', function (err, data) { + if (data === null) { + return; + } + var url = 'data:;base64,' + + (new core.Base64()).convertUTF8ArrayToBase64(data), + el, spans, i, s; + el = node.getUI().getEl(); + if (el) { + spans = el.getElementsByTagName('span'); + for (i = 0; i < spans.length; i += 1) { + s = spans.item(i); + if (s.getAttribute('qtip')) { + s.setAttribute('qtip', node.attributes.qtip); + } + } + } else { + node.attributes.qtip += '
    '; + } + }); + }); +*/ +} + +/** + * @param {!string} url + * @param {!Ext.tab.Panel} panel + * @param {!string} title + * @return {undefined} + */ +function loadODF(url, panel, title) { + "use strict"; + var tab = panel.items.findBy(function (item) { + return item.url === url; + }), + newTab; + if (tab) { + panel.setActiveTab(tab); + return; + } + newTab = Ext.create('Ext.container.Container', { + title: title, + tabTip: url, + url: url, + closable: true, + autoEl: { + tag: 'iframe', + name: url, + src: 'odf.html#' + url, + frameBorder: 0, + style: { + border: '0 none' + } + }, + region: 'center' + }); + panel.add(newTab); + panel.setActiveTab(newTab); +} + +Ext.onReady(function () { + "use strict"; + var editButton, tabpanel, slider, tree, viewport; + + Ext.QuickTips.init(); + + /** + * @param {!Ext.Button} button + * @param {!boolean} pressed + * @return {undefined} + */ + function editToggle(button, pressed) { + var tab = tabpanel.getActiveTab(), o, odfcanvas = "odfcanvas"; + if (!tab) { + return; + } + tab.el.dom.contentDocument[odfcanvas].setEditable(pressed); + } + + /** + * @param {!Object} slider + * @param {!number} zoomlevel + * @param {!Object} thumb + * @return {undefined} + */ + function setZoom(slider, zoomlevel, thumb) { + var tab = tabpanel.getActiveTab(), + body; + if (!tab) { + return; + } + body = tab.el.dom.contentDocument.body; + zoomlevel = Math.pow(10, zoomlevel / 10.0); + body.style.zoom = zoomlevel; + body.style.MozTransform = 'scale(' + zoomlevel + ')'; + } + + /** + * @param {!Ext.data.NodeInterface} root + * @param {!string} uri + * @return {!Ext.data.NodeInterface} + */ + function getParentNode(root, uri) { + var parts = uri.split('/'), + node = root, + id = parts[0], + i, + n; + for (i = 1; i < parts.length - 1; i += 1) { + n = node.findChild('text', parts[i], false); + id += '/' + parts[i]; + if (!n) { + n = { + id: id, + text: parts[i], + qtip: uri, + cls: 'folder' + }; + n = node.appendChild(n); + } + node = n; + } + return node; + } + + /** + * @param {!Array.} directories + * @param {!Array.} files + * @return {undefined} + */ + function listFilesCallback(directories, files) { + var root = tree.getRootNode(), + i, + f, + parentNode, + qtip, + node; + for (i = 0; i < files.length; i += 1) { + f = files[i]; + parentNode = getParentNode(root, f); + qtip = f; + node = parentNode.appendChild({ + id: f, + qtip: qtip, + text: f.substr(f.lastIndexOf('/') + 1), + cls: 'file', + leaf: true, + editable: false + }); + f = /**@type{!Ext.data.Model}*/(node); + addThumbnail(f); + } + } + + /** + * @return {undefined} + */ + function listFilesDoneCallback() { + } + + editButton = new Ext.Button({ + enableToggle: true, + text: 'Editable', + listeners: { toggle: { fn: editToggle } } + }); + + slider = new Ext.Slider({ + width: 300, + minValue: -5, + maxValue: 5, + values: [0], + listeners: { changecomplete: { fn: setZoom } } + }); + + tabpanel = Ext.create('Ext.tab.Panel', { + tbar: [ 'Zoom: ', slider, editButton ], + region: 'center' + }); + + tree = Ext.create('Ext.tree.Panel', { + title: 'Documents', + region: 'west', + width: 200, + split: true, + autoScroll: true, + collapsible: true, + rootVisible: false, + enableTabScroll: true, + defaults: {autoScroll: true}, + listeners: { + itemclick: function (view, rec) { + if (rec.get('cls') === 'file') { + loadODF(rec.get('id'), tabpanel, rec.get('text')); + } else if (rec.get('cls') === 'folder') { + if (rec.isExpanded()) { + rec.collapse(); + } else { + rec.expand(); + } + } + } + }, + root: { nodeType: 'node' } + }); + + viewport = new Ext.Viewport({ + layout: 'border', + items: [ tabpanel, tree ] + }); + + // put data in the tree + listFiles('./demodocs/', /\.od[tps]$/i, listFilesCallback, + listFilesDoneCallback); +}); diff --git a/apps/files_odfviewer/src/webodf/webodf/httpserver.js b/apps/files_odfviewer/src/webodf/webodf/httpserver.js new file mode 100644 index 0000000000..245ce9f3f7 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/httpserver.js @@ -0,0 +1,213 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global require: true, console: true, process: true, Buffer: true, + unescape: true */ +/* A Node.JS http server*/ +var http = require("http"), + url = require("url"), + path = require("path"), + fs = require("fs"), + lookForIndexHtml = true, + ipaddress = "127.0.0.1", + //ipaddress = "192.168.1.105", + port = 8124; + +function statFile(dir, filelist, position, callback) { + "use strict"; + if (position >= filelist.length) { + return callback(null, filelist); + } + fs.stat(dir + "/" + filelist[position], function (err, stats) { + if (stats && stats.isDirectory()) { + filelist[position] = filelist[position] + "/"; + } + statFile(dir, filelist, position + 1, callback); + }); +} + +function listFiles(dir, callback) { + "use strict"; + fs.readdir(dir, function (err, files) { + if (err) { + return callback(err); + } + statFile(dir, files, 0, callback); + }); +} + +http.createServer(function (request, response) { + "use strict"; + var uri = unescape(url.parse(request.url).pathname), + filename = path.join(process.cwd(), uri); + if (uri !== '/favicon.ico') { + console.log(request.method + " " + uri); + } + function put() { + var contentlength = parseInt(request.headers["content-length"], 10), + alldata = new Buffer(contentlength), + sum = 0; + request.on("data", function (data) { + data.copy(alldata, sum, 0); + sum += data.length; + }); + request.on("end", function () { + fs.writeFile(filename, alldata, "binary", function (err) { + if (err) { + response.writeHead(500); + response.write(err); + } else { + response.writeHead(200); + } + response.end(); + }); + }); + } + if (request.method === "PUT") { + put(request, response); + return; + } + if (request.method === "DELETE") { + fs.unlink(filename, function (err) { + if (err) { + response.writeHead(500); + } else { + response.writeHead(200); + } + response.end(); + }); + return; + } + function handleStat(err, stats, lookForIndexHtml) { + if (!err && stats.isFile()) { + fs.readFile(filename, "binary", function (err, file) { + if (err) { + response.writeHead(500, {"Content-Type": "text/plain"}); + if (request.method !== "HEAD") { + response.write(err + "\n"); + } + response.end(); + return; + } + var head = {"Content-Length": stats.size}; + if (filename.substr(-3) === ".js") { + head["Content-Type"] = "text/javascript"; + } else if (filename.substr(-4) === ".css") { + head["Content-Type"] = "text/css"; + } else if (filename.substr(-4) === ".odt" || + filename.substr(-5) === ".fodt") { + head["Content-Type"] = "application/vnd.oasis.opendocument.text"; + } else if (filename.substr(-4) === ".ods" || + filename.substr(-5) === ".fods") { + head["Content-Type"] = "application/vnd.oasis.opendocument.presentation"; + } else if (filename.substr(-4) === ".odp" || + filename.substr(-5) === ".fodp") { + head["Content-Type"] = "application/vnd.oasis.opendocument.spreadsheet"; + } + response.writeHead(200, head); + if (request.method !== "HEAD") { + response.write(file, "binary"); + } + response.end(); + }); + } else if (!err && stats.isDirectory()) { + if (lookForIndexHtml) { + fs.stat(filename + "/index.html", function (err, stats) { + if (err) { + fs.stat(filename, handleStat); + } else { + filename = filename + "/index.html"; + handleStat(err, stats); + } + }); + return; + } + if (uri.length === 0 || uri[uri.length - 1] !== "/") { + response.writeHead(301, {"Content-Type": "text/plain", + "Location": uri + "/"}); + if (request.method !== "HEAD") { + response.write("Moved permanently\n"); + } + response.end(); + return; + } + listFiles(filename, function (err, files) { + if (err) { + response.writeHead(500, {"Content-Type": "text/plain"}); + if (request.method !== "HEAD") { + response.write(err + "\n"); + } + response.end(); + return; + } + response.writeHead(200); + if (request.method !== "HEAD") { + files.sort(); + response.write(""); + response.write(""); + var i, l = files.length, file; + for (i = 0; i < l; i += 1) { + file = files[i]; + if (file.length > 0 && file[file.length - 1] === '/') { + file = encodeURIComponent(file.slice(0, file.length - 1)) + "/"; + } else { + file = encodeURIComponent(file); + } + response.write("\n"); + } + response.write("
    "); + file = files[i].replace("&", "&") + .replace("<", ">"); + response.write(file.replace("\"", "\\\"")); + response.write("
    \n"); + } + response.end(); + }); + } else { + if (uri !== '/favicon.ico') { + console.log("Not found: " + uri); + } + response.writeHead(404, {"Content-Type": "text/plain"}); + if (request.method !== "HEAD") { + response.write("404 Not Found\n"); + } + response.end(); + } + } + fs.stat(filename, function (err, stats) { + handleStat(err, stats, lookForIndexHtml); + }); +}).listen(port, ipaddress); + +console.log('Server running at ' + ipaddress + ':' + port + '/'); diff --git a/apps/files_odfviewer/src/webodf/webodf/index.html b/apps/files_odfviewer/src/webodf/webodf/index.html new file mode 100644 index 0000000000..027a8a9b23 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/index.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + WebODF + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Async.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Async.js new file mode 100644 index 0000000000..358a8feee0 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/Async.js @@ -0,0 +1,65 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core*/ + +/** + * @constructor + */ +core.Async = function Async() { + "use strict"; + /** + * @param {!Array.<*>} items + * @param {function(*, !function(!string):undefined):undefined} f + * @param {function(?string)} callback + * @return {undefined} + */ + this.forEach = function (items, f, callback) { + var i, l = items.length, itemsDone = 0; + function end(err) { + if (itemsDone !== l) { + if (err) { + itemsDone = l; + callback(err); + } else { + itemsDone += 1; + if (itemsDone === l) { + callback(null); + } + } + } + } + for (i = 0; i < l; i += 1) { + f(items[i], end); + } + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Base64.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Base64.js new file mode 100644 index 0000000000..736f5bb531 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/Base64.js @@ -0,0 +1,362 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*jslint bitwise: true, regexp: true*/ +/*global core: true, runtime: true*/ +/* + * $Id: base64.js,v 0.9 2009/03/01 20:51:18 dankogai Exp dankogai $ + */ +/** + * @namespace + */ +core.Base64 = (function () { + "use strict"; + var b64chars + = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/', + + b64charcodes = (function () { + var a = [], i, + codeA = 'A'.charCodeAt(0), + codea = 'a'.charCodeAt(0), + code0 = '0'.charCodeAt(0); + for (i = 0; i < 26; i += 1) { + a.push(codeA + i); + } + for (i = 0; i < 26; i += 1) { + a.push(codea + i); + } + for (i = 0; i < 10; i += 1) { + a.push(code0 + i); + } + a.push('+'.charCodeAt(0)); + a.push('/'.charCodeAt(0)); + return a; + }()), + + b64tab = (function (bin) { + var t = {}, i, l; + for (i = 0, l = bin.length; i < l; i += 1) { + t[bin.charAt(i)] = i; + } + return t; + }(b64chars)), + convertUTF16StringToBase64, + convertBase64ToUTF16String, + btoa, atob; + + /** + * @param {!string} s + * @return {!Array} + */ + function stringToArray(s) { + var a = [], i, l = s.length; + for (i = 0; i < l; i += 1) { + a[i] = s.charCodeAt(i) & 0xff; + } + return a; + } + + function convertUTF8ArrayToBase64(bin) { + var n, + b64 = "", + i, + l = bin.length - 2; + for (i = 0; i < l; i += 3) { + n = (bin[i] << 16) | (bin[i + 1] << 8) | bin[i + 2]; + b64 += b64chars[n >>> 18]; + b64 += b64chars[(n >>> 12) & 63]; + b64 += b64chars[(n >>> 6) & 63]; + b64 += b64chars[n & 63]; + } + if (i === l + 1) { // 1 byte left + n = bin[i] << 4; + b64 += b64chars[n >>> 6]; + b64 += b64chars[n & 63]; + b64 += "=="; + } else if (i === l) { // 2 bytes left + n = (bin[i] << 10) | (bin[i + 1] << 2); + b64 += b64chars[n >>> 12]; + b64 += b64chars[(n >>> 6) & 63]; + b64 += b64chars[n & 63]; + b64 += "="; + } + return b64; + } + + function convertBase64ToUTF8Array(b64) { + b64 = b64.replace(/[^A-Za-z0-9+\/]+/g, ''); + var bin = [], + padlen = b64.length % 4, + i, + l = b64.length, + n; + for (i = 0; i < l; i += 4) { + n = ((b64tab[b64.charAt(i)] || 0) << 18) | + ((b64tab[b64.charAt(i + 1)] || 0) << 12) | + ((b64tab[b64.charAt(i + 2)] || 0) << 6) | + ((b64tab[b64.charAt(i + 3)] || 0)); + bin.push( + (n >> 16), + ((n >> 8) & 0xff), + (n & 0xff) + ); + } + bin.length -= [0, 0, 2, 1][padlen]; + return bin; + } + + function convertUTF16ArrayToUTF8Array(uni) { + var bin = [], i, l = uni.length, n; + for (i = 0; i < l; i += 1) { + n = uni[i]; + if (n < 0x80) { + bin.push(n); + } else if (n < 0x800) { + bin.push( + 0xc0 | (n >>> 6), + 0x80 | (n & 0x3f) + ); + } else { + bin.push( + 0xe0 | ((n >>> 12) & 0x0f), + 0x80 | ((n >>> 6) & 0x3f), + 0x80 | (n & 0x3f) + ); + } + } + return bin; + } + + function convertUTF8ArrayToUTF16Array(bin) { + var uni = [], i, l = bin.length, + c0, c1, c2; + for (i = 0; i < l; i += 1) { + c0 = bin[i]; + if (c0 < 0x80) { + uni.push(c0); + } else { + i += 1; + c1 = bin[i]; + if (c0 < 0xe0) { + uni.push(((c0 & 0x1f) << 6) | (c1 & 0x3f)); + } else { + i += 1; + c2 = bin[i]; + uni.push(((c0 & 0x0f) << 12) | ((c1 & 0x3f) << 6) | + (c2 & 0x3f) + ); + } + } + } + return uni; + } + + function convertUTF8StringToBase64(bin) { + return convertUTF8ArrayToBase64(stringToArray(bin)); + } + + function convertBase64ToUTF8String(b64) { + return String.fromCharCode.apply(String, convertBase64ToUTF8Array(b64)); + } + + function convertUTF8StringToUTF16Array(bin) { + return convertUTF8ArrayToUTF16Array(stringToArray(bin)); + } + + function convertUTF8ArrayToUTF16String(bin) { + // this conversion is done in chunks to avoid a stack overflow in + // apply() + var b = convertUTF8ArrayToUTF16Array(bin), + r = "", + i = 0, + chunksize = 45000; + while (i < b.length) { + r += String.fromCharCode.apply(String, b.slice(i, i + chunksize)); + i += chunksize; + } + return r; + } + /** + * @param {!Array.|!string} bin + * @param {!number} i + * @param {!number} end + * @return {!string} + */ + function convertUTF8StringToUTF16String_internal(bin, i, end) { + var str = "", c0, c1, c2, j; + for (j = i; j < end; j += 1) { + c0 = bin.charCodeAt(j) & 0xff; + if (c0 < 0x80) { + str += String.fromCharCode(c0); + } else { + j += 1; + c1 = bin.charCodeAt(j) & 0xff; + if (c0 < 0xe0) { + str += String.fromCharCode(((c0 & 0x1f) << 6) | + (c1 & 0x3f)); + } else { + j += 1; + c2 = bin.charCodeAt(j) & 0xff; + str += String.fromCharCode(((c0 & 0x0f) << 12) | + ((c1 & 0x3f) << 6) | (c2 & 0x3f)); + } + } + } + return str; + } + + /** + * Convert a utf-8 array into a utf-16 string. + * The input array is treated as a list of values between 0 and 255. + * This function works with a callback and splits the work up in parts + * between which it yields to the main thread. + * After each part the progress is reported with the callback function that + * also passes a booleant that indicates if the job has finished. + * If the conversion should stop, the callback should return false. + * + * @param {!Array.|!string} bin + * @param {!function(!string, boolean):boolean} callback + * @return {undefined} + */ + function convertUTF8StringToUTF16String(bin, callback) { + var partsize = 100000, + numparts = bin.length / partsize, + str = "", + pos = 0; + if (bin.length < partsize) { + callback(convertUTF8StringToUTF16String_internal(bin, 0, + bin.length), true); + return; + } + // make a local copy if the input is a string, to avoid modification + if (typeof bin !== "string") { + bin = bin.slice(); + } + function f() { + var end = pos + partsize; + if (end > bin.length) { + end = bin.length; + } + str += convertUTF8StringToUTF16String_internal(bin, pos, end); + pos = end; + end = pos === bin.length; + if (callback(str, end) && !end) { + runtime.setTimeout(f, 0); + } + } + f(); + } + + function convertUTF16StringToUTF8Array(uni) { + return convertUTF16ArrayToUTF8Array(stringToArray(uni)); + } + + function convertUTF16ArrayToUTF8String(uni) { + return String.fromCharCode.apply(String, + convertUTF16ArrayToUTF8Array(uni)); + } + + function convertUTF16StringToUTF8String(uni) { + return String.fromCharCode.apply(String, + convertUTF16ArrayToUTF8Array(stringToArray(uni))); + } + + btoa = runtime.getWindow() && runtime.getWindow().btoa; + if (btoa) { + convertUTF16StringToBase64 = function (uni) { + return btoa(convertUTF16StringToUTF8String(uni)); + }; + } else { + btoa = convertUTF8StringToBase64; + convertUTF16StringToBase64 = function (uni) { + return convertUTF8ArrayToBase64(convertUTF16StringToUTF8Array(uni)); + }; + } + atob = runtime.getWindow() && runtime.getWindow().atob; + if (atob) { + convertBase64ToUTF16String = function (b64) { + var b = atob(b64); + return convertUTF8StringToUTF16String_internal(b, 0, b.length); + }; + } else { + atob = convertBase64ToUTF8String; + convertBase64ToUTF16String = function (b64) { + return convertUTF8ArrayToUTF16String(convertBase64ToUTF8Array(b64)); + }; + } + + /** + * @constructor + */ + function Base64() { + this.convertUTF8ArrayToBase64 = convertUTF8ArrayToBase64; + this.convertByteArrayToBase64 = convertUTF8ArrayToBase64; + this.convertBase64ToUTF8Array = convertBase64ToUTF8Array; + this.convertBase64ToByteArray = convertBase64ToUTF8Array; + this.convertUTF16ArrayToUTF8Array = convertUTF16ArrayToUTF8Array; + this.convertUTF16ArrayToByteArray = convertUTF16ArrayToUTF8Array; + this.convertUTF8ArrayToUTF16Array = convertUTF8ArrayToUTF16Array; + this.convertByteArrayToUTF16Array = convertUTF8ArrayToUTF16Array; + this.convertUTF8StringToBase64 = convertUTF8StringToBase64; + this.convertBase64ToUTF8String = convertBase64ToUTF8String; + this.convertUTF8StringToUTF16Array = convertUTF8StringToUTF16Array; + this.convertUTF8ArrayToUTF16String = convertUTF8ArrayToUTF16String; + this.convertByteArrayToUTF16String = convertUTF8ArrayToUTF16String; + this.convertUTF8StringToUTF16String = convertUTF8StringToUTF16String; + this.convertUTF16StringToUTF8Array = convertUTF16StringToUTF8Array; + this.convertUTF16StringToByteArray = convertUTF16StringToUTF8Array; + this.convertUTF16ArrayToUTF8String = convertUTF16ArrayToUTF8String; + this.convertUTF16StringToUTF8String = convertUTF16StringToUTF8String; + this.convertUTF16StringToBase64 = convertUTF16StringToBase64; + this.convertBase64ToUTF16String = convertBase64ToUTF16String; + this.fromBase64 = convertBase64ToUTF8String; + this.toBase64 = convertUTF8StringToBase64; + this.atob = atob; + this.btoa = btoa; + this.utob = convertUTF16StringToUTF8String; + this.btou = convertUTF8StringToUTF16String; + this.encode = convertUTF16StringToBase64; + this.encodeURI = function (u) { + return convertUTF16StringToBase64(u).replace(/[+\/]/g, + function (m0) { + return m0 === '+' ? '-' : '_'; + }).replace(/\\=+$/, ''); + }; + this.decode = function (a) { + return convertBase64ToUTF16String(a.replace(/[\-_]/g, + function (m0) { + return m0 === '-' ? '+' : '/'; + })); + }; + } + return Base64; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArray.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArray.js new file mode 100644 index 0000000000..d8a9ddd73d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArray.js @@ -0,0 +1,68 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core*/ +/*jslint plusplus: true, bitwise: true */ +/** + * @constructor + * @param {!Runtime.ByteArray} data + */ +core.ByteArray = function ByteArray(data) { + "use strict"; + /** + * @type {!number} + */ + this.pos = 0; + /** + * @type {!Runtime.ByteArray} + */ + this.data = data; + /** + * @return {number} + */ + this.readUInt32LE = function () { + var data = this.data, + pos = (this.pos += 4); + return (data[--pos] << 24) | + (data[--pos] << 16) | + (data[--pos] << 8) | + data[--pos]; + }; + /** + * @return {number} + */ + this.readUInt16LE = function () { + var data = this.data, + pos = (this.pos += 2); + return (data[--pos] << 8) | data[--pos]; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArrayWriter.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArrayWriter.js new file mode 100644 index 0000000000..a7838be3dc --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/ByteArrayWriter.js @@ -0,0 +1,101 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true*/ +/*jslint bitwise: true */ +/** + * @constructor + * @param {!string} encoding + */ +core.ByteArrayWriter = function ByteArrayWriter(encoding) { + "use strict"; + var self = this, + data = new runtime.ByteArray(0); + + /** + * @param {!core.ByteArrayWriter} writer + * @return {undefined} + */ + this.appendByteArrayWriter = function (writer) { + data = runtime.concatByteArrays(data, writer.getByteArray()); + }; + /** + * @param {!Runtime.ByteArray} array + * @return {undefined} + */ + this.appendByteArray = function (array) { + data = runtime.concatByteArrays(data, array); + }; + /** + * @param {!Array.} array + * @return {undefined} + */ + this.appendArray = function (array) { + data = runtime.concatByteArrays(data, + runtime.byteArrayFromArray(array)); + }; + /** + * @param {!number} value + * @return {undefined} + */ + this.appendUInt16LE = function (value) { + self.appendArray([value & 0xff, (value >> 8) & 0xff]); + }; + /** + * @param {!number} value + * @return {undefined} + */ + this.appendUInt32LE = function (value) { + self.appendArray([value & 0xff, (value >> 8) & 0xff, + (value >> 16) & 0xff, (value >> 24) & 0xff]); + }; + /** + * @param {!string} string + * @return {undefined} + */ + this.appendString = function (string) { + data = runtime.concatByteArrays(data, + runtime.byteArrayFromString(string, encoding)); + }; + /** + * @return {!number} + */ + this.getLength = function () { + return data.length; + }; + /** + * @return {!Runtime.ByteArray} + */ + this.getByteArray = function () { + return data; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Cursor.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Cursor.js new file mode 100644 index 0000000000..d8f7965388 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/Cursor.js @@ -0,0 +1,213 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core: true, Node: true*/ +/** + * @class + * A cursor is a dom node that visually represents a cursor in a DOM tree. + * It should stay synchronized with the selection in the document. When + * there is only one collapsed selection range, a cursor should be shown at + * that point. + * + * Putting the cursor in the DOM tree modifies the DOM, so care should be taken + * to keep the selection consistent. If e.g. a selection is drawn over the + * cursor, and the cursor is updated to the selection, the cursor is removed + * from the DOM because the selection is not collapsed. This means that the + * offsets of the selection may have to be changed. + * + * When the selection is collapsed, the cursor is placed after the point of the + * selection and the selection will stay valid. However, if the cursor was + * placed in the DOM tree and was counted in the offset, the offset in the + * selection should be decreased by one. + * + * Even when the selection allows for a cursor, it might be desireable to hide + * the cursor by not letting it be part of the DOM. + * + * @constructor + * @param {Selection} selection The selection to which the cursor corresponds + * @param {Document} document The document in which the cursor is placed + */ +core.Cursor = function Cursor(selection, document) { + "use strict"; + var cursorns, + cursorNode; + cursorns = 'urn:webodf:names:cursor'; + cursorNode = document.createElementNS(cursorns, 'cursor'); + + function putCursorIntoTextNode(container, offset) { + var len, ref, textnode, parent; + parent = container.parentNode; + if (offset === 0) { + parent.insertBefore(cursorNode, container); + } else if (offset === container.length) { + parent.appendChild(cursorNode); + } else { + len = container.length; + ref = container.nextSibling; + textnode = document.createTextNode( + container.substringData(offset, len) + ); + container.deleteData(offset, len); + if (ref) { + parent.insertBefore(textnode, ref); + } else { + parent.appendChild(textnode); + } + parent.insertBefore(cursorNode, textnode); + } + } + function putCursorIntoContainer(container, offset) { + var node; + node = container.firstChild; + while (node && offset) { + node = node.nextSibling; + offset -= 1; + } + container.insertBefore(cursorNode, node); + } + function getPotentialParentOrNode(parent, node) { + var n = node; + while (n && n !== parent) { + n = n.parentNode; + } + return n || node; + } + function removeCursorFromSelectionRange(range, cursorpos) { + var cursorParent, start, end; + cursorParent = cursorNode.parentNode; + start = getPotentialParentOrNode(cursorNode, range.startContainer); + end = getPotentialParentOrNode(cursorNode, range.endContainer); + if (start === cursorNode) { + range.setStart(cursorParent, cursorpos); + } else if (start === cursorParent && + range.startOffset > cursorpos) { + range.setStart(cursorParent, range.startOffset - 1); + } + if (range.endContainer === cursorNode) { + range.setEnd(cursorParent, cursorpos); + } else if (range.endContainer === cursorParent && + range.endOffset > cursorpos) { + range.setEnd(cursorParent, range.endOffset - 1); + } + } + function adaptRangeToMergedText(range, prev, textnodetomerge, cursorpos) { + var diff = prev.length - textnodetomerge.length; + if (range.startContainer === textnodetomerge) { + range.setStart(prev, diff + range.startOffset); + } else if (range.startContainer === prev.parentNode && + range.startOffset === cursorpos) { + range.setStart(prev, diff); + } + if (range.endContainer === textnodetomerge) { + range.setEnd(prev, diff + range.endOffset); + } else if (range.endContainer === prev.parentNode && + range.endOffset === cursorpos) { + range.setEnd(prev, diff); + } + } + function removeCursor() { + // if the cursor is part of a selection, the selection must be adapted + var i, cursorpos, node, textnodetoremove, range; + // if the cursor has no parent, it is already not part of the document + // tree + if (!cursorNode.parentNode) { + return; + } + // find the position of the cursor in its parent + cursorpos = 0; + node = cursorNode.parentNode.firstChild; + while (node && node !== cursorNode) { + cursorpos += 1; + node = node.nextSibling; + } + // Check if removing the node will result in a merge of texts. + // This will happen if the cursor is between two text nodes. + // The text of the text node after the cursor is put in the text node + // before the cursor. The latter node is removed after the selection + // has been adapted. + if (cursorNode.previousSibling && + cursorNode.previousSibling.nodeType === 3 && // TEXT_NODE + cursorNode.nextSibling && + cursorNode.nextSibling.nodeType === 3) { // TEXT_NODE + textnodetoremove = cursorNode.nextSibling; + cursorNode.previousSibling.appendData(textnodetoremove.nodeValue); + } + // remove the node from the selections + for (i = 0; i < selection.rangeCount; i += 1) { + removeCursorFromSelectionRange(selection.getRangeAt(i), cursorpos); + } + // merge the texts that surround the cursor + if (textnodetoremove) { + for (i = 0; i < selection.rangeCount; i += 1) { + adaptRangeToMergedText(selection.getRangeAt(i), + cursorNode.previousSibling, textnodetoremove, cursorpos); + } + textnodetoremove.parentNode.removeChild(textnodetoremove); + } + cursorNode.parentNode.removeChild(cursorNode); + } + // put the cursor at a particular position + function putCursor(container, offset) { + if (container.nodeType === 3) { // TEXT_NODE + putCursorIntoTextNode(container, offset); + } else if (container.nodeType !== 9) { // DOCUMENT_NODE + putCursorIntoContainer(container, offset); + } + } + /** + * Obtain the node representing the cursor. + * @return {Element} + */ + this.getNode = function () { + return cursorNode; + }; + /** + * Synchronize the cursor with the current selection. + * If there is a single collapsed selection range, the cursor will be placed + * there. If not, the cursor will be removed from the document tree. + * @return {undefined} + */ + this.updateToSelection = function () { + var range; + removeCursor(); + if (selection.focusNode) { + putCursor(selection.focusNode, selection.focusOffset); + } + }; + /** + * Remove the cursor from the document tree. + * @return {undefined} + */ + this.remove = function () { + removeCursor(); + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/JSLint.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/JSLint.js new file mode 100644 index 0000000000..b3e422ef59 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/JSLint.js @@ -0,0 +1,6403 @@ +// jslint.js +// 2012-04-15 + +// Copyright (c) 2002 Douglas Crockford (www.JSLint.com) + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. + +// The Software shall be used for Good, not Evil. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// WARNING: JSLint will hurt your feelings. + +// JSLINT is a global function. It takes two parameters. + +// var myResult = JSLINT(source, option); + +// The first parameter is either a string or an array of strings. If it is a +// string, it will be split on '\n' or '\r'. If it is an array of strings, it +// is assumed that each string represents one line. The source can be a +// JavaScript text, or HTML text, or a JSON text, or a CSS text. + +// The second parameter is an optional object of options that control the +// operation of JSLINT. Most of the options are booleans: They are all +// optional and have a default value of false. One of the options, predef, +// can be an array of names, which will be used to declare global variables, +// or an object whose keys are used as global names, with a boolean value +// that determines if they are assignable. + +// If it checks out, JSLINT returns true. Otherwise, it returns false. + +// If false, you can inspect JSLINT.errors to find out the problems. +// JSLINT.errors is an array of objects containing these properties: + +// { +// line : The line (relative to 0) at which the lint was found +// character : The character (relative to 0) at which the lint was found +// reason : The problem +// evidence : The text line in which the problem occurred +// raw : The raw message before the details were inserted +// a : The first detail +// b : The second detail +// c : The third detail +// d : The fourth detail +// } + +// If a stopping error was found, a null will be the last element of the +// JSLINT.errors array. A stopping error means that JSLint was not confident +// enough to continue. It does not necessarily mean that the error was +// especially heinous. + +// You can request a Function Report, which shows all of the functions +// and the parameters and vars that they use. This can be used to find +// implied global variables and other problems. The report is in HTML and +// can be inserted in an HTML . + +// var myReport = JSLINT.report(errors_only); + +// If errors_only is true, then the report will be limited to only errors. + +// You can request a data structure that contains JSLint's results. + +// var myData = JSLINT.data(); + +// It returns a structure with this form: + +// { +// errors: [ +// { +// line: NUMBER, +// character: NUMBER, +// reason: STRING, +// evidence: STRING +// } +// ], +// functions: [ +// { +// name: STRING, +// line: NUMBER, +// last: NUMBER, +// params: [ +// { +// string: STRING +// } +// ], +// closure: [ +// STRING +// ], +// var: [ +// STRING +// ], +// exception: [ +// STRING +// ], +// outer: [ +// STRING +// ], +// unused: [ +// STRING +// ], +// undef: [ +// STRING +// ], +// global: [ +// STRING +// ], +// label: [ +// STRING +// ] +// } +// ], +// globals: [ +// STRING +// ], +// member: { +// STRING: NUMBER +// }, +// urls: [ +// STRING +// ], +// json: BOOLEAN +// } + +// Empty arrays will not be included. + +// You can obtain the parse tree that JSLint constructed while parsing. The +// latest tree is kept in JSLINT.tree. A nice stringication can be produced +// with + +// JSON.stringify(JSLINT.tree, [ +// 'string', 'arity', 'name', 'first', +// 'second', 'third', 'block', 'else' +// ], 4)); + +// JSLint provides three directives. They look like slashstar comments, and +// allow for setting options, declaring global variables, and establishing a +// set of allowed property names. + +// These directives respect function scope. + +// The jslint directive is a special comment that can set one or more options. +// The current option set is + +// anon true, if the space may be omitted in anonymous function declarations +// bitwise true, if bitwise operators should be allowed +// browser true, if the standard browser globals should be predefined +// cap true, if upper case HTML should be allowed +// 'continue' true, if the continuation statement should be tolerated +// css true, if CSS workarounds should be tolerated +// debug true, if debugger statements should be allowed +// devel true, if logging should be allowed (console, alert, etc.) +// eqeq true, if == should be allowed +// es5 true, if ES5 syntax should be allowed +// evil true, if eval should be allowed +// forin true, if for in statements need not filter +// fragment true, if HTML fragments should be allowed +// indent the indentation factor +// maxerr the maximum number of errors to allow +// maxlen the maximum length of a source line +// newcap true, if constructor names capitalization is ignored +// node true, if Node.js globals should be predefined +// nomen true, if names may have dangling _ +// on true, if HTML event handlers should be allowed +// passfail true, if the scan should stop on first error +// plusplus true, if increment/decrement should be allowed +// properties true, if all property names must be declared with /*properties*/ +// regexp true, if the . should be allowed in regexp literals +// rhino true, if the Rhino environment globals should be predefined +// undef true, if variables can be declared out of order +// unparam true, if unused parameters should be tolerated +// sloppy true, if the 'use strict'; pragma is optional +// stupid true, if really stupid practices are tolerated +// sub true, if all forms of subscript notation are tolerated +// vars true, if multiple var statements per function should be allowed +// white true, if sloppy whitespace is tolerated +// widget true if the Yahoo Widgets globals should be predefined +// windows true, if MS Windows-specific globals should be predefined + +// For example: + +/*jslint + evil: true, nomen: true, regexp: true +*/ + +// The properties directive declares an exclusive list of property names. +// Any properties named in the program that are not in the list will +// produce a warning. + +// For example: + +/*properties + '\b', '\t', '\n', '\f', '\r', '!', '!=', '!==', '"', '%', '\'', + '(arguments)', '(begin)', '(breakage)', '(context)', '(error)', + '(identifier)', '(line)', '(loopage)', '(name)', '(params)', '(scope)', + '(token)', '(vars)', '(verb)', '*', '+', '-', '/', '<', '<=', '==', + '===', '>', '>=', ADSAFE, Array, Date, Function, Object, '\\', a, + a_label, a_not_allowed, a_not_defined, a_scope, abbr, acronym, address, + adsafe, adsafe_a, adsafe_autocomplete, adsafe_bad_id, adsafe_div, + adsafe_fragment, adsafe_go, adsafe_html, adsafe_id, adsafe_id_go, adsafe_lib, + adsafe_lib_second, adsafe_missing_id, adsafe_name_a, adsafe_placement, + adsafe_prefix_a, adsafe_script, adsafe_source, adsafe_subscript_a, + adsafe_tag, all, already_defined, and, anon, applet, apply, approved, area, + arity, article, aside, assign, assign_exception, + assignment_function_expression, at, attribute_case_a, audio, autocomplete, + avoid_a, b, background, 'background-attachment', 'background-color', + 'background-image', 'background-position', 'background-repeat', + bad_assignment, bad_color_a, bad_constructor, bad_entity, bad_html, bad_id_a, + bad_in_a, bad_invocation, bad_name_a, bad_new, bad_number, bad_operand, + bad_style, bad_type, bad_url_a, bad_wrap, base, bdo, big, bitwise, block, + blockquote, body, border, 'border-bottom', 'border-bottom-color', + 'border-bottom-left-radius', 'border-bottom-right-radius', + 'border-bottom-style', 'border-bottom-width', 'border-collapse', + 'border-color', 'border-left', 'border-left-color', 'border-left-style', + 'border-left-width', 'border-radius', 'border-right', 'border-right-color', + 'border-right-style', 'border-right-width', 'border-spacing', 'border-style', + 'border-top', 'border-top-color', 'border-top-left-radius', + 'border-top-right-radius', 'border-top-style', 'border-top-width', + 'border-width', bottom, br, braille, browser, button, c, call, canvas, cap, + caption, 'caption-side', center, charAt, charCodeAt, character, cite, clear, + clip, closure, cm, code, col, colgroup, color, combine_var, command, + conditional_assignment, confusing_a, confusing_regexp, constructor_name_a, + content, continue, control_a, 'counter-increment', 'counter-reset', create, + css, cursor, d, dangerous_comment, dangling_a, data, datalist, dd, debug, + del, deleted, details, devel, dfn, dialog, dir, direction, display, disrupt, + div, dl, dt, duplicate_a, edge, edition, else, em, embed, embossed, empty, + 'empty-cells', empty_block, empty_case, empty_class, entityify, eqeq, errors, + es5, eval, evidence, evil, ex, exception, exec, expected_a, + expected_a_at_b_c, expected_a_b, expected_a_b_from_c_d, expected_at_a, + expected_attribute_a, expected_attribute_value_a, expected_class_a, + expected_fraction_a, expected_id_a, expected_identifier_a, + expected_identifier_a_reserved, expected_lang_a, expected_linear_a, + expected_media_a, expected_name_a, expected_nonstandard_style_attribute, + expected_number_a, expected_operator_a, expected_percent_a, + expected_positive_a, expected_pseudo_a, expected_selector_a, + expected_small_a, expected_space_a_b, expected_string_a, + expected_style_attribute, expected_style_pattern, expected_tagname_a, + expected_type_a, f, fieldset, figure, filter, first, flag, float, floor, + font, 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', + 'font-style', 'font-variant', 'font-weight', footer, forEach, for_if, forin, + form, fragment, frame, frameset, from, fromCharCode, fud, funct, function, + function_block, function_eval, function_loop, function_statement, + function_strict, functions, global, globals, h1, h2, h3, h4, h5, h6, + handheld, hasOwnProperty, head, header, height, hgroup, hr, + 'hta:application', html, html_confusion_a, html_handlers, i, id, identifier, + identifier_function, iframe, img, immed, implied_evil, in, indent, indexOf, + infix_in, init, input, ins, insecure_a, isAlpha, isArray, isDigit, isNaN, + join, jslint, json, kbd, keygen, keys, label, labeled, lang, lbp, + leading_decimal_a, led, left, legend, length, 'letter-spacing', li, lib, + line, 'line-height', link, 'list-style', 'list-style-image', + 'list-style-position', 'list-style-type', map, margin, 'margin-bottom', + 'margin-left', 'margin-right', 'margin-top', mark, 'marker-offset', match, + 'max-height', 'max-width', maxerr, maxlen, member, menu, message, meta, + meter, 'min-height', 'min-width', missing_a, missing_a_after_b, + missing_option, missing_property, missing_space_a_b, missing_url, + missing_use_strict, mixed, mm, mode, move_invocation, move_var, n, name, + name_function, nav, nested_comment, newcap, node, noframes, nomen, noscript, + not, not_a_constructor, not_a_defined, not_a_function, not_a_label, + not_a_scope, not_greater, nud, number, object, octal_a, ol, on, opacity, + open, optgroup, option, outer, outline, 'outline-color', 'outline-style', + 'outline-width', output, overflow, 'overflow-x', 'overflow-y', p, padding, + 'padding-bottom', 'padding-left', 'padding-right', 'padding-top', + 'page-break-after', 'page-break-before', param, parameter_a_get_b, + parameter_arguments_a, parameter_set_a, params, paren, parent, passfail, pc, + plusplus, pop, position, postscript, pre, predef, print, progress, + projection, properties, prototype, pt, push, px, q, quote, quotes, r, radix, + range, raw, read_only, reason, redefinition_a, regexp, replace, report, + reserved, reserved_a, rhino, right, rp, rt, ruby, safe, samp, scanned_a_b, + screen, script, search, second, section, select, shift, slash_equal, slice, + sloppy, small, sort, source, span, speech, split, src, statement_block, + stopping, strange_loop, strict, string, strong, stupid, style, styleproperty, + sub, subscript, substr, sup, supplant, sync_a, t, table, 'table-layout', + tag_a_in_b, tbody, td, test, 'text-align', 'text-decoration', 'text-indent', + 'text-shadow', 'text-transform', textarea, tfoot, th, thead, third, thru, + time, title, toLowerCase, toString, toUpperCase, token, too_long, too_many, + top, tr, trailing_decimal_a, tree, tt, tty, tv, type, u, ul, unclosed, + unclosed_comment, unclosed_regexp, undef, undefined, unescaped_a, + unexpected_a, unexpected_char_a_b, unexpected_comment, unexpected_else, + unexpected_label_a, unexpected_property_a, unexpected_space_a_b, + 'unicode-bidi', unnecessary_initialize, unnecessary_use, unparam, + unreachable_a_b, unrecognized_style_attribute_a, unrecognized_tag_a, unsafe, + unused, url, urls, use_array, use_braces, use_charAt, use_object, use_or, + use_param, used_before_a, var, var_a_not, vars, 'vertical-align', video, + visibility, was, weird_assignment, weird_condition, weird_new, weird_program, + weird_relation, weird_ternary, white, 'white-space', widget, width, windows, + 'word-spacing', 'word-wrap', wrap, wrap_immediate, wrap_regexp, + write_is_wrong, writeable, 'z-index' +*/ + +// The global directive is used to declare global variables that can +// be accessed by the program. If a declaration is true, then the variable +// is writeable. Otherwise, it is read-only. + +// We build the application inside a function so that we produce only a single +// global variable. That function will be invoked immediately, and its return +// value is the JSLINT function itself. That function is also an object that +// can contain data and other functions. + +var JSLINT = (function () { + 'use strict'; + + function array_to_object(array, value) { + +// Make an object from an array of keys and a common value. + + var i, length = array.length, object = {}; + for (i = 0; i < length; i += 1) { + object[array[i]] = value; + } + return object; + } + + + var adsafe_id, // The widget's ADsafe id. + adsafe_may, // The widget may load approved scripts. + adsafe_top, // At the top of the widget script. + adsafe_went, // ADSAFE.go has been called. + allowed_option = { + anon : true, + bitwise : true, + browser : true, + cap : true, + 'continue': true, + css : true, + debug : true, + devel : true, + eqeq : true, + es5 : true, + evil : true, + forin : true, + fragment : true, + indent : 10, + maxerr : 1000, + maxlen : 256, + newcap : true, + node : true, + nomen : true, + on : true, + passfail : true, + plusplus : true, + properties: true, + regexp : true, + rhino : true, + undef : true, + unparam : true, + sloppy : true, + stupid : true, + sub : true, + vars : true, + white : true, + widget : true, + windows : true + }, + anonname, // The guessed name for anonymous functions. + approved, // ADsafe approved urls. + +// These are operators that should not be used with the ! operator. + + bang = { + '<' : true, + '<=' : true, + '==' : true, + '===': true, + '!==': true, + '!=' : true, + '>' : true, + '>=' : true, + '+' : true, + '-' : true, + '*' : true, + '/' : true, + '%' : true + }, + +// These are property names that should not be permitted in the safe subset. + + banned = array_to_object([ + 'arguments', 'callee', 'caller', 'constructor', 'eval', 'prototype', + 'stack', 'unwatch', 'valueOf', 'watch' + ], true), + begin, // The root token + +// browser contains a set of global names that are commonly provided by a +// web browser environment. + + browser = array_to_object([ + 'clearInterval', 'clearTimeout', 'document', 'event', 'FormData', + 'frames', 'history', 'Image', 'localStorage', 'location', 'name', + 'navigator', 'Option', 'parent', 'screen', 'sessionStorage', + 'setInterval', 'setTimeout', 'Storage', 'window', 'XMLHttpRequest' + ], false), + +// bundle contains the text messages. + + bundle = { + a_label: "'{a}' is a statement label.", + a_not_allowed: "'{a}' is not allowed.", + a_not_defined: "'{a}' is not defined.", + a_scope: "'{a}' used out of scope.", + adsafe_a: "ADsafe violation: '{a}'.", + adsafe_autocomplete: "ADsafe autocomplete violation.", + adsafe_bad_id: "ADSAFE violation: bad id.", + adsafe_div: "ADsafe violation: Wrap the widget in a div.", + adsafe_fragment: "ADSAFE: Use the fragment option.", + adsafe_go: "ADsafe violation: Misformed ADSAFE.go.", + adsafe_html: "Currently, ADsafe does not operate on whole HTML " + + "documents. It operates on
    fragments and .js files.", + adsafe_id: "ADsafe violation: id does not match.", + adsafe_id_go: "ADsafe violation: Missing ADSAFE.id or ADSAFE.go.", + adsafe_lib: "ADsafe lib violation.", + adsafe_lib_second: "ADsafe: The second argument to lib must be a function.", + adsafe_missing_id: "ADSAFE violation: missing ID_.", + adsafe_name_a: "ADsafe name violation: '{a}'.", + adsafe_placement: "ADsafe script placement violation.", + adsafe_prefix_a: "ADsafe violation: An id must have a '{a}' prefix", + adsafe_script: "ADsafe script violation.", + adsafe_source: "ADsafe unapproved script source.", + adsafe_subscript_a: "ADsafe subscript '{a}'.", + adsafe_tag: "ADsafe violation: Disallowed tag '{a}'.", + already_defined: "'{a}' is already defined.", + and: "The '&&' subexpression should be wrapped in parens.", + assign_exception: "Do not assign to the exception parameter.", + assignment_function_expression: "Expected an assignment or " + + "function call and instead saw an expression.", + attribute_case_a: "Attribute '{a}' not all lower case.", + avoid_a: "Avoid '{a}'.", + bad_assignment: "Bad assignment.", + bad_color_a: "Bad hex color '{a}'.", + bad_constructor: "Bad constructor.", + bad_entity: "Bad entity.", + bad_html: "Bad HTML string", + bad_id_a: "Bad id: '{a}'.", + bad_in_a: "Bad for in variable '{a}'.", + bad_invocation: "Bad invocation.", + bad_name_a: "Bad name: '{a}'.", + bad_new: "Do not use 'new' for side effects.", + bad_number: "Bad number '{a}'.", + bad_operand: "Bad operand.", + bad_style: "Bad style.", + bad_type: "Bad type.", + bad_url_a: "Bad url '{a}'.", + bad_wrap: "Do not wrap function literals in parens unless they " + + "are to be immediately invoked.", + combine_var: "Combine this with the previous 'var' statement.", + conditional_assignment: "Expected a conditional expression and " + + "instead saw an assignment.", + confusing_a: "Confusing use of '{a}'.", + confusing_regexp: "Confusing regular expression.", + constructor_name_a: "A constructor name '{a}' should start with " + + "an uppercase letter.", + control_a: "Unexpected control character '{a}'.", + css: "A css file should begin with @charset 'UTF-8';", + dangling_a: "Unexpected dangling '_' in '{a}'.", + dangerous_comment: "Dangerous comment.", + deleted: "Only properties should be deleted.", + duplicate_a: "Duplicate '{a}'.", + empty_block: "Empty block.", + empty_case: "Empty case.", + empty_class: "Empty class.", + es5: "This is an ES5 feature.", + evil: "eval is evil.", + expected_a: "Expected '{a}'.", + expected_a_b: "Expected '{a}' and instead saw '{b}'.", + expected_a_b_from_c_d: "Expected '{a}' to match '{b}' from line " + + "{c} and instead saw '{d}'.", + expected_at_a: "Expected an at-rule, and instead saw @{a}.", + expected_a_at_b_c: "Expected '{a}' at column {b}, not column {c}.", + expected_attribute_a: "Expected an attribute, and instead saw [{a}].", + expected_attribute_value_a: "Expected an attribute value and " + + "instead saw '{a}'.", + expected_class_a: "Expected a class, and instead saw .{a}.", + expected_fraction_a: "Expected a number between 0 and 1 and " + + "instead saw '{a}'", + expected_id_a: "Expected an id, and instead saw #{a}.", + expected_identifier_a: "Expected an identifier and instead saw '{a}'.", + expected_identifier_a_reserved: "Expected an identifier and " + + "instead saw '{a}' (a reserved word).", + expected_linear_a: "Expected a linear unit and instead saw '{a}'.", + expected_lang_a: "Expected a lang code, and instead saw :{a}.", + expected_media_a: "Expected a CSS media type, and instead saw '{a}'.", + expected_name_a: "Expected a name and instead saw '{a}'.", + expected_nonstandard_style_attribute: "Expected a non-standard " + + "style attribute and instead saw '{a}'.", + expected_number_a: "Expected a number and instead saw '{a}'.", + expected_operator_a: "Expected an operator and instead saw '{a}'.", + expected_percent_a: "Expected a percentage and instead saw '{a}'", + expected_positive_a: "Expected a positive number and instead saw '{a}'", + expected_pseudo_a: "Expected a pseudo, and instead saw :{a}.", + expected_selector_a: "Expected a CSS selector, and instead saw {a}.", + expected_small_a: "Expected a small positive integer and instead saw '{a}'", + expected_space_a_b: "Expected exactly one space between '{a}' and '{b}'.", + expected_string_a: "Expected a string and instead saw {a}.", + expected_style_attribute: "Excepted a style attribute, and instead saw '{a}'.", + expected_style_pattern: "Expected a style pattern, and instead saw '{a}'.", + expected_tagname_a: "Expected a tagName, and instead saw {a}.", + expected_type_a: "Expected a type, and instead saw {a}.", + for_if: "The body of a for in should be wrapped in an if " + + "statement to filter unwanted properties from the prototype.", + function_block: "Function statements should not be placed in blocks. " + + "Use a function expression or move the statement to the top of " + + "the outer function.", + function_eval: "The Function constructor is eval.", + function_loop: "Don't make functions within a loop.", + function_statement: "Function statements are not invocable. " + + "Wrap the whole function invocation in parens.", + function_strict: "Use the function form of 'use strict'.", + html_confusion_a: "HTML confusion in regular expression '<{a}'.", + html_handlers: "Avoid HTML event handlers.", + identifier_function: "Expected an identifier in an assignment " + + "and instead saw a function invocation.", + implied_evil: "Implied eval is evil. Pass a function instead of a string.", + infix_in: "Unexpected 'in'. Compare with undefined, or use the " + + "hasOwnProperty method instead.", + insecure_a: "Insecure '{a}'.", + isNaN: "Use the isNaN function to compare with NaN.", + lang: "lang is deprecated.", + leading_decimal_a: "A leading decimal point can be confused with a dot: '.{a}'.", + missing_a: "Missing '{a}'.", + missing_a_after_b: "Missing '{a}' after '{b}'.", + missing_option: "Missing option value.", + missing_property: "Missing property name.", + missing_space_a_b: "Missing space between '{a}' and '{b}'.", + missing_url: "Missing url.", + missing_use_strict: "Missing 'use strict' statement.", + mixed: "Mixed spaces and tabs.", + move_invocation: "Move the invocation into the parens that " + + "contain the function.", + move_var: "Move 'var' declarations to the top of the function.", + name_function: "Missing name in function statement.", + nested_comment: "Nested comment.", + not: "Nested not.", + not_a_constructor: "Do not use {a} as a constructor.", + not_a_defined: "'{a}' has not been fully defined yet.", + not_a_function: "'{a}' is not a function.", + not_a_label: "'{a}' is not a label.", + not_a_scope: "'{a}' is out of scope.", + not_greater: "'{a}' should not be greater than '{b}'.", + octal_a: "Don't use octal: '{a}'. Use '\\u....' instead.", + parameter_arguments_a: "Do not mutate parameter '{a}' when using 'arguments'.", + parameter_a_get_b: "Unexpected parameter '{a}' in get {b} function.", + parameter_set_a: "Expected parameter (value) in set {a} function.", + radix: "Missing radix parameter.", + read_only: "Read only.", + redefinition_a: "Redefinition of '{a}'.", + reserved_a: "Reserved name '{a}'.", + scanned_a_b: "{a} ({b}% scanned).", + slash_equal: "A regular expression literal can be confused with '/='.", + statement_block: "Expected to see a statement and instead saw a block.", + stopping: "Stopping. ", + strange_loop: "Strange loop.", + strict: "Strict violation.", + subscript: "['{a}'] is better written in dot notation.", + sync_a: "Unexpected sync method: '{a}'.", + tag_a_in_b: "A '<{a}>' must be within '<{b}>'.", + too_long: "Line too long.", + too_many: "Too many errors.", + trailing_decimal_a: "A trailing decimal point can be confused " + + "with a dot: '.{a}'.", + type: "type is unnecessary.", + unclosed: "Unclosed string.", + unclosed_comment: "Unclosed comment.", + unclosed_regexp: "Unclosed regular expression.", + unescaped_a: "Unescaped '{a}'.", + unexpected_a: "Unexpected '{a}'.", + unexpected_char_a_b: "Unexpected character '{a}' in {b}.", + unexpected_comment: "Unexpected comment.", + unexpected_else: "Unexpected 'else' after 'return'.", + unexpected_label_a: "Unexpected label '{a}'.", + unexpected_property_a: "Unexpected /*property*/ '{a}'.", + unexpected_space_a_b: "Unexpected space between '{a}' and '{b}'.", + unnecessary_initialize: "It is not necessary to initialize '{a}' " + + "to 'undefined'.", + unnecessary_use: "Unnecessary 'use strict'.", + unreachable_a_b: "Unreachable '{a}' after '{b}'.", + unrecognized_style_attribute_a: "Unrecognized style attribute '{a}'.", + unrecognized_tag_a: "Unrecognized tag '<{a}>'.", + unsafe: "Unsafe character.", + url: "JavaScript URL.", + use_array: "Use the array literal notation [].", + use_braces: "Spaces are hard to count. Use {{a}}.", + use_charAt: "Use the charAt method.", + use_object: "Use the object literal notation {}.", + use_or: "Use the || operator.", + use_param: "Use a named parameter.", + used_before_a: "'{a}' was used before it was defined.", + var_a_not: "Variable {a} was not declared correctly.", + weird_assignment: "Weird assignment.", + weird_condition: "Weird condition.", + weird_new: "Weird construction. Delete 'new'.", + weird_program: "Weird program.", + weird_relation: "Weird relation.", + weird_ternary: "Weird ternary.", + wrap_immediate: "Wrap an immediate function invocation in parentheses " + + "to assist the reader in understanding that the expression " + + "is the result of a function, and not the function itself.", + wrap_regexp: "Wrap the /regexp/ literal in parens to " + + "disambiguate the slash operator.", + write_is_wrong: "document.write can be a form of eval." + }, + comments_off, + css_attribute_data, + css_any, + + css_colorData = array_to_object([ + "aliceblue", "antiquewhite", "aqua", "aquamarine", "azure", "beige", + "bisque", "black", "blanchedalmond", "blue", "blueviolet", "brown", + "burlywood", "cadetblue", "chartreuse", "chocolate", "coral", + "cornflowerblue", "cornsilk", "crimson", "cyan", "darkblue", + "darkcyan", "darkgoldenrod", "darkgray", "darkgreen", "darkkhaki", + "darkmagenta", "darkolivegreen", "darkorange", "darkorchid", + "darkred", "darksalmon", "darkseagreen", "darkslateblue", + "darkslategray", "darkturquoise", "darkviolet", "deeppink", + "deepskyblue", "dimgray", "dodgerblue", "firebrick", "floralwhite", + "forestgreen", "fuchsia", "gainsboro", "ghostwhite", "gold", + "goldenrod", "gray", "green", "greenyellow", "honeydew", "hotpink", + "indianred", "indigo", "ivory", "khaki", "lavender", + "lavenderblush", "lawngreen", "lemonchiffon", "lightblue", + "lightcoral", "lightcyan", "lightgoldenrodyellow", "lightgreen", + "lightpink", "lightsalmon", "lightseagreen", "lightskyblue", + "lightslategray", "lightsteelblue", "lightyellow", "lime", + "limegreen", "linen", "magenta", "maroon", "mediumaquamarine", + "mediumblue", "mediumorchid", "mediumpurple", "mediumseagreen", + "mediumslateblue", "mediumspringgreen", "mediumturquoise", + "mediumvioletred", "midnightblue", "mintcream", "mistyrose", + "moccasin", "navajowhite", "navy", "oldlace", "olive", "olivedrab", + "orange", "orangered", "orchid", "palegoldenrod", "palegreen", + "paleturquoise", "palevioletred", "papayawhip", "peachpuff", + "peru", "pink", "plum", "powderblue", "purple", "red", "rosybrown", + "royalblue", "saddlebrown", "salmon", "sandybrown", "seagreen", + "seashell", "sienna", "silver", "skyblue", "slateblue", "slategray", + "snow", "springgreen", "steelblue", "tan", "teal", "thistle", + "tomato", "turquoise", "violet", "wheat", "white", "whitesmoke", + "yellow", "yellowgreen", + + "activeborder", "activecaption", "appworkspace", "background", + "buttonface", "buttonhighlight", "buttonshadow", "buttontext", + "captiontext", "graytext", "highlight", "highlighttext", + "inactiveborder", "inactivecaption", "inactivecaptiontext", + "infobackground", "infotext", "menu", "menutext", "scrollbar", + "threeddarkshadow", "threedface", "threedhighlight", + "threedlightshadow", "threedshadow", "window", "windowframe", + "windowtext" + ], true), + + css_border_style, + css_break, + + css_lengthData = { + '%': true, + 'cm': true, + 'em': true, + 'ex': true, + 'in': true, + 'mm': true, + 'pc': true, + 'pt': true, + 'px': true + }, + + css_media, + css_overflow, + + descapes = { + 'b': '\b', + 't': '\t', + 'n': '\n', + 'f': '\f', + 'r': '\r', + '"': '"', + '/': '/', + '\\': '\\', + '!': '!' + }, + + devel = array_to_object([ + 'alert', 'confirm', 'console', 'Debug', 'opera', 'prompt', 'WSH' + ], false), + directive, + escapes = { + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '\'': '\\\'', + '"' : '\\"', + '/' : '\\/', + '\\': '\\\\' + }, + + funct, // The current function, including the labels used in + // the function, as well as (breakage), + // (context), (loopage), (name), (params), (token), + // (vars), (verb) + + functionicity = [ + 'closure', 'exception', 'global', 'label', 'outer', 'undef', + 'unused', 'var' + ], + + functions, // All of the functions + global_funct, // The global body + global_scope, // The global scope + html_tag = { + a: {}, + abbr: {}, + acronym: {}, + address: {}, + applet: {}, + area: {empty: true, parent: ' map '}, + article: {}, + aside: {}, + audio: {}, + b: {}, + base: {empty: true, parent: ' head '}, + bdo: {}, + big: {}, + blockquote: {}, + body: {parent: ' html noframes '}, + br: {empty: true}, + button: {}, + canvas: {parent: ' body p div th td '}, + caption: {parent: ' table '}, + center: {}, + cite: {}, + code: {}, + col: {empty: true, parent: ' table colgroup '}, + colgroup: {parent: ' table '}, + command: {parent: ' menu '}, + datalist: {}, + dd: {parent: ' dl '}, + del: {}, + details: {}, + dialog: {}, + dfn: {}, + dir: {}, + div: {}, + dl: {}, + dt: {parent: ' dl '}, + em: {}, + embed: {}, + fieldset: {}, + figure: {}, + font: {}, + footer: {}, + form: {}, + frame: {empty: true, parent: ' frameset '}, + frameset: {parent: ' html frameset '}, + h1: {}, + h2: {}, + h3: {}, + h4: {}, + h5: {}, + h6: {}, + head: {parent: ' html '}, + header: {}, + hgroup: {}, + hr: {empty: true}, + 'hta:application': + {empty: true, parent: ' head '}, + html: {parent: '*'}, + i: {}, + iframe: {}, + img: {empty: true}, + input: {empty: true}, + ins: {}, + kbd: {}, + keygen: {}, + label: {}, + legend: {parent: ' details fieldset figure '}, + li: {parent: ' dir menu ol ul '}, + link: {empty: true, parent: ' head '}, + map: {}, + mark: {}, + menu: {}, + meta: {empty: true, parent: ' head noframes noscript '}, + meter: {}, + nav: {}, + noframes: {parent: ' html body '}, + noscript: {parent: ' body head noframes '}, + object: {}, + ol: {}, + optgroup: {parent: ' select '}, + option: {parent: ' optgroup select '}, + output: {}, + p: {}, + param: {empty: true, parent: ' applet object '}, + pre: {}, + progress: {}, + q: {}, + rp: {}, + rt: {}, + ruby: {}, + samp: {}, + script: {empty: true, parent: ' body div frame head iframe p pre span '}, + section: {}, + select: {}, + small: {}, + span: {}, + source: {}, + strong: {}, + style: {parent: ' head ', empty: true}, + sub: {}, + sup: {}, + table: {}, + tbody: {parent: ' table '}, + td: {parent: ' tr '}, + textarea: {}, + tfoot: {parent: ' table '}, + th: {parent: ' tr '}, + thead: {parent: ' table '}, + time: {}, + title: {parent: ' head '}, + tr: {parent: ' table tbody thead tfoot '}, + tt: {}, + u: {}, + ul: {}, + 'var': {}, + video: {} + }, + + ids, // HTML ids + in_block, + indent, + itself, // JSLint itself + json_mode, + lex, // the tokenizer + lines, + lookahead, + node = array_to_object([ + 'Buffer', 'clearInterval', 'clearTimeout', 'console', 'exports', + 'global', 'module', 'process', 'querystring', 'require', + 'setInterval', 'setTimeout', '__dirname', '__filename' + ], false), + node_js, + numbery = array_to_object(['indexOf', 'lastIndexOf', 'search'], true), + next_token, + option, + predefined, // Global variables defined by option + prereg, + prev_token, + property, + regexp_flag = array_to_object(['g', 'i', 'm'], true), + return_this = function return_this() { + return this; + }, + rhino = array_to_object([ + 'defineClass', 'deserialize', 'gc', 'help', 'load', 'loadClass', + 'print', 'quit', 'readFile', 'readUrl', 'runCommand', 'seal', + 'serialize', 'spawn', 'sync', 'toint32', 'version' + ], false), + + scope, // An object containing an object for each variable in scope + semicolon_coda = array_to_object([';', '"', '\'', ')'], true), + src, + stack, + +// standard contains the global names that are provided by the +// ECMAScript standard. + + standard = array_to_object([ + 'Array', 'Boolean', 'Date', 'decodeURI', 'decodeURIComponent', + 'encodeURI', 'encodeURIComponent', 'Error', 'eval', 'EvalError', + 'Function', 'isFinite', 'isNaN', 'JSON', 'Math', 'Number', + 'Object', 'parseInt', 'parseFloat', 'RangeError', 'ReferenceError', + 'RegExp', 'String', 'SyntaxError', 'TypeError', 'URIError' + ], false), + + strict_mode, + syntax = {}, + tab, + token, + urls, + var_mode, + warnings, + +// widget contains the global names which are provided to a Yahoo +// (fna Konfabulator) widget. + + widget = array_to_object([ + 'alert', 'animator', 'appleScript', 'beep', 'bytesToUIString', + 'Canvas', 'chooseColor', 'chooseFile', 'chooseFolder', + 'closeWidget', 'COM', 'convertPathToHFS', 'convertPathToPlatform', + 'CustomAnimation', 'escape', 'FadeAnimation', 'filesystem', 'Flash', + 'focusWidget', 'form', 'FormField', 'Frame', 'HotKey', 'Image', + 'include', 'isApplicationRunning', 'iTunes', 'konfabulatorVersion', + 'log', 'md5', 'MenuItem', 'MoveAnimation', 'openURL', 'play', + 'Point', 'popupMenu', 'preferenceGroups', 'preferences', 'print', + 'prompt', 'random', 'Rectangle', 'reloadWidget', 'ResizeAnimation', + 'resolvePath', 'resumeUpdates', 'RotateAnimation', 'runCommand', + 'runCommandInBg', 'saveAs', 'savePreferences', 'screen', + 'ScrollBar', 'showWidgetPreferences', 'sleep', 'speak', 'Style', + 'suppressUpdates', 'system', 'tellWidget', 'Text', 'TextArea', + 'Timer', 'unescape', 'updateNow', 'URL', 'Web', 'widget', 'Window', + 'XMLDOM', 'XMLHttpRequest', 'yahooCheckLogin', 'yahooLogin', + 'yahooLogout' + ], true), + + windows = array_to_object([ + 'ActiveXObject', 'CScript', 'Debug', 'Enumerator', 'System', + 'VBArray', 'WScript', 'WSH' + ], false), + +// xmode is used to adapt to the exceptions in html parsing. +// It can have these states: +// '' .js script file +// 'html' +// 'outer' +// 'script' +// 'style' +// 'scriptstring' +// 'styleproperty' + + xmode, + xquote, + +// Regular expressions. Some of these are stupidly long. + +// unsafe comment or string + ax = /@cc|<\/?|script|\]\s*\]|<\s*!|</i, +// carriage return, carriage return linefeed, or linefeed + crlfx = /\r\n?|\n/, +// unsafe characters that are silently deleted by one or more browsers + cx = /[\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/, +// query characters for ids + dx = /[\[\]\/\\"'*<>.&:(){}+=#]/, +// html token + hx = /^\s*(['"=>\/&#]|<(?:\/|\!(?:--)?)?|[a-zA-Z][a-zA-Z0-9_\-:]*|[0-9]+|--)/, +// identifier + ix = /^([a-zA-Z_$][a-zA-Z0-9_$]*)$/, +// javascript url + jx = /^(?:javascript|jscript|ecmascript|vbscript|mocha|livescript)\s*:/i, +// star slash + lx = /\*\/|\/\*/, +// characters in strings that need escapement + nx = /[\u0000-\u001f'\\\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, +// outer html token + ox = /[>&]|<[\/!]?|--/, +// attributes characters + qx = /[^a-zA-Z0-9+\-_\/. ]/, +// style + sx = /^\s*([{}:#%.=,>+\[\]@()"';]|[*$\^~]=|[a-zA-Z_][a-zA-Z0-9_\-]*|[0-9]+|<\/|\/\*)/, + ssx = /^\s*([@#!"'};:\-%.=,+\[\]()*_]|[a-zA-Z][a-zA-Z0-9._\-]*|\/\*?|\d+(?:\.\d+)?|<\/)/, +// token + tx = /^\s*([(){}\[\]\?.,:;'"~#@`]|={1,3}|\/(\*(jslint|properties|property|members?|globals?)?|=|\/)?|\*[\/=]?|\+(?:=|\++)?|-(?:=|-+)?|[\^%]=?|&[&=]?|\|[|=]?|>{1,3}=?|<(?:[\/=!]|\!(\[|--)?|<=?)?|\!={0,2}|[a-zA-Z_$][a-zA-Z0-9_$]*|[0-9]+(?:[xX][0-9a-fA-F]+|\.[0-9]*)?(?:[eE][+\-]?[0-9]+)?)/, +// url badness + ux = /&|\+|\u00AD|\.\.|\/\*|%[^;]|base64|url|expression|data|mailto|script/i, + + rx = { + outer: hx, + html: hx, + style: sx, + styleproperty: ssx + }; + + + function F() {} // Used by Object.create + +// Provide critical ES5 functions to ES3. + + if (typeof Array.prototype.filter !== 'function') { + Array.prototype.filter = function (f) { + var i, length = this.length, result = [], value; + for (i = 0; i < length; i += 1) { + try { + value = this[i]; + if (f(value)) { + result.push(value); + } + } catch (ignore) { + } + } + return result; + }; + } + + if (typeof Array.prototype.forEach !== 'function') { + Array.prototype.forEach = function (f) { + var i, length = this.length; + for (i = 0; i < length; i += 1) { + try { + f(this[i]); + } catch (ignore) { + } + } + }; + } + + if (typeof Array.isArray !== 'function') { + Array.isArray = function (o) { + return Object.prototype.toString.apply(o) === '[object Array]'; + }; + } + + if (!Object.prototype.hasOwnProperty.call(Object, 'create')) { + Object.create = function (o) { + F.prototype = o; + return new F(); + }; + } + + if (typeof Object.keys !== 'function') { + Object.keys = function (o) { + var array = [], key; + for (key in o) { + if (Object.prototype.hasOwnProperty.call(o, key)) { + array.push(key); + } + } + return array; + }; + } + + if (typeof String.prototype.entityify !== 'function') { + String.prototype.entityify = function () { + return this + .replace(/&/g, '&') + .replace(//g, '>'); + }; + } + + if (typeof String.prototype.isAlpha !== 'function') { + String.prototype.isAlpha = function () { + return (this >= 'a' && this <= 'z\uffff') || + (this >= 'A' && this <= 'Z\uffff'); + }; + } + + if (typeof String.prototype.isDigit !== 'function') { + String.prototype.isDigit = function () { + return (this >= '0' && this <= '9'); + }; + } + + if (typeof String.prototype.supplant !== 'function') { + String.prototype.supplant = function (o) { + return this.replace(/\{([^{}]*)\}/g, function (a, b) { + var replacement = o[b]; + return typeof replacement === 'string' || + typeof replacement === 'number' ? replacement : a; + }); + }; + } + + + function sanitize(a) { + +// Escapify a troublesome character. + + return escapes[a] || + '\\u' + ('0000' + a.charCodeAt().toString(16)).slice(-4); + } + + + function add_to_predefined(group) { + Object.keys(group).forEach(function (name) { + predefined[name] = group[name]; + }); + } + + + function assume() { + if (!option.safe) { + if (option.rhino) { + add_to_predefined(rhino); + option.rhino = false; + } + if (option.devel) { + add_to_predefined(devel); + option.devel = false; + } + if (option.browser) { + add_to_predefined(browser); + option.browser = false; + } + if (option.windows) { + add_to_predefined(windows); + option.windows = false; + } + if (option.node) { + add_to_predefined(node); + option.node = false; + node_js = true; + } + if (option.widget) { + add_to_predefined(widget); + option.widget = false; + } + } + } + + +// Produce an error warning. + + function artifact(tok) { + if (!tok) { + tok = next_token; + } + return tok.number || tok.string; + } + + function quit(message, line, character) { + throw { + name: 'JSLintError', + line: line, + character: character, + message: bundle.scanned_a_b.supplant({ + a: message, + b: Math.floor((line / lines.length) * 100) + }) + }; + } + + function warn(message, offender, a, b, c, d) { + var character, line, warning; + offender = offender || next_token; // ~~ + line = offender.line || 0; + character = offender.from || 0; + warning = { + id: '(error)', + raw: bundle[message] || message, + evidence: lines[line - 1] || '', + line: line, + character: character, + a: a || (offender.id === '(number)' + ? String(offender.number) + : offender.string), + b: b, + c: c, + d: d + }; + warning.reason = warning.raw.supplant(warning); + JSLINT.errors.push(warning); + if (option.passfail) { + quit(bundle.stopping, line, character); + } + warnings += 1; + if (warnings >= option.maxerr) { + quit(bundle.too_many, line, character); + } + return warning; + } + + function warn_at(message, line, character, a, b, c, d) { + return warn(message, { + line: line, + from: character + }, a, b, c, d); + } + + function stop(message, offender, a, b, c, d) { + var warning = warn(message, offender, a, b, c, d); + quit(bundle.stopping, warning.line, warning.character); + } + + function stop_at(message, line, character, a, b, c, d) { + return stop(message, { + line: line, + from: character + }, a, b, c, d); + } + + function expected_at(at) { + if (!option.white && next_token.from !== at) { + warn('expected_a_at_b_c', next_token, '', at, + next_token.from); + } + } + + function aint(it, name, expected) { + if (it[name] !== expected) { + warn('expected_a_b', it, expected, it[name]); + return true; + } + return false; + } + + +// lexical analysis and token construction + + lex = (function lex() { + var character, c, from, length, line, pos, source_row; + +// Private lex methods + + function next_line() { + var at; + if (line >= lines.length) { + return false; + } + character = 1; + source_row = lines[line]; + line += 1; + at = source_row.search(/ \t/); + if (at >= 0) { + warn_at('mixed', line, at + 1); + } + source_row = source_row.replace(/\t/g, tab); + at = source_row.search(cx); + if (at >= 0) { + warn_at('unsafe', line, at); + } + if (option.maxlen && option.maxlen < source_row.length) { + warn_at('too_long', line, source_row.length); + } + return true; + } + +// Produce a token object. The token inherits from a syntax symbol. + + function it(type, value) { + var id, the_token; + if (type === '(string)' || type === '(range)') { + if (jx.test(value)) { + warn_at('url', line, from); + } + } + the_token = Object.create(syntax[( + type === '(punctuator)' || (type === '(identifier)' && + Object.prototype.hasOwnProperty.call(syntax, value)) + ? value + : type + )] || syntax['(error)']); + if (type === '(identifier)') { + the_token.identifier = true; + if (value === '__iterator__' || value === '__proto__') { + stop_at('reserved_a', line, from, value); + } else if (!option.nomen && + (value.charAt(0) === '_' || + value.charAt(value.length - 1) === '_')) { + warn_at('dangling_a', line, from, value); + } + } + if (type === '(number)') { + the_token.number = +value; + } else if (value !== undefined) { + the_token.string = String(value); + } + the_token.line = line; + the_token.from = from; + the_token.thru = character; + id = the_token.id; + prereg = id && ( + ('(,=:[!&|?{};'.indexOf(id.charAt(id.length - 1)) >= 0) || + id === 'return' || id === 'case' + ); + return the_token; + } + + function match(x) { + var exec = x.exec(source_row), first; + if (exec) { + length = exec[0].length; + first = exec[1]; + c = first.charAt(0); + source_row = source_row.slice(length); + from = character + length - first.length; + character += length; + return first; + } + } + + function string(x) { + var c, pos = 0, r = '', result; + + function hex(n) { + var i = parseInt(source_row.substr(pos + 1, n), 16); + pos += n; + if (i >= 32 && i <= 126 && + i !== 34 && i !== 92 && i !== 39) { + warn_at('unexpected_a', line, character, '\\'); + } + character += n; + c = String.fromCharCode(i); + } + + if (json_mode && x !== '"') { + warn_at('expected_a', line, character, '"'); + } + + if (xquote === x || (xmode === 'scriptstring' && !xquote)) { + return it('(punctuator)', x); + } + + for (;;) { + while (pos >= source_row.length) { + pos = 0; + if (xmode !== 'html' || !next_line()) { + stop_at('unclosed', line, from); + } + } + c = source_row.charAt(pos); + if (c === x) { + character += 1; + source_row = source_row.slice(pos + 1); + result = it('(string)', r); + result.quote = x; + return result; + } + if (c < ' ') { + if (c === '\n' || c === '\r') { + break; + } + warn_at('control_a', line, character + pos, + source_row.slice(0, pos)); + } else if (c === xquote) { + warn_at('bad_html', line, character + pos); + } else if (c === '<') { + if (option.safe && xmode === 'html') { + warn_at('adsafe_a', line, character + pos, c); + } else if (source_row.charAt(pos + 1) === '/' && (xmode || option.safe)) { + warn_at('expected_a_b', line, character, + '<\\/', '= '0' && c <= '7' ? 'octal_a' : 'unexpected_a', + line, character, '\\' + c); + } else { + c = descapes[c]; + } + } + } + } + r += c; + character += 1; + pos += 1; + } + } + + function number(snippet) { + var digit; + if (xmode !== 'style' && xmode !== 'styleproperty' && + source_row.charAt(0).isAlpha()) { + warn_at('expected_space_a_b', + line, character, c, source_row.charAt(0)); + } + if (c === '0') { + digit = snippet.charAt(1); + if (digit.isDigit()) { + if (token.id !== '.' && xmode !== 'styleproperty') { + warn_at('unexpected_a', line, character, snippet); + } + } else if (json_mode && (digit === 'x' || digit === 'X')) { + warn_at('unexpected_a', line, character, '0x'); + } + } + if (snippet.slice(snippet.length - 1) === '.') { + warn_at('trailing_decimal_a', line, character, snippet); + } + if (xmode !== 'style') { + digit = +snippet; + if (!isFinite(digit)) { + warn_at('bad_number', line, character, snippet); + } + snippet = digit; + } + return it('(number)', snippet); + } + + function comment(snippet) { + if (comments_off || src || (xmode && xmode !== 'script' && + xmode !== 'style' && xmode !== 'styleproperty')) { + warn_at('unexpected_comment', line, character); + } else if (xmode === 'script' && /<\//i.test(source_row)) { + warn_at('unexpected_a', line, character, '<\/'); + } else if (option.safe && ax.test(snippet)) { + warn_at('dangerous_comment', line, character); + } + } + + function regexp() { + var b, + bit, + captures = 0, + depth = 0, + flag = '', + high, + letter, + length = 0, + low, + potential, + quote, + result; + for (;;) { + b = true; + c = source_row.charAt(length); + length += 1; + switch (c) { + case '': + stop_at('unclosed_regexp', line, from); + return; + case '/': + if (depth > 0) { + warn_at('unescaped_a', line, from + length, '/'); + } + c = source_row.slice(0, length - 1); + potential = Object.create(regexp_flag); + for (;;) { + letter = source_row.charAt(length); + if (potential[letter] !== true) { + break; + } + potential[letter] = false; + length += 1; + flag += letter; + } + if (source_row.charAt(length).isAlpha()) { + stop_at('unexpected_a', line, from, source_row.charAt(length)); + } + character += length; + source_row = source_row.slice(length); + quote = source_row.charAt(0); + if (quote === '/' || quote === '*') { + stop_at('confusing_regexp', line, from); + } + result = it('(regexp)', c); + result.flag = flag; + return result; + case '\\': + c = source_row.charAt(length); + if (c < ' ') { + warn_at('control_a', line, from + length, String(c)); + } else if (c === '<') { + warn_at(bundle.unexpected_a, line, from + length, '\\'); + } + length += 1; + break; + case '(': + depth += 1; + b = false; + if (source_row.charAt(length) === '?') { + length += 1; + switch (source_row.charAt(length)) { + case ':': + case '=': + case '!': + length += 1; + break; + default: + warn_at(bundle.expected_a_b, line, from + length, + ':', source_row.charAt(length)); + } + } else { + captures += 1; + } + break; + case '|': + b = false; + break; + case ')': + if (depth === 0) { + warn_at('unescaped_a', line, from + length, ')'); + } else { + depth -= 1; + } + break; + case ' ': + pos = 1; + while (source_row.charAt(length) === ' ') { + length += 1; + pos += 1; + } + if (pos > 1) { + warn_at('use_braces', line, from + length, pos); + } + break; + case '[': + c = source_row.charAt(length); + if (c === '^') { + length += 1; + if (!option.regexp) { + warn_at('insecure_a', line, from + length, c); + } else if (source_row.charAt(length) === ']') { + stop_at('unescaped_a', line, from + length, '^'); + } + } + bit = false; + if (c === ']') { + warn_at('empty_class', line, from + length - 1); + bit = true; + } +klass: do { + c = source_row.charAt(length); + length += 1; + switch (c) { + case '[': + case '^': + warn_at('unescaped_a', line, from + length, c); + bit = true; + break; + case '-': + if (bit) { + bit = false; + } else { + warn_at('unescaped_a', line, from + length, '-'); + bit = true; + } + break; + case ']': + if (!bit) { + warn_at('unescaped_a', line, from + length - 1, '-'); + } + break klass; + case '\\': + c = source_row.charAt(length); + if (c < ' ') { + warn_at(bundle.control_a, line, from + length, String(c)); + } else if (c === '<') { + warn_at(bundle.unexpected_a, line, from + length, '\\'); + } + length += 1; + bit = true; + break; + case '/': + warn_at('unescaped_a', line, from + length - 1, '/'); + bit = true; + break; + case '<': + if (xmode === 'script') { + c = source_row.charAt(length); + if (c === '!' || c === '/') { + warn_at(bundle.html_confusion_a, line, + from + length, c); + } + } + bit = true; + break; + default: + bit = true; + } + } while (c); + break; + case '.': + if (!option.regexp) { + warn_at('insecure_a', line, from + length, c); + } + break; + case ']': + case '?': + case '{': + case '}': + case '+': + case '*': + warn_at('unescaped_a', line, from + length, c); + break; + case '<': + if (xmode === 'script') { + c = source_row.charAt(length); + if (c === '!' || c === '/') { + warn_at(bundle.html_confusion_a, line, from + length, c); + } + } + break; + } + if (b) { + switch (source_row.charAt(length)) { + case '?': + case '+': + case '*': + length += 1; + if (source_row.charAt(length) === '?') { + length += 1; + } + break; + case '{': + length += 1; + c = source_row.charAt(length); + if (c < '0' || c > '9') { + warn_at(bundle.expected_number_a, line, + from + length, c); + } + length += 1; + low = +c; + for (;;) { + c = source_row.charAt(length); + if (c < '0' || c > '9') { + break; + } + length += 1; + low = +c + (low * 10); + } + high = low; + if (c === ',') { + length += 1; + high = Infinity; + c = source_row.charAt(length); + if (c >= '0' && c <= '9') { + length += 1; + high = +c; + for (;;) { + c = source_row.charAt(length); + if (c < '0' || c > '9') { + break; + } + length += 1; + high = +c + (high * 10); + } + } + } + if (source_row.charAt(length) !== '}') { + warn_at(bundle.expected_a_b, line, from + length, + '}', c); + } else { + length += 1; + } + if (source_row.charAt(length) === '?') { + length += 1; + } + if (low > high) { + warn_at(bundle.not_greater, line, from + length, + low, high); + } + break; + } + } + } + c = source_row.slice(0, length - 1); + character += length; + source_row = source_row.slice(length); + return it('(regexp)', c); + } + +// Public lex methods + + return { + init: function (source) { + if (typeof source === 'string') { + lines = source.split(crlfx); + } else { + lines = source; + } + line = 0; + next_line(); + from = 1; + }, + + range: function (begin, end) { + var c, value = ''; + from = character; + if (source_row.charAt(0) !== begin) { + stop_at('expected_a_b', line, character, begin, + source_row.charAt(0)); + } + for (;;) { + source_row = source_row.slice(1); + character += 1; + c = source_row.charAt(0); + switch (c) { + case '': + stop_at('missing_a', line, character, c); + break; + case end: + source_row = source_row.slice(1); + character += 1; + return it('(range)', value); + case xquote: + case '\\': + warn_at('unexpected_a', line, character, c); + break; + } + value += c; + } + }, + +// token -- this is called by advance to get the next token. + + token: function () { + var c, i, snippet; + + for (;;) { + while (!source_row) { + if (!next_line()) { + return it('(end)'); + } + } + while (xmode === 'outer') { + i = source_row.search(ox); + if (i === 0) { + break; + } else if (i > 0) { + character += 1; + source_row = source_row.slice(i); + break; + } else { + if (!next_line()) { + return it('(end)', ''); + } + } + } + snippet = match(rx[xmode] || tx); + if (!snippet) { + if (source_row) { + if (source_row.charAt(0) === ' ') { + if (!option.white) { + warn_at('unexpected_a', line, character, + '(space)'); + } + character += 1; + source_row = ''; + } else { + stop_at('unexpected_a', line, character, + source_row.charAt(0)); + } + } + } else { + +// identifier + + c = snippet.charAt(0); + if (c.isAlpha() || c === '_' || c === '$') { + return it('(identifier)', snippet); + } + +// number + + if (c.isDigit()) { + return number(snippet); + } + switch (snippet) { + +// string + + case '"': + case "'": + return string(snippet); + +// // comment + + case '//': + comment(source_row); + source_row = ''; + break; + +// /* comment + + case '/*': + for (;;) { + i = source_row.search(lx); + if (i >= 0) { + break; + } + comment(source_row); + if (!next_line()) { + stop_at('unclosed_comment', line, character); + } + } + comment(source_row.slice(0, i)); + character += i + 2; + if (source_row.charAt(i) === '/') { + stop_at('nested_comment', line, character); + } + source_row = source_row.slice(i + 2); + break; + + case '': + break; +// / + case '/': + if (token.id === '/=') { + stop_at( + bundle.slash_equal, + line, + from + ); + } + return prereg + ? regexp() + : it('(punctuator)', snippet); + +// punctuator + + case ''); + } + character += 3; + source_row = source_row.slice(i + 3); + break; + case '#': + if (xmode === 'html' || xmode === 'styleproperty') { + for (;;) { + c = source_row.charAt(0); + if ((c < '0' || c > '9') && + (c < 'a' || c > 'f') && + (c < 'A' || c > 'F')) { + break; + } + character += 1; + source_row = source_row.slice(1); + snippet += c; + } + if (snippet.length !== 4 && snippet.length !== 7) { + warn_at('bad_color_a', line, + from + length, snippet); + } + return it('(color)', snippet); + } + return it('(punctuator)', snippet); + + default: + if (xmode === 'outer' && c === '&') { + character += 1; + source_row = source_row.slice(1); + for (;;) { + c = source_row.charAt(0); + character += 1; + source_row = source_row.slice(1); + if (c === ';') { + break; + } + if (!((c >= '0' && c <= '9') || + (c >= 'a' && c <= 'z') || + c === '#')) { + stop_at('bad_entity', line, from + length, + character); + } + } + break; + } + return it('(punctuator)', snippet); + } + } + } + } + }; + }()); + + + function add_label(token, kind, name) { + +// Define the symbol in the current function in the current scope. + + name = name || token.string; + +// Global variables cannot be created in the safe subset. If a global variable +// already exists, do nothing. If it is predefined, define it. + + if (funct === global_funct) { + if (option.safe) { + warn('adsafe_a', token, name); + } + if (typeof global_funct[name] !== 'string') { + token.writeable = typeof predefined[name] === 'boolean' + ? predefined[name] + : true; + token.funct = funct; + global_scope[name] = token; + } + if (kind === 'becoming') { + kind = 'var'; + } + +// Ordinary variables. + + } else { + +// Warn if the variable already exists. + + if (typeof funct[name] === 'string') { + if (funct[name] === 'undef') { + if (!option.undef) { + warn('used_before_a', token, name); + } + kind = 'var'; + } else { + warn('already_defined', token, name); + } + } else { + +// Add the symbol to the current function. + + token.funct = funct; + token.writeable = true; + scope[name] = token; + } + } + funct[name] = kind; + } + + + function peek(distance) { + +// Peek ahead to a future token. The distance is how far ahead to look. The +// default is the next token. + + var found, slot = 0; + + distance = distance || 0; + while (slot <= distance) { + found = lookahead[slot]; + if (!found) { + found = lookahead[slot] = lex.token(); + } + slot += 1; + } + return found; + } + + + function advance(id, match) { + +// Produce the next token, also looking for programming errors. + + if (indent) { + +// If indentation checking was requested, then inspect all of the line breakings. +// The var statement is tricky because the names might be aligned or not. We +// look at the first line break after the var to determine the programmer's +// intention. + + if (var_mode && next_token.line !== token.line) { + if ((var_mode !== indent || !next_token.edge) && + next_token.from === indent.at - + (next_token.edge ? option.indent : 0)) { + var dent = indent; + for (;;) { + dent.at -= option.indent; + if (dent === var_mode) { + break; + } + dent = dent.was; + } + dent.open = false; + } + var_mode = null; + } + if (next_token.id === '?' && indent.mode === ':' && + token.line !== next_token.line) { + indent.at -= option.indent; + } + if (indent.open) { + +// If the token is an edge. + + if (next_token.edge) { + if (next_token.edge === 'label') { + expected_at(1); + } else if (next_token.edge === 'case' || indent.mode === 'statement') { + expected_at(indent.at - option.indent); + } else if (indent.mode !== 'array' || next_token.line !== token.line) { + expected_at(indent.at); + } + +// If the token is not an edge, but is the first token on the line. + + } else if (next_token.line !== token.line) { + if (next_token.from < indent.at + (indent.mode === + 'expression' ? 0 : option.indent)) { + expected_at(indent.at + option.indent); + } + indent.wrap = true; + } + } else if (next_token.line !== token.line) { + if (next_token.edge) { + expected_at(indent.at); + } else { + indent.wrap = true; + if (indent.mode === 'statement' || indent.mode === 'var') { + expected_at(indent.at + option.indent); + } else if (next_token.from < indent.at + (indent.mode === + 'expression' ? 0 : option.indent)) { + expected_at(indent.at + option.indent); + } + } + } + } + + switch (token.id) { + case '(number)': + if (next_token.id === '.') { + warn('trailing_decimal_a'); + } + break; + case '-': + if (next_token.id === '-' || next_token.id === '--') { + warn('confusing_a'); + } + break; + case '+': + if (next_token.id === '+' || next_token.id === '++') { + warn('confusing_a'); + } + break; + } + if (token.id === '(string)' || token.identifier) { + anonname = token.string; + } + + if (id && next_token.id !== id) { + if (match) { + warn('expected_a_b_from_c_d', next_token, id, + match.id, match.line, artifact()); + } else if (!next_token.identifier || next_token.string !== id) { + warn('expected_a_b', next_token, id, artifact()); + } + } + prev_token = token; + token = next_token; + next_token = lookahead.shift() || lex.token(); + } + + + function advance_identifier(string) { + if (next_token.identifier && next_token.string === string) { + advance(); + } else { + warn('expected_a_b', next_token, string, artifact()); + } + } + + + function do_safe() { + if (option.adsafe) { + option.safe = true; + } + if (option.safe) { + option.browser = + option['continue'] = + option.css = + option.debug = + option.devel = + option.evil = + option.forin = + option.newcap = + option.nomen = + option.on = + option.rhino = + option.sloppy = + option.sub = + option.undef = + option.widget = + option.windows = false; + + + delete predefined.Array; + delete predefined.Date; + delete predefined.Function; + delete predefined.Object; + delete predefined['eval']; + + add_to_predefined({ + ADSAFE: false, + lib: false + }); + } + } + + + function do_globals() { + var name, writeable; + for (;;) { + if (next_token.id !== '(string)' && !next_token.identifier) { + return; + } + name = next_token.string; + advance(); + writeable = false; + if (next_token.id === ':') { + advance(':'); + switch (next_token.id) { + case 'true': + writeable = predefined[name] !== false; + advance('true'); + break; + case 'false': + advance('false'); + break; + default: + stop('unexpected_a'); + } + } + predefined[name] = writeable; + if (next_token.id !== ',') { + return; + } + advance(','); + } + } + + + function do_jslint() { + var name, value; + while (next_token.id === '(string)' || next_token.identifier) { + name = next_token.string; + if (!allowed_option[name]) { + stop('unexpected_a'); + } + advance(); + if (next_token.id !== ':') { + stop('expected_a_b', next_token, ':', artifact()); + } + advance(':'); + if (typeof allowed_option[name] === 'number') { + value = next_token.number; + if (value > allowed_option[name] || value <= 0 || + Math.floor(value) !== value) { + stop('expected_small_a'); + } + option[name] = value; + } else { + if (next_token.id === 'true') { + option[name] = true; + } else if (next_token.id === 'false') { + option[name] = false; + } else { + stop('unexpected_a'); + } + } + advance(); + if (next_token.id === ',') { + advance(','); + } + } + assume(); + } + + + function do_properties() { + var name; + option.properties = true; + for (;;) { + if (next_token.id !== '(string)' && !next_token.identifier) { + return; + } + name = next_token.string; + advance(); + if (next_token.id === ':') { + for (;;) { + advance(); + if (next_token.id !== '(string)' && !next_token.identifier) { + break; + } + } + } + property[name] = 0; + if (next_token.id !== ',') { + return; + } + advance(','); + } + } + + + directive = function directive() { + var command = this.id, + old_comments_off = comments_off, + old_indent = indent; + comments_off = true; + indent = null; + if (next_token.line === token.line && next_token.from === token.thru) { + warn('missing_space_a_b', next_token, artifact(token), artifact()); + } + if (lookahead.length > 0) { + warn('unexpected_a', this); + } + switch (command) { + case '/*properties': + case '/*property': + case '/*members': + case '/*member': + do_properties(); + break; + case '/*jslint': + if (option.safe) { + warn('adsafe_a', this); + } + do_jslint(); + break; + case '/*globals': + case '/*global': + if (option.safe) { + warn('adsafe_a', this); + } + do_globals(); + break; + default: + stop('unexpected_a', this); + } + comments_off = old_comments_off; + advance('*/'); + indent = old_indent; + }; + + +// Indentation intention + + function edge(mode) { + next_token.edge = indent ? indent.open && (mode || 'edge') : ''; + } + + + function step_in(mode) { + var open; + if (typeof mode === 'number') { + indent = { + at: +mode, + open: true, + was: indent + }; + } else if (!indent) { + indent = { + at: 1, + mode: 'statement', + open: true + }; + } else if (mode === 'statement') { + indent = { + at: indent.at, + open: true, + was: indent + }; + } else { + open = mode === 'var' || next_token.line !== token.line; + indent = { + at: (open || mode === 'control' + ? indent.at + option.indent + : indent.at) + (indent.wrap ? option.indent : 0), + mode: mode, + open: open, + was: indent + }; + if (mode === 'var' && open) { + var_mode = indent; + } + } + } + + function step_out(id, symbol) { + if (id) { + if (indent && indent.open) { + indent.at -= option.indent; + edge(); + } + advance(id, symbol); + } + if (indent) { + indent = indent.was; + } + } + +// Functions for conformance of whitespace. + + function one_space(left, right) { + left = left || token; + right = right || next_token; + if (right.id !== '(end)' && !option.white && + (token.line !== right.line || + token.thru + 1 !== right.from)) { + warn('expected_space_a_b', right, artifact(token), artifact(right)); + } + } + + function one_space_only(left, right) { + left = left || token; + right = right || next_token; + if (right.id !== '(end)' && (left.line !== right.line || + (!option.white && left.thru + 1 !== right.from))) { + warn('expected_space_a_b', right, artifact(left), artifact(right)); + } + } + + function no_space(left, right) { + left = left || token; + right = right || next_token; + if ((!option.white || xmode === 'styleproperty' || xmode === 'style') && + left.thru !== right.from && left.line === right.line) { + warn('unexpected_space_a_b', right, artifact(left), artifact(right)); + } + } + + function no_space_only(left, right) { + left = left || token; + right = right || next_token; + if (right.id !== '(end)' && (left.line !== right.line || + (!option.white && left.thru !== right.from))) { + warn('unexpected_space_a_b', right, artifact(left), artifact(right)); + } + } + + function spaces(left, right) { + if (!option.white) { + left = left || token; + right = right || next_token; + if (left.thru === right.from && left.line === right.line) { + warn('missing_space_a_b', right, artifact(left), artifact(right)); + } + } + } + + function comma() { + if (next_token.id !== ',') { + warn_at('expected_a_b', token.line, token.thru, ',', artifact()); + } else { + if (!option.white) { + no_space_only(); + } + advance(','); + spaces(); + } + } + + + function semicolon() { + if (next_token.id !== ';') { + warn_at('expected_a_b', token.line, token.thru, ';', artifact()); + } else { + if (!option.white) { + no_space_only(); + } + advance(';'); + if (semicolon_coda[next_token.id] !== true) { + spaces(); + } + } + } + + function use_strict() { + if (next_token.string === 'use strict') { + if (strict_mode) { + warn('unnecessary_use'); + } + edge(); + advance(); + semicolon(); + strict_mode = true; + option.undef = false; + return true; + } + return false; + } + + + function are_similar(a, b) { + if (a === b) { + return true; + } + if (Array.isArray(a)) { + if (Array.isArray(b) && a.length === b.length) { + var i; + for (i = 0; i < a.length; i += 1) { + if (!are_similar(a[i], b[i])) { + return false; + } + } + return true; + } + return false; + } + if (Array.isArray(b)) { + return false; + } + if (a.id === '(number)' && b.id === '(number)') { + return a.number === b.number; + } + if (a.arity === b.arity && a.string === b.string) { + switch (a.arity) { + case 'prefix': + case 'suffix': + case undefined: + return a.id === b.id && are_similar(a.first, b.first); + case 'infix': + return are_similar(a.first, b.first) && + are_similar(a.second, b.second); + case 'ternary': + return are_similar(a.first, b.first) && + are_similar(a.second, b.second) && + are_similar(a.third, b.third); + case 'function': + case 'regexp': + return false; + default: + return true; + } + } else { + if (a.id === '.' && b.id === '[' && b.arity === 'infix') { + return a.second.string === b.second.string && b.second.id === '(string)'; + } + if (a.id === '[' && a.arity === 'infix' && b.id === '.') { + return a.second.string === b.second.string && a.second.id === '(string)'; + } + } + return false; + } + + +// This is the heart of JSLINT, the Pratt parser. In addition to parsing, it +// is looking for ad hoc lint patterns. We add .fud to Pratt's model, which is +// like .nud except that it is only used on the first token of a statement. +// Having .fud makes it much easier to define statement-oriented languages like +// JavaScript. I retained Pratt's nomenclature. + +// .nud Null denotation +// .fud First null denotation +// .led Left denotation +// lbp Left binding power +// rbp Right binding power + +// They are elements of the parsing method called Top Down Operator Precedence. + + function expression(rbp, initial) { + +// rbp is the right binding power. +// initial indicates that this is the first expression of a statement. + + var left; + if (next_token.id === '(end)') { + stop('unexpected_a', token, next_token.id); + } + advance(); + if (option.safe && scope[token.string] && + scope[token.string] === global_scope[token.string] && + (next_token.id !== '(' && next_token.id !== '.')) { + warn('adsafe_a', token); + } + if (initial) { + anonname = 'anonymous'; + funct['(verb)'] = token.string; + } + if (initial === true && token.fud) { + left = token.fud(); + } else { + if (token.nud) { + left = token.nud(); + } else { + if (next_token.id === '(number)' && token.id === '.') { + warn('leading_decimal_a', token, artifact()); + advance(); + return token; + } + stop('expected_identifier_a', token, token.id); + } + while (rbp < next_token.lbp) { + advance(); + if (token.led) { + left = token.led(left); + } else { + stop('expected_operator_a', token, token.id); + } + } + } + return left; + } + + +// Functional constructors for making the symbols that will be inherited by +// tokens. + + function symbol(s, p) { + var x = syntax[s]; + if (!x || typeof x !== 'object') { + syntax[s] = x = { + id: s, + lbp: p || 0, + string: s + }; + } + return x; + } + + function postscript(x) { + x.postscript = true; + return x; + } + + function ultimate(s) { + var x = symbol(s, 0); + x.from = 1; + x.thru = 1; + x.line = 0; + x.edge = 'edge'; + s.string = s; + return postscript(x); + } + + + function stmt(s, f) { + var x = symbol(s); + x.identifier = x.reserved = true; + x.fud = f; + return x; + } + + function labeled_stmt(s, f) { + var x = stmt(s, f); + x.labeled = true; + } + + function disrupt_stmt(s, f) { + var x = stmt(s, f); + x.disrupt = true; + } + + + function reserve_name(x) { + var c = x.id.charAt(0); + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { + x.identifier = x.reserved = true; + } + return x; + } + + + function prefix(s, f) { + var x = symbol(s, 150); + reserve_name(x); + x.nud = typeof f === 'function' + ? f + : function () { + if (s === 'typeof') { + one_space(); + } else { + no_space_only(); + } + this.first = expression(150); + this.arity = 'prefix'; + if (this.id === '++' || this.id === '--') { + if (!option.plusplus) { + warn('unexpected_a', this); + } else if ((!this.first.identifier || this.first.reserved) && + this.first.id !== '.' && this.first.id !== '[') { + warn('bad_operand', this); + } + } + return this; + }; + return x; + } + + + function type(s, t, nud) { + var x = symbol(s); + x.arity = t; + if (nud) { + x.nud = nud; + } + return x; + } + + + function reserve(s, f) { + var x = symbol(s); + x.identifier = x.reserved = true; + if (typeof f === 'function') { + x.nud = f; + } + return x; + } + + + function constant(name) { + var x = reserve(name); + x.string = name; + x.nud = return_this; + return x; + } + + + function reservevar(s, v) { + return reserve(s, function () { + if (typeof v === 'function') { + v(this); + } + return this; + }); + } + + + function infix(s, p, f, w) { + var x = symbol(s, p); + reserve_name(x); + x.led = function (left) { + this.arity = 'infix'; + if (!w) { + spaces(prev_token, token); + spaces(); + } + if (!option.bitwise && this.bitwise) { + warn('unexpected_a', this); + } + if (typeof f === 'function') { + return f(left, this); + } + this.first = left; + this.second = expression(p); + return this; + }; + return x; + } + + function expected_relation(node, message) { + if (node.assign) { + warn(message || bundle.conditional_assignment, node); + } + return node; + } + + function expected_condition(node, message) { + switch (node.id) { + case '[': + case '-': + if (node.arity !== 'infix') { + warn(message || bundle.weird_condition, node); + } + break; + case 'false': + case 'function': + case 'Infinity': + case 'NaN': + case 'null': + case 'true': + case 'undefined': + case 'void': + case '(number)': + case '(regexp)': + case '(string)': + case '{': + warn(message || bundle.weird_condition, node); + break; + case '(': + if (node.first.id === '.' && numbery[node.first.second.string] === true) { + warn(message || bundle.weird_condition, node); + } + break; + } + return node; + } + + function check_relation(node) { + switch (node.arity) { + case 'prefix': + switch (node.id) { + case '{': + case '[': + warn('unexpected_a', node); + break; + case '!': + warn('confusing_a', node); + break; + } + break; + case 'function': + case 'regexp': + warn('unexpected_a', node); + break; + default: + if (node.id === 'NaN') { + warn('isNaN', node); + } + } + return node; + } + + + function relation(s, eqeq) { + return infix(s, 100, function (left, that) { + check_relation(left); + if (eqeq && !option.eqeq) { + warn('expected_a_b', that, eqeq, that.id); + } + var right = expression(100); + if (are_similar(left, right) || + ((left.id === '(string)' || left.id === '(number)') && + (right.id === '(string)' || right.id === '(number)'))) { + warn('weird_relation', that); + } + that.first = left; + that.second = check_relation(right); + return that; + }); + } + + + function assignop(s, op) { + var x = infix(s, 20, function (left, that) { + var l; + that.first = left; + if (left.identifier) { + if (scope[left.string]) { + if (scope[left.string].writeable === false) { + warn('read_only', left); + } + } else { + stop('read_only'); + } + if (funct['(params)']) { + funct['(params)'].forEach(function (value) { + if (value.string === left.string) { + value.assign = true; + } + }); + } + } else if (option.safe) { + l = left; + do { + if (typeof predefined[l.string] === 'boolean') { + warn('adsafe_a', l); + } + l = l.first; + } while (l); + } + if (left === syntax['function']) { + warn('identifier_function', token); + } + if (left.id === '.' || left.id === '[') { + if (!left.first || left.first.string === 'arguments') { + warn('bad_assignment', that); + } + } else if (left.identifier) { + if (!left.reserved && funct[left.string] === 'exception') { + warn('assign_exception', left); + } + } else { + warn('bad_assignment', that); + } + that.second = expression(19); + if (that.id === '=' && are_similar(that.first, that.second)) { + warn('weird_assignment', that); + } + return that; + }); + x.assign = true; + if (op) { + if (syntax[op].bitwise) { + x.bitwise = true; + } + } + return x; + } + + + function bitwise(s, p) { + var x = infix(s, p, 'number'); + x.bitwise = true; + return x; + } + + + function suffix(s) { + var x = symbol(s, 150); + x.led = function (left) { + no_space_only(prev_token, token); + if (!option.plusplus) { + warn('unexpected_a', this); + } else if ((!left.identifier || left.reserved) && + left.id !== '.' && left.id !== '[') { + warn('bad_operand', this); + } + this.first = left; + this.arity = 'suffix'; + return this; + }; + return x; + } + + + function optional_identifier() { + if (next_token.identifier) { + advance(); + if (option.safe && banned[token.string]) { + warn('adsafe_a', token); + } else if (token.reserved && !option.es5) { + warn('expected_identifier_a_reserved', token); + } + return token.string; + } + } + + + function identifier() { + var i = optional_identifier(); + if (!i) { + stop(token.id === 'function' && next_token.id === '(' + ? 'name_function' + : 'expected_identifier_a'); + } + return i; + } + + + function statement() { + + var label, old_scope = scope, the_statement; + +// We don't like the empty statement. + + if (next_token.id === ';') { + warn('unexpected_a'); + semicolon(); + return; + } + +// Is this a labeled statement? + + if (next_token.identifier && !next_token.reserved && peek().id === ':') { + edge('label'); + label = next_token; + advance(); + advance(':'); + scope = Object.create(old_scope); + add_label(label, 'label'); + if (next_token.labeled !== true || funct === global_funct) { + stop('unexpected_label_a', label); + } else if (jx.test(label.string + ':')) { + warn('url', label); + } + next_token.label = label; + } + +// Parse the statement. + + if (token.id !== 'else') { + edge(); + } + step_in('statement'); + the_statement = expression(0, true); + if (the_statement) { + +// Look for the final semicolon. + + if (the_statement.arity === 'statement') { + if (the_statement.id === 'switch' || + (the_statement.block && the_statement.id !== 'do')) { + spaces(); + } else { + semicolon(); + } + } else { + +// If this is an expression statement, determine if it is acceptable. +// We do not like +// new Blah(); +// statments. If it is to be used at all, new should only be used to make +// objects, not side effects. The expression statements we do like do +// assignment or invocation or delete. + + if (the_statement.id === '(') { + if (the_statement.first.id === 'new') { + warn('bad_new'); + } + } else if (!the_statement.assign && + the_statement.id !== 'delete' && + the_statement.id !== '++' && + the_statement.id !== '--') { + warn('assignment_function_expression', token); + } + semicolon(); + } + } + step_out(); + scope = old_scope; + return the_statement; + } + + + function statements() { + var array = [], disruptor, the_statement; + +// A disrupt statement may not be followed by any other statement. +// If the last statement is disrupt, then the sequence is disrupt. + + while (next_token.postscript !== true) { + if (next_token.id === ';') { + warn('unexpected_a', next_token); + semicolon(); + } else { + if (next_token.string === 'use strict') { + if ((!node_js && xmode !== 'script') || funct !== global_funct || array.length > 0) { + warn('function_strict'); + } + use_strict(); + } + if (disruptor) { + warn('unreachable_a_b', next_token, next_token.string, + disruptor.string); + disruptor = null; + } + the_statement = statement(); + if (the_statement) { + array.push(the_statement); + if (the_statement.disrupt) { + disruptor = the_statement; + array.disrupt = true; + } + } + } + } + return array; + } + + + function block(ordinary) { + +// array block is array sequence of statements wrapped in braces. +// ordinary is false for function bodies and try blocks. +// ordinary is true for if statements, while, etc. + + var array, + curly = next_token, + old_in_block = in_block, + old_scope = scope, + old_strict_mode = strict_mode; + + in_block = ordinary; + scope = Object.create(scope); + spaces(); + if (next_token.id === '{') { + advance('{'); + step_in(); + if (!ordinary && !use_strict() && !old_strict_mode && + !option.sloppy && funct['(context)'] === global_funct) { + warn('missing_use_strict'); + } + array = statements(); + strict_mode = old_strict_mode; + step_out('}', curly); + } else if (!ordinary) { + stop('expected_a_b', next_token, '{', artifact()); + } else { + warn('expected_a_b', next_token, '{', artifact()); + array = [statement()]; + array.disrupt = array[0].disrupt; + } + funct['(verb)'] = null; + scope = old_scope; + in_block = old_in_block; + if (ordinary && array.length === 0) { + warn('empty_block'); + } + return array; + } + + + function tally_property(name) { + if (option.properties && typeof property[name] !== 'number') { + warn('unexpected_property_a', token, name); + } + if (typeof property[name] === 'number') { + property[name] += 1; + } else { + property[name] = 1; + } + } + + +// ECMAScript parser + + syntax['(identifier)'] = { + id: '(identifier)', + lbp: 0, + identifier: true, + nud: function () { + var name = this.string, + variable = scope[name], + site, + writeable; + +// If the variable is not in scope, then we may have an undeclared variable. +// Check the predefined list. If it was predefined, create the global +// variable. + + if (typeof variable !== 'object') { + writeable = predefined[name]; + if (typeof writeable === 'boolean') { + global_scope[name] = variable = { + string: name, + writeable: writeable, + funct: global_funct + }; + global_funct[name] = 'var'; + +// But if the variable is not in scope, and is not predefined, and if we are not +// in the global scope, then we have an undefined variable error. + + } else { + if (!option.undef) { + warn('used_before_a', token); + } + scope[name] = variable = { + string: name, + writeable: true, + funct: funct + }; + funct[name] = 'undef'; + } + + } + site = variable.funct; + +// The name is in scope and defined in the current function. + + if (funct === site) { + +// Change 'unused' to 'var', and reject labels. + + switch (funct[name]) { + case 'becoming': + warn('unexpected_a', token); + funct[name] = 'var'; + break; + case 'unused': + funct[name] = 'var'; + break; + case 'unparam': + funct[name] = 'parameter'; + break; + case 'unction': + funct[name] = 'function'; + break; + case 'label': + warn('a_label', token, name); + break; + } + +// If the name is already defined in the current +// function, but not as outer, then there is a scope error. + + } else { + switch (funct[name]) { + case 'closure': + case 'function': + case 'var': + case 'unused': + warn('a_scope', token, name); + break; + case 'label': + warn('a_label', token, name); + break; + case 'outer': + case 'global': + break; + default: + +// If the name is defined in an outer function, make an outer entry, and if +// it was unused, make it var. + + switch (site[name]) { + case 'becoming': + case 'closure': + case 'function': + case 'parameter': + case 'unction': + case 'unused': + case 'var': + site[name] = 'closure'; + funct[name] = site === global_funct + ? 'global' + : 'outer'; + break; + case 'unparam': + site[name] = 'parameter'; + funct[name] = 'outer'; + break; + case 'undef': + funct[name] = 'undef'; + break; + case 'label': + warn('a_label', token, name); + break; + } + } + } + return this; + }, + led: function () { + stop('expected_operator_a'); + } + }; + +// Build the syntax table by declaring the syntactic elements. + + type('(array)', 'array'); + type('(color)', 'color'); + type('(function)', 'function'); + type('(number)', 'number', return_this); + type('(object)', 'object'); + type('(string)', 'string', return_this); + type('(boolean)', 'boolean', return_this); + type('(range)', 'range'); + type('(regexp)', 'regexp', return_this); + + ultimate('(begin)'); + ultimate('(end)'); + ultimate('(error)'); + postscript(symbol(''); + postscript(symbol('}')); + symbol(')'); + symbol(']'); + postscript(symbol('"')); + postscript(symbol('\'')); + symbol(';'); + symbol(':'); + symbol(','); + symbol('#'); + symbol('@'); + symbol('*/'); + postscript(reserve('case')); + reserve('catch'); + postscript(reserve('default')); + reserve('else'); + reserve('finally'); + + reservevar('arguments', function (x) { + if (strict_mode && funct === global_funct) { + warn('strict', x); + } else if (option.safe) { + warn('adsafe_a', x); + } + funct['(arguments)'] = true; + }); + reservevar('eval', function (x) { + if (option.safe) { + warn('adsafe_a', x); + } + }); + constant('false', 'boolean'); + constant('Infinity', 'number'); + constant('NaN', 'number'); + constant('null', ''); + reservevar('this', function (x) { + if (option.safe) { + warn('adsafe_a', x); + } else if (strict_mode && funct['(token)'].arity === 'statement' && + funct['(name)'].charAt(0) > 'Z') { + warn('strict', x); + } + }); + constant('true', 'boolean'); + constant('undefined', ''); + + infix('?', 30, function (left, that) { + step_in('?'); + that.first = expected_condition(expected_relation(left)); + that.second = expression(0); + spaces(); + step_out(); + var colon = next_token; + advance(':'); + step_in(':'); + spaces(); + that.third = expression(10); + that.arity = 'ternary'; + if (are_similar(that.second, that.third)) { + warn('weird_ternary', colon); + } else if (are_similar(that.first, that.second)) { + warn('use_or', that); + } + step_out(); + return that; + }); + + infix('||', 40, function (left, that) { + function paren_check(that) { + if (that.id === '&&' && !that.paren) { + warn('and', that); + } + return that; + } + + that.first = paren_check(expected_condition(expected_relation(left))); + that.second = paren_check(expected_relation(expression(40))); + if (are_similar(that.first, that.second)) { + warn('weird_condition', that); + } + return that; + }); + + infix('&&', 50, function (left, that) { + that.first = expected_condition(expected_relation(left)); + that.second = expected_relation(expression(50)); + if (are_similar(that.first, that.second)) { + warn('weird_condition', that); + } + return that; + }); + + prefix('void', function () { + this.first = expression(0); + this.arity = 'prefix'; + if (option.es5) { + warn('expected_a_b', this, 'undefined', 'void'); + } else if (this.first.number !== 0) { + warn('expected_a_b', this.first, '0', artifact(this.first)); + } + return this; + }); + + bitwise('|', 70); + bitwise('^', 80); + bitwise('&', 90); + + relation('==', '==='); + relation('==='); + relation('!=', '!=='); + relation('!=='); + relation('<'); + relation('>'); + relation('<='); + relation('>='); + + bitwise('<<', 120); + bitwise('>>', 120); + bitwise('>>>', 120); + + infix('in', 120, function (left, that) { + warn('infix_in', that); + that.left = left; + that.right = expression(130); + return that; + }); + infix('instanceof', 120); + infix('+', 130, function (left, that) { + if (left.id === '(number)') { + if (left.number === 0) { + warn('unexpected_a', left, '0'); + } + } else if (left.id === '(string)') { + if (left.string === '') { + warn('expected_a_b', left, 'String', '\'\''); + } + } + var right = expression(130); + if (right.id === '(number)') { + if (right.number === 0) { + warn('unexpected_a', right, '0'); + } + } else if (right.id === '(string)') { + if (right.string === '') { + warn('expected_a_b', right, 'String', '\'\''); + } + } + if (left.id === right.id) { + if (left.id === '(string)' || left.id === '(number)') { + if (left.id === '(string)') { + left.string += right.string; + if (jx.test(left.string)) { + warn('url', left); + } + } else { + left.number += right.number; + } + left.thru = right.thru; + return left; + } + } + that.first = left; + that.second = right; + return that; + }); + prefix('+', 'num'); + prefix('+++', function () { + warn('confusing_a', token); + this.first = expression(150); + this.arity = 'prefix'; + return this; + }); + infix('+++', 130, function (left) { + warn('confusing_a', token); + this.first = left; + this.second = expression(130); + return this; + }); + infix('-', 130, function (left, that) { + if ((left.id === '(number)' && left.number === 0) || left.id === '(string)') { + warn('unexpected_a', left); + } + var right = expression(130); + if ((right.id === '(number)' && right.number === 0) || right.id === '(string)') { + warn('unexpected_a', right); + } + if (left.id === right.id && left.id === '(number)') { + left.number -= right.number; + left.thru = right.thru; + return left; + } + that.first = left; + that.second = right; + return that; + }); + prefix('-'); + prefix('---', function () { + warn('confusing_a', token); + this.first = expression(150); + this.arity = 'prefix'; + return this; + }); + infix('---', 130, function (left) { + warn('confusing_a', token); + this.first = left; + this.second = expression(130); + return this; + }); + infix('*', 140, function (left, that) { + if ((left.id === '(number)' && (left.number === 0 || left.number === 1)) || left.id === '(string)') { + warn('unexpected_a', left); + } + var right = expression(140); + if ((right.id === '(number)' && (right.number === 0 || right.number === 1)) || right.id === '(string)') { + warn('unexpected_a', right); + } + if (left.id === right.id && left.id === '(number)') { + left.number *= right.number; + left.thru = right.thru; + return left; + } + that.first = left; + that.second = right; + return that; + }); + infix('/', 140, function (left, that) { + if ((left.id === '(number)' && left.number === 0) || left.id === '(string)') { + warn('unexpected_a', left); + } + var right = expression(140); + if ((right.id === '(number)' && (right.number === 0 || right.number === 1)) || right.id === '(string)') { + warn('unexpected_a', right); + } + if (left.id === right.id && left.id === '(number)') { + left.number /= right.number; + left.thru = right.thru; + return left; + } + that.first = left; + that.second = right; + return that; + }); + infix('%', 140, function (left, that) { + if ((left.id === '(number)' && (left.number === 0 || left.number === 1)) || left.id === '(string)') { + warn('unexpected_a', left); + } + var right = expression(140); + if ((right.id === '(number)' && right.number === 0) || right.id === '(string)') { + warn('unexpected_a', right); + } + if (left.id === right.id && left.id === '(number)') { + left.number %= right.number; + left.thru = right.thru; + return left; + } + that.first = left; + that.second = right; + return that; + }); + + suffix('++'); + prefix('++'); + + suffix('--'); + prefix('--'); + prefix('delete', function () { + one_space(); + var p = expression(0); + if (!p || (p.id !== '.' && p.id !== '[')) { + warn('deleted'); + } + this.first = p; + return this; + }); + + + prefix('~', function () { + no_space_only(); + if (!option.bitwise) { + warn('unexpected_a', this); + } + expression(150); + return this; + }); + prefix('!', function () { + no_space_only(); + this.first = expected_condition(expression(150)); + this.arity = 'prefix'; + if (bang[this.first.id] === true || this.first.assign) { + warn('confusing_a', this); + } + return this; + }); + prefix('typeof', null); + prefix('new', function () { + one_space(); + var c = expression(160), n, p, v; + this.first = c; + if (c.id !== 'function') { + if (c.identifier) { + switch (c.string) { + case 'Object': + warn('use_object', token); + break; + case 'Array': + if (next_token.id === '(') { + p = next_token; + p.first = this; + advance('('); + if (next_token.id !== ')') { + n = expression(0); + p.second = [n]; + if (n.id !== '(number)' || next_token.id === ',') { + warn('use_array', p); + } + while (next_token.id === ',') { + advance(','); + p.second.push(expression(0)); + } + } else { + warn('use_array', token); + } + advance(')', p); + return p; + } + warn('use_array', token); + break; + case 'Number': + case 'String': + case 'Boolean': + case 'Math': + case 'JSON': + warn('not_a_constructor', c); + break; + case 'Function': + if (!option.evil) { + warn('function_eval'); + } + break; + case 'Date': + case 'RegExp': + case 'this': + break; + default: + if (c.id !== 'function') { + v = c.string.charAt(0); + if (!option.newcap && (v < 'A' || v > 'Z')) { + warn('constructor_name_a', token); + } + } + } + } else { + if (c.id !== '.' && c.id !== '[' && c.id !== '(') { + warn('bad_constructor', token); + } + } + } else { + warn('weird_new', this); + } + if (next_token.id !== '(') { + warn('missing_a', next_token, '()'); + } + return this; + }); + + infix('(', 160, function (left, that) { + var p; + if (indent && indent.mode === 'expression') { + no_space(prev_token, token); + } else { + no_space_only(prev_token, token); + } + if (!left.immed && left.id === 'function') { + warn('wrap_immediate'); + } + p = []; + if (left.identifier) { + if (left.string.match(/^[A-Z]([A-Z0-9_$]*[a-z][A-Za-z0-9_$]*)?$/)) { + if (left.string !== 'Number' && left.string !== 'String' && + left.string !== 'Boolean' && left.string !== 'Date') { + if (left.string === 'Math' || left.string === 'JSON') { + warn('not_a_function', left); + } else if (left.string === 'Object') { + warn('use_object', token); + } else if (left.string === 'Array' || !option.newcap) { + warn('missing_a', left, 'new'); + } + } + } + } else if (left.id === '.') { + if (option.safe && left.first.string === 'Math' && + left.second === 'random') { + warn('adsafe_a', left); + } else if (left.second.string === 'split' && + left.first.id === '(string)') { + warn('use_array', left.second); + } + } + step_in(); + if (next_token.id !== ')') { + no_space(); + for (;;) { + edge(); + p.push(expression(10)); + if (next_token.id !== ',') { + break; + } + comma(); + } + } + no_space(); + step_out(')', that); + if (typeof left === 'object') { + if (left.string === 'parseInt' && p.length === 1) { + warn('radix', left); + } + if (!option.evil) { + if (left.string === 'eval' || left.string === 'Function' || + left.string === 'execScript') { + warn('evil', left); + } else if (p[0] && p[0].id === '(string)' && + (left.string === 'setTimeout' || + left.string === 'setInterval')) { + warn('implied_evil', left); + } + } + if (!left.identifier && left.id !== '.' && left.id !== '[' && + left.id !== '(' && left.id !== '&&' && left.id !== '||' && + left.id !== '?') { + warn('bad_invocation', left); + } + } + that.first = left; + that.second = p; + return that; + }, true); + + prefix('(', function () { + step_in('expression'); + no_space(); + edge(); + if (next_token.id === 'function') { + next_token.immed = true; + } + var value = expression(0); + value.paren = true; + no_space(); + step_out(')', this); + if (value.id === 'function') { + switch (next_token.id) { + case '(': + warn('move_invocation'); + break; + case '.': + case '[': + warn('unexpected_a'); + break; + default: + warn('bad_wrap', this); + } + } + return value; + }); + + infix('.', 170, function (left, that) { + no_space(prev_token, token); + no_space(); + var name = identifier(); + if (typeof name === 'string') { + tally_property(name); + } + that.first = left; + that.second = token; + if (left && left.string === 'arguments' && + (name === 'callee' || name === 'caller')) { + warn('avoid_a', left, 'arguments.' + name); + } else if (!option.evil && left && left.string === 'document' && + (name === 'write' || name === 'writeln')) { + warn('write_is_wrong', left); + } else if (!option.stupid && name.indexOf('Sync') > 0) { + warn('sync_a', token); + } else if (option.adsafe) { + if (!adsafe_top && left.string === 'ADSAFE') { + if (name === 'id' || name === 'lib') { + warn('adsafe_a', that); + } else if (name === 'go') { + if (xmode !== 'script') { + warn('adsafe_a', that); + } else if (adsafe_went || next_token.id !== '(' || + peek(0).id !== '(string)' || + peek(0).string !== adsafe_id || + peek(1).id !== ',') { + stop('adsafe_a', that, 'go'); + } + adsafe_went = true; + adsafe_may = false; + } + } + adsafe_top = false; + } + if (!option.evil && (name === 'eval' || name === 'execScript')) { + warn('evil'); + } else if (option.safe) { + for (;;) { + if (banned[name] === true) { + warn('adsafe_a', token, name); + } + if (typeof predefined[left.string] !== 'boolean' || //// check for writeable + next_token.id === '(') { + break; + } + if (next_token.id !== '.') { + warn('adsafe_a', that); + break; + } + advance('.'); + token.first = that; + token.second = name; + that = token; + name = identifier(); + if (typeof name === 'string') { + tally_property(name); + } + } + } + return that; + }, true); + + infix('[', 170, function (left, that) { + var e, s; + no_space_only(prev_token, token); + no_space(); + step_in(); + edge(); + e = expression(0); + switch (e.id) { + case '(number)': + if (e.id === '(number)' && left.id === 'arguments') { + warn('use_param', left); + } + break; + case '(string)': + if (option.safe && (banned[e.string] || + e.string.charAt(0) === '_' || e.string.slice(-1) === '_')) { + warn('adsafe_subscript_a', e); + } else if (!option.evil && + (e.string === 'eval' || e.string === 'execScript')) { + warn('evil', e); + } else if (!option.sub && ix.test(e.string)) { + s = syntax[e.string]; + if (!s || !s.reserved) { + warn('subscript', e); + } + } + tally_property(e.string); + break; + default: + if (option.safe) { + warn('adsafe_subscript_a', e); + } + } + step_out(']', that); + no_space(prev_token, token); + that.first = left; + that.second = e; + return that; + }, true); + + prefix('[', function () { + this.arity = 'prefix'; + this.first = []; + step_in('array'); + while (next_token.id !== '(end)') { + while (next_token.id === ',') { + warn('unexpected_a', next_token); + advance(','); + } + if (next_token.id === ']') { + break; + } + indent.wrap = false; + edge(); + this.first.push(expression(10)); + if (next_token.id === ',') { + comma(); + if (next_token.id === ']' && !option.es5) { + warn('unexpected_a', token); + break; + } + } else { + break; + } + } + step_out(']', this); + return this; + }, 170); + + + function property_name() { + var id = optional_identifier(true); + if (!id) { + if (next_token.id === '(string)') { + id = next_token.string; + if (option.safe) { + if (banned[id]) { + warn('adsafe_a'); + } else if (id.charAt(0) === '_' || + id.charAt(id.length - 1) === '_') { + warn('dangling_a'); + } + } + advance(); + } else if (next_token.id === '(number)') { + id = next_token.number.toString(); + advance(); + } + } + return id; + } + + + function function_params() { + var id, paren = next_token, params = []; + advance('('); + step_in(); + no_space(); + if (next_token.id === ')') { + no_space(); + step_out(')', paren); + return params; + } + for (;;) { + edge(); + id = identifier(); + params.push(token); + add_label(token, option.unparam ? 'parameter' : 'unparam'); + if (next_token.id === ',') { + comma(); + } else { + no_space(); + step_out(')', paren); + return params; + } + } + } + + + + function do_function(func, name) { + var old_funct = funct, + old_option = option, + old_scope = scope; + funct = { + '(name)' : name || '\'' + (anonname || '').replace(nx, sanitize) + '\'', + '(line)' : next_token.line, + '(context)' : old_funct, + '(breakage)' : 0, + '(loopage)' : 0, + '(scope)' : scope, + '(token)' : func + }; + option = Object.create(old_option); + scope = Object.create(old_scope); + functions.push(funct); + func.name = name; + if (name) { + add_label(func, 'function', name); + } + func.writeable = false; + func.first = funct['(params)'] = function_params(); + one_space(); + func.block = block(false); + if (funct['(arguments)']) { + func.first.forEach(function (value) { + if (value.assign) { + warn('parameter_arguments_a', value, value.string); + } + }); + } + funct = old_funct; + option = old_option; + scope = old_scope; + } + + + assignop('='); + assignop('+=', '+'); + assignop('-=', '-'); + assignop('*=', '*'); + assignop('/=', '/').nud = function () { + stop('slash_equal'); + }; + assignop('%=', '%'); + assignop('&=', '&'); + assignop('|=', '|'); + assignop('^=', '^'); + assignop('<<=', '<<'); + assignop('>>=', '>>'); + assignop('>>>=', '>>>'); + + + prefix('{', function () { + var get, i, j, name, p, set, seen = {}; + this.arity = 'prefix'; + this.first = []; + step_in(); + while (next_token.id !== '}') { + indent.wrap = false; + +// JSLint recognizes the ES5 extension for get/set in object literals, +// but requires that they be used in pairs. + + edge(); + if (next_token.string === 'get' && peek().id !== ':') { + if (!option.es5) { + warn('es5'); + } + get = next_token; + advance('get'); + one_space_only(); + name = next_token; + i = property_name(); + if (!i) { + stop('missing_property'); + } + get.string = ''; + do_function(get); + if (funct['(loopage)']) { + warn('function_loop', get); + } + p = get.first; + if (p && p.length) { + warn('parameter_a_get_b', p[0], p[0].string, i); + } + comma(); + set = next_token; + spaces(); + edge(); + advance('set'); + set.string = ''; + one_space_only(); + j = property_name(); + if (i !== j) { + stop('expected_a_b', token, i, j || next_token.string); + } + do_function(set); + if (set.block.length === 0) { + warn('missing_a', token, 'throw'); + } + p = set.first; + if (!p || p.length !== 1) { + stop('parameter_set_a', set, 'value'); + } else if (p[0].string !== 'value') { + stop('expected_a_b', p[0], 'value', p[0].string); + } + name.first = [get, set]; + } else { + name = next_token; + i = property_name(); + if (typeof i !== 'string') { + stop('missing_property'); + } + advance(':'); + spaces(); + name.first = expression(10); + } + this.first.push(name); + if (seen[i] === true) { + warn('duplicate_a', next_token, i); + } + seen[i] = true; + tally_property(i); + if (next_token.id !== ',') { + break; + } + for (;;) { + comma(); + if (next_token.id !== ',') { + break; + } + warn('unexpected_a', next_token); + } + if (next_token.id === '}' && !option.es5) { + warn('unexpected_a', token); + } + } + step_out('}', this); + return this; + }); + + stmt('{', function () { + warn('statement_block'); + this.arity = 'statement'; + this.block = statements(); + this.disrupt = this.block.disrupt; + advance('}', this); + return this; + }); + + stmt('/*global', directive); + stmt('/*globals', directive); + stmt('/*jslint', directive); + stmt('/*member', directive); + stmt('/*members', directive); + stmt('/*property', directive); + stmt('/*properties', directive); + + stmt('var', function () { + +// JavaScript does not have block scope. It only has function scope. So, +// declaring a variable in a block can have unexpected consequences. + +// var.first will contain an array, the array containing name tokens +// and assignment tokens. + + var assign, id, name; + + if (funct['(vars)'] && !option.vars) { + warn('combine_var'); + } else if (funct !== global_funct) { + funct['(vars)'] = true; + } + this.arity = 'statement'; + this.first = []; + step_in('var'); + for (;;) { + name = next_token; + id = identifier(); + add_label(name, 'becoming'); + + if (next_token.id === '=') { + assign = next_token; + assign.first = name; + spaces(); + advance('='); + spaces(); + if (next_token.id === 'undefined') { + warn('unnecessary_initialize', token, id); + } + if (peek(0).id === '=' && next_token.identifier) { + stop('var_a_not'); + } + assign.second = expression(0); + assign.arity = 'infix'; + this.first.push(assign); + } else { + this.first.push(name); + } + if (funct[id] === 'becoming') { + funct[id] = 'unused'; + } + if (next_token.id !== ',') { + break; + } + comma(); + indent.wrap = false; + if (var_mode && next_token.line === token.line && + this.first.length === 1) { + var_mode = null; + indent.open = false; + indent.at -= option.indent; + } + spaces(); + edge(); + } + var_mode = null; + step_out(); + return this; + }); + + stmt('function', function () { + one_space(); + if (in_block) { + warn('function_block', token); + } + var name = next_token, id = identifier(); + add_label(name, 'unction'); + no_space(); + this.arity = 'statement'; + do_function(this, id); + if (next_token.id === '(' && next_token.line === token.line) { + stop('function_statement'); + } + return this; + }); + + prefix('function', function () { + if (!option.anon) { + one_space(); + } + var id = optional_identifier(); + if (id) { + no_space(); + } else { + id = ''; + } + do_function(this, id); + if (funct['(loopage)']) { + warn('function_loop'); + } + switch (next_token.id) { + case ';': + case '(': + case ')': + case ',': + case ']': + case '}': + case ':': + break; + case '.': + if (peek().string !== 'bind' || peek(1).id !== '(') { + warn('unexpected_a'); + } + break; + default: + stop('unexpected_a'); + } + this.arity = 'function'; + return this; + }); + + stmt('if', function () { + var paren = next_token; + one_space(); + advance('('); + step_in('control'); + no_space(); + edge(); + this.arity = 'statement'; + this.first = expected_condition(expected_relation(expression(0))); + no_space(); + step_out(')', paren); + one_space(); + this.block = block(true); + if (next_token.id === 'else') { + one_space(); + advance('else'); + one_space(); + this['else'] = next_token.id === 'if' || next_token.id === 'switch' + ? statement(true) + : block(true); + if (this['else'].disrupt && this.block.disrupt) { + this.disrupt = true; + } + } + return this; + }); + + stmt('try', function () { + +// try.first The catch variable +// try.second The catch clause +// try.third The finally clause +// try.block The try block + + var exception_variable, old_scope, paren; + if (option.adsafe) { + warn('adsafe_a', this); + } + one_space(); + this.arity = 'statement'; + this.block = block(false); + if (next_token.id === 'catch') { + one_space(); + advance('catch'); + one_space(); + paren = next_token; + advance('('); + step_in('control'); + no_space(); + edge(); + old_scope = scope; + scope = Object.create(old_scope); + exception_variable = next_token.string; + this.first = exception_variable; + if (!next_token.identifier) { + warn('expected_identifier_a', next_token); + } else { + add_label(next_token, 'exception'); + } + advance(); + no_space(); + step_out(')', paren); + one_space(); + this.second = block(false); + scope = old_scope; + } + if (next_token.id === 'finally') { + one_space(); + advance('finally'); + one_space(); + this.third = block(false); + } else if (!this.second) { + stop('expected_a_b', next_token, 'catch', artifact()); + } + return this; + }); + + labeled_stmt('while', function () { + one_space(); + var paren = next_token; + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + advance('('); + step_in('control'); + no_space(); + edge(); + this.arity = 'statement'; + this.first = expected_relation(expression(0)); + if (this.first.id !== 'true') { + expected_condition(this.first, bundle.unexpected_a); + } + no_space(); + step_out(')', paren); + one_space(); + this.block = block(true); + if (this.block.disrupt) { + warn('strange_loop', prev_token); + } + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + }); + + reserve('with'); + + labeled_stmt('switch', function () { + +// switch.first the switch expression +// switch.second the array of cases. A case is 'case' or 'default' token: +// case.first the array of case expressions +// case.second the array of statements +// If all of the arrays of statements are disrupt, then the switch is disrupt. + + var cases = [], + old_in_block = in_block, + particular, + the_case = next_token, + unbroken = true; + + function find_duplicate_case(value) { + if (are_similar(particular, value)) { + warn('duplicate_a', value); + } + } + + funct['(breakage)'] += 1; + one_space(); + advance('('); + no_space(); + step_in(); + this.arity = 'statement'; + this.first = expected_condition(expected_relation(expression(0))); + no_space(); + step_out(')', the_case); + one_space(); + advance('{'); + step_in(); + in_block = true; + this.second = []; + while (next_token.id === 'case') { + the_case = next_token; + cases.forEach(find_duplicate_case); + the_case.first = []; + the_case.arity = 'case'; + spaces(); + edge('case'); + advance('case'); + for (;;) { + one_space(); + particular = expression(0); + cases.forEach(find_duplicate_case); + cases.push(particular); + the_case.first.push(particular); + if (particular.id === 'NaN') { + warn('unexpected_a', particular); + } + no_space_only(); + advance(':'); + if (next_token.id !== 'case') { + break; + } + spaces(); + edge('case'); + advance('case'); + } + spaces(); + the_case.second = statements(); + if (the_case.second && the_case.second.length > 0) { + particular = the_case.second[the_case.second.length - 1]; + if (particular.disrupt) { + if (particular.id === 'break') { + unbroken = false; + } + } else { + warn('missing_a_after_b', next_token, 'break', 'case'); + } + } else { + warn('empty_case'); + } + this.second.push(the_case); + } + if (this.second.length === 0) { + warn('missing_a', next_token, 'case'); + } + if (next_token.id === 'default') { + spaces(); + the_case = next_token; + the_case.arity = 'case'; + edge('case'); + advance('default'); + no_space_only(); + advance(':'); + spaces(); + the_case.second = statements(); + if (the_case.second && the_case.second.length > 0) { + particular = the_case.second[the_case.second.length - 1]; + if (unbroken && particular.disrupt && particular.id !== 'break') { + this.disrupt = true; + } + } + this.second.push(the_case); + } + funct['(breakage)'] -= 1; + spaces(); + step_out('}', this); + in_block = old_in_block; + return this; + }); + + stmt('debugger', function () { + if (!option.debug) { + warn('unexpected_a', this); + } + this.arity = 'statement'; + return this; + }); + + labeled_stmt('do', function () { + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + one_space(); + this.arity = 'statement'; + this.block = block(true); + if (this.block.disrupt) { + warn('strange_loop', prev_token); + } + one_space(); + advance('while'); + var paren = next_token; + one_space(); + advance('('); + step_in(); + no_space(); + edge(); + this.first = expected_condition(expected_relation(expression(0)), bundle.unexpected_a); + no_space(); + step_out(')', paren); + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + }); + + labeled_stmt('for', function () { + + var blok, filter, ok = false, paren = next_token, value; + this.arity = 'statement'; + funct['(breakage)'] += 1; + funct['(loopage)'] += 1; + advance('('); + if (next_token.id === ';') { + no_space(); + advance(';'); + no_space(); + advance(';'); + no_space(); + advance(')'); + blok = block(true); + } else { + step_in('control'); + spaces(this, paren); + no_space(); + if (next_token.id === 'var') { + stop('move_var'); + } + edge(); + if (peek(0).id === 'in') { + this.forin = true; + value = next_token; + switch (funct[value.string]) { + case 'unused': + funct[value.string] = 'var'; + break; + case 'closure': + case 'var': + break; + default: + warn('bad_in_a', value); + } + advance(); + advance('in'); + this.first = value; + this.second = expression(20); + step_out(')', paren); + blok = block(true); + if (!option.forin) { + if (blok.length === 1 && typeof blok[0] === 'object' && + blok[0].string === 'if' && !blok[0]['else']) { + filter = blok[0].first; + while (filter.id === '&&') { + filter = filter.first; + } + switch (filter.id) { + case '===': + case '!==': + ok = filter.first.id === '[' + ? filter.first.first.string === this.second.string && + filter.first.second.string === this.first.string + : filter.first.id === 'typeof' && + filter.first.first.id === '[' && + filter.first.first.first.string === this.second.string && + filter.first.first.second.string === this.first.string; + break; + case '(': + ok = filter.first.id === '.' && (( + filter.first.first.string === this.second.string && + filter.first.second.string === 'hasOwnProperty' && + filter.second[0].string === this.first.string + ) || ( + filter.first.first.string === 'ADSAFE' && + filter.first.second.string === 'has' && + filter.second[0].string === this.second.string && + filter.second[1].string === this.first.string + ) || ( + filter.first.first.id === '.' && + filter.first.first.first.id === '.' && + filter.first.first.first.first.string === 'Object' && + filter.first.first.first.second.string === 'prototype' && + filter.first.first.second.string === 'hasOwnProperty' && + filter.first.second.string === 'call' && + filter.second[0].string === this.second.string && + filter.second[1].string === this.first.string + )); + break; + } + } + if (!ok) { + warn('for_if', this); + } + } + } else { + edge(); + this.first = []; + for (;;) { + this.first.push(expression(0, 'for')); + if (next_token.id !== ',') { + break; + } + comma(); + } + semicolon(); + edge(); + this.second = expected_relation(expression(0)); + if (this.second.id !== 'true') { + expected_condition(this.second, bundle.unexpected_a); + } + semicolon(token); + if (next_token.id === ';') { + stop('expected_a_b', next_token, ')', ';'); + } + this.third = []; + edge(); + for (;;) { + this.third.push(expression(0, 'for')); + if (next_token.id !== ',') { + break; + } + comma(); + } + no_space(); + step_out(')', paren); + one_space(); + blok = block(true); + } + } + if (blok.disrupt) { + warn('strange_loop', prev_token); + } + this.block = blok; + funct['(breakage)'] -= 1; + funct['(loopage)'] -= 1; + return this; + }); + + disrupt_stmt('break', function () { + var label = next_token.string; + this.arity = 'statement'; + if (funct['(breakage)'] === 0) { + warn('unexpected_a', this); + } + if (next_token.identifier && token.line === next_token.line) { + one_space_only(); + if (funct[label] !== 'label') { + warn('not_a_label', next_token); + } else if (scope[label].funct !== funct) { + warn('not_a_scope', next_token); + } + this.first = next_token; + advance(); + } + return this; + }); + + disrupt_stmt('continue', function () { + if (!option['continue']) { + warn('unexpected_a', this); + } + var label = next_token.string; + this.arity = 'statement'; + if (funct['(breakage)'] === 0) { + warn('unexpected_a', this); + } + if (next_token.identifier && token.line === next_token.line) { + one_space_only(); + if (funct[label] !== 'label') { + warn('not_a_label', next_token); + } else if (scope[label].funct !== funct) { + warn('not_a_scope', next_token); + } + this.first = next_token; + advance(); + } + return this; + }); + + disrupt_stmt('return', function () { + if (funct === global_funct && xmode !== 'scriptstring') { + warn('unexpected_a', this); + } + this.arity = 'statement'; + if (next_token.id !== ';' && next_token.line === token.line) { + one_space_only(); + if (next_token.id === '/' || next_token.id === '(regexp)') { + warn('wrap_regexp'); + } + this.first = expression(20); + } + if (peek(0).id === '}' && peek(1).id === 'else') { + warn('unexpected_else', this); + } + return this; + }); + + disrupt_stmt('throw', function () { + this.arity = 'statement'; + one_space_only(); + this.first = expression(20); + return this; + }); + + +// Superfluous reserved words + + reserve('class'); + reserve('const'); + reserve('enum'); + reserve('export'); + reserve('extends'); + reserve('import'); + reserve('super'); + +// Harmony reserved words + + reserve('implements'); + reserve('interface'); + reserve('let'); + reserve('package'); + reserve('private'); + reserve('protected'); + reserve('public'); + reserve('static'); + reserve('yield'); + + +// Parse JSON + + function json_value() { + + function json_object() { + var brace = next_token, object = {}; + advance('{'); + if (next_token.id !== '}') { + while (next_token.id !== '(end)') { + while (next_token.id === ',') { + warn('unexpected_a', next_token); + advance(','); + } + if (next_token.id !== '(string)') { + warn('expected_string_a'); + } + if (object[next_token.string] === true) { + warn('duplicate_a'); + } else if (next_token.string === '__proto__') { + warn('dangling_a'); + } else { + object[next_token.string] = true; + } + advance(); + advance(':'); + json_value(); + if (next_token.id !== ',') { + break; + } + advance(','); + if (next_token.id === '}') { + warn('unexpected_a', token); + break; + } + } + } + advance('}', brace); + } + + function json_array() { + var bracket = next_token; + advance('['); + if (next_token.id !== ']') { + while (next_token.id !== '(end)') { + while (next_token.id === ',') { + warn('unexpected_a', next_token); + advance(','); + } + json_value(); + if (next_token.id !== ',') { + break; + } + advance(','); + if (next_token.id === ']') { + warn('unexpected_a', token); + break; + } + } + } + advance(']', bracket); + } + + switch (next_token.id) { + case '{': + json_object(); + break; + case '[': + json_array(); + break; + case 'true': + case 'false': + case 'null': + case '(number)': + case '(string)': + advance(); + break; + case '-': + advance('-'); + no_space_only(); + advance('(number)'); + break; + default: + stop('unexpected_a'); + } + } + + +// CSS parsing. + + function css_name() { + if (next_token.identifier) { + advance(); + return true; + } + } + + + function css_number() { + if (next_token.id === '-') { + advance('-'); + no_space_only(); + } + if (next_token.id === '(number)') { + advance('(number)'); + return true; + } + } + + + function css_string() { + if (next_token.id === '(string)') { + advance(); + return true; + } + } + + function css_color() { + var i, number, paren, value; + if (next_token.identifier) { + value = next_token.string; + if (value === 'rgb' || value === 'rgba') { + advance(); + paren = next_token; + advance('('); + for (i = 0; i < 3; i += 1) { + if (i) { + comma(); + } + number = next_token.number; + if (next_token.id !== '(number)' || number < 0) { + warn('expected_positive_a', next_token); + advance(); + } else { + advance(); + if (next_token.id === '%') { + advance('%'); + if (number > 100) { + warn('expected_percent_a', token, number); + } + } else { + if (number > 255) { + warn('expected_small_a', token, number); + } + } + } + } + if (value === 'rgba') { + comma(); + number = next_token.number; + if (next_token.id !== '(number)' || number < 0 || number > 1) { + warn('expected_fraction_a', next_token); + } + advance(); + if (next_token.id === '%') { + warn('unexpected_a'); + advance('%'); + } + } + advance(')', paren); + return true; + } + if (css_colorData[next_token.string] === true) { + advance(); + return true; + } + } else if (next_token.id === '(color)') { + advance(); + return true; + } + return false; + } + + + function css_length() { + if (next_token.id === '-') { + advance('-'); + no_space_only(); + } + if (next_token.id === '(number)') { + advance(); + if (next_token.id !== '(string)' && + css_lengthData[next_token.string] === true) { + no_space_only(); + advance(); + } else if (+token.number !== 0) { + warn('expected_linear_a'); + } + return true; + } + return false; + } + + + function css_line_height() { + if (next_token.id === '-') { + advance('-'); + no_space_only(); + } + if (next_token.id === '(number)') { + advance(); + if (next_token.id !== '(string)' && + css_lengthData[next_token.string] === true) { + no_space_only(); + advance(); + } + return true; + } + return false; + } + + + function css_width() { + if (next_token.identifier) { + switch (next_token.string) { + case 'thin': + case 'medium': + case 'thick': + advance(); + return true; + } + } else { + return css_length(); + } + } + + + function css_margin() { + if (next_token.identifier) { + if (next_token.string === 'auto') { + advance(); + return true; + } + } else { + return css_length(); + } + } + + function css_attr() { + if (next_token.identifier && next_token.string === 'attr') { + advance(); + advance('('); + if (!next_token.identifier) { + warn('expected_name_a'); + } + advance(); + advance(')'); + return true; + } + return false; + } + + + function css_comma_list() { + while (next_token.id !== ';') { + if (!css_name() && !css_string()) { + warn('expected_name_a'); + } + if (next_token.id !== ',') { + return true; + } + comma(); + } + } + + + function css_counter() { + if (next_token.identifier && next_token.string === 'counter') { + advance(); + advance('('); + advance(); + if (next_token.id === ',') { + comma(); + if (next_token.id !== '(string)') { + warn('expected_string_a'); + } + advance(); + } + advance(')'); + return true; + } + if (next_token.identifier && next_token.string === 'counters') { + advance(); + advance('('); + if (!next_token.identifier) { + warn('expected_name_a'); + } + advance(); + if (next_token.id === ',') { + comma(); + if (next_token.id !== '(string)') { + warn('expected_string_a'); + } + advance(); + } + if (next_token.id === ',') { + comma(); + if (next_token.id !== '(string)') { + warn('expected_string_a'); + } + advance(); + } + advance(')'); + return true; + } + return false; + } + + + function css_radius() { + return css_length() && (next_token.id !== '(number)' || css_length()); + } + + + function css_shape() { + var i; + if (next_token.identifier && next_token.string === 'rect') { + advance(); + advance('('); + for (i = 0; i < 4; i += 1) { + if (!css_length()) { + warn('expected_number_a'); + break; + } + } + advance(')'); + return true; + } + return false; + } + + + function css_url() { + var c, url; + if (next_token.identifier && next_token.string === 'url') { + next_token = lex.range('(', ')'); + url = next_token.string; + c = url.charAt(0); + if (c === '"' || c === '\'') { + if (url.slice(-1) !== c) { + warn('bad_url_a'); + } else { + url = url.slice(1, -1); + if (url.indexOf(c) >= 0) { + warn('bad_url_a'); + } + } + } + if (!url) { + warn('missing_url'); + } + if (ux.test(url)) { + stop('bad_url_a'); + } + urls.push(url); + advance(); + return true; + } + return false; + } + + + css_any = [css_url, function () { + for (;;) { + if (next_token.identifier) { + switch (next_token.string.toLowerCase()) { + case 'url': + css_url(); + break; + case 'expression': + warn('unexpected_a'); + advance(); + break; + default: + advance(); + } + } else { + if (next_token.id === ';' || next_token.id === '!' || + next_token.id === '(end)' || next_token.id === '}') { + return true; + } + advance(); + } + } + }]; + + + function font_face() { + advance_identifier('font-family'); + advance(':'); + if (!css_name() && !css_string()) { + stop('expected_name_a'); + } + semicolon(); + advance_identifier('src'); + advance(':'); + while (true) { + if (next_token.string === 'local') { + advance_identifier('local'); + advance('('); + if (ux.test(next_token.string)) { + stop('bad_url_a'); + } + + if (!css_name() && !css_string()) { + stop('expected_name_a'); + } + advance(')'); + } else if (!css_url()) { + stop('expected_a_b', next_token, 'url', artifact()); + } + if (next_token.id !== ',') { + break; + } + comma(); + } + semicolon(); + } + + + css_border_style = [ + 'none', 'dashed', 'dotted', 'double', 'groove', + 'hidden', 'inset', 'outset', 'ridge', 'solid' + ]; + + css_break = [ + 'auto', 'always', 'avoid', 'left', 'right' + ]; + + css_media = { + 'all': true, + 'braille': true, + 'embossed': true, + 'handheld': true, + 'print': true, + 'projection': true, + 'screen': true, + 'speech': true, + 'tty': true, + 'tv': true + }; + + css_overflow = [ + 'auto', 'hidden', 'scroll', 'visible' + ]; + + css_attribute_data = { + background: [ + true, 'background-attachment', 'background-color', + 'background-image', 'background-position', 'background-repeat' + ], + 'background-attachment': ['scroll', 'fixed'], + 'background-color': ['transparent', css_color], + 'background-image': ['none', css_url], + 'background-position': [ + 2, [css_length, 'top', 'bottom', 'left', 'right', 'center'] + ], + 'background-repeat': [ + 'repeat', 'repeat-x', 'repeat-y', 'no-repeat' + ], + 'border': [true, 'border-color', 'border-style', 'border-width'], + 'border-bottom': [ + true, 'border-bottom-color', 'border-bottom-style', + 'border-bottom-width' + ], + 'border-bottom-color': css_color, + 'border-bottom-left-radius': css_radius, + 'border-bottom-right-radius': css_radius, + 'border-bottom-style': css_border_style, + 'border-bottom-width': css_width, + 'border-collapse': ['collapse', 'separate'], + 'border-color': ['transparent', 4, css_color], + 'border-left': [ + true, 'border-left-color', 'border-left-style', 'border-left-width' + ], + 'border-left-color': css_color, + 'border-left-style': css_border_style, + 'border-left-width': css_width, + 'border-radius': function () { + function count(separator) { + var n = 1; + if (separator) { + advance(separator); + } + if (!css_length()) { + return false; + } + while (next_token.id === '(number)') { + if (!css_length()) { + return false; + } + n += 1; + } + if (n > 4) { + warn('bad_style'); + } + return true; + } + + return count() && (next_token.id !== '/' || count('/')); + }, + 'border-right': [ + true, 'border-right-color', 'border-right-style', + 'border-right-width' + ], + 'border-right-color': css_color, + 'border-right-style': css_border_style, + 'border-right-width': css_width, + 'border-spacing': [2, css_length], + 'border-style': [4, css_border_style], + 'border-top': [ + true, 'border-top-color', 'border-top-style', 'border-top-width' + ], + 'border-top-color': css_color, + 'border-top-left-radius': css_radius, + 'border-top-right-radius': css_radius, + 'border-top-style': css_border_style, + 'border-top-width': css_width, + 'border-width': [4, css_width], + bottom: [css_length, 'auto'], + 'caption-side' : ['bottom', 'left', 'right', 'top'], + clear: ['both', 'left', 'none', 'right'], + clip: [css_shape, 'auto'], + color: css_color, + content: [ + 'open-quote', 'close-quote', 'no-open-quote', 'no-close-quote', + css_string, css_url, css_counter, css_attr + ], + 'counter-increment': [ + css_name, 'none' + ], + 'counter-reset': [ + css_name, 'none' + ], + cursor: [ + css_url, 'auto', 'crosshair', 'default', 'e-resize', 'help', 'move', + 'n-resize', 'ne-resize', 'nw-resize', 'pointer', 's-resize', + 'se-resize', 'sw-resize', 'w-resize', 'text', 'wait' + ], + direction: ['ltr', 'rtl'], + display: [ + 'block', 'compact', 'inline', 'inline-block', 'inline-table', + 'list-item', 'marker', 'none', 'run-in', 'table', 'table-caption', + 'table-cell', 'table-column', 'table-column-group', + 'table-footer-group', 'table-header-group', 'table-row', + 'table-row-group' + ], + 'empty-cells': ['show', 'hide'], + 'float': ['left', 'none', 'right'], + font: [ + 'caption', 'icon', 'menu', 'message-box', 'small-caption', + 'status-bar', true, 'font-size', 'font-style', 'font-weight', + 'font-family' + ], + 'font-family': css_comma_list, + 'font-size': [ + 'xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', + 'xx-large', 'larger', 'smaller', css_length + ], + 'font-size-adjust': ['none', css_number], + 'font-stretch': [ + 'normal', 'wider', 'narrower', 'ultra-condensed', + 'extra-condensed', 'condensed', 'semi-condensed', + 'semi-expanded', 'expanded', 'extra-expanded' + ], + 'font-style': [ + 'normal', 'italic', 'oblique' + ], + 'font-variant': [ + 'normal', 'small-caps' + ], + 'font-weight': [ + 'normal', 'bold', 'bolder', 'lighter', css_number + ], + height: [css_length, 'auto'], + left: [css_length, 'auto'], + 'letter-spacing': ['normal', css_length], + 'line-height': ['normal', css_line_height], + 'list-style': [ + true, 'list-style-image', 'list-style-position', 'list-style-type' + ], + 'list-style-image': ['none', css_url], + 'list-style-position': ['inside', 'outside'], + 'list-style-type': [ + 'circle', 'disc', 'square', 'decimal', 'decimal-leading-zero', + 'lower-roman', 'upper-roman', 'lower-greek', 'lower-alpha', + 'lower-latin', 'upper-alpha', 'upper-latin', 'hebrew', 'katakana', + 'hiragana-iroha', 'katakana-oroha', 'none' + ], + margin: [4, css_margin], + 'margin-bottom': css_margin, + 'margin-left': css_margin, + 'margin-right': css_margin, + 'margin-top': css_margin, + 'marker-offset': [css_length, 'auto'], + 'max-height': [css_length, 'none'], + 'max-width': [css_length, 'none'], + 'min-height': css_length, + 'min-width': css_length, + opacity: css_number, + outline: [true, 'outline-color', 'outline-style', 'outline-width'], + 'outline-color': ['invert', css_color], + 'outline-style': [ + 'dashed', 'dotted', 'double', 'groove', 'inset', 'none', + 'outset', 'ridge', 'solid' + ], + 'outline-width': css_width, + overflow: css_overflow, + 'overflow-x': css_overflow, + 'overflow-y': css_overflow, + padding: [4, css_length], + 'padding-bottom': css_length, + 'padding-left': css_length, + 'padding-right': css_length, + 'padding-top': css_length, + 'page-break-after': css_break, + 'page-break-before': css_break, + position: ['absolute', 'fixed', 'relative', 'static'], + quotes: [8, css_string], + right: [css_length, 'auto'], + 'table-layout': ['auto', 'fixed'], + 'text-align': ['center', 'justify', 'left', 'right'], + 'text-decoration': [ + 'none', 'underline', 'overline', 'line-through', 'blink' + ], + 'text-indent': css_length, + 'text-shadow': ['none', 4, [css_color, css_length]], + 'text-transform': ['capitalize', 'uppercase', 'lowercase', 'none'], + top: [css_length, 'auto'], + 'unicode-bidi': ['normal', 'embed', 'bidi-override'], + 'vertical-align': [ + 'baseline', 'bottom', 'sub', 'super', 'top', 'text-top', 'middle', + 'text-bottom', css_length + ], + visibility: ['visible', 'hidden', 'collapse'], + 'white-space': [ + 'normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'inherit' + ], + width: [css_length, 'auto'], + 'word-spacing': ['normal', css_length], + 'word-wrap': ['break-word', 'normal'], + 'z-index': ['auto', css_number] + }; + + function style_attribute() { + var v; + while (next_token.id === '*' || next_token.id === '#' || + next_token.string === '_') { + if (!option.css) { + warn('unexpected_a'); + } + advance(); + } + if (next_token.id === '-') { + if (!option.css) { + warn('unexpected_a'); + } + advance('-'); + if (!next_token.identifier) { + warn('expected_nonstandard_style_attribute'); + } + advance(); + return css_any; + } + if (!next_token.identifier) { + warn('expected_style_attribute'); + } else { + if (Object.prototype.hasOwnProperty.call(css_attribute_data, + next_token.string)) { + v = css_attribute_data[next_token.string]; + } else { + v = css_any; + if (!option.css) { + warn('unrecognized_style_attribute_a'); + } + } + } + advance(); + return v; + } + + + function style_value(v) { + var i = 0, + n, + once, + match, + round, + start = 0, + vi; + switch (typeof v) { + case 'function': + return v(); + case 'string': + if (next_token.identifier && next_token.string === v) { + advance(); + return true; + } + return false; + } + for (;;) { + if (i >= v.length) { + return false; + } + vi = v[i]; + i += 1; + if (typeof vi === 'boolean') { + break; + } else if (typeof vi === 'number') { + n = vi; + vi = v[i]; + i += 1; + } else { + n = 1; + } + match = false; + while (n > 0) { + if (style_value(vi)) { + match = true; + n -= 1; + } else { + break; + } + } + if (match) { + return true; + } + } + start = i; + once = []; + for (;;) { + round = false; + for (i = start; i < v.length; i += 1) { + if (!once[i]) { + if (style_value(css_attribute_data[v[i]])) { + match = true; + round = true; + once[i] = true; + break; + } + } + } + if (!round) { + return match; + } + } + } + + function style_child() { + if (next_token.id === '(number)') { + advance(); + if (next_token.string === 'n' && next_token.identifier) { + no_space_only(); + advance(); + if (next_token.id === '+') { + no_space_only(); + advance('+'); + no_space_only(); + advance('(number)'); + } + } + return; + } + if (next_token.identifier && + (next_token.string === 'odd' || next_token.string === 'even')) { + advance(); + return; + } + warn('unexpected_a'); + } + + function substyle() { + var v; + for (;;) { + if (next_token.id === '}' || next_token.id === '(end)' || + (xquote && next_token.id === xquote)) { + return; + } + v = style_attribute(); + advance(':'); + if (next_token.identifier && next_token.string === 'inherit') { + advance(); + } else { + if (!style_value(v)) { + warn('unexpected_a'); + advance(); + } + } + if (next_token.id === '!') { + advance('!'); + no_space_only(); + if (next_token.identifier && next_token.string === 'important') { + advance(); + } else { + warn('expected_a_b', + next_token, 'important', artifact()); + } + } + if (next_token.id === '}' || next_token.id === xquote) { + warn('expected_a_b', next_token, ';', artifact()); + } else { + semicolon(); + } + } + } + + function style_selector() { + if (next_token.identifier) { + if (!Object.prototype.hasOwnProperty.call(html_tag, option.cap + ? next_token.string.toLowerCase() + : next_token.string)) { + warn('expected_tagname_a'); + } + advance(); + } else { + switch (next_token.id) { + case '>': + case '+': + advance(); + style_selector(); + break; + case ':': + advance(':'); + switch (next_token.string) { + case 'active': + case 'after': + case 'before': + case 'checked': + case 'disabled': + case 'empty': + case 'enabled': + case 'first-child': + case 'first-letter': + case 'first-line': + case 'first-of-type': + case 'focus': + case 'hover': + case 'last-child': + case 'last-of-type': + case 'link': + case 'only-of-type': + case 'root': + case 'target': + case 'visited': + advance_identifier(next_token.string); + break; + case 'lang': + advance_identifier('lang'); + advance('('); + if (!next_token.identifier) { + warn('expected_lang_a'); + } + advance(')'); + break; + case 'nth-child': + case 'nth-last-child': + case 'nth-last-of-type': + case 'nth-of-type': + advance_identifier(next_token.string); + advance('('); + style_child(); + advance(')'); + break; + case 'not': + advance_identifier('not'); + advance('('); + if (next_token.id === ':' && peek(0).string === 'not') { + warn('not'); + } + style_selector(); + advance(')'); + break; + default: + warn('expected_pseudo_a'); + } + break; + case '#': + advance('#'); + if (!next_token.identifier) { + warn('expected_id_a'); + } + advance(); + break; + case '*': + advance('*'); + break; + case '.': + advance('.'); + if (!next_token.identifier) { + warn('expected_class_a'); + } + advance(); + break; + case '[': + advance('['); + if (!next_token.identifier) { + warn('expected_attribute_a'); + } + advance(); + if (next_token.id === '=' || next_token.string === '~=' || + next_token.string === '$=' || + next_token.string === '|=' || + next_token.id === '*=' || + next_token.id === '^=') { + advance(); + if (next_token.id !== '(string)') { + warn('expected_string_a'); + } + advance(); + } + advance(']'); + break; + default: + stop('expected_selector_a'); + } + } + } + + function style_pattern() { + if (next_token.id === '{') { + warn('expected_style_pattern'); + } + for (;;) { + style_selector(); + if (next_token.id === '= 0) { + warn('unexpected_char_a_b', token, v.charAt(x), a); + } + ids[u] = true; + } else if (a === 'class' || a === 'type' || a === 'name') { + x = v.search(qx); + if (x >= 0) { + warn('unexpected_char_a_b', token, v.charAt(x), a); + } + ids[u] = true; + } else if (a === 'href' || a === 'background' || + a === 'content' || a === 'data' || + a.indexOf('src') >= 0 || a.indexOf('url') >= 0) { + if (option.safe && ux.test(v)) { + stop('bad_url_a', next_token, v); + } + urls.push(v); + } else if (a === 'for') { + if (option.adsafe) { + if (adsafe_id) { + if (v.slice(0, adsafe_id.length) !== adsafe_id) { + warn('adsafe_prefix_a', next_token, adsafe_id); + } else if (!/^[A-Z]+_[A-Z]+$/.test(v)) { + warn('adsafe_bad_id'); + } + } else { + warn('adsafe_bad_id'); + } + } + } else if (a === 'name') { + if (option.adsafe && v.indexOf('_') >= 0) { + warn('adsafe_name_a', next_token, v); + } + } + } + + function do_tag(name, attribute) { + var i, tag = html_tag[name], script, x; + src = false; + if (!tag) { + stop( + bundle.unrecognized_tag_a, + next_token, + name === name.toLowerCase() + ? name + : name + ' (capitalization error)' + ); + } + if (stack.length > 0) { + if (name === 'html') { + stop('unexpected_a', token, name); + } + x = tag.parent; + if (x) { + if (x.indexOf(' ' + stack[stack.length - 1].name + ' ') < 0) { + stop('tag_a_in_b', token, name, x); + } + } else if (!option.adsafe && !option.fragment) { + i = stack.length; + do { + if (i <= 0) { + stop('tag_a_in_b', token, name, 'body'); + } + i -= 1; + } while (stack[i].name !== 'body'); + } + } + switch (name) { + case 'div': + if (option.adsafe && stack.length === 1 && !adsafe_id) { + warn('adsafe_missing_id'); + } + break; + case 'script': + xmode = 'script'; + advance('>'); + if (attribute.lang) { + warn('lang', token); + } + if (option.adsafe && stack.length !== 1) { + warn('adsafe_placement', token); + } + if (attribute.src) { + if (option.adsafe && (!adsafe_may || !approved[attribute.src])) { + warn('adsafe_source', token); + } + } else { + step_in(next_token.from); + edge(); + use_strict(); + adsafe_top = true; + script = statements(); + +// JSLint is also the static analyzer for ADsafe. See www.ADsafe.org. + + if (option.adsafe) { + if (adsafe_went) { + stop('adsafe_script', token); + } + if (script.length !== 1 || + aint(script[0], 'id', '(') || + aint(script[0].first, 'id', '.') || + aint(script[0].first.first, 'string', 'ADSAFE') || + aint(script[0].second[0], 'string', adsafe_id)) { + stop('adsafe_id_go'); + } + switch (script[0].first.second.string) { + case 'id': + if (adsafe_may || adsafe_went || + script[0].second.length !== 1) { + stop('adsafe_id', next_token); + } + adsafe_may = true; + break; + case 'go': + if (adsafe_went) { + stop('adsafe_go'); + } + if (script[0].second.length !== 2 || + aint(script[0].second[1], 'id', 'function') || + !script[0].second[1].first || + aint(script[0].second[1].first[0], 'string', 'dom') || + script[0].second[1].first.length > 2 || + (script[0].second[1].first.length === 2 && + aint(script[0].second[1].first[1], 'string', 'lib'))) { + stop('adsafe_go', next_token); + } + adsafe_went = true; + break; + default: + stop('adsafe_id_go'); + } + } + indent = null; + } + xmode = 'html'; + advance(''); + styles(); + xmode = 'html'; + advance(''; + } + + function html() { + var attribute, attributes, is_empty, name, old_white = option.white, + quote, tag_name, tag, wmode; + xmode = 'html'; + xquote = ''; + stack = null; + for (;;) { + switch (next_token.string) { + case '<': + xmode = 'html'; + advance('<'); + attributes = {}; + tag_name = next_token; + name = tag_name.string; + advance_identifier(name); + if (option.cap) { + name = name.toLowerCase(); + } + tag_name.name = name; + if (!stack) { + stack = []; + do_begin(name); + } + tag = html_tag[name]; + if (typeof tag !== 'object') { + stop('unrecognized_tag_a', tag_name, name); + } + is_empty = tag.empty; + tag_name.type = name; + for (;;) { + if (next_token.id === '/') { + advance('/'); + if (next_token.id !== '>') { + warn('expected_a_b', next_token, '>', artifact()); + } + break; + } + if (next_token.id && next_token.id.charAt(0) === '>') { + break; + } + if (!next_token.identifier) { + if (next_token.id === '(end)' || next_token.id === '(error)') { + warn('expected_a_b', next_token, '>', artifact()); + } + warn('bad_name_a'); + } + option.white = false; + spaces(); + attribute = next_token.string; + option.white = old_white; + advance(); + if (!option.cap && attribute !== attribute.toLowerCase()) { + warn('attribute_case_a', token); + } + attribute = attribute.toLowerCase(); + xquote = ''; + if (Object.prototype.hasOwnProperty.call(attributes, attribute)) { + warn('duplicate_a', token, attribute); + } + if (attribute.slice(0, 2) === 'on') { + if (!option.on) { + warn('html_handlers'); + } + xmode = 'scriptstring'; + advance('='); + quote = next_token.id; + if (quote !== '"' && quote !== '\'') { + stop('expected_a_b', next_token, '"', artifact()); + } + xquote = quote; + wmode = option.white; + option.white = true; + advance(quote); + use_strict(); + statements(); + option.white = wmode; + if (next_token.id !== quote) { + stop('expected_a_b', next_token, quote, artifact()); + } + xmode = 'html'; + xquote = ''; + advance(quote); + tag = false; + } else if (attribute === 'style') { + xmode = 'scriptstring'; + advance('='); + quote = next_token.id; + if (quote !== '"' && quote !== '\'') { + stop('expected_a_b', next_token, '"', artifact()); + } + xmode = 'styleproperty'; + xquote = quote; + advance(quote); + substyle(); + xmode = 'html'; + xquote = ''; + advance(quote); + tag = false; + } else { + if (next_token.id === '=') { + advance('='); + tag = next_token.string; + if (!next_token.identifier && + next_token.id !== '"' && + next_token.id !== '\'' && + next_token.id !== '(string)' && + next_token.id !== '(string)' && + next_token.id !== '(color)') { + warn('expected_attribute_value_a', token, attribute); + } + advance(); + } else { + tag = true; + } + } + attributes[attribute] = tag; + do_attribute(attribute, tag); + } + do_tag(name, attributes); + if (!is_empty) { + stack.push(tag_name); + } + xmode = 'outer'; + advance('>'); + break; + case '') { + stop('expected_a_b', next_token, '>', artifact()); + } + xmode = 'outer'; + advance('>'); + break; + case '' || next_token.id === '(end)') { + break; + } + if (next_token.string.indexOf('--') >= 0) { + stop('unexpected_a', next_token, '--'); + } + if (next_token.string.indexOf('<') >= 0) { + stop('unexpected_a', next_token, '<'); + } + if (next_token.string.indexOf('>') >= 0) { + stop('unexpected_a', next_token, '>'); + } + } + xmode = 'outer'; + advance('>'); + break; + case '(end)': + if (stack.length !== 0) { + warn('missing_a', next_token, ''); + } + return; + default: + if (next_token.id === '(end)') { + stop('missing_a', next_token, + ''); + } else { + advance(); + } + } + if (stack && stack.length === 0 && (option.adsafe || + !option.fragment || next_token.id === '(end)')) { + break; + } + } + if (next_token.id !== '(end)') { + stop('unexpected_a'); + } + } + + +// The actual JSLINT function itself. + + itself = function JSLint(the_source, the_option) { + + var i, predef, tree; + JSLINT.errors = []; + JSLINT.tree = ''; + begin = prev_token = token = next_token = + Object.create(syntax['(begin)']); + predefined = {}; + add_to_predefined(standard); + property = {}; + if (the_option) { + option = Object.create(the_option); + predef = option.predef; + if (predef) { + if (Array.isArray(predef)) { + for (i = 0; i < predef.length; i += 1) { + predefined[predef[i]] = true; + } + } else if (typeof predef === 'object') { + add_to_predefined(predef); + } + } + do_safe(); + } else { + option = {}; + } + option.indent = +option.indent || 4; + option.maxerr = +option.maxerr || 50; + adsafe_id = ''; + adsafe_may = adsafe_top = adsafe_went = false; + approved = {}; + if (option.approved) { + for (i = 0; i < option.approved.length; i += 1) { + approved[option.approved[i]] = option.approved[i]; + } + } else { + approved.test = 'test'; + } + tab = ''; + for (i = 0; i < option.indent; i += 1) { + tab += ' '; + } + global_scope = scope = {}; + global_funct = funct = { + '(scope)': scope, + '(breakage)': 0, + '(loopage)': 0 + }; + functions = [funct]; + + comments_off = false; + ids = {}; + in_block = false; + indent = null; + json_mode = false; + lookahead = []; + node_js = false; + prereg = true; + src = false; + stack = null; + strict_mode = false; + urls = []; + var_mode = null; + warnings = 0; + xmode = ''; + lex.init(the_source); + + assume(); + + try { + advance(); + if (next_token.id === '(number)') { + stop('unexpected_a'); + } else if (next_token.string.charAt(0) === '<') { + html(); + if (option.adsafe && !adsafe_went) { + warn('adsafe_go', this); + } + } else { + switch (next_token.id) { + case '{': + case '[': + json_mode = true; + json_value(); + break; + case '@': + case '*': + case '#': + case '.': + case ':': + xmode = 'style'; + advance(); + if (token.id !== '@' || !next_token.identifier || + next_token.string !== 'charset' || token.line !== 1 || + token.from !== 1) { + stop('css'); + } + advance(); + if (next_token.id !== '(string)' && + next_token.string !== 'UTF-8') { + stop('css'); + } + advance(); + semicolon(); + styles(); + break; + + default: + if (option.adsafe && option.fragment) { + stop('expected_a_b', + next_token, '
    ', artifact()); + } + +// If the first token is a semicolon, ignore it. This is sometimes used when +// files are intended to be appended to files that may be sloppy. A sloppy +// file may be depending on semicolon insertion on its last line. + + step_in(1); + if (next_token.id === ';' && !node_js) { + semicolon(); + } + adsafe_top = true; + tree = statements(); + begin.first = tree; + JSLINT.tree = begin; + // infer_types(tree); + if (option.adsafe && (tree.length !== 1 || + aint(tree[0], 'id', '(') || + aint(tree[0].first, 'id', '.') || + aint(tree[0].first.first, 'string', 'ADSAFE') || + aint(tree[0].first.second, 'string', 'lib') || + tree[0].second.length !== 2 || + tree[0].second[0].id !== '(string)' || + aint(tree[0].second[1], 'id', 'function'))) { + stop('adsafe_lib'); + } + if (tree.disrupt) { + warn('weird_program', prev_token); + } + } + } + indent = null; + advance('(end)'); + } catch (e) { + if (e) { // ~~ + JSLINT.errors.push({ + reason : e.message, + line : e.line || next_token.line, + character : e.character || next_token.from + }, null); + } + } + return JSLINT.errors.length === 0; + }; + + +// Data summary. + + itself.data = function () { + var data = {functions: []}, + function_data, + globals, + i, + j, + kind, + members = [], + name, + the_function, + undef = [], + unused = []; + if (itself.errors.length) { + data.errors = itself.errors; + } + + if (json_mode) { + data.json = true; + } + + if (urls.length > 0) { + data.urls = urls; + } + + globals = Object.keys(global_scope).filter(function (value) { + return value.charAt(0) !== '(' && typeof standard[value] !== 'boolean'; + }); + if (globals.length > 0) { + data.globals = globals; + } + + for (i = 1; i < functions.length; i += 1) { + the_function = functions[i]; + function_data = {}; + for (j = 0; j < functionicity.length; j += 1) { + function_data[functionicity[j]] = []; + } + for (name in the_function) { + if (Object.prototype.hasOwnProperty.call(the_function, name)) { + if (name.charAt(0) !== '(') { + kind = the_function[name]; + if (kind === 'unction' || kind === 'unparam') { + kind = 'unused'; + } + if (Array.isArray(function_data[kind])) { + function_data[kind].push(name); + if (kind === 'unused') { + unused.push({ + name: name, + line: the_function['(line)'], + 'function': the_function['(name)'] + }); + } else if (kind === 'undef') { + undef.push({ + name: name, + line: the_function['(line)'], + 'function': the_function['(name)'] + }); + } + } + } + } + } + for (j = 0; j < functionicity.length; j += 1) { + if (function_data[functionicity[j]].length === 0) { + delete function_data[functionicity[j]]; + } + } + function_data.name = the_function['(name)']; + function_data.params = the_function['(params)']; + function_data.line = the_function['(line)']; + data.functions.push(function_data); + } + + if (unused.length > 0) { + data.unused = unused; + } + if (undef.length > 0) { + data['undefined'] = undef; + } + + members = []; + for (name in property) { + if (typeof property[name] === 'number') { + data.member = property; + break; + } + } + + return data; + }; + + + itself.report = function (errors_only) { + var data = itself.data(), err, evidence, i, italics, j, key, keys, + length, mem = '', name, names, not_first, output = [], snippets, + the_function, warning; + + function detail(h, value) { + var comma_needed, singularity; + if (Array.isArray(value)) { + output.push('
    ' + h + ' '); + value.sort().forEach(function (item) { + if (item !== singularity) { + singularity = item; + output.push((comma_needed ? ', ' : '') + singularity); + comma_needed = true; + } + }); + output.push('
    '); + } else if (value) { + output.push('
    ' + h + ' ' + value + '
    '); + } + } + + if (data.errors || data.unused || data['undefined']) { + err = true; + output.push('
    Error:'); + if (data.errors) { + for (i = 0; i < data.errors.length; i += 1) { + warning = data.errors[i]; + if (warning) { + evidence = warning.evidence || ''; + output.push('

    Problem' + (isFinite(warning.line) + ? ' at line ' + String(warning.line) + + ' character ' + String(warning.character) + : '') + + ': ' + warning.reason.entityify() + + '

    ' + + (evidence && (evidence.length > 80 + ? evidence.slice(0, 77) + '...' + : evidence).entityify()) + '

    '); + } + } + } + + if (data['undefined']) { + snippets = []; + for (i = 0; i < data['undefined'].length; i += 1) { + snippets[i] = '' + data['undefined'][i].name + ' ' + + String(data['undefined'][i].line) + ' ' + + data['undefined'][i]['function'] + ''; + } + output.push('

    Undefined variable: ' + snippets.join(', ') + '

    '); + } + if (data.unused) { + snippets = []; + for (i = 0; i < data.unused.length; i += 1) { + snippets[i] = '' + data.unused[i].name + ' ' + + String(data.unused[i].line) + ' ' + + data.unused[i]['function'] + ''; + } + output.push('

    Unused variable: ' + snippets.join(', ') + '

    '); + } + if (data.json) { + output.push('

    JSON: bad.

    '); + } + output.push('
    '); + } + + if (!errors_only) { + + output.push('
    '); + + if (data.urls) { + detail("URLs
    ", data.urls, '
    '); + } + + if (xmode === 'style') { + output.push('

    CSS.

    '); + } else if (data.json && !err) { + output.push('

    JSON: good.

    '); + } else if (data.globals) { + output.push('
    Global ' + + data.globals.sort().join(', ') + '
    '); + } else { + output.push('
    No new global variables introduced.
    '); + } + + for (i = 0; i < data.functions.length; i += 1) { + the_function = data.functions[i]; + names = []; + if (the_function.params) { + for (j = 0; j < the_function.params.length; j += 1) { + names[j] = the_function.params[j].string; + } + } + output.push('
    ' + + String(the_function.line) + ' ' + + the_function.name.entityify() + + '(' + names.join(', ') + ')
    '); + detail('Undefined', the_function['undefined']); + detail('Unused', the_function.unused); + detail('Closure', the_function.closure); + detail('Variable', the_function['var']); + detail('Exception', the_function.exception); + detail('Outer', the_function.outer); + detail('Global', the_function.global); + detail('Label', the_function.label); + } + + if (data.member) { + keys = Object.keys(data.member); + if (keys.length) { + keys = keys.sort(); + output.push('
    /*properties
    '); + mem = ' '; + italics = 0; + j = 0; + not_first = false; + for (i = 0; i < keys.length; i += 1) { + key = keys[i]; + if (data.member[key] > 0) { + if (not_first) { + mem += ', '; + } + name = ix.test(key) + ? key + : '\'' + key.entityify().replace(nx, sanitize) + '\''; + length += name.length + 2; + if (data.member[key] === 1) { + name = '' + name + ''; + italics += 1; + j = 1; + } + if (mem.length + name.length - (italics * 7) > 80) { + output.push(mem + '
    '); + mem = ' '; + italics = j; + } + mem += name; + j = 0; + not_first = true; + } + } + output.push(mem + '
    */
    '); + } + output.push('
    '); + } + } + return output.join(''); + }; + itself.jslint = itself; + + itself.edition = '2012-04-15'; + + return itself; +}()); +core.JSLint = function JSLint() { + this.JSLINT = JSLINT; +}; + diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/PointWalker.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/PointWalker.js new file mode 100644 index 0000000000..f3f0008f78 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/PointWalker.js @@ -0,0 +1,197 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core: true, Node: true*/ +/** + * A simple walker that allows finegrained stepping through the DOM. + * It does not support node filtering. + * TODO: write a position walker that uses a treewalker + * @constructor + * @param {!Node} node + */ +core.PointWalker = function PointWalker(node) { + "use strict"; + var currentNode = node, + before = null, // node before the point + after = node && node.firstChild, // node after the point + root = node, + pos = 0; + + /** + * @param {!Node} node + * @return {!number} + */ + function getPosition(node) { + var /**@type{!number}*/ p = -1, + /**@type{Node}*/ n = node; + while (n) { + n = n.previousSibling; + p += 1; + } + return p; + } + /** + * Move the walker to the point given by @p node and @p position. + * @param {!Element} node must be the root of this walker or part of the + * tree of this walker. + * @param {!number} position must be a valid position in @node. + **/ + this.setPoint = function (node, position) { + currentNode = node; + pos = position; + if (currentNode.nodeType === 3) { // Node.TEXT_NODE + after = null; + before = null; + } else { + after = currentNode.firstChild; + while (position) { + position -= 1; + after = after.nextSibling; + } + if (after) { + before = after.previousSibling; + } else { + before = currentNode.lastChild; + } + } + }; + /** + * @return {!boolean} + */ + this.stepForward = function () { + var len; + // if this is a text node, move to the next position in the text + if (currentNode.nodeType === 3) { // TEXT_NODE + if (typeof currentNode.nodeValue.length === "number") { + len = currentNode.nodeValue.length; + } else { + len = currentNode.nodeValue.length(); + } + if (pos < len) { + pos += 1; + return true; + } + } + if (after) { + if (after.nodeType === 1) { // ELEMENT_NODE + currentNode = after; + before = null; + after = currentNode.firstChild; + pos = 0; + } else if (after.nodeType === 3) { // TEXT_NODE + currentNode = after; + before = null; + after = null; + pos = 0; + } else { + before = after; + after = after.nextSibling; + pos += 1; + } + return true; + } + if (currentNode !== root) { + before = currentNode; + after = before.nextSibling; + currentNode = currentNode.parentNode; + pos = getPosition(before) + 1; + return true; + } + return false; + }; + /** + * @return {!boolean} + */ + this.stepBackward = function () { + // if this is a text node, move to the next position in the text + if (currentNode.nodeType === 3) { // TEXT_NODE + if (pos > 0) { + pos -= 1; + return true; + } + } + if (before) { + if (before.nodeType === 1) { // ELEMENT_NODE + currentNode = before; + before = currentNode.lastChild; + after = null; + pos = getPosition(before) + 1; + } else if (before.nodeType === 3) { // TEXT_NODE + currentNode = before; + before = null; + after = null; + if (typeof currentNode.nodeValue.length === "number") { + pos = currentNode.nodeValue.length; + } else { + pos = currentNode.nodeValue.length(); + } + } else { + after = before; + before = before.previousSibling; + pos -= 1; + } + return true; + } + if (currentNode !== root) { + after = currentNode; + before = after.previousSibling; + currentNode = currentNode.parentNode; + pos = getPosition(after); + return true; + } + return false; + }; + /** + * @return {?Node} + */ + this.node = function () { + return currentNode; + }; + /** + * @return {!number} + */ + this.position = function () { + return pos; + }; + /** + * @return {?Node} + */ + this.precedingSibling = function () { + return before; + }; + /** + * @return {?Node} + */ + this.followingSibling = function () { + return after; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/RawDeflate.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/RawDeflate.js new file mode 100644 index 0000000000..5fdd2b02de --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/RawDeflate.js @@ -0,0 +1,1833 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core, runtime*/ +/*jslint bitwise: true, white: false, plusplus: true, vars: true, continue: true*/ +/* + * $Id: rawdeflate.js,v 0.3 2009/03/01 19:05:05 dankogai Exp dankogai $ + * + * Original: + * http://www.onicos.com/staff/iz/amuse/javascript/expert/deflate.txt + */ +/** + * @constructor + */ +core.RawDeflate = function () { + "use strict"; + /* Copyright (C) 1999 Masanao Izumo + * Version: 1.0.1 + * LastModified: Dec 25 1999 + */ + + /* Interface: + * data = zip_deflate(src); + */ + + /* constant parameters */ + var zip_WSIZE = 32768, // Sliding Window size + zip_STORED_BLOCK = 0, + zip_STATIC_TREES = 1, + zip_DYN_TREES = 2, + + /* for deflate */ + zip_DEFAULT_LEVEL = 6, + zip_FULL_SEARCH = true, + zip_INBUFSIZ = 32768, // Input buffer size + zip_INBUF_EXTRA = 64, // Extra buffer + zip_OUTBUFSIZ = 1024 * 8, + zip_window_size = 2 * zip_WSIZE, + zip_MIN_MATCH = 3, + zip_MAX_MATCH = 258, + zip_BITS = 16, + // for SMALL_MEM + zip_LIT_BUFSIZE = 0x2000, + zip_HASH_BITS = 13, + // for MEDIUM_MEM + // var zip_LIT_BUFSIZE = 0x4000; + // var zip_HASH_BITS = 14; + // for BIG_MEM + // var zip_LIT_BUFSIZE = 0x8000; + zip_DIST_BUFSIZE = zip_LIT_BUFSIZE, + zip_HASH_SIZE = 1 << zip_HASH_BITS, + zip_HASH_MASK = zip_HASH_SIZE - 1, + zip_WMASK = zip_WSIZE - 1, + zip_NIL = 0, // Tail of hash chains + zip_TOO_FAR = 4096, + zip_MIN_LOOKAHEAD = zip_MAX_MATCH + zip_MIN_MATCH + 1, + zip_MAX_DIST = zip_WSIZE - zip_MIN_LOOKAHEAD, + zip_SMALLEST = 1, + zip_MAX_BITS = 15, + zip_MAX_BL_BITS = 7, + zip_LENGTH_CODES = 29, + zip_LITERALS = 256, + zip_END_BLOCK = 256, + zip_L_CODES = zip_LITERALS + 1 + zip_LENGTH_CODES, + zip_D_CODES = 30, + zip_BL_CODES = 19, + zip_REP_3_6 = 16, + zip_REPZ_3_10 = 17, + zip_REPZ_11_138 = 18, + zip_HEAP_SIZE = 2 * zip_L_CODES + 1, + zip_H_SHIFT = parseInt((zip_HASH_BITS + zip_MIN_MATCH - 1) / + zip_MIN_MATCH, 10), + + /* variables */ + zip_free_queue, + zip_qhead, + zip_qtail, + zip_initflag, + zip_outbuf = null, + zip_outcnt, + zip_outoff, + zip_complete, + zip_window, + zip_d_buf, + zip_l_buf, + zip_prev, + zip_bi_buf, + zip_bi_valid, + zip_block_start, + zip_ins_h, + zip_hash_head, + zip_prev_match, + zip_match_available, + zip_match_length, + zip_prev_length, + zip_strstart, + zip_match_start, + zip_eofile, + zip_lookahead, + zip_max_chain_length, + zip_max_lazy_match, + zip_compr_level, + zip_good_match, + zip_nice_match, + zip_dyn_ltree, + zip_dyn_dtree, + zip_static_ltree, + zip_static_dtree, + zip_bl_tree, + zip_l_desc, + zip_d_desc, + zip_bl_desc, + zip_bl_count, + zip_heap, + zip_heap_len, + zip_heap_max, + zip_depth, + zip_length_code, + zip_dist_code, + zip_base_length, + zip_base_dist, + zip_flag_buf, + zip_last_lit, + zip_last_dist, + zip_last_flags, + zip_flags, + zip_flag_bit, + zip_opt_len, + zip_static_len, + zip_deflate_data, + zip_deflate_pos, + // var zip_HASH_BITS = 15; + /* constant tables */ + zip_extra_lbits = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0], + zip_extra_dbits = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13], + zip_extra_blbits = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7], + zip_bl_order = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15], + zip_configuration_table; + if (zip_LIT_BUFSIZE > zip_INBUFSIZ) { + runtime.log("error: zip_INBUFSIZ is too small"); + } + if ((zip_WSIZE << 1) > (1 << zip_BITS)) { + runtime.log("error: zip_WSIZE is too large"); + } + if (zip_HASH_BITS > zip_BITS - 1) { + runtime.log("error: zip_HASH_BITS is too large"); + } + if (zip_HASH_BITS < 8 || zip_MAX_MATCH !== 258) { + runtime.log("error: Code too clever"); + } + + /* objects (deflate) */ + /** + * @constructor + */ + function Zip_DeflateCT() { + this.fc = 0; // frequency count or bit string + this.dl = 0; // father node in Huffman tree or length of bit string + } + /** + * @constructor + */ + function Zip_DeflateTreeDesc() { + this.dyn_tree = null; // the dynamic tree + this.static_tree = null; // corresponding static tree or NULL + this.extra_bits = null; // extra bits for each code or NULL + this.extra_base = 0; // base index for extra_bits + this.elems = 0; // max number of elements in the tree + this.max_length = 0; // max bit length for the codes + this.max_code = 0; // largest code with non zero frequency + } + + /** Values for max_lazy_match, good_match and max_chain_length, depending on + * the desired pack level (0..9). The values given below have been tuned to + * exclude worst case performance for pathological files. Better values may be + * found for specific files. + * @constructor + */ + function Zip_DeflateConfiguration(a, b, c, d) { + this.good_length = a; // reduce lazy search above this match length + this.max_lazy = b; // do not perform lazy search above this match length + this.nice_length = c; // quit search above this match length + this.max_chain = d; + } + + /** + * @constructor + */ + function Zip_DeflateBuffer() { + this.next = null; + this.len = 0; + this.ptr = []; + this.ptr.length = zip_OUTBUFSIZ; + this.off = 0; + } + + /* constant tables */ + zip_configuration_table = [ + new Zip_DeflateConfiguration(0, 0, 0, 0), + new Zip_DeflateConfiguration(4, 4, 8, 4), + new Zip_DeflateConfiguration(4, 5, 16, 8), + new Zip_DeflateConfiguration(4, 6, 32, 32), + new Zip_DeflateConfiguration(4, 4, 16, 16), + new Zip_DeflateConfiguration(8, 16, 32, 32), + new Zip_DeflateConfiguration(8, 16, 128, 128), + new Zip_DeflateConfiguration(8, 32, 128, 256), + new Zip_DeflateConfiguration(32, 128, 258, 1024), + new Zip_DeflateConfiguration(32, 258, 258, 4096) + ]; + + + /* routines (deflate) */ + + function zip_deflate_start(level) { + var i; + + if (!level) { + level = zip_DEFAULT_LEVEL; + } else if (level < 1) { + level = 1; + } else if (level > 9) { + level = 9; + } + + zip_compr_level = level; + zip_initflag = false; + zip_eofile = false; + if (zip_outbuf !== null) { + return; + } + + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = []; + zip_outbuf.length = zip_OUTBUFSIZ; + zip_window = []; + zip_window.length = zip_window_size; + zip_d_buf = []; + zip_d_buf.length = zip_DIST_BUFSIZE; + zip_l_buf = []; + zip_l_buf.length = zip_INBUFSIZ + zip_INBUF_EXTRA; + zip_prev = []; + zip_prev.length = 1 << zip_BITS; + zip_dyn_ltree = []; + zip_dyn_ltree.length = zip_HEAP_SIZE; + for (i = 0; i < zip_HEAP_SIZE; i++) { + zip_dyn_ltree[i] = new Zip_DeflateCT(); + } + zip_dyn_dtree = []; + zip_dyn_dtree.length = 2 * zip_D_CODES + 1; + for (i = 0; i < 2 * zip_D_CODES + 1; i++) { + zip_dyn_dtree[i] = new Zip_DeflateCT(); + } + zip_static_ltree = []; + zip_static_ltree.length = zip_L_CODES + 2; + for (i = 0; i < zip_L_CODES + 2; i++) { + zip_static_ltree[i] = new Zip_DeflateCT(); + } + zip_static_dtree = []; + zip_static_dtree.length = zip_D_CODES; + for (i = 0; i < zip_D_CODES; i++) { + zip_static_dtree[i] = new Zip_DeflateCT(); + } + zip_bl_tree = []; + zip_bl_tree.length = 2 * zip_BL_CODES + 1; + for (i = 0; i < 2 * zip_BL_CODES + 1; i++) { + zip_bl_tree[i] = new Zip_DeflateCT(); + } + zip_l_desc = new Zip_DeflateTreeDesc(); + zip_d_desc = new Zip_DeflateTreeDesc(); + zip_bl_desc = new Zip_DeflateTreeDesc(); + zip_bl_count = []; + zip_bl_count.length = zip_MAX_BITS + 1; + zip_heap = []; + zip_heap.length = 2 * zip_L_CODES + 1; + zip_depth = []; + zip_depth.length = 2 * zip_L_CODES + 1; + zip_length_code = []; + zip_length_code.length = zip_MAX_MATCH - zip_MIN_MATCH + 1; + zip_dist_code = []; + zip_dist_code.length = 512; + zip_base_length = []; + zip_base_length.length = zip_LENGTH_CODES; + zip_base_dist = []; + zip_base_dist.length = zip_D_CODES; + zip_flag_buf = []; + zip_flag_buf.length = parseInt(zip_LIT_BUFSIZE / 8, 10); + } + + var zip_deflate_end = function () { + zip_free_queue = zip_qhead = zip_qtail = null; + zip_outbuf = null; + zip_window = null; + zip_d_buf = null; + zip_l_buf = null; + zip_prev = null; + zip_dyn_ltree = null; + zip_dyn_dtree = null; + zip_static_ltree = null; + zip_static_dtree = null; + zip_bl_tree = null; + zip_l_desc = null; + zip_d_desc = null; + zip_bl_desc = null; + zip_bl_count = null; + zip_heap = null; + zip_depth = null; + zip_length_code = null; + zip_dist_code = null; + zip_base_length = null; + zip_base_dist = null; + zip_flag_buf = null; + }; + + var zip_reuse_queue = function (p) { + p.next = zip_free_queue; + zip_free_queue = p; + }; + + var zip_new_queue = function () { + var p; + + if (zip_free_queue !== null) { + p = zip_free_queue; + zip_free_queue = zip_free_queue.next; + } else { + p = new Zip_DeflateBuffer(); + } + p.next = null; + p.len = p.off = 0; + + return p; + }; + + var zip_head1 = function (i) { + return zip_prev[zip_WSIZE + i]; + }; + + var zip_head2 = function (i, val) { + zip_prev[zip_WSIZE + i] = val; + return val; + }; + + var zip_qoutbuf = function () { + var q, i; + if (zip_outcnt !== 0) { + q = zip_new_queue(); + if (zip_qhead === null) { + zip_qhead = zip_qtail = q; + } else { + zip_qtail = zip_qtail.next = q; + } + q.len = zip_outcnt - zip_outoff; + // System.arraycopy(zip_outbuf, zip_outoff, q.ptr, 0, q.len); + for (i = 0; i < q.len; i++) { + q.ptr[i] = zip_outbuf[zip_outoff + i]; + } + zip_outcnt = zip_outoff = 0; + } + }; + + /* put_byte is used for the compressed output, put_ubyte for the + * uncompressed output. However unlzw() uses window for its + * suffix table instead of its output buffer, so it does not use put_ubyte + * (to be cleaned up). + */ + var zip_put_byte = function (c) { + zip_outbuf[zip_outoff + zip_outcnt++] = c; + if (zip_outoff + zip_outcnt === zip_OUTBUFSIZ) { + zip_qoutbuf(); + } + }; + + /* Output a 16 bit value, lsb first */ + var zip_put_short = function (w) { + w &= 0xffff; + if (zip_outoff + zip_outcnt < zip_OUTBUFSIZ - 2) { + zip_outbuf[zip_outoff + zip_outcnt++] = (w & 0xff); + zip_outbuf[zip_outoff + zip_outcnt++] = (w >>> 8); + } else { + zip_put_byte(w & 0xff); + zip_put_byte(w >>> 8); + } + }; + + /* ========================================================================== + * Insert string s in the dictionary and set match_head to the previous head + * of the hash chain (the most recent string with same hash key). Return + * the previous length of the hash chain. + * IN assertion: all calls to to INSERT_STRING are made with consecutive + * input characters and the first MIN_MATCH bytes of s are valid + * (except for the last MIN_MATCH-1 bytes of the input file). + */ + var zip_INSERT_STRING = function () { + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) + ^ (zip_window[zip_strstart + zip_MIN_MATCH - 1] & 0xff)) + & zip_HASH_MASK; + zip_hash_head = zip_head1(zip_ins_h); + zip_prev[zip_strstart & zip_WMASK] = zip_hash_head; + zip_head2(zip_ins_h, zip_strstart); + }; + + /* ========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ + var zip_Buf_size = 16; // bit size of bi_buf + var zip_send_bits = function ( + value, // value to send + length + ) { // number of bits + /* If not enough room in bi_buf, use (valid) bits from bi_buf and + * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid)) + * unused bits in value. + */ + if (zip_bi_valid > zip_Buf_size - length) { + zip_bi_buf |= (value << zip_bi_valid); + zip_put_short(zip_bi_buf); + zip_bi_buf = (value >> (zip_Buf_size - zip_bi_valid)); + zip_bi_valid += length - zip_Buf_size; + } else { + zip_bi_buf |= value << zip_bi_valid; + zip_bi_valid += length; + } + }; + + /* Send a code of the given tree. c and tree must not have side effects */ + var zip_SEND_CODE = function (c, tree) { + zip_send_bits(tree[c].fc, tree[c].dl); + }; + + /* Mapping from a distance to a distance code. dist is the distance - 1 and + * must not have side effects. dist_code[256] and dist_code[257] are never + * used. + */ + var zip_D_CODE = function (dist) { + return (dist < 256 ? zip_dist_code[dist] + : zip_dist_code[256 + (dist >> 7)]) & 0xff; + }; + + /* ========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ + var zip_SMALLER = function (tree, n, m) { + return tree[n].fc < tree[m].fc || + (tree[n].fc === tree[m].fc && zip_depth[n] <= zip_depth[m]); + }; + + /* ========================================================================== + * read string data + */ + var zip_read_buff = function (buff, offset, n) { + var i; + for (i = 0; i < n && zip_deflate_pos < zip_deflate_data.length; i++) { + buff[offset + i] = + zip_deflate_data.charCodeAt(zip_deflate_pos++) & 0xff; + } + return i; + }; + + /* ========================================================================== + * Fill the window when the lookahead becomes insufficient. + * Updates strstart and lookahead, and sets eofile if end of input file. + * IN assertion: lookahead < MIN_LOOKAHEAD && strstart + lookahead > 0 + * OUT assertions: at least one byte has been read, or eofile is set; + * file reads are performed for at least two bytes (required for the + * translate_eol option). + */ + var zip_fill_window = function () { + var n, m; + + // Amount of free space at the end of the window. + var more = zip_window_size - zip_lookahead - zip_strstart; + + /* If the window is almost full and there is insufficient lookahead, + * move the upper half to the lower one to make room in the upper half. + */ + if (more === -1) { + /* Very unlikely, but possible on 16 bit machine if strstart == 0 + * and lookahead == 1 (input done one byte at time) + */ + more--; + } else if (zip_strstart >= zip_WSIZE + zip_MAX_DIST) { + /* By the IN assertion, the window is not empty so we can't confuse + * more == 0 with more == 64K on a 16 bit machine. + */ + // Assert(window_size == (ulg)2*WSIZE, "no sliding with BIG_MEM"); + + // System.arraycopy(window, WSIZE, window, 0, WSIZE); + for (n = 0; n < zip_WSIZE; n++) { + zip_window[n] = zip_window[n + zip_WSIZE]; + } + + zip_match_start -= zip_WSIZE; + zip_strstart -= zip_WSIZE; /* we now have strstart >= MAX_DIST: */ + zip_block_start -= zip_WSIZE; + + for (n = 0; n < zip_HASH_SIZE; n++) { + m = zip_head1(n); + zip_head2(n, m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + for (n = 0; n < zip_WSIZE; n++) { + /* If n is not on any hash chain, prev[n] is garbage but + * its value will never be used. + */ + m = zip_prev[n]; + zip_prev[n] = (m >= zip_WSIZE ? m - zip_WSIZE : zip_NIL); + } + more += zip_WSIZE; + } + // At this point, more >= 2 + if (!zip_eofile) { + n = zip_read_buff(zip_window, zip_strstart + zip_lookahead, more); + if (n <= 0) { + zip_eofile = true; + } else { + zip_lookahead += n; + } + } + }; + + + /* ========================================================================== + * Initialize the "longest match" routines for a new file + */ + var zip_lm_init = function () { + var j; + + /* Initialize the hash table. */ + for (j = 0; j < zip_HASH_SIZE; j++) { + // zip_head2(j, zip_NIL); + zip_prev[zip_WSIZE + j] = 0; + } + /* prev will be initialized on the fly */ + + /* Set the default configuration parameters: + */ + zip_max_lazy_match = zip_configuration_table[zip_compr_level].max_lazy; + zip_good_match = zip_configuration_table[zip_compr_level].good_length; + if (!zip_FULL_SEARCH) { + zip_nice_match = zip_configuration_table[zip_compr_level].nice_length; + } + zip_max_chain_length = zip_configuration_table[zip_compr_level].max_chain; + + zip_strstart = 0; + zip_block_start = 0; + + zip_lookahead = zip_read_buff(zip_window, 0, 2 * zip_WSIZE); + if (zip_lookahead <= 0) { + zip_eofile = true; + zip_lookahead = 0; + return; + } + zip_eofile = false; + /* Make sure that we always have enough lookahead. This is important + * if input comes from a device such as a tty. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { + zip_fill_window(); + } + + /* If lookahead < MIN_MATCH, ins_h is garbage, but this is + * not important since only literal bytes will be emitted. + */ + zip_ins_h = 0; + for (j = 0; j < zip_MIN_MATCH - 1; j++) { + // UPDATE_HASH(ins_h, window[j]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[j] & 0xff)) & zip_HASH_MASK; + } + }; + + /* ========================================================================== + * Set match_start to the longest match starting at the given string and + * return its length. Matches shorter or equal to prev_length are discarded, + * in which case the result is equal to prev_length and match_start is + * garbage. + * IN assertions: cur_match is the head of the hash chain for the current + * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1 + */ + var zip_longest_match = function (cur_match) { + var chain_length = zip_max_chain_length; // max hash chain length + var scanp = zip_strstart; // current string + var matchp; // matched string + var len; // length of current match + var best_len = zip_prev_length; // best match length so far + + /* Stop when cur_match becomes <= limit. To simplify the code, + * we prevent matches with the string of window index 0. + */ + var limit = (zip_strstart > zip_MAX_DIST ? zip_strstart - zip_MAX_DIST : zip_NIL); + + var strendp = zip_strstart + zip_MAX_MATCH; + var scan_end1 = zip_window[scanp + best_len - 1]; + var scan_end = zip_window[scanp + best_len]; + + /* Do not waste too much time if we already have a good match: */ + if (zip_prev_length >= zip_good_match) { + chain_length >>= 2; + } + + // Assert(encoder->strstart <= window_size-MIN_LOOKAHEAD, "insufficient lookahead"); + + do { + // Assert(cur_match < encoder->strstart, "no future"); + matchp = cur_match; + + /* Skip to next match if the match length cannot increase + * or if the match length is less than 2: + */ + if (zip_window[matchp + best_len] !== scan_end || + zip_window[matchp + best_len - 1] !== scan_end1 || + zip_window[matchp] !== zip_window[scanp] || + zip_window[++matchp] !== zip_window[scanp + 1]) { + continue; + } + + /* The check at best_len-1 can be removed because it will be made + * again later. (This heuristic is not always a win.) + * It is not necessary to compare scan[2] and match[2] since they + * are always equal when the other bytes match, given that + * the hash keys are equal and that HASH_BITS >= 8. + */ + scanp += 2; + matchp++; + + /* We check for insufficient lookahead only every 8th comparison; + * the 256th check will be made at strstart+258. + */ + do { + ++scanp; + } while (zip_window[scanp] === zip_window[++matchp] && + zip_window[++scanp] === zip_window[++matchp] && + zip_window[++scanp] === zip_window[++matchp] && + zip_window[++scanp] === zip_window[++matchp] && + zip_window[++scanp] === zip_window[++matchp] && + zip_window[++scanp] === zip_window[++matchp] && + zip_window[++scanp] === zip_window[++matchp] && + zip_window[++scanp] === zip_window[++matchp] && + scanp < strendp); + + len = zip_MAX_MATCH - (strendp - scanp); + scanp = strendp - zip_MAX_MATCH; + + if (len > best_len) { + zip_match_start = cur_match; + best_len = len; + if (zip_FULL_SEARCH) { + if (len >= zip_MAX_MATCH) { + break; + } + } else { + if (len >= zip_nice_match) { + break; + } + } + + scan_end1 = zip_window[scanp + best_len - 1]; + scan_end = zip_window[scanp + best_len]; + } + } while ((cur_match = zip_prev[cur_match & zip_WMASK]) > limit + && --chain_length !== 0); + + return best_len; + }; + + /* ========================================================================== + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. + */ + var zip_ct_tally = function ( + dist, // distance of matched string + lc + ) { // match length-MIN_MATCH or unmatched char (if dist==0) + zip_l_buf[zip_last_lit++] = lc; + if (dist === 0) { + // lc is the unmatched char + zip_dyn_ltree[lc].fc++; + } else { + // Here, lc is the match length - MIN_MATCH + dist--; // dist = match distance - 1 + // Assert((ush)dist < (ush)MAX_DIST && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)D_CODE(dist) < (ush)D_CODES, "ct_tally: bad match"); + + zip_dyn_ltree[zip_length_code[lc] + zip_LITERALS + 1].fc++; + zip_dyn_dtree[zip_D_CODE(dist)].fc++; + + zip_d_buf[zip_last_dist++] = dist; + zip_flags |= zip_flag_bit; + } + zip_flag_bit <<= 1; + + // Output the flags if they fill a byte + if ((zip_last_lit & 7) === 0) { + zip_flag_buf[zip_last_flags++] = zip_flags; + zip_flags = 0; + zip_flag_bit = 1; + } + // Try to guess if it is profitable to stop the current block here + if (zip_compr_level > 2 && (zip_last_lit & 0xfff) === 0) { + // Compute an upper bound for the compressed length + var out_length = zip_last_lit * 8; + var in_length = zip_strstart - zip_block_start; + var dcode; + + for (dcode = 0; dcode < zip_D_CODES; dcode++) { + out_length += zip_dyn_dtree[dcode].fc * (5 + zip_extra_dbits[dcode]); + } + out_length >>= 3; + // Trace((stderr,"\nlast_lit %u, last_dist %u, in %ld, out ~%ld(%ld%%) ", + // encoder->last_lit, encoder->last_dist, in_length, out_length, + // 100L - out_length*100L/in_length)); + if (zip_last_dist < parseInt(zip_last_lit / 2, 10) && + out_length < parseInt(in_length / 2, 10)) { + return true; + } + } + return (zip_last_lit === zip_LIT_BUFSIZE - 1 || + zip_last_dist === zip_DIST_BUFSIZE); + /* We avoid equality with LIT_BUFSIZE because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. + */ + }; + + /* ========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ + var zip_pqdownheap = function ( + tree, // the tree to restore + k + ) { // node to move down + var v = zip_heap[k]; + var j = k << 1; // left son of k + + while (j <= zip_heap_len) { + // Set j to the smallest of the two sons: + if (j < zip_heap_len && + zip_SMALLER(tree, zip_heap[j + 1], zip_heap[j])) { + j++; + } + + // Exit if v is smaller than both sons + if (zip_SMALLER(tree, v, zip_heap[j])) { + break; + } + + // Exchange v with the smallest son + zip_heap[k] = zip_heap[j]; + k = j; + + // And continue down the tree, setting j to the left son of k + j <<= 1; + } + zip_heap[k] = v; + }; + + /* ========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ + var zip_gen_bitlen = function (desc) { // the tree descriptor + var tree = desc.dyn_tree; + var extra = desc.extra_bits; + var base = desc.extra_base; + var max_code = desc.max_code; + var max_length = desc.max_length; + var stree = desc.static_tree; + var h; // heap index + var n, m; // iterate over the tree elements + var bits; // bit length + var xbits; // extra bits + var f; // frequency + var overflow = 0; // number of elements with bit length too large + + for (bits = 0; bits <= zip_MAX_BITS; bits++) { + zip_bl_count[bits] = 0; + } + + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[zip_heap[zip_heap_max]].dl = 0; // root of the heap + + for (h = zip_heap_max + 1; h < zip_HEAP_SIZE; h++) { + n = zip_heap[h]; + bits = tree[tree[n].dl].dl + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n].dl = bits; + // We overwrite tree[n].dl which is no longer needed + + if (n > max_code) { + continue; // not a leaf node + } + + zip_bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n].fc; + zip_opt_len += f * (bits + xbits); + if (stree !== null) { + zip_static_len += f * (stree[n].dl + xbits); + } + } + if (overflow === 0) { + return; + } + + // This happens for example on obj2 and pic of the Calgary corpus + + // Find the first bit length which could increase: + do { + bits = max_length - 1; + while (zip_bl_count[bits] === 0) { + bits--; + } + zip_bl_count[bits]--; // move one leaf down the tree + zip_bl_count[bits + 1] += 2; // move one overflow item as its brother + zip_bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); + + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = zip_bl_count[bits]; + while (n !== 0) { + m = zip_heap[--h]; + if (m > max_code) { + continue; + } + if (tree[m].dl !== bits) { + zip_opt_len += (bits - tree[m].dl) * tree[m].fc; + tree[m].fc = bits; + } + n--; + } + } + }; + + /* ========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ + var zip_bi_reverse = function ( + code, // the value to invert + len + ) { // its bit length + var res = 0; + do { + res |= code & 1; + code >>= 1; + res <<= 1; + } while (--len > 0); + return res >> 1; + }; + + /* ========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ + var zip_gen_codes = function (tree, // the tree to decorate + max_code) { // largest code with non zero frequency + var next_code = []; + next_code.length = zip_MAX_BITS + 1; // next code value for each bit length + var code = 0; // running code value + var bits; // bit index + var n; // code index + + /* The distribution counts are first used to generate the code values + * without bit reversal. + */ + for (bits = 1; bits <= zip_MAX_BITS; bits++) { + code = ((code + zip_bl_count[bits - 1]) << 1); + next_code[bits] = code; + } + + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + // Assert (code + encoder->bl_count[MAX_BITS]-1 == (1<> 1; n >= 1; n--) { + zip_pqdownheap(tree, n); + } + + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + do { + n = zip_heap[zip_SMALLEST]; + zip_heap[zip_SMALLEST] = zip_heap[zip_heap_len--]; + zip_pqdownheap(tree, zip_SMALLEST); + + m = zip_heap[zip_SMALLEST]; // m = node of next least frequency + + // keep the nodes sorted by frequency + zip_heap[--zip_heap_max] = n; + zip_heap[--zip_heap_max] = m; + + // Create a new node father of n and m + tree[node].fc = tree[n].fc + tree[m].fc; + // depth[node] = (char)(MAX(depth[n], depth[m]) + 1); + if (zip_depth[n] > zip_depth[m] + 1) { + zip_depth[node] = zip_depth[n]; + } else { + zip_depth[node] = zip_depth[m] + 1; + } + tree[n].dl = tree[m].dl = node; + + // and insert the new node in the heap + zip_heap[zip_SMALLEST] = node++; + zip_pqdownheap(tree, zip_SMALLEST); + + } while (zip_heap_len >= 2); + + zip_heap[--zip_heap_max] = zip_heap[zip_SMALLEST]; + + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + zip_gen_bitlen(desc); + + // The field len is now set, we can generate the bit codes + zip_gen_codes(tree, max_code); + }; + + /* ========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. Updates opt_len to take into account the repeat + * counts. (The contribution of the bit length codes will be added later + * during the construction of bl_tree.) + */ + var zip_scan_tree = function (tree,// the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[max_code + 1].dl = 0xffff; // guard + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen === nextlen) { + continue; + } else if (count < min_count) { + zip_bl_tree[curlen].fc += count; + } else if (curlen !== 0) { + if (curlen !== prevlen) { + zip_bl_tree[curlen].fc++; + } + zip_bl_tree[zip_REP_3_6].fc++; + } else if (count <= 10) { + zip_bl_tree[zip_REPZ_3_10].fc++; + } else { + zip_bl_tree[zip_REPZ_11_138].fc++; + } + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + }; + + + /* ========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ + var zip_build_bl_tree = function () { + var max_blindex; // index of last bit length code of non zero freq + + // Determine the bit length frequencies for literal and distance trees + zip_scan_tree(zip_dyn_ltree, zip_l_desc.max_code); + zip_scan_tree(zip_dyn_dtree, zip_d_desc.max_code); + + // Build the bit length tree: + zip_build_tree(zip_bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = zip_BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (zip_bl_tree[zip_bl_order[max_blindex]].dl !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + zip_opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + // Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + return max_blindex; + }; + + /* ========================================================================== + * Write out any remaining bits in an incomplete byte. + */ + var zip_bi_windup = function () { + if (zip_bi_valid > 8) { + zip_put_short(zip_bi_buf); + } else if (zip_bi_valid > 0) { + zip_put_byte(zip_bi_buf); + } + zip_bi_buf = 0; + zip_bi_valid = 0; + }; + + /* ========================================================================== + * Send the block data compressed using the given Huffman trees + */ + var zip_compress_block = function ( + ltree, // literal tree + dtree + ) { // distance tree + var dist; // distance of matched string + var lc; // match length or unmatched char (if dist == 0) + var lx = 0; // running index in l_buf + var dx = 0; // running index in d_buf + var fx = 0; // running index in flag_buf + var flag = 0; // current flags + var code; // the code to send + var extra; // number of extra bits to send + + if (zip_last_lit !== 0) { + do { + if ((lx & 7) === 0) { + flag = zip_flag_buf[fx++]; + } + lc = zip_l_buf[lx++] & 0xff; + if ((flag & 1) === 0) { + zip_SEND_CODE(lc, ltree); /* send a literal byte */ + // Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + // Here, lc is the match length - MIN_MATCH + code = zip_length_code[lc]; + zip_SEND_CODE(code + zip_LITERALS + 1, ltree); // send the length code + extra = zip_extra_lbits[code]; + if (extra !== 0) { + lc -= zip_base_length[code]; + zip_send_bits(lc, extra); // send the extra length bits + } + dist = zip_d_buf[dx++]; + // Here, dist is the match distance - 1 + code = zip_D_CODE(dist); + // Assert (code < D_CODES, "bad d_code"); + + zip_SEND_CODE(code, dtree); // send the distance code + extra = zip_extra_dbits[code]; + if (extra !== 0) { + dist -= zip_base_dist[code]; + zip_send_bits(dist, extra); // send the extra distance bits + } + } // literal or match pair ? + flag >>= 1; + } while (lx < zip_last_lit); + } + + zip_SEND_CODE(zip_END_BLOCK, ltree); + }; + + /* ========================================================================== + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. + */ + var zip_send_tree = function (tree, // the tree to be scanned + max_code) { // and its largest code of non zero frequency + var n; // iterates over all tree elements + var prevlen = -1; // last emitted length + var curlen; // length of current code + var nextlen = tree[0].dl; // length of next code + var count = 0; // repeat count of the current code + var max_count = 7; // max repeat count + var min_count = 4; // min repeat count + + /* tree[max_code+1].dl = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[n + 1].dl; + if (++count < max_count && curlen === nextlen) { + continue; + } else if (count < min_count) { + do { + zip_SEND_CODE(curlen, zip_bl_tree); + } while (--count !== 0); + } else if (curlen !== 0) { + if (curlen !== prevlen) { + zip_SEND_CODE(curlen, zip_bl_tree); + count--; + } + // Assert(count >= 3 && count <= 6, " 3_6?"); + zip_SEND_CODE(zip_REP_3_6, zip_bl_tree); + zip_send_bits(count - 3, 2); + } else if (count <= 10) { + zip_SEND_CODE(zip_REPZ_3_10, zip_bl_tree); + zip_send_bits(count - 3, 3); + } else { + zip_SEND_CODE(zip_REPZ_11_138, zip_bl_tree); + zip_send_bits(count - 11, 7); + } + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; + } else { + max_count = 7; + min_count = 4; + } + } + }; + + /* ========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ + var zip_send_all_trees = function (lcodes, dcodes, blcodes) { // number of codes for each tree + var rank; // index in bl_order + + // Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + // Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + // Tracev((stderr, "\nbl counts: ")); + zip_send_bits(lcodes - 257, 5); // not +255 as stated in appnote.txt + zip_send_bits(dcodes - 1, 5); + zip_send_bits(blcodes - 4, 4); // not -3 as stated in appnote.txt + for (rank = 0; rank < blcodes; rank++) { + // Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + zip_send_bits(zip_bl_tree[zip_bl_order[rank]].dl, 3); + } + + // send the literal tree + zip_send_tree(zip_dyn_ltree, lcodes - 1); + + // send the distance tree + zip_send_tree(zip_dyn_dtree, dcodes - 1); + }; + + /* ========================================================================== + * Initialize a new block. + */ + var zip_init_block = function () { + var n; // iterates over tree elements + + // Initialize the trees. + for (n = 0; n < zip_L_CODES; n++) { + zip_dyn_ltree[n].fc = 0; + } + for (n = 0; n < zip_D_CODES; n++) { + zip_dyn_dtree[n].fc = 0; + } + for (n = 0; n < zip_BL_CODES; n++) { + zip_bl_tree[n].fc = 0; + } + + zip_dyn_ltree[zip_END_BLOCK].fc = 1; + zip_opt_len = zip_static_len = 0; + zip_last_lit = zip_last_dist = zip_last_flags = 0; + zip_flags = 0; + zip_flag_bit = 1; + }; + + /* ========================================================================== + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. + */ + var zip_flush_block = function (eof) { // true if this is the last block for a file + var opt_lenb, static_lenb; // opt_len and static_len in bytes + var max_blindex; // index of last bit length code of non zero freq + var stored_len; // length of input block + + stored_len = zip_strstart - zip_block_start; + zip_flag_buf[zip_last_flags] = zip_flags; // Save the flags for the last 8 items + + // Construct the literal and distance trees + zip_build_tree(zip_l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + + zip_build_tree(zip_d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", + // encoder->opt_len, encoder->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = zip_build_bl_tree(); + + // Determine the best encoding. Compute first the block length in bytes + opt_lenb = (zip_opt_len + 3 + 7) >> 3; + static_lenb = (zip_static_len + 3 + 7) >> 3; + + // Trace((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u dist %u ", + // opt_lenb, encoder->opt_len, + // static_lenb, encoder->static_len, stored_len, + // encoder->last_lit, encoder->last_dist)); + + if (static_lenb <= opt_lenb) { + opt_lenb = static_lenb; + } + if (stored_len + 4 <= opt_lenb // 4: two words for the lengths + && zip_block_start >= 0) { + var i; + + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. + */ + zip_send_bits((zip_STORED_BLOCK << 1) + eof, 3); /* send block type */ + zip_bi_windup(); /* align on byte boundary */ + zip_put_short(stored_len); + zip_put_short(~stored_len); + + // copy block + /* + p = &window[block_start]; + for (i = 0; i < stored_len; i++) + put_byte(p[i]); + */ + for (i = 0; i < stored_len; i++) { + zip_put_byte(zip_window[zip_block_start + i]); + } + + } else if (static_lenb === opt_lenb) { + zip_send_bits((zip_STATIC_TREES << 1) + eof, 3); + zip_compress_block(zip_static_ltree, zip_static_dtree); + } else { + zip_send_bits((zip_DYN_TREES << 1) + eof, 3); + zip_send_all_trees(zip_l_desc.max_code + 1, + zip_d_desc.max_code + 1, + max_blindex + 1); + zip_compress_block(zip_dyn_ltree, zip_dyn_dtree); + } + + zip_init_block(); + + if (eof !== 0) { + zip_bi_windup(); + } + }; + + /* ========================================================================== + * Processes a new input file and return its compressed length. This + * function does not perform lazy evaluationof matches and inserts + * new strings in the dictionary only for unmatched strings or for short + * matches. It is used only for the fast compression options. + */ + var zip_deflate_fast = function () { + while (zip_lookahead !== 0 && zip_qhead === null) { + var flush; // set if current block must be flushed + + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + * At this point we have always match_length < MIN_MATCH + */ + if (zip_hash_head !== zip_NIL && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) { + zip_match_length = zip_lookahead; + } + } + if (zip_match_length >= zip_MIN_MATCH) { + // check_match(strstart, match_start, match_length); + + flush = zip_ct_tally(zip_strstart - zip_match_start, + zip_match_length - zip_MIN_MATCH); + zip_lookahead -= zip_match_length; + + /* Insert new strings in the hash table only if the match length + * is not too large. This saves time but degrades compression. + */ + if (zip_match_length <= zip_max_lazy_match) { + zip_match_length--; // string at strstart already in hash table + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since + * the next lookahead bytes will be emitted as literals. + */ + } while (--zip_match_length !== 0); + zip_strstart++; + } else { + zip_strstart += zip_match_length; + zip_match_length = 0; + zip_ins_h = zip_window[zip_strstart] & 0xff; + // UPDATE_HASH(ins_h, window[strstart + 1]); + zip_ins_h = ((zip_ins_h << zip_H_SHIFT) ^ (zip_window[zip_strstart + 1] & 0xff)) & zip_HASH_MASK; + + //#if MIN_MATCH != 3 + // Call UPDATE_HASH() MIN_MATCH-3 more times + //#endif + + } + } else { + /* No match, output a literal byte */ + flush = zip_ct_tally(0, zip_window[zip_strstart] & 0xff); + zip_lookahead--; + zip_strstart++; + } + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { + zip_fill_window(); + } + } + }; + + var zip_deflate_better = function () { + /* Process the input block. */ + while (zip_lookahead !== 0 && zip_qhead === null) { + /* Insert the string window[strstart .. strstart+2] in the + * dictionary, and set hash_head to the head of the hash chain: + */ + zip_INSERT_STRING(); + + /* Find the longest match, discarding those <= prev_length. + */ + zip_prev_length = zip_match_length; + zip_prev_match = zip_match_start; + zip_match_length = zip_MIN_MATCH - 1; + + if (zip_hash_head !== zip_NIL && + zip_prev_length < zip_max_lazy_match && + zip_strstart - zip_hash_head <= zip_MAX_DIST) { + /* To simplify the code, we prevent matches with the string + * of window index 0 (in particular we have to avoid a match + * of the string with itself at the start of the input file). + */ + zip_match_length = zip_longest_match(zip_hash_head); + /* longest_match() sets match_start */ + if (zip_match_length > zip_lookahead) { + zip_match_length = zip_lookahead; + } + + /* Ignore a length 3 match if it is too distant: */ + if (zip_match_length === zip_MIN_MATCH && + zip_strstart - zip_match_start > zip_TOO_FAR) { + /* If prev_match is also MIN_MATCH, match_start is garbage + * but we will ignore the current match anyway. + */ + zip_match_length--; + } + } + /* If there was a match at the previous step and the current + * match is not better, output the previous match: + */ + if (zip_prev_length >= zip_MIN_MATCH && + zip_match_length <= zip_prev_length) { + var flush; // set if current block must be flushed + + // check_match(strstart - 1, prev_match, prev_length); + flush = zip_ct_tally(zip_strstart - 1 - zip_prev_match, + zip_prev_length - zip_MIN_MATCH); + + /* Insert in hash table all strings up to the end of the match. + * strstart-1 and strstart are already inserted. + */ + zip_lookahead -= zip_prev_length - 1; + zip_prev_length -= 2; + do { + zip_strstart++; + zip_INSERT_STRING(); + /* strstart never exceeds WSIZE-MAX_MATCH, so there are + * always MIN_MATCH bytes ahead. If lookahead < MIN_MATCH + * these bytes are garbage, but it does not matter since the + * next lookahead bytes will always be emitted as literals. + */ + } while (--zip_prev_length !== 0); + zip_match_available = 0; + zip_match_length = zip_MIN_MATCH - 1; + zip_strstart++; + if (flush) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + } else if (zip_match_available !== 0) { + /* If there was no match at the previous position, output a + * single literal. If there was a match but the current match + * is longer, truncate the previous match to a single literal. + */ + if (zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff)) { + zip_flush_block(0); + zip_block_start = zip_strstart; + } + zip_strstart++; + zip_lookahead--; + } else { + /* There is no previous match to compare with, wait for + * the next step to decide. + */ + zip_match_available = 1; + zip_strstart++; + zip_lookahead--; + } + + /* Make sure that we always have enough lookahead, except + * at the end of the input file. We need MAX_MATCH bytes + * for the next match, plus MIN_MATCH bytes to insert the + * string following the next match. + */ + while (zip_lookahead < zip_MIN_LOOKAHEAD && !zip_eofile) { + zip_fill_window(); + } + } + }; + + /* ========================================================================== + * Allocate the match buffer, initialize the various tables and save the + * location of the internal file attribute (ascii/binary) and method + * (DEFLATE/STORE). + */ + var zip_ct_init = function () { + var n; // iterates over tree elements + var bits; // bit counter + var length; // length value + var code; // code value + var dist; // distance index + + if (zip_static_dtree[0].dl !== 0) { + return; // ct_init already called + } + + zip_l_desc.dyn_tree = zip_dyn_ltree; + zip_l_desc.static_tree = zip_static_ltree; + zip_l_desc.extra_bits = zip_extra_lbits; + zip_l_desc.extra_base = zip_LITERALS + 1; + zip_l_desc.elems = zip_L_CODES; + zip_l_desc.max_length = zip_MAX_BITS; + zip_l_desc.max_code = 0; + + zip_d_desc.dyn_tree = zip_dyn_dtree; + zip_d_desc.static_tree = zip_static_dtree; + zip_d_desc.extra_bits = zip_extra_dbits; + zip_d_desc.extra_base = 0; + zip_d_desc.elems = zip_D_CODES; + zip_d_desc.max_length = zip_MAX_BITS; + zip_d_desc.max_code = 0; + + zip_bl_desc.dyn_tree = zip_bl_tree; + zip_bl_desc.static_tree = null; + zip_bl_desc.extra_bits = zip_extra_blbits; + zip_bl_desc.extra_base = 0; + zip_bl_desc.elems = zip_BL_CODES; + zip_bl_desc.max_length = zip_MAX_BL_BITS; + zip_bl_desc.max_code = 0; + + // Initialize the mapping length (0..255) -> length code (0..28) + length = 0; + for (code = 0; code < zip_LENGTH_CODES - 1; code++) { + zip_base_length[code] = length; + for (n = 0; n < (1 << zip_extra_lbits[code]); n++) { + zip_length_code[length++] = code; + } + } + // Assert (length == 256, "ct_init: length != 256"); + + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + zip_length_code[length - 1] = code; + + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + zip_base_dist[code] = dist; + for (n = 0; n < (1 << zip_extra_dbits[code]); n++) { + zip_dist_code[dist++] = code; + } + } + // Assert (dist == 256, "ct_init: dist != 256"); + dist >>= 7; // from now on, all distances are divided by 128 + n = code; + for (code = n; code < zip_D_CODES; code++) { + zip_base_dist[code] = dist << 7; + for (n = 0; n < (1 << (zip_extra_dbits[code] - 7)); n++) { + zip_dist_code[256 + dist++] = code; + } + } + // Assert (dist == 256, "ct_init: 256+dist != 512"); + + // Construct the codes of the static literal tree + for (bits = 0; bits <= zip_MAX_BITS; bits++) { + zip_bl_count[bits] = 0; + } + n = 0; + while (n <= 143) { + zip_static_ltree[n++].dl = 8; + zip_bl_count[8]++; + } + while (n <= 255) { + zip_static_ltree[n++].dl = 9; + zip_bl_count[9]++; + } + while (n <= 279) { + zip_static_ltree[n++].dl = 7; + zip_bl_count[7]++; + } + while (n <= 287) { + zip_static_ltree[n++].dl = 8; + zip_bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + zip_gen_codes(zip_static_ltree, zip_L_CODES + 1); + + /* The static distance tree is trivial: */ + for (n = 0; n < zip_D_CODES; n++) { + zip_static_dtree[n].dl = 5; + zip_static_dtree[n].fc = zip_bi_reverse(n, 5); + } + + // Initialize the first block of the first file: + zip_init_block(); + }; + + + var zip_init_deflate = function () { + if (zip_eofile) { + return; + } + zip_bi_buf = 0; + zip_bi_valid = 0; + zip_ct_init(); + zip_lm_init(); + + zip_qhead = null; + zip_outcnt = 0; + zip_outoff = 0; + + if (zip_compr_level <= 3) { + zip_prev_length = zip_MIN_MATCH - 1; + zip_match_length = 0; + } else { + zip_match_length = zip_MIN_MATCH - 1; + zip_match_available = 0; + } + + zip_complete = false; + }; + + var zip_qcopy = function (buff, off, buff_size) { + var n, i, j; + + n = 0; + while (zip_qhead !== null && n < buff_size) { + i = buff_size - n; + if (i > zip_qhead.len) { + i = zip_qhead.len; + } + // System.arraycopy(qhead.ptr, qhead.off, buff, off + n, i); + for (j = 0; j < i; j++) { + buff[off + n + j] = zip_qhead.ptr[zip_qhead.off + j]; + } + + zip_qhead.off += i; + zip_qhead.len -= i; + n += i; + if (zip_qhead.len === 0) { + var p; + p = zip_qhead; + zip_qhead = zip_qhead.next; + zip_reuse_queue(p); + } + } + + if (n === buff_size) { + return n; + } + + if (zip_outoff < zip_outcnt) { + i = buff_size - n; + if (i > zip_outcnt - zip_outoff) { + i = zip_outcnt - zip_outoff; + } + // System.arraycopy(outbuf, outoff, buff, off + n, i); + for (j = 0; j < i; j++) { + buff[off + n + j] = zip_outbuf[zip_outoff + j]; + } + zip_outoff += i; + n += i; + if (zip_outcnt === zip_outoff) { + zip_outcnt = zip_outoff = 0; + } + } + return n; + }; + + /* ========================================================================== + * Same as above, but achieves better compression. We use a lazy + * evaluation for matches: a match is finally adopted only if there is + * no better match at the next window position. + */ + var zip_deflate_internal = function (buff, off, buff_size) { + var n; + + if (!zip_initflag) { + zip_init_deflate(); + zip_initflag = true; + if (zip_lookahead === 0) { // empty + zip_complete = true; + return 0; + } + } + + if ((n = zip_qcopy(buff, off, buff_size)) === buff_size) { + return buff_size; + } + + if (zip_complete) { + return n; + } + + if (zip_compr_level <= 3) { // optimized for speed + zip_deflate_fast(); + } else { + zip_deflate_better(); + } + if (zip_lookahead === 0) { + if (zip_match_available !== 0) { + zip_ct_tally(0, zip_window[zip_strstart - 1] & 0xff); + } + zip_flush_block(1); + zip_complete = true; + } + return n + zip_qcopy(buff, n + off, buff_size - n); + }; + + var zip_deflate = function (str, level) { + var i, j; + + zip_deflate_data = str; + zip_deflate_pos = 0; + if (typeof level === "undefined") { + level = zip_DEFAULT_LEVEL; + } + zip_deflate_start(level); + + var buff = new Array(1024); + var aout = []; + while ((i = zip_deflate_internal(buff, 0, buff.length)) > 0) { + var cbuf = []; + cbuf.length = i; + for (j = 0; j < i; j++) { + cbuf[j] = String.fromCharCode(buff[j]); + } + aout[aout.length] = cbuf.join(""); + } + zip_deflate_data = null; // G.C. + return aout.join(""); + }; + + this.deflate = zip_deflate; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/RawInflate.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/RawInflate.js new file mode 100644 index 0000000000..0005ea56ea --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/RawInflate.js @@ -0,0 +1,790 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core*/ +/* + * $Id: rawinflate.js,v 0.2 2009/03/01 18:32:24 dankogai Exp $ + * + * original: + * http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt + */ + +/** + * @constructor + */ +core.RawInflate = function RawInflate() { + +/* Copyright (C) 1999 Masanao Izumo + * Version: 1.0.0.1 + * LastModified: Dec 25 1999 + */ + +/* Interface: + * data = zip_inflate(src); + */ + +/* constant parameters */ +var zip_WSIZE = 32768; // Sliding Window size +var zip_STORED_BLOCK = 0; +var zip_STATIC_TREES = 1; +var zip_DYN_TREES = 2; + +/* for inflate */ +var zip_lbits = 9; // bits in base literal/length lookup table +var zip_dbits = 6; // bits in base distance lookup table +var zip_INBUFSIZ = 32768; // Input buffer size +var zip_INBUF_EXTRA = 64; // Extra buffer + +/* variables (inflate) */ +var zip_slide; +var zip_wp; // current position in slide +var zip_fixed_tl = null; // inflate static +var zip_fixed_td; // inflate static +var zip_fixed_bl, fixed_bd; // inflate static +var zip_bit_buf; // bit buffer +var zip_bit_len; // bits in bit buffer +var zip_method; +var zip_eof; +var zip_copy_leng; +var zip_copy_dist; +var zip_tl, zip_td; // literal/length and distance decoder tables +var zip_bl, zip_bd; // number of bits decoded by tl and td + +var zip_inflate_data; +var zip_inflate_pos; + + +/* constant tables (inflate) */ +var zip_MASK_BITS = new Array( + 0x0000, + 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff, + 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff); +// Tables for deflate from PKZIP's appnote.txt. +var zip_cplens = new Array( // Copy lengths for literal codes 257..285 + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0); +/* note: see note #13 above about the 258 in this list. */ +var zip_cplext = new Array( // Extra bits for literal codes 257..285 + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 99, 99); // 99==invalid +var zip_cpdist = new Array( // Copy offsets for distance codes 0..29 + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577); +var zip_cpdext = new Array( // Extra bits for distance codes + 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, + 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, + 12, 12, 13, 13); +var zip_border = new Array( // Order of the bit length code lengths + 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15); +/* objects (inflate) */ + +/** + * @constructor + */ +var zip_HuftList = function() { + this.next = null; + this.list = null; +} + +/** + * @constructor + */ +var zip_HuftNode = function() { + this.e = 0; // number of extra bits or operation + this.b = 0; // number of bits in this code or subcode + + // union + this.n = 0; // literal, length base, or distance base + this.t = null; // (zip_HuftNode) pointer to next level of table +} + +/** + * @constructor + */ +var zip_HuftBuild = function(b, // code lengths in bits (all assumed <= BMAX) + n, // number of codes (assumed <= N_MAX) + s, // number of simple-valued codes (0..s-1) + d, // list of base values for non-simple codes + e, // list of extra bits for non-simple codes + mm // maximum lookup bits + ) { + this.BMAX = 16; // maximum bit length of any code + this.N_MAX = 288; // maximum number of codes in any set + this.status = 0; // 0: success, 1: incomplete table, 2: bad input + this.root = null; // (zip_HuftList) starting table + this.m = 0; // maximum lookup bits, returns actual + +/* Given a list of code lengths and a maximum table size, make a set of + tables to decode that set of codes. Return zero on success, one if + the given code set is incomplete (the tables are still built in this + case), two if the input is invalid (all zero length codes or an + oversubscribed set of lengths), and three if not enough memory. + The code with value 256 is special, and the tables are constructed + so that no bits beyond that code are fetched when that code is + decoded. */ + { + var a; // counter for codes of length k + var c = new Array(this.BMAX+1); // bit length count table + var el; // length of EOB code (value 256) + var f; // i repeats in table every f entries + var g; // maximum code length + var h; // table level + var i; // counter, current code + var j; // counter + var k; // number of bits in current code + var lx = new Array(this.BMAX+1); // stack of bits per table + var p; // pointer into c[], b[], or v[] + var pidx; // index of p + var q; // (zip_HuftNode) points to current table + var r = new zip_HuftNode(); // table entry for structure assignment + var u = new Array(this.BMAX); // zip_HuftNode[BMAX][] table stack + var v = new Array(this.N_MAX); // values in order of bit length + var w; + var x = new Array(this.BMAX+1);// bit offsets, then code stack + var xp; // pointer into x or c + var y; // number of dummy codes added + var z; // number of entries in current table + var o; + var tail; // (zip_HuftList) + + tail = this.root = null; + for(i = 0; i < c.length; i++) + c[i] = 0; + for(i = 0; i < lx.length; i++) + lx[i] = 0; + for(i = 0; i < u.length; i++) + u[i] = null; + for(i = 0; i < v.length; i++) + v[i] = 0; + for(i = 0; i < x.length; i++) + x[i] = 0; + + // Generate counts for each bit length + el = n > 256 ? b[256] : this.BMAX; // set length of EOB code, if any + p = b; pidx = 0; + i = n; + do { + c[p[pidx]]++; // assume all entries <= BMAX + pidx++; + } while(--i > 0); + if(c[0] == n) { // null input--all zero length codes + this.root = null; + this.m = 0; + this.status = 0; + return; + } + + // Find minimum and maximum length, bound *m by those + for(j = 1; j <= this.BMAX; j++) + if(c[j] != 0) + break; + k = j; // minimum code length + if(mm < j) + mm = j; + for(i = this.BMAX; i != 0; i--) + if(c[i] != 0) + break; + g = i; // maximum code length + if(mm > i) + mm = i; + + // Adjust last length count to fill out codes, if needed + for(y = 1 << j; j < i; j++, y <<= 1) + if((y -= c[j]) < 0) { + this.status = 2; // bad input: more codes than bits + this.m = mm; + return; + } + if((y -= c[i]) < 0) { + this.status = 2; + this.m = mm; + return; + } + c[i] += y; + + // Generate starting offsets into the value table for each length + x[1] = j = 0; + p = c; + pidx = 1; + xp = 2; + while(--i > 0) // note that i == g from above + x[xp++] = (j += p[pidx++]); + + // Make a table of values in order of bit lengths + p = b; pidx = 0; + i = 0; + do { + if((j = p[pidx++]) != 0) + v[x[j]++] = i; + } while(++i < n); + n = x[g]; // set n to length of v + + // Generate the Huffman codes and for each, make the table entries + x[0] = i = 0; // first Huffman code is zero + p = v; pidx = 0; // grab values in bit order + h = -1; // no tables yet--level -1 + w = lx[0] = 0; // no bits decoded yet + q = null; // ditto + z = 0; // ditto + + // go through the bit lengths (k already is bits in shortest code) + for(; k <= g; k++) { + a = c[k]; + while(a-- > 0) { + // here i is the Huffman code of length k bits for value p[pidx] + // make tables up to required level + while(k > w + lx[1 + h]) { + w += lx[1 + h]; // add bits already decoded + h++; + + // compute minimum size table less than or equal to *m bits + z = (z = g - w) > mm ? mm : z; // upper limit + if((f = 1 << (j = k - w)) > a + 1) { // try a k-w bit table + // too few codes for k-w bit table + f -= a + 1; // deduct codes from patterns left + xp = k; + while(++j < z) { // try smaller tables up to z bits + if((f <<= 1) <= c[++xp]) + break; // enough codes to use up j bits + f -= c[xp]; // else deduct codes from patterns + } + } + if(w + j > el && w < el) + j = el - w; // make EOB code end at table + z = 1 << j; // table entries for j-bit table + lx[1 + h] = j; // set table size in stack + + // allocate and link in new table + q = new Array(z); + for(o = 0; o < z; o++) { + q[o] = new zip_HuftNode(); + } + + if(tail == null) + tail = this.root = new zip_HuftList(); + else + tail = tail.next = new zip_HuftList(); + tail.next = null; + tail.list = q; + u[h] = q; // table starts after link + + /* connect to last table, if there is one */ + if(h > 0) { + x[h] = i; // save pattern for backing up + r.b = lx[h]; // bits to dump before this table + r.e = 16 + j; // bits in this table + r.t = q; // pointer to this table + j = (i & ((1 << w) - 1)) >> (w - lx[h]); + u[h-1][j].e = r.e; + u[h-1][j].b = r.b; + u[h-1][j].n = r.n; + u[h-1][j].t = r.t; + } + } + + // set up table entry in r + r.b = k - w; + if(pidx >= n) + r.e = 99; // out of values--invalid code + else if(p[pidx] < s) { + r.e = (p[pidx] < 256 ? 16 : 15); // 256 is end-of-block code + r.n = p[pidx++]; // simple code is just the value + } else { + r.e = e[p[pidx] - s]; // non-simple--look up in lists + r.n = d[p[pidx++] - s]; + } + + // fill code-like entries with r // + f = 1 << (k - w); + for(j = i >> w; j < z; j += f) { + q[j].e = r.e; + q[j].b = r.b; + q[j].n = r.n; + q[j].t = r.t; + } + + // backwards increment the k-bit code i + for(j = 1 << (k - 1); (i & j) != 0; j >>= 1) + i ^= j; + i ^= j; + + // backup over finished tables + while((i & ((1 << w) - 1)) != x[h]) { + w -= lx[h]; // don't need to update q + h--; + } + } + } + + /* return actual size of base table */ + this.m = lx[1]; + + /* Return true (1) if we were given an incomplete table */ + this.status = ((y != 0 && g != 1) ? 1 : 0); + } /* end of constructor */ +} + + +/* routines (inflate) */ + +var zip_GET_BYTE = function() { + if(zip_inflate_data.length == zip_inflate_pos) + return -1; + return zip_inflate_data[zip_inflate_pos++]; +} + +var zip_NEEDBITS = function(n) { + while(zip_bit_len < n) { + zip_bit_buf |= zip_GET_BYTE() << zip_bit_len; + zip_bit_len += 8; + } +} + +var zip_GETBITS = function(n) { + return zip_bit_buf & zip_MASK_BITS[n]; +} + +var zip_DUMPBITS = function(n) { + zip_bit_buf >>= n; + zip_bit_len -= n; +} + +var zip_inflate_codes = function(buff, off, size) { + /* inflate (decompress) the codes in a deflated (compressed) block. + Return an error code or zero if it all goes ok. */ + var e; // table entry flag/number of extra bits + var t; // (zip_HuftNode) pointer to table entry + var n; + + if(size == 0) + return 0; + + // inflate the coded data + n = 0; + for(;;) { // do until end of block + zip_NEEDBITS(zip_bl); + t = zip_tl.list[zip_GETBITS(zip_bl)]; + e = t.e; + while(e > 16) { + if(e == 99) + return -1; + zip_DUMPBITS(t.b); + e -= 16; + zip_NEEDBITS(e); + t = t.t[zip_GETBITS(e)]; + e = t.e; + } + zip_DUMPBITS(t.b); + + if(e == 16) { // then it's a literal + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] = t.n; + if(n == size) + return size; + continue; + } + + // exit if end of block + if(e == 15) + break; + + // it's an EOB or a length + + // get length of block to copy + zip_NEEDBITS(e); + zip_copy_leng = t.n + zip_GETBITS(e); + zip_DUMPBITS(e); + + // decode distance of block to copy + zip_NEEDBITS(zip_bd); + t = zip_td.list[zip_GETBITS(zip_bd)]; + e = t.e; + + while(e > 16) { + if(e == 99) + return -1; + zip_DUMPBITS(t.b); + e -= 16; + zip_NEEDBITS(e); + t = t.t[zip_GETBITS(e)]; + e = t.e; + } + zip_DUMPBITS(t.b); + zip_NEEDBITS(e); + zip_copy_dist = zip_wp - t.n - zip_GETBITS(e); + zip_DUMPBITS(e); + + // do the copy + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_copy_dist &= zip_WSIZE - 1; + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] + = zip_slide[zip_copy_dist++]; + } + + if(n == size) + return size; + } + + zip_method = -1; // done + return n; +} + +var zip_inflate_stored = function(buff, off, size) { + /* "decompress" an inflated type 0 (stored) block. */ + var n; + + // go to byte boundary + n = zip_bit_len & 7; + zip_DUMPBITS(n); + + // get the length and its complement + zip_NEEDBITS(16); + n = zip_GETBITS(16); + zip_DUMPBITS(16); + zip_NEEDBITS(16); + if(n != ((~zip_bit_buf) & 0xffff)) + return -1; // error in compressed data + zip_DUMPBITS(16); + + // read and output the compressed data + zip_copy_leng = n; + + n = 0; + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_wp &= zip_WSIZE - 1; + zip_NEEDBITS(8); + buff[off + n++] = zip_slide[zip_wp++] = + zip_GETBITS(8); + zip_DUMPBITS(8); + } + + if(zip_copy_leng == 0) + zip_method = -1; // done + return n; +} + +var zip_fixed_bd; +var zip_inflate_fixed = function(buff, off, size) { + /* decompress an inflated type 1 (fixed Huffman codes) block. We should + either replace this with a custom decoder, or at least precompute the + Huffman tables. */ + + // if first time, set up tables for fixed blocks + if(zip_fixed_tl == null) { + var i; // temporary variable + var l = new Array(288); // length list for huft_build + var h; // zip_HuftBuild + + // literal table + for(i = 0; i < 144; i++) + l[i] = 8; + for(; i < 256; i++) + l[i] = 9; + for(; i < 280; i++) + l[i] = 7; + for(; i < 288; i++) // make a complete, but wrong code set + l[i] = 8; + zip_fixed_bl = 7; + + h = new zip_HuftBuild(l, 288, 257, zip_cplens, zip_cplext, + zip_fixed_bl); + if(h.status != 0) { + alert("HufBuild error: "+h.status); + return -1; + } + zip_fixed_tl = h.root; + zip_fixed_bl = h.m; + + // distance table + for(i = 0; i < 30; i++) // make an incomplete code set + l[i] = 5; + zip_fixed_bd = 5; + + h = new zip_HuftBuild(l, 30, 0, zip_cpdist, zip_cpdext, zip_fixed_bd); + if(h.status > 1) { + zip_fixed_tl = null; + alert("HufBuild error: "+h.status); + return -1; + } + zip_fixed_td = h.root; + zip_fixed_bd = h.m; + } + + zip_tl = zip_fixed_tl; + zip_td = zip_fixed_td; + zip_bl = zip_fixed_bl; + zip_bd = zip_fixed_bd; + return zip_inflate_codes(buff, off, size); +} + +var zip_inflate_dynamic = function(buff, off, size) { + // decompress an inflated type 2 (dynamic Huffman codes) block. + var i; // temporary variables + var j; + var l; // last length + var n; // number of lengths to get + var t; // (zip_HuftNode) literal/length code table + var nb; // number of bit length codes + var nl; // number of literal/length codes + var nd; // number of distance codes + var ll = new Array(286+30); // literal/length and distance code lengths + var h; // (zip_HuftBuild) + + for(i = 0; i < ll.length; i++) + ll[i] = 0; + + // read in table lengths + zip_NEEDBITS(5); + nl = 257 + zip_GETBITS(5); // number of literal/length codes + zip_DUMPBITS(5); + zip_NEEDBITS(5); + nd = 1 + zip_GETBITS(5); // number of distance codes + zip_DUMPBITS(5); + zip_NEEDBITS(4); + nb = 4 + zip_GETBITS(4); // number of bit length codes + zip_DUMPBITS(4); + if(nl > 286 || nd > 30) + return -1; // bad lengths + + // read in bit-length-code lengths + for(j = 0; j < nb; j++) + { + zip_NEEDBITS(3); + ll[zip_border[j]] = zip_GETBITS(3); + zip_DUMPBITS(3); + } + for(; j < 19; j++) + ll[zip_border[j]] = 0; + + // build decoding table for trees--single level, 7 bit lookup + zip_bl = 7; + h = new zip_HuftBuild(ll, 19, 19, null, null, zip_bl); + if(h.status != 0) + return -1; // incomplete code set + + zip_tl = h.root; + zip_bl = h.m; + + // read in literal and distance code lengths + n = nl + nd; + i = l = 0; + while(i < n) { + zip_NEEDBITS(zip_bl); + t = zip_tl.list[zip_GETBITS(zip_bl)]; + j = t.b; + zip_DUMPBITS(j); + j = t.n; + if(j < 16) // length of code in bits (0..15) + ll[i++] = l = j; // save last length in l + else if(j == 16) { // repeat last length 3 to 6 times + zip_NEEDBITS(2); + j = 3 + zip_GETBITS(2); + zip_DUMPBITS(2); + if(i + j > n) + return -1; + while(j-- > 0) + ll[i++] = l; + } else if(j == 17) { // 3 to 10 zero length codes + zip_NEEDBITS(3); + j = 3 + zip_GETBITS(3); + zip_DUMPBITS(3); + if(i + j > n) + return -1; + while(j-- > 0) + ll[i++] = 0; + l = 0; + } else { // j == 18: 11 to 138 zero length codes + zip_NEEDBITS(7); + j = 11 + zip_GETBITS(7); + zip_DUMPBITS(7); + if(i + j > n) + return -1; + while(j-- > 0) + ll[i++] = 0; + l = 0; + } + } + + // build the decoding tables for literal/length and distance codes + zip_bl = zip_lbits; + h = new zip_HuftBuild(ll, nl, 257, zip_cplens, zip_cplext, zip_bl); + if(zip_bl == 0) // no literals or lengths + h.status = 1; + if(h.status != 0) { + //if(h.status == 1) + // ;// **incomplete literal tree** + return -1; // incomplete code set + } + zip_tl = h.root; + zip_bl = h.m; + + for(i = 0; i < nd; i++) + ll[i] = ll[i + nl]; + zip_bd = zip_dbits; + h = new zip_HuftBuild(ll, nd, 0, zip_cpdist, zip_cpdext, zip_bd); + zip_td = h.root; + zip_bd = h.m; + + if(zip_bd == 0 && nl > 257) { // lengths but no distances + // **incomplete distance tree** + return -1; + } + + //if(h.status == 1) { +// ;// **incomplete distance tree** + //} + if(h.status != 0) + return -1; + + // decompress until an end-of-block code + return zip_inflate_codes(buff, off, size); +} + +var zip_inflate_start = function() { + var i; + + if(zip_slide == null) + zip_slide = new Array(2 * zip_WSIZE); + zip_wp = 0; + zip_bit_buf = 0; + zip_bit_len = 0; + zip_method = -1; + zip_eof = false; + zip_copy_leng = zip_copy_dist = 0; + zip_tl = null; +} + +var zip_inflate_internal = function(buff, off, size) { + // decompress an inflated entry + var n, i; + + n = 0; + while(n < size) { + if(zip_eof && zip_method == -1) + return n; + + if(zip_copy_leng > 0) { + if(zip_method != zip_STORED_BLOCK) { + // STATIC_TREES or DYN_TREES + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_copy_dist &= zip_WSIZE - 1; + zip_wp &= zip_WSIZE - 1; + buff[off + n++] = zip_slide[zip_wp++] = + zip_slide[zip_copy_dist++]; + } + } else { + while(zip_copy_leng > 0 && n < size) { + zip_copy_leng--; + zip_wp &= zip_WSIZE - 1; + zip_NEEDBITS(8); + buff[off + n++] = zip_slide[zip_wp++] = zip_GETBITS(8); + zip_DUMPBITS(8); + } + if(zip_copy_leng == 0) + zip_method = -1; // done + } + if(n == size) + return n; + } + + if(zip_method == -1) { + if(zip_eof) + break; + + // read in last block bit + zip_NEEDBITS(1); + if(zip_GETBITS(1) != 0) + zip_eof = true; + zip_DUMPBITS(1); + + // read in block type + zip_NEEDBITS(2); + zip_method = zip_GETBITS(2); + zip_DUMPBITS(2); + zip_tl = null; + zip_copy_leng = 0; + } + + switch(zip_method) { + case 0: // zip_STORED_BLOCK + i = zip_inflate_stored(buff, off + n, size - n); + break; + + case 1: // zip_STATIC_TREES + if(zip_tl != null) + i = zip_inflate_codes(buff, off + n, size - n); + else + i = zip_inflate_fixed(buff, off + n, size - n); + break; + + case 2: // zip_DYN_TREES + if(zip_tl != null) + i = zip_inflate_codes(buff, off + n, size - n); + else + i = zip_inflate_dynamic(buff, off + n, size - n); + break; + + default: // error + i = -1; + break; + } + + if(i == -1) { + if(zip_eof) + return 0; + return -1; + } + n += i; + } + return n; +} + +var zip_inflate = function(data, size) { + var i, j; + + zip_inflate_start(); + zip_inflate_data = data; + zip_inflate_pos = 0; + + var buff = new runtime.ByteArray(size); + zip_inflate_internal(buff, 0, size); + zip_inflate_data = null; // G.C. + return buff; +} + +this.inflate = zip_inflate; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/UnitTester.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/UnitTester.js new file mode 100644 index 0000000000..4dbe1fa2c0 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/UnitTester.js @@ -0,0 +1,255 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, Runtime: true, core: true*/ +/*jslint evil: true*/ +/** + * @interface + */ +core.UnitTest = function UnitTest() {"use strict";}; +/** + * @return {undefined} + */ +core.UnitTest.prototype.setUp = function () {"use strict";}; +/** + * @return {undefined} + */ +core.UnitTest.prototype.tearDown = function () {"use strict";}; +/** + * @return {!string} + */ +core.UnitTest.prototype.description = function () {"use strict";}; +/** + * @return {Array.} + */ +core.UnitTest.prototype.tests = function () {"use strict";}; +/** + * @return {Array.} + */ +core.UnitTest.prototype.asyncTests = function () {"use strict";}; + +/** + * @constructor + */ +core.UnitTestRunner = function UnitTestRunner() { + "use strict"; + var failedTests = 0; + function debug(msg) { + runtime.log(msg); + } + function testFailed(msg) { + failedTests += 1; + runtime.log("fail", msg); + } + function testPassed(msg) { + runtime.log("pass", msg); + } + function areArraysEqual(a, b) { + var i; + try { + if (a.length !== b.length) { + return false; + } + for (i = 0; i < a.length; i += 1) { + if (a[i] !== b[i]) { + return false; + } + } + } catch (ex) { + return false; + } + return true; + } + function isResultCorrect(actual, expected) { + if (expected === 0) { + return actual === expected && (1 / actual) === (1 / expected); + } + if (actual === expected) { + return true; + } + if (typeof expected === "number" && isNaN(expected)) { + return typeof actual === "number" && isNaN(actual); + } + if (Object.prototype.toString.call(expected) === + Object.prototype.toString.call([])) { + return areArraysEqual(actual, expected); + } + return false; + } + function stringify(v) { + if (v === 0 && 1 / v < 0) { + return "-0"; + } + return String(v); + } + /** + * @param {!Object} t + * @param {!string} a + * @param {!string} b + * @return {undefined} + */ + function shouldBe(t, a, b) { + if (typeof a !== "string" || typeof b !== "string") { + debug("WARN: shouldBe() expects string arguments"); + } + var exception, av, bv; + try { + av = eval(a); + } catch (e) { + exception = e; + } + bv = eval(b); + + if (exception) { + testFailed(a + " should be " + bv + ". Threw exception " + + exception); + } else if (isResultCorrect(av, bv)) { + testPassed(a + " is " + b); + } else if (typeof av === typeof bv) { + testFailed(a + " should be " + bv + ". Was " + stringify(av) + "."); + } else { + testFailed(a + " should be " + bv + " (of type " + typeof bv + + "). Was " + av + " (of type " + typeof av + ")."); + } + } + /** + * @param {!Object} t context in which values to be tested are placed + * @param {!string} a the value to be checked + * @return {undefined} + */ + function shouldBeNonNull(t, a) { + var exception, av; + try { + av = eval(a); + } catch (e) { + exception = e; + } + + if (exception) { + testFailed(a + " should be non-null. Threw exception " + exception); + } else if (av !== null) { + testPassed(a + " is non-null."); + } else { + testFailed(a + " should be non-null. Was " + av); + } + } + /** + * @param {!Object} t context in which values to be tested are placed + * @param {!string} a the value to be checked + * @return {undefined} + */ + function shouldBeNull(t, a) { + shouldBe(t, a, "null"); + } + this.shouldBeNull = shouldBeNull; + this.shouldBeNonNull = shouldBeNonNull; + this.shouldBe = shouldBe; + this.countFailedTests = function () { + return failedTests; + }; +}; + +/** + * @constructor + */ +core.UnitTester = function UnitTester() { + "use strict"; + var failedTests = 0, + results = {}; + /** + * @param {Function} TestClass the constructor for the test class + * @param {!function():undefined} callback + * @return {undefined} + */ + this.runTests = function (TestClass, callback) { + var testName = Runtime.getFunctionName(TestClass), + tname, + runner = new core.UnitTestRunner(), + test = new TestClass(runner), + testResults = {}, + i, + t, + tests, + lastFailCount; + + // check that this test has not been run or started yet + if (testName.hasOwnProperty(results)) { + runtime.log("Test " + testName + " has already run."); + return; + } + + runtime.log("Running " + testName + ": " + test.description()); + tests = test.tests(); + for (i = 0; i < tests.length; i += 1) { + t = tests[i]; + tname = Runtime.getFunctionName(t); + runtime.log("Running " + tname); + lastFailCount = runner.countFailedTests(); + test.setUp(); + t(); + test.tearDown(); + testResults[tname] = lastFailCount === runner.countFailedTests(); + } + function runAsyncTests(todo) { + if (todo.length === 0) { + results[testName] = testResults; + failedTests += runner.countFailedTests(); + callback(); + return; + } + t = todo[0]; + var tname = Runtime.getFunctionName(t); + runtime.log("Running " + tname); + lastFailCount = runner.countFailedTests(); + test.setUp(); + t(function () { + test.tearDown(); + testResults[tname] = lastFailCount === + runner.countFailedTests(); + runAsyncTests(todo.slice(1)); + }); + } + runAsyncTests(test.asyncTests()); + }; + /** + * @return {!number} + **/ + this.countFailedTests = function () { + return failedTests; + }; + /** + * @return {!Object} + **/ + this.results = function () { + return results; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/Zip.js b/apps/files_odfviewer/src/webodf/webodf/lib/core/Zip.js new file mode 100644 index 0000000000..66f508ee39 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/Zip.js @@ -0,0 +1,600 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime, core, DOMParser*/ +/*jslint bitwise: true*/ +/* +* @preserve +* WebODF +* Copyright (c) 2010 Jos van den Oever +* Licensed under the ... License: +* +* Project home: http://www.webodf.org/ +*/ + +runtime.loadClass("core.RawInflate"); +runtime.loadClass("core.ByteArray"); +runtime.loadClass("core.ByteArrayWriter"); +runtime.loadClass("core.Base64"); + +/** + * @constructor + * @param {!string} url path to zip file, should be readable by the runtime + * @param {?function(?string, !core.Zip):undefined} entriesReadCallback callback + * indicating the zip + * has loaded this list of entries, the arguments are a string that + * indicates error if present and the created object + */ +core.Zip = function Zip(url, entriesReadCallback) { + "use strict"; + var /**@type{Array.}*/ entries, + /**@type{number}*/ filesize, + /**@type{number}*/ nEntries, + /**@type{Function}*/ inflate = new core.RawInflate().inflate, + /**@type{!core.Zip}*/ zip = this, + base64 = new core.Base64(); + + /** + * @param {!Runtime.ByteArray} data + * @return {!number} + */ + function crc32(data) { + // Calculate the crc32 polynomial of a string + // + // version: 1009.2513 + // discuss at: http:\/\/phpjs.org\/functions\/crc32 + // + original by: Webtoolkit.info (http:\/\/www.webtoolkit.info\/) + // + improved by: T0bsn + // - depends on: utf8_encode + // * example 1: crc32('Kevin van Zonneveld'); + // * returns 1: 1249991249 + var /**@const@type{!Array.}*/table = [0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D], + /**@type{!number}*/ crc = 0, + /**@type{!number}*/ i, + /**@const@type{!number}*/ iTop = data.length, + /**@type{!number}*/ x = 0, + /**@type{!number}*/ y = 0; + crc = crc ^ (-1); + for (i = 0; i < iTop; i += 1) { + y = (crc ^ data[i]) & 0xFF; + x = table[y]; + crc = (crc >>> 8) ^ x; + } + return crc ^ (-1); + } + + /** + * @param {!number} dostime + * @return {!Date} + */ + function dosTime2Date(dostime) { + var /**@const@type{!number}*/ year = ((dostime >> 25) & 0x7f) + 1980, + /**@const@type{!number}*/ month = ((dostime >> 21) & 0x0f) - 1, + /**@const@type{!number}*/ mday = (dostime >> 16) & 0x1f, + /**@const@type{!number}*/ hour = (dostime >> 11) & 0x0f, + /**@const@type{!number}*/ min = (dostime >> 5) & 0x3f, + /**@const@type{!number}*/ sec = (dostime & 0x1f) << 1, + /**@const@type{!Date}*/ d + = new Date(year, month, mday, hour, min, sec); + return d; + } + /** + * @param {!Date} date + * @return {!number} + */ + function date2DosTime(date) { + var /**@const@type{!number}*/ y = date.getFullYear(); + return y < 1980 ? 0 : + ((y - 1980) << 25) | ((date.getMonth() + 1) << 21) | + (date.getDate() << 16) | (date.getHours() << 11) | + (date.getMinutes() << 5) | (date.getSeconds() >> 1); + } + /** + * Create a new ZipEntry. + * If the stream is not provided, the object should be initialized + * with ZipEntry.set() + * @constructor + * @param {!string} url + * @param {!core.ByteArray=} stream + */ + function ZipEntry(url, stream) { + var /**@const@type{!number}*/ sig, + /**@const@type{!number}*/ namelen, + /**@const@type{!number}*/ extralen, + /**@const@type{!number}*/ commentlen, + /**@const@type{!number}*/ compressionMethod, + /**@const@type{!number}*/ compressedSize, + /**@const@type{!number}*/ uncompressedSize, + /**@const@type{!number}*/ offset, + /**@const@type{!number}*/ crc, + /**@const@type{!ZipEntry}*/ entry = this; + + /** + * @param {!Runtime.ByteArray} data + * @param {!function(?string, ?Runtime.ByteArray)} callback + * @return {undefined} + */ + function handleEntryData(data, callback) { + var /**@const@type{!core.ByteArray}*/ stream + = new core.ByteArray(data), + /**@const@type{!number}*/ sig = stream.readUInt32LE(), + /**@const@type{!number}*/ filenamelen, + /**@const@type{!number}*/ extralen; + if (sig !== 0x04034b50) { + callback('File entry signature is wrong.' + sig.toString() + + ' ' + data.length.toString(), null); + return; + } + stream.pos += 22; + filenamelen = stream.readUInt16LE(); + extralen = stream.readUInt16LE(); + stream.pos += filenamelen + extralen; + if (compressionMethod) { + data = data.slice(stream.pos, stream.pos + compressedSize); + if (compressedSize !== data.length) { + callback("The amount of compressed bytes read was " + + data.length.toString() + " instead of " + + compressedSize.toString() + " for " + entry.filename + + " in " + url + ".", null); + return; + } + data = inflate(data, uncompressedSize); + } else { + data = data.slice(stream.pos, stream.pos + uncompressedSize); + } + if (uncompressedSize !== data.length) { + callback("The amount of bytes read was " + + data.length.toString() + + " instead of " + uncompressedSize.toString() + " for " + + entry.filename + " in " + url + ".", null); + return; + } +/* + * This check is disabled for performance reasons + if (crc !== crc32(data)) { + runtime.log("Warning: CRC32 for " + entry.filename + + " is wrong."); + } +*/ + entry.data = data; + callback(null, data); + } + /** + * @param {!function(?string, ?Runtime.ByteArray)} callback + * @return {undefined} + */ + function load(callback) { + // if data has already been downloaded, use that + if (entry.data !== undefined) { + callback(null, entry.data); + return; + } + // the 256 at the end is security for when local extra field is + // larger + var /**@type{!number}*/ size + = compressedSize + 34 + namelen + extralen + 256; + if (size + offset > filesize) { + size = filesize - offset; + } + runtime.read(url, offset, size, function (err, data) { + if (err) { + callback(err, data); + } else { + handleEntryData(data, callback); + } + }); + } + this.load = load; + /** + * @param {!string} filename + * @param {!Runtime.ByteArray} data + * @param {!boolean} compressed + * @param {!Date} date + * @return {undefined} + */ + function set(filename, data, compressed, date) { + entry.filename = filename; + entry.data = data; + entry.compressed = compressed; + entry.date = date; + } + this.set = set; + /** + * @type {?string} + */ + this.error = null; + + if (!stream) { + return; + } + sig = stream.readUInt32LE(); + + if (sig !== 0x02014b50) { + this.error = + "Central directory entry has wrong signature at position " + + (stream.pos - 4).toString() + ' for file "' + url + '": ' + + stream.data.length.toString(); + return; + } + // stream should be positioned at the start of the CDS entry for the + // file + stream.pos += 6; + compressionMethod = stream.readUInt16LE(); + this.date = dosTime2Date(stream.readUInt32LE()); + crc = stream.readUInt32LE(); + compressedSize = stream.readUInt32LE(); + uncompressedSize = stream.readUInt32LE(); + namelen = stream.readUInt16LE(); + extralen = stream.readUInt16LE(); + commentlen = stream.readUInt16LE(); + stream.pos += 8; + offset = stream.readUInt32LE(); + this.filename = runtime.byteArrayToString( + stream.data.slice(stream.pos, stream.pos + namelen), "utf8"); + stream.pos += namelen + extralen + commentlen; + } + /** + * @param {!Runtime.ByteArray} data + * @param {!function(?string, !core.Zip)} callback + * @return {undefined} + */ + function handleCentralDirectory(data, callback) { + // parse the central directory + var stream = new core.ByteArray(data), i, e; + entries = []; + for (i = 0; i < nEntries; i += 1) { + e = new ZipEntry(url, stream); + if (e.error) { + callback(e.error, zip); + return; + } + entries[entries.length] = e; + } + // report that entries are listed and no error occured + callback(null, zip); + } + /** + * @param {!Runtime.ByteArray} data + * @param {!function(?string, !core.Zip)} callback + * @return {undefined} + */ + function handleCentralDirectoryEnd(data, callback) { + if (data.length !== 22) { + callback("Central directory length should be 22.", zip); + return; + } + var stream = new core.ByteArray(data), sig, disk, cddisk, diskNEntries, + cdsSize, cdsOffset; + sig = stream.readUInt32LE(); + if (sig !== 0x06054b50) { + callback('Central directory signature is wrong: ' + sig.toString(), + zip); + return; + } + disk = stream.readUInt16LE(); + if (disk !== 0) { + callback('Zip files with non-zero disk numbers are not supported.', + zip); + return; + } + cddisk = stream.readUInt16LE(); + if (cddisk !== 0) { + callback('Zip files with non-zero disk numbers are not supported.', + zip); + return; + } + diskNEntries = stream.readUInt16LE(); + nEntries = stream.readUInt16LE(); + if (diskNEntries !== nEntries) { + callback('Number of entries is inconsistent.', zip); + return; + } + cdsSize = stream.readUInt32LE(); + cdsOffset = stream.readUInt16LE(); + cdsOffset = filesize - 22 - cdsSize; + + // for some reason cdsOffset is not always equal to offset calculated + // from the central directory size. The latter is reliable. + runtime.read(url, cdsOffset, filesize - cdsOffset, + function (err, data) { + handleCentralDirectory(data, callback); + }); + } + /** + * @param {!string} filename + * @param {!function(?string, ?Runtime.ByteArray)} callback receiving err and data + * @return {undefined} + */ + function load(filename, callback) { + var entry = null, + end = filesize, + e, + i; + for (i = 0; i < entries.length; i += 1) { + e = entries[i]; + if (e.filename === filename) { + entry = e; + break; + } + } + if (entry) { + if (entry.data) { + callback(null, entry.data); + } else { + entry.load(callback); + } + } else { + callback(filename + " not found.", null); + } + } + /** + * @param {!string} filename + * @param {!function(?string, ?string)} callback receiving err and data + * @return {undefined} + */ + function loadAsString(filename, callback) { + // the javascript implementation simply reads the file and converts to + // string + load(filename, function (err, data) { + if (err) { + return callback(err, null); + } + data = runtime.byteArrayToString(data, "utf8"); + callback(null, data); + }); + } + /** + * @param {!string} filename + * @param {!Object} handler + * @return {undefined} + */ + function loadContentXmlAsFragments(filename, handler) { + // the javascript implementation simply reads the file + loadAsString(filename, function (err, data) { + if (err) { + return handler.rootElementReady(err); + } + handler.rootElementReady(null, data, true); + }); + } + function loadAsDataURL(filename, mimetype, callback) { + load(filename, function (err, data) { + if (err) { + return callback(err, null); + } + var /**@const@type{!Runtime.ByteArray}*/p = data, + chunksize = 45000, // must be multiple of 3 and less than 50000 + i = 0, + url; + if (!mimetype) { + if (p[1] === 0x50 && p[2] === 0x4E && p[3] === 0x47) { + mimetype = "image/png"; + } else if (p[0] === 0xFF && p[1] === 0xD8 && p[2] === 0xFF) { + mimetype = "image/jpeg"; + } else if (p[0] === 0x47 && p[1] === 0x49 && p[2] === 0x46) { + mimetype = "image/gif"; + } else { + mimetype = ""; + } + } + url = 'data:' + mimetype + ';base64,'; + // to avoid exceptions, base64 encoding is done in chunks + // it would make sense to move this to base64.toBase64 + while (i < data.length) { + url += base64.convertUTF8ArrayToBase64( + p.slice(i, Math.min(i + chunksize, p.length)) + ); + i += chunksize; + } + callback(null, url); + }); + } + function loadAsDOM(filename, callback) { + loadAsString(filename, function (err, xmldata) { + if (err) { + callback(err, null); + return; + } + var parser = new DOMParser(); + xmldata = parser.parseFromString(xmldata, "text/xml"); + callback(null, xmldata); + }); + } + /** + * Add or replace an entry to the zip file. + * This data is not stored to disk yet, and therefore, no callback is + * necessary. + * @param {!string} filename + * @param {!Runtime.ByteArray} data + * @param {!boolean} compressed + * @param {!Date} date + * @return {undefined} + */ + function save(filename, data, compressed, date) { + var i, + entry; + for (i = 0; i < entries.length; i += 1) { + entry = entries[i]; + if (entry.filename === filename) { + entry.set(filename, data, compressed, date); + return; + } + } + entry = new ZipEntry(url); + entry.set(filename, data, compressed, date); + entries.push(entry); + } + /** + * @param {!ZipEntry} entry + * @return {!core.ByteArrayWriter} + */ + function writeEntry(entry) { + // each entry is currently stored uncompressed + var data = new core.ByteArrayWriter("utf8"), + length = 0; + data.appendArray([0x50, 0x4B, 0x03, 0x04, 0x14, 0, 0, 0, 0, 0]); + if (entry.data) { + length = entry.data.length; + } + data.appendUInt32LE(date2DosTime(entry.date)); + data.appendUInt32LE(crc32(entry.data)); + data.appendUInt32LE(length); // compressedSize + data.appendUInt32LE(length); // uncompressedSize + data.appendUInt16LE(entry.filename.length); // namelen + data.appendUInt16LE(0); // extralen + data.appendString(entry.filename); + if (entry.data) { + data.appendByteArray(entry.data); + } + return data; + } + /** + * @param {!ZipEntry} entry + * @param {!number} offset + * @return {!core.ByteArrayWriter} + */ + function writeCODEntry(entry, offset) { + // each entry is currently stored uncompressed + var data = new core.ByteArrayWriter("utf8"), + length = 0; + data.appendArray([0x50, 0x4B, 0x01, 0x02, 0x14, 0x00, 0x14, 0x00, + 0, 0, 0, 0]); + if (entry.data) { + length = entry.data.length; + } + data.appendUInt32LE(date2DosTime(entry.date)); + data.appendUInt32LE(crc32(entry.data)); + data.appendUInt32LE(length); // compressedSize + data.appendUInt32LE(length); // uncompressedSize + data.appendUInt16LE(entry.filename.length); // namelen + // extralen, commalen, diskno, file attributes + data.appendArray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + data.appendUInt32LE(offset); + data.appendString(entry.filename); + return data; + } + /** + * @param {!number} position + * @param {!function(?string):undefined} callback + * @return {undefined} + */ + function loadAllEntries(position, callback) { + if (position === entries.length) { + callback(null); + return; + } + var entry = entries[position]; + if (entry.data !== undefined) { + loadAllEntries(position + 1, callback); + return; + } + entry.load(function (err) { + if (err) { + callback(err); + return; + } + loadAllEntries(position + 1, callback); + }); + } + /** + * Write the zipfile to the given path. + * @param {!function(?string):undefined} callback receiving possible err + * @return {undefined} + */ + function write(callback) { + // make sure all data is in memory, for each entry that has data + // undefined, try to load the entry + loadAllEntries(0, function (err) { + if (err) { + callback(err); + return; + } + var data = new core.ByteArrayWriter("utf8"), + i, e, codoffset, codsize, + offsets = [0]; + // write entries + for (i = 0; i < entries.length; i += 1) { + data.appendByteArrayWriter(writeEntry(entries[i])); + offsets.push(data.getLength()); + } + // write central directory + codoffset = data.getLength(); + for (i = 0; i < entries.length; i += 1) { + e = entries[i]; + data.appendByteArrayWriter(writeCODEntry(e, offsets[i])); + } + codsize = data.getLength() - codoffset; + data.appendArray([0x50, 0x4B, 0x05, 0x06, 0, 0, 0, 0]); + data.appendUInt16LE(entries.length); + data.appendUInt16LE(entries.length); + data.appendUInt32LE(codsize); + data.appendUInt32LE(codoffset); + data.appendArray([0, 0]); + runtime.writeFile(url, data.getByteArray(), callback); + }); + } + + this.load = load; + this.save = save; + this.write = write; + // a special function that makes faster odf loading possible + this.loadContentXmlAsFragments = loadContentXmlAsFragments; + this.loadAsString = loadAsString; + this.loadAsDOM = loadAsDOM; + this.loadAsDataURL = loadAsDataURL; + this.getEntries = function () { + return entries.slice(); + }; + + // determine the file size + filesize = -1; + // if no callback is defined, this is a new file + if (entriesReadCallback === null) { + entries = []; + return; + } + runtime.getFileSize(url, function (size) { + filesize = size; + if (filesize < 0) { + entriesReadCallback("File '" + url + "' cannot be read.", zip); + } else { + runtime.read(url, filesize - 22, 22, function (err, data) { + // todo: refactor entire zip class + if (err || entriesReadCallback === null) { + entriesReadCallback(err, zip); + } else { + handleCentralDirectoryEnd(data, entriesReadCallback); + } + }); + } + }); +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/core/dummyxmlmodel.js_ b/apps/files_odfviewer/src/webodf/webodf/lib/core/dummyxmlmodel.js_ new file mode 100644 index 0000000000..c14ec84411 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/core/dummyxmlmodel.js_ @@ -0,0 +1,21 @@ +/*global exports require*/ +function createDummyXMLModel() { + var that = {}; + + function preserveWhitespace(node) { + return true; + } + + // return an array with child qnames or null for inserting text. + // the dummy implementation allows text everywhere, but no new elements + // "*" means all elements are allowed + // ["#PCDATA", "*"] means any element and text is allowed + function getAllowedChildren(node, position) { + return [null]; + } + + that.getAllowedChildren = getAllowedChildren; + that.preserveWhitespace = preserveWhitespace; + return that; +} +exports.createDummyXMLModel = createDummyXMLModel; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/export.js b/apps/files_odfviewer/src/webodf/webodf/lib/export.js new file mode 100644 index 0000000000..08982cd424 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/export.js @@ -0,0 +1,39 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global window runtime odf*/ +/*jslint sub: true*/ + +window["runtime"] = runtime; +runtime["loadClass"] = runtime.loadClass; +window["odf"] = odf; +window["odf"]["OdfCanvas"] = odf.OdfCanvas; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/Caret.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/Caret.js new file mode 100644 index 0000000000..744b8b022a --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/gui/Caret.js @@ -0,0 +1,65 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global gui*/ +/** + * Class that represents a caret in a document. In text nodes, a native caret is + * used via the HTML attribute contentEditable. Outside of text nodes, an empty + * element representing the caret is used. + * @constructor + */ +gui.Caret = function Caret(selection, rootNode) { + "use strict"; + var document = rootNode.ownerDocument, + cursorns, + cursorNode; + cursorns = 'urn:webodf:names:cursor'; + cursorNode = document.createElementNS(cursorns, 'cursor'); + /** + * Synchronize the cursor with the current selection. + * If there is a single collapsed selection range, the cursor will be placed + * there. If not, the cursor will be removed from the document tree. + * @return {undefined} + */ + this.updateToSelection = function () { + var range; +// removeCursor(); + if (selection.rangeCount === 1) { + range = selection.getRangeAt(0); +/* + if (range.collapsed) { + putCursor(range.startContainer, range.startOffset); + } +*/ + } + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/PresenterUI.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/PresenterUI.js new file mode 100644 index 0000000000..c6553cc3af --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/gui/PresenterUI.js @@ -0,0 +1,246 @@ +/** + * Copyright (C) 2011 KO GmbH - Tobias Hintze + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ + +/*global runtime, gui, odf, core, xmldom, document, window*/ +runtime.loadClass("xmldom.XPath"); +runtime.loadClass("odf.Style2CSS"); + +gui.PresenterUI = (function () { + "use strict"; + var s2css = new odf.Style2CSS(), + xpath = new xmldom.XPath(), + nsResolver = s2css.namespaceResolver; + + return function PresenterUI(odf_element) { + var self = this; + + self.setInitialSlideMode = function () { + self.startSlideMode('single'); + }; + + self.keyDownHandler = function (ev) { + if (ev.target.isContentEditable) { return; } + if (ev.target.nodeName === 'input') { return; } + switch (ev.keyCode) { + case 84: // t - hide/show toolbar + self.toggleToolbar(); + break; + case 37: // left + case 8: // left + self.prevSlide(); + break; + case 39: // right + case 32: // space + self.nextSlide(); + break; + case 36: // pos1 + self.firstSlide(); + break; + case 35: // end + self.lastSlide(); + break; + } + }; + + self.root = function () { return self.odf_canvas.odfContainer().rootElement; }; + + self.firstSlide = function () { self.slideChange(function (old, pc) { return 0; }); }; + self.lastSlide = function () { self.slideChange(function (old, pc) { return pc - 1; }); }; + + self.nextSlide = function () { + self.slideChange(function (old, pc) { return old + 1 < pc ? old + 1 : -1; }); + }; + self.prevSlide = function () { + self.slideChange(function (old, pc) { return old < 1 ? -1 : old - 1; }); + }; + // indexChanger gets (idx,pagecount) as parameter and returns the new index + self.slideChange = function (indexChanger) { + var pages = self.getPages(self.odf_canvas.odfContainer().rootElement), + last = -1, + i = 0, + newidx, + pagelist; + pages.forEach(function (tuple) { + var name = tuple[0], + node = tuple[1]; + if (node.hasAttribute('slide_current')) { + last = i; + node.removeAttribute('slide_current'); + } + i += 1; + }); + newidx = indexChanger(last, pages.length); + if (newidx === -1) { newidx = last; } + pages[newidx][1].setAttribute('slide_current', '1'); + pagelist = document.getElementById('pagelist'); + pagelist.selectedIndex = newidx; + // FIXME this needs to become a sane callback/listener mechanism + // (and the mode probably a class/instance..) + if (self.slide_mode === 'cont') { + window.scrollBy(0, pages[newidx][1].getBoundingClientRect().top - 30); + } + }; + + self.selectSlide = function (idx) { + self.slideChange(function (old, pc) { + if (idx >= pc) { return -1; } + if (idx < 0) { return -1; } + return idx; + }); + }; + + // make one specific slide visible in cont-mode + self.scrollIntoContView = function (idx) { + var pages = self.getPages(self.odf_canvas.odfContainer().rootElement); + if (pages.length === 0) { return; } + /* + if (false) { + // works in chrome + pages[idx][1].scrollIntoView(); + } else { + */ + // works in ff + window.scrollBy(0, pages[idx][1].getBoundingClientRect().top - 30); + /*}*/ + }; + + // return a list of tuples (pagename, pagenode) + self.getPages = function (root) { + var pagenodes = root.getElementsByTagNameNS(nsResolver('draw'), 'page'), + pages = [], + i; + for (i = 0; i < pagenodes.length; i += 1) { + pages.push([ + pagenodes[i].getAttribute('draw:name'), + pagenodes[i] + ]); + } + return pages; + }; + + // fill a html-select with options, one option per page in odf (odp) + self.fillPageList = function (odfdom_root, html_select) { + var pages = self.getPages(odfdom_root), + i, + html_option, + res, + page_denom; + + // empty the pagelist + while (html_select.firstChild) { + html_select.removeChild(html_select.firstChild); + } + + // populate it + for (i = 0; i < pages.length; i += 1) { + html_option = document.createElement('option'); + res = xpath.getODFElementsWithXPath(pages[i][1], + './draw:frame[@presentation:class="title"]//draw:text-box/text:p', + xmldom.XPath); + page_denom = (res.length > 0) ? res[0].textContent : pages[i][0]; + html_option.textContent = (i + 1) + ": " + page_denom; + html_select.appendChild(html_option); + } + }; + + self.startSlideMode = function (mode) { + var pagelist = document.getElementById('pagelist'), + css = self.odf_canvas.slidevisibilitycss().sheet; + self.slide_mode = mode; + while (css.cssRules.length > 0) { css.deleteRule(0); } + // start on slide 0 + self.selectSlide(0); + if (self.slide_mode === 'single') { + css.insertRule("draw|page { position:fixed; left:0px;top:30px; z-index:1; }", 0); + css.insertRule("draw|page[slide_current] { z-index:2;}", 1); + css.insertRule("draw|page { -webkit-transform: scale(1);}", 2); + self.fitToWindow(); + window.addEventListener('resize', self.fitToWindow, false); + + } else if (self.slide_mode === 'cont') { + window.removeEventListener('resize', self.fitToWindow, false); + } + + self.fillPageList(self.odf_canvas.odfContainer().rootElement, pagelist); + }; + + // toggle (show/hide) toolbar + self.toggleToolbar = function () { + var css, found, i; + css = self.odf_canvas.slidevisibilitycss().sheet; + found = -1; + for (i = 0; i < css.cssRules.length; i += 1) { + if (css.cssRules[i].cssText.substring(0, 8) === ".toolbar") { + found = i; + break; + } + } + if (found > -1) { + css.deleteRule(found); + } else { + css.insertRule(".toolbar { position:fixed; left:0px;top:-200px; z-index:0; }", 0); + } + }; + + // adapt css-transform to window-size + self.fitToWindow = function () { + function ruleByFactor(f) { + return "draw|page { \n" + + "-moz-transform: scale(" + f + "); \n" + + "-moz-transform-origin: 0% 0%; " + + "-webkit-transform-origin: 0% 0%; -webkit-transform: scale(" + f + "); " + + "-o-transform-origin: 0% 0%; -o-transform: scale(" + f + "); " + + "-ms-transform-origin: 0% 0%; -ms-transform: scale(" + f + "); " + + "}"; + } + var pages = self.getPages(self.root()), + factorVert = ((window.innerHeight - 40) / pages[0][1].clientHeight), + factorHoriz = ((window.innerWidth - 10) / pages[0][1].clientWidth), + factor = factorVert < factorHoriz ? factorVert : factorHoriz, + css = self.odf_canvas.slidevisibilitycss().sheet; + css.deleteRule(2); + css.insertRule(ruleByFactor(factor), 2); + }; + + self.load = function (url) { + self.odf_canvas.load(url); + }; + + self.odf_element = odf_element; + self.odf_canvas = new odf.OdfCanvas(self.odf_element); + self.odf_canvas.addListener("statereadychange", self.setInitialSlideMode); + self.slide_mode = 'undefined'; + document.addEventListener('keydown', self.keyDownHandler, false); + }; +}()); + diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/SelectionMover.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/SelectionMover.js new file mode 100644 index 0000000000..2356c2c8c0 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/gui/SelectionMover.js @@ -0,0 +1,217 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, gui: true*/ +runtime.loadClass("core.Cursor"); +/** + * This class modifies the selection in different ways. + * @constructor + * @param {Selection} selection + * @param {!core.PointWalker} pointWalker + * @return {!gui.SelectionMover} + */ +gui.SelectionMover = function SelectionMover(selection, pointWalker) { + "use strict"; + var doc = pointWalker.node().ownerDocument, + cursor = new core.Cursor(selection, doc); + /** + * Return the last range in the selection. Create one if the selection is + * empty. + */ + function getActiveRange(node) { + var range; + if (selection.rangeCount === 0) { + selection.addRange(node.ownerDocument.createRange()); + } + return selection.getRangeAt(selection.rangeCount - 1); + } + function setStart(node, offset) { + // selection interface is cumbersome and in Chrome it is buggy + // as a workaround all ranges are removed. The last one is updated and + // all ranges are placed back + var ranges = [], i, range; + for (i = 0; i < selection.rangeCount; i += 1) { + ranges[i] = selection.getRangeAt(i); + } + selection.removeAllRanges(); + if (ranges.length === 0) { + ranges[0] = node.ownerDocument.createRange(); + } + ranges[ranges.length - 1].setStart(pointWalker.node(), + pointWalker.position()); + for (i = 0; i < ranges.length; i += 1) { + selection.addRange(ranges[i]); + } + } + function doMove(extend, move) { + if (selection.rangeCount === 0) { + return; + } + var range = selection.getRangeAt(0), + /**@type{Element}*/ element; + if (!range.startContainer || range.startContainer.nodeType !== 1) { + return; + } + element = /**@type{!Element}*/(range.startContainer); + pointWalker.setPoint(element, range.startOffset); + move(); + setStart(pointWalker.node(), pointWalker.position()); + } + function doMoveForward(extend, move) { + if (selection.rangeCount === 0) { + return; + } + move(); + var range = selection.getRangeAt(0), + /**@type{Element}*/ element; + if (!range.startContainer || range.startContainer.nodeType !== 1) { + return; + } + element = /**@type{!Element}*/(range.startContainer); + pointWalker.setPoint(element, range.startOffset); + } +/* + function fallbackMoveLineUp() { + // put an element at the current position and call + // pointWalker.stepForward until the y position increases and x position + // is comparable to the previous one + cursor.updateToSelection(); + // retrieve cursor x and y position, then move selection/cursor left + // until, y offset is less and x offset about equal + var rect = cursor.getNode().getBoundingClientRect(), + x = rect.left, + y = rect.top, + arrived = false, + allowedSteps = 200; + while (!arrived && allowedSteps) { + allowedSteps -= 1; + cursor.remove(); + pointWalker.setPoint(selection.focusNode, selection.focusOffset); + pointWalker.stepForward(); + moveCursor(walker.node(), walker.position()); + moveCursorLeft(); + rect = cursor.getNode().getBoundingClientRect(); + arrived = rect.top !== y && rect.left < x; + } + } +*/ + function moveCursor(node, offset, selectMode) { + if (selectMode) { + selection.extend(node, offset); + } else { + selection.collapse(node, offset); + } + cursor.updateToSelection(); + } + function moveCursorLeft() { + var /**@type{Element}*/ element; + if (!selection.focusNode || selection.focusNode.nodeType !== 1) { + return; + } + element = /**@type{!Element}*/(selection.focusNode); + pointWalker.setPoint(element, selection.focusOffset); + pointWalker.stepBackward(); + moveCursor(pointWalker.node(), pointWalker.position(), false); + } + function moveCursorRight() { + cursor.remove(); + var /**@type{Element}*/ element; + if (!selection.focusNode || selection.focusNode.nodeType !== 1) { + return; + } + element = /**@type{!Element}*/(selection.focusNode); + pointWalker.setPoint(element, selection.focusOffset); + pointWalker.stepForward(); + moveCursor(pointWalker.node(), pointWalker.position(), false); + } + function moveCursorUp() { + // retrieve cursor x and y position, then move selection/cursor left + // until, y offset is less and x offset about equal + var rect = cursor.getNode().getBoundingClientRect(), + x = rect.left, + y = rect.top, + arrived = false, + left = 200; + while (!arrived && left) { + left -= 1; + moveCursorLeft(); + rect = cursor.getNode().getBoundingClientRect(); + arrived = rect.top !== y && rect.left < x; + } + } + function moveCursorDown() { + // retrieve cursor x and y position, then move selection/cursor right + // until, x offset is less + cursor.updateToSelection(); + var rect = cursor.getNode().getBoundingClientRect(), + x = rect.left, + y = rect.top, + arrived = false, + left = 200; + while (!arrived) { + left -= 1; + moveCursorRight(); + rect = cursor.getNode().getBoundingClientRect(); + arrived = rect.top !== y && rect.left > x; + } +//alert(left + " " + y + " " + x + " " + rect.top + " " + rect.left); + } + /** + * Move selection forward one point. + * @param {boolean} extend true if range is to be expanded from the current + * point + * @return {undefined} + **/ + this.movePointForward = function (extend) { + doMove(extend, pointWalker.stepForward); + }; + this.movePointBackward = function (extend) { + doMove(extend, pointWalker.stepBackward); + }; + this.moveLineForward = function (extend) { + if (selection.modify) { + // TODO add a way to + selection.modify(extend ? "extend" : "move", "forward", "line"); + } else { + doMove(extend, moveCursorDown); + } + }; + this.moveLineBackward = function (extend) { + if (selection.modify) { + selection.modify(extend ? "extend" : "move", "backward", "line"); + } else { + doMove(extend, function () { + }); + } + }; + return this; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/gui/XMLEdit.js b/apps/files_odfviewer/src/webodf/webodf/lib/gui/XMLEdit.js new file mode 100644 index 0000000000..aee0bd5e7d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/gui/XMLEdit.js @@ -0,0 +1,330 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, gui: true*/ +runtime.loadClass("core.PointWalker"); +runtime.loadClass("core.Cursor"); +//runtime.loadClass("gui.Caret"); +/** + * @constructor + */ +gui.XMLEdit = function XMLEdit(element, stylesheet) { + "use strict"; + var simplecss, + cssprefix, + documentElement, + customNS = "customns", + walker = null; + + if (!element.id) { + element.id = "xml" + String(Math.random()).substring(2); + } +// element.contentEditable = true; + cssprefix = "#" + element.id + " "; + + function installHandlers() { + } + + // generic css for doing xml formatting: color tags and do indentation + simplecss = cssprefix + "*," + cssprefix + ":visited, " + cssprefix + ":link {display:block; margin: 0px; margin-left: 10px; font-size: medium; color: black; background: white; font-variant: normal; font-weight: normal; font-style: normal; font-family: sans-serif; text-decoration: none; white-space: pre-wrap; height: auto; width: auto}\n" + + cssprefix + ":before {color: blue; content: '<' attr(customns_name) attr(customns_atts) '>';}\n" + + cssprefix + ":after {color: blue; content: '';}\n" + + cssprefix + "{overflow: auto;}\n"; + + function listenEvent(eventTarget, eventType, eventHandler) { + if (eventTarget.addEventListener) { + eventTarget.addEventListener(eventType, eventHandler, false); + } else if (eventTarget.attachEvent) { + eventType = "on" + eventType; + eventTarget.attachEvent(eventType, eventHandler); + } else { + eventTarget["on" + eventType] = eventHandler; + } + } + function cancelEvent(event) { + if (event.preventDefault) { + event.preventDefault(); + } else { + event.returnValue = false; + } + } + + function isCaretMoveCommand(charCode) { + if (charCode >= 16 && charCode <= 20) { + return true; + } + if (charCode >= 33 && charCode <= 40) { //arrows,home,end,pgup,pgdown + return true; + } + return false; + } + + function syncSelectionWithWalker() { + var sel = element.ownerDocument.defaultView.getSelection(), + r; + if (!sel || sel.rangeCount <= 0 || !walker) { + return; + } + r = sel.getRangeAt(0); + walker.setPoint(r.startContainer, r.startOffset); + } + + function syncWalkerWithSelection() { + var sel = element.ownerDocument.defaultView.getSelection(), + n, r; + sel.removeAllRanges(); + if (!walker || !walker.node()) { + return; + } + n = walker.node(); + r = n.ownerDocument.createRange(); + r.setStart(n, walker.position()); + r.collapse(true); + sel.addRange(r); + } + + function handleKeyDown(event) { + var charCode = event.charCode || event.keyCode; + // cursor movement + walker = null; + if (walker && charCode === 39) { // right arrow + syncSelectionWithWalker(); + walker.stepForward(); + syncWalkerWithSelection(); + } else if (walker && charCode === 37) { //left arrow + syncSelectionWithWalker(); + walker.stepBackward(); + syncWalkerWithSelection(); + } else if (isCaretMoveCommand(charCode)) { + return; + } + cancelEvent(event); + } + + function handleKeyPress(event) { +// handleKeyDown(event); + } + + function handleClick(event) { +// alert(event.target.nodeName); + var sel = element.ownerDocument.defaultView.getSelection(), + r = sel.getRangeAt(0), + n = r.startContainer; + // if cursor is in customns node, move up to the top one + /* + if (n.parentNode.namespaceURI === customNS) { + while (n.parentNode.namespaceURI === customNS) { + n = n.parentNode; + } + r = n.ownerDocument.createRange(); + r.setStart(n.nextSibling, 0); + r.collapse(true); + sel.removeAllRanges(); + sel.addRange(r); + } +*/ +/* + r = element.ownerDocument.createRange(); + r.setStart(event.target.nodeName, 0); + r.collapse(true); + sel.removeAllRanges(); + sel.addRange(r); +*/ +//alert(sel.getRangeAt(0).startContainer.nodeName + " " + sel.getRangeAt(0).startOffset); + + cancelEvent(event); + } + + function initElement(element) { + listenEvent(element, "click", handleClick); + listenEvent(element, "keydown", handleKeyDown); + listenEvent(element, "keypress", handleKeyPress); + //listenEvent(element, "mouseup", handleMouseUp); + // ignore drop events, dragstart, drag, dragenter, dragover are ok for now + listenEvent(element, "drop", cancelEvent); + listenEvent(element, "dragend", cancelEvent); + // pasting is also disallowed for now + listenEvent(element, "beforepaste", cancelEvent); + listenEvent(element, "paste", cancelEvent); + } + + // remove all textnodes that contain only whitespace + function cleanWhitespace(node) { + var n = node.firstChild, p, + re = /^\s*$/; + while (n && n !== node) { + p = n; + n = n.nextSibling || n.parentNode; + if (p.nodeType === 3 && re.test(p.nodeValue)) { + p.parentNode.removeChild(p); + } + } + } + /** + * @param {!Node} node + * @return {undefined} + */ + function setCssHelperAttributes(node) { + var atts, attsv, a, i; + // write all attributes in a string that is shown via the css + atts = node.attributes; + attsv = ""; + for (i = atts.length - 1; i >= 0; i -= 1) { + a = atts.item(i); + attsv = attsv + " " + a.nodeName + "=\"" + a.nodeValue + "\""; + } + node.setAttribute("customns_name", node.nodeName); + node.setAttribute("customns_atts", attsv); + } + /** + * @param {!Node} node + * @return {undefined} + */ + function addExplicitAttributes(node) { + var n = node.firstChild; + // recurse over the dom + while (n && n !== node) { + if (n.nodeType === 1) { + addExplicitAttributes(n); + } + n = n.nextSibling || n.parentNode; + } + setCssHelperAttributes(node); + cleanWhitespace(node); + } + + function getNamespacePrefixes(node, prefixes) { + var n = node.firstChild, atts, att, i; + while (n && n !== node) { + if (n.nodeType === 1) { + getNamespacePrefixes(n, prefixes); + atts = n.attributes; + for (i = atts.length - 1; i >= 0; i -= 1) { + att = atts.item(i); + // record the prefix that the document uses for namespaces + if (att.namespaceURI === "http://www.w3.org/2000/xmlns/") { + if (!prefixes[att.nodeValue]) { + prefixes[att.nodeValue] = att.localName; + } + } + } + } + n = n.nextSibling || n.parentNode; + } + } + + /** + * Give each namespace a unique prefix. + * @param {Object.} prefixes Map with namespace as key and + * prefix as value + * @return {undefined} + */ + function generateUniquePrefixes(prefixes) { + var taken = {}, + ns, p, n = 0; + for (ns in prefixes) { + if (prefixes.hasOwnProperty(ns) && ns) { + p = prefixes[ns]; + if (!p || taken.hasOwnProperty(p) || p === "xmlns") { + do { + p = "ns" + n; + n += 1; + } while (taken.hasOwnProperty(p)); + prefixes[ns] = p; + } + taken[p] = true; + } + } + } + + // the CSS neededed for the XML edit view depends on the prefixes + function createCssFromXmlInstance(node) { + // collect all prefixes and elements + var prefixes = {}, // namespace prefixes as they occur in the XML + css = "@namespace customns url(customns);\n", + name, pre, ns, names, csssel; + getNamespacePrefixes(node, prefixes); + generateUniquePrefixes(prefixes); +/* + for (ns in prefixes) { + if (ns) { + css = css + "@namepace " + prefixes[ns] + " url(" + ns + ");\n"; + } + } + for (ns in prefixes) { + if (ns) { + pre = cssprefix + prefixes[ns] + "|"; + css = css + pre + ":before { content: '<" + prefixes[ns] + + ":' attr(customns_name); }\n" + + pre + ":after { content: ''; }\n"; + } + } +*/ + return css; + } + + // Adapt the CSS to the current settings. + function updateCSS() { + var css = element.ownerDocument.createElement("style"), + text = createCssFromXmlInstance(element); + css.type = "text/css"; + text = text + simplecss; + css.appendChild(element.ownerDocument.createTextNode(text)); + stylesheet = stylesheet.parentNode.replaceChild(css, stylesheet); + } + function getXML() { + return documentElement; + } + function setXML(xml) { + var node = xml.documentElement || xml; + node = element.ownerDocument.importNode(node, true); + documentElement = node; + + addExplicitAttributes(node); + + while (element.lastChild) { + element.removeChild(element.lastChild); + } + element.appendChild(node); + + updateCSS(); + + walker = new core.PointWalker(node); + } + + initElement(element); + + this.updateCSS = updateCSS; + this.setXML = setXML; + this.getXML = getXML; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/manifest.js b/apps/files_odfviewer/src/webodf/webodf/lib/manifest.js new file mode 100644 index 0000000000..1a185b85b9 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/manifest.js @@ -0,0 +1,34 @@ +(function () { + "use strict"; + return [ + "core/Async.js", + "core/Base64.js", + "core/ByteArray.js", + "core/ByteArrayWriter.js", + "core/Cursor.js", + "core/JSLint.js", + "core/PointWalker.js", + "core/RawDeflate.js", + "core/RawInflate.js", + "core/UnitTester.js", + "core/Zip.js", + "gui/Caret.js", + "gui/SelectionMover.js", + "gui/XMLEdit.js", + "gui/PresenterUI.js", + "odf/FontLoader.js", + "odf/Formatting.js", + "odf/OdfCanvas.js", + "odf/OdfContainer.js", + "odf/Style2CSS.js", + "odf/StyleInfo.js", + "xmldom/LSSerializer.js", + "xmldom/LSSerializerFilter.js", + "xmldom/OperationalTransformDOM.js", + "xmldom/OperationalTransformInterface.js", + "xmldom/RelaxNG.js", + "xmldom/RelaxNG2.js", + "xmldom/RelaxNGParser.js", + "xmldom/XPath.js" + ]; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/FontLoader.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/FontLoader.js new file mode 100644 index 0000000000..f6d51f666a --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/odf/FontLoader.js @@ -0,0 +1,135 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*jslint sub: true*/ +/*global runtime, odf, core, document, xmldom*/ +runtime.loadClass("core.Base64"); +runtime.loadClass("xmldom.XPath"); +runtime.loadClass("odf.Style2CSS"); +/** + * This class loads embedded fonts into the CSS + * @constructor + **/ +odf.FontLoader = (function () { + "use strict"; + var style2CSS = new odf.Style2CSS(), + xpath = new xmldom.XPath(), + base64 = new core.Base64(); + /** + * @param {!Element} fontFaceDecls + * @return {!Object.} + */ + function getEmbeddedFontDeclarations(fontFaceDecls) { + var decls = {}, + fonts, + i, font, name, uris, href; + if (!fontFaceDecls) { + return decls; + } + fonts = xpath.getODFElementsWithXPath(fontFaceDecls, + "style:font-face[svg:font-face-src]", + style2CSS.namespaceResolver); + for (i = 0; i < fonts.length; i += 1) { + font = fonts[i]; + name = font.getAttributeNS(style2CSS.namespaces["style"], "name"); + uris = xpath.getODFElementsWithXPath(font, + "svg:font-face-src/svg:font-face-uri", + style2CSS.namespaceResolver); + if (uris.length > 0) { + href = uris[0].getAttributeNS(style2CSS.namespaces["xlink"], + "href"); + decls[name] = {href: href}; + } + } + return decls; + } + function addFontToCSS(name, font, fontdata, stylesheet) { + // hack: get the first stylesheet + stylesheet = document.styleSheets[0]; + var rule = "@font-face { font-family: \"" + name + "\"; src: " + + "url(data:application/x-font-ttf;charset=binary;base64," + + base64.convertUTF8ArrayToBase64(fontdata) + + ") format(\"truetype\"); }"; + try { + stylesheet.insertRule(rule, stylesheet.cssRules.length); + } catch (e) { + runtime.log("Problem inserting rule in CSS: " + rule); + } + } + function loadFontIntoCSS(embeddedFontDeclarations, zip, pos, stylesheet, + callback) { + var name, i = 0, n; + for (n in embeddedFontDeclarations) { + if (embeddedFontDeclarations.hasOwnProperty(n)) { + if (i === pos) { + name = n; + } + i += 1; + } + } + if (!name) { + return callback(); + } + zip.load(embeddedFontDeclarations[name].href, function (err, fontdata) { + if (err) { + runtime.log(err); + } else { + addFontToCSS(name, embeddedFontDeclarations[name], fontdata, + stylesheet); + } + return loadFontIntoCSS(embeddedFontDeclarations, zip, pos + 1, + stylesheet, callback); + }); + } + function loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet) { + loadFontIntoCSS(embeddedFontDeclarations, zip, 0, stylesheet, + function () {}); + } + /** + * @constructor + */ + odf.FontLoader = function FontLoader() { + var self = this; + /** + * @param {!Element} fontFaceDecls + * @param {!core.Zip} zip + * @param {!StyleSheet} stylesheet + * @return {undefined} + */ + this.loadFonts = function (fontFaceDecls, zip, stylesheet) { + var embeddedFontDeclarations = getEmbeddedFontDeclarations( + fontFaceDecls); + loadFontsIntoCSS(embeddedFontDeclarations, zip, stylesheet); + }; + }; + return odf.FontLoader; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/Formatting.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/Formatting.js new file mode 100644 index 0000000000..cf42fcc50a --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/odf/Formatting.js @@ -0,0 +1,153 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global odf: true, runtime: true*/ +/** + * @constructor + */ +odf.Formatting = function Formatting() { + "use strict"; + var /**@type{odf.OdfContainer}*/ odfContainer, + /**@type{odf.StyleInfo}*/ styleInfo = new odf.StyleInfo(); + + /** + * Class that iterates over all elements that are part of the range. + * @constructor + * @param {!Range} range + * @return {undefined} + */ + function RangeElementIterator(range) { + /** + * @param {Node} parent + * @param {!number} n + * @return {Node} + */ + function getNthChild(parent, n) { + var c = parent && parent.firstChild; + while (c && n) { + c = c.nextSibling; + n -= 1; + } + return c; + } + var start = getNthChild(range.startContainer, range.startOffset), + end = getNthChild(range.endContainer, range.endOffset), + current = start; + /** + * @return {Element|null} + */ + this.next = function () { + var c = current; + if (c === null) { + return c; + } + return null; + }; + } + + /** + * @param {!Element} element + * @return {Element} + */ + function getParentStyle(element) { + var n = element.firstChild, e; + if (n.nodeType === 1) { // Element + e = /**@type{Element}*/(n); + return e; + } + return null; + } + /** + * @param {!Range} range + * @return {!Array.} + */ + function getParagraphStyles(range) { + var iter = new RangeElementIterator(range), e, styles = []; + e = iter.next(); + while (e) { + if (styleInfo.canElementHaveStyle("paragraph", e)) { + styles.push(e); + } + } + return styles; + } + + /** + * @param {!odf.OdfContainer} odfcontainer + * @return {undefined} + */ + this.setOdfContainer = function (odfcontainer) { + odfContainer = odfcontainer; + }; + /** + * Return true if all parts of the selection are bold. + * @param {!Array.} selection + * @return {!boolean} + */ + this.isCompletelyBold = function (selection) { + return false; + }; + /** + * Get the alignment or undefined if no uniform alignment is found + * @param {!Array.} selection + * @return {!string|undefined} + */ + this.getAlignment = function (selection) { + var styles = this.getParagraphStyles(selection), i, l = styles.length; + return undefined; + }; + /** + * Get the list of paragraph styles that covered by the current selection. + * @param {!Array.} selection + * @return {!Array.} + */ + this.getParagraphStyles = function (selection) { + var i, j, s, styles = []; + for (i = 0; i < selection.length; i += 0) { + s = getParagraphStyles(selection[i]); + for (j = 0; j < s.length; j += 1) { + if (styles.indexOf(s[j]) === -1) { + styles.push(s[j]); + } + } + } + return styles; + }; + /** + * Get the list of text styles that are covered by the current selection. + * @param {!Array.} selection + * @return {!Array.} + */ + this.getTextStyles = function (selection) { + return []; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfCanvas.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfCanvas.js new file mode 100644 index 0000000000..b8077f8093 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfCanvas.js @@ -0,0 +1,912 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*jslint sub: true*/ +/*global runtime, odf, xmldom */ +runtime.loadClass("odf.OdfContainer"); +runtime.loadClass("odf.Formatting"); +runtime.loadClass("xmldom.XPath"); +/** + * This class manages a loaded ODF document that is shown in an element. + * It takes care of giving visual feedback on loading, ensures that the + * stylesheets are loaded. + * @constructor + * @param {!Element} element Put and ODF Canvas inside this element. + **/ +odf.OdfCanvas = (function () { + "use strict"; + /** + * A loading queue where various tasks related to loading can be placed + * and will be run with 10 ms between them. This gives the ui a change to + * to update. + * @constructor + */ + function LoadingQueue() { + var queue = [], + taskRunning = false; + /** + * @param {Function} task + * @return {undefined} + */ + function run(task) { + taskRunning = true; + runtime.setTimeout(function () { + try { + task(); + } catch (e) { + runtime.log(e); + } + taskRunning = false; + if (queue.length > 0) { + run(queue.pop()); + } + }, 10); + } + /** + * @return {undefined} + */ + this.clearQueue = function () { + queue.length = 0; + }; + /** + * @param {Function} loadingTask + * @return {undefined} + */ + this.addToQueue = function (loadingTask) { + if (queue.length === 0 && !taskRunning) { + return run(loadingTask); + } + queue.push(loadingTask); + }; + } + /** + * @constructor + * @param css + */ + function PageSwitcher(css) { + var sheet = css.sheet, + position = 1; + function updateCSS() { + while (sheet.cssRules.length > 0) { + sheet.deleteRule(0); + } + sheet.insertRule('office|presentation draw|page {display:none;}', 0); + sheet.insertRule("office|presentation draw|page:nth-child(" + + position + ") {display:block;}", 1); + } + /** + * @return {undefined} + */ + this.showNextPage = function () { + position += 1; + updateCSS(); + }; + /** + * @return {undefined} + */ + this.showPreviousPage = function () { + if (position > 1) { + position -= 1; + updateCSS(); + } + }; + this.css = css; + } + /** + * Register event listener on DOM element. + * @param {!Element} eventTarget + * @param {!string} eventType + * @param {!Function} eventHandler + * @return {undefined} + */ + function listenEvent(eventTarget, eventType, eventHandler) { + if (eventTarget.addEventListener) { + eventTarget.addEventListener(eventType, eventHandler, false); + } else if (eventTarget.attachEvent) { + eventType = "on" + eventType; + eventTarget.attachEvent(eventType, eventHandler); + } else { + eventTarget["on" + eventType] = eventHandler; + } + } + /** + * Class that listens to events and sends a signal if the selection changes. + * @constructor + * @param {!Element} element + */ + function SelectionWatcher(element) { + var selection = [], count = 0, listeners = []; + /** + * @param {!Element} ancestor + * @param {Node} descendant + * @return {!boolean} + */ + function isAncestorOf(ancestor, descendant) { + while (descendant) { + if (descendant === ancestor) { + return true; + } + descendant = descendant.parentNode; + } + return false; + } + /** + * @param {!Element} element + * @param {!Range} range + * @return {!boolean} + */ + function fallsWithin(element, range) { + return isAncestorOf(element, range.startContainer) && + isAncestorOf(element, range.endContainer); + } + /** + * @return {!Array.} + */ + function getCurrentSelection() { + var s = [], selection = runtime.getWindow().getSelection(), i, r; + for (i = 0; i < selection.rangeCount; i += 1) { + r = selection.getRangeAt(i); + // check if the nodes in the range fall completely within the + // element + if (r !== null && fallsWithin(element, r)) { + s.push(r); + } + } + return s; + } + /** + * @param {Range} rangeA + * @param {Range} rangeB + * @return {!boolean} + */ + function rangesNotEqual(rangeA, rangeB) { + if (rangeA === rangeB) { + return false; + } + if (rangeA === null || rangeB === null) { + return true; + } + return rangeA.startContainer !== rangeB.startContainer || + rangeA.startOffset !== rangeB.startOffset || + rangeA.endContainer !== rangeB.endContainer || + rangeA.endOffset !== rangeB.endOffset; + } + /** + * @return {undefined} + */ + function emitNewSelection() { + var i, l = listeners.length; + for (i = 0; i < l; i += 1) { + listeners[i](element, selection); + } + } + /** + * @param {!Array.} selection + * @return {!Array.} + */ + function copySelection(selection) { + var s = [selection.length], i, oldr, r, + doc = element.ownerDocument; + for (i = 0; i < selection.length; i += 1) { + oldr = selection[i]; + r = doc.createRange(); + r.setStart(oldr.startContainer, oldr.startOffset); + r.setEnd(oldr.endContainer, oldr.endOffset); + s[i] = r; + } + return s; + } + /** + * @return {undefined} + */ + function checkSelection() { + var s = getCurrentSelection(), i; + if (s.length === selection.length) { + for (i = 0; i < s.length; i += 1) { + if (rangesNotEqual(s[i], selection[i])) { + break; + } + } + if (i === s.length) { + return; // no change + } + } + selection = s; + selection = copySelection(s); + emitNewSelection(); + } + /** + * @param {!string} eventName + * @param {!function(!Element, !Array.)} handler + * @return {undefined} + */ + this.addListener = function (eventName, handler) { + var i, l = listeners.length; + for (i = 0; i < l; i += 1) { + if (listeners[i] === handler) { + return; + } + } + listeners.push(handler); + }; + listenEvent(element, "mouseup", checkSelection); + listenEvent(element, "keyup", checkSelection); + listenEvent(element, "keydown", checkSelection); + } + var style2CSS = new odf.Style2CSS(), + namespaces = style2CSS.namespaces, + drawns = namespaces.draw, + fons = namespaces.fo, + officens = namespaces.office, + svgns = namespaces.svg, + textns = namespaces.text, + xlinkns = namespaces.xlink, + window = runtime.getWindow(), + xpath = new xmldom.XPath(), + /**@const@type{!Object.>}*/ + eventHandlers = {}, + editparagraph, + loadingQueue = new LoadingQueue(); + + /** + * Register an event handler + * @param {!string} eventType + * @param {!Function} eventHandler + * @return {undefined} + */ + function addEventListener(eventType, eventHandler) { + var handlers = eventHandlers[eventType]; + if (handlers === undefined) { + handlers = eventHandlers[eventType] = []; + } + if (eventHandler && handlers.indexOf(eventHandler) === -1) { + handlers.push(eventHandler); + } + } + /** + * Fire an event + * @param {!string} eventType + * @param {Array.=} args + * @return {undefined} + */ + function fireEvent(eventType, args) { + if (!eventHandlers.hasOwnProperty(eventType)) { + return; + } + var handlers = eventHandlers[eventType], i; + for (i = 0; i < handlers.length; i += 1) { + handlers[i](args); + } + } + /** + * @param {!Element} element + * @return {undefined} + */ + function clear(element) { + while (element.firstChild) { + element.removeChild(element.firstChild); + } + } + /** + * A new styles.xml has been loaded. Update the live document with it. + * @param {!Element} odfelement + * @param {!HTMLStyleElement} stylesxmlcss + * @return {undefined} + **/ + function handleStyles(odfelement, stylesxmlcss) { + // update the css translation of the styles + var style2css = new odf.Style2CSS(); + style2css.style2css(stylesxmlcss.sheet, odfelement.styles, + odfelement.automaticStyles); + } + /** + * @param {!string} id + * @param {!Element} frame + * @param {!StyleSheet} stylesheet + * @return {undefined} + **/ + function setFramePosition(id, frame, stylesheet) { + frame.setAttribute('styleid', id); + var rule, + anchor = frame.getAttributeNS(textns, 'anchor-type'), + x = frame.getAttributeNS(svgns, 'x'), + y = frame.getAttributeNS(svgns, 'y'), + width = frame.getAttributeNS(svgns, 'width'), + height = frame.getAttributeNS(svgns, 'height'), + minheight = frame.getAttributeNS(fons, 'min-height'), + minwidth = frame.getAttributeNS(fons, 'min-width'); + if (anchor === "as-char") { + rule = 'display: inline-block;'; + } else if (anchor || x || y) { + rule = 'position: absolute;'; + } else if (width || height || minheight || minwidth) { + rule = 'display: block;'; + } + if (x) { + rule += 'left: ' + x + ';'; + } + if (y) { + rule += 'top: ' + y + ';'; + } + if (width) { + rule += 'width: ' + width + ';'; + } + if (height) { + rule += 'height: ' + height + ';'; + } + if (minheight) { + rule += 'min-height: ' + minheight + ';'; + } + if (minwidth) { + rule += 'min-width: ' + minwidth + ';'; + } + if (rule) { + rule = 'draw|' + frame.localName + '[styleid="' + id + '"] {' + + rule + '}'; + stylesheet.insertRule(rule, stylesheet.cssRules.length); + } + } + /** + * @param {!Element} image + * @return {string} + **/ + function getUrlFromBinaryDataElement(image) { + var node = image.firstChild; + while (node) { + if (node.namespaceURI === officens && + node.localName === "binary-data") { + // TODO: detect mime-type, assuming png for now + return "data:image/png;base64," + node.textContent; + } + node = node.nextSibling; + } + return ""; + } + /** + * @param {!string} id + * @param {!Object} container + * @param {!Element} image + * @param {!StyleSheet} stylesheet + * @return {undefined} + **/ + function setImage(id, container, image, stylesheet) { + image.setAttribute('styleid', id); + var url = image.getAttributeNS(xlinkns, 'href'), + part, + node; + function callback(url) { + var rule = "background-image: url(" + url + ");"; + rule = 'draw|image[styleid="' + id + '"] {' + rule + '}'; + stylesheet.insertRule(rule, stylesheet.cssRules.length); + } + // look for a office:binary-data + if (url) { + try { + if (container.getPartUrl) { + url = container.getPartUrl(url); + callback(url); + } else { + part = container.getPart(url); + part.onchange = function (part) { + callback(part.url); + }; + part.load(); + } + } catch (e) { + runtime.log('slight problem: ' + e); + } + } else { + url = getUrlFromBinaryDataElement(image); + callback(url); + } + } + function formatParagraphAnchors(odfbody) { + var runtimens = "urn:webodf", + n, + i, + nodes = xpath.getODFElementsWithXPath(odfbody, + ".//*[*[@text:anchor-type='paragraph']]", + style2CSS.namespaceResolver); + for (i = 0; i < nodes.length; i += 1) { + n = nodes[i]; + if (n.setAttributeNS) { + n.setAttributeNS(runtimens, "containsparagraphanchor", true); + } + } + } + /** + * @param {!Object} container + * @param {!Element} odfbody + * @param {!StyleSheet} stylesheet + * @return {undefined} + **/ + function modifyImages(container, odfbody, stylesheet) { + var node, + frames, + i, + images; + function namespaceResolver(prefix) { + return namespaces[prefix]; + } + // find all the frame elements + frames = []; + node = odfbody.firstChild; + while (node && node !== odfbody) { + if (node.namespaceURI === drawns) { + frames[frames.length] = node; + } + if (node.firstChild) { + node = node.firstChild; + } else { + while (node && node !== odfbody && !node.nextSibling) { + node = node.parentNode; + } + if (node && node.nextSibling) { + node = node.nextSibling; + } + } + } + // adjust all the frame positions + for (i = 0; i < frames.length; i += 1) { + node = frames[i]; + setFramePosition('frame' + String(i), node, stylesheet); + } + formatParagraphAnchors(odfbody); + } + /** + * Load all the images that are inside an odf element. + * @param {!Object} container + * @param {!Element} odffragment + * @param {!StyleSheet} stylesheet + * @return {undefined} + */ + function loadImages(container, odffragment, stylesheet) { + var i, + images, + node; + // do delayed loading for all the images + function loadImage(name, container, node, stylesheet) { + // load image with a small delay to give the html ui a chance to + // update + loadingQueue.addToQueue(function () { + setImage(name, container, node, stylesheet); + }); + } + images = odffragment.getElementsByTagNameNS(drawns, 'image'); + for (i = 0; i < images.length; i += 1) { + node = /**@type{!Element}*/(images.item(i)); + loadImage('image' + String(i), container, node, stylesheet); + } + } + /** + * @param {!string} id + * @param {!Object} container + * @param {!Element} plugin + * @param {!StyleSheet} stylesheet + * @return {undefined} + **/ + function setVideo(id, container, plugin, stylesheet) { + var video, source, url, videoType, doc = plugin.ownerDocument, part, node; + + url = plugin.getAttributeNS(xlinkns, 'href'); + + function callback(url, mimetype) { + // test for video mimetypes + if (mimetype.substr(0, 6) === 'video/') { + video = doc.createElementNS(doc.documentElement.namespaceURI, "video"); + video.setAttribute('controls', 'controls'); + + source = doc.createElement('source'); + source.setAttribute('src', url); + source.setAttribute('type', mimetype); + + video.appendChild(source); + plugin.parentNode.appendChild(video); + } else { + plugin.innerHtml = 'Unrecognised Plugin'; + } + } + // look for a office:binary-data + if (url) { + try { + if (container.getPartUrl) { + url = container.getPartUrl(url); + callback(url, 'video/mp4'); + } else { + part = container.getPart(url); + part.onchange = function (part) { + callback(part.url, part.mimetype); + }; + part.load(); + } + } catch (e) { + runtime.log('slight problem: ' + e); + } + } else { + // this will fail atm - following function assumes PNG data] + runtime.log('using MP4 data fallback'); + url = getUrlFromBinaryDataElement(plugin); + callback(url, 'video/mp4'); + } + } + /** + * Load all the video that are inside an odf element. + * @param {!Object} container + * @param {!Element} odffragment + * @param {!StyleSheet} stylesheet + * @return {undefined} + */ + function loadVideos(container, odffragment, stylesheet) { + var i, + plugins, + node; + // do delayed loading for all the videos + function loadVideo(name, container, node, stylesheet) { + // load video with a small delay to give the html ui a chance to + // update + loadingQueue.addToQueue(function () { + setVideo(name, container, node, stylesheet); + }); + } + // embedded video is stored in a draw:plugin element + plugins = odffragment.getElementsByTagNameNS(drawns, 'plugin'); + runtime.log('Loading Videos:'); + + for (i = 0; i < plugins.length; i += 1) { + runtime.log('...Found a video.'); + node = /**@type{!Element}*/(plugins.item(i)); + loadVideo('video' + String(i), container, node, stylesheet); + } + } + /** + * @param {Document} document Put and ODF Canvas inside this element. + */ + function addStyleSheet(document) { + var styles = document.getElementsByTagName("style"), + head = document.getElementsByTagName('head')[0], + text = '', + prefix, + a = "", + b; + // use cloneNode on an exisiting HTMLStyleElement, because in + // Chromium 12, document.createElement('style') does not give a + // HTMLStyleElement + if (styles && styles.length > 0) { + styles = styles[0].cloneNode(false); + } else { + styles = document.createElement('style'); + } + for (prefix in namespaces) { + if (namespaces.hasOwnProperty(prefix) && prefix) { + text += "@namespace " + prefix + " url(" + namespaces[prefix] + + ");\n"; + } + } + styles.appendChild(document.createTextNode(text)); + head.appendChild(styles); + return styles; + } + /** + * @constructor + * @param {!Element} element Put and ODF Canvas inside this element. + */ + odf.OdfCanvas = function OdfCanvas(element) { + var self = this, + document = element.ownerDocument, + /**@type{odf.OdfContainer}*/ odfcontainer, + /**@type{!odf.Formatting}*/ formatting = new odf.Formatting(), + selectionWatcher = new SelectionWatcher(element), + slidecssindex = 0, + pageSwitcher = new PageSwitcher(addStyleSheet(document)), + stylesxmlcss = addStyleSheet(document), + positioncss = addStyleSheet(document), + editable = false, + zoomLevel = 1; + + function fixContainerSize() { + var sizer = element.firstChild, + odfdoc = sizer.firstChild; + if (!odfdoc) { + return; + } + element.style.WebkitTransform = 'scale(' + zoomLevel + ')'; + element.style.WebkitTransformOrigin = 'left top'; + element.style.width = Math.round(zoomLevel * odfdoc.offsetWidth) + + "px"; + element.style.height = Math.round(zoomLevel * odfdoc.offsetHeight) + + "px"; + } + /** + * A new content.xml has been loaded. Update the live document with it. + * @param {!Object} container + * @param {!Element} odfnode + * @return {undefined} + **/ + function handleContent(container, odfnode) { + var css = positioncss.sheet, sizer; + modifyImages(container, odfnode.body, css); +/* + slidecssindex = css.insertRule( + 'office|presentation draw|page:nth-child(1n) {display:block;}', + css.cssRules.length + ); +*/ + // FIXME: this is a hack to have a defined background now + // should be removed as soon as we have sane background + // handling for pages + css.insertRule('draw|page { background-color:#fff; }', + css.cssRules.length); + + // only append the content at the end + clear(element); + sizer = document.createElement('div'); + sizer.style.display = "inline-block"; + sizer.style.background = "white"; + sizer.appendChild(odfnode); + element.appendChild(sizer); + loadImages(container, odfnode.body, css); + loadVideos(container, odfnode.body, css); + fixContainerSize(); + } + /** + * @param {!odf.OdfContainer} container + * @return {undefined} + **/ + function refreshOdf(container) { + if (odfcontainer !== container) { + return; + } + + // synchronize the object a window.odfcontainer with the view + function callback() { + clear(element); + element.style.display = "inline-block"; + var odfnode = container.rootElement; + element.ownerDocument.importNode(odfnode, true); + + formatting.setOdfContainer(container); + handleStyles(odfnode, stylesxmlcss); + // do content last, because otherwise the document is constantly + // updated whenever the css changes + handleContent(container, odfnode); + fireEvent("statereadychange"); + } + + if (odfcontainer.state === odf.OdfContainer.DONE) { + callback(); + } else { + odfcontainer.onchange = callback; + } + } + + this.odfContainer = function () { + return odfcontainer; + }; + this.slidevisibilitycss = function () { + return pageSwitcher.css; + }; + /** + * @param {!string} url + * @return {undefined} + */ + this["load"] = this.load = function (url) { + loadingQueue.clearQueue(); + element.innerHTML = 'loading ' + url; + // open the odf container + odfcontainer = new odf.OdfContainer(url, function (container) { + odfcontainer = container; + refreshOdf(container); + }); + odfcontainer.onstatereadychange = refreshOdf; + }; + + function stopEditing() { + if (!editparagraph) { + return; + } + var fragment = editparagraph.ownerDocument.createDocumentFragment(); + while (editparagraph.firstChild) { + fragment.insertBefore(editparagraph.firstChild, null); + } + editparagraph.parentNode.replaceChild(fragment, editparagraph); + } + + this.save = function (callback) { + stopEditing(); + odfcontainer.save(callback); + }; + + function cancelPropagation(event) { + if (event.stopPropagation) { + event.stopPropagation(); + } else { + event.cancelBubble = true; + } + } + + function cancelEvent(event) { + if (event.preventDefault) { + event.preventDefault(); + event.stopPropagation(); + } else { + event.returnValue = false; + event.cancelBubble = true; + } + } + + this.setEditable = function (iseditable) { + editable = iseditable; + if (!editable) { + stopEditing(); + } + }; + + function processClick(evt) { + evt = evt || window.event; + // go up until we find a text:p, if we find it, wrap it in

    and + // make that editable + var e = evt.target, selection = window.getSelection(), + range = ((selection.rangeCount > 0) + ? selection.getRangeAt(0) : null), + startContainer = range && range.startContainer, + startOffset = range && range.startOffset, + endContainer = range && range.endContainer, + endOffset = range && range.endOffset; + + while (e && !((e.localName === "p" || e.localName === "h") && + e.namespaceURI === textns)) { + e = e.parentNode; + } + if (!editable) { + return; + } + // test code for enabling editing + if (!e || e.parentNode === editparagraph) { + return; + } + + if (!editparagraph) { + editparagraph = e.ownerDocument.createElement("p"); + if (!editparagraph.style) { + editparagraph = e.ownerDocument.createElementNS( + "http://www.w3.org/1999/xhtml", + "p" + ); + } + editparagraph.style.margin = "0px"; + editparagraph.style.padding = "0px"; + editparagraph.style.border = "0px"; + editparagraph.setAttribute("contenteditable", true); + } else if (editparagraph.parentNode) { + stopEditing(); + } + e.parentNode.replaceChild(editparagraph, e); + editparagraph.appendChild(e); + + // set the cursor or selection at the right position + editparagraph.focus(); // needed in FF to show cursor in the paragraph + if (range) { + selection.removeAllRanges(); + range = e.ownerDocument.createRange(); + range.setStart(startContainer, startOffset); + range.setEnd(endContainer, endOffset); + selection.addRange(range); + } + cancelEvent(evt); + } + + /** + * @param {!string} eventName + * @param {!function(*)} handler + * @return {undefined} + */ + this.addListener = function (eventName, handler) { + if (eventName === "selectionchange") { + selectionWatcher.addListener(eventName, handler); + } else { + addEventListener(eventName, handler); + } + }; + /** + * @return {!odf.Formatting} + */ + this.getFormatting = function () { + return formatting; + }; + /** + * @param {!number} zoom + * @return {undefined} + */ + this.setZoomLevel = function (zoom) { + zoomLevel = zoom; + fixContainerSize(); + }; + /** + * @return {!number} + */ + this.getZoomLevel = function () { + return zoomLevel; + }; + /** + * @param {!number} width + * @param {!number} height + * @return {undefined} + */ + this.fitToContainingElement = function (width, height) { + var realWidth = element.offsetWidth / zoomLevel, + realHeight = element.offsetHeight / zoomLevel; + zoomLevel = width / realWidth; + if (height / realHeight < zoomLevel) { + zoomLevel = height / realHeight; + } + fixContainerSize(); + }; + /** + * @param {!number} width + * @return {undefined} + */ + this.fitToWidth = function (width) { + var realWidth = element.offsetWidth / zoomLevel; + zoomLevel = width / realWidth; + fixContainerSize(); + }; + /** + * @param {!number} height + * @return {undefined} + */ + this.fitToHeight = function (height) { + var realHeight = element.offsetHeight / zoomLevel; + zoomLevel = height / realHeight; + fixContainerSize(); + }; + /** + * @return {undefined} + */ + this.showNextPage = function () { + pageSwitcher.showNextPage(); + }; + /** + * @return {undefined} + */ + this.showPreviousPage = function () { + pageSwitcher.showPreviousPage(); + }; + /** + * @return {undefined} + */ + this.showAllPages = function () { + }; + + listenEvent(element, "click", processClick); + }; + return odf.OdfCanvas; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfContainer.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfContainer.js new file mode 100644 index 0000000000..709addbecd --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/odf/OdfContainer.js @@ -0,0 +1,672 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, xmldom: true, odf: true, DOMParser: true, + document: true */ +runtime.loadClass("core.Base64"); +runtime.loadClass("core.Zip"); +runtime.loadClass("xmldom.LSSerializer"); +runtime.loadClass("odf.StyleInfo"); +runtime.loadClass("odf.Style2CSS"); +runtime.loadClass("odf.FontLoader"); +/** + * The OdfContainer class manages the various parts that constitues an ODF + * document. + * @constructor + * @param {!string} url + * @param {!Function|null} onstatereadychange + **/ +odf.OdfContainer = (function () { + "use strict"; + var styleInfo = new odf.StyleInfo(), + style2CSS = new odf.Style2CSS(), + namespaces = style2CSS.namespaces, + officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", + manifestns = "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0", + nodeorder = ['meta', 'settings', 'scripts', 'font-face-decls', 'styles', + 'automatic-styles', 'master-styles', 'body'], + base64 = new core.Base64(), + fontLoader = new odf.FontLoader(), + partMimetypes = {}; + /** + * @param {?Node} node + * @param {!string} ns + * @param {!string} name + * @return {?Node} + */ + function getDirectChild(node, ns, name) { + node = (node) ? node.firstChild : null; + while (node) { + if (node.localName === name && node.namespaceURI === ns) { + return node; + } + node = node.nextSibling; + } + return null; + } + /** + * Return the position the node should get according to the ODF flat format. + * @param {!Node} child + * @return {!number} + */ + function getNodePosition(child) { + var childpos = 0, i, l = nodeorder.length; + for (i = 0; i < l; i += 1) { + if (child.namespaceURI === officens && + child.localName === nodeorder[i]) { + return i; + } + } + return -1; + } + /** + * Class that filters runtime specific nodes from the DOM. + * @constructor + * @implements {xmldom.LSSerializerFilter} + * @param {!Element} odfroot + * @param {!Element=} usedStylesElement + */ + function OdfNodeFilter(odfroot, usedStylesElement) { + var automaticStyles = odfroot.automaticStyles, + usedKeysList; + if (usedStylesElement) { + usedKeysList = new styleInfo.UsedKeysList(usedStylesElement); + } + /** + * @param {!Node} node + * @return {!number} + */ + this.acceptNode = function (node) { + var styleName, styleFamily, result; + if (node.namespaceURI === "http://www.w3.org/1999/xhtml") { + result = 3; // FILTER_SKIP + } else if (usedKeysList && node.parentNode === automaticStyles && + node.nodeType === 1) { + if (usedKeysList.uses(node)) { + result = 1; // FILTER_ACCEPT + } else { + result = 2; // FILTER_REJECT + } + } else { + result = 1; // FILTER_ACCEPT + } + return result; + }; + } + /** + * Put the element at the right position in the parent. + * The right order is given by the value returned from getNodePosition. + * @param {!Node} node + * @param {?Node} child + * @return {undefined} + */ + function setChild(node, child) { + if (!child) { + return; + } + var childpos = getNodePosition(child), + pos, + c = node.firstChild; + if (childpos === -1) { + return; + } + while (c) { + pos = getNodePosition(c); + if (pos !== -1 && pos > childpos) { + break; + } + c = c.nextSibling; + } + node.insertBefore(child, c); + } + /** + * A DOM element that is part of and ODF part of a DOM. + * @constructor + * @extends {Element} + */ + function ODFElement() { + } + /** + * The root element of an ODF document. + * @constructor + * @extends {ODFElement} + */ + function ODFDocumentElement(odfcontainer) { + this.OdfContainer = odfcontainer; + } + ODFDocumentElement.prototype = new ODFElement(); + ODFDocumentElement.prototype.constructor = ODFDocumentElement; + ODFDocumentElement.namespaceURI = officens; + ODFDocumentElement.localName = 'document'; + // private constructor + /** + * @constructor + * @param {!string} name + * @param {!odf.OdfContainer} container + * @param {!core.Zip} zip + */ + function OdfPart(name, container, zip) { + var self = this, + privatedata; + + // declare public variables + this.size = 0; + this.type = null; + this.name = name; + this.container = container; + this.url = null; + this.mimetype = null; + this.document = null; + this.onreadystatechange = null; + this.onchange = null; + this.EMPTY = 0; + this.LOADING = 1; + this.DONE = 2; + this.state = this.EMPTY; + + // private functions + // public functions + this.load = function () { + var mimetype = partMimetypes[name]; + this.mimetype = mimetype; + zip.loadAsDataURL(name, mimetype, function (err, url) { + self.url = url; + if (self.onchange) { + self.onchange(self); + } + if (self.onstatereadychange) { + self.onstatereadychange(self); + } + }); + }; + this.abort = function () { + // TODO + }; + } + OdfPart.prototype.load = function () { + }; + OdfPart.prototype.getUrl = function () { + if (this.data) { + return 'data:;base64,' + base64.toBase64(this.data); + } + return null; + }; + /** + * @constructor + * @param {!odf.OdfContainer} odfcontainer + */ + function OdfPartList(odfcontainer) { + var self = this; + // declare public variables + this.length = 0; + this.item = function (index) { + }; + } + /** + * @constructor + * @param {!string} url + * @param {!Function|null} onstatereadychange + */ + odf.OdfContainer = function OdfContainer(url, onstatereadychange) { + var self = this, + zip = null, + contentXmlCompletelyLoaded = false; + + // NOTE each instance of OdfContainer has a copy of the private functions + // it would be better to have a class OdfContainerPrivate where the + // private functions can be defined via OdfContainerPrivate.prototype + // without exposing them + + // declare public variables + this.onstatereadychange = onstatereadychange; + this.onchange = null; + this.state = null; + this.rootElement = null; + this.parts = null; + + /** + * @param {!Element} element + * @return {undefined} + */ + function removeProcessingInstructions(element) { + var n = element.firstChild, next, e; + while (n) { + next = n.nextSibling; + if (n.nodeType === 1) { // ELEMENT + e = /**@type{!Element}*/(n); + removeProcessingInstructions(e); + } else if (n.nodeType === 7) { // PROCESSING_INSTRUCTION_NODE + element.removeChild(n); + } + n = next; + } + } + + // private functions + /** + * Import the document elementnode into the DOM of OdfContainer. + * Any processing instructions are removed, since importing them + * gives an exception. + * @param {!Document} xmldoc + * @return {!Node} + */ + function importRootNode(xmldoc) { + var doc = self.rootElement.ownerDocument, + node; + // remove all processing instructions + // TODO: replace cursor processing instruction with an element + if (xmldoc) { + removeProcessingInstructions(xmldoc.documentElement); + try { + node = doc.importNode(xmldoc.documentElement, true); + } catch (e) { + } + } + return node; + } + function setState(state) { + self.state = state; + if (self.onchange) { + self.onchange(self); + } + if (self.onstatereadychange) { + self.onstatereadychange(self); + } + } + /** + * @param {!Document} xmldoc + * @return {undefined} + */ + function handleFlatXml(xmldoc) { + var root = importRootNode(xmldoc); + if (!root || root.localName !== 'document' || + root.namespaceURI !== officens) { + setState(OdfContainer.INVALID); + return; + } + self.rootElement = root; + root.fontFaceDecls = getDirectChild(root, officens, 'font-face-decls'); + root.styles = getDirectChild(root, officens, 'styles'); + root.automaticStyles = getDirectChild(root, officens, + 'automatic-styles'); + root.masterStyles = getDirectChild(root, officens, 'master-styles'); + root.body = getDirectChild(root, officens, 'body'); + root.meta = getDirectChild(root, officens, 'meta'); + setState(OdfContainer.DONE); + } + /** + * @param {!Document} xmldoc + * @return {undefined} + */ + function handleStylesXml(xmldoc) { + var node = importRootNode(xmldoc), + root = self.rootElement; + if (!node || node.localName !== 'document-styles' || + node.namespaceURI !== officens) { + setState(OdfContainer.INVALID); + return; + } + root.fontFaceDecls = getDirectChild(node, officens, 'font-face-decls'); + setChild(root, root.fontFaceDecls); + root.styles = getDirectChild(node, officens, 'styles'); + setChild(root, root.styles); + root.automaticStyles = getDirectChild(node, officens, + 'automatic-styles'); + setChild(root, root.automaticStyles); + root.masterStyles = getDirectChild(node, officens, 'master-styles'); + setChild(root, root.masterStyles); + //removeUnusedAutomaticStyles(root.automaticStyles, + // root.masterStyles); + fontLoader.loadFonts(root.fontFaceDecls, zip, null); + } + /** + * @param {!Document} xmldoc + * @return {undefined} + */ + function handleContentXml(xmldoc) { + var node = importRootNode(xmldoc), + root, + automaticStyles, + fontFaceDecls, + c; + if (!node || node.localName !== 'document-content' || + node.namespaceURI !== officens) { + setState(OdfContainer.INVALID); + return; + } + root = self.rootElement; + fontFaceDecls = getDirectChild(node, officens, 'font-face-decls'); + if (root.fontFaceDecls && fontFaceDecls) { + c = fontFaceDecls.firstChild; + while (c) { + root.fontFaceDecls.appendChild(c); + c = fontFaceDecls.firstChild; + } + } else if (fontFaceDecls) { + root.fontFaceDecls = fontFaceDecls; + setChild(root, fontFaceDecls); + } + automaticStyles = getDirectChild(node, officens, 'automatic-styles'); + if (root.automaticStyles && automaticStyles) { + c = automaticStyles.firstChild; + while (c) { + root.automaticStyles.appendChild(c); + c = automaticStyles.firstChild; // works because node c moved + } + } else if (automaticStyles) { + root.automaticStyles = automaticStyles; + setChild(root, automaticStyles); + } + root.body = getDirectChild(node, officens, 'body'); + setChild(root, root.body); + } + /** + * @param {!Document} xmldoc + * @return {undefined} + */ + function handleMetaXml(xmldoc) { + var node = importRootNode(xmldoc), + root; + if (!node || node.localName !== 'document-meta' || + node.namespaceURI !== officens) { + return; + } + root = self.rootElement; + root.meta = getDirectChild(node, officens, 'meta'); + setChild(root, root.meta); + } + /** + * @param {!Document} xmldoc + * @return {undefined} + */ + function handleSettingsXml(xmldoc) { + var node = importRootNode(xmldoc), + root; + if (!node || node.localName !== 'document-settings' || + node.namespaceURI !== officens) { + return; + } + root = self.rootElement; + root.settings = getDirectChild(node, officens, 'settings'); + setChild(root, root.settings); + } + /** + * @param {!Document} xmldoc + * @return {undefined} + */ + function handleManifestXml(xmldoc) { + var node = importRootNode(xmldoc), + root, + n; + if (!node || node.localName !== 'manifest' || + node.namespaceURI !== manifestns) { + return; + } + root = self.rootElement; + root.manifest = node; + n = root.manifest.firstChild; + while (n) { + if (n.nodeType === 1 && n.localName === "file-entry" && + n.namespaceURI === manifestns) { + partMimetypes[n.getAttributeNS(manifestns, "full-path")] = + n.getAttributeNS(manifestns, "media-type"); + } + n = n.nextSibling; + } + } + /** + * @param {!function(?string,?Document)} callback + * @return {undefined} + */ + function getContentXmlNode(callback) { + var handler = { + rootElementReady: function (err, rootxml, done) { + contentXmlCompletelyLoaded = err || done; + if (err) { + return callback(err, null); + } + var parser = new DOMParser(); + rootxml = parser.parseFromString(rootxml, "text/xml"); + callback(null, rootxml); + }, + bodyChildElementsReady: function (err, nodes, done) { + // TODO + } + }; + zip.loadContentXmlAsFragments("content.xml", handler); + } + /** + * @param {!string} filepath + * @param {!function(?string,?Document)} callback + * @return {undefined} + */ + function getXmlNode(filepath, callback) { + zip.loadAsDOM(filepath, callback); + } + /** + * @return {undefined} + */ + function loadComponents() { + // always load content.xml, meta.xml, styles.xml and settings.xml + getXmlNode('styles.xml', function (err, xmldoc) { + handleStylesXml(xmldoc); + if (self.state === OdfContainer.INVALID) { + return; + } + getXmlNode('content.xml', function (err, xmldoc) { + handleContentXml(xmldoc); + if (self.state === OdfContainer.INVALID) { + return; + } + getXmlNode('meta.xml', function (err, xmldoc) { + handleMetaXml(xmldoc); + if (self.state === OdfContainer.INVALID) { + return; + } + getXmlNode('settings.xml', function (err, xmldoc) { + if (xmldoc) { + handleSettingsXml(xmldoc); + } + getXmlNode('META-INF/manifest.xml', function (err, + xmldoc) { + if (xmldoc) { + handleManifestXml(xmldoc); + } + if (self.state !== OdfContainer.INVALID) { + setState(OdfContainer.DONE); + } + }); + }); + }); + }); + }); + } + function documentElement(name, map) { + var s = "", i; + for (i in map) { + if (map.hasOwnProperty(i)) { + s += " xmlns:" + i + "=\"" + map[i] + "\""; + } + } + return ""; + } + /** + * @return {!string} + */ + function serializeMetaXml() { + var nsmap = style2CSS.namespaces, + serializer = new xmldom.LSSerializer(), + /**@type{!string}*/ s = documentElement("document-meta", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement); + s += serializer.writeToString(self.rootElement.meta, nsmap); + s += ""; + return s; + } + /** + * @return {!string} + */ + function serializeSettingsXml() { + var nsmap = style2CSS.namespaces, + serializer = new xmldom.LSSerializer(), + /**@type{!string}*/ s = documentElement("document-settings", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement); + s += serializer.writeToString(self.rootElement.settings, nsmap); + s += ""; + return s; + } + /** + * @return {!string} + */ + function serializeStylesXml() { + var nsmap = style2CSS.namespaces, + serializer = new xmldom.LSSerializer(), + /**@type{!string}*/ s = documentElement("document-styles", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement, + self.rootElement.masterStyles); + s += serializer.writeToString(self.rootElement.fontFaceDecls, nsmap); + s += serializer.writeToString(self.rootElement.styles, nsmap); + s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); + s += serializer.writeToString(self.rootElement.masterStyles, nsmap); + s += ""; + return s; + } + /** + * @return {!string} + */ + function serializeContentXml() { + var nsmap = style2CSS.namespaces, + serializer = new xmldom.LSSerializer(), + /**@type{!string}*/ s = documentElement("document-content", nsmap); + serializer.filter = new OdfNodeFilter(self.rootElement, + self.rootElement.body); + // Until there is code to determine if a font is referenced only + // from all font declaratios will be stored in styles.xml + s += serializer.writeToString(self.rootElement.automaticStyles, nsmap); + s += serializer.writeToString(self.rootElement.body, nsmap); + s += ""; + return s; + } + function createElement(Type) { + var original = document.createElementNS( + Type.namespaceURI, + Type.localName + ), + method, + iface = new Type(); + for (method in iface) { + if (iface.hasOwnProperty(method)) { + original[method] = iface[method]; + } + } + return original; + } + function loadFromXML(url, callback) { + runtime.loadXML(url, function (err, dom) { + if (err) { + callback(err); + } else { + handleFlatXml(dom); + } + }); + } + // public functions + /** + * Open file and parse it. Return the XML Node. Return the root node of + * the file or null if this is not possible. + * For 'content.xml', 'styles.xml', 'meta.xml', and 'settings.xml', the + * elements 'document-content', 'document-styles', 'document-meta', or + * 'document-settings' will be returned respectively. + * @param {!string} partname + * @return {!OdfPart} + **/ + this.getPart = function (partname) { + return new OdfPart(partname, self, zip); + }; + /** + * @param {function(?string):undefined} callback + * @return {undefined} + */ + this.save = function (callback) { + // the assumption so far is that all ODF parts are serialized + // already, but meta, settings, styles and content should be + // refreshed + // update the zip entries with the data from the live ODF DOM + var data; + data = runtime.byteArrayFromString(serializeSettingsXml(), "utf8"); + zip.save("settings.xml", data, true, new Date()); + data = runtime.byteArrayFromString(serializeMetaXml(), "utf8"); + zip.save("meta.xml", data, true, new Date()); + data = runtime.byteArrayFromString(serializeStylesXml(), "utf8"); + zip.save("styles.xml", data, true, new Date()); + data = runtime.byteArrayFromString(serializeContentXml(), "utf8"); + zip.save("content.xml", data, true, new Date()); + zip.write(function (err) { + callback(err); + }); + }; + + // initialize public variables + this.state = OdfContainer.LOADING; + this.rootElement = createElement(ODFDocumentElement); + this.parts = new OdfPartList(this); + + // initialize private variables + zip = new core.Zip(url, function (err, zipobject) { + zip = zipobject; + if (err) { + loadFromXML(url, function (xmlerr) { + if (err) { + zip.error = err + "\n" + xmlerr; + setState(OdfContainer.INVALID); + } + }); + } else { + loadComponents(); + } + }); + }; + odf.OdfContainer.EMPTY = 0; + odf.OdfContainer.LOADING = 1; + odf.OdfContainer.DONE = 2; + odf.OdfContainer.INVALID = 3; + odf.OdfContainer.SAVING = 4; + odf.OdfContainer.MODIFIED = 5; + /** + * @param {!string} url + * @return {!odf.OdfContainer} + */ + odf.OdfContainer.getContainer = function (url) { + return new odf.OdfContainer(url, null); + }; + return odf.OdfContainer; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/Style2CSS.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/Style2CSS.js new file mode 100644 index 0000000000..f33e3faef4 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/odf/Style2CSS.js @@ -0,0 +1,632 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global odf: true, runtime: true*/ +/** + * @constructor + */ +odf.Style2CSS = function Style2CSS() { + "use strict"; + // helper constants + var xlinkns = 'http://www.w3.org/1999/xlink', + drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", + fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", + officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", + presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", + stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", + svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", + tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", + textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", + namespaces = { + "draw": drawns, + "fo": fons, + "office": officens, + "presentation": presentationns, + "style": stylens, + "svg": svgns, + "table": tablens, + "text": textns, + "xlink": xlinkns + }, + + familynamespaceprefixes = { + 'graphic': 'draw', + 'paragraph': 'text', + 'presentation': 'presentation', + 'ruby': 'text', + 'section': 'text', + 'table': 'table', + 'table-cell': 'table', + 'table-column': 'table', + 'table-row': 'table', + 'text': 'text', + 'list': 'text' + }, + + familytagnames = { + 'graphic': ['circle', 'connected', 'control', 'custom-shape', + 'ellipse', 'frame', 'g', 'line', 'measure', 'page', + 'page-thumbnail', 'path', 'polygon', 'polyline', 'rect', + 'regular-polygon' ], + 'paragraph': ['alphabetical-index-entry-template', 'h', + 'illustration-index-entry-template', 'index-source-style', + 'object-index-entry-template', 'p', + 'table-index-entry-template', 'table-of-content-entry-template', + 'user-index-entry-template'], + 'presentation': ['caption', 'circle', 'connector', 'control', + 'custom-shape', 'ellipse', 'frame', 'g', 'line', 'measure', + 'page-thumbnail', 'path', 'polygon', 'polyline', 'rect', + 'regular-polygon'], + 'ruby': ['ruby', 'ruby-text'], + 'section': ['alphabetical-index', 'bibliography', + 'illustration-index', 'index-title', 'object-index', 'section', + 'table-of-content', 'table-index', 'user-index'], + 'table': ['background', 'table'], + 'table-cell': ['body', 'covered-table-cell', 'even-columns', + 'even-rows', 'first-column', 'first-row', 'last-column', + 'last-row', 'odd-columns', 'odd-rows', 'table-cell'], + 'table-column': ['table-column'], + 'table-row': ['table-row'], + 'text': ['a', 'index-entry-chapter', 'index-entry-link-end', + 'index-entry-link-start', 'index-entry-page-number', + 'index-entry-span', 'index-entry-tab-stop', 'index-entry-text', + 'index-title-template', 'linenumbering-configuration', + 'list-level-style-number', 'list-level-style-bullet', + 'outline-level-style', 'span'], + 'list': ['list-item'] + }, + + textPropertySimpleMapping = [ + [ fons, 'color', 'color' ], + // this sets the element background, not just the text background + [ fons, 'background-color', 'background-color' ], + [ fons, 'font-weight', 'font-weight' ], + [ fons, 'font-style', 'font-style' ], + [ fons, 'font-size', 'font-size' ] + ], + + bgImageSimpleMapping = [ + [ stylens, 'repeat', 'background-repeat' ] + ], + + paragraphPropertySimpleMapping = [ + [ fons, 'background-color', 'background-color' ], + [ fons, 'text-align', 'text-align' ], + [ fons, 'padding-left', 'padding-left' ], + [ fons, 'padding-right', 'padding-right' ], + [ fons, 'padding-top', 'padding-top' ], + [ fons, 'padding-bottom', 'padding-bottom' ], + [ fons, 'border-left', 'border-left' ], + [ fons, 'border-right', 'border-right' ], + [ fons, 'border-top', 'border-top' ], + [ fons, 'border-bottom', 'border-bottom' ], + [ fons, 'margin-left', 'margin-left' ], + [ fons, 'margin-right', 'margin-right' ], + [ fons, 'margin-top', 'margin-top' ], + [ fons, 'margin-bottom', 'margin-bottom' ], + [ fons, 'border', 'border' ] + ], + + graphicPropertySimpleMapping = [ + [ drawns, 'fill-color', 'background-color' ], + [ drawns, 'fill', 'background' ], + [ fons, 'min-height', 'min-height' ], + [ drawns, 'stroke', 'border' ], + [ svgns, 'stroke-color', 'border-color' ] + ], + + tablecellPropertySimpleMapping = [ + [ fons, 'background-color', 'background-color' ], + [ fons, 'border-left', 'border-left' ], + [ fons, 'border-right', 'border-right' ], + [ fons, 'border-top', 'border-top' ], + [ fons, 'border-bottom', 'border-bottom' ] + ]; + + // helper functions + /** + * @param {string} prefix + * @return {string} + */ + function namespaceResolver(prefix) { + return namespaces[prefix] || null; + } + /** + * @param {!Document} doc + * @param {!Element} stylesnode + * @return {!Object} + */ + function getStyleMap(doc, stylesnode) { + // put all style elements in a hash map by family and name + var stylemap = {}, node, name, family, map; + if (!stylesnode) { + return stylemap; + } + node = stylesnode.firstChild; + while (node) { + if (node.namespaceURI === stylens && node.localName === 'style') { + family = node.getAttributeNS(stylens, 'family'); + } else if (node.namespaceURI === textns && + node.localName === 'list-style') { + family = "list"; + } + name = family && node.getAttributeNS && + node.getAttributeNS(stylens, 'name'); + if (name) { + if (!stylemap[family]) { + stylemap[family] = {}; + } + stylemap[family][name] = node; + } + node = node.nextSibling; + } + return stylemap; + } + /** + * @param {?Object} stylestree + * @param {?string} name + * @return {?string} + */ + function findStyle(stylestree, name) { + if (!name || !stylestree) { + return null; + } + if (stylestree[name]) { + return stylestree[name]; + } + var derivedStyles = stylestree.derivedStyles, + n, style; + for (n in stylestree) { + if (stylestree.hasOwnProperty(n)) { + style = findStyle(stylestree[n].derivedStyles, name); + if (style) { + return style; + } + } + } + return null; + } + /** + * @param {!string} stylename + * @param {!Object} stylesmap + * @param {!Object} stylestree + * @return {undefined} + */ + function addStyleToStyleTree(stylename, stylesmap, stylestree) { + var style = stylesmap[stylename], parentname, parentstyle; + if (!style) { + return; + } + parentname = style.getAttributeNS(stylens, 'parent-style-name'); + parentstyle = null; + if (parentname) { + parentstyle = findStyle(stylestree, parentname); + if (!parentstyle && stylesmap[parentname]) { + // parent style has not been handled yet, do that now + addStyleToStyleTree(parentname, stylesmap, stylestree); + parentstyle = stylesmap[parentname]; + stylesmap[parentname] = null; + } + } + if (parentstyle) { + if (!parentstyle.derivedStyles) { + parentstyle.derivedStyles = {}; + } + parentstyle.derivedStyles[stylename] = style; + } else { + // no parent so add the root + stylestree[stylename] = style; + } + } + /** + * @param {!Object} stylesmap + * @param {!Object} stylestree + * @return {undefined} + */ + function addStyleMapToStyleTree(stylesmap, stylestree) { + var name; + for (name in stylesmap) { + if (stylesmap.hasOwnProperty(name)) { + addStyleToStyleTree(name, stylesmap, stylestree); + stylesmap[name] = null; + } + } + } + /** + * @param {!string} family + * @param {!string} name + * @return {?string} + */ + function createSelector(family, name) { + var prefix = familynamespaceprefixes[family], + namepart, + selector = "", + first = true; + if (prefix === null) { + return null; + } + namepart = '[' + prefix + '|style-name="' + name + '"]'; + if (prefix === 'presentation') { + prefix = 'draw'; + namepart = '[presentation|style-name="' + name + '"]'; + } + return prefix + '|' + familytagnames[family].join( + namepart + ',' + prefix + '|') + namepart; + } + /** + * @param {!string} family + * @param {!string} name + * @param {!Element} node + * @return {!Array} + */ + function getSelectors(family, name, node) { + var selectors = [], n, ss, s; + selectors.push(createSelector(family, name)); + for (n in node.derivedStyles) { + if (node.derivedStyles.hasOwnProperty(n)) { + ss = getSelectors(family, n, node.derivedStyles[n]); + for (s in ss) { + if (ss.hasOwnProperty(s)) { + selectors.push(ss[s]); + } + } + } + } + return selectors; + } + /** + * @param {?Element} node + * @param {!string} ns + * @param {!string} name + * @return {?Element} + */ + function getDirectChild(node, ns, name) { + if (!node) { + return null; + } + var c = node.firstChild, e; + while (c) { + if (c.namespaceURI === ns && c.localName === name) { + e = /**@type{Element}*/(c); + return e; + } + c = c.nextSibling; + } + return null; + } + /** + * @param {!Element} props + * @param {!Object} mapping + * @return {!string} + */ + function applySimpleMapping(props, mapping) { + var rule = '', r, value; + for (r in mapping) { + if (mapping.hasOwnProperty(r)) { + r = mapping[r]; + value = props.getAttributeNS(r[0], r[1]); + if (value) { + rule += r[2] + ':' + value + ';'; + } + } + } + return rule; + } + /** + * @param {!string} name + * @return {!string} + */ + function getFontDeclaration(name) { + return '"' + name + '"'; + } + /** + * @param {!Element} props + * @return {!string} + */ + function getTextProperties(props) { + var rule = '', value; + rule += applySimpleMapping(props, textPropertySimpleMapping); + value = props.getAttributeNS(stylens, 'text-underline-style'); + if (value === 'solid') { + rule += 'text-decoration: underline;'; + } + value = props.getAttributeNS(stylens, 'font-name'); + if (value) { + value = getFontDeclaration(value); + if (value) { + rule += 'font-family: ' + value + ';'; + } + } + return rule; + } + /** + * @param {!Element} props + * @return {!string} + */ + function getParagraphProperties(props) { + var rule = '', imageProps, url, element; + rule += applySimpleMapping(props, paragraphPropertySimpleMapping); + imageProps = props.getElementsByTagNameNS(stylens, 'background-image'); + if (imageProps.length > 0) { + url = imageProps.item(0).getAttributeNS(xlinkns, 'href'); + if (url) { + rule += "background-image: url('odfkit:" + url + "');"; + //rule += "background-repeat: repeat;"; //FIXME test + element = /**@type{!Element}*/(imageProps.item(0)); + rule += applySimpleMapping(element, bgImageSimpleMapping); + } + } + return rule; + } + /** + * @param {!Element} props + * @return {!string} + */ + function getGraphicProperties(props) { + var rule = ''; + rule += applySimpleMapping(props, graphicPropertySimpleMapping); + return rule; + } + /** + * @param {!Element} props + * @return {!string} + */ + function getTableCellProperties(props) { + var rule = ''; + rule += applySimpleMapping(props, tablecellPropertySimpleMapping); + return rule; + } + /** + * @param {!StyleSheet} sheet + * @param {!string} family + * @param {!string} name + * @param {!Element} node + * @return {undefined} + */ + function addStyleRule(sheet, family, name, node) { + var selectors = getSelectors(family, name, node), + selector = selectors.join(','), + rule = '', + properties = getDirectChild(node, stylens, 'text-properties'); + if (properties) { + rule += getTextProperties(properties); + } + properties = getDirectChild(node, stylens, 'paragraph-properties'); + if (properties) { + rule += getParagraphProperties(properties); + } + properties = getDirectChild(node, stylens, 'graphic-properties'); + if (properties) { + rule += getGraphicProperties(properties); + } + properties = getDirectChild(node, stylens, 'table-cell-properties'); + if (properties) { + rule += getTableCellProperties(properties); + } + if (rule.length === 0) { + return; + } + rule = selector + '{' + rule + '}'; + try { + sheet.insertRule(rule, sheet.cssRules.length); + } catch (e) { + throw e; + } + } + /** + * @param {!Element} node + * @return {!string} + */ + function getNumberRule(node) { + var style = node.getAttributeNS(stylens, "num-format"), + suffix = node.getAttributeNS(stylens, "num-suffix"), + prefix = node.getAttributeNS(stylens, "num-prefix"), + rule = "", + stylemap = {'1': 'decimal', 'a': 'lower-latin', 'A': 'upper-latin', + 'i': 'lower-roman', 'I': 'upper-roman'}, + content = ""; + content = prefix || ""; + if (stylemap.hasOwnProperty(style)) { + content += " counter(list, " + stylemap[style] + ")"; + } else if (style) { + content += "'" + style + "';"; + } else { + content += " ''"; + } + if (suffix) { + content += " '" + suffix + "'"; + } + rule = "content: " + content + ";"; + return rule; + } + /** + * @param {!Element} node + * @return {!string} + */ + function getImageRule(node) { + var rule = "content: none;"; + return rule; + } + /** + * @param {!Element} node + * @return {!string} + */ + function getBulletRule(node) { + var rule = "", + bulletChar = node.getAttributeNS(textns, "bullet-char"); + return "content: '" + bulletChar + "';"; + } + /** + * @param {!StyleSheet} sheet + * @param {!string} name + * @param {!Element} node + * @return {undefined} + */ + function addListStyleRule(sheet, name, node, itemrule) { + var selector = 'text|list[text|style-name="' + name + + '"]', + level = node.getAttributeNS(textns, "level"), + rule = ""; + level = level && parseInt(level, 10); + while (level > 1) { + selector += " > text|list-item > text|list"; + level -= 1; + } + selector += " > list-item:before"; + rule = itemrule; + rule = selector + '{' + rule + '}'; + try { + sheet.insertRule(rule, sheet.cssRules.length); + } catch (e) { + throw e; + } + } + /** + * @param {!StyleSheet} sheet + * @param {!string} name + * @param {!Element} node + * @return {undefined} + */ + function addListStyleRules(sheet, name, node) { + var n = node.firstChild, e, itemrule; + while (n) { + if (n.namespaceURI === textns) { + e = /**@type{!Element}*/(n); + if (n.localName === "list-level-style-number") { + itemrule = getNumberRule(e); + addListStyleRule(sheet, name, e, itemrule); + } else if (n.localName === "list-level-style-image") { + itemrule = getImageRule(e); + addListStyleRule(sheet, name, e, itemrule); + } else if (n.localName === "list-level-style-bullet") { + itemrule = getBulletRule(e); + addListStyleRule(sheet, name, e, itemrule); + } + } + n = n.nextSibling; + } + } + /** + * @param {!StyleSheet} sheet + * @param {!string} family + * @param {!string} name + * @param {!Element} node + * @return {undefined} + */ + function addRule(sheet, family, name, node) { + if (family === "list") { + addListStyleRules(sheet, name, node); + } else { + addStyleRule(sheet, family, name, node); + } + } + /** + * @param {!StyleSheet} sheet + * @param {!string} family + * @param {!string} name + * @param {!Element} node + * @return {undefined} + */ + function addRules(sheet, family, name, node) { + addRule(sheet, family, name, node); + var n; + for (n in node.derivedStyles) { + if (node.derivedStyles.hasOwnProperty(n)) { + addRules(sheet, family, n, node.derivedStyles[n]); + } + } + } + + // css vs odf styles + // ODF styles occur in families. A family is a group of odf elements to + // which an element applies. ODF families can be mapped to a group of css + // elements + + this.namespaces = namespaces; + this.namespaceResolver = namespaceResolver; + this.namespaceResolver.lookupNamespaceURI = this.namespaceResolver; + + /** + * @param {!StyleSheet} stylesheet + * @param {!Element} styles + * @param {!Element} autostyles + * @return {undefined} + */ + this.style2css = function (stylesheet, styles, autostyles) { + var doc, prefix, styletree, tree, name, rule, family, + stylenodes, styleautonodes; + // make stylesheet empty + while (stylesheet.cssRules.length) { + stylesheet.deleteRule(stylesheet.cssRules.length - 1); + } + doc = null; + if (styles) { + doc = styles.ownerDocument; + } + if (autostyles) { + doc = autostyles.ownerDocument; + } + if (!doc) { + return; + } + // add @namespace rules + for (prefix in namespaces) { + if (namespaces.hasOwnProperty(prefix)) { + rule = '@namespace ' + prefix + ' url(' + namespaces[prefix] + ');'; + try { + stylesheet.insertRule(rule, stylesheet.cssRules.length); + } catch (e) { + // WebKit can throw an exception here, but it will have + // retained the namespace declarations anyway. + } + } + } + + // add the various styles + stylenodes = getStyleMap(doc, styles); + styleautonodes = getStyleMap(doc, autostyles); + styletree = {}; + for (family in familynamespaceprefixes) { + if (familynamespaceprefixes.hasOwnProperty(family)) { + tree = styletree[family] = {}; + addStyleMapToStyleTree(stylenodes[family], tree); + addStyleMapToStyleTree(styleautonodes[family], tree); + + for (name in tree) { + if (tree.hasOwnProperty(name)) { + addRules(stylesheet, family, name, tree[name]); + } + } + } + } + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/odf/StyleInfo.js b/apps/files_odfviewer/src/webodf/webodf/lib/odf/StyleInfo.js new file mode 100644 index 0000000000..9b76d13bed --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/odf/StyleInfo.js @@ -0,0 +1,424 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global odf*/ +/** + * @constructor + */ +odf.StyleInfo = function StyleInfo() { + "use strict"; + // helper constants + var chartns = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0", + dbns = "urn:oasis:names:tc:opendocument:xmlns:database:1.0", + dr3dns = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0", + drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", + fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", + formns = "urn:oasis:names:tc:opendocument:xmlns:form:1.0", + numberns = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0", + officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", + presentationns = "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0", + stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", + svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", + tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", + textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", + elementstyles = { + "text": [ + { ens: stylens, en: 'tab-stop', ans: stylens, a: 'leader-text-style'}, + { ens: stylens, en: 'drop-cap', ans: stylens, a: 'style-name'}, + { ens: textns, en: 'notes-configuration', ans: textns, a: 'citation-body-style-name'}, + { ens: textns, en: 'notes-configuration', ans: textns, a: 'citation-style-name'}, + { ens: textns, en: 'a', ans: textns, a: 'style-name'}, + { ens: textns, en: 'alphabetical-index', ans: textns, a: 'style-name'}, + { ens: textns, en: 'linenumbering-configuration', ans: textns, a: 'style-name'}, + { ens: textns, en: 'list-level-style-number', ans: textns, a: 'style-name'}, + { ens: textns, en: 'ruby-text', ans: textns, a: 'style-name'}, + { ens: textns, en: 'span', ans: textns, a: 'style-name'}, + { ens: textns, en: 'a', ans: textns, a: 'visited-style-name'}, + { ens: stylens, en: 'text-properties', ans: stylens, a: 'text-line-through-text-style'}, + { ens: textns, en: 'alphabetical-index-source', ans: textns, a: 'main-entry-style-name'}, + { ens: textns, en: 'index-entry-bibliography', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-entry-chapter', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-entry-link-end', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-entry-link-start', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-entry-page-number', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-entry-span', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-entry-tab-stop', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-entry-text', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-title-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'list-level-style-bullet', ans: textns, a: 'style-name'}, + { ens: textns, en: 'outline-level-style', ans: textns, a: 'style-name'} + ], + "paragraph": [ + { ens: drawns, en: 'caption', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'circle', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'connector', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'control', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'custom-shape', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'ellipse', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'frame', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'line', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'measure', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'path', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'polygon', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'polyline', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'rect', ans: drawns, a: 'text-style-name'}, + { ens: drawns, en: 'regular-polygon', ans: drawns, a: 'text-style-name'}, + { ens: officens, en: 'annotation', ans: drawns, a: 'text-style-name'}, + { ens: formns, en: 'column', ans: formns, a: 'text-style-name'}, + { ens: stylens, en: 'style', ans: stylens, a: 'next-style-name'}, + { ens: tablens, en: 'body', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'even-columns', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'even-rows', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'first-column', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'first-row', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'last-column', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'last-row', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'odd-columns', ans: tablens, a: 'paragraph-style-name'}, + { ens: tablens, en: 'odd-rows', ans: tablens, a: 'paragraph-style-name'}, + { ens: textns, en: 'notes-configuration', ans: textns, a: 'default-style-name'}, + { ens: textns, en: 'alphabetical-index-entry-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'bibliography-entry-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'h', ans: textns, a: 'style-name'}, + { ens: textns, en: 'illustration-index-entry-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-source-style', ans: textns, a: 'style-name'}, + { ens: textns, en: 'object-index-entry-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'p', ans: textns, a: 'style-name'}, + { ens: textns, en: 'table-index-entry-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'table-of-content-entry-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'table-index-entry-template', ans: textns, a: 'style-name'}, + { ens: textns, en: 'user-index-entry-template', ans: textns, a: 'style-name'}, + { ens: stylens, en: 'page-layout-properties', ans: stylens, a: 'register-truth-ref-style-name'} + ], + "chart": [ + { ens: chartns, en: 'axis', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'chart', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'data-label', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'data-point', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'equation', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'error-indicator', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'floor', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'footer', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'grid', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'legend', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'mean-value', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'plot-area', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'regression-curve', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'series', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'stock-gain-marker', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'stock-loss-marker', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'stock-range-line', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'subtitle', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'title', ans: chartns, a: 'style-name'}, + { ens: chartns, en: 'wall', ans: chartns, a: 'style-name'} + ], + "section": [ + { ens: textns, en: 'alphabetical-index', ans: textns, a: 'style-name'}, + { ens: textns, en: 'bibliography', ans: textns, a: 'style-name'}, + { ens: textns, en: 'illustration-index', ans: textns, a: 'style-name'}, + { ens: textns, en: 'index-title', ans: textns, a: 'style-name'}, + { ens: textns, en: 'object-index', ans: textns, a: 'style-name'}, + { ens: textns, en: 'section', ans: textns, a: 'style-name'}, + { ens: textns, en: 'table-of-content', ans: textns, a: 'style-name'}, + { ens: textns, en: 'table-index', ans: textns, a: 'style-name'}, + { ens: textns, en: 'user-index', ans: textns, a: 'style-name'} + ], + "ruby": [ + { ens: textns, en: 'ruby', ans: textns, a: 'style-name'} + ], + "table": [ + { ens: dbns, en: 'query', ans: dbns, a: 'style-name'}, + { ens: dbns, en: 'table-representation', ans: dbns, a: 'style-name'}, + { ens: tablens, en: 'background', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'table', ans: tablens, a: 'style-name'} + ], + "table-column": [ + { ens: dbns, en: 'column', ans: dbns, a: 'style-name'}, + { ens: tablens, en: 'table-column', ans: tablens, a: 'style-name'} + ], + "table-row": [ + { ens: dbns, en: 'query', ans: dbns, a: 'default-row-style-name'}, + { ens: dbns, en: 'table-representation', ans: dbns, a: 'default-row-style-name'}, + { ens: tablens, en: 'table-row', ans: tablens, a: 'style-name'} + ], + "table-cell": [ + { ens: dbns, en: 'column', ans: dbns, a: 'default-cell-style-name'}, + { ens: tablens, en: 'table-column', ans: tablens, a: 'default-cell-style-name'}, + { ens: tablens, en: 'table-row', ans: tablens, a: 'default-cell-style-name'}, + { ens: tablens, en: 'body', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'covered-table-cell', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'even-columns', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'covered-table-cell', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'even-columns', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'even-rows', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'first-column', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'first-row', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'last-column', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'last-row', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'odd-columns', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'odd-rows', ans: tablens, a: 'style-name'}, + { ens: tablens, en: 'table-cell', ans: tablens, a: 'style-name'} + ], + "graphic": [ + { ens: dr3dns, en: 'cube', ans: drawns, a: 'style-name'}, + { ens: dr3dns, en: 'extrude', ans: drawns, a: 'style-name'}, + { ens: dr3dns, en: 'rotate', ans: drawns, a: 'style-name'}, + { ens: dr3dns, en: 'scene', ans: drawns, a: 'style-name'}, + { ens: dr3dns, en: 'sphere', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'caption', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'circle', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'connector', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'control', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'custom-shape', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'ellipse', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'frame', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'g', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'line', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'measure', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'page-thumbnail', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'path', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'polygon', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'polyline', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'rect', ans: drawns, a: 'style-name'}, + { ens: drawns, en: 'regular-polygon', ans: drawns, a: 'style-name'}, + { ens: officens, en: 'annotation', ans: drawns, a: 'style-name'} + ], + "presentation": [ + { ens: dr3dns, en: 'cube', ans: presentationns, a: 'style-name'}, + { ens: dr3dns, en: 'extrude', ans: presentationns, a: 'style-name'}, + { ens: dr3dns, en: 'rotate', ans: presentationns, a: 'style-name'}, + { ens: dr3dns, en: 'scene', ans: presentationns, a: 'style-name'}, + { ens: dr3dns, en: 'sphere', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'caption', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'circle', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'connector', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'control', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'custom-shape', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'ellipse', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'frame', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'g', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'line', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'measure', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'page-thumbnail', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'path', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'polygon', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'polyline', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'rect', ans: presentationns, a: 'style-name'}, + { ens: drawns, en: 'regular-polygon', ans: presentationns, a: 'style-name'}, + { ens: officens, en: 'annotation', ans: presentationns, a: 'style-name'} + ], + "drawing-page": [ + { ens: drawns, en: 'page', ans: drawns, a: 'style-name'}, + { ens: presentationns, en: 'notes', ans: drawns, a: 'style-name'}, + { ens: stylens, en: 'handout-master', ans: drawns, a: 'style-name'}, + { ens: stylens, en: 'master-page', ans: drawns, a: 'style-name'} + ], + "list-style": [ + { ens: textns, en: 'list', ans: textns, a: 'style-name'}, + { ens: textns, en: 'numbered-paragraph', ans: textns, a: 'style-name'}, + { ens: textns, en: 'list-item', ans: textns, a: 'style-override'}, + { ens: stylens, en: 'style', ans: stylens, a: 'list-style-name'}, + { ens: stylens, en: 'style', ans: stylens, a: 'data-style-name'}, + { ens: stylens, en: 'style', ans: stylens, a: 'percentage-data-style-name'}, + { ens: presentationns, en: 'date-time-decl', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'creation-date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'creation-time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'database-display', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'editing-duration', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'expression', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'meta-field', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'modification-date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'modification-time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'print-date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'print-time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'table-formula', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'user-defined', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'user-field-get', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'user-field-input', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'variable-get', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'variable-input', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'variable-set', ans: stylens, a: 'data-style-name'} + ], + "data": [ + { ens: stylens, en: 'style', ans: stylens, a: 'data-style-name'}, + { ens: stylens, en: 'style', ans: stylens, a: 'percentage-data-style-name'}, + { ens: presentationns, en: 'date-time-decl', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'creation-date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'creation-time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'database-display', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'editing-duration', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'expression', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'meta-field', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'modification-date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'modification-time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'print-date', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'print-time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'table-formula', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'time', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'user-defined', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'user-field-get', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'user-field-input', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'variable-get', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'variable-input', ans: stylens, a: 'data-style-name'}, + { ens: textns, en: 'variable-set', ans: stylens, a: 'data-style-name'} + ], + "page-layout": [ + { ens: presentationns, en: 'notes', ans: stylens, a: 'page-layout-name'}, + { ens: stylens, en: 'handout-master', ans: stylens, a: 'page-layout-name'}, + { ens: stylens, en: 'master-page', ans: stylens, a: 'page-layout-name'} + ] + }, + elements; + + /** + * Return if a particular element can have a style for a particular family. + * @param {!string} family + * @param {!Element} element + * @return {!boolean} + */ + function canElementHaveStyle(family, element) { + var elname = elements[element.localName], + elns = elname && elname[element.namespaceURI], + length = elns ? elns.length : 0, + i; + return elns && elns.length > 0; + } + + /** + * @param {!string} family + * @param {!Element} element + * @return {{name:string,family:string}|null} + */ + function getStyleRef(family, element) { + var elname = elements[element.localName], + elns = elname && elname[element.namespaceURI], + length = elns ? elns.length : 0, + i, attr; + for (i = 0; i < length; i += 1) { + attr = element.getAttributeNS(elns[i].ns, elns[i].localname); +/* + if (attr) { // a style has been found! + return attr; + } +*/ + } + return null; + } + + /** + * @param {!Element} element + * @param {!Object.>} keys + * @return {undefined} + */ + function getUsedStylesForAutomatic(element, keys) { + var elname = elements[element.localName], + elns = elname && elname[element.namespaceURI], + length = elns ? elns.length : 0, + i, attr, group, map, e; + for (i = 0; i < length; i += 1) { + attr = element.getAttributeNS(elns[i].ns, elns[i].localname); + if (attr) { // a style has been found! + group = elns[i].keygroup; + map = keys[group]; + if (!map) { + map = keys[group] = {}; + } + map[attr] = 1; + } + } + i = element.firstChild; + while (i) { + if (i.nodeType === 1) { + e = /**@type{!Element}*/(i); + getUsedStylesForAutomatic(e, keys); + } + i = i.nextSibling; + } + } + + /** + * @param {!Object.>>} elementstyles + */ + function inverse(elementstyles) { + var keyname, i, list, item, l, elements = {}, map, array; + for (keyname in elementstyles) { + if (elementstyles.hasOwnProperty(keyname)) { + list = elementstyles[keyname]; + l = list.length; + for (i = 0; i < l; i += 1) { + item = list[i]; + map = elements[item.en] = elements[item.en] || {}; + array = map[item.ens] = map[item.ens] || []; + array.push( + {ns: item.ans, localname: item.a, keygroup: keyname}); + } + } + } + return elements; + } + + /** + * @constructor + * @param {!Element} element + */ + this.UsedKeysList = function (element) { + var usedKeys = {}; + + /** + * @param {!Element} element + * @return {!boolean} + */ + this.uses = function (element) { + var localName = element.localName, + name = element.getAttributeNS(drawns, "name") || + element.getAttributeNS(stylens, "name"), + keyName, map; + if (localName === "style") { + keyName = element.getAttributeNS(stylens, "family"); + } else if (element.namespaceURI === numberns) { + keyName = "data"; + } else { + keyName = localName; // list-style or page-layout + } + map = usedKeys[keyName]; + return map ? (map[name] > 0) : false; + }; + + getUsedStylesForAutomatic(element, usedKeys); + }; + + this.canElementHaveStyle = canElementHaveStyle; + + elements = inverse(elementstyles); +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/packages.js b/apps/files_odfviewer/src/webodf/webodf/lib/packages.js new file mode 100644 index 0000000000..7277a833f9 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/packages.js @@ -0,0 +1,48 @@ +/** + * @license + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/** + * @namespace The core package. + */ +var core = {}; +/** + * @namespace The gui package. + */ +var gui = {}; +/** + * @namespace The xmldom package. + */ +var xmldom = {}; +/** + * @namespace The ODF package. + */ +var odf = {}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/runtime.js b/apps/files_odfviewer/src/webodf/webodf/lib/runtime.js new file mode 100644 index 0000000000..99ded6f1d3 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/runtime.js @@ -0,0 +1,1117 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*jslint nomen: true, evil: true, bitwise: true */ +/*global window: true, XMLHttpRequest: true, require: true, console: true, + process: true, __dirname: true, setTimeout: true, Packages: true, print: true, + readFile: true, quit: true, Buffer: true, ArrayBuffer: true, Uint8Array: true, + navigator: true, VBArray: true */ +/** + * Three implementations of a runtime for browser, node.js and rhino. + */ + +/** + * Abstraction of the runtime environment. + * @class + * @interface + */ +function Runtime() {"use strict"; } +/** + * Abstraction of byte arrays. + * @constructor + * @extends {Array} + * @param {!number} size + */ +Runtime.ByteArray = function (size) {"use strict"; }; +/** + * @param {!number} start + * @param {!number} end + * @return {!Runtime.ByteArray} + */ +Runtime.ByteArray.prototype.slice = function (start, end) {"use strict"; }; +/** + * @param {!Array.} array + * @return {!Runtime.ByteArray} + */ +Runtime.prototype.byteArrayFromArray = function (array) {"use strict"; }; +/** + * @param {!string} string + * @param {!string} encoding + * @return {!Runtime.ByteArray} + */ +Runtime.prototype.byteArrayFromString = function (string, encoding) {"use strict"; }; +/** + * @param {!Runtime.ByteArray} bytearray + * @param {!string} encoding + * @return {!string} + */ +Runtime.prototype.byteArrayToString = function (bytearray, encoding) {"use strict"; }; +/** + * @param {!Runtime.ByteArray} bytearray1 + * @param {!Runtime.ByteArray} bytearray2 + * @return {!Runtime.ByteArray} + */ +Runtime.prototype.concatByteArrays = function (bytearray1, bytearray2) {"use strict"; }; +/** + * @param {!string} path + * @param {!number} offset + * @param {!number} length + * @param {!function(string,Runtime.ByteArray):undefined} callback + * @return {undefined} + */ +Runtime.prototype.read = function (path, offset, length, callback) {"use strict"; }; +/** + * Read the contents of a file. Returns the result via a callback. If the + * encoding is 'binary', the result is returned as a Runtime.ByteArray, + * otherwise, it is returned as a string. + * @param {!string} path + * @param {!string} encoding text encoding or 'binary' + * @param {!function(string,(string|Runtime.ByteArray)):undefined} callback + * @return {undefined} + */ +Runtime.prototype.readFile = function (path, encoding, callback) {"use strict"; }; +/** + * @param {!string} path + * @param {!string} encoding text encoding or 'binary' + * @return {!string} + */ +Runtime.prototype.readFileSync = function (path, encoding) {"use strict"; }; +/** + * @param {!string} path + * @param {!function((string|Document)):undefined} callback + * @return {undefined} + */ +Runtime.prototype.loadXML = function (path, callback) {"use strict"; }; +/** + * @param {!string} path + * @param {!Runtime.ByteArray} data + * @param {!function(?string):undefined} callback + * @return {undefined} + */ +Runtime.prototype.writeFile = function (path, data, callback) {"use strict"; }; +/** + * @param {!string} path + * @param {!function(boolean):undefined} callback + * @return {undefined} + */ +Runtime.prototype.isFile = function (path, callback) {"use strict"; }; +/** + * @param {!string} path + * @param {!function(number):undefined} callback + * @return {undefined} + */ +Runtime.prototype.getFileSize = function (path, callback) {"use strict"; }; +/** + * @param {!string} path + * @param {!function(?string):undefined} callback + * @return {undefined} + */ +Runtime.prototype.deleteFile = function (path, callback) {"use strict"; }; +/** + * @param {!string} msgOrCategory + * @param {!string=} msg + * @return {undefined} + */ +Runtime.prototype.log = function (msgOrCategory, msg) {"use strict"; }; +/** + * @param {!function():undefined} callback + * @param {!number} milliseconds + * @return {undefined} + */ +Runtime.prototype.setTimeout = function (callback, milliseconds) {"use strict"; }; +/** + * @return {!Array.} + */ +Runtime.prototype.libraryPaths = function () {"use strict"; }; +/** + * @return {string} + */ +Runtime.prototype.type = function () {"use strict"; }; +/** + * @return {?DOMImplementation} + */ +Runtime.prototype.getDOMImplementation = function () {"use strict"; }; +/** + * @return {?Window} + */ +Runtime.prototype.getWindow = function () {"use strict"; }; + +/** @define {boolean} */ +var IS_COMPILED_CODE = false; + +/** + * @this {Runtime} + * @param {!Runtime.ByteArray} bytearray + * @param {!string} encoding + * @return {!string} + */ +Runtime.byteArrayToString = function (bytearray, encoding) { + "use strict"; + function byteArrayToString(bytearray) { + var s = "", i, l = bytearray.length; + for (i = 0; i < l; i += 1) { + s += String.fromCharCode(bytearray[i] & 0xff); + } + return s; + } + function utf8ByteArrayToString(bytearray) { + var s = "", i, l = bytearray.length, + c0, c1, c2; + for (i = 0; i < l; i += 1) { + c0 = bytearray[i]; + if (c0 < 0x80) { + s += String.fromCharCode(c0); + } else { + i += 1; + c1 = bytearray[i]; + if (c0 < 0xe0) { + s += String.fromCharCode(((c0 & 0x1f) << 6) | (c1 & 0x3f)); + } else { + i += 1; + c2 = bytearray[i]; + s += String.fromCharCode(((c0 & 0x0f) << 12) | + ((c1 & 0x3f) << 6) | (c2 & 0x3f)); + } + } + } + return s; + } + var result; + if (encoding === "utf8") { + result = utf8ByteArrayToString(bytearray); + } else { + if (encoding !== "binary") { + this.log("Unsupported encoding: " + encoding); + } + result = byteArrayToString(bytearray); + } + return result; +}; +Runtime.getFunctionName = function getFunctionName(f) { + "use strict"; + var m; + if (f.name === undefined) { + m = new RegExp("function\\s+(\\w+)").exec(f); + return m && m[1]; + } + return f.name; +}; +/** + * @class + * @constructor + * @augments Runtime + * @implements {Runtime} + * @param {Element} logoutput + */ +function BrowserRuntime(logoutput) { + "use strict"; + var self = this, + cache = {}, + useNativeArray = window.ArrayBuffer && window.Uint8Array; + /** + * @constructor + * @augments Runtime.ByteArray + * @inner + * @extends {Runtime.ByteArray} + * @param {!number} size + */ + this.ByteArray = (useNativeArray) + // if Uint8Array is available, use that + ? function ByteArray(size) { + Uint8Array.prototype.slice = function (begin, end) { + if (end === undefined) { + if (begin === undefined) { + begin = 0; + } + end = this.length; + } + var view = this.subarray(begin, end), array, i; + end -= begin; + array = new Uint8Array(new ArrayBuffer(end)); + for (i = 0; i < end; i += 1) { + array[i] = view[i]; + } + return array; + }; + return new Uint8Array(new ArrayBuffer(size)); + } + : function ByteArray(size) { + var a = []; + a.length = size; + return a; + }; + this.concatByteArrays = (useNativeArray) + ? function (bytearray1, bytearray2) { + var i, l1 = bytearray1.length, l2 = bytearray2.length, + a = new this.ByteArray(l1 + l2); + for (i = 0; i < l1; i += 1) { + a[i] = bytearray1[i]; + } + for (i = 0; i < l2; i += 1) { + a[i + l1] = bytearray2[i]; + } + return a; + } + : function (bytearray1, bytearray2) { + return bytearray1.concat(bytearray2); + }; + function utf8ByteArrayFromString(string) { + var l = string.length, bytearray, i, n, j = 0; + // first determine the length in bytes + for (i = 0; i < l; i += 1) { + n = string.charCodeAt(i); + j += 1 + (n > 0x80) + (n > 0x800); + } + // allocate a buffer and convert to a utf8 array + bytearray = new self.ByteArray(j); + j = 0; + for (i = 0; i < l; i += 1) { + n = string.charCodeAt(i); + if (n < 0x80) { + bytearray[j] = n; + j += 1; + } else if (n < 0x800) { + bytearray[j] = 0xc0 | (n >>> 6); + bytearray[j + 1] = 0x80 | (n & 0x3f); + j += 2; + } else { + bytearray[j] = 0xe0 | ((n >>> 12) & 0x0f); + bytearray[j + 1] = 0x80 | ((n >>> 6) & 0x3f); + bytearray[j + 2] = 0x80 | (n & 0x3f); + j += 3; + } + } + return bytearray; + } + function byteArrayFromString(string) { + // ignore encoding for now + var l = string.length, + a = new self.ByteArray(l), + i; + for (i = 0; i < l; i += 1) { + a[i] = string.charCodeAt(i) & 0xff; + } + return a; + } + this.byteArrayFromArray = function (array) { + return array.slice(); + }; + this.byteArrayFromString = function (string, encoding) { + var result; + if (encoding === "utf8") { + result = utf8ByteArrayFromString(string); + } else { + if (encoding !== "binary") { + self.log("unknown encoding: " + encoding); + } + result = byteArrayFromString(string); + } + return result; + }; + this.byteArrayToString = Runtime.byteArrayToString; + + /** + * @param {!string} msgOrCategory + * @param {string=} msg + * @return {undefined} + */ + function log(msgOrCategory, msg) { + var node, doc, category; + if (msg) { + category = msgOrCategory; + } else { + msg = msgOrCategory; + } + if (logoutput) { + doc = logoutput.ownerDocument; + if (category) { + node = doc.createElement("span"); + node.className = category; + node.appendChild(doc.createTextNode(category)); + logoutput.appendChild(node); + logoutput.appendChild(doc.createTextNode(" ")); + } + node = doc.createElement("span"); + node.appendChild(doc.createTextNode(msg)); + logoutput.appendChild(node); + logoutput.appendChild(doc.createElement("br")); + } else if (console) { + console.log(msg); + } + } + function readFile(path, encoding, callback) { + if (cache.hasOwnProperty(path)) { + callback(null, cache[path]); + return; + } + var xhr = new XMLHttpRequest(); + function handleResult() { + var data; + if (xhr.readyState === 4) { + if (xhr.status === 0 && !xhr.responseText) { + // for local files there is no difference between missing + // and empty files, so empty files are considered as errors + callback("File " + path + " is empty."); + } else if (xhr.status === 200 || xhr.status === 0) { + // report file + if (encoding === "binary") { + if (typeof VBArray !== "undefined") { // IE9 + data = new VBArray(xhr.responseBody).toArray(); + } else { + data = self.byteArrayFromString(xhr.responseText, + "binary"); + } + } else { + data = xhr.responseText; + } + cache[path] = data; + callback(null, data); + } else { + // report error + callback(xhr.responseText || xhr.statusText); + } + } + } + xhr.open('GET', path, true); + xhr.onreadystatechange = handleResult; + if (xhr.overrideMimeType) { + if (encoding !== "binary") { + xhr.overrideMimeType("text/plain; charset=" + encoding); + } else { + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + } + } + try { + xhr.send(null); + } catch (e) { + callback(e.message); + } + } + function read(path, offset, length, callback) { + if (cache.hasOwnProperty(path)) { + callback(null, cache[path].slice(offset, offset + length)); + return; + } + var xhr = new XMLHttpRequest(); + function handleResult() { + var data; + if (xhr.readyState === 4) { + if (xhr.status === 0 && !xhr.responseText) { + // for local files there is no difference between missing + // and empty files, so empty files are considered as errors + callback("File " + path + " is empty."); + } else if (xhr.status === 200 || xhr.status === 0) { + // report file + if (typeof VBArray !== "undefined") { + data = new VBArray(xhr.responseBody).toArray(); + } else { + data = self.byteArrayFromString(xhr.responseText, "binary"); + } + cache[path] = data; + callback(null, data.slice(offset, offset + length)); + } else { + // report error + callback(xhr.responseText || xhr.statusText); + } + } + } + xhr.open('GET', path, true); + xhr.onreadystatechange = handleResult; + if (xhr.overrideMimeType) { + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + } + //xhr.setRequestHeader('Range', 'bytes=' + offset + '-' + + // (offset + length - 1)); + try { + xhr.send(null); + } catch (e) { + callback(e.message); + } + } + function readFileSync(path, encoding) { + var xhr = new XMLHttpRequest(), + result; + xhr.open('GET', path, false); + if (xhr.overrideMimeType) { + if (encoding !== "binary") { + xhr.overrideMimeType("text/plain; charset=" + encoding); + } else { + xhr.overrideMimeType("text/plain; charset=x-user-defined"); + } + } + try { + xhr.send(null); + if (xhr.status === 200 || xhr.status === 0) { + result = xhr.responseText; + } + } catch (e) { + } + return result; + } + function writeFile(path, data, callback) { + cache[path] = data; + var xhr = new XMLHttpRequest(); + function handleResult() { + if (xhr.readyState === 4) { + if (xhr.status === 0 && !xhr.responseText) { + // for local files there is no difference between missing + // and empty files, so empty files are considered as errors + callback("File " + path + " is empty."); + } else if ((xhr.status >= 200 && xhr.status < 300) || + xhr.status === 0) { + // report success + callback(null); + } else { + // report error + callback("Status " + String(xhr.status) + ": " + + xhr.responseText || xhr.statusText); + } + } + } + xhr.open('PUT', path, true); + xhr.onreadystatechange = handleResult; + // ArrayBufferView will have an ArrayBuffer property, in WebKit, XHR can send() + // an ArrayBuffer, In Firefox, one must use sendAsBinary with a string + if (data.buffer && !xhr.sendAsBinary) { + data = data.buffer; // webkit supports sending an ArrayBuffer + } else { + // encode into a string, this works in FireFox >= 3 + data = self.byteArrayToString(data, "binary"); + } + try { + if (xhr.sendAsBinary) { + xhr.sendAsBinary(data); + } else { + xhr.send(data); + } + } catch (e) { + self.log("HUH? " + e + " " + data); + callback(e.message); + } + } + function deleteFile(path, callback) { + var xhr = new XMLHttpRequest(); + xhr.open('DELETE', path, true); + xhr.onreadystatechange = function () { + if (xhr.readyState === 4) { + if (xhr.status < 200 && xhr.status >= 300) { + callback(xhr.responseText); + } else { + callback(null); + } + } + }; + xhr.send(null); + } + function loadXML(path, callback) { + var xhr = new XMLHttpRequest(); + function handleResult() { + if (xhr.readyState === 4) { + if (xhr.status === 0 && !xhr.responseText) { + callback("File " + path + " is empty."); + } else if (xhr.status === 200 || xhr.status === 0) { + // report file + callback(null, xhr.responseXML); + } else { + // report error + callback(xhr.responseText); + } + } + } + xhr.open("GET", path, true); + if (xhr.overrideMimeType) { + xhr.overrideMimeType("text/xml"); + } + xhr.onreadystatechange = handleResult; + try { + xhr.send(null); + } catch (e) { + callback(e.message); + } + } + function isFile(path, callback) { + self.getFileSize(path, function (size) { + callback(size !== -1); + }); + } + function getFileSize(path, callback) { + var xhr = new XMLHttpRequest(); + xhr.open("HEAD", path, true); + xhr.onreadystatechange = function () { + if (xhr.readyState !== 4) { + return; + } + var cl = xhr.getResponseHeader("Content-Length"); + if (cl) { + callback(parseInt(cl, 10)); + } else { + callback(-1); + } + }; + xhr.send(null); + } + function wrap(nativeFunction, nargs) { + if (!nativeFunction) { + return null; + } + return function () { + // clear cache + cache = {}; + // assume the last argument is a callback function + var callback = arguments[nargs], + args = Array.prototype.slice.call(arguments, 0, nargs), + callbackname = "callback" + String(Math.random()).substring(2); + window[callbackname] = function () { + delete window[callbackname]; + callback.apply(this, arguments); + }; + args.push(callbackname); + nativeFunction.apply(this, args); + }; + } + this.readFile = readFile; + this.read = read; + this.readFileSync = readFileSync; + this.writeFile = writeFile; + this.deleteFile = deleteFile; + this.loadXML = loadXML; + this.isFile = isFile; + this.getFileSize = getFileSize; + this.log = log; + this.setTimeout = function (f, msec) { + setTimeout(function () { + f(); + }, msec); + }; + this.libraryPaths = function () { + return ["lib"]; // TODO: find a good solution + // probably let html app specify it + }; + this.setCurrentDirectory = function (dir) { + }; + this.type = function () { + return "BrowserRuntime"; + }; + this.getDOMImplementation = function () { + return window.document.implementation; + }; + this.exit = function (exitCode) { + log("Calling exit with code " + String(exitCode) + + ", but exit() is not implemented."); + }; + this.getWindow = function () { + return window; + }; +} + +/** + * @constructor + * @implements {Runtime} + */ +function NodeJSRuntime() { + "use strict"; + var self = this, + fs = require('fs'), + currentDirectory = ""; + + /** + * @constructor + * @extends {Runtime.ByteArray} + * @param {!number} size + */ + this.ByteArray = function (size) { + return new Buffer(size); + }; + + this.byteArrayFromArray = function (array) { + var ba = new Buffer(array.length), + i, + l = array.length; + for (i = 0; i < l; i += 1) { + ba[i] = array[i]; + } + return ba; + }; + + this.concatByteArrays = function (a, b) { + var ba = new Buffer(a.length + b.length); + a.copy(ba, 0, 0); + b.copy(ba, a.length, 0); + return ba; + }; + + this.byteArrayFromString = function (string, encoding) { + return new Buffer(string, encoding); + }; + + this.byteArrayToString = function (bytearray, encoding) { + return bytearray.toString(encoding); + }; + + function isFile(path, callback) { + if (currentDirectory) { + path = currentDirectory + "/" + path; + } + fs.stat(path, function (err, stats) { + callback(!err && stats.isFile()); + }); + } + function loadXML(path, callback) { + throw "Not implemented."; + } + this.readFile = function (path, encoding, callback) { + if (encoding !== "binary") { + fs.readFile(path, encoding, callback); + } else { + fs.readFile(path, null, callback); +/* + // we have to encode the returned buffer to a string + // it would be nice if we would have a blob or buffer object + fs.readFile(path, null, function (err, data) { + if (err) { + callback(err); + return; + } + callback(null, data.toString("binary")); + }); +*/ + } + }; + this.writeFile = function (path, data, callback) { + fs.writeFile(path, data, "binary", function (err) { + callback(err || null); + }); + }; + this.deleteFile = fs.unlink; + this.read = function (path, offset, length, callback) { + if (currentDirectory) { + path = currentDirectory + "/" + path; + } + fs.open(path, "r+", 666, function (err, fd) { + if (err) { + callback(err); + return; + } + var buffer = new Buffer(length); + fs.read(fd, buffer, 0, length, offset, function (err, bytesRead) { + fs.close(fd); + callback(err, buffer); + }); + }); + }; + this.readFileSync = function (path, encoding) { + if (!encoding) { + return ""; + } + return fs.readFileSync(path, encoding); + }; + this.loadXML = loadXML; + this.isFile = isFile; + this.getFileSize = function (path, callback) { + if (currentDirectory) { + path = currentDirectory + "/" + path; + } + fs.stat(path, function (err, stats) { + if (err) { + callback(-1); + } else { + callback(stats.size); + } + }); + }; + this.log = function (msg) { + process.stderr.write(msg + '\n'); + }; + this.setTimeout = function (f, msec) { + setTimeout(function () { + f(); + }, msec); + }; + this.libraryPaths = function () { + return [__dirname]; + }; + this.setCurrentDirectory = function (dir) { + currentDirectory = dir; + }; + this.currentDirectory = function () { + return currentDirectory; + }; + this.type = function () { + return "NodeJSRuntime"; + }; + this.getDOMImplementation = function () { + return null; + }; + this.exit = process.exit; + this.getWindow = function () { + return null; + }; +} + +/** + * @constructor + * @implements {Runtime} + */ +function RhinoRuntime() { + "use strict"; + var self = this, + dom = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(), + builder, + entityresolver, + currentDirectory = ""; + dom.setValidating(false); + dom.setNamespaceAware(true); + dom.setExpandEntityReferences(false); + dom.setSchema(null); + entityresolver = Packages.org.xml.sax.EntityResolver({ + resolveEntity: function (publicId, systemId) { + var file, open = function (path) { + var reader = new Packages.java.io.FileReader(path), + source = new Packages.org.xml.sax.InputSource(reader); + return source; + }; + file = systemId; + //file = /[^\/]*$/.exec(systemId); // what should this do? + return open(file); + } + }); + //dom.setEntityResolver(entityresolver); + builder = dom.newDocumentBuilder(); + builder.setEntityResolver(entityresolver); + + /** + * @constructor + * @param {!number} size + */ + this.ByteArray = function ByteArray(size) { + return [size]; + }; + this.byteArrayFromArray = function (array) { + return array; + }; + this.byteArrayFromString = function (string, encoding) { + // ignore encoding for now + var a = [], i, l = string.length; + for (i = 0; i < l; i += 1) { + a[i] = string.charCodeAt(i) & 0xff; + } + return a; + }; + this.byteArrayToString = Runtime.byteArrayToString; + this.concatByteArrays = function (bytearray1, bytearray2) { + return bytearray1.concat(bytearray2); + }; + + function loadXML(path, callback) { + var file = new Packages.java.io.File(path), + document; + try { + document = builder.parse(file); + } catch (err) { + print(err); + callback(err); + return; + } + callback(null, document); + } + function runtimeReadFile(path, encoding, callback) { + var file = new Packages.java.io.File(path), + data, + // read binary, seems hacky but works + rhinoencoding = (encoding === "binary") ? "latin1" : encoding; + if (!file.isFile()) { + callback(path + " is not a file."); + } else { + data = readFile(path, rhinoencoding); + if (encoding === "binary") { + data = self.byteArrayFromString(data, "binary"); + } + callback(null, data); + } + } + /** + * @param {!string} path + * @param {!string} encoding + * @return {?string} + */ + function runtimeReadFileSync(path, encoding) { + var file = new Packages.java.io.File(path), data, i; + if (!file.isFile()) { + return null; + } + if (encoding === "binary") { + encoding = "latin1"; // read binary, seems hacky but works + } + return readFile(path, encoding); + } + function isFile(path, callback) { + if (currentDirectory) { + path = currentDirectory + "/" + path; + } + var file = new Packages.java.io.File(path); + callback(file.isFile()); + } + this.loadXML = loadXML; + this.readFile = runtimeReadFile; + this.writeFile = function (path, data, callback) { + var out = new Packages.java.io.FileOutputStream(path), + i, + l = data.length; + for (i = 0; i < l; i += 1) { + out.write(data[i]); + } + out.close(); + callback(null); + }; + this.deleteFile = function (path, callback) { + var file = new Packages.java.io.File(path); + if (file['delete']()) { + callback(null); + } else { + callback("Could not delete " + path); + } + }; + this.read = function (path, offset, length, callback) { + // TODO: adapt to read only a part instead of the whole file + if (currentDirectory) { + path = currentDirectory + "/" + path; + } + var data = runtimeReadFileSync(path, "binary"); + if (data) { + callback(null, this.byteArrayFromString( + data.substring(offset, offset + length), + "binary" + )); + } else { + callback("Cannot read " + path); + } + }; + this.readFileSync = function (path, encoding) { + if (!encoding) { + return ""; + } + return readFile(path, encoding); + }; + this.isFile = isFile; + this.getFileSize = function (path, callback) { + if (currentDirectory) { + path = currentDirectory + "/" + path; + } + var file = new Packages.java.io.File(path); + callback(file.length()); + }; + this.log = print; + this.setTimeout = function (f, msec) { + f(); + }; + this.libraryPaths = function () { + return ["lib"]; + }; + this.setCurrentDirectory = function (dir) { + currentDirectory = dir; + }; + this.currentDirectory = function () { + return currentDirectory; + }; + this.type = function () { + return "RhinoRuntime"; + }; + this.getDOMImplementation = function () { + return builder.getDOMImplementation(); + }; + this.exit = quit; + this.getWindow = function () { + return null; + }; +} + +/** + * @const + * @type {Runtime} + */ +var runtime = (function () { + "use strict"; + var result; + if (typeof window !== "undefined") { + result = new BrowserRuntime(window.document.getElementById("logoutput")); + } else if (typeof require !== "undefined") { + result = new NodeJSRuntime(); + } else { + result = new RhinoRuntime(); + } + return result; +}()); +/*jslint sloppy: true*/ +(function () { + var cache = {}, + dircontents = {}; + function getOrDefinePackage(packageNameComponents) { + var topname = packageNameComponents[0], + i, + pkg; + // ensure top level package exists + pkg = eval("if (typeof " + topname + " === 'undefined') {" + + "eval('" + topname + " = {};');}" + topname); + for (i = 1; i < packageNameComponents.length - 1; i += 1) { + if (!pkg.hasOwnProperty(packageNameComponents[i])) { + pkg = pkg[packageNameComponents[i]] = {}; + } + } + return pkg[packageNameComponents[packageNameComponents.length - 1]]; + } + /** + * @param {string} classpath + * @returns {undefined} + */ + runtime.loadClass = function (classpath) { + if (IS_COMPILED_CODE) { + return; + } + if (cache.hasOwnProperty(classpath)) { + return; + } + var names = classpath.split("."), + impl; + impl = getOrDefinePackage(names); + if (impl) { + cache[classpath] = true; + return; + } + function getPathFromManifests(classpath) { + var path = classpath.replace(".", "/") + ".js", + dirs = runtime.libraryPaths(), + i, + dir, + code; + if (runtime.currentDirectory) { + dirs.push(runtime.currentDirectory()); + } + for (i = 0; i < dirs.length; i += 1) { + dir = dirs[i]; + if (!dircontents.hasOwnProperty(dir)) { + code = runtime.readFileSync(dirs[i] + "/manifest.js", + "utf8"); + if (code && code.length) { + try { + dircontents[dir] = eval(code); + } catch (e1) { + dircontents[dir] = null; + runtime.log("Cannot load manifest for " + dir + + "."); + } + } else { + dircontents[dir] = null; + } + } + code = null; + dir = dircontents[dir]; + if (dir && dir.indexOf && dir.indexOf(path) !== -1) { + return dirs[i] + "/" + path; + } + } + return null; + } + function load(classpath) { + var code, path; + path = getPathFromManifests(classpath); + if (!path) { + throw classpath + " is not listed in any manifest.js."; + } + try { + code = runtime.readFileSync(path, "utf8"); + } catch (e2) { + runtime.log("Error loading " + classpath + " " + e2); + throw e2; + } + if (code === undefined) { + throw "Cannot load class " + classpath; + } + try { + code = eval(classpath + " = eval(code);"); + } catch (e4) { + runtime.log("Error loading " + classpath + " " + e4); + throw e4; + } + return code; + } + // check if the class in context already + impl = load(classpath); + if (!impl || Runtime.getFunctionName(impl) !== + names[names.length - 1]) { + runtime.log("Loaded code is not for " + names[names.length - 1]); + throw "Loaded code is not for " + names[names.length - 1]; + } + cache[classpath] = true; + }; +}()); +(function (args) { + args = Array.prototype.slice.call(args); + function run(argv) { + if (!argv.length) { + return; + } + var script = argv[0]; + runtime.readFile(script, "utf8", function (err, code) { + var path = "", + paths = runtime.libraryPaths(); + if (script.indexOf("/") !== -1) { + path = script.substring(0, script.indexOf("/")); + } + runtime.setCurrentDirectory(path); + function run() { + var script, path, paths, args, argv, result; // hide variables + // execute script and make arguments available via argv + result = eval(code); + if (result) { + runtime.exit(result); + } + return; + } + if (err) { + runtime.log(err); + runtime.exit(1); + } else { + // run the script with arguments bound to arguments parameter + run.apply(null, argv); + } + }); + } + // if rhino or node.js, run the scripts provided as arguments + if (runtime.type() === "NodeJSRuntime") { + run(process.argv.slice(2)); + } else if (runtime.type() === "RhinoRuntime") { + run(args); + } else { + run(args.slice(1)); + } +}(typeof arguments !== "undefined" && arguments)); + diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializer.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializer.js new file mode 100644 index 0000000000..12b3219f81 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializer.js @@ -0,0 +1,197 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global xmldom*/ +/*jslint sub: true*/ +if (typeof Object.create !== 'function') { + Object['create'] = function (o) { + "use strict"; + /** + * @constructor + */ + var F = function () {}; + F.prototype = o; + return new F(); + }; +} + +/** + * Partial implementation of LSSerializer + * @constructor + */ +xmldom.LSSerializer = function LSSerializer() { + "use strict"; + var /**@const@type{!LSSerializer}*/ self = this; + + /** + * @param {!string} prefix + * @param {!Attr} attr + * @return {!string} + */ + function serializeAttribute(prefix, attr) { + var /**@type{!string}*/ s = prefix + attr.localName + "=\"" + + attr.nodeValue + "\""; + return s; + } + /** + * @param {!Object.} nsmap + * @param {string} prefix + * @param {string} ns + * @return {!string} + */ + function attributePrefix(nsmap, prefix, ns) { + // TODO: check for double prefix definitions, this needs a special class + if (nsmap.hasOwnProperty(ns)) { + return nsmap[ns] + ":"; + } + if (nsmap[ns] !== prefix) { + nsmap[ns] = prefix; + } + return prefix + ":"; + } + /** + * @param {!Object.} nsmap + * @param {!Node} node + * @return {!string} + */ + function startNode(nsmap, node) { + var /**@type{!string}*/ s = "", + /**@const@type{!NamedNodeMap}*/ atts = node.attributes, + /**@const@type{!number}*/ length, + /**@type{!number}*/ i, + /**@type{!Attr}*/ attr, + /**@type{!string}*/ attstr = "", + /**@type{!number}*/ accept, + /**@type{!string}*/ prefix; + if (atts) { // ELEMENT + if (nsmap[node.namespaceURI] !== node.prefix) { + nsmap[node.namespaceURI] = node.prefix; + } + s += "<" + node.nodeName; + length = atts.length; + for (i = 0; i < length; i += 1) { + attr = /**@type{!Attr}*/(atts.item(i)); + if (attr.namespaceURI !== "http://www.w3.org/2000/xmlns/") { + accept = (self.filter) ? self.filter.acceptNode(attr) : 1; + if (accept === 1) { + // xml attributes always need a prefix for a namespace + if (attr.namespaceURI) { + prefix = attributePrefix(nsmap, attr.prefix, + attr.namespaceURI); + } else { + prefix = ""; + } + attstr += " " + serializeAttribute(prefix, attr); + } + } + } + for (i in nsmap) { + if (nsmap.hasOwnProperty(i)) { + prefix = nsmap[i]; + if (!prefix) { + s += " xmlns=\"" + i + "\""; + } else if (prefix !== "xmlns") { + s += " xmlns:" + nsmap[i] + "=\"" + i + "\""; + } + } + } + s += attstr + ">"; + } + return s; + } + /** + * @param {!Node} node + * @return {!string} + */ + function endNode(node) { + var /**@type{!string}*/ s = ""; + if (node.nodeType === 1) { // ELEMENT + s += ""; + } + return s; + } + /** + * @param {!Object.} parentnsmap + * @param {!Node} node + * @return {!string} + */ + function serializeNode(parentnsmap, node) { + var /**@type{!string}*/ s = "", + /**@const@type{!Object.}*/ nsmap + = Object.create(parentnsmap), + /**@const@type{!number}*/ accept + = (self.filter) ? self.filter.acceptNode(node) : 1, + /**@type{Node}*/child; + if (accept === 1) { + s += startNode(nsmap, node); + } + if (accept === 1 || accept === 3) { + child = node.firstChild; + while (child) { + s += serializeNode(nsmap, child); + child = child.nextSibling; + } + if (node.nodeValue) { + s += node.nodeValue; + } + } + if (accept === 1) { + s += endNode(node); + } + return s; + } + function invertMap(map) { + var m = {}, i; + for (i in map) { + if (map.hasOwnProperty(i)) { + m[map[i]] = i; + } + } + return m; + } + /** + * @type {xmldom.LSSerializerFilter} + */ + this.filter = null; + /** + * @param {!Node} node + * @param {!Object.} nsmap + * @return {!string} + */ + this.writeToString = function (node, nsmap) { + if (!node) { + return ""; + } + nsmap = nsmap ? invertMap(nsmap) : {}; + return serializeNode(nsmap, node); + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializerFilter.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializerFilter.js new file mode 100644 index 0000000000..889428b831 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/LSSerializerFilter.js @@ -0,0 +1,40 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global xmldom*/ +/** + * Partial implementation of LSSerializerFilter + * @interface + */ +xmldom.LSSerializerFilter = function LSSerializerFilter() { + "use strict"; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformDOM.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformDOM.js new file mode 100644 index 0000000000..5e9f3abacf --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformDOM.js @@ -0,0 +1,115 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global xmldom*/ +/** + * @class + * @constructor + * @augments xmldom.OperationalTransformInterface + * @implements {xmldom.OperationalTransformInterface} + * @param {Element} root + * @param {xmldom.LSSerializer} serializer + */ +xmldom.OperationalTransformDOM = function OperationalTransformDOM(root, serializer) { + "use strict"; + var pos, length; + /** + * Skip in the document + * @param {!number} amount + * @return {undefined} + */ + function retain(amount) {} + /** + * Insert characters + * Can throw an exception if the current position does not allow insertion + * of characters. + * @param {!string} chars + * @return {undefined} + */ + function insertCharacters(chars) {} + /** + * Insert element start + * @param {!string} tagname + * @param {!Object} attributes + * @return {undefined} + */ + function insertElementStart(tagname, attributes) {} + /** + * Insert element end + * @return {undefined} + */ + function insertElementEnd() {} + /** + * Delete characters + * @param {!number} amount + * @return {undefined} + */ + function deleteCharacters(amount) {} + /** + * Delete element start + * @return {undefined} + */ + function deleteElementStart() {} + /** + * Delete element end + * @return {undefined} + */ + function deleteElementEnd() {} + /** + * Replace attributes + * @param {!Object} atts + * @return {undefined} + */ + function replaceAttributes(atts) {} + /** + * Update attributes + * @param {!Object} atts + * @return {undefined} + */ + function updateAttributes(atts) {} + /** + * @return {!boolean} + */ + function atEnd() { + return pos === length; + } + this.retain = retain; + this.insertCharacters = insertCharacters; + this.insertElementStart = insertElementStart; + this.insertElementEnd = insertElementEnd; + this.deleteCharacters = deleteCharacters; + this.deleteElementStart = deleteElementStart; + this.deleteElementEnd = deleteElementEnd; + this.replaceAttributes = replaceAttributes; + this.updateAttributes = updateAttributes; + this.atEnd = atEnd; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformInterface.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformInterface.js new file mode 100644 index 0000000000..03aab1232b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/OperationalTransformInterface.js @@ -0,0 +1,97 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global xmldom*/ +/** + * This interface allows a document to be modified by operational + * transformations. The interface is modelled after Google Wave. + * Manual editing of XML documents will also be done via this interface. + * + * + * @class + * @interface + */ +xmldom.OperationalTransformInterface = function () {"use strict"; }; +/** + * Skip in the document + * @param {!number} amount + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.retain = function (amount) {"use strict"; }; +/** + * Insert characters + * Can throw an exception if the current position does not allow insertion of + * characters. + * @param {!string} chars + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.insertCharacters = function (chars) {"use strict"; }; +/** + * Insert element start + * @param {!string} tagname + * @param {!Object} attributes + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.insertElementStart = function (tagname, attributes) {"use strict"; }; +/** + * Insert element end + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.insertElementEnd = function () {"use strict"; }; +/** + * Delete characters + * @param {!number} amount + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.deleteCharacters = function (amount) {"use strict"; }; +/** + * Delete element start + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.deleteElementStart = function () {"use strict"; }; +/** + * Delete element end + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.deleteElementEnd = function () {"use strict"; }; +/** + * Replace attributes + * @param {!Object} atts + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.replaceAttributes = function (atts) {"use strict"; }; +/** + * Update attributes + * @param {!Object} atts + * @return {undefined} + */ +xmldom.OperationalTransformInterface.prototype.updateAttributes = function (atts) {"use strict"; }; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG.js new file mode 100644 index 0000000000..e04c3c7611 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG.js @@ -0,0 +1,691 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, xmldom: true*/ + +/** + * RelaxNG can check a DOM tree against a Relax NG schema + * The RelaxNG implementation is currently not complete. Relax NG should not + * report errors on valid DOM trees, but it will not check all constraints that + * a Relax NG file can define. The current implementation does not load external + * parts of a Relax NG file. + * The main purpose of this Relax NG engine is to validate runtime ODF + * documents. The DOM tree is traversed via a TreeWalker. A custom TreeWalker + * implementation can hide parts of a DOM tree. This is useful in WebODF, where + * special elements and attributes in the runtime DOM tree. + * + * implementation according to + * http://www.thaiopensource.com/relaxng/derivative.html + */ +runtime.loadClass("xmldom.RelaxNGParser"); +/** + * @constructor + */ +xmldom.RelaxNG = function RelaxNG() { + "use strict"; + var xmlnsns = "http://www.w3.org/2000/xmlns/", + createChoice, + createInterleave, + createGroup, + createAfter, + createOneOrMore, + createValue, + createAttribute, + createNameClass, + createData, + makePattern, + notAllowed = { + type: "notAllowed", + nullable: false, + hash: "notAllowed", + textDeriv: function () { return notAllowed; }, + startTagOpenDeriv: function () { return notAllowed; }, + attDeriv: function () { return notAllowed; }, + startTagCloseDeriv: function () { return notAllowed; }, + endTagDeriv: function () { return notAllowed; } + }, + empty = { + type: "empty", + nullable: true, + hash: "empty", + textDeriv: function () { return notAllowed; }, + startTagOpenDeriv: function () { return notAllowed; }, + attDeriv: function (context, attribute) { return notAllowed; }, + startTagCloseDeriv: function () { return empty; }, + endTagDeriv: function () { return notAllowed; } + }, + text = { + type: "text", + nullable: true, + hash: "text", + textDeriv: function () { return text; }, + startTagOpenDeriv: function () { return notAllowed; }, + attDeriv: function () { return notAllowed; }, + startTagCloseDeriv: function () { return text; }, + endTagDeriv: function () { return notAllowed; } + }, + applyAfter, + childDeriv, + rootPattern; + + function memoize0arg(func) { + return (function () { + var cache; + return function () { + if (cache === undefined) { + cache = func(); + } + return cache; + }; + }()); + } + function memoize1arg(type, func) { + return (function () { + var cache = {}, cachecount = 0; + return function (a) { + var ahash = a.hash || a.toString(), + v; + v = cache[ahash]; + if (v !== undefined) { + return v; + } + cache[ahash] = v = func(a); + v.hash = type + cachecount.toString(); + cachecount += 1; + return v; + }; + }()); + } + function memoizeNode(func) { + return (function () { + var cache = {}; + return function (node) { + var v, m; + m = cache[node.localName]; + if (m === undefined) { + cache[node.localName] = m = {}; + } else { + v = m[node.namespaceURI]; + if (v !== undefined) { + return v; + } + } + m[node.namespaceURI] = v = func(node); + return v; + }; + }()); + } + function memoize2arg(type, fastfunc, func) { + return (function () { + var cache = {}, cachecount = 0; + return function (a, b) { + var v = fastfunc && fastfunc(a, b), + ahash, bhash, m; + if (v !== undefined) { return v; } + ahash = a.hash || a.toString(); + bhash = b.hash || b.toString(); + m = cache[ahash]; + if (m === undefined) { + cache[ahash] = m = {}; + } else { + v = m[bhash]; + if (v !== undefined) { + return v; + } + } + m[bhash] = v = func(a, b); + v.hash = type + cachecount.toString(); + cachecount += 1; + return v; + }; + }()); + } + // this memoize function can be used for functions where the order of two + // arguments is not important + function unorderedMemoize2arg(type, fastfunc, func) { + return (function () { + var cache = {}, cachecount = 0; + return function (a, b) { + var v = fastfunc && fastfunc(a, b), + ahash, bhash, m; + if (v !== undefined) { return v; } + ahash = a.hash || a.toString(); + bhash = b.hash || b.toString(); + if (ahash < bhash) { + m = ahash; ahash = bhash; bhash = m; + m = a; a = b; b = m; + } + m = cache[ahash]; + if (m === undefined) { + cache[ahash] = m = {}; + } else { + v = m[bhash]; + if (v !== undefined) { + return v; + } + } + m[bhash] = v = func(a, b); + v.hash = type + cachecount.toString(); + cachecount += 1; + return v; + }; + }()); + } + function getUniqueLeaves(leaves, pattern) { + if (pattern.p1.type === "choice") { + getUniqueLeaves(leaves, pattern.p1); + } else { + leaves[pattern.p1.hash] = pattern.p1; + } + if (pattern.p2.type === "choice") { + getUniqueLeaves(leaves, pattern.p2); + } else { + leaves[pattern.p2.hash] = pattern.p2; + } + } + createChoice = memoize2arg("choice", function (p1, p2) { + if (p1 === notAllowed) { return p2; } + if (p2 === notAllowed) { return p1; } + if (p1 === p2) { return p1; } + }, function (p1, p2) { + function makeChoice(p1, p2) { + return { + type: "choice", + p1: p1, + p2: p2, + nullable: p1.nullable || p2.nullable, + textDeriv: function (context, text) { + return createChoice(p1.textDeriv(context, text), + p2.textDeriv(context, text)); + }, + startTagOpenDeriv: memoizeNode(function (node) { + return createChoice(p1.startTagOpenDeriv(node), + p2.startTagOpenDeriv(node)); + }), + attDeriv: function (context, attribute) { + return createChoice(p1.attDeriv(context, attribute), + p2.attDeriv(context, attribute)); + }, + startTagCloseDeriv: memoize0arg(function () { + return createChoice(p1.startTagCloseDeriv(), + p2.startTagCloseDeriv()); + }), + endTagDeriv: memoize0arg(function () { + return createChoice(p1.endTagDeriv(), p2.endTagDeriv()); + }) + }; + } + var leaves = {}, i; + getUniqueLeaves(leaves, {p1: p1, p2: p2}); + p1 = undefined; + p2 = undefined; + for (i in leaves) { + if (leaves.hasOwnProperty(i)) { + if (p1 === undefined) { + p1 = leaves[i]; + } else if (p2 === undefined) { + p2 = leaves[i]; + } else { + p2 = createChoice(p2, leaves[i]); + } + } + } + return makeChoice(p1, p2); + }); + createInterleave = unorderedMemoize2arg("interleave", function (p1, p2) { + if (p1 === notAllowed || p2 === notAllowed) { return notAllowed; } + if (p1 === empty) { return p2; } + if (p2 === empty) { return p1; } + }, function (p1, p2) { + return { + type: "interleave", + p1: p1, + p2: p2, + nullable: p1.nullable && p2.nullable, + textDeriv: function (context, text) { + return createChoice( + createInterleave(p1.textDeriv(context, text), p2), + createInterleave(p1, p2.textDeriv(context, text)) + ); + }, + startTagOpenDeriv: memoizeNode(function (node) { + return createChoice( + applyAfter(function (p) { return createInterleave(p, p2); }, + p1.startTagOpenDeriv(node)), + applyAfter(function (p) { return createInterleave(p1, p); }, + p2.startTagOpenDeriv(node))); + }), + attDeriv: function (context, attribute) { + return createChoice( + createInterleave(p1.attDeriv(context, attribute), p2), + createInterleave(p1, p2.attDeriv(context, attribute))); + }, + startTagCloseDeriv: memoize0arg(function () { + return createInterleave(p1.startTagCloseDeriv(), + p2.startTagCloseDeriv()); + }) + }; + }); + createGroup = memoize2arg("group", function (p1, p2) { + if (p1 === notAllowed || p2 === notAllowed) { return notAllowed; } + if (p1 === empty) { return p2; } + if (p2 === empty) { return p1; } + }, function (p1, p2) { + return { + type: "group", + p1: p1, + p2: p2, + nullable: p1.nullable && p2.nullable, + textDeriv: function (context, text) { + var p = createGroup(p1.textDeriv(context, text), p2); + if (p1.nullable) { + return createChoice(p, p2.textDeriv(context, text)); + } + return p; + }, + startTagOpenDeriv: function (node) { + var x = applyAfter(function (p) { return createGroup(p, p2); }, + p1.startTagOpenDeriv(node)); + if (p1.nullable) { + return createChoice(x, p2.startTagOpenDeriv(node)); + } + return x; + }, + attDeriv: function (context, attribute) { + return createChoice( + createGroup(p1.attDeriv(context, attribute), p2), + createGroup(p1, p2.attDeriv(context, attribute))); + }, + startTagCloseDeriv: memoize0arg(function () { + return createGroup(p1.startTagCloseDeriv(), + p2.startTagCloseDeriv()); + }) + }; + }); + createAfter = memoize2arg("after", function (p1, p2) { + if (p1 === notAllowed || p2 === notAllowed) { return notAllowed; } + }, function (p1, p2) { + return { + type: "after", + p1: p1, + p2: p2, + nullable: false, + textDeriv: function (context, text) { + return createAfter(p1.textDeriv(context, text), p2); + }, + startTagOpenDeriv: memoizeNode(function (node) { + return applyAfter(function (p) { return createAfter(p, p2); }, + p1.startTagOpenDeriv(node)); + }), + attDeriv: function (context, attribute) { + return createAfter(p1.attDeriv(context, attribute), p2); + }, + startTagCloseDeriv: memoize0arg(function () { + return createAfter(p1.startTagCloseDeriv(), p2); + }), + endTagDeriv: memoize0arg(function () { + return (p1.nullable) ? p2 : notAllowed; + }) + }; + }); + createOneOrMore = memoize1arg("oneormore", function (p) { + if (p === notAllowed) { return notAllowed; } + return { + type: "oneOrMore", + p: p, + nullable: p.nullable, + textDeriv: function (context, text) { + return createGroup(p.textDeriv(context, text), + createChoice(this, empty)); + }, + startTagOpenDeriv: function (node) { + var oneOrMore = this; + return applyAfter(function (pf) { + return createGroup(pf, createChoice(oneOrMore, empty)); + }, p.startTagOpenDeriv(node)); + }, + attDeriv: function (context, attribute) { + var oneOrMore = this; + return createGroup(p.attDeriv(context, attribute), + createChoice(oneOrMore, empty)); + }, + startTagCloseDeriv: memoize0arg(function () { + return createOneOrMore(p.startTagCloseDeriv()); + }) + }; + }); + function createElement(nc, p) { + return { + type: "element", + nc: nc, + nullable: false, + textDeriv: function () { return notAllowed; }, + startTagOpenDeriv: function (node) { + if (nc.contains(node)) { + return createAfter(p, empty); + } + return notAllowed; + }, + attDeriv: function (context, attribute) { return notAllowed; }, + startTagCloseDeriv: function () { return this; } + }; + } + function valueMatch(context, pattern, text) { + return (pattern.nullable && /^\s+$/.test(text)) || + pattern.textDeriv(context, text).nullable; + } + createAttribute = memoize2arg("attribute", undefined, function (nc, p) { + return { + type: "attribute", + nullable: false, + nc: nc, + p: p, + attDeriv: function (context, attribute) { + if (nc.contains(attribute) && valueMatch(context, p, + attribute.nodeValue)) { + return empty; + } + return notAllowed; + }, + startTagCloseDeriv: function () { return notAllowed; } + }; + }); + function createList() { + return { + type: "list", + nullable: false, + hash: "list", + textDeriv: function (context, text) { + return empty; + } + }; + } + createValue = memoize1arg("value", function (value) { + return { + type: "value", + nullable: false, + value: value, + textDeriv: function (context, text) { + return (text === value) ? empty : notAllowed; + }, + attDeriv: function () { return notAllowed; }, + startTagCloseDeriv: function () { return this; } + }; + }); + createData = memoize1arg("data", function (type) { + return { + type: "data", + nullable: false, + dataType: type, + textDeriv: function () { return empty; }, + attDeriv: function () { return notAllowed; }, + startTagCloseDeriv: function () { return this; } + }; + }); + function createDataExcept() { + return { + type: "dataExcept", + nullable: false, + hash: "dataExcept" + }; + } + applyAfter = function applyAfter(f, p) { + var result; + if (p.type === "after") { + result = createAfter(p.p1, f(p.p2)); + } else if (p.type === "choice") { + result = createChoice(applyAfter(f, p.p1), applyAfter(f, p.p2)); + } else { + result = p; + } + return result; + }; + function attsDeriv(context, pattern, attributes, position) { + if (pattern === notAllowed) { + return notAllowed; + } + if (position >= attributes.length) { + return pattern; + } + if (position === 0) { + // TODO: loop over attributes to update namespace mapping + position = 0; + } + var a = attributes.item(position); + while (a.namespaceURI === xmlnsns) { // always ok + position += 1; + if (position >= attributes.length) { + return pattern; + } + a = attributes.item(position); + } + a = attsDeriv(context, pattern.attDeriv(context, + attributes.item(position)), attributes, position + 1); + return a; + } + function childrenDeriv(context, pattern, walker) { + var element = walker.currentNode, + childNode = walker.firstChild(), + numberOfTextNodes = 0, + childNodes = [], i, p; + // simple incomplete implementation: only use non-empty text nodes + while (childNode) { + if (childNode.nodeType === 1) { + childNodes.push(childNode); + } else if (childNode.nodeType === 3 && + !/^\s*$/.test(childNode.nodeValue)) { + childNodes.push(childNode.nodeValue); + numberOfTextNodes += 1; + } + childNode = walker.nextSibling(); + } + // if there is no nodes at all, add an empty text node + if (childNodes.length === 0) { + childNodes = [""]; + } + p = pattern; + for (i = 0; p !== notAllowed && i < childNodes.length; i += 1) { + childNode = childNodes[i]; + if (typeof childNode === "string") { + if (/^\s*$/.test(childNode)) { + p = createChoice(p, p.textDeriv(context, childNode)); + } else { + p = p.textDeriv(context, childNode); + } + } else { + walker.currentNode = childNode; + p = childDeriv(context, p, walker); + } + } + walker.currentNode = element; + return p; + } + childDeriv = function childDeriv(context, pattern, walker) { + var childNode = walker.currentNode, p; + p = pattern.startTagOpenDeriv(childNode); + p = attsDeriv(context, p, childNode.attributes, 0); + p = p.startTagCloseDeriv(); + p = childrenDeriv(context, p, walker); + p = p.endTagDeriv(); + return p; + }; + function addNames(name, ns, pattern) { + if (pattern.e[0].a) { + name.push(pattern.e[0].text); + ns.push(pattern.e[0].a.ns); + } else { + addNames(name, ns, pattern.e[0]); + } + if (pattern.e[1].a) { + name.push(pattern.e[1].text); + ns.push(pattern.e[1].a.ns); + } else { + addNames(name, ns, pattern.e[1]); + } + } + createNameClass = function createNameClass(pattern) { + var name, ns, hash, i, result; + if (pattern.name === "name") { + name = pattern.text; + ns = pattern.a.ns; + result = { + name: name, + ns: ns, + hash: "{" + ns + "}" + name, + contains: function (node) { + return node.namespaceURI === ns && node.localName === name; + } + }; + } else if (pattern.name === "choice") { + name = []; + ns = []; + addNames(name, ns, pattern); + hash = ""; + for (i = 0; i < name.length; i += 1) { + hash += "{" + ns[i] + "}" + name[i] + ","; + } + result = { + hash: hash, + contains: function (node) { + var i; + for (i = 0; i < name.length; i += 1) { + if (name[i] === node.localName && + ns[i] === node.namespaceURI) { + return true; + } + } + return false; + } + }; + } else { + result = { + hash: "anyName", + contains: function () { return true; } + }; + } + return result; + }; + function resolveElement(pattern, elements) { + var element, p, i, hash; + // create an empty object in the store to enable circular + // dependencies + hash = "element" + pattern.id.toString(); + p = elements[pattern.id] = { hash: hash }; + element = createElement(createNameClass(pattern.e[0]), + makePattern(pattern.e[1], elements)); + // copy the properties of the new object into the predefined one + for (i in element) { + if (element.hasOwnProperty(i)) { + p[i] = element[i]; + } + } + return p; + } + makePattern = function makePattern(pattern, elements) { + var p, i; + if (pattern.name === "elementref") { + p = pattern.id || 0; + pattern = elements[p]; + if (pattern.name !== undefined) { + return resolveElement(pattern, elements); + } + return pattern; + } + switch (pattern.name) { + case 'empty': + return empty; + case 'notAllowed': + return notAllowed; + case 'text': + return text; + case 'choice': + return createChoice(makePattern(pattern.e[0], elements), + makePattern(pattern.e[1], elements)); + case 'interleave': + p = makePattern(pattern.e[0], elements); + for (i = 1; i < pattern.e.length; i += 1) { + p = createInterleave(p, makePattern(pattern.e[i], + elements)); + } + return p; + case 'group': + return createGroup(makePattern(pattern.e[0], elements), + makePattern(pattern.e[1], elements)); + case 'oneOrMore': + return createOneOrMore(makePattern(pattern.e[0], elements)); + case 'attribute': + return createAttribute(createNameClass(pattern.e[0]), + makePattern(pattern.e[1], elements)); + case 'value': + return createValue(pattern.text); + case 'data': + p = pattern.a && pattern.a.type; + if (p === undefined) { + p = ""; + } + return createData(p); + case 'list': + return createList(); + } + throw "No support for " + pattern.name; + }; + this.makePattern = function (pattern, elements) { + var copy = {}, i; + for (i in elements) { + if (elements.hasOwnProperty(i)) { + copy[i] = elements[i]; + } + } + i = makePattern(pattern, copy); + return i; + }; + /** + * Validate the elements pointed to by the TreeWalker + * @param {!TreeWalker} walker + * @param {!function(Array.):undefined} callback + * @return {undefined} + */ + this.validate = function validate(walker, callback) { + var errors; + walker.currentNode = walker.root; + errors = childDeriv(null, rootPattern, walker); + if (!errors.nullable) { + runtime.log("Error in Relax NG validation: " + errors); + callback(["Error in Relax NG validation: " + errors]); + } else { + callback(null); + } + }; + this.init = function init(rootPattern1) { + rootPattern = rootPattern1; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG2.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG2.js new file mode 100644 index 0000000000..185ef5236e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNG2.js @@ -0,0 +1,416 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, xmldom: true*/ + +/** + * RelaxNG can check a DOM tree against a Relax NG schema + * The RelaxNG implementation is currently not complete. Relax NG should not + * report errors on valid DOM trees, but it will not check all constraints that + * a Relax NG file can define. The current implementation does not load external + * parts of a Relax NG file. + * The main purpose of this Relax NG engine is to validate runtime ODF + * documents. The DOM tree is traversed via a TreeWalker. A custom TreeWalker + * implementation can hide parts of a DOM tree. This is useful in WebODF, where + * special elements and attributes in the runtime DOM tree. + */ +runtime.loadClass("xmldom.RelaxNGParser"); +/** + * @constructor + */ +xmldom.RelaxNG2 = function RelaxNG2() { + "use strict"; + var start, + validateNonEmptyPattern, + nsmap, + depth = 0, + p = " "; + + /** + * @constructor + * @param {!string} error + * @param {Node=} context + */ + function RelaxNGParseError(error, context) { + this.message = function () { + if (context) { + error += (context.nodeType === 1) ? " Element " : " Node "; + error += context.nodeName; + if (context.nodeValue) { + error += " with value '" + context.nodeValue + "'"; + } + error += "."; + } + return error; + }; +// runtime.log("[" + p.slice(0, depth) + this.message() + "]"); + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @return {Array.} + */ + function validateOneOrMore(elementdef, walker, element) { + // The list of definitions in the elements list should be completely + // traversed at least once. If a second or later round fails, the walker + // should go back to the start of the last successful traversal + var node, i = 0, err; + do { + node = walker.currentNode; + err = validateNonEmptyPattern(elementdef.e[0], walker, element); + i += 1; + } while (!err && node !== walker.currentNode); + if (i > 1) { // at least one round was without error + // set position back to position of before last failed round + walker.currentNode = node; + return null; + } + return err; + } + /** + * @param {!Node} node + * @return {!string} + */ + function qName(node) { + return nsmap[node.namespaceURI] + ":" + node.localName; + } + /** + * @param {!Node} node + * @return {!boolean} + */ + function isWhitespace(node) { + return node && node.nodeType === 3 && /^\s+$/.test(node.nodeValue); + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @param {string=} data + * @return {Array.} + */ + function validatePattern(elementdef, walker, element, data) { + if (elementdef.name === "empty") { + return null; + } + return validateNonEmptyPattern(elementdef, walker, element, data); + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @return {Array.} + */ + function validateAttribute(elementdef, walker, element) { + if (elementdef.e.length !== 2) { + throw "Attribute with wrong # of elements: " + elementdef.e.length; + } + var att, a, l = elementdef.localnames.length, i; + for (i = 0; i < l; i += 1) { + a = element.getAttributeNS(elementdef.namespaces[i], + elementdef.localnames[i]); + // if an element is not present, getAttributeNS will return an empty + // string but an empty string is possible attribute value, so an + // extra check is needed + if (a === "" && !element.hasAttributeNS(elementdef.namespaces[i], + elementdef.localnames[i])) { + a = undefined; + } + if (att !== undefined && a !== undefined) { + return [new RelaxNGParseError("Attribute defined too often.", + element)]; + } + att = a; + } + if (att === undefined) { + return [new RelaxNGParseError("Attribute not found: " + + elementdef.names, element)]; + } + return validatePattern(elementdef.e[1], walker, element, att); + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @return {Array.} + */ + function validateTop(elementdef, walker, element) { + // notAllowed not implemented atm + return validatePattern(elementdef, walker, element); + } + /** + * Validate an element. + * Function forwards the walker until an element is met. + * If element if of the right type, it is entered and the validation + * continues inside the element. After validation, regardless of whether an + * error occurred, the walker is at the same depth in the dom tree. + * @param elementdef + * @param walker + * @param {Element} element + * @return {Array.} + */ + function validateElement(elementdef, walker, element) { + if (elementdef.e.length !== 2) { + throw "Element with wrong # of elements: " + elementdef.e.length; + } + depth += 1; + // forward until an element is seen, then check the name + var /**@type{Node}*/ node = walker.currentNode, + /**@type{number}*/ type = node ? node.nodeType : 0, + error = null; + // find the next element, skip text nodes with only whitespace + while (type > 1) { + if (type !== 8 && + (type !== 3 || + !/^\s+$/.test(walker.currentNode.nodeValue))) {// TEXT_NODE + depth -= 1; + return [new RelaxNGParseError("Not allowed node of type " + + type + ".")]; + } + node = walker.nextSibling(); + type = node ? node.nodeType : 0; + } + if (!node) { + depth -= 1; + return [new RelaxNGParseError("Missing element " + + elementdef.names)]; + } + if (elementdef.names && elementdef.names.indexOf(qName(node)) === -1) { + depth -= 1; + return [new RelaxNGParseError("Found " + node.nodeName + + " instead of " + elementdef.names + ".", node)]; + } + // the right element was found, now parse the contents + if (walker.firstChild()) { + // currentNode now points to the first child node of this element + error = validateTop(elementdef.e[1], walker, node); + // there should be no content left + while (walker.nextSibling()) { + type = walker.currentNode.nodeType; + if (!isWhitespace(walker.currentNode) && type !== 8) { + depth -= 1; + return [new RelaxNGParseError("Spurious content.", + walker.currentNode)]; + } + } + if (walker.parentNode() !== node) { + depth -= 1; + return [new RelaxNGParseError("Implementation error.")]; + } + } else { + error = validateTop(elementdef.e[1], walker, node); + } + depth -= 1; + // move to the next node + node = walker.nextSibling(); + return error; + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @param {string=} data + * @return {Array.} + */ + function validateChoice(elementdef, walker, element, data) { + // loop through child definitions and return if a match is found + if (elementdef.e.length !== 2) { + throw "Choice with wrong # of options: " + elementdef.e.length; + } + var node = walker.currentNode, err; + // if the first option is empty, just check the second one for debugging + // but the total choice is alwasy ok + if (elementdef.e[0].name === "empty") { + err = validateNonEmptyPattern(elementdef.e[1], walker, element, + data); + if (err) { + walker.currentNode = node; + } + return null; + } + err = validatePattern(elementdef.e[0], walker, element, data); + if (err) { + walker.currentNode = node; + err = validateNonEmptyPattern(elementdef.e[1], walker, element, + data); + } + return err; + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @return {Array.} + */ + function validateInterleave(elementdef, walker, element) { + var l = elementdef.e.length, n = [l], err, i, todo = l, + donethisround, node, subnode, e; + // the interleave is done when all items are 'true' and no + while (todo > 0) { + donethisround = 0; + node = walker.currentNode; + for (i = 0; i < l; i += 1) { + subnode = walker.currentNode; + if (n[i] !== true && n[i] !== subnode) { + e = elementdef.e[i]; + err = validateNonEmptyPattern(e, walker, element); + if (err) { + walker.currentNode = subnode; + if (n[i] === undefined) { + n[i] = false; + } + } else if (subnode === walker.currentNode || + // this is a bit dodgy, there should be a rule to + // see if multiple elements are allowed + e.name === "oneOrMore" || + (e.name === "choice" && + (e.e[0].name === "oneOrMore" || + e.e[1].name === "oneOrMore"))) { + donethisround += 1; + n[i] = subnode; // no error and try this one again later + } else { + donethisround += 1; + n[i] = true; // no error and progress + } + } + } + if (node === walker.currentNode && donethisround === todo) { + return null; + } + if (donethisround === 0) { + for (i = 0; i < l; i += 1) { + if (n[i] === false) { + return [new RelaxNGParseError( + "Interleave does not match.", element)]; + } + } + return null; + } + todo = 0; + for (i = 0; i < l; i += 1) { + if (n[i] !== true) { + todo += 1; + } + } + } + return null; + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @return {Array.} + */ + function validateGroup(elementdef, walker, element) { + if (elementdef.e.length !== 2) { + throw "Group with wrong # of members: " + elementdef.e.length; + } + //runtime.log(elementdef.e[0].name + " " + elementdef.e[1].name); + return validateNonEmptyPattern(elementdef.e[0], walker, element) || + validateNonEmptyPattern(elementdef.e[1], walker, element); + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @return {Array.} + */ + function validateText(elementdef, walker, element) { + var /**@type{Node}*/ node = walker.currentNode, + /**@type{number}*/ type = node ? node.nodeType : 0, + error = null; + // find the next element, skip text nodes with only whitespace + while (node !== element && type !== 3) { + if (type === 1) { + return [new RelaxNGParseError( + "Element not allowed here.", node)]; + } + node = walker.nextSibling(); + type = node ? node.nodeType : 0; + } + walker.nextSibling(); + return null; + } + /** + * @param elementdef + * @param walker + * @param {Element} element + * @param {string=} data + * @return {Array.} + */ + validateNonEmptyPattern = function validateNonEmptyPattern(elementdef, + walker, element, data) { + var name = elementdef.name, err = null; + if (name === "text") { + err = validateText(elementdef, walker, element); + } else if (name === "data") { + err = null; // data not implemented + } else if (name === "value") { + if (data !== elementdef.text) { + err = [new RelaxNGParseError("Wrong value, should be '" + + elementdef.text + "', not '" + data + "'", element)]; + } + } else if (name === "list") { + err = null; // list not implemented + } else if (name === "attribute") { + err = validateAttribute(elementdef, walker, element); + } else if (name === "element") { + err = validateElement(elementdef, walker, element); + } else if (name === "oneOrMore") { + err = validateOneOrMore(elementdef, walker, element); + } else if (name === "choice") { + err = validateChoice(elementdef, walker, element, data); + } else if (name === "group") { + err = validateGroup(elementdef, walker, element); + } else if (name === "interleave") { + err = validateInterleave(elementdef, walker, element); + } else { + throw name + " not allowed in nonEmptyPattern."; + } + return err; + }; + /** + * Validate the elements pointed to by the TreeWalker + * @param {!TreeWalker} walker + * @param {!function(Array.):undefined} callback + * @return {undefined} + */ + this.validate = function validate(walker, callback) { + walker.currentNode = walker.root; + var errors = validatePattern(start.e[0], walker, walker.root); + callback(errors); + }; + this.init = function init(start1, nsmap1) { + start = start1; + nsmap = nsmap1; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNGParser.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNGParser.js new file mode 100644 index 0000000000..12e37278a0 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/RelaxNGParser.js @@ -0,0 +1,452 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, xmldom: true*/ + +/** + * RelaxNG can check a DOM tree against a Relax NG schema + * The RelaxNG implementation is currently not complete. Relax NG should not + * report errors on valid DOM trees, but it will not check all constraints that + * a Relax NG file can define. The current implementation does not load external + * parts of a Relax NG file. + * The main purpose of this Relax NG engine is to validate runtime ODF + * documents. The DOM tree is traversed via a TreeWalker. A custom TreeWalker + * implementation can hide parts of a DOM tree. This is useful in WebODF, where + * special elements and attributes in the runtime DOM tree. + * @constructor + */ +xmldom.RelaxNGParser = function RelaxNGParser() { + "use strict"; + var self = this, + rngns = "http://relaxng.org/ns/structure/1.0", + xmlnsns = "http://www.w3.org/2000/xmlns/", + start, + nsmap = { "http://www.w3.org/XML/1998/namespace": "xml" }, + parse; + + /** + * @constructor + * @param {!string} error + * @param {Node=} context + */ + function RelaxNGParseError(error, context) { + /** + * return {!string} + */ + this.message = function () { + if (context) { + error += (context.nodeType === 1) ? " Element " : " Node "; + error += context.nodeName; + if (context.nodeValue) { + error += " with value '" + context.nodeValue + "'"; + } + error += "."; + } + return error; + }; + } + function splitToDuos(e) { + if (e.e.length <= 2) { + return e; + } + var o = { name: e.name, e: e.e.slice(0, 2) }; + return splitToDuos({ + name: e.name, + e: [ o ].concat(e.e.slice(2)) + }); + } + /** + * @param {!string} name + * @return {!Array.} + */ + function splitQName(name) { + var r = name.split(":", 2), + prefix = "", i; + if (r.length === 1) { + r = ["", r[0]]; + } else { + prefix = r[0]; + } + for (i in nsmap) { + if (nsmap[i] === prefix) { + r[0] = i; + } + } + return r; + } + + function splitQNames(def) { + var i, l = (def.names) ? def.names.length : 0, name, + localnames = def.localnames = [l], + namespaces = def.namespaces = [l]; + for (i = 0; i < l; i += 1) { + name = splitQName(def.names[i]); + namespaces[i] = name[0]; + localnames[i] = name[1]; + } + } + + /** + * @param {!string} str + * @return {!string} + */ + function trim(str) { + str = str.replace(/^\s\s*/, ''); + var ws = /\s/, + i = str.length - 1; + while (ws.test(str.charAt(i))) { + i -= 1; + } + return str.slice(0, i + 1); + } + + /** + * @param {!Object.} atts + * @param {!string} name + * @param {!Array.} names + * @return {!Object} + */ + function copyAttributes(atts, name, names) { + var a = {}, i, att; + for (i = 0; i < atts.length; i += 1) { + att = atts.item(i); + if (!att.namespaceURI) { + if (att.localName === "name" && + (name === "element" || name === "attribute")) { + names.push(att.value); + } + if (att.localName === "name" || att.localName === "combine" || + att.localName === "type") { + att.value = trim(att.value); + } + a[att.localName] = att.value; + } else if (att.namespaceURI === xmlnsns) { + nsmap[att.value] = att.localName; + } + } + return a; + } + + function parseChildren(c, e, elements, names) { + var text = "", ce; + while (c) { + if (c.nodeType === 1 && c.namespaceURI === rngns) { + ce = parse(c, elements, e); + if (ce) { + if (ce.name === "name") { + names.push(nsmap[ce.a.ns] + ":" + ce.text); + e.push(ce); + } else if (ce.name === "choice" && ce.names && + ce.names.length) { + names = names.concat(ce.names); + delete ce.names; + e.push(ce); + } else { + e.push(ce); + } + } + } else if (c.nodeType === 3) { + text += c.nodeValue; + } + c = c.nextSibling; + } + return text; + } + + function combineDefines(combine, name, e, siblings) { + // combineDefines is called often enough that there can only be one + // other element with the same name + var i, ce; + for (i = 0; siblings && i < siblings.length; i += 1) { + ce = siblings[i]; + if (ce.name === "define" && ce.a && ce.a.name === name) { + ce.e = [ { name: combine, e: ce.e.concat(e) } ]; + return ce; + } + } + return null; + } + + parse = function parse(element, elements, siblings) { + // parse all elements from the Relax NG namespace into JavaScript + // objects + var e = [], + /**@type{Object}*/a, + ce, + i, text, name = element.localName, names = []; + a = copyAttributes(element.attributes, name, names); + a.combine = a.combine || undefined; + text = parseChildren(element.firstChild, e, elements, names); + + // 4.2 strip leading and trailing whitespace + if (name !== "value" && name !== "param") { + text = /^\s*([\s\S]*\S)?\s*$/.exec(text)[1]; + } + // 4.3 datatypeLibrary attribute + // 4.4 type attribute of value element + if (name === "value" && a.type === undefined) { + a.type = "token"; + a.datatypeLibrary = ""; + } + // 4.5 href attribute + // 4.6 externalRef element + // 4.7 include element + // 4.8 name attribute of element and attribute elements + if ((name === "attribute" || name === "element") && + a.name !== undefined) { + i = splitQName(a.name); + e = [{name: "name", text: i[1], a: {ns: i[0]}}].concat(e); + delete a.name; + } + // 4.9 ns attribute + if (name === "name" || name === "nsName" || name === "value") { + if (a.ns === undefined) { + a.ns = ""; // TODO + } + } else { + delete a.ns; + } + // 4.10 QNames + if (name === "name") { + i = splitQName(text); + a.ns = i[0]; + text = i[1]; + } + // 4.11 div element + // 4.12 Number of child elements + if (e.length > 1 && (name === "define" || name === "oneOrMore" || + name === "zeroOrMore" || name === "optional" || + name === "list" || name === "mixed")) { + e = [{name: "group", e: splitToDuos({name: "group", e: e}).e}]; + } + if (e.length > 2 && name === "element") { + e = [e[0]].concat( + {name: "group", e: splitToDuos( + {name: "group", e: e.slice(1)}).e}); + } + if (e.length === 1 && name === "attribute") { + e.push({name: "text", text: text}); + } + // if node has only one child, replace node with child + if (e.length === 1 && (name === "choice" || name === "group" || + name === "interleave")) { + name = e[0].name; + names = e[0].names; + a = e[0].a; + text = e[0].text; + e = e[0].e; + } else if (e.length > 2 && (name === "choice" || name === "group" || + name === "interleave")) { + e = splitToDuos({name: name, e: e}).e; + } + // 4.13 mixed element + if (name === "mixed") { + name = "interleave"; + e = [ e[0], { name: "text" } ]; + } + // 4.14 optional element + if (name === "optional") { + name = "choice"; + e = [ e[0], { name: "empty" } ]; + } + // 4.15 zeroOrMore element + if (name === "zeroOrMore") { + name = "choice"; + e = [ {name: "oneOrMore", e: [ e[0] ] }, { name: "empty" } ]; + } + // 4.17 combine attribute + if (name === "define" && a.combine) { + ce = combineDefines(a.combine, a.name, e, siblings); + if (ce) { + return; + } + } + + // create the definition + ce = { name: name }; + if (e && e.length > 0) { ce.e = e; } + for (i in a) { + if (a.hasOwnProperty(i)) { + ce.a = a; + break; + } + } + if (text !== undefined) { ce.text = text; } + if (names && names.length > 0) { ce.names = names; } + + // part one of 4.19 + if (name === "element") { + ce.id = elements.length; + elements.push(ce); + ce = { name: "elementref", id: ce.id }; + } + return ce; + }; + + function resolveDefines(def, defines) { + var i = 0, e, defs, end, name = def.name; + while (def.e && i < def.e.length) { + e = def.e[i]; + if (e.name === "ref") { + defs = defines[e.a.name]; + if (!defs) { + throw e.a.name + " was not defined."; + } + end = def.e.slice(i + 1); + def.e = def.e.slice(0, i); + def.e = def.e.concat(defs.e); + def.e = def.e.concat(end); + } else { + i += 1; + resolveDefines(e, defines); + } + } + e = def.e; + // 4.20 notAllowed element + // 4.21 empty element + if (name === "choice") { + if (!e || !e[1] || e[1].name === "empty") { + if (!e || !e[0] || e[0].name === "empty") { + delete def.e; + def.name = "empty"; + } else { + e[1] = e[0]; + e[0] = { name: "empty" }; + } + } + } + if (name === "group" || name === "interleave") { + if (e[0].name === "empty") { + if (e[1].name === "empty") { + delete def.e; + def.name = "empty"; + } else { + name = def.name = e[1].name; + def.names = e[1].names; + e = def.e = e[1].e; + } + } else if (e[1].name === "empty") { + name = def.name = e[0].name; + def.names = e[0].names; + e = def.e = e[0].e; + } + } + if (name === "oneOrMore" && e[0].name === "empty") { + delete def.e; + def.name = "empty"; + } + // for attributes we need to have the list of namespaces and + // localnames readily available, so we split up the qnames + if (name === "attribute") { + splitQNames(def); + } + // for interleaving validation, it is convenient to join all + // interleave elements that touch into one element + if (name === "interleave") { + // at this point the interleave will have two child elements, + // but the child interleave elements may have a different number + if (e[0].name === "interleave") { + if (e[1].name === "interleave") { + e = def.e = e[0].e.concat(e[1].e); + } else { + e = def.e = [e[1]].concat(e[0].e); + } + } else if (e[1].name === "interleave") { + e = def.e = [e[0]].concat(e[1].e); + } + } + } + + function resolveElements(def, elements) { + var i = 0, e, name; + while (def.e && i < def.e.length) { + e = def.e[i]; + if (e.name === "elementref") { + e.id = e.id || 0; + def.e[i] = elements[e.id]; + } else if (e.name !== "element") { + resolveElements(e, elements); + } + i += 1; + } + } + + /** + * @param {!Document} dom + * @param {!Function} callback + * @return {?Array} + */ + function main(dom, callback) { + var elements = [], + grammar = parse(dom && dom.documentElement, elements, undefined), + i, e, defines = {}; + + for (i = 0; i < grammar.e.length; i += 1) { + e = grammar.e[i]; + if (e.name === "define") { + defines[e.a.name] = e; + } else if (e.name === "start") { + start = e; + } + } + if (!start) { + return [new RelaxNGParseError( + "No Relax NG start element was found.")]; + } + resolveDefines(start, defines); + for (i in defines) { + if (defines.hasOwnProperty(i)) { + resolveDefines(defines[i], defines); + } + } + for (i = 0; i < elements.length; i += 1) { + resolveDefines(elements[i], defines); + } + if (callback) { + self.rootPattern = callback(start.e[0], elements); + } + resolveElements(start, elements); + for (i = 0; i < elements.length; i += 1) { + resolveElements(elements[i], elements); + } + self.start = start; + self.elements = elements; + self.nsmap = nsmap; + return null; + } + /** + * @param {!Document} dom + * @param {!Function} callback + * @return {?Array} + */ + this.parseRelaxNGDOM = main; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/XPath.js b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/XPath.js new file mode 100644 index 0000000000..28466c2184 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/lib/xmldom/XPath.js @@ -0,0 +1,383 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global xmldom, XPathResult, runtime*/ +/** + * Wrapper for XPath functions + * @constructor + */ +xmldom.XPath = (function () { + "use strict"; + var createXPathPathIterator, + parsePredicates; + /** + * @param {!number} a + * @param {!number} b + * @param {!number} c + * @return {!boolean} + */ + function isSmallestPositive(a, b, c) { + return a !== -1 && (a < b || b === -1) && (a < c || c === -1); + } + /** + * Parse a subset of xpaths. + * The xpath predicates may contain xpaths. The location may be equated to + * a value. If a parsing error occurs, null is returned. + * @param {!string} xpath + * @param {!number} pos + * @param {!number} end + * @param {!Array} steps + * @return {!number} + */ + function parseXPathStep(xpath, pos, end, steps) { + var location = "", + predicates = [], + value, + brapos = xpath.indexOf('[', pos), + slapos = xpath.indexOf('/', pos), + eqpos = xpath.indexOf('=', pos), + depth = 0, + start = 0; + // parse the location + if (isSmallestPositive(slapos, brapos, eqpos)) { + location = xpath.substring(pos, slapos); + pos = slapos + 1; + } else if (isSmallestPositive(brapos, slapos, eqpos)) { + location = xpath.substring(pos, brapos); + pos = parsePredicates(xpath, brapos, predicates); + } else if (isSmallestPositive(eqpos, slapos, brapos)) { + location = xpath.substring(pos, eqpos); + pos = eqpos; + } else { + location = xpath.substring(pos, end); + pos = end; + } + steps.push({location: location, predicates: predicates}); + return pos; + } + function parseXPath(xpath) { + var steps = [], + p = 0, + end = xpath.length, + value; + while (p < end) { + p = parseXPathStep(xpath, p, end, steps); + if (p < end && xpath[p] === '=') { + value = xpath.substring(p + 1, end); + if (value.length > 2 && + (value[0] === '\'' || value[0] === '"')) { + value = value.slice(1, value.length - 1); + } else { + try { + value = parseInt(value, 10); + } catch (e) { + } + } + p = end; + } + } + return {steps: steps, value: value}; + } + parsePredicates = function parsePredicates(xpath, start, predicates) { + var pos = start, + l = xpath.length, + selector, + depth = 0; + while (pos < l) { + if (xpath[pos] === ']') { + depth -= 1; + if (depth <= 0) { + predicates.push(parseXPath(xpath.substring(start, pos))); + } + } else if (xpath[pos] === '[') { + if (depth <= 0) { + start = pos + 1; + } + depth += 1; + } + pos += 1; + } + return pos; + }; + /** + * Iterator over nodes uses in the xpath implementation + * @class + * @interface + */ + function XPathIterator() {} + /** + * @return {Node} + */ + XPathIterator.prototype.next = function () {}; + /** + * @return {undefined} + */ + XPathIterator.prototype.reset = function () {}; + /** + * @class + * @constructor + * @augments XPathIterator + * @implements {XPathIterator} + */ + function NodeIterator() { + var node, done = false; + this.setNode = function setNode(n) { + node = n; + }; + this.reset = function () { + done = false; + }; + this.next = function next() { + var val = (done) ? null : node; + done = true; + return val; + }; + } + /** + * @class + * @constructor + * @augments XPathIterator + * @implements {XPathIterator} + * @param {XPathIterator} it + * @param {!string} namespace + * @param {!string} localName + */ + function AttributeIterator(it, namespace, localName) { + this.reset = function reset() { + it.reset(); + }; + this.next = function next() { + var node = it.next(), attr; + while (node) { + node = node.getAttributeNodeNS(namespace, localName); + if (node) { + return node; + } + node = it.next(); + } + return node; + }; + } + /** + * @class + * @constructor + * @augments XPathIterator + * @implements {XPathIterator} + * @param {XPathIterator} it + * @param {boolean} recurse + */ + function AllChildElementIterator(it, recurse) { + var root = it.next(), + node = null; + this.reset = function reset() { + it.reset(); + root = it.next(); + node = null; + }; + this.next = function next() { + while (root) { + if (node) { + if (recurse && node.firstChild) { + node = node.firstChild; + } else { + while (!node.nextSibling && node !== root) { + node = node.parentNode; + } + if (node === root) { + root = it.next(); + } else { + node = node.nextSibling; + } + } + } else { + do { +// node = (recurse) ?root :root.firstChild; + node = root.firstChild; + if (!node) { + root = it.next(); + } + } while (root && !node); + } + if (node && node.nodeType === 1) { + return node; + } + } + return null; + }; + } + /** + * @class + * @constructor + * @augments XPathIterator + * @implements {XPathIterator} + * @param {XPathIterator} it + * @param {function(Node):boolean} condition + */ + function ConditionIterator(it, condition) { + this.reset = function reset() { + it.reset(); + }; + this.next = function next() { + var n = it.next(); + while (n && !condition(n)) { + n = it.next(); + } + return n; + }; + } + /** + * @param {XPathIterator} it + * @param {string} name + * @param {function(string):string} namespaceResolver + * @return {!ConditionIterator} + */ + function createNodenameFilter(it, name, namespaceResolver) { + var s = name.split(':', 2), + namespace = namespaceResolver(s[0]), + localName = s[1]; + return new ConditionIterator(it, function (node) { + return node.localName === localName && + node.namespaceURI === namespace; + }); + } + /** + * @param {XPathIterator} it + * @param {!Object} p + * @param {function(string):string} namespaceResolver + * @return {!ConditionIterator} + */ + function createPredicateFilteredIterator(it, p, namespaceResolver) { + var nit = new NodeIterator(), + pit = createXPathPathIterator(nit, p, namespaceResolver), + value = p.value; + if (value === undefined) { + return new ConditionIterator(it, function (node) { + nit.setNode(node); + pit.reset(); + return pit.next(); + }); + } + return new ConditionIterator(it, function (node) { + nit.setNode(node); + pit.reset(); + var n = pit.next(); + // todo: distinuish between number and string + return n && n.nodeValue === value; + }); + } + /** + * @param {!XPathIterator} it + * @param {!Object} xpath + * @param {!Function} namespaceResolver + * @return {!XPathIterator} + */ + createXPathPathIterator = function createXPathPathIterator(it, xpath, + namespaceResolver) { + var i, j, step, location, namespace, localName, prefix, p; + for (i = 0; i < xpath.steps.length; i += 1) { + step = xpath.steps[i]; + location = step.location; + if (location === "") { + it = new AllChildElementIterator(it, false); + } else if (location[0] === '@') { + p = location.slice(1).split(":", 2); + it = new AttributeIterator(it, namespaceResolver(p[0]), p[1]); + } else if (location !== ".") { + it = new AllChildElementIterator(it, false); + if (location.indexOf(":") !== -1) { + it = createNodenameFilter(it, location, namespaceResolver); + } + } + for (j = 0; j < step.predicates.length; j += 1) { + p = step.predicates[j]; + it = createPredicateFilteredIterator(it, p, namespaceResolver); + } + } + return it; + }; + /** + * @param {!Element} node + * @param {!string} xpath + * @param {!Function} namespaceResolver + * @return {!Array.} + */ + function fallback(node, xpath, namespaceResolver) { + var it = new NodeIterator(), + i, + nodelist, + parsedXPath, + pos; + it.setNode(node); + parsedXPath = parseXPath(xpath); + it = createXPathPathIterator(it, parsedXPath, namespaceResolver); + nodelist = []; + i = it.next(); + while (i) { + nodelist.push(i); + i = it.next(); + } + return nodelist; + } + /** + * @param {!Element} node + * @param {!string} xpath + * @param {!Function} namespaceResolver + * @return {!Array.} + */ + function getODFElementsWithXPath(node, xpath, namespaceResolver) { + var doc = node.ownerDocument, + nodes, + elements = [], + n = null; + if (!doc || !doc.evaluate || !n) { + elements = fallback(node, xpath, namespaceResolver); + } else { + nodes = doc.evaluate(xpath, node, namespaceResolver, + XPathResult.UNORDERED_NODE_ITERATOR_TYPE, null); + n = nodes.iterateNext(); + while (n !== null) { + if (n.nodeType === 1) { + elements.push(n); + } + n = nodes.iterateNext(); + } + } + return elements; + } + /** + * @constructor + */ + xmldom.XPath = function XPath() { + this.getODFElementsWithXPath = getODFElementsWithXPath; + }; + return xmldom.XPath; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/carettest.html b/apps/files_odfviewer/src/webodf/webodf/misctests/carettest.html new file mode 100644 index 0000000000..fc7f84c926 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/misctests/carettest.html @@ -0,0 +1,135 @@ + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/selection.html b/apps/files_odfviewer/src/webodf/webodf/misctests/selection.html new file mode 100644 index 0000000000..d758237f39 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/misctests/selection.html @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/testselection.html b/apps/files_odfviewer/src/webodf/webodf/misctests/testselection.html new file mode 100644 index 0000000000..28ff15889b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/misctests/testselection.html @@ -0,0 +1,61 @@ + + + + + + +

    + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/testzip.js b/apps/files_odfviewer/src/webodf/webodf/misctests/testzip.js new file mode 100644 index 0000000000..bd57807bf5 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/misctests/testzip.js @@ -0,0 +1,181 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime core*/ +runtime.loadClass("core.Zip"); +runtime.loadClass("core.Async"); + +var async = new core.Async(); + +/** + * @param {!core.Zip.ZipEntry} entry + * @param {!core.Zip} zip + * @param {function(?string):undefined} callback + * @return {undefined} + */ +function copyEntry(entry, zip, callback) { + entry.load(function (err, data) { + if (err) { + callback(err); + } else { + zip.save(entry.filename, data, false, entry.date); + callback(null); + } + }); +} + +/** + * @param {!core.Zip} zipa + * @param {!core.Zip} zipb + * @param {function(?string):undefined} callback + * @return {undefined} + */ +function compareZips(zipa, zipb, callback) { + var entriesa = zipa.getEntries(), + l = entriesa.length, + entriesb = zipb.getEntries(), + i, + j, + entrya, + entryb; + // compare the number of entries + if (entriesb.length !== l) { + callback("Number of entries is not equal."); + return; + } + // compare the meta data of the entries + for (i = 0; i < l; i += 1) { + entrya = entriesa[i]; + for (j = 0; j < l; j += 1) { + entryb = entriesb[j]; + if (entrya.filename === entryb.filename) { + break; + } + } + if (j === l) { + callback("Entry " + entrya.filename + " is not present in the " + + "second zip file."); + return; + } + if (entrya.date.valueOf() !== entryb.date.valueOf()) { + callback("Dates for entry " + entrya.filename + " is not equal: " + + entrya.date + " vs " + entryb.date); + return; + } + } + // compare the data in the entries + async.forEach(entriesa, function (entry, callback) { + entry.load(function (err, dataa) { + if (err) { + callback(err); + return; + } + zipb.load(entry.filename, function (err, datab) { + if (err) { + callback(err); + return; + } + var i = 0, l = dataa.length; + if (dataa !== datab) { + for (i = 0; i < l && dataa[i] === datab[i];) { + i += 1; + } + callback("Data is not equal for " + entry.filename + + " at position " + i + ": " + dataa.charCodeAt(i) + + " vs " + datab.charCodeAt(i) + "."); + } else { + callback(null); + } + }); + }); + }, function (err) { + callback(err); + }); +} + +function testZip(filepatha, callback) { + var zipa = new core.Zip(filepatha, function (err, zipa) { + if (err) { + runtime.log(err); + runtime.exit(1); + return; + } + // open a new zip file and copy all entries from zipa to zipb + var filepathb = "tmp323.zip", + zipb = new core.Zip(filepathb, null), + entries = zipa.getEntries(), + i, + entriesDone = 0; + async.forEach(entries, function (entry, callback) { + copyEntry(entry, zipb, callback); + }, function (err) { + if (err) { + callback(err); + return; + } + zipb.write(function (err) { + if (err) { + callback(err); + return; + } + zipb = new core.Zip(filepathb, function (err, zipb) { + if (err) { + callback(err); + return; + } + compareZips(zipa, zipb, callback); + }); + }); + }); + }); +} + +var args = arguments; +// open the arguments one by one, save them to a file, then open again and see +// if the contents matches +function doit(i) { + if (i >= args.length) { + return; + } + testZip(args[i], function (err) { + runtime.log(args[i]); + if (err) { + runtime.log(err); + return; + } + i += 1; + if (i < args.length) { + doit(i); + } + }); +} +doit(1); diff --git a/apps/files_odfviewer/src/webodf/webodf/misctests/writetest.zip b/apps/files_odfviewer/src/webodf/webodf/misctests/writetest.zip new file mode 100644 index 0000000000..69a14abc26 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/webodf/misctests/writetest.zip differ diff --git a/apps/files_odfviewer/src/webodf/webodf/notes b/apps/files_odfviewer/src/webodf/webodf/notes new file mode 100644 index 0000000000..f21a7c3fdd --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/notes @@ -0,0 +1,137 @@ +XMLModel: + - list of all possible QNames + - list of valid attributes for each QName + - node walker positions + - knowledge about where whitespace is meaningfull + + + + +xmledit + - receives mouse and keyboard events + - simple editing + - inputs that might be interpreted higher up + +Tools: + +Features we want: + - ability to run code from Rhine, Node.JS and browsers + - type checking + - sanity checking + - javascript compilation + - unit tests + - unit test code coverage + + +Closure seems a nice compiler. It should be optional. +Unit testing should be as simple as doing a reload in a browser or calling a single command from the command-line. + +The only fundamental problem is the method of resolving dependencies. Closure does not understand require() commands that load modules. However, Node.JS needs this command to load modules. + +If require("mypackage.MyClass") would return just the class if it was already loaded, that would be perfect. Using eval() would solve this: + function require(module) { + var m; + try { + m = eval(module); + } catch (e) { + } + if (m === undefined) { + // load the module + } + } + +But then how to adapt the code in the modules themselves? Currenlty, no global objects are defined, but symbols are added to the exports variable. +Suppose that ideal javascript modules each define one class, then the code for class a.b.Class would be stored in the file a/b/Class.js and would look like this: +==== +a.b.Class = function () { +}; +==== +If this code should be loaded as a module, it should be executed with eval(). The environment in which the code is executed should already have 'package' a.b. + +function runModuleCode(modulename, code) { + var names = modulename.split("."), + evalcode; + if (!eval("typeof " + names[0] + " === 'undefined'")) { + } + evalcode = "if (typeof " + names[0] + " === 'undefined') {" + + + if +} + +function loadClass(modulename) { + // test if class already exists + var names = modulename.split("."), + evalcode, constructor; + evalcode = "(typeof " + names[0] + " !== 'undefined' ") + + +var code = ""; +if (typeof a === "undefined") { + code = code + "var a = {};"; + if (!eval( + + +Node does not have global context in eval() it seems. + + + +Running unit tests should be possible in a number of ways: + - single tests in + * browser + * browser with code coverage + * browser from js compiled with Closure Compiler + * node.js + * rhino + - + + +--- + + +Caret should work like a cursor. +It should use the contentEditable property to advance the cursor within one text node. + +Isn't the current cursor sufficient? All that is missing is to use the native display when it is a text node. + +Using the contentEditable means that the cursor code can be simplified quite a bit if you want to + + +If the caret is in a text node, moving should be done by passing a move signal to the system. +After the move it should be checked if the move made sense, i.e. if the caret is in an allowed position. If it is not, the position should be corrected manually. + +Determining if a caret is in a legal position is done with a special class. + +The current players: + - core.Cursor : insert a caret in the text if the selection calls for it + - gui.XMLEdit : + - ...: moving of the cursor, taking into account skipping over/ignoring the cursor itself and also taking into account that the caret in an editable text must be moved by the browser + +move the cursor in a simple document with a wrapped text + + +Contenteditable is perhaps not strictly necessary. It does not work well across browsers anyway. The only reason to use it would be to have a nice way to move the cursor up or down a line. + +To move the cursor or selection, a special class is needed for determining how to modify the selection upon different inputs. The visualization of the cursor is handled by the cursor class. + +stepForward +stepBackward +setPoint + +---- + +Cursor and selection: + - cursor is foreign element of height but with no width + - handle mouse event to move or place the cursor at the right position + - handle key events to move the cursor + +webkit has nice functions for manipulating the selection +selection/cursor position is the 'real' thing, the cursor (visible or not) is just the visualization + +The cursor must appear invisible to the normal dom functions, this is tricky because a cursor may split a text. This is however a separate concern. + +So there should be an event handler that translates mouse and key events into api calls. There already is moving of the cursor/selection on mouse events in Firefox and WebKit so only keyboard events need to be handled. So core.Cursor.updateToSelection should work ok for mouse events. + +Should we re-evaluate the use of JQuery? NO! first add editing functions to WebODF. + +So current top priorities: moving the cursor and saving. +And not in the general xml editor, but in the odf editor. diff --git a/apps/files_odfviewer/src/webodf/webodf/odf.html b/apps/files_odfviewer/src/webodf/webodf/odf.html new file mode 100644 index 0000000000..3abbf96ff7 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/odf.html @@ -0,0 +1,44 @@ + + + + + + + + + + + + + +
    + + diff --git a/apps/files_odfviewer/src/webodf/webodf/odfedit.html b/apps/files_odfviewer/src/webodf/webodf/odfedit.html new file mode 100644 index 0000000000..d4a5b53870 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/odfedit.html @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + WebODF + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/odfedit.js b/apps/files_odfviewer/src/webodf/webodf/odfedit.js new file mode 100644 index 0000000000..6dfc1cddac --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/odfedit.js @@ -0,0 +1,314 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, document: true, odf: true, window: true, Ext: true*/ +/** + * @type {odf.OdfCanvas} + */ +var odfcanvas; + +/** + * @return {undefined} + */ +function fixExtJSCSS() { + "use strict"; + // look through all stylesheets to change the selector + // ".x-viewport, .x-viewport body" + // to + // ".x-viewport, .x-viewport > body" + // The normal selector os not specific enough, office|body is also affected + // by it. To avoid this, the selector is changed so that is only applies to + // a director parent child relationship with '>' + var i, cssRules, j, rule; + for (i = 0; i < document.styleSheets.length; i += 1) { + cssRules = document.styleSheets[i].cssRules; + for (j = 0; j < cssRules.length; j += 1) { + rule = cssRules[j]; + if (rule.selectorText === ".x-viewport, .x-viewport body") { + rule = rule.cssText.replace(".x-viewport, .x-viewport body", + ".x-viewport, .x-viewport > body"); + document.styleSheets[i].deleteRule(j); + document.styleSheets[i].insertRule(rule, j); + return; + } + } + } +} +/** + * @return {undefined} + */ +function updateStyleComboBox() { + "use strict"; + var paragraphStylesBox = document.getElementById("paragraphStyleBox"); +} +/** + * @param {!Element} odfelement + * @return {undefined} + */ +function initCanvas(odfelement) { + "use strict"; + runtime.loadClass("odf.OdfCanvas"); + // if the url has a fragment (#...), try to load the file it represents + var location = String(document.location), + pos = location.indexOf('#'); +// odfelement.style.overflow = 'auto'; + odfelement.style.height = '100%'; + odfcanvas = new odf.OdfCanvas(odfelement); + if (pos === -1 || !window) { + return; + } + location = location.substr(pos + 1); + odfcanvas.onstatereadychange = function () { + /* + updateStyleComboBox(); + odfcanvas.save(function (err) { + alert(err); + }); + */ + }; + odfcanvas.load(location); + odfcanvas.addListener("selectionchange", function (element, selection) { + var formatting = odfcanvas.getFormatting(), + completelyBold = formatting.isCompletelyBold(selection), + alignment = formatting.getAlignment(selection); + runtime.log("selection changed " + completelyBold + " " + alignment); + }); +} +/** + * @return {undefined} + */ +function save() { + "use strict"; + odfcanvas.odfContainer().save(function (err) { + if (err) { + runtime.log(err); + } + }); +} +Ext.ODFEditor = Ext.extend(Ext.component.Component, { + buttonTips : { + bold : { + title: 'Bold (Ctrl+B)', + text: 'Make the selected text bold.', + cls: 'x-html-editor-tip' + }, + italic : { + title: 'Italic (Ctrl+I)', + text: 'Make the selected text italic.', + cls: 'x-html-editor-tip' + }, + underline : { + title: 'Underline (Ctrl+U)', + text: 'Underline the selected text.', + cls: 'x-html-editor-tip' + }, + increasefontsize : { + title: 'Grow Text', + text: 'Increase the font size.', + cls: 'x-html-editor-tip' + }, + decreasefontsize : { + title: 'Shrink Text', + text: 'Decrease the font size.', + cls: 'x-html-editor-tip' + }, + backcolor : { + title: 'Text Highlight Color', + text: 'Change the background color of the selected text.', + cls: 'x-html-editor-tip' + }, + forecolor : { + title: 'Font Color', + text: 'Change the color of the selected text.', + cls: 'x-html-editor-tip' + }, + justifyleft : { + title: 'Align Text Left', + text: 'Align text to the left.', + cls: 'x-html-editor-tip' + }, + justifycenter : { + title: 'Center Text', + text: 'Center text in the editor.', + cls: 'x-html-editor-tip' + }, + justifyright : { + title: 'Align Text Right', + text: 'Align text to the right.', + cls: 'x-html-editor-tip' + }, + insertunorderedlist : { + title: 'Bullet List', + text: 'Start a bulleted list.', + cls: 'x-html-editor-tip' + }, + insertorderedlist : { + title: 'Numbered List', + text: 'Start a numbered list.', + cls: 'x-html-editor-tip' + }, + createlink : { + title: 'Hyperlink', + text: 'Make the selected text a hyperlink.', + cls: 'x-html-editor-tip' + }, + sourceedit : { + title: 'Source Edit', + text: 'Switch to source editing mode.', + cls: 'x-html-editor-tip' + }, + save : { + title: 'Save (Ctrl+S)', + text: 'Save the document.', + cls: 'x-html-editor-tip' + } + } +}); + + +var ODFEditor = Ext.extend(Ext.Panel, { + initComponent: function () { + "use strict"; + var me = this, + statusMessage = new Ext.Toolbar.TextItem(''); + function buttonHandler(button, event) { + } + me.defaults = { + }; + me.initialConfig = Ext.apply({ + }, me.initialConfig); + me.items = [{ + xtype: 'box', + id: 'canvas', + autoEl: { + tag: 'div', + frameBorder: 0, + style: { + border: '0 none' + } + }, + autoScroll: true, + scroll: true + }]; + me.tbar = { + xtype: 'toolbar', + items: [{ + xtype: 'button', + icon: 'extjs/examples/shared/icons/save.gif', + handler: buttonHandler, + cls: 'x-btn-icon' + }, { + xtype: 'tbseparator' + }, { + tag: 'select', + //html: this.createFontOptions() + cls: 'x-font-select' + }, { + xtype: 'buttongroup', + cls: 'x-html-editor-tb', + frame: false, + items: [{ + xtype: 'button', + iconCls: 'x-edit-bold', + cls: 'x-btn-icon' + }, { + xtype: 'button', + iconCls: 'x-edit-italic', + cls: 'x-btn-icon' + }, { + xtype: 'button', + iconCls: 'x-edit-underline', + cls: 'x-btn-icon' + }, { + itemId: 'forecolor', + cls: 'x-btn-icon', + iconCls: 'x-edit-forecolor', + menu: { xtype: 'colormenu' } + }, { + itemId: 'backcolor', + cls: 'x-btn-icon', + iconCls: 'x-edit-backcolor', + menu: { xtype: 'colormenu' } + }, { + xtype: 'button', + iconCls: 'x-edit-justifyleft', + cls: 'x-btn-icon' + }, { + xtype: 'button', + iconCls: 'x-edit-justifycenter', + cls: 'x-btn-icon' + }, { + xtype: 'button', + iconCls: 'x-edit-justifyright', + cls: 'x-btn-icon' + }, { + xtype: 'button', + iconCls: 'x-edit-insertorderedlist', + cls: 'x-btn-icon' + }, { + xtype: 'button', + iconCls: 'x-edit-insertunorderedlist', + cls: 'x-btn-icon' + }] + }, { + xtype: 'tbfill' + }, + statusMessage + ] + }; +/* + me.bbar = { + xtype: 'toolbar', + items: [ {xtype: "tbfill" }, statusMessage ] + }; +*/ + ODFEditor.superclass.initComponent.call(this); + } +}); +Ext.onReady(function () { + "use strict"; + var canvas, viewport; + + Ext.QuickTips.init(); + + canvas = new ODFEditor({ + region: 'center' + }); + + viewport = new Ext.Viewport({ + layout: 'border', + items: [ canvas ] + }); + + fixExtJSCSS(); + initCanvas(Ext.getCmp('canvas').el.dom); +}); diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngToCPP.js b/apps/files_odfviewer/src/webodf/webodf/relaxngToCPP.js new file mode 100644 index 0000000000..064fe61b79 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngToCPP.js @@ -0,0 +1,463 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, xmldom: true*/ +runtime.loadClass("xmldom.RelaxNGParser"); + +var nsmap = { + "http://purl.org/dc/elements/1.1/": "purl", + "http://www.w3.org/1998/Math/MathML": "mathml", + "http://www.w3.org/1999/xhtml": "xhtml", + "http://www.w3.org/1999/xlink": "xlink", + "http://www.w3.org/2002/xforms": "xforms", + "http://www.w3.org/2003/g/data-view#": "dv", + "http://www.w3.org/XML/1998/namespace": "xmlns", + "urn:oasis:names:tc:opendocument:xmlns:animation:1.0": "animation", + "urn:oasis:names:tc:opendocument:xmlns:chart:1.0": "chart", + "urn:oasis:names:tc:opendocument:xmlns:config:1.0": "config", + "urn:oasis:names:tc:opendocument:xmlns:database:1.0": "database", + "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0": "datastyle", + "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0": "dr3d", + "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0": "drawing", + "urn:oasis:names:tc:opendocument:xmlns:form:1.0": "form", + "urn:oasis:names:tc:opendocument:xmlns:meta:1.0": "meta", + "urn:oasis:names:tc:opendocument:xmlns:office:1.0": "office", + "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0": "presentation", + "urn:oasis:names:tc:opendocument:xmlns:script:1.0": "script", + "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0": "smilc", + "urn:oasis:names:tc:opendocument:xmlns:style:1.0": "style", + "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0": "svgc", + "urn:oasis:names:tc:opendocument:xmlns:table:1.0": "table", + "urn:oasis:names:tc:opendocument:xmlns:text:1.0": "text", + "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0": "xslfoc" + }, + typemap = { + "string": "const QString&", + "NCName": "const QString&", + "date": "const QString&", + "time": "const QString&", + "dateTime": "const QString&", + "duration": "const QString&", + "anyURI": "const QString&", + "ID": "const QString&", + "IDREF": "const QString&", + "IDREFS": "const QString&", + "QName": "const QString&", + "token": "const QString&", + "language": "const QString&", + "positiveInteger": "quint32", + "nonNegativeInteger": "quint32", + "integer": "qint32", + "decimal": "double" + }, + args = arguments, + relaxngurl = args[1], + parser = new xmldom.RelaxNGParser(relaxngurl); + +function out(string) { + "use strict"; + runtime.log(string); +} +function toCamelCase(s) { + "use strict"; + var str = "", i, up = true; + for (i = 0; i < s.length; i += 1) { + if (up) { + str += s.substr(i, 1).toUpperCase(); + } else { + str += s.substr(i, 1); + } + up = false; + while (/\W/.test(s.substr(i + 1, 1))) { + up = true; + i += 1; + } + } + return str; +} +function getName(e) { + "use strict"; + return toCamelCase(nsmap[e.a.ns]) + toCamelCase(e.text); +} +function getNames(e, names) { + "use strict"; + if (e.name === "name") { + names.push(e); + } else if (e.name === "choice") { + getNames(e.e[0], names); + getNames(e.e[1], names); + } +} +function parseAttributes(e, att) { + "use strict"; + var i, name; + if (e.name === "choice" || e.name === "interleave" + || e.name === "group") { + for (i = 0; i < e.e.length; i += 1) { + parseAttributes(e.e[i], att); + } + } else if (e.name === "value") { + att.values.push(e.text); + } else if (e.name === "data") { + att.types.push(e.a.type); + } else if (e.name === "list") { + name = null; // todo + } else if (e.name === "empty") { + att.empty = true; + } else { + runtime.log("OOPS " + e.name); + throw null; + } +} +function writeAttributeSetter(name, type, a) { + "use strict"; + var i, s = ""; + out(" /**"); + if (a.optional) { + out(" * Set optional attribute " + a.nsname + "."); + } else { + out(" * Set required attribute " + a.nsname + "."); + } + if (a.values.length > 0) { + s = "Choose one of these values: '" + a.values[0] + "'"; + for (i = 1; i < a.values.length; i += 1) { + s += ", '" + a.values[i] + "'"; + } + out(" * " + s + "."); + } + out(" */"); + out(" inline void write" + name + "(" + type + " value) {"); + out(" xml->addAttribute(\"" + a.nsname + "\", value);"); + out(" }"); +} +function writeAttribute(name, a) { + "use strict"; + if (!a.optional) { + return; + } + var i, type, done = {}, needfallback = true; + for (i = 0; i < a.types.length; i += 1) { + needfallback = false; + type = typemap[a.types[i]] || a.types[i]; + if (!done.hasOwnProperty(type)) { + done[type] = 1; + writeAttributeSetter(name, type, a); + } + } + if (a.values.indexOf("true") !== -1 && a.values.indexOf("false") !== -1 && + done.hasOwnProperty("bool")) { + needfallback = false; + writeAttributeSetter(name, "bool", a); + } + if (needfallback) { + writeAttributeSetter(name, "const QString&", a); + } +} +function writeOptionalAttributes(atts) { + "use strict"; + var name; + for (name in atts) { + if (atts.hasOwnProperty(name)) { + writeAttribute(name, atts[name]); + } + } +} +function writeFixedRequiredAttributes(atts) { + "use strict"; + var name, a; + for (name in atts) { + if (atts.hasOwnProperty(name)) { + a = atts[name]; + if (!a.optional && a.types.length === 0 && a.values.length === 1) { + out(" xml->addAttribute(\"" + a.nsname + "\", \"" + + a.values[0] + "\");"); + } + } + } +} +function getRequiredAttributeArguments(atts) { + "use strict"; + var name, a, s = "", type; + for (name in atts) { + if (atts.hasOwnProperty(name)) { + a = atts[name]; + if (!a.optional && (a.types.length > 0 || a.values.length !== 1)) { + type = typemap[a.types[0]] || a.types[0] || "const QString&"; + if (s) { + s += ", "; + } + s += type + " " + name.toLowerCase(); + } + } + } + return s; +} +function getRequiredAttributeCall(atts) { + "use strict"; + var name, a, s = ""; + for (name in atts) { + if (atts.hasOwnProperty(name)) { + a = atts[name]; + if (!a.optional && (a.types.length > 0 || a.values.length !== 1)) { + if (s) { + s += ", "; + } + s += name.toLowerCase(); + } + } + } + return s; +} +function writeRequiredAttributesSetters(atts) { + "use strict"; + var name, a; + for (name in atts) { + if (atts.hasOwnProperty(name)) { + a = atts[name]; + if (!a.optional && (a.types.length > 0 || a.values.length !== 1)) { + out(" xml->addAttribute(\"" + a.nsname + "\", " + + name.toLowerCase() + ");"); + } + } + } +} +function writeMembers(e, atts, optional) { + "use strict"; + var ne, nsname, i, name, names; + if (e.name === "element") { + name = null; + } else if (e.name === "attribute") { + names = []; + getNames(e.e[0], names); + for (i = 0; i < names.length; i += 1) { + ne = names[i]; + name = getName(ne); + if (!atts.hasOwnProperty(name)) { + nsname = nsmap[ne.a.ns] + ":" + ne.text; + atts[name] = { + nsname: nsname, + values: [], + types: [], + optional: optional, + empty: false + }; + } + parseAttributes(e.e[1], atts[name]); + } + } else if (e.name === "choice") { + for (i = 0; i < e.e.length; i += 1) { + writeMembers(e.e[i], atts, true); + } + } else if (e.name === "interleave" || e.name === "group") { + for (i = 0; i < e.e.length; i += 1) { + writeMembers(e.e[i], atts, optional); + } + } else if (e.name === "oneOrMore") { + writeMembers(e.e[0], atts, optional); + } else if (e.name === "value") { + name = null; // todo + } else if (e.name === "data") { + name = null; // todo + } else if (e.name === "text") { + out(" void addTextNode(const QString& str) { xml->addTextNode(str); }"); + } else if (e.name === "empty") { + name = null; // todo + } else { + runtime.log("OOPS " + e.name); + throw null; + } +} +function defineClass(e, parents, children) { + "use strict"; + var c, p, i, + ne = e.e[0], + nsname = nsmap[ne.a.ns] + ":" + ne.text, + name = ne.cppname, atts = {}; + out("/**"); + out(" * Serialize a <" + nsname + "> element."); + out(" */"); + out("class " + name + "Writer {"); + for (c in children) { + if (children.hasOwnProperty(c) && c !== name) { + out("friend class " + c + "Writer;"); + } + } + out("public:"); + writeMembers(e.e[1], atts, false); + writeOptionalAttributes(atts); + e.requiredAttributes = getRequiredAttributeArguments(atts); + e.requiredAttributeCall = getRequiredAttributeCall(atts); + out("private:"); + out(" inline void start(" + e.requiredAttributes + ") {"); + out(" xml->startElement(\"" + nsname + "\");"); + if (e.requiredAttributes) { + e.requiredAttributes = ", " + e.requiredAttributes; + } + writeFixedRequiredAttributes(atts); + writeRequiredAttributesSetters(atts); + out(" }"); + out("public:"); + out(" KoXmlWriter* const xml;"); + for (p in parents) { + if (parents.hasOwnProperty(p)) { + out(" inline explicit " + name + "Writer(const " + p + + "Writer& p" + e.requiredAttributes + ");"); + } + } + out(" inline explicit " + name + "Writer(KoXmlWriter* xml_" + + e.requiredAttributes + + ") :xml(xml_) { start(" + e.requiredAttributeCall + "); }"); + out(" void end() { xml->endElement(); }"); + out(" void operator=(const " + name + "Writer&) { }"); + out("};"); +} +function defineConstructors(e, parents) { + "use strict"; + var p, + ne = e.e[0], + nsname = nsmap[ne.a.ns] + ":" + ne.text, + name = ne.cppname; + for (p in parents) { + if (parents.hasOwnProperty(p)) { + out(name + "Writer::" + name + "Writer(const " + p + + "Writer& p" + e.requiredAttributes + + ") :xml(p.xml) { start(" + e.requiredAttributeCall + "); }"); + } + } +} +function getChildren(e, children) { + "use strict"; + var name, i, names; + if (e.name === "element") { + names = []; + getNames(e.e[0], names); + for (i = 0; i < names.length; i += 1) { + children[names[i].cppname] = 1; + } + } else if (e.name === "choice" || e.name === "interleave" + || e.name === "group") { + for (i = 0; i < e.e.length; i += 1) { + getChildren(e.e[i], children); + } + } else if (e.name === "oneOrMore") { + getChildren(e.e[0], children); + } else if (e.name === "attribute" || e.name === "value" || + e.name === "data" || e.name === "text" || e.name === "empty") { + name = null; // ignore + } else { + runtime.log("OOPS " + e.name); + throw null; + } +} +function childrenToParents(childrenmap) { + "use strict"; + var p, children, c, parents = {}; + for (p in childrenmap) { + if (childrenmap.hasOwnProperty(p)) { + children = childrenmap[p]; + for (c in children) { + if (children.hasOwnProperty(c)) { + if (!parents.hasOwnProperty(c)) { + parents[c] = {}; + } + parents[c][p] = 1; + } + } + } + } + return parents; +} +function toCPP(elements) { + "use strict"; + out("#include "); + + // first get a mapping for all the parents + var children = {}, parents = {}, i, j, ce, ec, name, names, c, + elementMap = {}, sortedElementNames = []; + for (i = 0; i < elements.length; i += 1) { + ce = elements[i]; + if (ce.name !== "element") { + runtime.log("Error in parsed data."); + return; + } + names = []; + getNames(ce.e[0], names); + for (j = 0; j < names.length; j += 1) { + name = getName(names[j]); + while (elementMap.hasOwnProperty(name)) { + name = name + "_"; + } + names[j].cppname = name; + ec = {e: [names[j], ce.e[1]]}; + elementMap[name] = ec; + sortedElementNames.push(name); + } + } + sortedElementNames.sort(); + + for (i = 0; i < sortedElementNames.length; i += 1) { + name = sortedElementNames[i]; + c = {}; + getChildren(elementMap[name].e[1], c); + children[name] = c; + } + parents = childrenToParents(children); + + for (i = 0; i < sortedElementNames.length; i += 1) { + name = sortedElementNames[i]; + out("class " + name + "Writer;"); + } + for (i = 0; i < sortedElementNames.length; i += 1) { + name = sortedElementNames[i]; + defineClass(elementMap[name], parents[name], children[name]); + } + for (i = 0; i < sortedElementNames.length; i += 1) { + name = sortedElementNames[i]; + defineConstructors(elementMap[name], parents[name]); + } +} + +// load and parse the Relax NG +runtime.loadXML(relaxngurl, function (err, dom) { + "use strict"; + var parser = new xmldom.RelaxNGParser(); + if (err) { + runtime.log(err); + } else { + err = parser.parseRelaxNGDOM(dom); + if (err) { + runtime.log(err); + } else { + toCPP(parser.elements); + } + } +}); diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.rng new file mode 100644 index 0000000000..0c4e4baa8d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.rng @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + 1.2 + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.xml new file mode 100644 index 0000000000..71712e11e5 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test01.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.rng new file mode 100644 index 0000000000..ed37e255fd --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.rng @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + NamespaceTable + + + + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + chart + + + + + + + + table + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.xml new file mode 100644 index 0000000000..7e70255ed4 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test02.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.rng new file mode 100644 index 0000000000..8803f52898 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.rng @@ -0,0 +1,16 @@ + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.xml new file mode 100644 index 0000000000..a6255e802e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test03.xml @@ -0,0 +1,6 @@ + + + hello + + hi + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.rng new file mode 100644 index 0000000000..511b297efa --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.rng @@ -0,0 +1,18 @@ + + + + + + + 1.2 + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.xml new file mode 100644 index 0000000000..21ceee55b1 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test04.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.rng new file mode 100644 index 0000000000..c0c73052f2 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.rng @@ -0,0 +1,42 @@ + + + + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.xml new file mode 100644 index 0000000000..38cb418bde --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test05.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.rng new file mode 100644 index 0000000000..c744850f98 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.rng @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.xml new file mode 100644 index 0000000000..a9c24656ea --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test06.xml @@ -0,0 +1,4 @@ + + + hello + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.rng new file mode 100644 index 0000000000..fb37cf8275 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.rng @@ -0,0 +1,52 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + boolean + short + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.xml new file mode 100644 index 0000000000..a5361bf155 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test07.xml @@ -0,0 +1,14 @@ + + + + + true + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.rng new file mode 100644 index 0000000000..82c2de66c5 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.rng @@ -0,0 +1,52 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + boolean + string + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.xml new file mode 100644 index 0000000000..71af08046c --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test08.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.rng new file mode 100644 index 0000000000..1726996897 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.rng @@ -0,0 +1,30 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.xml new file mode 100644 index 0000000000..a54dd99e4b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test09.xml @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.rng new file mode 100644 index 0000000000..5e271a4389 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.rng @@ -0,0 +1,50 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.xml new file mode 100644 index 0000000000..f4087a8976 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test10.xml @@ -0,0 +1,13 @@ + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.rng new file mode 100644 index 0000000000..2df604b5b8 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.rng @@ -0,0 +1,75 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.xml new file mode 100644 index 0000000000..d272fd4e3e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test11.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.rng new file mode 100644 index 0000000000..a0e79a356e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.rng @@ -0,0 +1,97 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.xml new file mode 100644 index 0000000000..a3f2a5d725 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test12.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.rng new file mode 100644 index 0000000000..47a2161ed9 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.rng @@ -0,0 +1,71 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.xml new file mode 100644 index 0000000000..8f46daa4ce --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test13.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.rng new file mode 100644 index 0000000000..61a8c9e2b4 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.rng @@ -0,0 +1,45 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + table + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.xml new file mode 100644 index 0000000000..6c16a1d614 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test14.xml @@ -0,0 +1,12 @@ + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.rng new file mode 100644 index 0000000000..63557c6e2b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.rng @@ -0,0 +1,47 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.xml new file mode 100644 index 0000000000..4d8361aaa6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test15.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.rng new file mode 100644 index 0000000000..32c6cb8e2c --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.rng @@ -0,0 +1,46 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.xml new file mode 100644 index 0000000000..4d8361aaa6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test16.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.rng new file mode 100644 index 0000000000..ffcd9bd4f9 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.rng @@ -0,0 +1,51 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.xml new file mode 100644 index 0000000000..0947bff2b1 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test17.xml @@ -0,0 +1,17 @@ + + + + + + + 03 + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.rng new file mode 100644 index 0000000000..9ddbb9baaf --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.rng @@ -0,0 +1,25 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.xml new file mode 100644 index 0000000000..cc6ab02761 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test18.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.rng new file mode 100644 index 0000000000..ac676d982d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.rng @@ -0,0 +1,43 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + + + text:reference-ref + text:bookmark-ref + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.xml new file mode 100644 index 0000000000..c562015a37 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test19.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.rng new file mode 100644 index 0000000000..bd6b4e0f05 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.rng @@ -0,0 +1,32 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.xml new file mode 100644 index 0000000000..e28b855386 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test20.xml @@ -0,0 +1,11 @@ + + + + + ,, + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.rng new file mode 100644 index 0000000000..032886009d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.rng @@ -0,0 +1,47 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + misc + + + + + text:url + text:custom5 + text:year + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.xml new file mode 100644 index 0000000000..fec92948f9 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test21.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.rng new file mode 100644 index 0000000000..154c810975 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.rng @@ -0,0 +1,32 @@ + + + + + + 1.2 + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.xml new file mode 100644 index 0000000000..dd84419d66 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test22.xml @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.rng b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.rng new file mode 100644 index 0000000000..1a02206d04 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.rng @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.xml b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.xml new file mode 100644 index 0000000000..b622196b05 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/relaxngtests/test23.xml @@ -0,0 +1,4 @@ + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/roundtripodf.js b/apps/files_odfviewer/src/webodf/webodf/roundtripodf.js new file mode 100644 index 0000000000..6d16d1b2a3 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/roundtripodf.js @@ -0,0 +1,71 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, odf: true*/ +runtime.loadClass("odf.OdfContainer"); + +/** + * If the state of the OdfContainer is invalid, exit with an error message. + */ +function exitOnInvalid(odffilepath, odfcontainer) { + "use strict"; + if (odfcontainer.state === odf.OdfContainer.INVALID) { + runtime.log("Document " + odffilepath + " is invalid."); + runtime.exit(1); + } + if (odfcontainer.state === odf.OdfContainer.DONE) { + odfcontainer.save(function (err) { + if (err) { + runtime.log(err); + runtime.exit(1); + } + }); + } +} + +/** + * Load an ODF document. Report an error if there is a problem. + */ +function loadODF(odffilepath) { + "use strict"; + var odfcontainer = new odf.OdfContainer(odffilepath); + odfcontainer.onstatereadychange = function () { + exitOnInvalid(odffilepath, odfcontainer); + }; + exitOnInvalid(odffilepath, odfcontainer); +} + +// loop over arguments to load ODF +var i; +for (i = 1; i < arguments.length; i += 1) { + loadODF(arguments[i]); +} diff --git a/apps/files_odfviewer/src/webodf/webodf/roundtripzip.js b/apps/files_odfviewer/src/webodf/webodf/roundtripzip.js new file mode 100644 index 0000000000..d3fe17fc81 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/roundtripzip.js @@ -0,0 +1,64 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true*/ +runtime.loadClass("core.Zip"); + +/** + * Load an ODF document. Report an error if there is a problem. + */ +function roundTripZip(zipfilepath) { + "use strict"; + var zip = new core.Zip(zipfilepath, function (err, zip) { + if (err) { + runtime.log(err); + runtime.exit(1); + } + // the TOC of the zip is loaded at this point + // now we want to load all parts in memory so we can save them again + zip.write(function (err) { + if (err) { + runtime.log(err); + runtime.exit(1); + } + // at this point a zip file should have been written with the same + // contents as the one that was read + runtime.exit(0); + }); + }); +} + +// loop over arguments to load ODF +var i; +for (i = 1; i < arguments.length; i += 1) { + roundTripZip(arguments[i]); +} diff --git a/apps/files_odfviewer/src/webodf/webodf/styleNameRef b/apps/files_odfviewer/src/webodf/webodf/styleNameRef new file mode 100644 index 0000000000..39b2914746 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/styleNameRef @@ -0,0 +1,272 @@ +# cat styles.xml|xmlstarlet sel -N style=urn:oasis:names:tc:opendocument:xmlns:style:1.0 -t -m "//*[@style:family='graphic']/@style:name" -v . - + +gradient + draw:fill-gradient-name style:drawing-page-properties + draw:fill-gradient-name style:graphic-properties + +hatch + draw:fill-hatch-name style:drawing-page-properties + draw:fill-hatch-name style:graphic-properties + +fill-image + draw:fill-image-name style:drawing-page-properties + draw:fill-image-name style:graphic-properties + +marker + draw:marker-end style:graphic-properties + draw:marker-start style:graphic-properties + +dash + draw:stroke-dash style:graphic-properties + +opacity + draw:opacity-name style:drawing-page-properties + draw:opacity-name style:graphic-properties + +master page + draw:master-page-name draw:page + style:master-page-name style:style + style:next-style-name style:master-page + text:master-page-name text:notes-configuration + text:master-page-name text:page + +presentation-page-layout + presentation:presentation-page-layout-name draw:page + presentation:presentation-page-layout-name draw:handout-master + +page-layout + style:page-layout-name presentation:notes + style:page-layout-name style:handout-master + style:page-layout-name style:master-page + +list + text:style-name text:list + text:style-name text:numbered-paragraph + text:style-override text:list-item + style:list-style-name style:style + +data + style:data-style-name style:style + style:percentage-data-style-name style:style + style:data-style-name presentation:date-time-decl + style:data-style-name text:creation-date + style:data-style-name text:creation-time + style:data-style-name text:database-display + style:data-style-name text:date + style:data-style-name text:editing-duration + style:data-style-name text:expression + style:data-style-name text:meta-field + style:data-style-name text:modification-date + style:data-style-name text:modification-time + style:data-style-name text:print-date + style:data-style-name text:print-time + style:data-style-name text:table-formula + style:data-style-name text:time + style:data-style-name text:user-defined + style:data-style-name text:user-field-get + style:data-style-name text:user-field-input + style:data-style-name text:variable-get + style:data-style-name text:variable-input + style:data-style-name text:variable-set + +chart + chart:style-name chart:axis + chart:style-name chart:chart + chart:style-name chart:data-label + chart:style-name chart:data-point + chart:style-name chart:equation + chart:style-name chart:error-indicator + chart:style-name chart:floor + chart:style-name chart:footer + chart:style-name chart:grid + chart:style-name chart:legend + chart:style-name chart:mean-value + chart:style-name chart:plot-area + chart:style-name chart:regression-curve + chart:style-name chart:series + chart:style-name chart:stock-gain-marker + chart:style-name chart:stock-loss-marker + chart:style-name chart:stock-range-line + chart:style-name chart:subtitle + chart:style-name chart:title + chart:style-name chart:wall + +---- + +drawing-page + draw:style-name draw:page + draw:style-name presentation:notes + draw:style-name style:handout-master + draw:style-name style:master-page + +graphic + draw:style-name dr3d:cube + draw:style-name dr3d:extrude + draw:style-name dr3d:rotate + draw:style-name dr3d:scene + draw:style-name dr3d:sphere + draw:style-name draw:caption + draw:style-name draw:circle + draw:style-name draw:connector + draw:style-name draw:control + draw:style-name draw:custom-shape + draw:style-name draw:ellipse + draw:style-name draw:frame + draw:style-name draw:g + draw:style-name draw:line + draw:style-name draw:measure + draw:style-name draw:page-thumbnail + draw:style-name draw:path + draw:style-name draw:polygon + draw:style-name draw:polyline + draw:style-name draw:rect + draw:style-name draw:regular-polygon + draw:style-name office:annotation + +paragraph + draw:text-style-name draw:caption + draw:text-style-name draw:circle + draw:text-style-name draw:connector + draw:text-style-name draw:control + draw:text-style-name draw:custom-shape + draw:text-style-name draw:ellipse + draw:text-style-name draw:frame + draw:text-style-name draw:line + draw:text-style-name draw:measure + draw:text-style-name draw:path + draw:text-style-name draw:polygon + draw:text-style-name draw:polyline + draw:text-style-name draw:rect + draw:text-style-name draw:regular-polygon + draw:text-style-name office:annotation + form:text-style-name form:column + style:next-style-name style:style + table:paragraph-style-name table:body + table:paragraph-style-name table:even-columns + table:paragraph-style-name table:even-rows + table:paragraph-style-name table:first-column + table:paragraph-style-name table:first-row + table:paragraph-style-name table:last-column + table:paragraph-style-name table:last-row + table:paragraph-style-name table:odd-columns + table:paragraph-style-name table:odd-rows + text:default-style-name text:notes-configuration + text:style-name text:alphabetical-index-entry-template + text:style-name text:bibliography-entry-template + text:style-name text:h + text:style-name text:illustration-index-entry-template + text:style-name text:index-source-style + text:style-name text:object-index-entry-template + text:style-name text:p + text:style-name text:table-index-entry-template + text:style-name text:table-of-content-entry-template + text:style-name text:table-index-entry-template + text:style-name text:user-index-entry-template + style:register-truth-ref-style-name style:page-layout-properties + +presentation + presentation:style-name dr3d:cube + presentation:style-name dr3d:extrude + presentation:style-name dr3d:rotate + presentation:style-name dr3d:scene + presentation:style-name dr3d:sphere + presentation:style-name draw:caption + presentation:style-name draw:circle + presentation:style-name draw:connector + presentation:style-name draw:control + presentation:style-name draw:custom-shape + presentation:style-name draw:ellipse + presentation:style-name draw:frame + presentation:style-name draw:g + presentation:style-name draw:line + presentation:style-name draw:measure + presentation:style-name draw:page-thumbnail + presentation:style-name draw:path + presentation:style-name draw:polygon + presentation:style-name draw:polyline + presentation:style-name draw:rect + presentation:style-name draw:regular-polygon + presentation:style-name office:annotation + +ruby + text:style-name text:ruby + +section + text:style-name text:alphabetical-index + text:style-name text:bibliography + text:style-name text:illustration-index + text:style-name text:index-title + text:style-name text:object-index + text:style-name text:section + text:style-name text:table-of-content + text:style-name text:table-index + text:style-name text:user-index + +table-cell + db:default-cell-style-name db:column + table:default-cell-style-name table:table-column + table:default-cell-style-name table:table-row + table:style-name table:body + table:style-name table:covered-table-cell + table:style-name table:even-columns + table:style-name table:covered-table-cell + table:style-name table:even-columns + table:style-name table:even-rows + table:style-name table:first-column + table:style-name table:first-row + table:style-name table:last-column + table:style-name table:last-row + table:style-name table:odd-columns + table:style-name table:odd-rows + table:style-name table:table-cell + +table-row + db:default-row-style-name db:query + db:default-row-style-name db:table-representation + table:style-name table:table-row + +table-column + db:style-name db:column + table:style-name table:table-column + +table + db:style-name db:query + db:style-name db:table-representation + table:style-name table:background + table:style-name table:table + +text + style:leader-text-style style:tab-stop + style:style-name style:drop-cap + text:citation-body-style-name text:notes-configuration + text:citation-style-name text:notes-configuration + text:style-name text:a + text:style-name text:alphabetical-index + text:style-name text:linenumbering-configuration + text:style-name text:list-level-style-number + text:style-name text:ruby-text + text:style-name text:span + text:visited-style-name text:a + style:text-line-through-text-style style:text-properties + text:main-entry-style-name text:alphabetical-index-source + text:style-name text:index-entry-bibliography + text:style-name text:index-entry-chapter + text:style-name text:index-entry-link-end + text:style-name text:index-entry-link-start + text:style-name text:index-entry-page-number + text:style-name text:index-entry-span + text:style-name text:index-entry-tab-stop + text:style-name text:index-entry-text + text:style-name text:index-title-template + text:style-name text:list-level-style-bullet + text:style-name text:outline-level-style + + +--- + +conditional style + text:cond-style-name text:h + text:cond-style-name text:p + +style:apply-style-name # complicated! +style:parent-style-name # complicated! diff --git a/apps/files_odfviewer/src/webodf/webodf/styleNameRefs b/apps/files_odfviewer/src/webodf/webodf/styleNameRefs new file mode 100644 index 0000000000..e63e3562df --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/styleNameRefs @@ -0,0 +1,57 @@ +dash + draw:stroke-dash-names style:graphic-properties + +graphic + draw:class-names dr3d:cube + draw:class-names dr3d:extrude + draw:class-names dr3d:rotate + draw:class-names dr3d:scene + draw:class-names dr3d:sphere + draw:class-names draw:caption + draw:class-names draw:circle + draw:class-names draw:connector + draw:class-names draw:control + draw:class-names draw:custom-shape + draw:class-names draw:ellipse + draw:class-names draw:frame + draw:class-names draw:g + draw:class-names draw:line + draw:class-names draw:measure + draw:class-names draw:page-thumbnail + draw:class-names draw:path + draw:class-names draw:polygon + draw:class-names draw:polyline + draw:class-names draw:rect + draw:class-names draw:regular-polygon + draw:class-names office:annotation + +paragraph + text:class-names text:h + text:class-names text:p + +presentation + presentation:class-names dr3d:cube + presentation:class-names dr3d:extrude + presentation:class-names dr3d:rotate + presentation:class-names dr3d:scene + presentation:class-names dr3d:sphere + presentation:class-names draw:caption + presentation:class-names draw:circle + presentation:class-names draw:connector + presentation:class-names draw:control + presentation:class-names draw:custom-shape + presentation:class-names draw:ellipse + presentation:class-names draw:frame + presentation:class-names draw:g + presentation:class-names draw:line + presentation:class-names draw:measure + presentation:class-names draw:page-thumbnail + presentation:class-names draw:path + presentation:class-names draw:polygon + presentation:class-names draw:polyline + presentation:class-names draw:rect + presentation:class-names draw:regular-polygon + presentation:class-names office:annotation + +text + text:class-names text:span diff --git a/apps/files_odfviewer/src/webodf/webodf/testrelaxng.js b/apps/files_odfviewer/src/webodf/webodf/testrelaxng.js new file mode 100644 index 0000000000..875faa9de8 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/testrelaxng.js @@ -0,0 +1,91 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, xmldom: true*/ +runtime.loadClass("xmldom.RelaxNG"); +runtime.loadClass("xmldom.RelaxNG2"); + +function validate(relaxng, relaxng2, url) { + "use strict"; + runtime.loadXML(url, function (err, dom) { + var walker; + if (err) { + runtime.log("Could not read " + url + ": " + err); + } else { + walker = dom.createTreeWalker(dom.firstChild, 0xFFFFFFFF); + relaxng.validate(walker, function (err) { + if (err) { + var i; + runtime.log("Found " + String(err.length) + + " error validating " + url + ":"); + for (i = 0; i < err.length; i += 1) { + runtime.log(err[i].message()); + } + } + }); + relaxng2.validate(walker, function (err) { + if (err) { + var i; + runtime.log("Found " + String(err.length) + + " error validating " + url + ":"); + for (i = 0; i < err.length; i += 1) { + runtime.log(err[i].message()); + } + } + }); + } + }); +} + +var args = arguments, + relaxngurl = args[1]; + +// load and parse the Relax NG +runtime.loadXML(relaxngurl, function (err, dom) { + "use strict"; + var parser, i, relaxng, relaxng2; + if (err) { + return; + } + parser = new xmldom.RelaxNGParser(); + relaxng = new xmldom.RelaxNG(); + relaxng2 = new xmldom.RelaxNG2(); + err = parser.parseRelaxNGDOM(dom, relaxng.makePattern); + relaxng.init(parser.rootPattern); + relaxng2.init(parser.start, parser.nsmap); + + // loop over arguments to load ODF + for (i = 2; i < args.length; i += 1) { + runtime.log("Validating " + args[i] + " from " + relaxngurl); + validate(relaxng, relaxng2, args[i]); + } +}); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/Base64Tests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/Base64Tests.js new file mode 100644 index 0000000000..10156a1dc4 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/core/Base64Tests.js @@ -0,0 +1,105 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core: true, runtime: true*/ +runtime.loadClass("core.Base64"); +/** + * @constructor + * @param runner {UnitTestRunner} + * @implements {core.UnitTest} + */ +core.Base64Tests = function Base64Tests(runner) { + "use strict"; + var t, r = runner, base64 = new core.Base64(); + + function testConvertByteArrayToBase64() { + t.encoded = base64.convertByteArrayToBase64([65]); + r.shouldBe(t, "t.encoded", "'QQ=='"); + t.encoded = base64.convertByteArrayToBase64([65, 65]); + r.shouldBe(t, "t.encoded", "'QUE='"); + t.encoded = base64.convertByteArrayToBase64([65, 65, 65]); + r.shouldBe(t, "t.encoded", "'QUFB'"); + } + + function testToBase64() { + t.encoded = base64.toBase64("A"); + r.shouldBe(t, "t.encoded", "'QQ=='"); + t.encoded = base64.toBase64("AA"); + r.shouldBe(t, "t.encoded", "'QUE='"); + t.encoded = base64.toBase64("AAA"); + r.shouldBe(t, "t.encoded", "'QUFB'"); + } + + function testConvertUTF8StringToUTF16String(callback) { + var bin = "1234567890"; + while (bin.length < 100000) { + bin += bin; + } + t.numcallbacks = 0; + base64.convertUTF8StringToUTF16String(bin, function (str, done) { + t.numcallbacks += 1; + t.done = done; + if (t.numcallbacks === 1) { + r.shouldBe(t, "t.done", "false"); + } else { + r.shouldBe(t, "t.done", "true"); + } + if (done) { + r.shouldBe(t, "t.numcallbacks", "2"); + t.str = str; + t.bin = bin; + r.shouldBe(t, "t.str.length", "t.bin.length"); + callback(); + } + return true; + }); + } + + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return [ + testConvertByteArrayToBase64, + testToBase64 + ]; + }; + this.asyncTests = function () { + return [ testConvertUTF8StringToUTF16String ]; + }; + this.description = function () { + return "Test the Base64 class."; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/CursorTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/CursorTests.js new file mode 100644 index 0000000000..c9f7be78a6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/core/CursorTests.js @@ -0,0 +1,238 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core: true, runtime: true*/ +runtime.loadClass("core.Cursor"); + +/** + * @constructor + * @param {core.UnitTestRunner} runner + * @implements {core.UnitTest} + */ +core.CursorTests = function CursorTests(runner) { + "use strict"; + var r = runner, tests, t = {}, + maindoc = runtime.getWindow().document, + testarea = maindoc.getElementById("testarea"); + /** + * @param {Selection} selection + * @param {Node} startnode + * @param {number} startoffset + * @param {Node=} endnode + * @param {number=} endoffset + * @return {undefined} + */ + function setSelection(selection, startnode, startoffset, endnode, + endoffset) { + // call createRange() on the document, even if startnode is the document + var range = (startnode.ownerDocument || startnode).createRange(); + selection.removeAllRanges(); + range.setStart(startnode, startoffset); + if (endnode) { + range.setEnd(endnode, endoffset); + } else { + range.setEnd(startnode, startoffset); + } + selection.addRange(range); + if (range.startContainer !== startnode) { + runtime.log("EVIL"); + } + } + + function setupEmptyRootNode() { + var selection = runtime.getWindow().getSelection(), + root = maindoc.createElementNS("", "p"), + cursor = new core.Cursor(selection, maindoc); + testarea.appendChild(root); + t = { selection: selection, root: root, cursor: cursor }; + runner.shouldBeNonNull(t, "t.selection"); + } + + function setupSimpleTextDoc() { + setupEmptyRootNode(); + t.textnode = maindoc.createTextNode("abc"); + t.root.appendChild(t.textnode); + } + + tests = [ + // create a document, add a cursor and check that the cursor is present + function testOnEmptyNode1() { + // if the document is the container of the selection, the cursor + // can not be in the DOM + setupEmptyRootNode(); + setSelection(t.selection, t.root, 0); + t.cursor.updateToSelection(); + //r.shouldBeNull(t, "t.cursor.getNode().parentNode"); + }, + function testOnEmptyNode2() { + setupEmptyRootNode(); + setSelection(t.selection, t.root, 0); + // t.selection.focusNode = r.root; + var range = t.selection.getRangeAt(0); + t.cursor.updateToSelection(); + r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); + r.shouldBeNull(t, "t.cursor.getNode().previousSibling"); + r.shouldBeNull(t, "t.cursor.getNode().nextSibling"); + }, + function testOnSimpleText() { + setupSimpleTextDoc(); + // put the cursor at the start of the text node + setSelection(t.selection, t.textnode, 0); + t.cursor.updateToSelection(); + r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); + r.shouldBeNull(t, "t.cursor.getNode().previousSibling"); + r.shouldBe(t, "t.cursor.getNode().nextSibling.nodeValue", "'abc'"); + }, + function testOnSimpleText2() { + setupSimpleTextDoc(); + // put the cursor in the middle of the text node + setSelection(t.selection, t.textnode, 1); + t.cursor.updateToSelection(); + r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); + r.shouldBe(t, "t.cursor.getNode().previousSibling.nodeValue", "'a'"); + r.shouldBe(t, "t.cursor.getNode().nextSibling.nodeValue", "'bc'"); + }, + function testOnSimpleText3() { + setupSimpleTextDoc(); + // put the cursor at the end of the text node + setSelection(t.selection, t.textnode, 3); + t.cursor.updateToSelection(); + r.shouldBeNonNull("t.cursor.getNode().parentNode"); + r.shouldBe(t, "t.cursor.getNode().previousSibling.nodeValue", "'abc'"); + r.shouldBeNull(t, "t.cursor.getNode().nextSibling"); + }, + function testOnSimpleText4() { + var textnode2; + setupSimpleTextDoc(); + // put the cursor between 'a' and 'b', then change the selection to + // be between 'b' and 'c' and update the cursor + setSelection(t.selection, t.textnode, 1); + t.cursor.updateToSelection(); + textnode2 = t.cursor.getNode().nextSibling; + setSelection(t.selection, textnode2, 1); + t.cursor.updateToSelection(); + r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); + r.shouldBe(t, "t.cursor.getNode().previousSibling.nodeValue", "'ab'"); + r.shouldBe(t, "t.cursor.getNode().nextSibling.nodeValue", "'c'"); + }, + function testOnSimpleText5() { + var textnode2; + setupSimpleTextDoc(); + // put the cursor between 'a' and 'b', then change the selection to + // span the entire text and update the cursor + setSelection(t.selection, t.textnode, 1); + t.cursor.updateToSelection(); + textnode2 = t.cursor.getNode().nextSibling; + setSelection(t.selection, t.textnode, 0, textnode2, 2); + t.cursor.updateToSelection(); + r.shouldBe(t, "t.selection.rangeCount", "1"); +// only null if working on a separate document +// r.shouldBeNull(t, "t.cursor.getNode().parentNode"); + t.range = t.selection.getRangeAt(0); + r.shouldBe(t, "t.range.startContainer", "t.textnode"); + r.shouldBe(t, "t.range.startOffset", "0"); + r.shouldBe(t, "t.range.endContainer", "t.textnode"); + r.shouldBe(t, "t.range.endOffset", "3"); + }, + function testOnSimpleText5b() { + var textnode2; + setupSimpleTextDoc(); + setSelection(t.selection, t.textnode, 1); + t.cursor.updateToSelection(); + textnode2 = t.cursor.getNode().nextSibling; + setSelection(t.selection, t.textnode.parentNode, 1, textnode2, 2); + t.cursor.updateToSelection(); + r.shouldBe(t, "t.selection.rangeCount", "1"); +// only null if working on a separate document +// r.shouldBeNull(t, "t.cursor.getNode().parentNode"); + t.range = t.selection.getRangeAt(0); + r.shouldBe(t, "t.range.startContainer", "t.textnode"); + r.shouldBe(t, "t.range.startOffset", "1"); + r.shouldBe(t, "t.range.endContainer", "t.textnode"); + r.shouldBe(t, "t.range.endOffset", "3"); + }, + function testOnSimpleText6() { + var somenode, textnode2; + setupSimpleTextDoc(); + // add a child node to the cursor + somenode = maindoc.createElement("p"); + t.cursor.getNode().appendChild(somenode); + // select a single position so the cursor is put in the document + setSelection(t.selection, t.textnode, 1); + t.cursor.updateToSelection(); + r.shouldBeNonNull(t, "t.cursor.getNode().parentNode"); + textnode2 = t.cursor.getNode().nextSibling; + // select a range starting at the node in the cursor, but extends + // out of the the cursor + // this should have the result that the cursor is removed from the + // document and that the text nodes around the cursor are + // merged + setSelection(t.selection, somenode, 0, textnode2, 2); + t.cursor.updateToSelection(); +// only null if working on a separate document +// r.shouldBeNull(t, "t.cursor.getNode().parentNode"); + t.range = t.selection.getRangeAt(0); + r.shouldBe(t, "t.range.startContainer", "t.textnode"); + r.shouldBe(t, "t.range.startOffset", "1"); + r.shouldBe(t, "t.range.endContainer", "t.textnode"); + r.shouldBe(t, "t.range.endOffset", "3"); + r.shouldBe(t, "t.range.collapsed", "false"); + } + ]; + this.setUp = function () { + t = {}; + while (testarea.firstChild) { + testarea.removeChild(testarea.firstChild); + } + }; + this.tearDown = function () { + t = {}; + while (testarea.firstChild) { + testarea.removeChild(testarea.firstChild); + } + }; + this.tests = function () { + return tests; + }; + this.asyncTests = function () { + return []; + }; +}; +core.CursorTests.name = "CursorTests"; +core.CursorTests.prototype.description = function () { + "use strict"; + return "Test the Cursor class."; +}; +(function () { + "use strict"; + return core.CursorTests; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/PointWalkerTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/PointWalkerTests.js new file mode 100644 index 0000000000..dbb690f77e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/core/PointWalkerTests.js @@ -0,0 +1,135 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core: true, runtime: true*/ +runtime.loadClass("core.PointWalker"); + +/** + * @constructor + * @param runner {UnitTestRunner} + * @implements {core.UnitTest} + */ +core.PointWalkerTests = function PointWalkerTests(runner) { + "use strict"; + var t, r = runner; + + function checkWalker(node, count, endpos) { + t = {}; + t.node = node; + t.walker = new core.PointWalker(node); + t.count = count; + t.countForward = 0; + t.countBackward = 0; + t.endpos = endpos; + t.walker.setPoint(t.node, 0); + while (t.walker.stepForward()) { + t.countForward += 1; + } + r.shouldBe(t, "t.countForward", "t.count"); + r.shouldBe(t, "t.walker.precedingSibling()", "t.node.lastChild"); + r.shouldBe(t, "t.walker.followingSibling()", "null"); + if (endpos !== null) { + r.shouldBe(t, "t.walker.position()", "t.endpos"); + } + t.walker.setPoint(t.node, endpos); + while (t.walker.stepBackward()) { + t.countBackward += 1; + } + r.shouldBe(t, "t.countBackward", "t.count"); + r.shouldBe(t, "t.walker.precedingSibling()", "null"); + r.shouldBe(t, "t.walker.followingSibling()", "t.node.firstChild"); + r.shouldBe(t, "t.walker.position()", "0"); + } + + function testEmptyDocument() { + var doc = runtime.getDOMImplementation().createDocument("", "p", null), + p = doc.firstChild, + textnode1, + textnode2, + textnode3, + em; + + checkWalker(doc, 2, 1); + checkWalker(p, 0, 0); + + t = {}; + t.doc = doc; + t.walker = new core.PointWalker(t.doc); + r.shouldBe(t, "t.walker.position()", "0"); + r.shouldBe(t, "t.walker.stepForward()", "true"); + r.shouldBe(t, "t.walker.position()", "0"); + r.shouldBe(t, "t.walker.stepForward()", "true"); + r.shouldBe(t, "t.walker.position()", "1"); + r.shouldBe(t, "t.walker.stepForward()", "false"); + r.shouldBe(t, "t.walker.position()", "1"); + r.shouldBe(t, "t.walker.stepBackward()", "true"); + r.shouldBe(t, "t.walker.position()", "0"); + r.shouldBe(t, "t.walker.stepBackward()", "true"); + r.shouldBe(t, "t.walker.position()", "0"); + r.shouldBe(t, "t.walker.stepBackward()", "false"); + r.shouldBe(t, "t.walker.position()", "0"); + + textnode1 = doc.createTextNode("hello, "); + textnode2 = doc.createTextNode("big "); + textnode3 = doc.createTextNode("world."); + em = doc.createElement('em'); + p.appendChild(textnode1); + p.appendChild(em); + em.appendChild(textnode2); + p.appendChild(textnode3); + + checkWalker(textnode1, 7, 7); + checkWalker(textnode2, 4, 4); + checkWalker(textnode3, 6, 6); + checkWalker(em, 6, 1); + checkWalker(p, 25, 3); + checkWalker(doc, 27, 1); + } + + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return [ + testEmptyDocument + ]; + }; + this.asyncTests = function () { + return []; + }; + this.description = function () { + return "Test the PointWalker class."; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/RuntimeTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/RuntimeTests.js new file mode 100644 index 0000000000..d3f7c2dfa2 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/core/RuntimeTests.js @@ -0,0 +1,119 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core: true, runtime: true*/ +/*jslint bitwise: true*/ + +/** + * @constructor + * @param runner {UnitTestRunner} + * @implements {core.UnitTest} + */ +core.RuntimeTests = function RuntimeTests(runner) { + "use strict"; + var t, r = runner; + + function testRead(callback) { + runtime.read("tests.js", 2, 6, function (err, data) { + t.err = err; + r.shouldBeNull(t, "t.err"); + t.data = runtime.byteArrayToString(data, "utf8"); + r.shouldBe(t, "t.data", "'global'"); + callback(); + }); + } + + /** + * Test writing a binary file and reading it back. + */ + function testWrite(callback) { + var content = new core.ByteArrayWriter("utf8"), + i, max = 1024, filename, clean; + for (i = 0; i < max; i += 1) { + content.appendArray([i]); + } + content = content.getByteArray(); + filename = "tmp" + Math.random(); + clean = new core.ByteArrayWriter("utf8"); + for (i = 0; i < max; i += 1) { + clean.appendArray([content[i] & 0xff]); + } + clean = clean.getByteArray(); + // now content has content different from what is on the server + runtime.writeFile(filename, content, function (err) { + t.err = err; + r.shouldBeNull(t, "t.err"); + runtime.readFile(filename, "binary", function (err, data) { + t.err = err; + r.shouldBeNull(t, "t.err"); + t.data = data; + t.clean = clean; + r.shouldBe(t, "t.data.length", "t.clean.length"); + i = 0; + while (i < max && data[i] === clean[i]) { + i += 1; + } + if (i !== max) { + runtime.log("at " + String(i) + " " + data[i] + " vs " + + clean[i]); + } + t.i = i; + t.max = max; + r.shouldBe(t, "t.i", "t.max"); + // cleanup + runtime.deleteFile(filename, function (err) { + callback(); + }); + }); + }); + } + + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return [ + ]; + }; + this.asyncTests = function () { + return [ + testRead, + testWrite + ]; + }; + this.description = function () { + return "Test the runtime."; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/ZipTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/core/ZipTests.js new file mode 100644 index 0000000000..ad2ece55ad --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/core/ZipTests.js @@ -0,0 +1,141 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global core: true, runtime: true*/ +runtime.loadClass("core.Zip"); + +/** + * @constructor + * @param {core.UnitTestRunner} runner + * @implements {core.UnitTest} + */ +core.ZipTests = function ZipTests(runner) { + "use strict"; + var r = runner, + t; + + function testNonExistingFile(callback) { + var zip = new core.Zip("whatever", function (err) { + t.err = err; + r.shouldBeNonNull(t, "t.err"); + callback(); + }); + } + + function testNonZipFile(callback) { + var path = "core/ZipTests.js"; + // check that file exists + runtime.isFile(path, function (exists) { + t.exists = exists; + r.shouldBe(t, "t.exists", "true"); + // check that zip file opening returns an error + var zip = new core.Zip("core/ZipTests.js", function (err) { + t.err = err; + r.shouldBeNonNull(t, "t.err"); + callback(); + }); + }); + } + + function testHi(path, callback) { + var zip = new core.Zip(path, function (err, zip) { + t.err = err; + t.zip = zip; + r.shouldBeNull(t, "t.err"); + zip.load("hello", function (err, data) { + t.err = err; + r.shouldBeNull(t, "t.err"); + t.data = runtime.byteArrayToString(data, "utf8"); + r.shouldBe(t, "t.data.length", "16"); + r.shouldBe(t, "t.data", "'bonjour\\nbonjour\\n'"); + callback(); + }); + }); + } + + function testHiUncompressed(callback) { + testHi("core/hi-uncompressed.zip", callback); + } + + function testHiCompressed(callback) { + testHi("core/hi-compressed.zip", callback); + } + + function testCreateZip(callback) { + var filename = "writetest.zip", + zip = new core.Zip(filename, null), + data = runtime.byteArrayFromString( + "application/vnd.oasis.opendocument.text", "utf8"); + zip.save("mimetype", data, false, new Date()); + zip.load("mimetype", function (err, newdata) { + t.err = err; + r.shouldBeNull(t, "t.err"); + t.data = data; + t.newdata = newdata; + r.shouldBe(t, "t.data", "t.newdata"); + zip.write(function (err) { + t.err = err; + r.shouldBeNull(t, "t.err"); + runtime.deleteFile(filename, function (err) { + callback(); + }); + }); + }); + } + + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return []; + }; + this.asyncTests = function () { + return [ + testNonExistingFile, + testNonZipFile, + testHiUncompressed, + testHiCompressed, + testCreateZip + ]; + }; +}; +core.ZipTests.prototype.description = function () { + "use strict"; + return "Test the Zip class."; +}; +(function () { + "use strict"; + return core.ZipTests; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-compressed.zip b/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-compressed.zip new file mode 100644 index 0000000000..ff6d86c158 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-compressed.zip differ diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-uncompressed.zip b/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-uncompressed.zip new file mode 100644 index 0000000000..2eafff7ab9 Binary files /dev/null and b/apps/files_odfviewer/src/webodf/webodf/tests/core/hi-uncompressed.zip differ diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/gui/CaretTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/gui/CaretTests.js new file mode 100644 index 0000000000..05f1b9bcc5 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/gui/CaretTests.js @@ -0,0 +1,82 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, gui: true*/ +runtime.loadClass("gui.Caret"); + +/** + * @constructor + * @param {core.UnitTestRunner} runner + * @implements {core.UnitTest} + */ +gui.CaretTests = function CaretTests(runner) { + "use strict"; + var r = runner, + t; + + function setupEmptyDoc() { + var selection = runtime.getWindow().getSelection(), + doc = runtime.getDOMImplementation().createDocument("", "p", null), + caret = new gui.Caret(selection, doc); + t = { selection: selection, doc: doc }; //, cursor: cursor }; + runner.shouldBeNonNull(t, "t.selection"); + } + function setupSimpleTextDoc() { + setupEmptyDoc(); + t.textnode = t.doc.createTextNode("abc"); + t.doc.documentElement.appendChild(t.textnode); + } + function testOnUpDownTraversal() { + } + + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return []; + }; + this.asyncTests = function () { + return [ + ]; + }; +}; +gui.CaretTests.prototype.description = function () { + "use strict"; + return "Test the Caret class."; +}; +(function () { + "use strict"; + return gui.CaretTests; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/gui/SelectionMoverTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/gui/SelectionMoverTests.js new file mode 100644 index 0000000000..8b8275bcb8 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/gui/SelectionMoverTests.js @@ -0,0 +1,109 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, gui: true*/ +runtime.loadClass("gui.SelectionMover"); + +/** + * @constructor + * @param {core.UnitTestRunner} runner + * @implements {core.UnitTest} + */ +gui.SelectionMoverTests = function SelectionMoverTests(runner) { + "use strict"; + var r = runner, + t, testarea = runtime.getWindow().document.getElementById("testarea"); + + function setupDoc() { + var doc = testarea.ownerDocument, + selection = runtime.getWindow().getSelection(), + p = doc.createElement("p"), + walker = new core.PointWalker(p), + mover = new gui.SelectionMover(selection, walker); + testarea.appendChild(p); + p.appendChild(doc.createTextNode("MMMMM MMMMM MMMMM MMMMM MMMMM")); + p.style.width = "5em";// break line after each 'MMMMM' + selection.removeAllRanges(); + selection.addRange(doc.createRange()); + t = { doc: doc, p: p, selection: selection, mover: mover }; + } + function testUpDownTraversal() { + setupDoc(); + r.shouldBe(t, "t.selection.rangeCount", "1"); + t.r = t.selection.getRangeAt(0); + r.shouldBeNonNull(t, "t.r"); + t.r.setStart(t.p.firstChild, 0); + r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); + r.shouldBe(t, "t.r.startOffset", "0"); + t.mover.movePointForward(); + t.r = t.selection.getRangeAt(0); + r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); + r.shouldBe(t, "t.r.startOffset", "1"); + t.mover.movePointBackward(); + t.r = t.selection.getRangeAt(0); + r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); + r.shouldBe(t, "t.r.startOffset", "0"); + t.mover.moveLineForward(); +// t.selection.modify("move", "forward", "line"); + t.r = t.selection.getRangeAt(0); + r.shouldBe(t, "t.r.startContainer", "t.p.firstChild"); + r.shouldBe(t, "t.r.startOffset", "6"); + } + + this.setUp = function () { + t = {}; + while (testarea.firstChild) { + testarea.removeChild(testarea.firstChild); + } + }; + this.tearDown = function () { + t = {}; + while (testarea.firstChild) { + testarea.removeChild(testarea.firstChild); + } + }; + this.tests = function () { + return [ testUpDownTraversal ]; + }; + this.asyncTests = function () { + return [ + ]; + }; +}; +gui.SelectionMoverTests.prototype.description = function () { + "use strict"; + return "Test the SelectionMover class."; +}; +(function () { + "use strict"; + return gui.SelectionMoverTests; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/gui/XMLEditTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/gui/XMLEditTests.js new file mode 100644 index 0000000000..e253a72fea --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/gui/XMLEditTests.js @@ -0,0 +1,156 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global document: true, core: true, gui: true, runtime: true*/ +runtime.loadClass("core.PointWalker"); +runtime.loadClass("gui.XMLEdit"); + +/** + * @constructor + * @param runner {core.UnitTestRunner} + * @implements {core.UnitTest} + */ +gui.XMLEditTests = function XMLEditTests(runner) { + "use strict"; + var t, r = runner, tests; + + function checkWalker(node, count, endpos) { + t = {}; + t.node = node; + t.walker = new core.PointWalker(node); + t.count = count; + t.countForward = 0; + t.countBackward = 0; + t.endpos = endpos; + t.walker.setPoint(t.node, 0); + while (t.walker.stepForward()) { + t.countForward += 1; + } + r.shouldBe("t.countForward", "t.count"); + r.shouldBe("t.walker.precedingSibling()", "t.node.lastChild"); + r.shouldBe("t.walker.followingSibling()", "null"); + if (endpos !== null) { + r.shouldBe("t.walker.position()", "t.endpos"); + } + t.walker.setPoint(t.node, endpos); + while (t.walker.stepBackward()) { + t.countBackward += 1; + } + r.shouldBe("t.countBackward", "t.count"); + r.shouldBe("t.walker.precedingSibling()", "null"); + r.shouldBe("t.walker.followingSibling()", "t.node.firstChild"); + r.shouldBe("t.walker.position()", "0"); + } + + function testSimpleDocument(xmledit) { + var maindoc = xmledit.ownerDocument, + doc = maindoc.implementation.createDocument(null, "p", null), + p = doc.firstChild, + textnode1, + textnode2, + textnode3, + em; + + xmledit.setXML(doc); + + checkWalker(doc, 2, 1); + checkWalker(p, 0, 0); + + t = {}; + t.doc = doc; + t.walker = new core.PointWalker(t.doc); + r.shouldBe("t.walker.position()", "0"); + r.shouldBe("t.walker.stepForward()", "true"); + r.shouldBe("t.walker.position()", "0"); + r.shouldBe("t.walker.stepForward()", "true"); + r.shouldBe("t.walker.position()", "1"); + r.shouldBe("t.walker.stepForward()", "false"); + r.shouldBe("t.walker.position()", "1"); + r.shouldBe("t.walker.stepBackward()", "true"); + r.shouldBe("t.walker.position()", "0"); + r.shouldBe("t.walker.stepBackward()", "true"); + r.shouldBe("t.walker.position()", "0"); + r.shouldBe("t.walker.stepBackward()", "false"); + r.shouldBe("t.walker.position()", "0"); + + textnode1 = doc.createTextNode("hello, "); + textnode2 = doc.createTextNode("big "); + textnode3 = doc.createTextNode("world."); + em = doc.createElement('em'); + p.appendChild(textnode1); + p.appendChild(em); + em.appendChild(textnode2); + p.appendChild(textnode3); + + checkWalker(textnode1, 7, 7); + checkWalker(textnode2, 4, 4); + checkWalker(textnode3, 6, 6); + checkWalker(em, 6, 1); + checkWalker(p, 25, 3); + checkWalker(doc, 27, 1); + } + + function testXmlEdit(document) { + var head = document.getElementsByTagName("head")[0], + css = document.createElement("style"), + testarea = document.createElement("div"), + xmledit; + + // the xml edit requires an element to put the content and a sheet to put + // the style + css.type = "text/css"; + head.appendChild(css); + document.body.appendChild(testarea); + xmledit = new gui.XMLEdit(testarea, css); + + testSimpleDocument(xmledit); + + css.parentNode.removeChild(css); + testarea.parentNode.removeChild(testarea); + } + + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return [ testSimpleDocument ]; + }; + this.asyncTests = function () { + return []; + }; + this.description = function () { + return "Test the XML editor class."; + }; +}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/manifest.js b/apps/files_odfviewer/src/webodf/webodf/tests/manifest.js new file mode 100644 index 0000000000..6d4f151bc0 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/manifest.js @@ -0,0 +1,16 @@ +(function () { + "use strict"; +return [ + "core/Base64Tests.js", + "core/CursorTests.js", + "core/PointWalkerTests.js", + "core/RuntimeTests.js", + "core/ZipTests.js", + "gui/CaretTests.js", + "gui/SelectionMoverTests.js", + "gui/XMLEditTests.js", + "tests.js", + "xmldom/OperationalTransformDOMTests.js", + "xmldom/XPathTests.js" + ]; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/resources/js-test-style.css b/apps/files_odfviewer/src/webodf/webodf/tests/resources/js-test-style.css new file mode 100644 index 0000000000..f12147ca43 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/resources/js-test-style.css @@ -0,0 +1,12 @@ +.pass { + font-weight: bold; + color: green; +} +.fail { + font-weight: bold; + color: red; +} +#console { + white-space: pre-wrap; + font-family: monospace; +} diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/tests.html b/apps/files_odfviewer/src/webodf/webodf/tests/tests.html new file mode 100644 index 0000000000..572db60554 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/tests.html @@ -0,0 +1,22 @@ + + + WebODF unit tests + + + +

    +
    +
    +
    + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/tests.js b/apps/files_odfviewer/src/webodf/webodf/tests/tests.js new file mode 100644 index 0000000000..5570733de5 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/tests.js @@ -0,0 +1,94 @@ +/*global window: true, runtime: true, Runtime: true, core: true, gui: true, + xmldom: true, RuntimeTests: true*/ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +runtime.loadClass("core.RuntimeTests"); +runtime.loadClass("core.UnitTester"); +runtime.loadClass("core.PointWalkerTests"); +runtime.loadClass("core.CursorTests"); +runtime.loadClass("core.ZipTests"); +runtime.loadClass("core.Base64Tests"); +runtime.loadClass("xmldom.OperationalTransformDOMTests"); +runtime.loadClass("xmldom.XPathTests"); +runtime.loadClass("gui.CaretTests"); +runtime.loadClass("gui.XMLEditTests"); + +var tests = [ + core.RuntimeTests, // temporarily disabled, enable at next commit! + core.ZipTests, + core.Base64Tests +]; +if (runtime.type() !== "NodeJSRuntime") { + tests.push(core.PointWalkerTests); +} +if (runtime.type() === "BrowserRuntime") { + tests.push(core.PointWalkerTests); +// tests.push(core.CursorTests); + tests.push(xmldom.OperationalTransformDOMTests); + tests.push(gui.CaretTests); + tests.push(xmldom.XPathTests); +// tests.push(gui.XMLEditTests); +} +var tester = new core.UnitTester(); +/** + * @param {!Array.} tests + * @return {undefined} + */ +function runNextTest(tests) { + "use strict"; + if (tests.length === 0) { + //runtime.log(JSON.stringify(tester.results())); + runtime.log("Number of failed tests: " + + String(tester.countFailedTests())); + runtime.exit(tester.countFailedTests()); + return; + } + var test = tests[0]; + if (typeof test !== "function") { + runtime.log("Tests contain a non-function object of type " + + typeof(test) + "."); + runtime.exit(1); + return; + } + runtime.log("Running test '" + Runtime.getFunctionName(test) + "'."); + try { + tester.runTests(test, function () { + runNextTest(tests.slice(1)); + }); + } catch (e) { + runtime.log(e); + runtime.exit(1); + throw e; + } +} +runNextTest(tests); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/OperationalTransformDOMTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/OperationalTransformDOMTests.js new file mode 100644 index 0000000000..3866a53708 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/OperationalTransformDOMTests.js @@ -0,0 +1,79 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, xmldom: true*/ +runtime.loadClass("xmldom.OperationalTransformDOM"); + +/** + * @constructor + * @param {core.UnitTestRunner} runner + * @implements {core.UnitTest} + */ +xmldom.OperationalTransformDOMTests = function OperationalTransformDOMTests(runner) { + "use strict"; + var r = runner, + t; + + function setupEmptyDoc() { + var doc = runtime.getDOMImplementation().createDocument("", "p", null); + t = { doc: doc }; + } + function setupSimpleTextDoc() { + setupEmptyDoc(); + t.textnode = t.doc.createTextNode("abc"); + t.doc.documentElement.appendChild(t.textnode); + } + function testSkip() { + setupEmptyDoc(); + } + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return [ testSkip ]; + }; + this.asyncTests = function () { + return [ + ]; + }; +}; +xmldom.OperationalTransformDOMTests.prototype.description = function () { + "use strict"; + return "Test the OperationalTransformDOM class."; +}; +(function () { + "use strict"; + return xmldom.OperationalTransformDOMTests; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/XPathTests.js b/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/XPathTests.js new file mode 100644 index 0000000000..91ebba99c6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tests/xmldom/XPathTests.js @@ -0,0 +1,112 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true, xmldom: true, odf: true, XMLSerializer*/ +runtime.loadClass("xmldom.XPath"); +runtime.loadClass("odf.Style2CSS"); + +/** + * @constructor + * @param {core.UnitTestRunner} runner + * @implements {core.UnitTest} + */ +xmldom.XPathTests = function XPathTests(runner) { + "use strict"; + var r = runner, + style2CSS = new odf.Style2CSS(), + t; + + function setupDoc() { + var stylens = style2CSS.namespaceResolver("style"), + svgns = style2CSS.namespaceResolver("svg"), + drawns = style2CSS.namespaceResolver("draw"), + presentationns = style2CSS.namespaceResolver("presentation"), + textns = style2CSS.namespaceResolver("text"), + doc = runtime.getDOMImplementation().createDocument("", "a", null), + r = doc.documentElement, + fontFace = doc.createElementNS(stylens, "font-face"), + fontFaceSrc = doc.createElementNS(svgns, "font-face-src"), + drawFrame = doc.createElementNS(drawns, "frame"), + p = doc.createElementNS(textns, "p"); + r.appendChild(p); + r.appendChild(fontFace); + fontFace = doc.createElementNS(stylens, "font-face"); + fontFace.appendChild(fontFaceSrc); + fontFaceSrc.setAttributeNS(textns, "anchor-type", "paragraph"); + r.appendChild(fontFace); + r.appendChild(drawFrame); + drawFrame = doc.createElementNS(drawns, "frame"); + drawFrame.setAttributeNS(presentationns, "class", "title"); + r.appendChild(drawFrame); + + t = { doc: doc, fontFace: fontFace, drawFrame: drawFrame }; + } + function test1() { + setupDoc(); + var xpath = new xmldom.XPath(), + xpaths = { + "style:font-face[svg:font-face-src]": "t.fontFace", + ".//*[*[@text:anchor-type='paragraph']]": "t.fontFace", + "./draw:frame[@presentation:class='title']": "t.drawFrame" + }, + x; + for (x in xpaths) { + if (xpaths.hasOwnProperty(x)) { + t.result = xpath.getODFElementsWithXPath(t.doc.documentElement, + x, style2CSS.namespaceResolver); + r.shouldBe(t, "t.result.length", "1"); + r.shouldBe(t, "t.result[0]", xpaths[x]); + } + } + } + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + this.tests = function () { + return [ test1 ]; + }; + this.asyncTests = function () { + return [ + ]; + }; +}; +xmldom.XPathTests.prototype.description = function () { + "use strict"; + return "Test the XPath class."; +}; +(function () { + "use strict"; + return xmldom.XPathTests; +}()); diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/clippingTestImage.html b/apps/files_odfviewer/src/webodf/webodf/tools/clippingTestImage.html new file mode 100644 index 0000000000..67cc747737 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tools/clippingTestImage.html @@ -0,0 +1,39 @@ + + + + + +

    This image can be used to find clipping problems. If the sides of the image are clipped asymetrically, it will obvious visually.

    + +pregenerated + + diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/externs.js b/apps/files_odfviewer/src/webodf/webodf/tools/externs.js new file mode 100644 index 0000000000..9862befe48 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tools/externs.js @@ -0,0 +1,348 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global Packages HTMLStyleElement window XMLHttpRequest HTMLStyleElement Document*/ +/*jslint nomen: false */ +/** + * @constructor + */ +function NodeJSObject() {} +/** + * @param {!string} path + * @param {function(...)} callback + * @return {undefined} + */ +NodeJSObject.prototype.stat = function (path, callback) {}; +/** + * @param {!string} path + * @param {?string} encoding + * @param {function(...)} callback + * @return {?string} + */ +NodeJSObject.prototype.readFile = function (path, encoding, callback) {}; +/** + * @param {!string} path + * @param {?string} encoding + * @return {?string} + */ +NodeJSObject.prototype.readFileSync = function (path, encoding) {}; +/** + * @param {!string} path + * @param {!string} flags + * @param {!number} mode + * @param {!function(string, !number):undefined} callback + * @return {undefined} + */ +NodeJSObject.prototype.open = function (path, flags, mode, callback) {}; +/** + * @param {!number} fd + * @param {!Buffer} buffer + * @param {!number} offset + * @param {!number} length + * @param {!number} position + * @param {function(string, !number)} callback + * @return {undefined} + */ +NodeJSObject.prototype.read = function (fd, buffer, offset, length, position, + callback) {}; +/** + * @param {!string} path + * @param {!string} data + * @param {!string} encoding + * @param {!function(?string):undefined} callback + * @return {undefined} + */ +NodeJSObject.prototype.writeFile = function (path, data, encoding, callback) {}; +/** + * @param {!string} path + * @param {!function(?string):undefined} callback + * @return {undefined} + */ +NodeJSObject.prototype.unlink = function (path, callback) {}; +/** + * @param {!number} fd + * @param {function(!string)} callback + * @return {undefined} + */ +NodeJSObject.prototype.close = function (fd, callback) {}; +/** + * @param {!string} className + * @return {!NodeJSObject} + */ +function require(className) {} +/** + * @constructor + */ +function NodeJSConsole() {} +/** + * @param {!string} msg + * @return {undefined} + */ +NodeJSConsole.prototype.log = function (msg) {}; +/** + * @type {!NodeJSConsole} + */ +var console; +/** + * @constructor + */ +function NodeJSProcess() {} +/** + * @param {!number} exitCode + * @return {undefined} + */ +NodeJSProcess.prototype.exit = function (exitCode) {}; +/** + * @type {!Array} + */ +NodeJSProcess.prototype.argv = []; +/** + * @type {!Object} + */ +NodeJSProcess.prototype.stderr = {}; +/** + * @type {!NodeJSProcess} + */ +var process; +/** + * @type {!string} + */ +var __dirname; +/** + * @constructor + * @param {!number|!Array.|!string} arg1 + * @param {!string=} encoding + */ +function Buffer(arg1, encoding) {} +/** + * @param {!string} msg + * @return {undefined} + */ +function print(msg) {} +/** + * @param {!string} path + * @param {!string=} encoding + * @return {?string} + */ +function readFile(path, encoding) {} +/** + * @param {!number} exitCode + * @return {undefined} + */ +function quit(exitCode) {} +/** + * @namespace + */ +Packages.javax = {}; +/** + * @namespace + */ +Packages.javax.xml = {}; +/** + * @namespace + */ +Packages.javax.xml.validation = {}; +/** + * @constructor + */ +Packages.javax.xml.validation.Schema = function () {}; +/** + * @namespace + */ +Packages.javax.xml.parsers = {}; +/** + * @constructor + */ +Packages.javax.xml.parsers.DocumentBuilder = function () {}; +/** + * @param {!Object} entityresolver + * @return {undefined} + */ +Packages.javax.xml.parsers.DocumentBuilder.prototype.setEntityResolver = + function (entityresolver) {}; +/** + * @param {!Packages.org.xml.sax.InputSource} source + * @return {Document} + */ +Packages.javax.xml.parsers.DocumentBuilder.prototype.parse = + function (source) {}; +/** + * @return {DOMImplementation} + */ +Packages.javax.xml.parsers.DocumentBuilder.prototype.getDOMImplementation = + function () {}; +/** + * @constructor + */ +Packages.javax.xml.parsers.DocumentBuilderFactory = function () {}; +/** + * @return {!Packages.javax.xml.parsers.DocumentBuilderFactory} + */ +Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance = function () {}; +/** + * @param {!boolean} value + */ +Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setValidating = + function (value) {}; +/** + * @param {!boolean} value + */ +Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setNamespaceAware = + function (value) {}; +/** + * @param {!boolean} value + */ +Packages.javax.xml.parsers.DocumentBuilderFactory.prototype + .setExpandEntityReferences = function (value) {}; +/** + * @param {?Packages.javax.xml.validation.Schema} schema + */ +Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setSchema = + function (schema) {}; +/** + * @return {!Packages.javax.xml.parsers.DocumentBuilder} + */ +Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.newDocumentBuilder = + function () {}; +/** + * @namespace + */ +Packages.org = {}; +/** + * @namespace + */ +Packages.org.xml.sax = {}; +/** + * @param {!Object} definition + * @return {!Object} + */ +Packages.org.xml.sax.EntityResolver = function (definition) {}; +/** + * @namespace + */ +Packages.java.io = {}; +/** + * @constructor + * @param {!string} path + */ +Packages.java.io.FileReader = function (path) {}; +/** + * @constructor + * @param {!string} path + */ +Packages.java.io.FileOutputStream = function (path) {}; +/** + * @param {!number} b + * @return {undefined} + */ +Packages.java.io.FileOutputStream.prototype.write = function (b) {}; +/** + * @return {undefined} + */ +Packages.java.io.FileOutputStream.prototype.close = function () {}; +/** + * @constructor + * @param {!Packages.java.io.FileReader} reader + */ +Packages.org.xml.sax.InputSource = function (reader) {}; +/** + * @type {!StyleSheet} + */ +HTMLStyleElement.prototype.sheet; +XMLHttpRequest.prototype.sendAsBinary = function (data) {}; +/** + * @const@type{!string} + */ +XMLHttpRequest.prototype.responseBody; +window.nativeio = {}; +var VBArray = {}; +VBArray.prototype.toArray = function () {}; +/** + * @interface + */ +function TreeWalker() {} +/** + * @const@type{!Node} + */ +TreeWalker.prototype.root; +/** + * @const@type{number} + */ +TreeWalker.prototype.whatToShow; +/** + * @const@type{NodeFilter} + */ +TreeWalker.prototype.filter; +/** + * @const@type{boolean} + */ +TreeWalker.prototype.expandEntityReferences; +/** + * @type{Node} + */ +TreeWalker.prototype.currentNode; +/** + * @return {Node} + */ +TreeWalker.prototype.parentNode = function () {}; +/** + * @return {Node} + */ +TreeWalker.prototype.firstChild = function () {}; +/** + * @return {Node} + */ +TreeWalker.prototype.lastChild = function () {}; +/** + * @return {Node} + */ +TreeWalker.prototype.previousSibling = function () {}; +/** + * @return {Node} + */ +TreeWalker.prototype.nextSibling = function () {}; +/** + * @return {Node} + */ +TreeWalker.prototype.previousNode = function () {}; +/** + * @return {Node} + */ +TreeWalker.prototype.nextNode = function () {}; +/** + * @param {!Node} root + * @param {!number} whatToShow + * @param {NodeFilter=} filter + * @param {boolean=} entityReferenceExpansion + * @return {!TreeWalker} + */ +Document.prototype.createTreeWalker = function (root, whatToShow, filter, entityReferenceExpansion) {}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/extjsexterns.js b/apps/files_odfviewer/src/webodf/webodf/tools/extjsexterns.js new file mode 100644 index 0000000000..f65d0c5cdb --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tools/extjsexterns.js @@ -0,0 +1,171 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global Packages HTMLStyleElement window XMLHttpRequest HTMLStyleElement Document*/ +/*jslint nomen: false */ +var Ext = {}; +Ext.data = {}; +/** + * @constructor + */ +Ext.data.Model = function (settings) {}; +/** + * @param {!string} fieldName + * @return {!string} + */ +Ext.data.Model.prototype.get = function (fieldName) {}; +/** + * @return {!boolean} + */ +Ext.data.Model.isExpanded = function () {}; +/** + * @constructor + */ +Ext.data.NodeInterface = function () {}; +/** + * @param {!string} attribute + * @param {*} value + * @param {boolean=} deep + * @return {Ext.data.NodeInterface} + */ +Ext.data.NodeInterface.prototype.findChild = function (attribute, value, deep) {}; +/** + * @param {!Ext.data.NodeInterface|!Object} node + * @return {!Ext.data.NodeInterface} + */ +Ext.data.NodeInterface.prototype.appendChild = function (node) {}; +/** + * @param {!string} id + * @return {Ext.Component} + */ +Ext.getCmp = function (id) {}; +Ext.tree = {}; +/** + * @constructor + */ +Ext.tree.Panel = function (settings) {}; +/** + * @return {!Ext.data.NodeInterface} + */ +Ext.tree.Panel.prototype.getRootNode = function () {}; +Ext.component = {}; +/** + * @constructor + * @extends {Ext.Component} + */ +Ext.component.Component = function (settings) {}; +/** + * @return {!Ext.Element} + */ +Ext.component.Component.prototype.getEl = function () {}; +/** + * @constructor + */ +Ext.Button = function (settings) {}; +/** + * @constructor + */ +Ext.Component = function (settings) {}; +/** + * @type {Object} + */ +Ext.Component.prototype.superclass = {}; +/** + * @type {!Ext.Element} + */ +Ext.Component.prototype.el; +/** + * @constructor + */ +Ext.Element = function (settings) {}; +/** + * @constructor + */ +Ext.Panel = function (settings) {}; +/** + * @type {!Element} + */ +Ext.Element.prototype.dom; +Ext.QuickTips = {}; +/** + * @return {undefined} + */ +Ext.QuickTips.init = function () {}; +/** + * @constructor + */ +Ext.Slider = function (settings) {}; +Ext.util = {}; +/** + * @constructor + */ +Ext.util.MixedCollection = function () {}; +/** + * @param {!Function} f + */ +Ext.util.MixedCollection.prototype.findBy = function (f) {}; +Ext.tab = {}; +/** + * @constructor + */ +Ext.tab.Panel = function (settings) {}; +/** + * @param {!Object} component + * @return {undefined} + */ +Ext.tab.Panel.prototype.add = function (component) {}; +/** + * @return {!Ext.Component} + */ +Ext.tab.Panel.prototype.getActiveTab = function () {}; +/** + * @param {!Ext.Component} tab + * @return {undefined} + */ +Ext.tab.Panel.prototype.setActiveTab = function (tab) {}; +/** + * @type {!Ext.util.MixedCollection} + */ +Ext.tab.Panel.prototype.items; +/** + * @constructor + */ +Ext.Toolbar = function (settings) {}; +/** + * @constructor + */ +Ext.Toolbar.TextItem = function (text) {}; +/** + * @constructor + */ +Ext.Viewport = function (settings) {}; +Ext.onReady = function (callback) {}; diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/fixLicenses.py b/apps/files_odfviewer/src/webodf/webodf/tools/fixLicenses.py new file mode 100755 index 0000000000..a81c9b55c6 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tools/fixLicenses.py @@ -0,0 +1,81 @@ +#!/usr/bin/python -Qwarnall +# -*- coding: utf-8 -*- +# +# This script checks if all files have licenses and fixes them if needed. +# The script should be run from the root directory of the webodf project. +import os, os.path + +# read the license text from the source file +# the license starts at the line ' * @licstart' and ends at ' */' +def readLicense(path): + file = open(path, "rU") + licensetext = [] + started = False + for line in file: + if line.rstrip() == ' * @licstart': + started = True + if started: + licensetext.append(line) + if line.rstrip() == ' */': + break + return licensetext + +def writeLicense(file, license, defaultcopyright): + if defaultcopyright: + file.write(defaultcopyright) + file.writelines(license) + +def fixLicense(path, license, defaultcopyright): + # read the file + file = open(path, "rU") + lines = file.readlines() + file.close() + # does the file have any copyright statement already? + hasLicense = False + hasCopyright = False + for line in lines: + if line.rstrip() == ' * @licstart': + hasLicense = True + if line[:17] == ' * Copyright (C) ': + hasCopyright = True + if hasCopyright: + defaultcopyright = None + wroteLicense = False + skip = False + # write the file with the new slice + file = open(path, "w") + for line in lines: + if not wroteLicense: + if not hasLicense: + file.write("/**\n") + writeLicense(file, license, defaultcopyright) + wroteLicense = True + elif line.rstrip() == ' * @licstart': + writeLicense(file, license, defaultcopyright) + wroteLicense = True + skip = True + if skip: + if line.rstrip() == ' */': + skip = False + else: + file.write(line) + file.close() + +# get list of *.js files +jsfiles = [] +for root, directories, files in os.walk("."): + while "extjs" in directories: + directories.remove("extjs") + for f in files: + if f[-3:] == ".js": + jsfiles.append(os.path.abspath(os.path.join(root, f))) + +# remove webodf/lib/packackages.js since it is the source for the licenses +sourcefilepath = os.path.join(os.getcwd(), "webodf/lib/packages.js") +jsfiles.remove(sourcefilepath) + +licensetext = readLicense(sourcefilepath) +defaultcopyright = " * Copyright (C) 2011 KO GmbH \n" + +for f in jsfiles: + fixLicense(f, licensetext, defaultcopyright) diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/bootstrap.xsl b/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/bootstrap.xsl new file mode 100644 index 0000000000..747e3e605b --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/bootstrap.xsl @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + | + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/odfkeys.xml b/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/odfkeys.xml new file mode 100644 index 0000000000..e2ad06941c --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tools/refcheck/odfkeys.xml @@ -0,0 +1,455 @@ + + +

    ODF reference checker

    +

    ODF documents use string keys and references to link different parts of the document. There are quite a few different groups of keys. The description of how these keys work in the specification is not trivial to implement, because not keys behave differently depending on the context in which they are defined. E.g. a style has a family. If the family is 'text', then only certain attributes on certain elements in certain parts of the ODF document may refer to that style.

    +

    For a beginning and even intermediate ODF developer or document producer, this is quite complicated. Also, there is not currently an easy way to check if all the references are correct. This document aims to make it easier to figure out what groups of keys exist and from which elements they may be linked.

    +

    The document consists of one <key> element for each group of keys. Each group has a name and is defined by one or more XPath expressions in <def> elements. Any string that matches the XPath expression in a particular document is part of the set of keys of that group. Each key in a set must be unique.

    +

    In addition, each <key> has a number of <ref> elements that define the positions in the document where a key may be referenced. Each reference must exist in the set of keys that are found via the <def> elements.

    +

    The format of this document is designed to be easy to read but also to make it easy to use in a reference checker. This document comes with checked implemented in XSL. The XSL is called bootstrap.xsl and is used in two transformation steps. Here is shown how to run the check with xsltproc:

    +
    xsltproc bootstrap.xsl odfkeys.xml > checkkeys.xsl
    +
    xsltproc checkkeys.xsl content.xml
    +

    The check can be run on content.xml files, on styles.xml files and on flat ODF files.

    +

    Definitions

    +
    +
    $stylesfontfaces
    +
    This variable refers to the subset of font face definitions that are available to the style elements. Styles.xml may not refer to font faces defined in content.xml.
    +
    $fontfaces
    +
    This variable refers to all font face definitions.
    +
    $officestyles
    +
    This variable refers to the element office:styles.
    +
    $stylesautostyles
    +
    This variable refers to the element office:automatic-styles in styles.xml.
    +
    $contentautostyles
    +
    This variable refers to the element office:automatic-styles in content.xml. When evaluating a styles.xml document, it is an empty set.
    +
    $masterstyles
    +
    This variable refers to the office:master-styles element.
    +
    $body
    +
    This variable refers to the office:body element. When evaluating a styles.xml document, it is an empty set.
    +
    +

    TODO

    +
      +
    • implement <refs/> to check refs of type styleNameRefs
    • +
    • check for unused automatic styles
    • +
    • check that there are no circular dependencies in style inheritance
    • +
    +
    + + $officestyles/draw:gradient/@draw:name + $officestyles/svg:linearGradient/@draw:name + $officestyles/svg:radialGradient/@draw:name + $officestyles//@draw:fill-gradient-name + $stylesautostyles//@draw:fill-gradient-name + $contentautostyles//@draw:fill-gradient-name + + + $officestyles/draw:hatch/@draw:name + $officestyles//@draw:fill-hatch-name + $stylesautostyles//@draw:fill-hatch-name + $contentautostyles//@draw:fill-hatch-name + + + $officestyles/draw:fill-image/@draw:name + $officestyles//@draw:fill-image-name + $stylesautostyles//@draw:fill-image-name + $contentautostyles//@draw:fill-image-name + + + $officestyles/draw:marker/@draw:name + $officestyles//@draw:marker-start + $officestyles//@draw:marker-end + $stylesautostyles//@draw:marker-start + $stylesautostyles//@draw:marker-end + $contentautostyles//@draw:marker-start + $contentautostyles//@draw:marker-end + + + $officestyles/draw:stroke-dash/@draw:name + $officestyles//@draw:stroke-dash + $stylesautostyles//@draw:stroke-dash + $contentautostyles//@draw:stroke-dash + $officestyles//@draw:stroke-dash-names + $stylesautostyles//@draw:stroke-dash-names + $contentautostyles//@draw:stroke-dash-names + + + $officestyles/draw:opacity/@draw:name + $officestyles//@draw:opacity-name + $stylesautostyles//@draw:opacity-name + $contentautostyles//@draw:opacity-name + + + $stylesfontfaces/style:font-face/@style:name + $officestyles//style:text-properties/@style:font-name + $officestyles//style:text-properties/@style:font-name-asian + $officestyles//style:text-properties/@style:font-name-complex + $officestyles//style:list-level-properties/@style:font-name + $stylesautostyles//style:text-properties/@style:font-name + $stylesautostyles//style:text-properties/@style:font-name-asian + $stylesautostyles//style:text-properties/@style:font-name-complex + $stylesautostyles//style:list-level-properties/@style:font-name + + + $fontfaces/style:font-face/@style:name + $contentautostyles//style:text-properties/@style:font-name + $contentautostyles//style:text-properties/@style:font-name-asian + $contentautostyles//style:text-properties/@style:font-name-complex + $contentautostyles//style:list-level-properties/@style:font-name + + + $masterstyles/style:master-page/@style:name + + $body/office:drawing/draw:page/@draw:master-page-name + $body/office:presentation/draw:page/@draw:master-page-name + + $officestyles/style:style[@style:family='paragraph']/@style:master-page-name + $officestyles/style:style[@style:family='table']/@style:master-page-name + $stylesautostyles/style:style[@style:family='paragraph']/@style:master-page-name + $stylesautostyles/style:style[@style:family='table']/@style:master-page-name + $contentautostyles/style:style[@style:family='paragraph']/@style:master-page-name + $contentautostyles/style:style[@style:family='table']/@style:master-page-name + + $masterstyles/style:master-page/@style:next-style-name + + $officestyles/text:notes-configuration/@text:master-page-name + $officestyles/style:default-style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name + $officestyles/style:style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name + $stylesautostyles/style:style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name + $contentautostyles/style:style[@style:family='section']/style:section-properties/text:notes-configuration/@text:master-page-name + $body/office:text/text:page-sequence/text:page/@text:master-page-name + + + + $officestyles/style:presentation-page-layout/@style:name + $masterstyles/style:handout-master/@presentation:presentation-page-layout-name + $body/office:drawing/draw:page/@presentation:presentation-page-layout-name + $body/office:presentation/draw:page/@presentation:presentation-page-layout-name + + + $stylesautostyles/style:page-layout/@style:name + $masterstyles/style:master-page/@style:page-layout-name + $masterstyles/style:master-page/presentation:notes/@style:page-layout-name + $masterstyles/style:handout-master/@style:page-layout-name + + + $contentautostyles/style:page-layout/@style:name + $body/office:presentation/draw:page/presentation:notes/@style:page-layout-name + + + $officestyles/text:list-style/@style:name + $officestyles//style:graphic-properties/text:list-style/@style:name + $officestyles/style:style/@style:list-style-name + + + $stylesautostyles/text:list-style/@style:name + $stylesautostyles//style:graphic-properties/text:list-style/@style:name + $stylesautostyles/style:style/@style:list-style-name + $masterstyles//text:list/@text:style-name + $masterstyles//text:numbered-paragraphs/@text:style-name + $masterstyles//text:list-item/@text:style-override + + + $contentautostyles/text:list-style/@style:name + $contentautostyles//style:graphic-properties/text:list-style/@style:name + $contentautostyles/style:style/@style:list-style-name + $body//text:list/@text:style-name + $body//text:numbered-paragraphs/@text:style-name + $body//text:list-item/@text:style-override + + + $officestyles/number:number-style/@style:name + $officestyles/number:currency-style/@style:name + $officestyles/number:percentage-style/@style:name + $officestyles/number:date-style/@style:name + $officestyles/number:time-style/@style:name + $officestyles/number:boolean-style/@style:name + $officestyles/number:text-style/@style:name + $officestyles/style:style/@style:data-style-name + $officestyles/style:style/@style:percentage-data-style-name + + + $stylesautostyles/number:number-style/@style:name + $stylesautostyles/number:currency-style/@style:name + $stylesautostyles/number:percentage-style/@style:name + $stylesautostyles/number:date-style/@style:name + $stylesautostyles/number:time-style/@style:name + $stylesautostyles/number:boolean-style/@style:name + $stylesautostyles/number:text-style/@style:name + $stylesautostyles/style:style/@style:data-style-name + $stylesautostyles/style:style/@style:percentage-data-style-name + $masterstyles//text:creation-date/@style:data-style-name + $masterstyles//text:creation-time/@style:data-style-name + $masterstyles//text:database-display/@style:data-style-name + $masterstyles//text:date/@style:data-style-name + $masterstyles//text:editing-duration/@style:data-style-name + $masterstyles//text:expression/@style:data-style-name + $masterstyles//text:meta-field/@style:data-style-name + $masterstyles//text:modification-date/@style:data-style-name + $masterstyles//text:modification-time/@style:data-style-name + $masterstyles//text:print-date/@style:data-style-name + $masterstyles//text:print-time/@style:data-style-name + $masterstyles//text:table-formula/@style:data-style-name + $masterstyles//text:time/@style:data-style-name + $masterstyles//text:user-defined/@style:data-style-name + $masterstyles//text:user-field-get/@style:data-style-name + $masterstyles//text:user-field-input/@style:data-style-name + $masterstyles//text:variable-get/@style:data-style-name + $masterstyles//text:variable-input/@style:data-style-name + $masterstyles//text:variable-set/@style:data-style-name + + + $contentautostyles/number:number-style/@style:name + $contentautostyles/number:currency-style/@style:name + $contentautostyles/number:percentage-style/@style:name + $contentautostyles/number:date-style/@style:name + $contentautostyles/number:time-style/@style:name + $contentautostyles/number:boolean-style/@style:name + $contentautostyles/number:text-style/@style:name + $contentautostyles/style:style/@style:data-style-name + $contentautostyles/style:style/@style:percentage-data-style-name + $body/office:presentation/presentation:date-time-decl/@style:data-style-name + $body//text:creation-date/@style:data-style-name + $body//text:creation-time/@style:data-style-name + $body//text:database-display/@style:data-style-name + $body//text:date/@style:data-style-name + $body//text:editing-duration/@style:data-style-name + $body//text:expression/@style:data-style-name + $body//text:meta-field/@style:data-style-name + $body//text:modification-date/@style:data-style-name + $body//text:modification-time/@style:data-style-name + $body//text:print-date/@style:data-style-name + $body//text:print-time/@style:data-style-name + $body//text:table-formula/@style:data-style-name + $body//text:time/@style:data-style-name + $body//text:user-defined/@style:data-style-name + $body//text:user-field-get/@style:data-style-name + $body//text:user-field-input/@style:data-style-name + $body//text:variable-get/@style:data-style-name + $body//text:variable-input/@style:data-style-name + $body//text:variable-set/@style:data-style-name + + + $officestyles/style:style[@style:family='chart']/@style:name + $officestyles/style:style[@style:family='chart']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='chart']/@style:parent-style-name + $contentautostyles/style:style[@style:family='chart']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='chart']/@style:name + $masterstyles//chart:axis/@chart:style-name + $masterstyles//chart:chart/@chart:style-name + $masterstyles//chart:data-label/@chart:style-name + $masterstyles//chart:data-point/@chart:style-name + $masterstyles//chart:equation/@chart:style-name + $masterstyles//chart:error-indicator/@chart:style-name + $masterstyles//chart:floor/@chart:style-name + $masterstyles//chart:footer/@chart:style-name + $masterstyles//chart:grid/@chart:style-name + $masterstyles//chart:legend/@chart:style-name + $masterstyles//chart:mean-value/@chart:style-name + $masterstyles//chart:plot-area/@chart:style-name + $masterstyles//chart:regression-curve/@chart:style-name + $masterstyles//chart:series/@chart:style-name + $masterstyles//chart:stock-gain-marker/@chart:style-name + $masterstyles//chart:stock-loss-marker/@chart:style-name + $masterstyles//chart:stock-range-line/@chart:style-name + $masterstyles//chart:subtitle/@chart:style-name + $masterstyles//chart:title/@chart:style-name + $masterstyles//chart:wall/@chart:style-name + + + $contentautostyles/style:style[@style:family='chart']/@style:name + $body//chart:axis/@chart:style-name + $body//chart:chart/@chart:style-name + $body//chart:data-label/@chart:style-name + $body//chart:data-point/@chart:style-name + $body//chart:equation/@chart:style-name + $body//chart:error-indicator/@chart:style-name + $body//chart:floor/@chart:style-name + $body//chart:footer/@chart:style-name + $body//chart:grid/@chart:style-name + $body//chart:legend/@chart:style-name + $body//chart:mean-value/@chart:style-name + $body//chart:plot-area/@chart:style-name + $body//chart:regression-curve/@chart:style-name + $body//chart:series/@chart:style-name + $body//chart:stock-gain-marker/@chart:style-name + $body//chart:stock-loss-marker/@chart:style-name + $body//chart:stock-range-line/@chart:style-name + $body//chart:subtitle/@chart:style-name + $body//chart:title/@chart:style-name + $body//chart:wall/@chart:style-name + + + $officestyles/style:style[@style:family='ruby']/@style:name + $officestyles/style:style[@style:family='ruby']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='ruby']/@style:parent-style-name + $contentautostyles/style:style[@style:family='ruby']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='ruby']/@style:name + $masterstyles//text:ruby/@text:style-name + + + $contentautostyles/style:style[@style:family='ruby']/@style:name + $body//text:ruby/@text:style-name + + + + $officestyles/style:style[@style:family='text']/@style:name + $officestyles/style:style[@style:family='text']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='text']/@style:parent-style-name + $contentautostyles/style:style[@style:family='text']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='text']/@style:name + $masterstyles//text:span/@text:style-name + + + $contentautostyles/style:style[@style:family='text']/@style:name + $body//text:span/@text:style-name + + + $officestyles/style:style[@style:family='paragraph']/@style:name + $officestyles/style:style[@style:family='paragraph']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='paragraph']/@style:parent-style-name + $contentautostyles/style:style[@style:family='paragraph']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='paragraph']/@style:name + $masterstyles//text:p/@text:style-name + + + $contentautostyles/style:style[@style:family='paragraph']/@style:name + $body//text:p/@text:style-name + + + $officestyles/style:style[@style:family='section']/@style:name + $officestyles/style:style[@style:family='section']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='section']/@style:parent-style-name + $contentautostyles/style:style[@style:family='section']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='section']/@style:name + $masterstyles//text:alphabetical-index/@text:style-name + + + $contentautostyles/style:style[@style:family='section']/@style:name + $body//text:alphabetical-index/@text:style-name + + + + $officestyles/style:style[@style:family='table']/@style:name + $officestyles/style:style[@style:family='table']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='table']/@style:parent-style-name + $contentautostyles/style:style[@style:family='table']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='table']/@style:name + $masterstyles//table:table/@table:style-name + + + $contentautostyles/style:style[@style:family='table']/@style:name + $body//table:table/@table:style-name + + + + $officestyles/style:style[@style:family='table-column']/@style:name + $officestyles/style:style[@style:family='table-column']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='table-column']/@style:parent-style-name + $contentautostyles/style:style[@style:family='table-column']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='table-column']/@style:name + $masterstyles//table:table-column/@table:style-name + + + $contentautostyles/style:style[@style:family='table-column']/@style:name + $body//table:table-column/@table:style-name + + + + $officestyles/style:style[@style:family='table-row']/@style:name + $officestyles/style:style[@style:family='table-row']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='table-row']/@style:parent-style-name + $contentautostyles/style:style[@style:family='table-row']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='table-row']/@style:name + $masterstyles//table:table-row/@table:style-name + + + $contentautostyles/style:style[@style:family='table-row']/@style:name + $body//table:table-row/@table:style-name + + + + $officestyles/style:style[@style:family='table-cell']/@style:name + $officestyles/style:style[@style:family='table-cell']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='table-cell']/@style:parent-style-name + $contentautostyles/style:style[@style:family='table-cell']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='table-cell']/@style:name + $masterstyles//table:table-cell/@table:style-name + + + $contentautostyles/style:style[@style:family='table-cell']/@style:name + $body//table:table-cell/@table:style-name + + + + $officestyles/style:style[@style:family='graphic']/@style:name + $officestyles/style:style[@style:family='graphic']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='graphic']/@style:parent-style-name + $contentautostyles/style:style[@style:family='graphic']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='graphic']/@style:name + $masterstyles//draw:rect/@draw:style-name + + + $contentautostyles/style:style[@style:family='graphic']/@style:name + $body//draw:rect/@draw:style-name + + + + $officestyles/style:style[@style:family='presentation']/@style:name + $officestyles/style:style[@style:family='presentation']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='presentation']/@style:parent-style-name + $contentautostyles/style:style[@style:family='presentation']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='presentation']/@style:name + $masterstyles//draw:rect/@presentation:style-name + + + $contentautostyles/style:style[@style:family='presentation']/@style:name + $body//draw:rect/@presentation:style-name + + + + $officestyles/style:style[@style:family='drawing-page']/@style:name + $officestyles/style:style[@style:family='drawing-page']/@style:parent-style-name + $stylesautostyles/style:style[@style:family='drawing-page']/@style:parent-style-name + $contentautostyles/style:style[@style:family='drawing-page']/@style:parent-style-name + + + $stylesautostyles/style:style[@style:family='drawing-page']/@style:name + $masterstyles/style:handout-master/@draw:style-name + + + $contentautostyles/style:style[@style:family='drawing-page']/@style:name + $body/office:drawing/draw:page/@draw:style-name + $body/office:presentation/draw:page/@draw:style-name + + +
    diff --git a/apps/files_odfviewer/src/webodf/webodf/tools/runjslint.js b/apps/files_odfviewer/src/webodf/webodf/tools/runjslint.js new file mode 100644 index 0000000000..c0d28dc77d --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/tools/runjslint.js @@ -0,0 +1,98 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global runtime: true, core: true*/ +runtime.loadClass("core.JSLint"); + +function checkWithJSLINT(file) { + "use strict"; + var i, jslint = new core.JSLint().JSLINT, + jslintconfig = { + anon: false, // true, if the space may be omitted in anonymous function declarations + bitwise: false, // if bitwise operators should be allowed + browser: false, // if the standard browser globals should be predefined + cap: false, // if upper case HTML should be allowed + 'continue': false, // if the continuation statement should be tolerated + css: false, // if CSS workarounds should be tolerated + debug: false, // if debugger statements should be allowed + devel: false, // if logging should be allowed (console, alert, etc.) + eqeq: false, // if == should be allowed + es5: false, // if ES5 syntax should be allowed + evil: false, // if eval should be allowed + forin: false, // if for in statements need not filter + fragment: false, // if HTML fragments should be allowed + indent: 4, // the indentation factor + maxerr: 10, // the maximum number of errors to allow + //maxlen: 300, // the maximum length of a source line + newcap: false, // if constructor names capitalization is ignored + node: false, // if Node.js globals should be predefined + nomen: false, // if names may have dangling _ + on: false, // if HTML event handlers should be allowed + passfail: true, // if the scan should stop on first error + plusplus: false, // if increment/decrement should be allowed + properties: false, // if all property names must be declared with /*properties*/ + regexp: false, // if the . should be allowed in regexp literals + rhino: false, // if the Rhino environment globals should be predefined + undef: false, // if variables can be declared out of order + unparam: false, // if unused parameters should be tolerated + safe: false, // if use of some browser features should be restricted + sloppy: false, // if the 'use strict'; pragma is optional + stupid: true, // true if stupid practices are tolerated + sub: false, // if all forms of subscript notation are tolerated + vars: false, // if multiple var statements per function should be allowed + white: true, // if sloppy whitespace is tolerated + widget: false, // if the Yahoo Widgets globals should be predefined + windows: false // if MS Windows-specific globals should be predefined + }, + data, result, err; + + // these files are an exception for now + if (file === "lib/core/RawInflate.js") { + return; + } + + data = runtime.readFileSync(file, "utf-8"); + result = jslint(data, jslintconfig); + if (!result) { + for (i = 0; i < jslint.errors.length && jslint.errors[i]; i += 1) { + err = jslint.errors[i]; + runtime.log(file + ":" + err.line + ":" + err.character + + ": error: " + err.reason); + } + runtime.exit(1); + } +} + +var i; +for (i = 0; i < arguments.length; i += 1) { + checkWithJSLINT(arguments[i]); +} diff --git a/apps/files_odfviewer/src/webodf/webodf/webodf.css b/apps/files_odfviewer/src/webodf/webodf/webodf.css new file mode 100644 index 0000000000..dbd6686a26 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/webodf.css @@ -0,0 +1,200 @@ +@namespace draw url(urn:oasis:names:tc:opendocument:xmlns:drawing:1.0); +@namespace fo url(urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0); +@namespace office url(urn:oasis:names:tc:opendocument:xmlns:office:1.0); +@namespace presentation url(urn:oasis:names:tc:opendocument:xmlns:presentation:1.0); +@namespace style url(urn:oasis:names:tc:opendocument:xmlns:style:1.0); +@namespace svg url(urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0); +@namespace table url(urn:oasis:names:tc:opendocument:xmlns:table:1.0); +@namespace text url(urn:oasis:names:tc:opendocument:xmlns:text:1.0); +@namespace runtimens url(urn:webodf); /* namespace for runtime only */ + +office|document > *, office|document-content > * { + display: none; +} +office|body, office|document { + display: inline-block; + position: relative; +} + +text|p, text|h { + display: block; + padding: 3px 3px 3px 3px; + margin: 5px 5px 5px 5px; +} +text|h { + font-weight: bold; +} +*[runtimens|containsparagraphanchor] { + position: relative; +} +text|s:before { /* this needs to be the number of spaces given by text:c */ + content: ' '; +} +text|tab:before { + display: inline; + content: ' '; +} +text|line-break { + content: " "; + display: block; +} +text|tracked-changes { + /*Consumers that do not support change tracking, should ignore changes.*/ + display: none; +} +office|binary-data { + display: none; +} +office|text { + display: block; + width: 216mm; /* default to A4 width */ + min-height: 279mm; + padding-left: 32mm; + padding-right: 32mm; + padding-top: 25mm; + padding-bottom: 13mm; + margin: 2px; + text-align: left; + overflow: hidden; +} +office|spreadsheet { + display: block; + border-collapse: collapse; + empty-cells: show; + font-family: sans-serif; + font-size: 10pt; + text-align: left; + page-break-inside: avoid; + overflow: hidden; +} +office|presentation { + display: inline-block; + text-align: left; +} +draw|page { + display: block; + height: 21cm; + width: 28cm; + margin: 3px; + position: relative; + overflow: hidden; +} +presentation|notes { + display: none; +} +@media print { + draw|page { + border: 1pt solid black; + page-break-inside: avoid; + } + presentation|notes { + /*TODO*/ + } +} +office|spreadsheet text|p { + border: 0px; + padding: 1px; + margin: 0px; +} +office|spreadsheet table|table { + margin: 3px; +} +office|spreadsheet table|table:after { + /* show sheet name the end of the sheet */ + /*content: attr(table|name);*/ /* gives parsing error in opera */ +} +office|spreadsheet table|table-row { + counter-increment: row; +} +office|spreadsheet table|table-row:before { + width: 3em; + background: #cccccc; + border: 1px solid black; + text-align: center; + content: counter(row); +} +office|spreadsheet table|table-cell { + border: 1px solid #cccccc; +} +table|table { + display: table; +} +draw|frame table|table { + width: 100%; + height: 100%; + background: white; +} +table|table-row { + display: table-row; +} +table|table-column { + display: table-column; +} +table|table-cell { + display: table-cell; +} +draw|frame { + display: block; +} +draw|image { + display: block; + width: 100%; + height: 100%; + top: 0px; + left: 0px; + background-repeat: no-repeat; + background-size: 100% 100%; + -moz-background-size: 100% 100%; +} +/* only show the first image in frame */ +draw|frame > draw|image:nth-of-type(n+2) { + display: none; +} +text|list { + display: block; + padding-left: 1.5em; + counter-reset: list; +} +text|list-item { + display: block; +} +text|list-item:before { + display: inline-block; + content: '•'; + counter-increment: list; + width: 0.5em; + margin-left: -0.5em; + padding: 0px; + border: 0px; +} +text|list-item > *:first-child { + display: inline-block; +} +text|a { + color: blue; + text-decoration: underline; +} +text|note-citation { + vertical-align: super; + font-size: smaller; +} +text|note-body { + display: none; +} +text|note:hover text|note-citation { + background: #dddddd; +} +text|note:hover text|note-body { + display: block; + left:1em; + max-width: 80%; + position: absolute; + background: #ffffaa; +} +svg|title, svg|desc { + display: none; +} +video { + width:100%; + height:100% +} diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/gui.js b/apps/files_odfviewer/src/webodf/webodf/xmledit/gui.js new file mode 100644 index 0000000000..e38c286aae --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/xmledit/gui.js @@ -0,0 +1,119 @@ +/** + * Copyright (C) 2011 KO GmbH + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: http://gitorious.org/odfkit/webodf/ + */ +/*global Ext runtime gui*/ +runtime.loadClass("gui.XMLEdit"); + +function createXMLEdit(element, url) { + var head = element.ownerDocument.getElementsByTagName("head")[0], + xmlcss = element.ownerDocument.createElement("style"), + xmledt; + + xmlcss.type = "text/css"; + head.appendChild(xmlcss); + xmledt = new gui.XMLEdit(element, xmlcss); + runtime.loadXML(url, function (err, xml) { + if (xml.documentElement) { + xmledt.setXML(xml); + } + }); +} + +function loadXML(url, panel, title) { + title = title || url; + var tab = panel.find('url', url), + newTab; + if (tab.length) { + panel.setActiveTab(tab[0]); + return; + } + newTab = new Ext.BoxComponent({ + title: title, + tabTip: url, + url: url, + closable: true, + autoEl: { + tag: 'div' + }, + region: 'center' + }); + panel.add(newTab); + panel.setActiveTab(newTab); + + createXMLEdit(newTab.el.dom, url); +} + +Ext.onReady(function () { + var tabpanel, tree, viewport, attributeEditor; + + Ext.QuickTips.init(); + + tabpanel = new Ext.TabPanel({ + tbar: [ ], + region: 'center' + }); + + attributeEditor = new Ext.grid.PropertyGrid({ + title: 'Attributes', + region: 'east', + width: 200, + split: true, + autoScroll: true, + collapsible: true, + rootVisible: false, + enableTabScroll: true, + defaults: {autoScroll: true} + }); + + tree = new Ext.tree.TreePanel({ + title: 'Documents', + region: 'west', + width: 200, + split: true, + autoScroll: true, + collapsible: true, + rootVisible: false, + enableTabScroll: true, + defaults: {autoScroll: true}, + collapsed: true, + root: { nodeType: 'node' } + }); + + viewport = new Ext.Viewport({ + layout: 'border', + items: [ tabpanel, tree, attributeEditor ] + }); + + // load the xml + loadXML('requirements.xml', tabpanel); + loadXML('../content.xml', tabpanel); +}); diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/index.html b/apps/files_odfviewer/src/webodf/webodf/xmledit/index.html new file mode 100644 index 0000000000..dd6ae4942e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/xmledit/index.html @@ -0,0 +1,16 @@ + + + + + + + + + + + + XMLEdit + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.dtd b/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.dtd new file mode 100644 index 0000000000..82cb8deb8f --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.dtd @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.xml b/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.xml new file mode 100644 index 0000000000..cbeae4ce7e --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/xmledit/requirements.xml @@ -0,0 +1,22 @@ + + + + + + + load xml document in a frame + + + show xml in a frame with a specified css + + + diff --git a/apps/files_odfviewer/src/webodf/webodf/xmledit/test.xml b/apps/files_odfviewer/src/webodf/webodf/xmledit/test.xml new file mode 100644 index 0000000000..cad3f32470 --- /dev/null +++ b/apps/files_odfviewer/src/webodf/webodf/xmledit/test.xml @@ -0,0 +1,22 @@ + + + + + + + load xml document in a frame + + + show xml in a frame with a specified css + + + diff --git a/apps/files_pdfviewer/js/viewer.js b/apps/files_pdfviewer/js/viewer.js index 2c9cbb9b43..29db2ea7f2 100644 --- a/apps/files_pdfviewer/js/viewer.js +++ b/apps/files_pdfviewer/js/viewer.js @@ -40,7 +40,7 @@ $(document).ready(function(){ if(location.href.indexOf("files")!=-1) { PDFJS.workerSrc = OC.filePath('files_pdfviewer','js','pdfjs/build/pdf.js'); if(typeof FileActions!=='undefined'){ - FileActions.register('application/pdf','Edit','',function(filename){ + FileActions.register('application/pdf','Edit', FileActions.PERMISSION_READ, '',function(filename){ showPDFviewer($('#dir').val(),filename); }); FileActions.setDefault('application/pdf','Edit'); diff --git a/apps/files_sharing/ajax/email.php b/apps/files_sharing/ajax/email.php deleted file mode 100644 index aba4f699fa..0000000000 --- a/apps/files_sharing/ajax/email.php +++ /dev/null @@ -1,18 +0,0 @@ - array('message' => $exception->getMessage()))); -} diff --git a/apps/files_sharing/ajax/getitem.php b/apps/files_sharing/ajax/getitem.php deleted file mode 100644 index 06a80102de..0000000000 --- a/apps/files_sharing/ajax/getitem.php +++ /dev/null @@ -1,71 +0,0 @@ - $gid, 'permissions' => $rows[$i]['permissions'], 'users' => OC_Group::usersInGroup($gid), 'parentFolder' => false)); - } else { - $group = array(array('gid' => $gid, 'permissions' => $rows[$i]['permissions'], 'users' => OC_Group::usersInGroup($gid), 'parentFolder' => basename($path))); - } - if (!isset($item['groups'])) { - $item['groups'] = $group; - } else if (is_array($item['groups'])) { - $gidExists = false; - $currentGroups = $item['groups']; - // Check if the group is already included - foreach ($currentGroups as $g) { - if ($g['gid'] == $gid) { - $gidExists = true; - } - } - if (!$gidExists) { - $item['groups'] = array_merge($item['groups'], $group); - } - } - } else { - if ($path == $source) { - $user = array(array('uid' => $uid_shared_with, 'permissions' => $rows[$i]['permissions'], 'parentFolder' => false)); - } else { - $user = array(array('uid' => $uid_shared_with, 'permissions' => $rows[$i]['permissions'], 'parentFolder' => basename($path))); - } - if (!isset($item['users'])) { - $item['users'] = $user; - } else if (is_array($item['users'])) { - $item['users'] = array_merge($item['users'], $user); - } - } - } - } - } - $path = dirname($path); -} - -OCP\JSON::success(array('data' => $item)); diff --git a/apps/files_sharing/ajax/getstatuses.php b/apps/files_sharing/ajax/getstatuses.php deleted file mode 100644 index 1be4d9a0d9..0000000000 --- a/apps/files_sharing/ajax/getstatuses.php +++ /dev/null @@ -1,22 +0,0 @@ - $items)); diff --git a/apps/files_sharing/ajax/setpermissions.php b/apps/files_sharing/ajax/setpermissions.php deleted file mode 100644 index 0a2cf78f76..0000000000 --- a/apps/files_sharing/ajax/setpermissions.php +++ /dev/null @@ -1,12 +0,0 @@ - $shared->getToken())); - } else { - OCP\JSON::success(); - } - } catch (Exception $exception) { - OCP\Util::writeLog('files_sharing', 'Unexpected Error : '.$exception->getMessage(), OCP\Util::ERROR); - OCP\JSON::error(array('data' => array('message' => $exception->getMessage()))); - } - } else { - if ($file['encrypted'] == true) { - OCP\JSON::error(array('data' => array('message' => 'Encrypted files cannot be shared'))); - } else { - OCP\Util::writeLog('files_sharing', 'File does not exist or is not readable :'.$source, OCP\Util::ERROR); - OCP\JSON::error(array('data' => array('message' => 'File does not exist or is not readable'))); - } - } -} diff --git a/apps/files_sharing/ajax/toggleresharing.php b/apps/files_sharing/ajax/toggleresharing.php deleted file mode 100644 index 7da4fdfeea..0000000000 --- a/apps/files_sharing/ajax/toggleresharing.php +++ /dev/null @@ -1,9 +0,0 @@ -"; -$groups[] = ""; -foreach ($userGroups as $group) { - $groupUsers = OC_Group::usersInGroup($group); - $userCount = 0; - foreach ($groupUsers as $user) { - if ($user != $self) { - $users[] = ""; - $userCount++; - } - } - // Don't include the group if only the current user is a member of it - if ($userCount > 0) { - $groups[] = ""; - } -} -$users = array_unique($users); -$users[] = ""; -$groups[] = ""; -$users = array_merge($users, $groups); -OCP\JSON::encodedPrint($users); diff --git a/apps/files_sharing/appinfo/app.php b/apps/files_sharing/appinfo/app.php index bbb753d5e6..109f86b2e8 100644 --- a/apps/files_sharing/appinfo/app.php +++ b/apps/files_sharing/appinfo/app.php @@ -1,24 +1,9 @@ $source, 'token'=>$token)); OC_Filesystem::readfile($source); } diff --git a/apps/files_sharing/js/list.js b/apps/files_sharing/js/list.js deleted file mode 100644 index 41eabd1f4a..0000000000 --- a/apps/files_sharing/js/list.js +++ /dev/null @@ -1,54 +0,0 @@ -$(document).ready(function() { - $( "#source" ).autocomplete({ - source: "../../files/ajax/autocomplete.php", - minLength: 1 - }); - $( "#uid_shared_with" ).autocomplete({ - source: "ajax/userautocomplete.php", - minLength: 1 - }); - $("button.delete").live('click', function( event ) { - event.preventDefault(); -// var row=$(this); - var source=$(this).attr('data-source'); - var uid_shared_with=$(this).attr('data-uid_shared_with'); - var data='source='+encodeURIComponent(source)+'&uid_shared_with='+encodeURIComponent(uid_shared_with); - $.ajax({ - type: 'GET', - url: 'ajax/unshare.php', - cache: false, - data: data -// success: function(){ -// row.remove(); -// } - }); - }); - $('#share_item').submit(function( event ){ - event.preventDefault(); - var source=$('#source').val(); - var uid_shared_with=$('#uid_shared_with').val(); - var permissions=$('#permissions').val()||0; - var data='source='+source+'&uid_shared_with='+uid_shared_with+'&permissions='+permissions; - $.ajax({ - type: 'GET', - url: 'ajax/share.php', - cache: false, - data: data, -// success: function(token){ -// if(token){ -// var html=""; -// html+=""+path+""; -// var expire=($('#expire').val())?$('#expire').val():'Never' -// html+=""+expire+"" -// html+=""+$('#baseUrl').val()+"?token="+token+"" -// html+="" -// html+="" -// $(html).insertBefore($('#newlink_row')); -// $('#expire').val(''); -// $('#expire_time').val(''); -// $('#path').val(''); -// } -// } - }); - }); -}); \ No newline at end of file diff --git a/apps/files_sharing/js/settings.js b/apps/files_sharing/js/settings.js deleted file mode 100644 index bb7d79fecb..0000000000 --- a/apps/files_sharing/js/settings.js +++ /dev/null @@ -1,9 +0,0 @@ -$(document).ready(function() { - $('#allowResharing').bind('change', function() { - var checked = 1; - if (!this.checked) { - checked = 0; - } - $.post(OC.filePath('files_sharing','ajax','toggleresharing.php'), 'resharing='+checked); - }); -}); \ No newline at end of file diff --git a/apps/files_sharing/js/share.js b/apps/files_sharing/js/share.js index 3cfa3583b1..8754b16b06 100644 --- a/apps/files_sharing/js/share.js +++ b/apps/files_sharing/js/share.js @@ -1,375 +1,64 @@ -OC.Share={ - icons:[], - itemUsers:[], - itemGroups:[], - itemPrivateLink:false, - usersAndGroups:[], - loadIcons:function() { - // Cache all icons for shared files - $.getJSON(OC.filePath('files_sharing', 'ajax', 'getstatuses.php'), function(result) { - if (result && result.status === 'success') { - $.each(result.data, function(item, hasPrivateLink) { - if (hasPrivateLink) { - OC.Share.icons[item] = OC.imagePath('core', 'actions/public'); - } else { - OC.Share.icons[item] = OC.imagePath('core', 'actions/shared'); - } - }); - } - }); - }, - loadItem:function(item) { - $.ajax({type: 'GET', url: OC.filePath('files_sharing', 'ajax', 'getitem.php'), data: { item: item }, async: false, success: function(result) { - if (result && result.status === 'success') { - var item = result.data; - OC.Share.itemUsers = item.users; - OC.Share.itemGroups = item.groups; - OC.Share.itemPrivateLink = item.privateLink; - } - }}); - }, - share:function(source, uid_shared_with, permissions, callback) { - $.post(OC.filePath('files_sharing', 'ajax', 'share.php'), { sources: source, uid_shared_with: uid_shared_with, permissions: permissions }, function(result) { - if (result && result.status === 'success') { - if (callback) { - callback(result.data); - } - } else { - OC.dialogs.alert(result.data.message, 'Error while sharing'); - } - }); - }, - unshare:function(source, uid_shared_with, callback) { - $.post(OC.filePath('files_sharing', 'ajax', 'unshare.php'), { source: source, uid_shared_with: uid_shared_with }, function(result) { - if (result && result.status === 'success') { - if (callback) { - callback(); - } - } else { - OC.dialogs.alert('Error', 'Error while unsharing'); - } - }); - }, - changePermissions:function(source, uid_shared_with, permissions) { - $.post(OC.filePath('files_sharing','ajax','setpermissions.php'), { source: source, uid_shared_with: uid_shared_with, permissions: permissions }, function(result) { - if (!result || result.status !== 'success') { - OC.dialogs.alert('Error', 'Error while changing permissions'); - } - }); - }, - showDropDown:function(item, appendTo) { - OC.Share.loadItem(item); - var html = ''; + $(html).appendTo(appendTo); + } + $('#dropdown').show('blind', function() { + OC.Share.droppedDown = true; + }); + $('#shareWith').focus(); + }, + hideDropDown:function(callback) { + $('#dropdown').hide('blind', function() { + OC.Share.droppedDown = false; + $('#dropdown').remove(); + if (typeof FileActions !== 'undefined') { + $('tr').removeClass('mouseOver'); + } + if (callback) { + callback.call(); + } + }); + }, + addShareWith:function(shareType, shareWith, permissions, possiblePermissions) { + if (!OC.Share.itemShares[shareType]) { + OC.Share.itemShares[shareType] = []; + } + OC.Share.itemShares[shareType].push(shareWith); + var editChecked = createChecked = updateChecked = deleteChecked = shareChecked = ''; + if (permissions & OC.Share.PERMISSION_CREATE) { + createChecked = 'checked="checked"'; + editChecked = 'checked="checked"'; + } + if (permissions & OC.Share.PERMISSION_UPDATE) { + updateChecked = 'checked="checked"'; + editChecked = 'checked="checked"'; + } + if (permissions & OC.Share.PERMISSION_DELETE) { + deleteChecked = 'checked="checked"'; + editChecked = 'checked="checked"'; + } + if (permissions & OC.Share.PERMISSION_SHARE) { + shareChecked = 'checked="checked"'; + } + var html = '
  • '; + html += shareWith; + if (possiblePermissions & OC.Share.PERMISSION_CREATE || possiblePermissions & OC.Share.PERMISSION_UPDATE || possiblePermissions & OC.Share.PERMISSION_DELETE) { + if (editChecked == '') { + html += '
  • '; + $(html).appendTo('#shareWithList'); + + }, + showPrivateLink:function(item, token) { + $('#privateLinkCheckbox').attr('checked', true); + var link = parent.location.protocol+'//'+location.host+OC.linkTo('', 'public.php')+'?service=files&token='+token; + if (token.indexOf('&path=') == -1) { + link += '&file=' + encodeURIComponent(item).replace(/%2F/g, '/'); + } else { + // Disable checkbox if inside a shared parent folder + $('#privateLinkCheckbox').attr('disabled', 'true'); + } + $('#privateLinkText').val(link); + $('#privateLinkText').show('blind', function() { + $('#privateLinkText').after('
    '); + $('#email').show(); + $('#emailButton').show(); + }); + }, + hidePrivateLink:function() { + $('#privateLinkText').hide('blind'); + $('#emailBreak').remove(); + $('#email').hide(); + $('#emailButton').hide(); + }, + emailPrivateLink:function() { + var link = $('#privateLinkText').val(); + var file = link.substr(link.lastIndexOf('/') + 1).replace(/%20/g, ' '); + $.post(OC.filePath('files_sharing', 'ajax', 'email.php'), { toaddress: $('#email').val(), link: link, file: file } ); + $('#email').css('font-weight', 'bold'); + $('#email').animate({ fontWeight: 'normal' }, 2000, function() { + $(this).val(''); + }).val('Email sent'); + }, + dirname:function(path) { + return path.replace(/\\/g,'/').replace(/\/[^\/]*$/, ''); + } +} + +$(document).ready(function() { + + $('a.share').live('click', function(event) { + event.stopPropagation(); + if ($(this).data('item-type') !== undefined && $(this).data('item') !== undefined) { + var itemType = $(this).data('item-type'); + var itemSource = $(this).data('item'); + var appendTo = $(this).parent().parent(); + var privateLink = false; + var possiblePermissions = $(this).data('possible-permissions'); + if ($(this).data('private-link') !== undefined && $(this).data('private-link') == true) { + privateLink = true; + } + if (OC.Share.droppedDown) { + if (itemSource != $('#dropdown').data('item')) { + OC.Share.hideDropDown(function () { + OC.Share.showDropDown(itemType, itemSource, appendTo, privateLink, possiblePermissions); + }); + } else { + OC.Share.hideDropDown(); + } + } else { + OC.Share.showDropDown(itemType, itemSource, appendTo, privateLink, possiblePermissions); + } + } + }); + + $(this).click(function(event) { + if (OC.Share.droppedDown && !($(event.target).hasClass('drop')) && $('#dropdown').has(event.target).length === 0) { + OC.Share.hideDropDown(); + } + }); + + $('#shareWithList li').live('mouseenter', function(event) { + // Show permissions and unshare button + $(':hidden', this).filter(':not(.cruds)').show(); + }); + + $('#shareWithList li').live('mouseleave', function(event) { + // Hide permissions and unshare button + if (!$('.cruds', this).is(':visible')) { + $('a', this).hide(); + if (!$('input[name="edit"]', this).is(':checked')) { + $('input:[type=checkbox]', this).hide(); + $('label', this).hide(); + } + } else { + $('a.unshare', this).hide(); + } + }); + + $('.showCruds').live('click', function() { + $(this).parent().find('.cruds').toggle(); + }); + + $('.unshare').live('click', function() { + var li = $(this).parent(); + var itemType = $('#dropdown').data('item-type'); + var itemSource = $('#dropdown').data('item-source'); + var shareType = $(li).data('share-type'); + var shareWith = $(li).data('share-with'); + OC.Share.unshare(itemType, itemSource, shareType, shareWith, function() { + $(li).remove(); + var index = OC.Share.itemShares[shareType].indexOf(shareWith); + OC.Share.itemShares[shareType].splice(index, 1); + OC.Share.updateIcon(itemType, itemSource); + }); + }); + + $('.permissions').live('change', function() { + if ($(this).attr('name') == 'edit') { + var li = $(this).parent().parent() + var checkboxes = $('.permissions', li); + var checked = $(this).is(':checked'); + // Check/uncheck Create, Update, and Delete checkboxes if Edit is checked/unck + $(checkboxes).filter('input[name="create"]').attr('checked', checked); + $(checkboxes).filter('input[name="update"]').attr('checked', checked); + $(checkboxes).filter('input[name="delete"]').attr('checked', checked); + } else { + var li = $(this).parent().parent().parent(); + var checkboxes = $('.permissions', li); + // Uncheck Edit if Create, Update, and Delete are not checked + if (!$(this).is(':checked') && !$(checkboxes).filter('input[name="create"]').is(':checked') && !$(checkboxes).filter('input[name="update"]').is(':checked') && !$(checkboxes).filter('input[name="delete"]').is(':checked')) { + $(checkboxes).filter('input[name="edit"]').attr('checked', false); + // Check Edit if Create, Update, or Delete is checked + } else if (($(this).attr('name') == 'create' || $(this).attr('name') == 'update' || $(this).attr('name') == 'delete')) { + $(checkboxes).filter('input[name="edit"]').attr('checked', true); + } + } + var permissions = OC.Share.PERMISSION_READ; + $(checkboxes).filter(':not(input[name="edit"])').filter(':checked').each(function(index, checkbox) { + permissions |= $(checkbox).data('permissions'); + }); + OC.Share.setPermissions($('#dropdown').data('item-type'), $('#dropdown').data('item-source'), $(li).data('share-type'), $(li).data('share-with'), permissions); + }); + + $('#privateLinkCheckbox').live('change', function() { + var itemType = $('#dropdown').data('item-type'); + var item = $('#dropdown').data('item'); + if (this.checked) { + // Create a private link + OC.Share.share(itemType, item, OC.Share.SHARE_TYPE_PRIVATE_LINK, 0, 0, function(token) { + OC.Share.showPrivateLink(item, 'foo'); + // Change icon + OC.Share.icons[item] = OC.imagePath('core', 'actions/public'); + }); + } else { + // Delete private link + OC.Share.unshare(item, 'public', function() { + OC.Share.hidePrivateLink(); + // Change icon + if (OC.Share.itemUsers || OC.Share.itemGroups) { + OC.Share.icons[item] = OC.imagePath('core', 'actions/shared'); + } else { + OC.Share.icons[item] = OC.imagePath('core', 'actions/share'); + } + }); + } + }); + + $('#privateLinkText').live('click', function() { + $(this).focus(); + $(this).select(); + }); + + $('#emailPrivateLink').live('submit', function() { + OC.Share.emailPrivateLink(); + }); +}); diff --git a/core/l10n/de.php b/core/l10n/de.php index b0959a5412..9ed2d61782 100644 --- a/core/l10n/de.php +++ b/core/l10n/de.php @@ -23,13 +23,13 @@ "No categories selected for deletion." => "Keine Kategorien zum Löschen angegeben.", "Error" => "Fehler", "ownCloud password reset" => "ownCloud-Passwort zurücksetzen", -"Use the following link to reset your password: {link}" => "Nutze folgenden Link, um dein Passwort zurückzusetzen: {link}", -"You will receive a link to reset your password via Email." => "Du erhälst einen Link, um dein Passwort per E-Mail zurückzusetzen.", +"Use the following link to reset your password: {link}" => "Nutzen Sie den nachfolgenden Link, um Ihr Passwort zurückzusetzen: {link}", +"You will receive a link to reset your password via Email." => "Sie erhalten einen Link, um Ihr Passwort per E-Mail zurückzusetzen.", "Requested" => "Angefragt", "Login failed!" => "Login fehlgeschlagen!", "Username" => "Benutzername", "Request reset" => "Anfrage zurückgesetzt", -"Your password was reset" => "Dein Passwort wurde zurückgesetzt.", +"Your password was reset" => "Ihr Passwort wurde zurückgesetzt.", "To login page" => "Zur Login-Seite", "New password" => "Neues Passwort", "Reset password" => "Passwort zurücksetzen", @@ -38,9 +38,9 @@ "Apps" => "Anwendungen", "Admin" => "Admin", "Help" => "Hilfe", -"Access forbidden" => "Zugang verboten", +"Access forbidden" => "Zugriff verboten", "Cloud not found" => "Cloud nicht gefunden", -"Edit categories" => "Kategorien editieren", +"Edit categories" => "Kategorien bearbeiten", "Add" => "Hinzufügen", "Create an admin account" => "Administrator-Konto anlegen", "Password" => "Passwort", @@ -53,12 +53,12 @@ "Database name" => "Datenbank-Name", "Database host" => "Datenbank-Host", "Finish setup" => "Installation abschließen", -"web services under your control" => "Web Services unter ihrer Kontrolle", +"web services under your control" => "Web-Services unter Ihrer Kontrolle", "Log out" => "Abmelden", "Lost your password?" => "Passwort vergessen?", "remember" => "merken", "Log in" => "Einloggen", -"You are logged out." => "Abgemeldet", +"You are logged out." => "Sie wurden abgemeldet.", "prev" => "Zurück", "next" => "Weiter" ); diff --git a/core/l10n/es.php b/core/l10n/es.php index 31d8d792a4..8766228ba8 100644 --- a/core/l10n/es.php +++ b/core/l10n/es.php @@ -1,6 +1,6 @@ "Nombre de la aplicación no provisto.", -"No category to add?" => "¿Ninguna categoría para agregar?", +"No category to add?" => "¿Ninguna categoría para añadir?", "This category already exists: " => "Esta categoría ya existe: ", "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" => "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=", "Settings" => "Ajustes", @@ -19,8 +19,8 @@ "Cancel" => "Cancelar", "No" => "No", "Yes" => "Sí", -"Ok" => "Vale", -"No categories selected for deletion." => "No hay categorias seleccionadas para borrar.", +"Ok" => "Aceptar", +"No categories selected for deletion." => "No hay categorías seleccionadas para borrar.", "Error" => "Fallo", "ownCloud password reset" => "Reiniciar contraseña de ownCloud", "Use the following link to reset your password: {link}" => "Utiliza el siguiente enlace para restablecer tu contraseña: {link}", diff --git a/core/l10n/sv.php b/core/l10n/sv.php index 6be057768d..25ba95558e 100644 --- a/core/l10n/sv.php +++ b/core/l10n/sv.php @@ -1,5 +1,5 @@ "Programnamn har inte angetts", +"Application name not provided." => "Programnamn har inte angetts.", "No category to add?" => "Ingen kategori att lägga till?", "This category already exists: " => "Denna kategori finns redan:", "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" => "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=", @@ -26,14 +26,14 @@ "Use the following link to reset your password: {link}" => "Använd följande länk för att återställa lösenordet: {link}", "You will receive a link to reset your password via Email." => "Du får en länk att återställa ditt lösenord via e-post.", "Requested" => "Begärd", -"Login failed!" => "Inloggning misslyckades!", +"Login failed!" => "Misslyckad inloggning!", "Username" => "Användarnamn", "Request reset" => "Begär återställning", "Your password was reset" => "Ditt lösenord har återställts", -"To login page" => "Till logga in sidan", +"To login page" => "Till logginsidan", "New password" => "Nytt lösenord", "Reset password" => "Återställ lösenordet", -"Personal" => "Personlig", +"Personal" => "Personligt", "Users" => "Användare", "Apps" => "Program", "Admin" => "Admin", @@ -48,9 +48,9 @@ "Data folder" => "Datamapp", "Configure the database" => "Konfigurera databasen", "will be used" => "kommer att användas", -"Database user" => "Databas-användare", -"Database password" => "Lösenord för databasen", -"Database name" => "Databasens namn", +"Database user" => "Databasanvändare", +"Database password" => "Lösenord till databasen", +"Database name" => "Databasnamn", "Database host" => "Databasserver", "Finish setup" => "Avsluta installation", "web services under your control" => "webbtjänster under din kontroll", @@ -58,7 +58,7 @@ "Lost your password?" => "Glömt ditt lösenord?", "remember" => "kom ihåg", "Log in" => "Logga in", -"You are logged out." => "Du är utloggad", +"You are logged out." => "Du är utloggad.", "prev" => "föregående", "next" => "nästa" ); diff --git a/core/templates/installation.php b/core/templates/installation.php index 4558f97bc0..1a05c3fb76 100644 --- a/core/templates/installation.php +++ b/core/templates/installation.php @@ -1,6 +1,7 @@ '> '> '> +'>
    @@ -40,7 +41,7 @@
    - + t( 'Configure the database' ); ?>
    @@ -56,7 +57,7 @@ - +

    MySQL t( 'will be used' ); ?>.

    @@ -66,7 +67,7 @@ - +

    PostgreSQL t( 'will be used' ); ?>.

    @@ -74,6 +75,16 @@ /> + + + +

    Oracle t( 'will be used' ); ?>.

    + + + + /> + +
    @@ -92,6 +103,14 @@

    + +
    +

    + + +

    +
    +

    diff --git a/db_structure.xml b/db_structure.xml index 5a783d41a9..7e4c0bd203 100644 --- a/db_structure.xml +++ b/db_structure.xml @@ -31,7 +31,7 @@ configvalue - clob + text true @@ -388,7 +388,7 @@ moment timestamp - 0000-00-00 00:00:00 + CURRENT_TIMESTAMP true @@ -418,7 +418,7 @@ info - clob + text true @@ -458,7 +458,7 @@ configvalue - clob + text true @@ -498,7 +498,7 @@ propertyvalue - clob + text true @@ -506,6 +506,121 @@ + + + *dbprefix*share + + + + + id + 1 + integer + 0 + true + 4 + + + + share_type + integer + + true + 1 + + + + share_with + text + + true + 255 + + + + uid_owner + text + + true + 255 + + + + parent + integer + + false + 4 + + + + item_type + text + + true + 64 + + + + item_source + text + + false + 255 + + + + item_target + text + + false + 255 + + + + file_source + integer + + false + 4 + + + + file_target + text + + false + 512 + + + + permissions + integer + + true + 1 + + + + stime + integer + + true + 8 + + + + accepted + integer + 0 + true + 1 + + + + +
    + *dbprefix*queuedtasks @@ -548,7 +663,7 @@ parameters - clob + text true diff --git a/index.php b/index.php index 331d7fae8e..a972993c19 100755 --- a/index.php +++ b/index.php @@ -4,7 +4,7 @@ * ownCloud * * @author Frank Karlitschek -* @copyright 2012 Frank Karlitschek frank@owncloud.org +* @copyright 2010 Frank Karlitschek karlitschek@kde.org * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE diff --git a/l10n/af/contacts.po b/l10n/af/contacts.po index 052edbcaa4..f8979aa768 100644 --- a/l10n/af/contacts.po +++ b/l10n/af/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Afrikaans (http://www.transifex.com/projects/p/owncloud/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/af/files.po b/l10n/af/files.po index 0c8cce8a4a..b683bb7b55 100644 --- a/l10n/af/files.po +++ b/l10n/af/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Afrikaans (http://www.transifex.com/projects/p/owncloud/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/af/files_sharing.po b/l10n/af/files_sharing.po index c30e3dcd42..7ca711a252 100644 --- a/l10n/af/files_sharing.po +++ b/l10n/af/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Afrikaans (http://www.transifex.com/projects/p/owncloud/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: af\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/af/settings.po b/l10n/af/settings.po index 6074b2d670..1d213427bc 100644 --- a/l10n/af/settings.po +++ b/l10n/af/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Afrikaans (http://www.transifex.com/projects/p/owncloud/language/af/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/ar/calendar.po b/l10n/ar/calendar.po index 55906a62ff..947cca6fda 100644 --- a/l10n/ar/calendar.po +++ b/l10n/ar/calendar.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:47+0000\n" +"Last-Translator: blackcoder \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,19 +20,19 @@ msgstr "" #: ajax/cache/status.php:19 msgid "Not all calendars are completely cached" -msgstr "" +msgstr "ليس جميع الجداول الزمنيه محفوضه مؤقة" #: ajax/cache/status.php:21 msgid "Everything seems to be completely cached" -msgstr "" +msgstr "كل شيء محفوض مؤقة" #: ajax/categories/rescan.php:29 msgid "No calendars found." -msgstr "" +msgstr "لم يتم العثور على جدول الزمني" #: ajax/categories/rescan.php:37 msgid "No events found." -msgstr "" +msgstr "لم يتم العثور على احداث" #: ajax/event/edit.form.php:20 msgid "Wrong calendar" @@ -68,34 +68,34 @@ msgstr "تم تغيير المنطقة الزمنية" msgid "Invalid request" msgstr "طلب غير مفهوم" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:37 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "الجدول الزمني" #: js/calendar.js:832 msgid "ddd" -msgstr "" +msgstr "ddd" #: js/calendar.js:833 msgid "ddd M/d" -msgstr "" +msgstr "ddd M/d" #: js/calendar.js:834 msgid "dddd M/d" -msgstr "" +msgstr "ddd M/d" #: js/calendar.js:837 msgid "MMMM yyyy" -msgstr "" +msgstr "ddd M/d" #: js/calendar.js:839 msgid "MMM d[ yyyy]{ '—'[ MMM] d yyyy}" -msgstr "" +msgstr "MMM d[ yyyy]{ '—'[ MMM] d yyyy}" #: js/calendar.js:841 msgid "dddd, MMM d, yyyy" -msgstr "" +msgstr "dddd, MMM d, yyyy" #: lib/app.php:121 msgid "Birthday" @@ -159,11 +159,11 @@ msgstr "العمل" #: lib/app.php:351 lib/app.php:361 msgid "by" -msgstr "" +msgstr "من قبل" #: lib/app.php:359 lib/app.php:399 msgid "unnamed" -msgstr "" +msgstr "غير مسمى" #: lib/import.php:184 templates/calendar.php:12 #: templates/part.choosecalendar.php:22 @@ -348,51 +348,51 @@ msgstr "تقويم" #: templates/calendar.php:6 msgid "Sun." -msgstr "" +msgstr "أحد" #: templates/calendar.php:6 msgid "Mon." -msgstr "" +msgstr "أثن." #: templates/calendar.php:6 msgid "Tue." -msgstr "" +msgstr "ثلا." #: templates/calendar.php:6 msgid "Wed." -msgstr "" +msgstr "أرب." #: templates/calendar.php:6 msgid "Thu." -msgstr "" +msgstr "خمي." #: templates/calendar.php:6 msgid "Fri." -msgstr "" +msgstr "جمع." #: templates/calendar.php:6 msgid "Sat." -msgstr "" +msgstr "سبت" #: templates/calendar.php:8 msgid "Jan." -msgstr "" +msgstr "ك2" #: templates/calendar.php:8 msgid "Feb." -msgstr "" +msgstr "شبا." #: templates/calendar.php:8 msgid "Mar." -msgstr "" +msgstr "آذا." #: templates/calendar.php:8 msgid "Apr." -msgstr "" +msgstr "نيس." #: templates/calendar.php:8 msgid "May." -msgstr "" +msgstr "أيا." #: templates/calendar.php:8 msgid "Jun." @@ -481,7 +481,7 @@ msgstr "" #: templates/part.choosecalendar.php:2 msgid "Your calendars" -msgstr "" +msgstr "جداولك الزمنيه" #: templates/part.choosecalendar.php:27 #: templates/part.choosecalendar.rowfields.php:11 @@ -490,15 +490,15 @@ msgstr "وصلة CalDav" #: templates/part.choosecalendar.php:31 msgid "Shared calendars" -msgstr "" +msgstr "جداول زمنيه مشتركه" #: templates/part.choosecalendar.php:48 msgid "No shared calendars" -msgstr "" +msgstr "لا يوجد جداول زمنيه مشتركه" #: templates/part.choosecalendar.rowfields.php:8 msgid "Share Calendar" -msgstr "" +msgstr "شارك الجدول الزمني" #: templates/part.choosecalendar.rowfields.php:14 msgid "Download" @@ -515,7 +515,7 @@ msgstr "حذف" #: templates/part.choosecalendar.rowfields.shared.php:4 msgid "shared with you by" -msgstr "" +msgstr "مشاركه من قبل" #: templates/part.editcalendar.php:9 msgid "New calendar" @@ -560,23 +560,23 @@ msgstr "تصدير المعلومات" #: templates/part.eventform.php:8 templates/part.showevent.php:3 msgid "Eventinfo" -msgstr "" +msgstr "تفاصيل الحدث" #: templates/part.eventform.php:9 templates/part.showevent.php:4 msgid "Repeating" -msgstr "" +msgstr "يعاد" #: templates/part.eventform.php:10 templates/part.showevent.php:5 msgid "Alarm" -msgstr "" +msgstr "تنبيه" #: templates/part.eventform.php:11 templates/part.showevent.php:6 msgid "Attendees" -msgstr "" +msgstr "الحضور" #: templates/part.eventform.php:13 msgid "Share" -msgstr "" +msgstr "شارك" #: templates/part.eventform.php:21 msgid "Title of the Event" @@ -588,11 +588,11 @@ msgstr "فئة" #: templates/part.eventform.php:29 msgid "Separate categories with commas" -msgstr "" +msgstr "افصل الفئات بالفواصل" #: templates/part.eventform.php:30 msgid "Edit categories" -msgstr "" +msgstr "عدل الفئات" #: templates/part.eventform.php:56 templates/part.showevent.php:52 msgid "All Day Event" @@ -715,19 +715,19 @@ msgstr "إضافة حدث جديد" #: templates/part.showevent.php:1 msgid "View an event" -msgstr "" +msgstr "شاهد الحدث" #: templates/part.showevent.php:23 msgid "No categories selected" -msgstr "" +msgstr "لم يتم اختيار الفئات" #: templates/part.showevent.php:37 msgid "of" -msgstr "" +msgstr "من" #: templates/part.showevent.php:59 templates/part.showevent.php:67 msgid "at" -msgstr "" +msgstr "في" #: templates/settings.php:10 msgid "General" @@ -791,24 +791,24 @@ msgstr "" #: templates/share.dropdown.php:20 msgid "Users" -msgstr "" +msgstr "المستخدمين" #: templates/share.dropdown.php:21 msgid "select users" -msgstr "" +msgstr "اختر المستخدمين" #: templates/share.dropdown.php:36 templates/share.dropdown.php:62 msgid "Editable" -msgstr "" +msgstr "يمكن تعديله" #: templates/share.dropdown.php:48 msgid "Groups" -msgstr "" +msgstr "مجموعات" #: templates/share.dropdown.php:49 msgid "select groups" -msgstr "" +msgstr "اختر المجموعات" #: templates/share.dropdown.php:75 msgid "make public" -msgstr "" +msgstr "حدث عام" diff --git a/l10n/ar/contacts.po b/l10n/ar/contacts.po index 2b79ab09cc..9740f17457 100644 --- a/l10n/ar/contacts.po +++ b/l10n/ar/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "خطء خلال توقيف كتاب العناوين." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -80,18 +80,18 @@ msgstr "يجب ملء على الاقل خانه واحده من العنوان. msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "المعلومات الموجودة في ال vCard غير صحيحة. الرجاء إعادة تحديث الصفحة." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "خطء خلال محي الصفه." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -112,10 +112,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "خطء خلال تعديل الصفه." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "المعارف" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -299,7 +312,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "هذا ليس دفتر عناوينك." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "لم يتم العثور على الشخص." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "عنوان" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "الهاتف" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "البريد الالكتروني" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "المؤسسة" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "الوظيفة" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "البيت" -#: lib/app.php:133 -msgid "Mobile" -msgstr "الهاتف المحمول" - -#: lib/app.php:135 -msgid "Text" -msgstr "معلومات إضافية" - -#: lib/app.php:136 -msgid "Voice" -msgstr "صوت" - -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "الفاكس" - -#: lib/app.php:139 -msgid "Video" -msgstr "الفيديو" - -#: lib/app.php:140 -msgid "Pager" -msgstr "الرنان" - -#: lib/app.php:146 -msgid "Internet" -msgstr "" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "تاريخ الميلاد" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "الهاتف المحمول" + +#: lib/app.php:203 +msgid "Text" +msgstr "معلومات إضافية" + +#: lib/app.php:204 +msgid "Voice" +msgstr "صوت" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "الفاكس" + +#: lib/app.php:207 +msgid "Video" +msgstr "الفيديو" + +#: lib/app.php:208 +msgid "Pager" +msgstr "الرنان" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "تاريخ الميلاد" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "" msgid "Contact" msgstr "معرفه" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "أضف شخص " @@ -533,13 +585,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "المؤسسة" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "حذف" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -547,7 +604,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -575,63 +632,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "مفضل" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 +msgid "View on map" +msgstr "" + +#: templates/part.contact.php:110 +msgid "Edit address details" +msgstr "" + +#: templates/part.contact.php:116 +msgid "Add notes here." +msgstr "" + +#: templates/part.contact.php:124 msgid "Add field" msgstr "" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "الهاتف" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "البريد الالكتروني" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "عنوان" + +#: templates/part.contact.php:133 msgid "Note" msgstr "" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "انزال المعرفه" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "امحي المعرفه" @@ -802,19 +880,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "انزال" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "تعديل" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "كتاب عناوين جديد" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "حفظ" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "الغاء" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/ar/files.po b/l10n/ar/files.po index 1e85ee962b..36056ab59e 100644 --- a/l10n/ar/files.po +++ b/l10n/ar/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "" msgid "Files" msgstr "الملفات" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "محذوف" @@ -80,59 +76,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "حجم" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "معدل" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/ar/files_sharing.po b/l10n/ar/files_sharing.po index e96e0f5ef9..f3922ed92a 100644 --- a/l10n/ar/files_sharing.po +++ b/l10n/ar/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/ar/media.po b/l10n/ar/media.po index 60e237f0d3..b72ad0a3ec 100644 --- a/l10n/ar/media.po +++ b/l10n/ar/media.po @@ -3,28 +3,28 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# , 2011. +# , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Arabic (http://www.transifex.net/projects/p/owncloud/language/ar/)\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:27+0000\n" +"Last-Translator: blackcoder \n" +"Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ar\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 && n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5\n" -#: appinfo/app.php:32 templates/player.php:8 +#: appinfo/app.php:45 templates/player.php:8 msgid "Music" msgstr "الموسيقى" #: js/music.js:18 msgid "Add album to playlist" -msgstr "" +msgstr "أضف الالبوم الى القائمه" #: templates/music.php:3 templates/player.php:12 msgid "Play" diff --git a/l10n/ar/settings.po b/l10n/ar/settings.po index abf56cce11..0f13d4ebb2 100644 --- a/l10n/ar/settings.po +++ b/l10n/ar/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (http://www.transifex.com/projects/p/owncloud/language/ar/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/ar_SA/contacts.po b/l10n/ar_SA/contacts.po index b9c9e90a50..26cc5d2266 100644 --- a/l10n/ar_SA/contacts.po +++ b/l10n/ar_SA/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/owncloud/language/ar_SA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/ar_SA/files.po b/l10n/ar_SA/files.po index 84a992f187..1e89550f0e 100644 --- a/l10n/ar_SA/files.po +++ b/l10n/ar_SA/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/owncloud/language/ar_SA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/ar_SA/files_sharing.po b/l10n/ar_SA/files_sharing.po index 426f4c0423..c240873407 100644 --- a/l10n/ar_SA/files_sharing.po +++ b/l10n/ar_SA/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/owncloud/language/ar_SA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: ar_SA\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/ar_SA/settings.po b/l10n/ar_SA/settings.po index a6637ba21a..803e9d5953 100644 --- a/l10n/ar_SA/settings.po +++ b/l10n/ar_SA/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Arabic (Saudi Arabia) (http://www.transifex.com/projects/p/owncloud/language/ar_SA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/bg_BG/contacts.po b/l10n/bg_BG/contacts.po index c76da91d86..28690adf4d 100644 --- a/l10n/bg_BG/contacts.po +++ b/l10n/bg_BG/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/bg_BG/files.po b/l10n/bg_BG/files.po index 3e542a9008..d016c1a31f 100644 --- a/l10n/bg_BG/files.po +++ b/l10n/bg_BG/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "Грешка при запис на диска" msgid "Files" msgstr "Файлове" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Изтриване" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Грешка при качване" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Качването е отменено." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Неправилно име – \"/\" не е позволено." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Размер" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Променено" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "папка" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "папки" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "файл" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/bg_BG/files_sharing.po b/l10n/bg_BG/files_sharing.po index 0682eb7965..f03989ba48 100644 --- a/l10n/bg_BG/files_sharing.po +++ b/l10n/bg_BG/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: bg_BG\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/bg_BG/settings.po b/l10n/bg_BG/settings.po index cfa402cb99..e7697bb27e 100644 --- a/l10n/bg_BG/settings.po +++ b/l10n/bg_BG/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Bulgarian (Bulgaria) (http://www.transifex.com/projects/p/owncloud/language/bg_BG/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -229,7 +229,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/ca/contacts.po b/l10n/ca/contacts.po index 4db2c47811..d7fbb58469 100644 --- a/l10n/ca/contacts.po +++ b/l10n/ca/contacts.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 11:14+0000\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 08:24+0000\n" "Last-Translator: rogerc \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "Error en (des)activar la llibreta d'adreces." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "no s'ha establert la id." @@ -81,18 +81,18 @@ msgstr "Almenys heu d'omplir un dels camps d'adreça." msgid "Trying to add duplicate property: " msgstr "Esteu intentant afegir una propietat duplicada:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Error en afegir la propietat del contacte:" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Falta el paràmetre IM." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "IM desconegut:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "La informació de la vCard és incorrecta. Carregueu la pàgina de nou." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Error en eliminar la propietat del contacte." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Falta la ID" @@ -113,10 +113,6 @@ msgstr "La informació de la vCard és incorrecta. Carregueu de nou la pàgina:" msgid "Something went FUBAR. " msgstr "Alguna cosa ha anat FUBAR." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Error en actualitzar la propietat del contacte." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "No s'ha pogut carregar la imatge temporal: " msgid "No file was uploaded. Unknown error" msgstr "No s'ha carregat cap fitxer. Error desconegut" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Contactes" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "No s'ha pogut obtenir una adreça vàlida." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Error" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "No teniu permisos per afegir contactes a " + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Seleccioneu una de les vostres llibretes d'adreces" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Error de permisos" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Aquesta propietat no pot ser buida." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "No s'han pogut serialitzar els elements." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' s'ha cridat sense argument de tipus. Informeu-ne a bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Edita el nom" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "No s'han seleccionat fitxers per a la pujada." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "El fitxer que intenteu pujar excedeix la mida màxima de pujada en aquest servidor." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "Error en carregar la imatge de perfil." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Seleccioneu un tipus" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "Heu marcat eliminar alguns contactes, però encara no s'han eliminat. Espereu mentre s'esborren." +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Voleu fusionar aquestes llibretes d'adreces?" + #: js/loader.js:49 msgid "Result: " msgstr "Resultat: " @@ -300,7 +313,7 @@ msgstr " importat, " msgid " failed." msgstr " fallada." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "El nom a mostrar no pot ser buit" @@ -308,125 +321,156 @@ msgstr "El nom a mostrar no pot ser buit" msgid "Addressbook not found: " msgstr "No s'ha trobat la llibreta d'adreces: " -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Aquesta no és la vostra llibreta d'adreces" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "No s'ha trobat el contacte." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adreça" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telèfon" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Correu electrònic" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organització" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Feina" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Casa" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mòbil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Text" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Veu" - -#: lib/app.php:137 -msgid "Message" -msgstr "Missatge" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Vídeo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Paginador" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Aniversari" - -#: lib/app.php:184 -msgid "Business" -msgstr "Negocis" - -#: lib/app.php:185 -msgid "Call" -msgstr "Trucada" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Clients" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "Emissari" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Vacances" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Idees" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Viatge" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Aniversari" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Reunió" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Altres" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mòbil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Text" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Veu" + +#: lib/app.php:205 +msgid "Message" +msgstr "Missatge" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Vídeo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Paginador" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Aniversari" + +#: lib/app.php:253 +msgid "Business" +msgstr "Negocis" + +#: lib/app.php:254 +msgid "Call" +msgstr "Trucada" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Clients" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Emissari" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Vacances" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Idees" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Viatge" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Aniversari" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Reunió" + +#: lib/app.php:263 msgid "Personal" msgstr "Personal" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projectes" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Preguntes" @@ -438,6 +482,14 @@ msgstr "Aniversari de {name}" msgid "Contact" msgstr "Contacte" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "No teniu permisos per editar aquest contacte" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "No teniu permisos per esborrar aquest contacte" + #: templates/index.php:14 msgid "Add Contact" msgstr "Afegeix un contacte" @@ -534,13 +586,18 @@ msgstr "Format personalitzat, Nom curt, Nom sencer, Invertit o Invertit amb coma msgid "Edit name details" msgstr "Edita detalls del nom" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organització" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Suprimeix" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Sobrenom" @@ -548,7 +605,7 @@ msgstr "Sobrenom" msgid "Enter nickname" msgstr "Escriviu el sobrenom" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Adreça web" @@ -564,7 +621,7 @@ msgstr "Vés a la web" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grups" @@ -576,63 +633,84 @@ msgstr "Separeu els grups amb comes" msgid "Edit groups" msgstr "Edita els grups" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferit" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Especifiqueu una adreça de correu electrònic correcta" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Escriviu una adreça de correu electrònic" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Envia per correu electrònic a l'adreça" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Elimina l'adreça de correu electrònic" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Escriviu el número de telèfon" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Elimina el número de telèfon" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Elimina IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Visualitza al mapa" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Edita els detalls de l'adreça" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Afegiu notes aquí." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Afegeix un camp" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telèfon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Correu electrònic" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Missatgeria instantània" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adreça" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Baixa el contacte" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Suprimeix el contacte" @@ -803,19 +881,15 @@ msgstr "No teniu contactes a la llibreta d'adreces." msgid "Add contact" msgstr "Afegeix un contacte" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Configura les llibretes d'adreces" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Selecccioneu llibretes d'adreces" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Escriviu un nom" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Escriviu una descripció" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "Mostra l'enllaç VCF només de lectura" #: templates/settings.php:26 +msgid "Share" +msgstr "Comparteix" + +#: templates/settings.php:29 msgid "Download" msgstr "Baixa" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Edita" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nova llibreta d'adreces" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Nom" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Descripció" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Desa" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Cancel·la" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Més..." diff --git a/l10n/ca/files.po b/l10n/ca/files.po index a453eb9803..aa8f41dca0 100644 --- a/l10n/ca/files.po +++ b/l10n/ca/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,87 +53,83 @@ msgstr "Ha fallat en escriure al disc" msgid "Files" msgstr "Fitxers" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Deixa de compartir" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Suprimeix" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "ja existeix" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "substitueix" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "cancel·la" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "substituït" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "per" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "desfés" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "esborrat" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "s'estan generant fitxers ZIP, pot trigar una estona." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "No es pot pujar el fitxer perquè és una carpeta o té 0 bytes" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Error en la pujada" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Pendents" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "La pujada s'ha cancel·lat." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "El nom no és vàlid, no es permet '/'." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Mida" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificat" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "carpeta" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "carpetes" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fitxer" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "fitxers" diff --git a/l10n/ca/files_sharing.po b/l10n/ca/files_sharing.po index e4bd92a499..bc5fa18cf2 100644 --- a/l10n/ca/files_sharing.po +++ b/l10n/ca/files_sharing.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-13 18:21+0000\n" -"Last-Translator: rogerc \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,38 +18,18 @@ msgstr "" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "Els vostres fitxers compartits" +#: templates/get.php:4 +msgid "Size" +msgstr "Mida" -#: templates/list.php:6 -msgid "Item" -msgstr "Element" +#: templates/get.php:5 +msgid "Modified" +msgstr "Modificat" -#: templates/list.php:7 -msgid "Shared With" -msgstr "Compartit amb" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Esborra-ho tot" -#: templates/list.php:8 -msgid "Permissions" -msgstr "Permisos" - -#: templates/list.php:16 -msgid "Read" -msgstr "Llegeix" - -#: templates/list.php:16 -msgid "Edit" -msgstr "Edita" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "Elimina" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "Permet compartir amb tercers" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "Permet als usuaris compartir fitxers que no són seus" diff --git a/l10n/ca/settings.po b/l10n/ca/settings.po index 703474cad9..dfacbada2c 100644 --- a/l10n/ca/settings.po +++ b/l10n/ca/settings.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 08:06+0000\n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 07:27+0000\n" "Last-Translator: rogerc \n" "Language-Team: Catalan (http://www.transifex.com/projects/p/owncloud/language/ca/)\n" "MIME-Version: 1.0\n" @@ -228,8 +228,8 @@ msgid "Other" msgstr "Altre" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "Grup Admin" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/cs_CZ/admin_dependencies_chk.po b/l10n/cs_CZ/admin_dependencies_chk.po index 33a79435b5..82774f6a24 100644 --- a/l10n/cs_CZ/admin_dependencies_chk.po +++ b/l10n/cs_CZ/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-17 15:37+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "Modul php-json je třeba pro vzájemnou komunikaci mnoha aplikací" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "Modul php-curl je třeba pro zobrazení titulu strany v okamžiku přidání záložky" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "Modul php-gd je třeba pro tvorbu náhledů Vašich obrázků" #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "Modul php-ldap je třeba pro připojení na Váš ldap server" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "Modul php-zip je třeba pro souběžné stahování souborů" #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "Modul php-mb_multibyte je třeba pro správnou funkci kódování." #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "Modul php-ctype je třeba k ověřování dat." #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "Modul php-xml je třeba ke sdílení souborů prostřednictvím WebDAV." #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "Příkaz allow_url_fopen ve Vašem php.ini souboru by měl být nastaven na 1 kvůli získávání informací z OCS serverů" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "Modul php-pdo je třeba pro ukládání dat ownCloud do databáze" #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Status závislostí" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Používáno:" diff --git a/l10n/cs_CZ/admin_migrate.po b/l10n/cs_CZ/admin_migrate.po index c24913e070..a43f6e5be0 100644 --- a/l10n/cs_CZ/admin_migrate.po +++ b/l10n/cs_CZ/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 10:35+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Export této instance ownCloud" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Bude vytvořen komprimovaný soubor obsahující data této instance ownCloud.⏎ Zvolte typ exportu:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Export" diff --git a/l10n/cs_CZ/bookmarks.po b/l10n/cs_CZ/bookmarks.po index 74239f80fa..a6d7d19a24 100644 --- a/l10n/cs_CZ/bookmarks.po +++ b/l10n/cs_CZ/bookmarks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:17+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 09:44+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,42 +20,42 @@ msgstr "" #: appinfo/app.php:14 msgid "Bookmarks" -msgstr "" +msgstr "Záložky" #: bookmarksHelper.php:99 msgid "unnamed" -msgstr "" +msgstr "nepojmenovaný" #: templates/bookmarklet.php:5 msgid "" "Drag this to your browser bookmarks and click it, when you want to bookmark " "a webpage quickly:" -msgstr "" +msgstr "Přetáhněte do Vašeho prohlížeče a kliněte, pokud si přejete rychle uložit stranu do záložek:" #: templates/bookmarklet.php:7 msgid "Read later" -msgstr "" +msgstr "Přečíst později" #: templates/list.php:13 msgid "Address" -msgstr "" +msgstr "Adresa" #: templates/list.php:14 msgid "Title" -msgstr "" +msgstr "Název" #: templates/list.php:15 msgid "Tags" -msgstr "" +msgstr "Tagy" #: templates/list.php:16 msgid "Save bookmark" -msgstr "" +msgstr "Uložit záložku" #: templates/list.php:22 msgid "You have no bookmarks" -msgstr "" +msgstr "Nemáte žádné záložky" #: templates/settings.php:11 msgid "Bookmarklet
    " -msgstr "" +msgstr "Záložky
    " diff --git a/l10n/cs_CZ/calendar.po b/l10n/cs_CZ/calendar.po index 0d3b986928..f06317221c 100644 --- a/l10n/cs_CZ/calendar.po +++ b/l10n/cs_CZ/calendar.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 09:41+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,11 +22,11 @@ msgstr "" #: ajax/cache/status.php:19 msgid "Not all calendars are completely cached" -msgstr "" +msgstr "V paměti nejsou uloženy kompletně všechny kalendáře" #: ajax/cache/status.php:21 msgid "Everything seems to be completely cached" -msgstr "" +msgstr "Zdá se, že vše je kompletně uloženo v paměti" #: ajax/categories/rescan.php:29 msgid "No calendars found." @@ -44,19 +44,19 @@ msgstr "Nesprávný kalendář" msgid "" "The file contained either no events or all events are already saved in your " "calendar." -msgstr "" +msgstr "Soubor, obsahující všechny záznamy nebo je prázdný, je již uložen ve Vašem kalendáři." #: ajax/import/dropimport.php:31 ajax/import/import.php:67 msgid "events has been saved in the new calendar" -msgstr "" +msgstr "Záznam byl uložen v novém kalendáři" #: ajax/import/import.php:56 msgid "Import failed" -msgstr "" +msgstr "Import selhal" #: ajax/import/import.php:69 msgid "events has been saved in your calendar" -msgstr "" +msgstr "záznamů bylo uloženo ve Vašem kalendáři" #: ajax/settings/guesstimezone.php:25 msgid "New Timezone:" @@ -161,7 +161,7 @@ msgstr "Pracovní" #: lib/app.php:351 lib/app.php:361 msgid "by" -msgstr "" +msgstr "od" #: lib/app.php:359 lib/app.php:399 msgid "unnamed" @@ -350,79 +350,79 @@ msgstr "Kal." #: templates/calendar.php:6 msgid "Sun." -msgstr "" +msgstr "Ne" #: templates/calendar.php:6 msgid "Mon." -msgstr "" +msgstr "Po" #: templates/calendar.php:6 msgid "Tue." -msgstr "" +msgstr "Út" #: templates/calendar.php:6 msgid "Wed." -msgstr "" +msgstr "St" #: templates/calendar.php:6 msgid "Thu." -msgstr "" +msgstr "Čt" #: templates/calendar.php:6 msgid "Fri." -msgstr "" +msgstr "Pá" #: templates/calendar.php:6 msgid "Sat." -msgstr "" +msgstr "So" #: templates/calendar.php:8 msgid "Jan." -msgstr "" +msgstr "Ne" #: templates/calendar.php:8 msgid "Feb." -msgstr "" +msgstr "únor" #: templates/calendar.php:8 msgid "Mar." -msgstr "" +msgstr "březen" #: templates/calendar.php:8 msgid "Apr." -msgstr "" +msgstr "duben" #: templates/calendar.php:8 msgid "May." -msgstr "" +msgstr "květen" #: templates/calendar.php:8 msgid "Jun." -msgstr "" +msgstr "červen" #: templates/calendar.php:8 msgid "Jul." -msgstr "" +msgstr "červenec" #: templates/calendar.php:8 msgid "Aug." -msgstr "" +msgstr "srpen" #: templates/calendar.php:8 msgid "Sep." -msgstr "" +msgstr "září" #: templates/calendar.php:8 msgid "Oct." -msgstr "" +msgstr "říjen" #: templates/calendar.php:8 msgid "Nov." -msgstr "" +msgstr "listopad" #: templates/calendar.php:8 msgid "Dec." -msgstr "" +msgstr "prosinec" #: templates/calendar.php:11 msgid "All day" @@ -479,7 +479,7 @@ msgstr "dnes" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Nastavení" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -687,7 +687,7 @@ msgstr "Importovat soubor kalendáře" #: templates/part.import.php:24 msgid "Please choose a calendar" -msgstr "" +msgstr "Vyberte prosím kalendář" #: templates/part.import.php:36 msgid "Name of new calendar" @@ -695,13 +695,13 @@ msgstr "Název nového kalendáře" #: templates/part.import.php:44 msgid "Take an available name!" -msgstr "" +msgstr "Použijte volné jméno!" #: templates/part.import.php:45 msgid "" "A Calendar with this name already exists. If you continue anyhow, these " "calendars will be merged." -msgstr "" +msgstr "Kalendář s trímto názvem již existuje. Pokud název použijete, stejnojmenné kalendáře budou sloučeny." #: templates/part.import.php:47 msgid "Import" @@ -733,7 +733,7 @@ msgstr "v" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Hlavní" #: templates/settings.php:15 msgid "Timezone" @@ -741,11 +741,11 @@ msgstr "Časové pásmo" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Obnovit auronaricky časovou zónu." #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "Formát času" #: templates/settings.php:57 msgid "24h" @@ -757,39 +757,39 @@ msgstr "12h" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "Týden začína v" #: templates/settings.php:76 msgid "Cache" -msgstr "" +msgstr "Paměť" #: templates/settings.php:80 msgid "Clear cache for repeating events" -msgstr "" +msgstr "Vymazat paměť pro opakuijísí se záznamy" #: templates/settings.php:85 msgid "URLs" -msgstr "" +msgstr "URLs" #: templates/settings.php:87 msgid "Calendar CalDAV syncing addresses" -msgstr "" +msgstr "Kalendář CalDAV synchronizuje adresy" #: templates/settings.php:87 msgid "more info" -msgstr "" +msgstr "podrobnosti" #: templates/settings.php:89 msgid "Primary address (Kontact et al)" -msgstr "" +msgstr "Primární adresa (veřejná)" #: templates/settings.php:91 msgid "iOS/OS X" -msgstr "" +msgstr "iOS/OS X" #: templates/settings.php:93 msgid "Read only iCalendar link(s)" -msgstr "" +msgstr "Odkaz(y) kalendáře pouze pro čtení" #: templates/share.dropdown.php:20 msgid "Users" diff --git a/l10n/cs_CZ/contacts.po b/l10n/cs_CZ/contacts.po index 04e3220195..9b1fa750be 100644 --- a/l10n/cs_CZ/contacts.po +++ b/l10n/cs_CZ/contacts.po @@ -3,16 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: -# Jan Krejci , 2011. +# Jan Krejci , 2011, 2012. # Martin , 2011, 2012. # Michal Hrušecký , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:58+0000\n" +"Last-Translator: Jan Krejci \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "Chyba při (de)aktivaci adresáře." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id neni nastaveno." @@ -68,7 +68,7 @@ msgstr "jméno elementu není nastaveno." #: ajax/contact/addproperty.php:46 msgid "Could not parse contact: " -msgstr "" +msgstr "Nelze analyzovat kontakty" #: ajax/contact/addproperty.php:56 msgid "Cannot add empty property." @@ -82,18 +82,18 @@ msgstr "Musí být uveden nejméně jeden z adresních údajů" msgid "Trying to add duplicate property: " msgstr "Pokoušíte se přidat duplicitní atribut: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Chybějící parametr IM" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Neznámý IM:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informace o vCard je nesprávná. Obnovte stránku, prosím." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Chyba při odstraňování údaje kontaktu." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Chybí ID" @@ -114,10 +114,6 @@ msgstr "Informace o vCard je nesprávná. Obnovte stránku, prosím." msgid "Something went FUBAR. " msgstr "Něco se pokazilo. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Chyba při aktualizaci údaje kontaktu." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "Nemohu načíst dočasný obrázek: " msgid "No file was uploaded. Unknown error" msgstr "Soubor nebyl odeslán. Neznámá chyba" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Kontakty" @@ -238,56 +234,73 @@ msgid "Couldn't get a valid address." msgstr "Nelze získat platnou adresu." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Chyba" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "Nemáte práva přidat kontakt do" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Prosím vyberte jeden z vašich adresářů" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Chyba přístupových práv" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Tento parametr nemuže zůstat nevyplněn." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Prvky nelze převést.." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' voláno bez argumentu. Prosím oznamte chybu na bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Upravit jméno" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Žádné soubory nebyly vybrány k nahrání." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Soubor, který se pokoušíte odeslat, přesahuje maximální povolenou velikost." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Chyba při otevírání obrázku profilu" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Vybrat typ" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "" +msgstr "Některé kontakty jsou označeny ke smazání. Počkete prosím na dokončení operace." + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Chcete spojit tyto adresáře?" #: js/loader.js:49 msgid "Result: " @@ -301,135 +314,166 @@ msgstr "importováno v pořádku," msgid " failed." msgstr "neimportováno." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Zobrazované jméno nemůže zůstat prázdné." #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "" +msgstr "Adresář nenalezen:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Toto není Váš adresář." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakt nebyl nalezen." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresa" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizace" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Pracovní" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Domácí" -#: lib/app.php:133 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 +msgid "Other" +msgstr "Ostatní" + +#: lib/app.php:201 msgid "Mobile" msgstr "Mobil" -#: lib/app.php:135 +#: lib/app.php:203 msgid "Text" msgstr "Text" -#: lib/app.php:136 +#: lib/app.php:204 msgid "Voice" msgstr "Hlas" -#: lib/app.php:137 +#: lib/app.php:205 msgid "Message" msgstr "Zpráva" -#: lib/app.php:138 +#: lib/app.php:206 msgid "Fax" msgstr "Fax" -#: lib/app.php:139 +#: lib/app.php:207 msgid "Video" msgstr "Video" -#: lib/app.php:140 +#: lib/app.php:208 msgid "Pager" msgstr "Pager" -#: lib/app.php:146 +#: lib/app.php:215 msgid "Internet" msgstr "Internet" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 msgid "Birthday" msgstr "Narozeniny" -#: lib/app.php:184 +#: lib/app.php:253 msgid "Business" -msgstr "" +msgstr "Pracovní" -#: lib/app.php:185 +#: lib/app.php:254 msgid "Call" -msgstr "" +msgstr "Volat" -#: lib/app.php:186 +#: lib/app.php:255 msgid "Clients" -msgstr "" +msgstr "Klienti" -#: lib/app.php:187 +#: lib/app.php:256 msgid "Deliverer" -msgstr "" +msgstr "Dodavatel" -#: lib/app.php:188 +#: lib/app.php:257 msgid "Holidays" -msgstr "" +msgstr "Prázdniny" -#: lib/app.php:189 +#: lib/app.php:258 msgid "Ideas" -msgstr "" +msgstr "Nápady" -#: lib/app.php:190 +#: lib/app.php:259 msgid "Journey" -msgstr "" +msgstr "Cestování" -#: lib/app.php:191 +#: lib/app.php:260 msgid "Jubilee" -msgstr "" +msgstr "Jubileum" -#: lib/app.php:192 +#: lib/app.php:261 msgid "Meeting" -msgstr "" +msgstr "Schůzka" -#: lib/app.php:193 -msgid "Other" -msgstr "" - -#: lib/app.php:194 +#: lib/app.php:263 msgid "Personal" -msgstr "" +msgstr "Osobní" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" -msgstr "" +msgstr "Projekty" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" -msgstr "" +msgstr "Dotazy" #: lib/hooks.php:102 msgid "{name}'s Birthday" @@ -439,6 +483,14 @@ msgstr "Narozeniny {name}" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "Nemáte práva editovat tento kontakt" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "Nemáte práva smazat tento kontakt" + #: templates/index.php:14 msgid "Add Contact" msgstr "Přidat kontakt" @@ -449,7 +501,7 @@ msgstr "Import" #: templates/index.php:18 msgid "Settings" -msgstr "" +msgstr "Nastavení" #: templates/index.php:18 templates/settings.php:9 msgid "Addressbooks" @@ -461,51 +513,51 @@ msgstr "Zavřít" #: templates/index.php:37 msgid "Keyboard shortcuts" -msgstr "" +msgstr "Klávesoví zkratky" #: templates/index.php:39 msgid "Navigation" -msgstr "" +msgstr "Navigace" #: templates/index.php:42 msgid "Next contact in list" -msgstr "" +msgstr "Následující kontakt v seznamu" #: templates/index.php:44 msgid "Previous contact in list" -msgstr "" +msgstr "Předchozí kontakt v seznamu" #: templates/index.php:46 msgid "Expand/collapse current addressbook" -msgstr "" +msgstr "Rozbalit/sbalit aktuální Adresář" #: templates/index.php:48 msgid "Next addressbook" -msgstr "" +msgstr "Následující Adresář" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "" +msgstr "Předchozí Adresář" #: templates/index.php:54 msgid "Actions" -msgstr "" +msgstr "Akce" #: templates/index.php:57 msgid "Refresh contacts list" -msgstr "" +msgstr "Občerstvit seznam kontaktů" #: templates/index.php:59 msgid "Add new contact" -msgstr "" +msgstr "Přidat kontakt" #: templates/index.php:61 msgid "Add new addressbook" -msgstr "" +msgstr "Předat nový Adresář" #: templates/index.php:63 msgid "Delete current contact" -msgstr "" +msgstr "Odstranit aktuální kontakt" #: templates/part.contact.php:17 msgid "Drop photo to upload" @@ -535,13 +587,18 @@ msgstr "Formát vlastní, křestní, celé jméno, obráceně nebo obráceně od msgid "Edit name details" msgstr "Upravit podrobnosti jména" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizace" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Odstranit" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Přezdívka" @@ -549,23 +606,23 @@ msgstr "Přezdívka" msgid "Enter nickname" msgstr "Zadejte přezdívku" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" -msgstr "" +msgstr "Web" #: templates/part.contact.php:44 msgid "http://www.somesite.com" -msgstr "" +msgstr "http://www.somesite.com" #: templates/part.contact.php:44 msgid "Go to web site" -msgstr "" +msgstr "Přejít na web" #: templates/part.contact.php:46 msgid "dd-mm-yyyy" msgstr "dd. mm. yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Skupiny" @@ -577,63 +634,84 @@ msgstr "Oddělte skupiny čárkami" msgid "Edit groups" msgstr "Upravit skupiny" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferovaný" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Prosím zadejte platnou e-mailovou adresu" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Zadat e-mailovou adresu" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Odeslat na adresu" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Smazat e-mail" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Zadat telefoní číslo" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Smazat telefoní číslo" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Smazat IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Zobrazit na mapě" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Upravit podrobnosti adresy" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Zde můžete připsat poznámky." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Přidat políčko" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Instant Messaging" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresa" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Poznámka" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Stáhnout kontakt" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Odstranit kontakt" @@ -656,11 +734,11 @@ msgstr "PO box" #: templates/part.edit_address_dialog.php:24 msgid "Street address" -msgstr "" +msgstr "Ulice" #: templates/part.edit_address_dialog.php:27 msgid "Street and number" -msgstr "" +msgstr "Ulice a číslo" #: templates/part.edit_address_dialog.php:30 msgid "Extended" @@ -668,7 +746,7 @@ msgstr "Rozšířené" #: templates/part.edit_address_dialog.php:33 msgid "Apartment number etc." -msgstr "" +msgstr "Byt číslo atd." #: templates/part.edit_address_dialog.php:36 #: templates/part.edit_address_dialog.php:39 @@ -681,7 +759,7 @@ msgstr "Kraj" #: templates/part.edit_address_dialog.php:45 msgid "E.g. state or province" -msgstr "" +msgstr "Např. stát nebo okres" #: templates/part.edit_address_dialog.php:48 msgid "Zipcode" @@ -689,7 +767,7 @@ msgstr "PSČ" #: templates/part.edit_address_dialog.php:51 msgid "Postal code" -msgstr "" +msgstr "PSČ" #: templates/part.edit_address_dialog.php:54 #: templates/part.edit_address_dialog.php:57 @@ -804,21 +882,17 @@ msgstr "Nemáte žádné kontakty v adresáři." msgid "Add contact" msgstr "Přidat kontakt" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Nastavit adresář" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" -msgstr "" +msgstr "Vybrat Adresář" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" -msgstr "" +msgstr "Vložte jméno" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" -msgstr "" +msgstr "Vložte popis" #: templates/settings.php:3 msgid "CardDAV syncing addresses" @@ -838,40 +912,44 @@ msgstr "iOS/OS X" #: templates/settings.php:20 msgid "Show CardDav link" -msgstr "" +msgstr "Zobrazit odklaz CardDAV:" #: templates/settings.php:23 msgid "Show read-only VCF link" -msgstr "" +msgstr "Zobrazit odkaz VCF pouze pro čtení" #: templates/settings.php:26 +msgid "Share" +msgstr "Sdílet" + +#: templates/settings.php:29 msgid "Download" msgstr "Stažení" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editovat" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nový adresář" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" -msgstr "" +msgstr "Název" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" -msgstr "" +msgstr "Popis" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Uložit" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Storno" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." -msgstr "" +msgstr "Více..." diff --git a/l10n/cs_CZ/files.po b/l10n/cs_CZ/files.po index b168a2b7e1..77f16b10d6 100644 --- a/l10n/cs_CZ/files.po +++ b/l10n/cs_CZ/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,87 +53,83 @@ msgstr "Zápis na disk se nezdařil" msgid "Files" msgstr "Soubory" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Vymazat" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "již existuje" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "zaměnit" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "storno" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "zaměněno" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "s" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "zpět" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "smazáno" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "generuji ZIP soubor, může to chvíli trvat" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nemohu nahrát váš soubor neboť to je adresář a nebo má nulovou délku." -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Chyba při nahrávání" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Očekává se" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Nahrávání zrušeno" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Špatné jméno, znak '/' není povolen" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Velikost" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Změněno" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "adresář" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "adresáře" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "soubor" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "soubory" diff --git a/l10n/cs_CZ/files_encryption.po b/l10n/cs_CZ/files_encryption.po index 31ccf1b3f9..4055cc18fc 100644 --- a/l10n/cs_CZ/files_encryption.po +++ b/l10n/cs_CZ/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 10:33+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Kryptování" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Při kryptování vynechat následující typy souborů" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Žádný" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Povolit kryptování" diff --git a/l10n/cs_CZ/files_external.po b/l10n/cs_CZ/files_external.po index 1e85c96d4a..1c175fb4db 100644 --- a/l10n/cs_CZ/files_external.po +++ b/l10n/cs_CZ/files_external.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jan Krejci , 2012. +# Michal Hrušecký , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 23:53+0000\n" +"Last-Translator: Jan Krejci \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,11 +21,11 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Externí úložiště" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "Přípojný bod" #: templates/settings.php:8 msgid "Backend" @@ -31,11 +33,11 @@ msgstr "" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Konfigurace" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Nastavení" #: templates/settings.php:11 msgid "Applicable" @@ -43,7 +45,7 @@ msgstr "" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Přidat přípojný bod" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" @@ -51,19 +53,19 @@ msgstr "" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Všichni uživatelé" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Skupiny" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Uživatelé" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Smazat" #: templates/settings.php:88 msgid "SSL root certificates" @@ -75,8 +77,8 @@ msgstr "" #: templates/settings.php:108 msgid "Enable User External Storage" -msgstr "" +msgstr "Zapnout uživatelské externí úložiště" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "Povolit uživatelů připojit jejich vlastní externí úložiště" diff --git a/l10n/cs_CZ/files_sharing.po b/l10n/cs_CZ/files_sharing.po index 67d9a7179e..232114a8e6 100644 --- a/l10n/cs_CZ/files_sharing.po +++ b/l10n/cs_CZ/files_sharing.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. +# Michal Hrušecký , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 19:58+0000\n" +"Last-Translator: Michal Hrušecký \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +19,18 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Velikost" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Upraveno" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Smazat vše" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Smazat" diff --git a/l10n/cs_CZ/files_versions.po b/l10n/cs_CZ/files_versions.po index 15207fae02..cac58a2122 100644 --- a/l10n/cs_CZ/files_versions.po +++ b/l10n/cs_CZ/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 10:32+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Vypršení všech verzí" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Povolit verzování souborů" diff --git a/l10n/cs_CZ/gallery.po b/l10n/cs_CZ/gallery.po index 08c9c2054b..f24db5838a 100644 --- a/l10n/cs_CZ/gallery.po +++ b/l10n/cs_CZ/gallery.po @@ -10,88 +10,32 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Czech (Czech Republic) (http://www.transifex.net/projects/p/owncloud/language/cs_CZ/)\n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 09:30+0000\n" +"Last-Translator: Martin \n" +"Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: appinfo/app.php:37 +#: appinfo/app.php:39 msgid "Pictures" msgstr "Obrázky" -#: js/album_cover.js:44 +#: js/pictures.js:12 msgid "Share gallery" -msgstr "" +msgstr "Sdílet galerii" -#: js/album_cover.js:64 js/album_cover.js:100 js/album_cover.js:133 +#: js/pictures.js:32 msgid "Error: " -msgstr "" +msgstr "Chyba: " -#: js/album_cover.js:64 js/album_cover.js:100 +#: js/pictures.js:32 msgid "Internal error" -msgstr "" +msgstr "Vnitřní chyba" -#: js/album_cover.js:114 -msgid "Scanning root" -msgstr "" - -#: js/album_cover.js:115 -msgid "Default order" -msgstr "" - -#: js/album_cover.js:116 -msgid "Ascending" -msgstr "" - -#: js/album_cover.js:116 -msgid "Descending" -msgstr "" - -#: js/album_cover.js:117 templates/index.php:19 -msgid "Settings" -msgstr "Nastavení" - -#: js/album_cover.js:122 -msgid "Scanning root cannot be empty" -msgstr "" - -#: js/album_cover.js:122 js/album_cover.js:133 -msgid "Error" -msgstr "" - -#: templates/index.php:16 -msgid "Rescan" -msgstr "Znovu prohledat" - -#: templates/index.php:17 -msgid "Stop" -msgstr "Zastavit" - -#: templates/index.php:18 -msgid "Share" -msgstr "Sdílet" - -#: templates/view_album.php:19 -msgid "Back" -msgstr "Zpět" - -#: templates/view_album.php:36 -msgid "Remove confirmation" -msgstr "Potvrzení odebrání" - -#: templates/view_album.php:37 -msgid "Do you want to remove album" -msgstr "Chcete odstranit album?" - -#: templates/view_album.php:40 -msgid "Change album name" -msgstr "Změnit název alba" - -#: templates/view_album.php:43 -msgid "New album name" -msgstr "Název nového alba" +#: templates/index.php:27 +msgid "Slideshow" +msgstr "Přehrávání" diff --git a/l10n/cs_CZ/lib.po b/l10n/cs_CZ/lib.po index 2d67565ff5..f6c62f8803 100644 --- a/l10n/cs_CZ/lib.po +++ b/l10n/cs_CZ/lib.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:23+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 09:24+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,96 +18,96 @@ msgstr "" "Language: cs_CZ\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: app.php:287 +#: app.php:288 msgid "Help" -msgstr "" +msgstr "Nápověda" -#: app.php:294 +#: app.php:295 msgid "Personal" -msgstr "" +msgstr "Osobní" -#: app.php:299 +#: app.php:300 msgid "Settings" -msgstr "" +msgstr "Nastavení" -#: app.php:304 +#: app.php:305 msgid "Users" -msgstr "" +msgstr "Uživatelé" -#: app.php:311 +#: app.php:312 msgid "Apps" -msgstr "" +msgstr "Aplikace" -#: app.php:313 +#: app.php:314 msgid "Admin" -msgstr "" +msgstr "Admin" #: files.php:245 msgid "ZIP download is turned off." -msgstr "" +msgstr "Stahování ZIPu je vypnuto." #: files.php:246 msgid "Files need to be downloaded one by one." -msgstr "" +msgstr "Soubory je nutno stahovat samostatně." #: files.php:246 files.php:271 msgid "Back to Files" -msgstr "" +msgstr "Zpět k souborům" #: files.php:270 msgid "Selected files too large to generate zip file." -msgstr "" +msgstr "Vybarné soubory jsou pro vytvoření zipu příliš velké." #: json.php:28 msgid "Application is not enabled" -msgstr "" +msgstr "Aplikace není povolena" #: json.php:39 json.php:63 json.php:75 msgid "Authentication error" -msgstr "" +msgstr "Chyba autorizace" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "" +msgstr "Realce expirovala. Obnovte prosím stranu." #: template.php:86 msgid "seconds ago" -msgstr "" +msgstr "před vteřinami" #: template.php:87 msgid "1 minute ago" -msgstr "" +msgstr "před 1 minutou" #: template.php:88 #, php-format msgid "%d minutes ago" -msgstr "" +msgstr "před %d minutami" #: template.php:91 msgid "today" -msgstr "" +msgstr "dnes" #: template.php:92 msgid "yesterday" -msgstr "" +msgstr "včera" #: template.php:93 #, php-format msgid "%d days ago" -msgstr "" +msgstr "před %d dny" #: template.php:94 msgid "last month" -msgstr "" +msgstr "minulý měsíc" #: template.php:95 msgid "months ago" -msgstr "" +msgstr "před měsíci" #: template.php:96 msgid "last year" -msgstr "" +msgstr "loni" #: template.php:97 msgid "years ago" -msgstr "" +msgstr "před lety" diff --git a/l10n/cs_CZ/settings.po b/l10n/cs_CZ/settings.po index 90e81ef9c8..64ed6cf955 100644 --- a/l10n/cs_CZ/settings.po +++ b/l10n/cs_CZ/settings.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Nepodařílo se stáhnout seznam z App Store" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -44,7 +44,7 @@ msgstr "Chybný dotaz" #: ajax/removeuser.php:13 ajax/setquota.php:18 ajax/togglegroups.php:18 msgid "Authentication error" -msgstr "" +msgstr "Chyba autorizace" #: ajax/setlanguage.php:18 msgid "Language changed" @@ -52,7 +52,7 @@ msgstr "Jazyk byl změněn" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Chyba" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -72,23 +72,23 @@ msgstr "Česky" #: templates/admin.php:14 msgid "Security Warning" -msgstr "" +msgstr "Bezpečnostní upozornění" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "spustit jednu úlohu s každou nataženou stranou" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php je registrován jako služba webcron" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "použijte systémovou službu cron" #: templates/admin.php:39 msgid "Log" @@ -231,7 +231,7 @@ msgid "Other" msgstr "Jiné" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/cs_CZ/tasks.po b/l10n/cs_CZ/tasks.po index 1d439040c6..2660581916 100644 --- a/l10n/cs_CZ/tasks.po +++ b/l10n/cs_CZ/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Michal Hrušecký , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 19:57+0000\n" +"Last-Translator: Michal Hrušecký \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,15 +20,15 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Neplatné datum/čas" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Úkoly" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Bez kategorie" #: lib/app.php:33 msgid "Unspecified" @@ -35,15 +36,15 @@ msgstr "" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=nejvyšší" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=střední" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=nejnižší" #: lib/app.php:81 msgid "Empty Summary" @@ -55,11 +56,11 @@ msgstr "" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Neplatná priorita" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Přidat úkol" #: templates/tasks.php:4 msgid "Order Due" @@ -87,20 +88,20 @@ msgstr "" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Načítám úkoly..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Důležité" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Více" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Méně" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Smazat" diff --git a/l10n/cs_CZ/user_ldap.po b/l10n/cs_CZ/user_ldap.po index 88b8270c80..25f623c83b 100644 --- a/l10n/cs_CZ/user_ldap.po +++ b/l10n/cs_CZ/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-17 16:01+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,146 +20,146 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "Hostitel" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "Nelze vynechat protokol vyžadující SSL. Začněte s ldaps://" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Base DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "V Rozšířeném nastavení můžete specifikovat pro své uživatele a skupiny element Base DN" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "DN uživatele" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "DN klentského uživatele ke kterému tvoříte vazbu, např. uid=agent,dc=example,dc=com. Pro anonymní přístup ponechte údaje DN and Heslo prázdné." #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Heslo" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "Pro anonymní přístup ponechte údaje DN and Heslo prázdné." #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "Filtr uživatelských loginů" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "Definuje filtr, který je aplikován v průběhu logování. %%uid nahrazuje uživatelské jméno během logování." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "použijte %%uid pro rezervované místo, např. \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "Filtr uživateslkých seznamů" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "Defunije filtr, který je plaikován při návratu uživatelů." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "bez rezervace místa, např. \"objectClass=person\"." #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "Filtr skupiny" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "Definuje filtr, který je aplikován při návratu skupin" #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "bez rezervace místa, např. \"objectClass=posixGroup\"." #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Port" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "Základní uživatelský strom" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "Základní skupinový strom" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "" +msgstr "Asociace člena skupiny" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Použijte TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "Nepoužívejte pro SSL připojení, připojení selže." #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "LDAP server nerozlišující velikost znaků (Windows)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "Vypněte ověřování SSL certifikátu" #: templates/settings.php:23 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "" +msgstr "pokud pracuje připojení pouze pokud je teto volba aktivní, importujte SSL certifikát LDAP serveru do Vašeho serveru ownCloud." #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Není doporučeno, pouze pro účely testování." #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "" +msgstr "Pole pro zobrazované jméno uživatele" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." -msgstr "" +msgstr "Atribut LDAP použitý k vytvoření jména uživatele ownCloud" #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "" +msgstr "Pole pro zobrazení jména skupiny" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." -msgstr "" +msgstr "Atribut LDAP použitý k vytvoření jména skupiny ownCloud" #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "v bytech" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "ve vteřinách. Změna vyprázdní dočasnou paměť." #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Nápověda" diff --git a/l10n/cs_CZ/user_migrate.po b/l10n/cs_CZ/user_migrate.po index f3602dccae..74cee0cec4 100644 --- a/l10n/cs_CZ/user_migrate.po +++ b/l10n/cs_CZ/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 09:51+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,33 +20,33 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Export" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "" +msgstr "Během vytváření souboru exportu došlo k chybě" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "Nastala chyba" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "Export Vašeho uživatelského účtu" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "Bude vytvořen komprimovaný soubor, obsahující Váš ownCloud účet." #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "Import uživatelského účtu" #: templates/settings.php:15 msgid "ownCloud User Zip" -msgstr "" +msgstr "Zip soubor uživatele ownCloud" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Import" diff --git a/l10n/cs_CZ/user_openid.po b/l10n/cs_CZ/user_openid.po index 14f4ed1354..f2fe13f334 100644 --- a/l10n/cs_CZ/user_openid.po +++ b/l10n/cs_CZ/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Martin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 09:48+0000\n" +"Last-Translator: Martin \n" "Language-Team: Czech (Czech Republic) (http://www.transifex.com/projects/p/owncloud/language/cs_CZ/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,36 +20,36 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "" +msgstr "Toto je OpenID server endpoint. Více informací na" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Identita: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Oblast: " #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Uživatel: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Login" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "Chyba: Uživatel není zvolen" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" -msgstr "" +msgstr "s touto adresou se můžete autrorizovat na další strany" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "" +msgstr "Autorizovaný OpenID poskytovatel" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "" +msgstr "Vaše adresa na Wordpressu, Identi.ca, …" diff --git a/l10n/da/admin_migrate.po b/l10n/da/admin_migrate.po index e597d849d4..33fa6f7920 100644 --- a/l10n/da/admin_migrate.po +++ b/l10n/da/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 14:56+0000\n" +"Last-Translator: ressel \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Eksporter ownCloud instans" #: templates/settings.php:4 msgid "" @@ -29,4 +30,4 @@ msgstr "" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Eksporter" diff --git a/l10n/da/calendar.po b/l10n/da/calendar.po index b336da6b45..5933d87709 100644 --- a/l10n/da/calendar.po +++ b/l10n/da/calendar.po @@ -6,15 +6,16 @@ # , 2011. # Morten Juhl-Johansen Zölde-Fejér , 2011, 2012. # Pascal d'Hermilly , 2011. +# , 2012. # Thomas Tanghus <>, 2012. # Thomas Tanghus , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 14:34+0000\n" +"Last-Translator: ressel \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +25,7 @@ msgstr "" #: ajax/cache/status.php:19 msgid "Not all calendars are completely cached" -msgstr "" +msgstr "Ikke alle kalendere er fuldstændig cached" #: ajax/cache/status.php:21 msgid "Everything seems to be completely cached" @@ -46,19 +47,19 @@ msgstr "Forkert kalender" msgid "" "The file contained either no events or all events are already saved in your " "calendar." -msgstr "" +msgstr "Filen indeholdt enten ingen begivenheder eller alle begivenheder er allerede gemt i din kalender." #: ajax/import/dropimport.php:31 ajax/import/import.php:67 msgid "events has been saved in the new calendar" -msgstr "" +msgstr "begivenheder er gemt i den nye kalender" #: ajax/import/import.php:56 msgid "Import failed" -msgstr "" +msgstr "import mislykkedes" #: ajax/import/import.php:69 msgid "events has been saved in your calendar" -msgstr "" +msgstr "begivenheder er gemt i din kalender" #: ajax/settings/guesstimezone.php:25 msgid "New Timezone:" @@ -72,7 +73,7 @@ msgstr "Tidszone ændret" msgid "Invalid request" msgstr "Ugyldig forespørgsel" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:37 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "Kalender" @@ -481,7 +482,7 @@ msgstr "I dag" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Indstillinger" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -703,7 +704,7 @@ msgstr "" msgid "" "A Calendar with this name already exists. If you continue anyhow, these " "calendars will be merged." -msgstr "" +msgstr "En kalender med dette navn findes allerede. Hvis du fortsætter alligevel, vil disse kalendere blive sammenlagt." #: templates/part.import.php:47 msgid "Import" @@ -735,7 +736,7 @@ msgstr "kl." #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Generel" #: templates/settings.php:15 msgid "Timezone" @@ -743,7 +744,7 @@ msgstr "Tidszone" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Opdater tidszone automatisk" #: templates/settings.php:52 msgid "Time format" diff --git a/l10n/da/contacts.po b/l10n/da/contacts.po index 7180b10c28..8a658ef136 100644 --- a/l10n/da/contacts.po +++ b/l10n/da/contacts.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +27,7 @@ msgid "Error (de)activating addressbook." msgstr "Fejl ved (de)aktivering af adressebogen" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "Intet ID medsendt." @@ -84,18 +84,18 @@ msgstr "Der skal udfyldes mindst et adressefelt." msgid "Trying to add duplicate property: " msgstr "Kan ikke tilføje overlappende element." -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informationen om vCard er forkert. Genindlæs siden." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Fejl ved sletning af egenskab for kontaktperson." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Manglende ID" @@ -116,10 +116,6 @@ msgstr "Informationen om dette VCard stemmer ikke. Genindlæs venligst siden: " msgid "Something went FUBAR. " msgstr "Noget gik grueligt galt. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Fejl ved opdatering af egenskab for kontaktperson." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -223,7 +219,7 @@ msgstr "Kunne ikke indlæse midlertidigt billede" msgid "No file was uploaded. Unknown error" msgstr "Ingen fil blev uploadet. Ukendt fejl." -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontaktpersoner" @@ -240,57 +236,74 @@ msgid "Couldn't get a valid address." msgstr "Kunne ikke finde en gyldig adresse." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Fejl" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Dette felt må ikke være tomt." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Kunne ikke serialisere elementerne." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' kaldet uden typeargument. Indrapporter fejl på bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Rediger navn" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Der er ikke valgt nogen filer at uploade." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Dr." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Vælg type" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Resultat:" @@ -303,7 +316,7 @@ msgstr " importeret " msgid " failed." msgstr " fejl." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -311,125 +324,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Dette er ikke din adressebog." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontaktperson kunne ikke findes." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresse" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisation" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Arbejde" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Hjemme" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "SMS" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Telefonsvarer" - -#: lib/app.php:137 -msgid "Message" -msgstr "Besked" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Personsøger" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Fødselsdag" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "SMS" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Telefonsvarer" + +#: lib/app.php:205 +msgid "Message" +msgstr "Besked" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Personsøger" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Fødselsdag" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -441,6 +485,14 @@ msgstr "{name}s fødselsdag" msgid "Contact" msgstr "Kontaktperson" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Tilføj kontaktperson" @@ -537,13 +589,18 @@ msgstr "Formatter som valgfrit, fuldt navn, efternavn først eller efternavn fø msgid "Edit name details" msgstr "Rediger navnedetaljer." +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisation" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Slet" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Kaldenavn" @@ -551,7 +608,7 @@ msgstr "Kaldenavn" msgid "Enter nickname" msgstr "Indtast kaldenavn" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -567,7 +624,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-åååå" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupper" @@ -579,63 +636,84 @@ msgstr "Opdel gruppenavne med kommaer" msgid "Edit groups" msgstr "Rediger grupper" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Foretrukken" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Indtast venligst en gyldig email-adresse." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Indtast email-adresse" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Send mail til adresse" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Slet email-adresse" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Indtast telefonnummer" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Slet telefonnummer" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Vis på kort" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Rediger adresse detaljer" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Tilføj noter her." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Tilføj element" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresse" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Note" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Download kontaktperson" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Slet kontaktperson" @@ -806,19 +884,15 @@ msgstr "Du har ingen kontaktpersoner i din adressebog." msgid "Add contact" msgstr "Tilføj kontaktpeson." -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Konfigurer adressebøger" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -847,33 +921,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Download" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Rediger" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Ny adressebog" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Gem" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Fortryd" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/da/files.po b/l10n/da/files.po index aef6a95763..3524d6c05a 100644 --- a/l10n/da/files.po +++ b/l10n/da/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,87 +55,83 @@ msgstr "Fejl ved skrivning til disk." msgid "Files" msgstr "Filer" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Slet" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "findes allerede" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "erstat" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "fortryd" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "erstattet" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "med" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "fortryd" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "Slettet" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "genererer ZIP-fil, det kan tage lidt tid." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Kunne ikke uploade din fil, da det enten er en mappe eller er tom" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Fejl ved upload" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Afventer" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Upload afbrudt." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Ugyldigt navn, '/' er ikke tilladt." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Størrelse" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Ændret" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "mappe" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "mapper" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fil" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "filer" diff --git a/l10n/da/files_sharing.po b/l10n/da/files_sharing.po index c312be9fba..7ed986fd02 100644 --- a/l10n/da/files_sharing.po +++ b/l10n/da/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: da\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/da/settings.po b/l10n/da/settings.po index f647b2f179..5254803303 100644 --- a/l10n/da/settings.po +++ b/l10n/da/settings.po @@ -7,15 +7,16 @@ # , 2011. # Morten Juhl-Johansen Zölde-Fejér , 2011, 2012. # Pascal d'Hermilly , 2011. +# , 2012. # Thomas Tanghus <>, 2012. # Thomas Tanghus , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 14:35+0000\n" +"Last-Translator: ressel \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -77,7 +78,7 @@ msgstr "Sikkerhedsadvarsel" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" @@ -85,7 +86,7 @@ msgstr "" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php er tilmeldt en webcron tjeneste" #: templates/admin.php:35 msgid "use systems cron service" @@ -232,8 +233,8 @@ msgid "Other" msgstr "Andet" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/da/tasks.po b/l10n/da/tasks.po index f2ddaaa160..5c9900db1e 100644 --- a/l10n/da/tasks.po +++ b/l10n/da/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 14:43+0000\n" +"Last-Translator: ressel \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,35 +20,35 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Ugyldig dato/tid" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Opgaver" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Ingen kategori" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Uspecificeret" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=højeste" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=mellem" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=laveste" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Tom beskrivelse" #: lib/app.php:93 msgid "Invalid percent complete" @@ -59,7 +60,7 @@ msgstr "" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Tilføj opgave" #: templates/tasks.php:4 msgid "Order Due" @@ -87,20 +88,20 @@ msgstr "" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Indlæser opgaver..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "vigtigt" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Mere" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Mindre" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Slet" diff --git a/l10n/da/user_ldap.po b/l10n/da/user_ldap.po index 186aad26c3..5103ecf98c 100644 --- a/l10n/da/user_ldap.po +++ b/l10n/da/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 14:58+0000\n" +"Last-Translator: ressel \n" "Language-Team: Danish (http://www.transifex.com/projects/p/owncloud/language/da/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "Host" #: templates/settings.php:8 msgid "" @@ -28,7 +29,7 @@ msgstr "" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Base DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" @@ -47,7 +48,7 @@ msgstr "" #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Kodeord" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." @@ -95,7 +96,7 @@ msgstr "" #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Port" #: templates/settings.php:18 msgid "Base User Tree" @@ -111,7 +112,7 @@ msgstr "" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Brug TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." @@ -133,7 +134,7 @@ msgstr "" #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Anbefales ikke, brug kun for at teste." #: templates/settings.php:24 msgid "User Display Name Field" @@ -161,4 +162,4 @@ msgstr "" #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Hjælp" diff --git a/l10n/de/admin_dependencies_chk.po b/l10n/de/admin_dependencies_chk.po index cbd173e470..f36baa4f39 100644 --- a/l10n/de/admin_dependencies_chk.po +++ b/l10n/de/admin_dependencies_chk.po @@ -6,13 +6,14 @@ # Maurice Preuß <>, 2012. # , 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 20:46+0000\n" -"Last-Translator: Maurice Preuß <>\n" +"POT-Creation-Date: 2012-08-24 02:01+0200\n" +"PO-Revision-Date: 2012-08-23 10:05+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +25,7 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "Das Modul php-json wird von vielen Anwendungen zur internen Kommunikation benötigt." +msgstr "Das Modul php-json wird von vielen Anwendungen zur internen Kommunikation benötigt." #: settings.php:39 msgid "" @@ -34,11 +35,11 @@ msgstr "Das Modul php-curl wird benötigt, um den Titel der Seite für die Lesez #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "Das Modul php-gd wird für die Erzeugung der Vorschaubilder benötigt." +msgstr "Das Modul php-gd wird für die Erzeugung der Vorschaubilder benötigt." #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "Das Modul php-ldap wird für die Verbindung mit dem LDAP-Server benötigt." +msgstr "Das Modul php-ldap wird für die Verbindung mit dem LDAP-Server benötigt." #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" @@ -47,7 +48,7 @@ msgstr "Das Modul php-zip wird für den gleichzeitigen Download mehrerer Dateien #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "Das Modul php_mb_multibyte wird benötigt, um das Encoding richtig zu handhaben." +msgstr "Das Modul php_mb_multibyte wird benötigt, um das Encoding richtig zu handhaben." #: settings.php:69 msgid "The php-ctype module is needed validate data." diff --git a/l10n/de/bookmarks.po b/l10n/de/bookmarks.po index 449e392591..8383c62a13 100644 --- a/l10n/de/bookmarks.po +++ b/l10n/de/bookmarks.po @@ -5,13 +5,14 @@ # Translators: # Phi Lieb <>, 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-29 02:03+0200\n" -"PO-Revision-Date: 2012-07-28 20:46+0000\n" -"Last-Translator: Phi Lieb <>\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:38+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,7 +32,7 @@ msgstr "unbenannt" msgid "" "Drag this to your browser bookmarks and click it, when you want to bookmark " "a webpage quickly:" -msgstr "Ziehe dies zu deinen Browser-Lesezeichen und klicke es, wenn du eine Website schnell den Lesezeichen hinzufügen willst." +msgstr "Ziehen Sie dies zu Ihren Browser-Lesezeichen und klicken Sie darauf, wenn Sie eine Website schnell den Lesezeichen hinzufügen wollen." #: templates/bookmarklet.php:7 msgid "Read later" @@ -43,7 +44,7 @@ msgstr "Adresse" #: templates/list.php:14 msgid "Title" -msgstr "Title" +msgstr "Titel" #: templates/list.php:15 msgid "Tags" @@ -55,7 +56,7 @@ msgstr "Lesezeichen speichern" #: templates/list.php:22 msgid "You have no bookmarks" -msgstr "Du hast keine Lesezeichen" +msgstr "Sie haben keine Lesezeichen" #: templates/settings.php:11 msgid "Bookmarklet
    " diff --git a/l10n/de/calendar.po b/l10n/de/calendar.po index 449a503419..5ef155057e 100644 --- a/l10n/de/calendar.po +++ b/l10n/de/calendar.po @@ -13,13 +13,14 @@ # , 2012. # Phi Lieb <>, 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 11:28+0000\n" -"Last-Translator: JamFX \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:20+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -37,11 +38,11 @@ msgstr "Es sieht so aus, als wäre alles vollständig zwischengespeichert." #: ajax/categories/rescan.php:29 msgid "No calendars found." -msgstr "Keine Kalender gefunden" +msgstr "Keine Kalender gefunden." #: ajax/categories/rescan.php:37 msgid "No events found." -msgstr "Keine Termine gefunden" +msgstr "Keine Termine gefunden." #: ajax/event/edit.form.php:20 msgid "Wrong calendar" @@ -51,7 +52,7 @@ msgstr "Falscher Kalender" msgid "" "The file contained either no events or all events are already saved in your " "calendar." -msgstr "Entweder enthielt die Datei keine Termine oder alle Termine waren schon im Kalender gespeichert." +msgstr "Entweder enthielt die Datei keine Termine oder alle Termine waren bereits im Kalender gespeichert." #: ajax/import/dropimport.php:31 ajax/import/import.php:67 msgid "events has been saved in the new calendar" @@ -77,7 +78,7 @@ msgstr "Zeitzone geändert" msgid "Invalid request" msgstr "Fehlerhafte Anfrage" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:37 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "Kalender" @@ -499,7 +500,7 @@ msgstr "CalDAV-Link" #: templates/part.choosecalendar.php:31 msgid "Shared calendars" -msgstr "geteilte Kalender" +msgstr "Geteilte Kalender" #: templates/part.choosecalendar.php:48 msgid "No shared calendars" @@ -690,7 +691,7 @@ msgstr "Neuen Kalender anlegen" #: templates/part.import.php:17 msgid "Import a calendar file" -msgstr "Kalenderdatei Importieren" +msgstr "Kalenderdatei importieren" #: templates/part.import.php:24 msgid "Please choose a calendar" @@ -708,7 +709,7 @@ msgstr "Wählen Sie einen verfügbaren Namen." msgid "" "A Calendar with this name already exists. If you continue anyhow, these " "calendars will be merged." -msgstr "Ein Kalender mit diesem Namen existiert schon. Sollten Sie fortfahren, werden die beiden Kalender zusammengeführt." +msgstr "Ein Kalender mit diesem Namen existiert bereits. Sollten Sie fortfahren, werden die beiden Kalender zusammengeführt." #: templates/part.import.php:47 msgid "Import" @@ -756,11 +757,11 @@ msgstr "Zeitformat" #: templates/settings.php:57 msgid "24h" -msgstr "24h" +msgstr "24 Stunden" #: templates/settings.php:58 msgid "12h" -msgstr "12h" +msgstr "12 Stunden" #: templates/settings.php:64 msgid "Start week on" diff --git a/l10n/de/contacts.po b/l10n/de/contacts.po index 2550ffd903..74a5bee2a8 100644 --- a/l10n/de/contacts.po +++ b/l10n/de/contacts.po @@ -20,13 +20,14 @@ # Susi <>, 2012. # , 2012. # Thomas Müller <>, 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-13 20:22+0000\n" -"Last-Translator: driz \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 08:07+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -39,7 +40,7 @@ msgid "Error (de)activating addressbook." msgstr "(De-)Aktivierung des Adressbuches fehlgeschlagen" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID ist nicht angegeben." @@ -94,19 +95,19 @@ msgstr "Mindestens eines der Adressfelder muss ausgefüllt werden." #: ajax/contact/addproperty.php:76 msgid "Trying to add duplicate property: " -msgstr "Versuche, doppelte Eigenschaft hinzuzufügen: " +msgstr "Versuche doppelte Eigenschaft hinzuzufügen: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Fehler beim Hinzufügen der Kontakteigenschaft:" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "IM-Parameter fehlt." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "IM unbekannt:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." -msgstr "Die Information der vCard ist fehlerhaft. Bitte aktualisiere die Seite." - -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Kontakteigenschaft löschen fehlgeschlagen." +msgstr "Die Information der vCard ist fehlerhaft. Bitte aktualisieren Sie die Seite." #: ajax/contact/details.php:31 msgid "Missing ID" @@ -128,10 +129,6 @@ msgstr "Die Informationen zur vCard sind fehlerhaft. Bitte Seite neu laden: " msgid "Something went FUBAR. " msgstr "Irgendwas ist hier so richtig schief gelaufen. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Kontakteigenschaft aktualisieren fehlgeschlagen" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -171,7 +168,7 @@ msgstr "Fehler beim Abruf des Kontakt-Objektes." #: ajax/savecrop.php:79 msgid "Error getting PHOTO property." -msgstr "Fehler beim Abrufen der PHOTO Eigenschaft." +msgstr "Fehler beim Abrufen der PHOTO-Eigenschaft." #: ajax/savecrop.php:98 msgid "Error saving contact." @@ -187,7 +184,7 @@ msgstr "Fehler beim Zuschneiden des Bildes" #: ajax/savecrop.php:115 msgid "Error creating temporary image" -msgstr "Fehler beim erstellen des temporären Bildes" +msgstr "Fehler beim Erstellen des temporären Bildes" #: ajax/savecrop.php:118 msgid "Error finding image: " @@ -195,7 +192,7 @@ msgstr "Fehler beim Suchen des Bildes: " #: ajax/uploadimport.php:44 ajax/uploadimport.php:76 msgid "Error uploading contacts to storage." -msgstr "Übertragen der Kontakte fehlgeschlagen" +msgstr "Übertragen der Kontakte fehlgeschlagen." #: ajax/uploadimport.php:61 ajax/uploadphoto.php:77 msgid "There is no error, the file uploaded with success" @@ -235,7 +232,7 @@ msgstr "Konnte das temporäre Bild nicht laden:" msgid "No file was uploaded. Unknown error" msgstr "Keine Datei hochgeladen. Unbekannter Fehler" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Kontakte" @@ -249,60 +246,77 @@ msgstr "Nicht verfügbar" #: js/contacts.js:76 msgid "Couldn't get a valid address." -msgstr "Konnte keine gültige Adresse abrufen" +msgstr "Konnte keine gültige Adresse abrufen." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Fehler" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "Sie besitzen nicht die erforderlichen Rechte, um Kontakte hinzuzufügen" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Bitte wählen Sie eines Ihrer Adressbücher aus." + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Berechtigungsfehler" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Dieses Feld darf nicht leer sein." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Konnte Elemente nicht serialisieren" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" -msgstr "'deleteProperty' wurde ohne Argumente aufgerufen, bitte melde dies auf bugs.owncloud.org" +msgstr "'deleteProperty' wurde ohne Argumente aufgerufen. Bitte melden Sie dies auf bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Name ändern" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." -msgstr "Keine Datei(en) zum Hochladen ausgewählt" +msgstr "Keine Datei(en) zum Hochladen ausgewählt." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." -msgstr "Die Datei, die du hochladen willst, überschreitet die maximale Größe für Datei-Uploads auf diesem Server." +msgstr "Die Datei, die Sie hochladen möchten, überschreitet die maximale Größe für Datei-Uploads auf diesem Server." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "Fehler beim Laden des Profilbildes." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Wähle Typ" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "Einige zum Löschen markiert Kontakte wurden noch nicht gelöscht. Bitte warten." +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Möchten Sie diese Adressbücher zusammenführen?" + #: js/loader.js:49 msgid "Result: " msgstr "Ergebnis: " @@ -315,7 +329,7 @@ msgstr " importiert, " msgid " failed." msgstr " fehlgeschlagen." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "Der Anzeigename darf nicht leer sein." @@ -323,125 +337,156 @@ msgstr "Der Anzeigename darf nicht leer sein." msgid "Addressbook not found: " msgstr "Adressbuch nicht gefunden:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." -msgstr "Dies ist nicht dein Adressbuch." +msgstr "Dies ist nicht Ihr Adressbuch." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakt konnte nicht gefunden werden." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresse" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-Mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisation" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Arbeit" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Zuhause" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Text" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Anruf" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mitteilung" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Geburtstag" - -#: lib/app.php:184 -msgid "Business" -msgstr "Geschäftlich" - -#: lib/app.php:185 -msgid "Call" -msgstr "Anruf" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Kunden" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "Lieferant" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Feiertage" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Ideen" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Reise" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Jubiläum" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Besprechung" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Andere" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Text" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Anruf" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mitteilung" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Geburtstag" + +#: lib/app.php:253 +msgid "Business" +msgstr "Geschäftlich" + +#: lib/app.php:254 +msgid "Call" +msgstr "Anruf" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Kunden" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Lieferant" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Feiertage" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Ideen" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Reise" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Jubiläum" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Besprechung" + +#: lib/app.php:263 msgid "Personal" msgstr "Persönlich" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projekte" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Fragen" @@ -453,6 +498,14 @@ msgstr "Geburtstag von {name}" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "Sie besitzen nicht die erforderlichen Rechte, um diesen Kontakt zu bearbeiten." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "Sie besitzen nicht die erforderlichen Rechte, um diesen Kontakte zu löschen." + #: templates/index.php:14 msgid "Add Contact" msgstr "Kontakt hinzufügen" @@ -523,7 +576,7 @@ msgstr "Aktuellen Kontakt löschen" #: templates/part.contact.php:17 msgid "Drop photo to upload" -msgstr "Zieh' ein Foto hierher zum Hochladen" +msgstr "Ziehen Sie ein Foto zum Hochladen hierher" #: templates/part.contact.php:19 msgid "Delete current photo" @@ -549,13 +602,18 @@ msgstr "Format benutzerdefiniert, Kurzname, Vollname, Rückwärts oder Rückwär msgid "Edit name details" msgstr "Name ändern" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisation" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Löschen" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Spitzname" @@ -563,7 +621,7 @@ msgstr "Spitzname" msgid "Enter nickname" msgstr "Spitzname angeben" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Webseite" @@ -579,7 +637,7 @@ msgstr "Webseite aufrufen" msgid "dd-mm-yyyy" msgstr "dd.mm.yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Gruppen" @@ -591,63 +649,84 @@ msgstr "Gruppen mit Komma getrennt" msgid "Edit groups" msgstr "Gruppen editieren" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Bevorzugt" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Bitte eine gültige E-Mail-Adresse angeben." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "E-Mail-Adresse angeben" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "E-Mail an diese Adresse schreiben" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "E-Mail-Adresse löschen" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Telefonnummer angeben" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Telefonnummer löschen" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "IM löschen" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Auf Karte anzeigen" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Adressinformationen ändern" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Füge hier Notizen ein." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Feld hinzufügen" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-Mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Instant Messaging" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresse" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Notiz" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Kontakt herunterladen" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Kontakt löschen" @@ -740,7 +819,7 @@ msgstr "Frau" #: templates/part.edit_name_dialog.php:32 msgid "Dr" -msgstr "Dr" +msgstr "Dr." #: templates/part.edit_name_dialog.php:35 msgid "Given name" @@ -760,7 +839,7 @@ msgstr "Höflichkeitssuffixe" #: templates/part.edit_name_dialog.php:45 msgid "J.D." -msgstr "Dr. Jur" +msgstr "Dr. Jur." #: templates/part.edit_name_dialog.php:46 msgid "M.D." @@ -812,16 +891,12 @@ msgstr "Kontakte werden importiert" #: templates/part.no_contacts.php:3 msgid "You have no contacts in your addressbook." -msgstr "Du hast keine Kontakte im Adressbuch." +msgstr "Sie haben keine Kontakte im Adressbuch." #: templates/part.no_contacts.php:5 msgid "Add contact" msgstr "Kontakt hinzufügen" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Adressbücher konfigurieren" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Wähle Adressbuch" @@ -840,11 +915,11 @@ msgstr "CardDAV Sync-Adressen" #: templates/settings.php:3 msgid "more info" -msgstr "mehr Info" +msgstr "mehr Informationen" #: templates/settings.php:5 msgid "Primary address (Kontact et al)" -msgstr "primäre Adresse (für Kontakt o.ä. Programme)" +msgstr "Primäre Adresse (für Kontakt o.ä.)" #: templates/settings.php:7 msgid "iOS/OS X" @@ -859,33 +934,37 @@ msgid "Show read-only VCF link" msgstr "Schreibgeschützten VCF-Link anzeigen" #: templates/settings.php:26 +msgid "Share" +msgstr "Teilen" + +#: templates/settings.php:29 msgid "Download" msgstr "Herunterladen" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Bearbeiten" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Neues Adressbuch" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Name" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Beschreibung" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Speichern" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Abbrechen" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Mehr..." diff --git a/l10n/de/core.po b/l10n/de/core.po index 2360a0297a..fc4db2d98b 100644 --- a/l10n/de/core.po +++ b/l10n/de/core.po @@ -8,16 +8,18 @@ # , 2011. # Jan-Christoph Borchardt , 2011. # Marcel Kühlhorn , 2012. +# , 2012. # , 2012. # Phi Lieb <>, 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-07 02:04+0200\n" -"PO-Revision-Date: 2012-08-06 19:45+0000\n" -"Last-Translator: designpoint \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:44+0000\n" +"Last-Translator: JamFX \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -41,55 +43,55 @@ msgstr "Kategorie existiert bereits:" msgid "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" msgstr "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" -#: js/js.js:185 templates/layout.user.php:64 templates/layout.user.php:65 +#: js/js.js:190 templates/layout.user.php:64 templates/layout.user.php:65 msgid "Settings" msgstr "Einstellungen" -#: js/js.js:572 +#: js/js.js:575 msgid "January" msgstr "Januar" -#: js/js.js:572 +#: js/js.js:575 msgid "February" msgstr "Februar" -#: js/js.js:572 +#: js/js.js:575 msgid "March" msgstr "März" -#: js/js.js:572 +#: js/js.js:575 msgid "April" msgstr "April" -#: js/js.js:572 +#: js/js.js:575 msgid "May" msgstr "Mai" -#: js/js.js:572 +#: js/js.js:575 msgid "June" msgstr "Juni" -#: js/js.js:573 +#: js/js.js:576 msgid "July" msgstr "Juli" -#: js/js.js:573 +#: js/js.js:576 msgid "August" msgstr "August" -#: js/js.js:573 +#: js/js.js:576 msgid "September" msgstr "September" -#: js/js.js:573 +#: js/js.js:576 msgid "October" msgstr "Oktober" -#: js/js.js:573 +#: js/js.js:576 msgid "November" msgstr "November" -#: js/js.js:573 +#: js/js.js:576 msgid "December" msgstr "Dezember" @@ -123,11 +125,11 @@ msgstr "ownCloud-Passwort zurücksetzen" #: lostpassword/templates/email.php:1 msgid "Use the following link to reset your password: {link}" -msgstr "Nutze folgenden Link, um dein Passwort zurückzusetzen: {link}" +msgstr "Nutzen Sie den nachfolgenden Link, um Ihr Passwort zurückzusetzen: {link}" #: lostpassword/templates/lostpassword.php:3 msgid "You will receive a link to reset your password via Email." -msgstr "Du erhälst einen Link, um dein Passwort per E-Mail zurückzusetzen." +msgstr "Sie erhalten einen Link, um Ihr Passwort per E-Mail zurückzusetzen." #: lostpassword/templates/lostpassword.php:5 msgid "Requested" @@ -148,7 +150,7 @@ msgstr "Anfrage zurückgesetzt" #: lostpassword/templates/resetpassword.php:4 msgid "Your password was reset" -msgstr "Dein Passwort wurde zurückgesetzt." +msgstr "Ihr Passwort wurde zurückgesetzt." #: lostpassword/templates/resetpassword.php:5 msgid "To login page" @@ -184,7 +186,7 @@ msgstr "Hilfe" #: templates/403.php:12 msgid "Access forbidden" -msgstr "Zugang verboten" +msgstr "Zugriff verboten" #: templates/404.php:12 msgid "Cloud not found" @@ -192,7 +194,7 @@ msgstr "Cloud nicht gefunden" #: templates/edit_categories_dialog.php:4 msgid "Edit categories" -msgstr "Kategorien editieren" +msgstr "Kategorien bearbeiten" #: templates/edit_categories_dialog.php:14 msgid "Add" @@ -245,7 +247,7 @@ msgstr "Installation abschließen" #: templates/layout.guest.php:42 msgid "web services under your control" -msgstr "Web Services unter ihrer Kontrolle" +msgstr "Web-Services unter Ihrer Kontrolle" #: templates/layout.user.php:49 msgid "Log out" @@ -265,7 +267,7 @@ msgstr "Einloggen" #: templates/logout.php:1 msgid "You are logged out." -msgstr "Abgemeldet" +msgstr "Sie wurden abgemeldet." #: templates/part.pagenavi.php:3 msgid "prev" diff --git a/l10n/de/files.po b/l10n/de/files.po index f495a374d0..b7f13aa702 100644 --- a/l10n/de/files.po +++ b/l10n/de/files.po @@ -9,15 +9,17 @@ # Marcel Kühlhorn , 2012. # Michael Krell , 2012. # , 2012. +# Phi Lieb <>, 2012. # , 2012. # Thomas Müller <>, 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-07 02:04+0200\n" -"PO-Revision-Date: 2012-08-06 20:04+0000\n" -"Last-Translator: designpoint \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:11+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,17 +55,13 @@ msgstr "Temporärer Ordner fehlt." #: ajax/upload.php:26 msgid "Failed to write to disk" -msgstr "Fehler beim Schreiben auf Festplatte" +msgstr "Fehler beim Schreiben auf die Festplatte" #: appinfo/app.php:6 msgid "Files" msgstr "Dateien" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Nicht mehr teilen" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Löschen" @@ -73,73 +71,73 @@ msgstr "ist bereits vorhanden" #: js/filelist.js:141 msgid "replace" -msgstr "Ersetzen" +msgstr "ersetzen" #: js/filelist.js:141 msgid "cancel" -msgstr "Abbrechen" +msgstr "abbrechen" #: js/filelist.js:195 msgid "replaced" -msgstr "Ersetzt" +msgstr "ersetzt" #: js/filelist.js:195 msgid "with" msgstr "mit" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "rückgängig machen" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "gelöscht" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "Erstelle ZIP-Datei. Dies kann eine Weile dauern." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" -msgstr "Datei kann nicht hochgeladen werden da sie ein Verzeichnis ist oder 0 Bytes hat." +msgstr "Ihre Datei kann nicht hochgeladen werden, da sie ein Verzeichnis ist oder 0 Bytes hat." -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Fehler beim Hochladen" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Ausstehend" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Hochladen abgebrochen." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Ungültiger Name, \"/\" ist nicht erlaubt." -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Größe" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Bearbeitet" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "Ordner" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "Ordner" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "Datei" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "Dateien" @@ -223,7 +221,7 @@ msgstr "Die Datei überschreitet die Maximalgröße für Uploads auf diesem Serv #: templates/index.php:71 msgid "Files are being scanned, please wait." -msgstr "Daten werden gescannt, bitte warten." +msgstr "Dateien werden gescannt, bitte warten." #: templates/index.php:74 msgid "Current scanning" diff --git a/l10n/de/files_external.po b/l10n/de/files_external.po index 84c825dfd9..49a5cc39b0 100644 --- a/l10n/de/files_external.po +++ b/l10n/de/files_external.po @@ -4,13 +4,14 @@ # # Translators: # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 08:18+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 10:07+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -76,8 +77,8 @@ msgstr "Root-Zertifikate importieren" #: templates/settings.php:108 msgid "Enable User External Storage" -msgstr "Externer Speicher für Benutzer aktivieren" +msgstr "Externen Speicher für Benutzer aktivieren" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "Erlaubt Benutzern Ihre eigenen externen Speicher einzubinden" +msgstr "Erlaubt Benutzern ihre eigenen externen Speicher einzubinden" diff --git a/l10n/de/files_sharing.po b/l10n/de/files_sharing.po index 85e27c2e09..8f7dfd3059 100644 --- a/l10n/de/files_sharing.po +++ b/l10n/de/files_sharing.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# I Robot , 2012. # , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:38+0000\n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" "Last-Translator: I Robot \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" @@ -19,38 +20,18 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "Ihre geteilten Dateien" +#: templates/get.php:4 +msgid "Size" +msgstr "Größe" -#: templates/list.php:6 -msgid "Item" -msgstr "Objekt" +#: templates/get.php:5 +msgid "Modified" +msgstr "Geändert" -#: templates/list.php:7 -msgid "Shared With" -msgstr "Teilen mit" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Alle löschen" -#: templates/list.php:8 -msgid "Permissions" -msgstr "Berechtigungen" - -#: templates/list.php:16 -msgid "Read" -msgstr "Lesen" - -#: templates/list.php:16 -msgid "Edit" -msgstr "Bearbeiten" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "Löschen" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "Austausch ermöglichen" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "Benutzer dürfen Dateien nochmals teilen, auch wenn sie nicht der Besitzer dieser Dateien sind." diff --git a/l10n/de/lib.po b/l10n/de/lib.po index b487d24a1d..0e1b5201dc 100644 --- a/l10n/de/lib.po +++ b/l10n/de/lib.po @@ -5,13 +5,14 @@ # Translators: # Phi Lieb <>, 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-30 02:03+0200\n" -"PO-Revision-Date: 2012-07-29 16:32+0000\n" -"Last-Translator: Phi Lieb <>\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:41+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,49 +20,49 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: app.php:287 +#: app.php:288 msgid "Help" msgstr "Hilfe" -#: app.php:294 +#: app.php:295 msgid "Personal" msgstr "Persönlich" -#: app.php:299 +#: app.php:300 msgid "Settings" msgstr "Einstellungen" -#: app.php:304 +#: app.php:305 msgid "Users" msgstr "Benutzer" -#: app.php:311 +#: app.php:312 msgid "Apps" msgstr "Apps" -#: app.php:313 +#: app.php:314 msgid "Admin" msgstr "Administrator" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." -msgstr "ZIP-Download ist deaktiviert." +msgstr "Der ZIP-Download ist deaktiviert." -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." msgstr "Die Dateien müssen einzeln heruntergeladen werden." -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" msgstr "Zurück zu \"Dateien\"" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." -msgstr "Die gewählten Dateien sind zu groß, um eine zip-Datei zu generieren." +msgstr "Die gewählten Dateien sind zu groß, um eine ZIP-Datei zu erstellen." #: json.php:28 msgid "Application is not enabled" -msgstr "Anwendung ist nicht aktiviert" +msgstr "Die Anwendung ist nicht aktiviert" #: json.php:39 json.php:63 json.php:75 msgid "Authentication error" @@ -69,11 +70,11 @@ msgstr "Authentifizierungs-Fehler" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "Token abgelaufen. Bitte Seite neuladen." +msgstr "Token abgelaufen. Bitte laden Sie die Seite neu." #: template.php:86 msgid "seconds ago" -msgstr "vor wenigen Sekunden" +msgstr "Vor wenigen Sekunden" #: template.php:87 msgid "1 minute ago" diff --git a/l10n/de/settings.po b/l10n/de/settings.po index 96f616570a..29ec31c8a5 100644 --- a/l10n/de/settings.po +++ b/l10n/de/settings.po @@ -11,13 +11,14 @@ # , 2012. # Phi Lieb <>, 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 11:29+0000\n" -"Last-Translator: JamFX \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:08+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -103,7 +104,7 @@ msgstr "Mehr" #: templates/apps.php:10 msgid "Add your App" -msgstr "Füge deine App hinzu" +msgstr "Fügen Sie Ihre App hinzu" #: templates/apps.php:26 msgid "Select an App" @@ -147,7 +148,7 @@ msgstr "Antwort" #: templates/personal.php:8 msgid "You use" -msgstr "Du nutzt" +msgstr "Sie nutzen" #: templates/personal.php:8 msgid "of the available" @@ -163,7 +164,7 @@ msgstr "Download" #: templates/personal.php:19 msgid "Your password got changed" -msgstr "Dein Passwort wurde geändert." +msgstr "Ihr Passwort wurde geändert." #: templates/personal.php:20 msgid "Unable to change your password" @@ -195,7 +196,7 @@ msgstr "Ihre E-Mail-Adresse" #: templates/personal.php:32 msgid "Fill in an email address to enable password recovery" -msgstr "Trage eine E-Mail-Adresse ein, um die Passwort-Wiederherstellung zu aktivieren." +msgstr "Tragen Sie eine E-Mail-Adresse ein, um die Passwort-Wiederherstellung zu aktivieren." #: templates/personal.php:38 templates/personal.php:39 msgid "Language" @@ -203,11 +204,11 @@ msgstr "Sprache" #: templates/personal.php:44 msgid "Help translate" -msgstr "Hilf bei der Übersetzung" +msgstr "Helfen Sie bei der Übersetzung" #: templates/personal.php:51 msgid "use this address to connect to your ownCloud in your file manager" -msgstr "Benutze diese Adresse, um deine ownCloud mit deinem Dateimanager zu verbinden." +msgstr "Benutzen Sie diese Adresse, um Ihr ownCloud mit deinem Dateimanager zu verbinden." #: templates/users.php:21 templates/users.php:76 msgid "Name" @@ -227,15 +228,15 @@ msgstr "Anlegen" #: templates/users.php:35 msgid "Default Quota" -msgstr "Standard Quota" +msgstr "Standard-Quota" #: templates/users.php:55 templates/users.php:138 msgid "Other" msgstr "Andere" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "Unteradministrator" +msgid "Group Admin" +msgstr "Gruppenadministrator" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/de/tasks.po b/l10n/de/tasks.po index ad1bfcf952..2ad6b64b48 100644 --- a/l10n/de/tasks.po +++ b/l10n/de/tasks.po @@ -5,13 +5,14 @@ # Translators: # , 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:49+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 10:09+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -37,15 +38,15 @@ msgstr "Nicht angegeben" #: lib/app.php:34 msgid "1=highest" -msgstr "1=am höchsten" +msgstr "1 = am höchsten" #: lib/app.php:38 msgid "5=medium" -msgstr "5=Durchschnitt" +msgstr "5 = Durchschnitt" #: lib/app.php:42 msgid "9=lowest" -msgstr "9=am niedrigsten" +msgstr "9 = am niedrigsten" #: lib/app.php:81 msgid "Empty Summary" @@ -89,7 +90,7 @@ msgstr "Nach Label sortieren" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "Lade Aufgaben..." +msgstr "Lade Aufgaben ..." #: templates/tasks.php:20 msgid "Important" diff --git a/l10n/de/user_ldap.po b/l10n/de/user_ldap.po index f84a3add4d..5cd6c4762f 100644 --- a/l10n/de/user_ldap.po +++ b/l10n/de/user_ldap.po @@ -3,14 +3,18 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# I Robot , 2012. # Maurice Preuß <>, 2012. +# , 2012. +# Phi Lieb <>, 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 20:45+0000\n" -"Last-Translator: Maurice Preuß <>\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 10:14+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,26 +29,26 @@ msgstr "Host" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "Sie können das Protokoll auslassen, außer wenn Sie SSL benötigen. Beginnen Sie dann mit ldaps://" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Basis-DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "Sie können Basis-DN für Benutzer und Gruppen in dem \"Erweitert\"-Reiter konfigurieren" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "Benutzer-DN" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "Der DN des Benutzers für LDAP-Bind, z.B.: uid=agent,dc=example,dc=com. Für anonymen Zugriff lassen Sie DN und Passwort leer." #: templates/settings.php:11 msgid "Password" @@ -52,11 +56,11 @@ msgstr "Passwort" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "Lassen Sie die Felder von DN und Passwort für anonymen Zugang leer." #: templates/settings.php:12 msgid "User Login Filter" -msgstr "Benutzer Login Filter" +msgstr "Benutzer-Login-Filter" #: templates/settings.php:12 #, php-format @@ -68,31 +72,31 @@ msgstr "Bestimmt den angewendeten Filter, wenn eine Anmeldung versucht wird. %%u #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "verwende %%uid Platzhalter, z. B. \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "Benutzer Filter Liste" +msgstr "Benutzer-Filter-Liste" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "Definiert den Filter für die Anfrage der Benutzer." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "ohne Platzhalter, z.B.: \"objectClass=person\"" #: templates/settings.php:14 msgid "Group Filter" -msgstr "Gruppen Filter" +msgstr "Gruppen-Filter" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "Definiert den Filter für die Anfrage der Gruppen." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "ohne Platzhalter, z.B.: \"objectClass=posixGroup\"" #: templates/settings.php:17 msgid "Port" @@ -100,27 +104,27 @@ msgstr "Port" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "Basis-Benutzerbaum" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "Basis-Gruppenbaum" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "" +msgstr "Assoziation zwischen Gruppe und Benutzer" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Nutze TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "Verwenden Sie es nicht für SSL-Verbindungen, wird es scheitern." +msgstr "Verwenden Sie es nicht für SSL-Verbindungen, es wird fehlschlagen." #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "LDAP-Server (Windows: Groß- und Kleinschreibung bleibt unbeachtet)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." @@ -130,31 +134,31 @@ msgstr "Schalte die SSL Zertifikatsprüfung aus." msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "" +msgstr "Falls die Verbindung es erfordert, wird das SSL-Zertifikat des LDAP-Server importiert werden." #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Nicht empfohlen, nur zu Testzwecken." #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "" +msgstr "Feld für den Anzeigenamen des Benutzers" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." -msgstr "" +msgstr "Das LDAP-Attribut für die Generierung des Benutzernamens in ownCloud. " #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "" +msgstr "Feld für den Anzeigenamen der Gruppe" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." -msgstr "" +msgstr "Das LDAP-Attribut für die Generierung des Gruppennamens in ownCloud. " #: templates/settings.php:27 msgid "in bytes" -msgstr "in bytes" +msgstr "in Bytes" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." diff --git a/l10n/de/user_migrate.po b/l10n/de/user_migrate.po index 4423a018e2..aada5dbfb2 100644 --- a/l10n/de/user_migrate.po +++ b/l10n/de/user_migrate.po @@ -5,13 +5,14 @@ # Translators: # , 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:51+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 10:16+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +26,7 @@ msgstr "Export" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "Beim Export der Datei ist etwas schief gegangen." +msgstr "Beim Export der Datei ist etwas schiefgegangen." #: js/export.js:19 msgid "An error has occurred" @@ -38,7 +39,7 @@ msgstr "Ihr Konto exportieren" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "Eine komprimierte Datei wird erzeugen, die Ihr ownCloud-Konto enthält." +msgstr "Eine komprimierte Datei wird erzeugt, die Ihr ownCloud-Konto enthält." #: templates/settings.php:13 msgid "Import user account" diff --git a/l10n/de/user_openid.po b/l10n/de/user_openid.po index 5786558544..9f5a660af8 100644 --- a/l10n/de/user_openid.po +++ b/l10n/de/user_openid.po @@ -5,13 +5,14 @@ # Translators: # , 2012. # , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:54+0000\n" -"Last-Translator: I Robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 10:17+0000\n" +"Last-Translator: traductor \n" "Language-Team: German (http://www.transifex.com/projects/p/owncloud/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,7 +22,7 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "Dies ist ein OpenID-Server-Endpunkt. Für weitere Informationen schauen Sie sich folgendes an:" +msgstr "Dies ist ein OpenID-Server-Endpunkt. Weitere Informationen finden Sie unter:" #: templates/nomode.php:14 msgid "Identity: " @@ -41,7 +42,7 @@ msgstr "Anmelden" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "Fehler: Kein Benutzer gewählt" +msgstr "Fehler: Kein Benutzer ausgewählt" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" diff --git a/l10n/el/admin_dependencies_chk.po b/l10n/el/admin_dependencies_chk.po index d1a97dc8f2..6823009596 100644 --- a/l10n/el/admin_dependencies_chk.po +++ b/l10n/el/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Efstathios Iosifidis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:01+0200\n" +"PO-Revision-Date: 2012-08-23 13:39+0000\n" +"Last-Translator: Efstathios Iosifidis \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,8 +67,8 @@ msgstr "" #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Κατάσταση εξαρτήσεων" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Χρησιμοποιήθηκε από:" diff --git a/l10n/el/admin_migrate.po b/l10n/el/admin_migrate.po index 9c9cb6234e..2d17139f4a 100644 --- a/l10n/el/admin_migrate.po +++ b/l10n/el/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Efstathios Iosifidis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:01+0200\n" +"PO-Revision-Date: 2012-08-23 13:41+0000\n" +"Last-Translator: Efstathios Iosifidis \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,8 +26,8 @@ msgstr "" msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Αυτό θα δημιουργήσει ένα συμπιεσμένο αρχείο που θα περιέχει τα δεδομένα από αυτό το ownCloud.\n Παρακαλώ επιλέξτε τον τύπο εξαγωγής:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Εξαγωγή" diff --git a/l10n/el/contacts.po b/l10n/el/contacts.po index 548db19793..ddb35e2e8c 100644 --- a/l10n/el/contacts.po +++ b/l10n/el/contacts.po @@ -7,15 +7,16 @@ # Dimitris M. , 2012. # Efstathios Iosifidis , 2012. # Marios Bekatoros <>, 2012. +# Nisok Kosin , 2012. # Petros Kyladitis , 2011, 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:34+0000\n" +"Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +29,7 @@ msgid "Error (de)activating addressbook." msgstr "Σφάλμα (απ)ενεργοποίησης βιβλίου διευθύνσεων" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "δεν ορίστηκε id" @@ -85,18 +86,18 @@ msgstr "Πρέπει να συμπληρωθεί τουλάχιστον ένα msgid "Trying to add duplicate property: " msgstr "Προσπάθεια προσθήκης διπλότυπης ιδιότητας:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Σφάλμα στη προσθήκη ιδιότητας επαφής" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Λείπει IM παράμετρος." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Άγνωστο IM:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Οι πληροφορίες σχετικά με vCard είναι εσφαλμένες. Παρακαλώ επαναφορτώστε τη σελίδα." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Σφάλμα διαγραφής ιδιότητας επαφής." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Λείπει ID" @@ -117,10 +118,6 @@ msgstr "Οι πληροφορίες για τη vCard είναι λανθασμ msgid "Something went FUBAR. " msgstr "Κάτι χάθηκε στο άγνωστο. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Σφάλμα ενημέρωσης ιδιότητας επαφής." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -224,7 +221,7 @@ msgstr "Δεν ήταν δυνατή η φόρτωση της προσωρινή msgid "No file was uploaded. Unknown error" msgstr "Δεν ανέβηκε κάποιο αρχείο. Άγνωστο σφάλμα" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Επαφές" @@ -241,57 +238,74 @@ msgid "Couldn't get a valid address." msgstr "Αδυναμία λήψης έγκυρης διεύθυνσης" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Σφάλμα" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "Δεν έχετε επαρκή δικαιώματα για προσθέσετε επαφές στο " + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Παρακαλούμε επιλέξτε ένα από τα δικάς σας βιβλία διευθύνσεων." + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Σφάλμα δικαιωμάτων" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Το πεδίο δεν πρέπει να είναι άδειο." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Αδύνατο να μπουν σε σειρά τα στοιχεία" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "το 'deleteProperty' καλέστηκε χωρίς without type argument. Παρακαλώ αναφέρατε στο bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Αλλαγή ονόματος" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Δεν επιλέχτηκαν αρχεία για μεταφόρτωση" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Το αρχείο που προσπαθείτε να ανεβάσετε υπερβαίνει το μέγιστο μέγεθος για τις προσθήκες αρχείων σε αυτόν τον server." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Σφάλμα στην φόρτωση εικόνας προφίλ." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Επιλογή τύπου" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "Κάποιες επαφές σημειώθηκαν προς διαγραφή,δεν έχουν διαγραφεί ακόμα. Παρακαλώ περιμένετε μέχρι να διαγραφούν." +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Επιθυμείτε να συγχωνεύσετε αυτά τα δύο βιβλία διευθύνσεων?" + #: js/loader.js:49 msgid "Result: " msgstr "Αποτέλεσμα: " @@ -304,133 +318,164 @@ msgstr " εισάγεται," msgid " failed." msgstr " απέτυχε." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Το όνομα προβολής δεν μπορεί να είναι κενό. " #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "" +msgstr "Το βιβλίο διευθύνσεων δεν βρέθηκε:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Αυτό δεν είναι το βιβλίο διευθύνσεων σας." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Η επαφή δεν μπόρεσε να βρεθεί." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Διεύθυνση" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Τηλέφωνο" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Οργανισμός" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Εργασία" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Σπίτι" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Κινητό" - -#: lib/app.php:135 -msgid "Text" -msgstr "Κείμενο" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Ομιλία" - -#: lib/app.php:137 -msgid "Message" -msgstr "Μήνυμα" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Φαξ" - -#: lib/app.php:139 -msgid "Video" -msgstr "Βίντεο" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Βομβητής" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Διαδίκτυο" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Γενέθλια" - -#: lib/app.php:184 -msgid "Business" -msgstr "Επιχείρηση" - -#: lib/app.php:185 -msgid "Call" -msgstr "Κάλεσε" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Πελάτες" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "Προμηθευτής" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Διακοπές" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Ιδέες" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Ταξίδι" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Ιωβηλαίο" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Συνάντηση" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Άλλο" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Κινητό" + +#: lib/app.php:203 +msgid "Text" +msgstr "Κείμενο" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Ομιλία" + +#: lib/app.php:205 +msgid "Message" +msgstr "Μήνυμα" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Φαξ" + +#: lib/app.php:207 +msgid "Video" +msgstr "Βίντεο" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Βομβητής" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Διαδίκτυο" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Γενέθλια" + +#: lib/app.php:253 +msgid "Business" +msgstr "Επιχείρηση" + +#: lib/app.php:254 +msgid "Call" +msgstr "Κάλεσε" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Πελάτες" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Προμηθευτής" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Διακοπές" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Ιδέες" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Ταξίδι" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Ιωβηλαίο" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Συνάντηση" + +#: lib/app.php:263 msgid "Personal" msgstr "Προσωπικό" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Έργα" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Ερωτήσεις" @@ -442,6 +487,14 @@ msgstr "{name} έχει Γενέθλια" msgid "Contact" msgstr "Επαφή" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "Δεν διαθέτε επαρκή δικαιώματα για την επεξεργασία αυτής της επαφής." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "Δεν διαθέτε επαρκή δικαιώματα για την διαγραφή αυτής της επαφής." + #: templates/index.php:14 msgid "Add Contact" msgstr "Προσθήκη επαφής" @@ -484,11 +537,11 @@ msgstr "Ανάπτυξη/σύμπτυξη τρέχοντος βιβλίου δι #: templates/index.php:48 msgid "Next addressbook" -msgstr "" +msgstr "Επόμενο βιβλίο διευθύνσεων" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "" +msgstr "Προηγούμενο βιβλίο διευθύνσεων" #: templates/index.php:54 msgid "Actions" @@ -538,13 +591,18 @@ msgstr "Format custom, Όνομα, Επώνυμο, Αντίστροφο ή Αν msgid "Edit name details" msgstr "Αλλάξτε τις λεπτομέρειες ονόματος" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Οργανισμός" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Διαγραφή" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Παρατσούκλι" @@ -552,7 +610,7 @@ msgstr "Παρατσούκλι" msgid "Enter nickname" msgstr "Εισάγετε παρατσούκλι" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Ιστότοπος" @@ -568,7 +626,7 @@ msgstr "Πήγαινε στον ιστότοπο" msgid "dd-mm-yyyy" msgstr "ΗΗ-ΜΜ-ΕΕΕΕ" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Ομάδες" @@ -580,63 +638,84 @@ msgstr "Διαχώρισε τις ομάδες με κόμμα " msgid "Edit groups" msgstr "Επεξεργασία ομάδων" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Προτιμώμενο" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Παρακαλώ εισήγαγε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Εισήγαγε διεύθυνση ηλεκτρονικού ταχυδρομείου" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Αποστολή σε διεύθυνση" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Διαγραφή διεύθυνση email" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Εισήγαγε αριθμό τηλεφώνου" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Διέγραψε αριθμό τηλεφώνου" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Διαγραφή IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Προβολή στο χάρτη" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Επεξεργασία λεπτομερειών διεύθυνσης" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Πρόσθεσε τις σημειώσεις εδώ" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Προσθήκη πεδίου" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Τηλέφωνο" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Άμεσα μυνήματα" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Διεύθυνση" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Σημείωση" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Λήψη επαφής" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Διαγραφή επαφής" @@ -807,19 +886,15 @@ msgstr "Δεν έχεις επαφές στο βιβλίο διευθύνσεω msgid "Add contact" msgstr "Προσθήκη επαφής" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Ρύθμισε το βιβλίο διευθύνσεων" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Επέλεξε βιβλίο διευθύνσεων" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Εισαγωγή ονόματος" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Εισαγωγή περιγραφής" @@ -841,40 +916,44 @@ msgstr "iOS/OS X" #: templates/settings.php:20 msgid "Show CardDav link" -msgstr "" +msgstr "Εμφάνιση συνδέσμου CardDav" #: templates/settings.php:23 msgid "Show read-only VCF link" -msgstr "" +msgstr "Εμφάνιση συνδέσμου VCF μόνο για ανάγνωση" #: templates/settings.php:26 +msgid "Share" +msgstr "Μοιράσου" + +#: templates/settings.php:29 msgid "Download" msgstr "Λήψη" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Επεξεργασία" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Νέο βιβλίο διευθύνσεων" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Όνομα" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Περιγραφή" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Αποθήκευση" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Ακύρωση" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Περισσότερα..." diff --git a/l10n/el/files.po b/l10n/el/files.po index 37e57190cb..de2b3f80a1 100644 --- a/l10n/el/files.po +++ b/l10n/el/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-03 02:02+0200\n" -"PO-Revision-Date: 2012-08-02 09:32+0000\n" -"Last-Translator: Marios Bekatoros <>\n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,11 +54,7 @@ msgstr "Η εγγραφή στο δίσκο απέτυχε" msgid "Files" msgstr "Αρχεία" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Ακύρωση Διαμοιρασμού" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Διαγραφή" @@ -82,59 +78,59 @@ msgstr "αντικαταστάθηκε" msgid "with" msgstr "με" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "αναίρεση" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "διαγράφηκε" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "παραγωγή αρχείου ZIP, ίσως διαρκέσει αρκετά." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Αδυναμία στην μεταφόρτωση του αρχείου σας αφού είναι φάκελος ή έχει 0 bytes" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Σφάλμα Μεταφόρτωσης" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Εν αναμονή" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Η μεταφόρτωση ακυρώθηκε." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Μη έγκυρο όνομα, το '/' δεν επιτρέπεται." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Μέγεθος" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Τροποποιήθηκε" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "φάκελος" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "φάκελοι" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "αρχείο" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "αρχεία" diff --git a/l10n/el/files_encryption.po b/l10n/el/files_encryption.po index 18179301de..6d54cf8abc 100644 --- a/l10n/el/files_encryption.po +++ b/l10n/el/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Efstathios Iosifidis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 13:34+0000\n" +"Last-Translator: Efstathios Iosifidis \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Κρυπτογράφηση" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Εξαίρεση των παρακάτω τύπων αρχείων από την κρυπτογράφηση" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Καμία" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Ενεργοποίηση Κρυπτογράφησης" diff --git a/l10n/el/files_external.po b/l10n/el/files_external.po index aec86d2f48..d33fba1ab4 100644 --- a/l10n/el/files_external.po +++ b/l10n/el/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Nisok Kosin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 08:59+0000\n" +"Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Εξωτερική αποθήκευση" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" @@ -31,11 +32,11 @@ msgstr "" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Ρυθμίσεις" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Επιλογές" #: templates/settings.php:11 msgid "Applicable" @@ -51,19 +52,19 @@ msgstr "" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Όλοι οι χρήστες" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Ομάδες" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Χρήστες" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Διαγραφή" #: templates/settings.php:88 msgid "SSL root certificates" diff --git a/l10n/el/files_sharing.po b/l10n/el/files_sharing.po index ffff3a6e15..32f11e9f2c 100644 --- a/l10n/el/files_sharing.po +++ b/l10n/el/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Nisok Kosin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 08:57+0000\n" +"Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Μέγεθος" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Τροποποιήθηκε" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Διαγραφή όλων" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Διαγραφή" diff --git a/l10n/el/files_versions.po b/l10n/el/files_versions.po index 0c3ae5537c..134edc89db 100644 --- a/l10n/el/files_versions.po +++ b/l10n/el/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Nisok Kosin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 18:26+0000\n" +"Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Λήξη όλων των εκδόσεων" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Ενεργοποίηση παρακολούθησης εκδόσεων αρχείων" diff --git a/l10n/el/settings.po b/l10n/el/settings.po index 60e4a324fd..6d7243e05b 100644 --- a/l10n/el/settings.po +++ b/l10n/el/settings.po @@ -7,15 +7,16 @@ # Efstathios Iosifidis , 2012. # , 2012. # Marios Bekatoros <>, 2012. +# Nisok Kosin , 2012. # , 2011. # Petros Kyladitis , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 08:43+0000\n" +"Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +26,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Σφάλμα στην φόρτωση της λίστας από το App Store" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -53,7 +54,7 @@ msgstr "Η γλώσσα άλλαξε" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Σφάλμα" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -77,19 +78,19 @@ msgstr "Προειδοποίηση Ασφαλείας" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "Εκτέλεση μίας εργασίας με κάθε σελίδα που φορτώνεται" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "Το cron.php έχει καταχωρηθεί σε μια webcron υπηρεσία" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "Χρήση της υπηρεσίας cron του συστήματος" #: templates/admin.php:39 msgid "Log" @@ -232,8 +233,8 @@ msgid "Other" msgstr "Άλλα" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "Διαχειρηστής ομάδας" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/el/tasks.po b/l10n/el/tasks.po index 67d03159fd..3e9b760032 100644 --- a/l10n/el/tasks.po +++ b/l10n/el/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Nisok Kosin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 08:53+0000\n" +"Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,47 +20,47 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Μην έγκυρη ημερομηνία / ώρα" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Εργασίες" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Χωρίς κατηγορία" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Μη ορισμένο" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=υψηλότερο" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=μέτριο" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=χαμηλότερο" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Άδεια περίληψη" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Μη έγκυρο ποσοστό ολοκλήρωσης" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Μη έγκυρη προτεραιότητα " #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Προσθήκη εργασίας" #: templates/tasks.php:4 msgid "Order Due" @@ -87,20 +88,20 @@ msgstr "" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Φόρτωση εργασιών..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Σημαντικό " #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Περισσότερα" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Λιγότερα" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Διαγραφή" diff --git a/l10n/el/user_ldap.po b/l10n/el/user_ldap.po index d41d5a4ced..cfea140f22 100644 --- a/l10n/el/user_ldap.po +++ b/l10n/el/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Efstathios Iosifidis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 13:38+0000\n" +"Last-Translator: Efstathios Iosifidis \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,7 +48,7 @@ msgstr "" #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Συνθηματικό" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." @@ -95,7 +96,7 @@ msgstr "" #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Θύρα" #: templates/settings.php:18 msgid "Base User Tree" @@ -153,7 +154,7 @@ msgstr "" #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "σε bytes" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." @@ -161,4 +162,4 @@ msgstr "" #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Βοήθεια" diff --git a/l10n/el/user_migrate.po b/l10n/el/user_migrate.po index 81504510c5..51b56b84a2 100644 --- a/l10n/el/user_migrate.po +++ b/l10n/el/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Efstathios Iosifidis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 13:37+0000\n" +"Last-Translator: Efstathios Iosifidis \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Εξαγωγή" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" @@ -27,20 +28,20 @@ msgstr "" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "Παρουσιάστηκε σφάλμα" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "Εξαγωγή του λογαριασμού χρήστη σας" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "Αυτό θα δημιουργήσει ένα συμπιεσμένο αρχείο που θα περιέχει τον λογαριασμό σας ownCloud." #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "Εισαγωγή λογαριασμού χρήστη" #: templates/settings.php:15 msgid "ownCloud User Zip" @@ -48,4 +49,4 @@ msgstr "" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Εισαγωγή" diff --git a/l10n/el/user_openid.po b/l10n/el/user_openid.po index 5ea17f45a3..8d833ab11d 100644 --- a/l10n/el/user_openid.po +++ b/l10n/el/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Nisok Kosin , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 08:57+0000\n" +"Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/owncloud/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +24,7 @@ msgstr "" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Ταυτότητα: " #: templates/nomode.php:15 msgid "Realm: " @@ -31,15 +32,15 @@ msgstr "" #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Χρήστης: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Σύνδεση" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "Σφάλμα: Δεν έχει επιλεχθεί κάποιος χρήστης" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" @@ -47,8 +48,8 @@ msgstr "" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "" +msgstr "Εξουσιοδοτημένος παροχέας OpenID" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "" +msgstr "Η διευθυνσή σας σε Wordpress, Identi.ca, …" diff --git a/l10n/eo/admin_dependencies_chk.po b/l10n/eo/admin_dependencies_chk.po index be22a0e5e8..5fb88e68ae 100644 --- a/l10n/eo/admin_dependencies_chk.po +++ b/l10n/eo/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 20:59+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "La modulo php-json necesas por komuniko inter la multaj aplikaĵoj" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "La modulo php-curl necesas por venigi la paĝotitolon dum aldono de legosigno" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "La modulo php-gd necesas por krei bildetojn." #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "La modulo php-ldap necesas por konekti al via LDAP-servilo." #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "La modulo php-zip necesas por elŝuti plurajn dosierojn per unu fojo." #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "La modulo php-mb_multibyte necesas por ĝuste administri la kodprezenton." #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "La modulo php-ctype necesas por validkontroli datumojn." #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "La modulo php-xml necesas por kunhavigi dosierojn per WebDAV." #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "La ordono allow_url_fopen de via php.ini devus valori 1 por ricevi scibazon el OCS-serviloj" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "La modulo php-pdo necesas por konservi datumojn de ownCloud en datumbazo." #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Stato de dependoj" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Uzata de:" diff --git a/l10n/eo/admin_migrate.po b/l10n/eo/admin_migrate.po index ca3e132bd3..61384915c2 100644 --- a/l10n/eo/admin_migrate.po +++ b/l10n/eo/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 20:32+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Malenporti ĉi tiun aperon de ownCloud" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Ĉi tio kreos densigitan dosieron, kiu enhavos la datumojn de ĉi tiu apero de ownCloud.\nBonvolu elekti la tipon de malenportado:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Malenporti" diff --git a/l10n/eo/calendar.po b/l10n/eo/calendar.po index b0799bee78..4fc02e02b0 100644 --- a/l10n/eo/calendar.po +++ b/l10n/eo/calendar.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 14:17+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -59,7 +59,7 @@ msgstr "okazaĵoj estas konservitaj en via kalendaro" #: ajax/settings/guesstimezone.php:25 msgid "New Timezone:" -msgstr "Nova horzono:" +msgstr "Nova horozono:" #: ajax/settings/settimezone.php:23 msgid "Timezone changed" @@ -478,7 +478,7 @@ msgstr "Hodiaŭ" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Agordo" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -732,7 +732,7 @@ msgstr "ĉe" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Ĝenerala" #: templates/settings.php:15 msgid "Timezone" @@ -740,11 +740,11 @@ msgstr "Horozono" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Aŭtomate ĝisdatigi la horozonon" #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "Horoformo" #: templates/settings.php:57 msgid "24h" @@ -756,7 +756,7 @@ msgstr "12h" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "Komenci semajnon je" #: templates/settings.php:76 msgid "Cache" @@ -768,7 +768,7 @@ msgstr "Forviŝi kaŝmemoron por ripeto de okazaĵoj" #: templates/settings.php:85 msgid "URLs" -msgstr "" +msgstr "URL-oj" #: templates/settings.php:87 msgid "Calendar CalDAV syncing addresses" diff --git a/l10n/eo/contacts.po b/l10n/eo/contacts.po index 7a635c7d61..3d95d0c448 100644 --- a/l10n/eo/contacts.po +++ b/l10n/eo/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "Eraro dum (mal)aktivigo de adresaro." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "identigilo ne agordiĝis." @@ -67,7 +67,7 @@ msgstr "eronomo ne agordiĝis." #: ajax/contact/addproperty.php:46 msgid "Could not parse contact: " -msgstr "" +msgstr "Ne eblis analizi kontakton:" #: ajax/contact/addproperty.php:56 msgid "Cannot add empty property." @@ -81,18 +81,18 @@ msgstr "Almenaŭ unu el la adreskampoj necesas pleniĝi." msgid "Trying to add duplicate property: " msgstr "Provante aldoni duobligitan propraĵon:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Eraro aldonante kontakta propraĵo:" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informo pri vCard estas malĝusta. Bonvolu reŝargi la paĝon." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Eraro dum forigo de kontaktopropraĵo." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Mankas identigilo" @@ -113,10 +113,6 @@ msgstr "Informo pri vCard malĝustas. Bonvolu reŝargi la paĝon:" msgid "Something went FUBAR. " msgstr "Io FUBAR-is." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Eraro dum ĝisdatigo de kontaktopropraĵo." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "Ne eblis ŝargi provizoran bildon: " msgid "No file was uploaded. Unknown error" msgstr "Neniu dosiero alŝutiĝis. Nekonata eraro." -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontaktoj" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "Ne eblis ekhavi validan adreson." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Eraro" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Ĉi tiu propraĵo devas ne esti malplena." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." -msgstr "" +msgstr "Ne eblis seriigi erojn." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Redakti nomon" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Neniu dosiero elektita por alŝuto." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "La dosiero, kiun vi provas alŝuti, transpasas la maksimuman grandon por dosieraj alŝutoj en ĉi tiu servilo." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Elektu tipon" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Rezulto: " @@ -300,7 +313,7 @@ msgstr " enportoj, " msgid " failed." msgstr "malsukcesoj." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "Adresaro ne troviĝis:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ĉi tiu ne estas via adresaro." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Ne eblis trovi la kontakton." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adreso" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefono" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Retpoŝtadreso" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizaĵo" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Laboro" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Hejmo" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Poŝtelefono" - -#: lib/app.php:135 -msgid "Text" -msgstr "Teksto" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voĉo" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mesaĝo" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fakso" - -#: lib/app.php:139 -msgid "Video" -msgstr "Videaĵo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Televokilo" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Interreto" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Naskiĝotago" - -#: lib/app.php:184 -msgid "Business" -msgstr "Negoco" - -#: lib/app.php:185 -msgid "Call" -msgstr "Voko" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Klientoj" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Ferioj" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Ideoj" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Kunveno" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Alia" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Poŝtelefono" + +#: lib/app.php:203 +msgid "Text" +msgstr "Teksto" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voĉo" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mesaĝo" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fakso" + +#: lib/app.php:207 +msgid "Video" +msgstr "Videaĵo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Televokilo" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Interreto" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Naskiĝotago" + +#: lib/app.php:253 +msgid "Business" +msgstr "Negoco" + +#: lib/app.php:254 +msgid "Call" +msgstr "Voko" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Klientoj" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Liveranto" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Ferioj" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Ideoj" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Vojaĝo" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Jubileo" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Kunveno" + +#: lib/app.php:263 msgid "Personal" msgstr "Persona" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projektoj" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Demandoj" @@ -438,6 +482,14 @@ msgstr "Naskiĝtago de {name}" msgid "Contact" msgstr "Kontakto" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Aldoni kontakton" @@ -468,11 +520,11 @@ msgstr "Navigado" #: templates/index.php:42 msgid "Next contact in list" -msgstr "Sekva kontakto en la listo" +msgstr "Jena kontakto en la listo" #: templates/index.php:44 msgid "Previous contact in list" -msgstr "Malsekva kontakto en la listo" +msgstr "Maljena kontakto en la listo" #: templates/index.php:46 msgid "Expand/collapse current addressbook" @@ -480,11 +532,11 @@ msgstr "" #: templates/index.php:48 msgid "Next addressbook" -msgstr "Sekva adresaro" +msgstr "Jena adresaro" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "Malsekva adresaro" +msgstr "Maljena adresaro" #: templates/index.php:54 msgid "Actions" @@ -534,13 +586,18 @@ msgstr "Propra formo, Mallonga nomo, Longa nomo, Inversa aŭ Inversa kun komo" msgid "Edit name details" msgstr "Redakti detalojn de nomo" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizaĵo" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Forigi" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Kromnomo" @@ -548,7 +605,7 @@ msgstr "Kromnomo" msgid "Enter nickname" msgstr "Enigu kromnomon" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "TTT-ejo" @@ -564,7 +621,7 @@ msgstr "Iri al TTT-ejon" msgid "dd-mm-yyyy" msgstr "yyyy-mm-dd" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupoj" @@ -576,63 +633,84 @@ msgstr "Disigi grupojn per komoj" msgid "Edit groups" msgstr "Redakti grupojn" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferata" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Bonvolu specifi validan retpoŝtadreson." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Enigi retpoŝtadreson" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Retpoŝtmesaĝo al adreso" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Forigi retpoŝþadreson" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Enigi telefonnumeron" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Forigi telefonnumeron" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Vidi en mapo" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Redakti detalojn de adreso" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Aldoni notojn ĉi tie." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Aldoni kampon" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefono" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Retpoŝtadreso" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adreso" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Noto" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Elŝuti kontakton" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Forigi kontakton" @@ -803,19 +881,15 @@ msgstr "Vi ne havas kontaktojn en via adresaro" msgid "Add contact" msgstr "Aldoni kontakton" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Agordi adresarojn" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Elektu adresarojn" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Enigu nomon" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Enigu priskribon" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "Montri nur legeblan VCF-ligilon" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Elŝuti" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Redakti" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nova adresaro" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Nomo" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Priskribo" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Konservi" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Nuligi" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Pli..." diff --git a/l10n/eo/core.po b/l10n/eo/core.po index 8d72ea6ef5..fbea58f5dd 100644 --- a/l10n/eo/core.po +++ b/l10n/eo/core.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. # Michael Moroni , 2012. # , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-02 02:02+0200\n" -"PO-Revision-Date: 2012-08-02 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 16:36+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -35,55 +36,55 @@ msgstr "Ĉi tiu kategorio jam ekzistas: " msgid "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" msgstr "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" -#: js/js.js:185 templates/layout.user.php:64 templates/layout.user.php:65 +#: js/js.js:190 templates/layout.user.php:64 templates/layout.user.php:65 msgid "Settings" msgstr "Agordo" -#: js/js.js:573 +#: js/js.js:575 msgid "January" msgstr "Januaro" -#: js/js.js:573 +#: js/js.js:575 msgid "February" msgstr "Februaro" -#: js/js.js:573 +#: js/js.js:575 msgid "March" msgstr "Marto" -#: js/js.js:573 +#: js/js.js:575 msgid "April" msgstr "Aprilo" -#: js/js.js:573 +#: js/js.js:575 msgid "May" msgstr "Majo" -#: js/js.js:573 +#: js/js.js:575 msgid "June" msgstr "Junio" -#: js/js.js:574 +#: js/js.js:576 msgid "July" msgstr "Julio" -#: js/js.js:574 +#: js/js.js:576 msgid "August" msgstr "Aŭgusto" -#: js/js.js:574 +#: js/js.js:576 msgid "September" msgstr "Septembro" -#: js/js.js:574 +#: js/js.js:576 msgid "October" msgstr "Oktobro" -#: js/js.js:574 +#: js/js.js:576 msgid "November" msgstr "Novembro" -#: js/js.js:574 +#: js/js.js:576 msgid "December" msgstr "Decembro" diff --git a/l10n/eo/files.po b/l10n/eo/files.po index 365883ce5a..cc7ffcd01a 100644 --- a/l10n/eo/files.po +++ b/l10n/eo/files.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. # , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,87 +53,83 @@ msgstr "Malsukcesis skribo al disko" msgid "Files" msgstr "Dosieroj" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Forigi" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "jam ekzistas" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "anstataŭigi" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "nuligi" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "anstataŭigita" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "kun" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "malfari" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "forigita" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "generanta ZIP-dosiero, ĝi povas daŭri iom da tempo" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Ne eblis alŝuti vian dosieron ĉar ĝi estas dosierujo aŭ havas 0 duumokojn" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Alŝuta eraro" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Traktotaj" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "La alŝuto nuliĝis." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Nevalida nomo, “/” ne estas permesata." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Grando" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modifita" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "dosierujo" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "dosierujoj" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "dosiero" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "dosieroj" diff --git a/l10n/eo/files_encryption.po b/l10n/eo/files_encryption.po index 3e173e196c..dbcedb1a56 100644 --- a/l10n/eo/files_encryption.po +++ b/l10n/eo/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 19:41+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Ĉifrado" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Malinkluzivigi la jenajn dosiertipojn el ĉifrado" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Nenio" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Kapabligi ĉifradon" diff --git a/l10n/eo/files_external.po b/l10n/eo/files_external.po index 089953a728..11e4211e70 100644 --- a/l10n/eo/files_external.po +++ b/l10n/eo/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 22:09+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,64 +20,64 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Malena memorilo" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "Surmetingo" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "Motoro" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Agordo" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Malneproj" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "Aplikebla" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Aldoni surmetingon" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "Nenio agordita" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Ĉiuj uzantoj" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Grupoj" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Uzantoj" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Forigi" #: templates/settings.php:88 msgid "SSL root certificates" -msgstr "" +msgstr "Radikaj SSL-atestoj" #: templates/settings.php:102 msgid "Import Root Certificate" -msgstr "" +msgstr "Enporti radikan ateston" #: templates/settings.php:108 msgid "Enable User External Storage" -msgstr "" +msgstr "Kapabligi malenan memorilon de uzanto" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "Permesi al uzantoj surmeti siajn proprajn malenajn memorilojn" diff --git a/l10n/eo/files_sharing.po b/l10n/eo/files_sharing.po index ba8f508b66..f1afe86872 100644 --- a/l10n/eo/files_sharing.po +++ b/l10n/eo/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Forigi" diff --git a/l10n/eo/files_versions.po b/l10n/eo/files_versions.po index 0d6b7356f9..23851036ea 100644 --- a/l10n/eo/files_versions.po +++ b/l10n/eo/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 20:20+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Eksvalidigi ĉiujn eldonojn" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Kapabligi dosiereldonkontrolon" diff --git a/l10n/eo/media.po b/l10n/eo/media.po index cc7a61cea5..135087b52c 100644 --- a/l10n/eo/media.po +++ b/l10n/eo/media.po @@ -3,29 +3,30 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. # Michael Moroni , 2012. -# , 2011. +# , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Esperanto (http://www.transifex.net/projects/p/owncloud/language/eo/)\n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 16:47+0000\n" +"Last-Translator: Mariano \n" +"Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: eo\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:32 templates/player.php:8 +#: appinfo/app.php:45 templates/player.php:8 msgid "Music" msgstr "Muziko" #: js/music.js:18 msgid "Add album to playlist" -msgstr "" +msgstr "Aldoni albumon al ludlisto" #: templates/music.php:3 templates/player.php:12 msgid "Play" @@ -37,11 +38,11 @@ msgstr "Paŭzigi" #: templates/music.php:5 msgid "Previous" -msgstr "Antaŭa" +msgstr "Maljena" #: templates/music.php:6 templates/player.php:14 msgid "Next" -msgstr "Sekva" +msgstr "Jena" #: templates/music.php:7 msgid "Mute" diff --git a/l10n/eo/settings.po b/l10n/eo/settings.po index 44965561de..15e0d6d85a 100644 --- a/l10n/eo/settings.po +++ b/l10n/eo/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 17:13+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -73,23 +73,23 @@ msgstr "Sekureca averto" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "lanĉi unu taskon po ĉiu paĝo ŝargita" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php estas registrita kiel webcron-servilo" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "uzi la cron-servon de la sistemo" #: templates/admin.php:39 msgid "Log" -msgstr "Registro" +msgstr "Protokolo" #: templates/admin.php:67 msgid "More" @@ -228,8 +228,8 @@ msgid "Other" msgstr "Alia" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "Subadministranto" +msgid "Group Admin" +msgstr "Grupadministranto" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/eo/tasks.po b/l10n/eo/tasks.po index a829a6ae23..c53752bc4c 100644 --- a/l10n/eo/tasks.po +++ b/l10n/eo/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 14:52+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,88 +20,88 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Nevalida dato/horo" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Taskoj" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Neniu kategorio" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Nespecifita" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=plej alta" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=meza" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=plej malalta" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Malplena resumo" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Nevalida plenuma elcento" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Nevalida pligravo" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Aldoni taskon" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Ordigi laŭ limdato" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Ordigi laŭ listo" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Ordigi laŭ plenumo" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Ordigi laŭ loko" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Ordigi laŭ pligravo" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Ordigi laŭ etikedo" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Ŝargante taskojn..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Grava" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Pli" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Malpli" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Forigi" diff --git a/l10n/eo/user_ldap.po b/l10n/eo/user_ldap.po index 0a6274edd4..d83f307fe2 100644 --- a/l10n/eo/user_ldap.po +++ b/l10n/eo/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 14:28+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "Gastigo" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "Vi povas neglekti la protokolon, escepte se vi bezonas SSL-on. Tiuokaze, komencu per ldaps://" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Baz-DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" @@ -36,7 +37,7 @@ msgstr "" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "Uzanto-DN" #: templates/settings.php:10 msgid "" @@ -47,63 +48,63 @@ msgstr "" #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Pasvorto" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "Por sennoman aliron, lasu DN-on kaj Pasvorton malplenaj." #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "Filtrilo de uzantensaluto" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "Ĝi difinas la filtrilon aplikotan, kiam oni provas ensaluti. %%uid anstataŭigas la uzantonomon en la ensaluta ago." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "uzu la referencilon %%uid, ekz.: \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "Filtrilo de uzantolisto" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "Ĝi difinas la filtrilon aplikotan, kiam veniĝas uzantoj." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "sen ajna referencilo, ekz.: \"objectClass=person\"." #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "Filtrilo de grupo" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "Ĝi difinas la filtrilon aplikotan, kiam veniĝas grupoj." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "sen ajna referencilo, ekz.: \"objectClass=posixGroup\"." #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Pordo" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "Baza uzantarbo" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "Baza gruparbo" #: templates/settings.php:20 msgid "Group-Member association" @@ -111,19 +112,19 @@ msgstr "" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Uzi TLS-on" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "Ne uzu ĝin por SSL-konektoj, ĝi malsukcesos." #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "LDAP-servilo blinda je litergrandeco (Vindozo)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "Malkapabligi validkontrolon de SSL-atestiloj." #: templates/settings.php:23 msgid "" @@ -133,32 +134,32 @@ msgstr "" #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Ne rekomendata, uzu ĝin nur por testoj." #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "" +msgstr "Kampo de vidignomo de uzanto" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." -msgstr "" +msgstr "La atributo de LDAP uzota por generi la ownCloud-an nomon de la uzanto." #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "" +msgstr "Kampo de vidignomo de grupo" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." -msgstr "" +msgstr "La atributo de LDAP uzota por generi la ownCloud-an nomon de la grupo." #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "duumoke" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "sekunde. Ajna ŝanĝo malplenigas la kaŝmemoron." #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Helpo" diff --git a/l10n/eo/user_migrate.po b/l10n/eo/user_migrate.po index 079fff49c7..27ea6386b0 100644 --- a/l10n/eo/user_migrate.po +++ b/l10n/eo/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 19:36+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,33 +20,33 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Malenporti" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "" +msgstr "Io malsukcesis dum la enportota dosiero generiĝis" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "Eraro okazis" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "Malenporti vian uzantokonton" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "Ĉi tio kreos densigitan dosieron, kiu enhavas vian konton de ownCloud." #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "Enporti uzantokonton" #: templates/settings.php:15 msgid "ownCloud User Zip" -msgstr "" +msgstr "ZIP-dosiero de uzanto de ownCloud" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Enporti" diff --git a/l10n/eo/user_openid.po b/l10n/eo/user_openid.po index b982103d35..237164674b 100644 --- a/l10n/eo/user_openid.po +++ b/l10n/eo/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mariano , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 21:05+0000\n" +"Last-Translator: Mariano \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/owncloud/language/eo/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,36 +20,36 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "" +msgstr "Ĉi tio estas finpunkto de OpenID-servilo. Por pli da informo, vidu" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Idento: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Regno: " #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Uzanto: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Ensaluti" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "Eraro: neniu uzanto estas elektita" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" -msgstr "" +msgstr "Vi povas ensaluti en aliaj ejoj per tiu ĉi adreso" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "" +msgstr "Rajtigita OpenID-provizanto" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "" +msgstr "Via adreso ĉe Wordpress, Identi.ca…" diff --git a/l10n/es/admin_dependencies_chk.po b/l10n/es/admin_dependencies_chk.po index 4f43ec3c30..acbf8db12a 100644 --- a/l10n/es/admin_dependencies_chk.po +++ b/l10n/es/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Javier Llorente , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:01+0200\n" +"PO-Revision-Date: 2012-08-23 09:25+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -66,8 +67,8 @@ msgstr "" #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Estado de las dependencias" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Usado por:" diff --git a/l10n/es/contacts.po b/l10n/es/contacts.po index d3ffeee5d3..b437840d41 100644 --- a/l10n/es/contacts.po +++ b/l10n/es/contacts.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +28,7 @@ msgid "Error (de)activating addressbook." msgstr "Error al (des)activar libreta de direcciones." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "no se ha puesto ninguna ID." @@ -85,18 +85,18 @@ msgstr "Al menos uno de los campos de direcciones se tiene que rellenar." msgid "Trying to add duplicate property: " msgstr "Intentando añadir una propiedad duplicada: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Falta un parámetro del MI." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "MI desconocido:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "La información sobre el vCard es incorrecta. Por favor vuelve a cargar la página." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Error al borrar una propiedad del contacto." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Falta la ID" @@ -117,10 +117,6 @@ msgstr "La información sobre la vCard es incorrecta. Por favor, recarga la pág msgid "Something went FUBAR. " msgstr "Plof. Algo ha fallado." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Error al actualizar una propiedad del contacto." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -224,7 +220,7 @@ msgstr "Fallo no pudo cargara de una imagen temporal" msgid "No file was uploaded. Unknown error" msgstr "Fallo no se subió el fichero" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Contactos" @@ -241,57 +237,74 @@ msgid "Couldn't get a valid address." msgstr "Fallo : no hay dirección valida" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Fallo" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Este campo no puede estar vacío." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Fallo no podido ordenar los elementos" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "La propiedad de \"borrar\" se llamado sin argumentos envia fallos a\nbugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Edita el Nombre" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "No hay ficheros seleccionados para subir" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "El fichero que quieres subir excede el tamaño máximo permitido en este servidor." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Selecciona el tipo" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Resultado :" @@ -304,7 +317,7 @@ msgstr "Importado." msgid " failed." msgstr "Fallo." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -312,125 +325,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Esta no es tu agenda de contactos." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "No se ha podido encontrar el contacto." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Dirección" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Teléfono" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Correo electrónico" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organización" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "Google Talk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Trabajo" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Particular" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Móvil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Texto" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voz" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mensaje" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Vídeo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Localizador" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Cumpleaños" - -#: lib/app.php:184 -msgid "Business" -msgstr "Negocio" - -#: lib/app.php:185 -msgid "Call" -msgstr "Llamada" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Clientes" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Vacaciones" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Ideas" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Jornada" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Reunión" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Otro" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Móvil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voz" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mensaje" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Vídeo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Localizador" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Cumpleaños" + +#: lib/app.php:253 +msgid "Business" +msgstr "Negocio" + +#: lib/app.php:254 +msgid "Call" +msgstr "Llamada" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Clientes" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Vacaciones" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Ideas" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Jornada" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Reunión" + +#: lib/app.php:263 msgid "Personal" msgstr "Personal" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Proyectos" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Preguntas" @@ -442,6 +486,14 @@ msgstr "Cumpleaños de {name}" msgid "Contact" msgstr "Contacto" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Añadir contacto" @@ -504,7 +556,7 @@ msgstr "Añadir un nuevo contacto" #: templates/index.php:61 msgid "Add new addressbook" -msgstr "" +msgstr "Añadir nueva libreta de direcciones" #: templates/index.php:63 msgid "Delete current contact" @@ -538,13 +590,18 @@ msgstr "Formato personalizado, nombre abreviado, nombre completo, al revés o al msgid "Edit name details" msgstr "Editar los detalles del nombre" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organización" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Borrar" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Alias" @@ -552,23 +609,23 @@ msgstr "Alias" msgid "Enter nickname" msgstr "Introduce un alias" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Sitio Web" #: templates/part.contact.php:44 msgid "http://www.somesite.com" -msgstr "" +msgstr "http://www.unsitio.com" #: templates/part.contact.php:44 msgid "Go to web site" -msgstr "" +msgstr "Ir al sitio Web" #: templates/part.contact.php:46 msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupos" @@ -580,63 +637,84 @@ msgstr "Separa los grupos con comas" msgid "Edit groups" msgstr "Editar grupos" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferido" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Por favor especifica una dirección de correo electrónico válida." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Introduce una dirección de correo electrónico" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Enviar por correo a la dirección" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Eliminar dirección de correo electrónico" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Introduce un número de teléfono" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Eliminar número de teléfono" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Mensajero instantáneo" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Ver en el mapa" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Editar detalles de la dirección" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Añade notas aquí." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Añadir campo" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Teléfono" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Correo electrónico" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Mensajería instantánea" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Dirección" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Descargar contacto" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Eliminar contacto" @@ -663,7 +741,7 @@ msgstr "" #: templates/part.edit_address_dialog.php:27 msgid "Street and number" -msgstr "" +msgstr "Calle y número" #: templates/part.edit_address_dialog.php:30 msgid "Extended" @@ -671,7 +749,7 @@ msgstr "Extendido" #: templates/part.edit_address_dialog.php:33 msgid "Apartment number etc." -msgstr "" +msgstr "Número del apartamento, etc." #: templates/part.edit_address_dialog.php:36 #: templates/part.edit_address_dialog.php:39 @@ -684,7 +762,7 @@ msgstr "Región" #: templates/part.edit_address_dialog.php:45 msgid "E.g. state or province" -msgstr "" +msgstr "Ej: región o provincia" #: templates/part.edit_address_dialog.php:48 msgid "Zipcode" @@ -807,19 +885,15 @@ msgstr "No hay contactos en tu agenda." msgid "Add contact" msgstr "Añadir contacto" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Configurar agenda" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Introducir nombre" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Introducir descripción" @@ -848,33 +922,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "Compartir" + +#: templates/settings.php:29 msgid "Download" msgstr "Descargar" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editar" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nueva libreta de direcciones" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Nombre" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Descripción" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Guardar" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Cancelar" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Más..." diff --git a/l10n/es/core.po b/l10n/es/core.po index 0dfd58a77a..5139dfe014 100644 --- a/l10n/es/core.po +++ b/l10n/es/core.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-02 02:02+0200\n" -"PO-Revision-Date: 2012-08-02 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:17+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -29,7 +29,7 @@ msgstr "Nombre de la aplicación no provisto." #: ajax/vcategories/add.php:29 msgid "No category to add?" -msgstr "¿Ninguna categoría para agregar?" +msgstr "¿Ninguna categoría para añadir?" #: ajax/vcategories/add.php:36 msgid "This category already exists: " @@ -39,55 +39,55 @@ msgstr "Esta categoría ya existe: " msgid "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" msgstr "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" -#: js/js.js:185 templates/layout.user.php:64 templates/layout.user.php:65 +#: js/js.js:190 templates/layout.user.php:64 templates/layout.user.php:65 msgid "Settings" msgstr "Ajustes" -#: js/js.js:573 +#: js/js.js:575 msgid "January" msgstr "Enero" -#: js/js.js:573 +#: js/js.js:575 msgid "February" msgstr "Febrero" -#: js/js.js:573 +#: js/js.js:575 msgid "March" msgstr "Marzo" -#: js/js.js:573 +#: js/js.js:575 msgid "April" msgstr "Abril" -#: js/js.js:573 +#: js/js.js:575 msgid "May" msgstr "Mayo" -#: js/js.js:573 +#: js/js.js:575 msgid "June" msgstr "Junio" -#: js/js.js:574 +#: js/js.js:576 msgid "July" msgstr "Julio" -#: js/js.js:574 +#: js/js.js:576 msgid "August" msgstr "Agosto" -#: js/js.js:574 +#: js/js.js:576 msgid "September" msgstr "Septiembre" -#: js/js.js:574 +#: js/js.js:576 msgid "October" msgstr "Octubre" -#: js/js.js:574 +#: js/js.js:576 msgid "November" msgstr "Noviembre" -#: js/js.js:574 +#: js/js.js:576 msgid "December" msgstr "Diciembre" @@ -105,11 +105,11 @@ msgstr "Sí" #: js/oc-dialogs.js:177 msgid "Ok" -msgstr "Vale" +msgstr "Aceptar" #: js/oc-vcategories.js:68 msgid "No categories selected for deletion." -msgstr "No hay categorias seleccionadas para borrar." +msgstr "No hay categorías seleccionadas para borrar." #: js/oc-vcategories.js:68 msgid "Error" diff --git a/l10n/es/files.po b/l10n/es/files.po index 642d976601..d7855d52e0 100644 --- a/l10n/es/files.po +++ b/l10n/es/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,87 +54,83 @@ msgstr "La escritura en disco ha fallado" msgid "Files" msgstr "Archivos" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "No compartir" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Eliminado" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "ya existe" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "reemplazar" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "cancelar" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "reemplazado" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "con" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "deshacer" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "borrado" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "generando un fichero ZIP, puede llevar un tiempo." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "No ha sido posible subir tu archivo porque es un directorio o tiene 0 bytes" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Error al subir el archivo" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Pendiente" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Subida cancelada." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Nombre no válido, '/' no está permitido." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Tamaño" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificado" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "carpeta" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "carpetas" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "archivo" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "archivos" diff --git a/l10n/es/files_encryption.po b/l10n/es/files_encryption.po index 32c5cd8587..4c88d29c38 100644 --- a/l10n/es/files_encryption.po +++ b/l10n/es/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 21:47+0000\n" +"Last-Translator: juanman \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Cifrado" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" diff --git a/l10n/es/files_external.po b/l10n/es/files_external.po index 17fbc463fd..2a26b728a9 100644 --- a/l10n/es/files_external.po +++ b/l10n/es/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Javier Llorente , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:26+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Almacenamiento externo" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" @@ -27,43 +28,43 @@ msgstr "" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "Motor" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Configuración" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Opciones" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "Aplicable" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Añadir punto de montaje" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "No se ha configurado" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Todos los usuarios" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Grupos" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Usuarios" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Eliiminar" #: templates/settings.php:88 msgid "SSL root certificates" diff --git a/l10n/es/files_sharing.po b/l10n/es/files_sharing.po index 6e4610baa0..e53147b10f 100644 --- a/l10n/es/files_sharing.po +++ b/l10n/es/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Javier Llorente , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:11+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Tamaño" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Modificado" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Eliminar todo" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Eliminar" diff --git a/l10n/es/files_versions.po b/l10n/es/files_versions.po index 48608fd407..0b5cfbe22c 100644 --- a/l10n/es/files_versions.po +++ b/l10n/es/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Javier Llorente , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:28+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,4 +24,4 @@ msgstr "" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Habilitar versionamiento de archivos" diff --git a/l10n/es/settings.po b/l10n/es/settings.po index 6f0dea3abe..4fadce58dc 100644 --- a/l10n/es/settings.po +++ b/l10n/es/settings.po @@ -15,9 +15,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:14+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,15 +27,15 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "Imposible cargar la lista desde App Store" +msgstr "Imposible cargar la lista desde el App Store" #: ajax/lostpassword.php:14 msgid "Email saved" -msgstr "Correo salvado" +msgstr "Correo guardado" #: ajax/lostpassword.php:16 msgid "Invalid email" -msgstr "Correo Incorrecto" +msgstr "Correo no válido" #: ajax/openid.php:16 msgid "OpenID Changed" @@ -67,7 +67,7 @@ msgstr "Activar" #: js/personal.js:69 msgid "Saving..." -msgstr "Salvando.." +msgstr "Guardando..." #: personal.php:46 personal.php:47 msgid "__language_name__" @@ -79,19 +79,19 @@ msgstr "Advertencia de seguridad" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "ejecutar una tarea con cada página cargada" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php se registra en un servicio webcron" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "usar servicio cron del sistema" #: templates/admin.php:39 msgid "Log" @@ -111,7 +111,7 @@ msgstr "Seleccionar una aplicación" #: templates/apps.php:29 msgid "See application page at apps.owncloud.com" -msgstr "Revisa la web de apps apps.owncloud.com" +msgstr "Echa un vistazo a la web de aplicaciones apps.owncloud.com" #: templates/apps.php:30 msgid "-licensed" @@ -234,8 +234,8 @@ msgid "Other" msgstr "Otro" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "Grupo admin" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/es/tasks.po b/l10n/es/tasks.po index 79d624ab38..c7be467fb0 100644 --- a/l10n/es/tasks.po +++ b/l10n/es/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-17 17:39+0000\n" +"Last-Translator: juanman \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,88 +20,88 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Fecha/hora inválida" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Tareas" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Sin categoría" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Sin especificar" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=mayor" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=media" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=menor" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Resumen vacío" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Porcentaje completado inválido" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Prioridad inválida" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Agregar tarea" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Ordenar por" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Ordenar por lista" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Ordenar por completadas" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Ordenar por ubicación" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Ordenar por prioridad" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Ordenar por etiqueta" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Cargando tareas..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Importante" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Más" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Menos" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Borrar" diff --git a/l10n/es/user_ldap.po b/l10n/es/user_ldap.po index 4b0620e455..11d0ce6c53 100644 --- a/l10n/es/user_ldap.po +++ b/l10n/es/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Javier Llorente , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:28+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,7 +48,7 @@ msgstr "" #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Contraseña" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." @@ -95,7 +96,7 @@ msgstr "" #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Puerto" #: templates/settings.php:18 msgid "Base User Tree" @@ -111,7 +112,7 @@ msgstr "" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Usar TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." @@ -153,7 +154,7 @@ msgstr "" #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "en bytes" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." @@ -161,4 +162,4 @@ msgstr "" #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Ayuda" diff --git a/l10n/es/user_migrate.po b/l10n/es/user_migrate.po index aba673bd3f..fbd0617741 100644 --- a/l10n/es/user_migrate.po +++ b/l10n/es/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Javier Llorente , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:30+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Exportar" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" @@ -44,8 +45,8 @@ msgstr "" #: templates/settings.php:15 msgid "ownCloud User Zip" -msgstr "" +msgstr "Zip de usuario de ownCloud" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Importar" diff --git a/l10n/es/user_openid.po b/l10n/es/user_openid.po index 8d6e1cc908..efed4f72da 100644 --- a/l10n/es/user_openid.po +++ b/l10n/es/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Javier Llorente , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 09:24+0000\n" +"Last-Translator: Javier Llorente \n" "Language-Team: Spanish (http://www.transifex.com/projects/p/owncloud/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +24,7 @@ msgstr "" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Identidad: " #: templates/nomode.php:15 msgid "Realm: " @@ -31,11 +32,11 @@ msgstr "" #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Usuario: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Iniciar sesión" #: templates/nomode.php:22 msgid "Error: No user Selected" diff --git a/l10n/et_EE/admin_dependencies_chk.po b/l10n/et_EE/admin_dependencies_chk.po index 589ff81c36..4e1dc1ab0c 100644 --- a/l10n/et_EE/admin_dependencies_chk.po +++ b/l10n/et_EE/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:47+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "php-json moodul on vajalik paljude rakenduse poolt omvahelise suhtlemise jaoks" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "php-curl moodul on vajalik lehe pealkirja tõmbamiseks järjehoidja lisamisel" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "php-gd moodul on vajalik sinu piltidest pisipiltide loomiseks" #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "php-ldap moodul on vajalik sinu ldap serveriga ühendumiseks" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "php-zip moodul on vajalik mitme faili korraga alla laadimiseks" #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "php-mb_multibyte moodul on vajalik kodeerimise korrektseks haldamiseks." #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "php-ctype moodul on vajalik andmete kontrollimiseks." #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "php-xml moodul on vajalik failide jagamiseks webdav-iga." #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "Sinu php.ini failis oleva direktiivi allow_url_fopen väärtuseks peaks määrama 1, et saaks tõmmata teadmistebaasi OCS-i serveritest" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "php-pdo moodul on vajalik owncloudi andmete salvestamiseks andmebaasi." #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Sõltuvuse staatus" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Kasutab :" diff --git a/l10n/et_EE/admin_migrate.po b/l10n/et_EE/admin_migrate.po index c6f5f7eb0d..1e02b72409 100644 --- a/l10n/et_EE/admin_migrate.po +++ b/l10n/et_EE/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:41+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Ekspordi see ownCloudi paigaldus" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "See loob pakitud faili, milles on sinu owncloudi paigalduse andmed.\n Palun vali eksporditava faili tüüp:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Ekspordi" diff --git a/l10n/et_EE/contacts.po b/l10n/et_EE/contacts.po index 74db6a2d97..076195c05e 100644 --- a/l10n/et_EE/contacts.po +++ b/l10n/et_EE/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "Viga aadressiraamatu (de)aktiveerimisel." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID on määramata." @@ -80,18 +80,18 @@ msgstr "Vähemalt üks aadressiväljadest peab olema täidetud." msgid "Trying to add duplicate property: " msgstr "Proovitakse lisada topeltomadust: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Visiitkaardi info pole korrektne. Palun lae leht uuesti." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Viga konktaki korralikul kustutamisel." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Puudub ID" @@ -112,10 +112,6 @@ msgstr "vCard info pole korrektne. Palun lae lehekülg uuesti: " msgid "Something went FUBAR. " msgstr "Midagi läks tõsiselt metsa." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Viga konktaki korralikul uuendamisel." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "Ajutise pildi laadimine ebaõnnestus: " msgid "No file was uploaded. Unknown error" msgstr "Ühtegi faili ei laetud üles. Tundmatu viga" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontaktid" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "Kehtiva aadressi hankimine ebaõnnestus" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Viga" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "See omadus ei tohi olla tühi." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Muuda nime" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Üleslaadimiseks pole faile valitud." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Vali tüüp" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Tulemus: " @@ -299,7 +312,7 @@ msgstr " imporditud, " msgid " failed." msgstr " ebaõnnestus." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "See pole sinu aadressiraamat." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakti ei leitud." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Aadress" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-post" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisatsioon" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Töö" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Kodu" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobiil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Tekst" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Hääl" - -#: lib/app.php:137 -msgid "Message" -msgstr "Sõnum" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faks" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Piipar" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Sünnipäev" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobiil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Hääl" + +#: lib/app.php:205 +msgid "Message" +msgstr "Sõnum" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Piipar" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Sünnipäev" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "{name} sünnipäev" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Lisa kontakt" @@ -533,13 +585,18 @@ msgstr "Kohandatud vorming, Lühike nimi, Täielik nimi, vastupidine või vastup msgid "Edit name details" msgstr "Muuda nime üksikasju" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisatsioon" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Kustuta" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Hüüdnimi" @@ -547,7 +604,7 @@ msgstr "Hüüdnimi" msgid "Enter nickname" msgstr "Sisesta hüüdnimi" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd.mm.yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupid" @@ -575,63 +632,84 @@ msgstr "Eralda grupid komadega" msgid "Edit groups" msgstr "Muuda gruppe" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Eelistatud" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Palun sisesta korrektne e-posti aadress." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Sisesta e-posti aadress" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Kiri aadressile" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Kustuta e-posti aadress" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Sisesta telefoninumber" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Kustuta telefoninumber" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Vaata kaardil" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Muuda aaressi infot" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Lisa märkmed siia." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Lisa väli" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-post" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Aadress" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Märkus" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Lae kontakt alla" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Kustuta kontakt" @@ -802,19 +880,15 @@ msgstr "Sinu aadressiraamatus pole ühtegi kontakti." msgid "Add contact" msgstr "Lisa kontakt" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Seadista aadressiraamatuid" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Lae alla" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Muuda" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Uus aadressiraamat" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Salvesta" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Loobu" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/et_EE/files.po b/l10n/et_EE/files.po index 3c6cb58d64..5585c7eb69 100644 --- a/l10n/et_EE/files.po +++ b/l10n/et_EE/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "Kettale kirjutamine ebaõnnestus" msgid "Files" msgstr "Failid" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Kustuta" @@ -80,59 +76,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-faili loomine, see võib veidi aega võtta." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Sinu faili üleslaadimine ebaõnnestus, kuna see on kaust või selle suurus on 0 baiti" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Üleslaadimise viga" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Ootel" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Üleslaadimine tühistati." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Vigane nimi, '/' pole lubatud." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Suurus" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Muudetud" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "kaust" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "kausta" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fail" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "faili" diff --git a/l10n/et_EE/files_encryption.po b/l10n/et_EE/files_encryption.po index de81587c37..8a0593fa33 100644 --- a/l10n/et_EE/files_encryption.po +++ b/l10n/et_EE/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:39+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Krüpteerimine" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Järgnevaid failitüüpe ära krüpteeri" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Pole" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Luba krüpteerimine" diff --git a/l10n/et_EE/files_external.po b/l10n/et_EE/files_external.po index 3321a99e08..3daaecb163 100644 --- a/l10n/et_EE/files_external.po +++ b/l10n/et_EE/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:32+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,11 +20,11 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Väline salvestuskoht" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "Ühenduspunkt" #: templates/settings.php:8 msgid "Backend" @@ -31,11 +32,11 @@ msgstr "" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Seadistamine" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Valikud" #: templates/settings.php:11 msgid "Applicable" @@ -43,27 +44,27 @@ msgstr "" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Lisa ühenduspunkt" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "Pole määratud" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Kõik kasutajad" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Grupid" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Kasutajad" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Kustuta" #: templates/settings.php:88 msgid "SSL root certificates" diff --git a/l10n/et_EE/files_sharing.po b/l10n/et_EE/files_sharing.po index 6a3fc45f75..ebe1c5cb9b 100644 --- a/l10n/et_EE/files_sharing.po +++ b/l10n/et_EE/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: et_EE\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Kustutamine" diff --git a/l10n/et_EE/files_versions.po b/l10n/et_EE/files_versions.po index dccf6069c5..fd569f5b70 100644 --- a/l10n/et_EE/files_versions.po +++ b/l10n/et_EE/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:33+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Kõikide versioonide aegumine" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Luba failide versioonihaldus" diff --git a/l10n/et_EE/settings.po b/l10n/et_EE/settings.po index e5e997d139..c41361db04 100644 --- a/l10n/et_EE/settings.po +++ b/l10n/et_EE/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "Muu" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/et_EE/tasks.po b/l10n/et_EE/tasks.po index 310756cc69..042e2c4864 100644 --- a/l10n/et_EE/tasks.po +++ b/l10n/et_EE/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:36+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,88 +20,88 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Vigane kuupäev/kellaaeg" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Ülesanded" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Kategooriat pole" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Määramata" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=kõrgeim" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=keskmine" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=madalaim" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Tühi kokkuvõte" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Vigane edenemise protsent" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Vigane tähtsus" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Lisa ülesanne" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Tähtaja järgi" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Nimekirja järgi" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Edenemise järgi" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Asukoha järgi" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Tähtsuse järjekorras" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Sildi järgi" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Ülesannete laadimine..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Tähtis" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Rohkem" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Vähem" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Kustuta" diff --git a/l10n/et_EE/user_openid.po b/l10n/et_EE/user_openid.po index 7944fd1d36..8be57b5de2 100644 --- a/l10n/et_EE/user_openid.po +++ b/l10n/et_EE/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Rivo Zängov , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:48+0000\n" +"Last-Translator: Rivo Zängov \n" "Language-Team: Estonian (Estonia) (http://www.transifex.com/projects/p/owncloud/language/et_EE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,15 +20,15 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "" +msgstr "See on OpenID serveri lõpp-punkt. Lisainfot vaata" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Identiteet: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Tsoon: " #: templates/nomode.php:16 msgid "User: " diff --git a/l10n/eu/contacts.po b/l10n/eu/contacts.po index df6730af06..3cb1eea28f 100644 --- a/l10n/eu/contacts.po +++ b/l10n/eu/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "Errore bat egon da helbide-liburua (des)gaitzen" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "IDa ez da ezarri." @@ -82,18 +82,18 @@ msgstr "Behintzat helbide eremuetako bat bete behar da." msgid "Trying to add duplicate property: " msgstr "Propietate bikoiztuta gehitzen saiatzen ari zara:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Errore bat egon da kontaktuaren propietatea gehitzean:" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "vCard-aren inguruko informazioa okerra da. Mesedez birkargatu orrialdea." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Errorea kontaktu propietatea ezabatzean." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID falta da" @@ -114,10 +114,6 @@ msgstr "vCard honen informazioa ez da zuzena.Mezedez birkargatu orria:" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Errorea kontaktu propietatea eguneratzean." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "Ezin izan da aldi bateko irudia kargatu:" msgid "No file was uploaded. Unknown error" msgstr "Ez da fitxategirik igo. Errore ezezaguna" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontaktuak" @@ -238,57 +234,74 @@ msgid "Couldn't get a valid address." msgstr "Ezin izan da eposta baliagarri bat hartu." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Errorea" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Propietate hau ezin da hutsik egon." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Ezin izan dira elementuak serializatu." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' argumenturik gabe deitu da. Mezedez abisatu bugs.owncloud.org-en" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Editatu izena" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Ez duzu igotzeko fitxategirik hautatu." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Igo nahi duzun fitxategia zerbitzariak onartzen duen tamaina baino handiagoa da." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Hautatu mota" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Emaitza:" @@ -301,7 +314,7 @@ msgstr " inportatua, " msgid " failed." msgstr "huts egin du." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -309,125 +322,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Hau ez da zure helbide liburua." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Ezin izan da kontaktua aurkitu." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Helbidea" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefonoa" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Eposta" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Erakundea" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Lana" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Etxea" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mugikorra" - -#: lib/app.php:135 -msgid "Text" -msgstr "Testua" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Ahotsa" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mezua" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax-a" - -#: lib/app.php:139 -msgid "Video" -msgstr "Bideoa" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Bilagailua" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Jaioteguna" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "Deia" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Bezeroak" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Oporrak" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Ideiak" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Bidaia" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Bilera" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Bestelakoa" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mugikorra" + +#: lib/app.php:203 +msgid "Text" +msgstr "Testua" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Ahotsa" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mezua" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax-a" + +#: lib/app.php:207 +msgid "Video" +msgstr "Bideoa" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Bilagailua" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Jaioteguna" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "Deia" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Bezeroak" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Oporrak" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Ideiak" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Bidaia" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Bilera" + +#: lib/app.php:263 msgid "Personal" msgstr "Pertsonala" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Proiektuak" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Galderak" @@ -439,6 +483,14 @@ msgstr "{name}ren jaioteguna" msgid "Contact" msgstr "Kontaktua" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Gehitu kontaktua" @@ -535,13 +587,18 @@ msgstr "" msgid "Edit name details" msgstr "Editatu izenaren zehaztasunak" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Erakundea" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Ezabatu" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Ezizena" @@ -549,7 +606,7 @@ msgstr "Ezizena" msgid "Enter nickname" msgstr "Sartu ezizena" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Web orria" @@ -565,7 +622,7 @@ msgstr "Web orrira joan" msgid "dd-mm-yyyy" msgstr "yyyy-mm-dd" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Taldeak" @@ -577,63 +634,84 @@ msgstr "Banatu taldeak komekin" msgid "Edit groups" msgstr "Editatu taldeak" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Hobetsia" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Mesedez sartu eposta helbide egoki bat" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Sartu eposta helbidea" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Bidali helbidera" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Ezabatu eposta helbidea" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Sartu telefono zenbakia" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Ezabatu telefono zenbakia" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Ikusi mapan" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Editatu helbidearen zehaztasunak" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Gehitu oharrak hemen." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Gehitu eremua" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefonoa" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Eposta" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Helbidea" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Oharra" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Deskargatu kontaktua" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Ezabatu kontaktua" @@ -804,19 +882,15 @@ msgstr "Ez duzu kontakturik zure helbide liburuan." msgid "Add contact" msgstr "Gehitu kontaktua" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Konfiguratu helbide liburuak" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Hautatu helbide-liburuak" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Sartu izena" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Sartu deskribapena" @@ -845,33 +919,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Deskargatu" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editatu" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Helbide-liburu berria" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Gorde" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Ezeztatu" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/eu/files.po b/l10n/eu/files.po index e62061a695..d450fd0522 100644 --- a/l10n/eu/files.po +++ b/l10n/eu/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,87 +53,83 @@ msgstr "Errore bat izan da diskoan idazterakoan" msgid "Files" msgstr "Fitxategiak" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Ezabatu" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "dagoeneko existitzen da" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "ordeztu" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "ezeztatu" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "ordeztua" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "honekin" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "desegin" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "ezabatuta" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-fitxategia sortzen ari da, denbora har dezake" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Ezin da zure fitxategia igo, karpeta bat da edo 0 byt ditu" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Igotzean errore bat suertatu da" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Zain" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Igoera ezeztatuta" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Baliogabeko izena, '/' ezin da erabili. " -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Tamaina" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Aldatuta" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "karpeta" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "Karpetak" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fitxategia" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "fitxategiak" diff --git a/l10n/eu/files_sharing.po b/l10n/eu/files_sharing.po index 1851e89cc8..d316bfa649 100644 --- a/l10n/eu/files_sharing.po +++ b/l10n/eu/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: eu\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/eu/settings.po b/l10n/eu/settings.po index fc694e5559..d7ebcc2b28 100644 --- a/l10n/eu/settings.po +++ b/l10n/eu/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (http://www.transifex.com/projects/p/owncloud/language/eu/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -229,8 +229,8 @@ msgid "Other" msgstr "Besteak" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/eu_ES/contacts.po b/l10n/eu_ES/contacts.po index c0c80cfb38..0ef5f51a80 100644 --- a/l10n/eu_ES/contacts.po +++ b/l10n/eu_ES/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/owncloud/language/eu_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/eu_ES/files.po b/l10n/eu_ES/files.po index 9b84201583..cf36b73d5b 100644 --- a/l10n/eu_ES/files.po +++ b/l10n/eu_ES/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/owncloud/language/eu_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/eu_ES/files_sharing.po b/l10n/eu_ES/files_sharing.po index a9203e1818..0ba46e6c77 100644 --- a/l10n/eu_ES/files_sharing.po +++ b/l10n/eu_ES/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/owncloud/language/eu_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: eu_ES\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/eu_ES/settings.po b/l10n/eu_ES/settings.po index d750261466..82cc89a620 100644 --- a/l10n/eu_ES/settings.po +++ b/l10n/eu_ES/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Basque (Spain) (http://www.transifex.com/projects/p/owncloud/language/eu_ES/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/fa/bookmarks.po b/l10n/fa/bookmarks.po index 1a79cdbe0a..c4649e206b 100644 --- a/l10n/fa/bookmarks.po +++ b/l10n/fa/bookmarks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mohammad Dashtizadeh , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:17+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:19+0000\n" +"Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,11 +20,11 @@ msgstr "" #: appinfo/app.php:14 msgid "Bookmarks" -msgstr "" +msgstr "نشانک‌ها" #: bookmarksHelper.php:99 msgid "unnamed" -msgstr "" +msgstr "بدون‌نام" #: templates/bookmarklet.php:5 msgid "" @@ -37,11 +38,11 @@ msgstr "" #: templates/list.php:13 msgid "Address" -msgstr "" +msgstr "آدرس" #: templates/list.php:14 msgid "Title" -msgstr "" +msgstr "عنوان" #: templates/list.php:15 msgid "Tags" @@ -49,11 +50,11 @@ msgstr "" #: templates/list.php:16 msgid "Save bookmark" -msgstr "" +msgstr "ذخیره نشانک" #: templates/list.php:22 msgid "You have no bookmarks" -msgstr "" +msgstr "شما هیچ نشانکی ندارید" #: templates/settings.php:11 msgid "Bookmarklet
    " diff --git a/l10n/fa/contacts.po b/l10n/fa/contacts.po index 585d7ae6c2..92daf2d9db 100644 --- a/l10n/fa/contacts.po +++ b/l10n/fa/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "خطا در (غیر) فعال سازی کتابچه نشانه ها" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "شناسه تعیین نشده" @@ -80,18 +80,18 @@ msgstr "At least one of the address fields has to be filled out. " msgid "Trying to add duplicate property: " msgstr "امتحان کردن برای وارد کردن مشخصات تکراری" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "اطلاعات درمورد vCard شما اشتباه است لطفا صفحه را دوباره بار گذاری کنید" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "خطا در هنگام پاک کرد ویژگی" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "نشانی گم شده" @@ -112,10 +112,6 @@ msgstr "اطلاعات کارت ویزا شما غلط است لطفا صفحه msgid "Something went FUBAR. " msgstr "چند چیز به FUBAR رفتند" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "خطا در هنگام بروزرسانی اطلاعات شخص مورد نظر" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "قابلیت بارگذاری تصویر موقت وجود ندارد:" msgid "No file was uploaded. Unknown error" msgstr "هیچ فایلی آپلود نشد.خطای ناشناس" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "اشخاص" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "Couldn't get a valid address." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "خطا" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "این ویژگی باید به صورت غیر تهی عمل کند" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "قابلیت مرتب سازی عناصر وجود ندارد" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "پاک کردن ویژگی بدون استدلال انجام شده.لطفا این مورد را گزارش دهید:bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "نام تغییر" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "هیچ فایلی برای آپلود انتخاب نشده است" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "حجم فایل بسیار بیشتر از حجم تنظیم شده در تنظیمات سرور است" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "نوع را انتخاب کنید" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "نتیجه:" @@ -299,7 +312,7 @@ msgstr "وارد شد،" msgid " failed." msgstr "ناموفق" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "این کتابچه ی نشانه های شما نیست" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "اتصال ویا تماسی یافت نشد" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "نشانی" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "تلفن" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "نشانی پست الکترنیک" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "نهاد(ارگان)" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "کار" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "خانه" -#: lib/app.php:133 -msgid "Mobile" -msgstr "موبایل" - -#: lib/app.php:135 -msgid "Text" -msgstr "متن" - -#: lib/app.php:136 -msgid "Voice" -msgstr "صدا" - -#: lib/app.php:137 -msgid "Message" -msgstr "پیغام" - -#: lib/app.php:138 -msgid "Fax" -msgstr "دورنگار:" - -#: lib/app.php:139 -msgid "Video" -msgstr "رسانه تصویری" - -#: lib/app.php:140 -msgid "Pager" -msgstr "صفحه" - -#: lib/app.php:146 -msgid "Internet" -msgstr "اینترنت" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "روزتولد" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "موبایل" + +#: lib/app.php:203 +msgid "Text" +msgstr "متن" + +#: lib/app.php:204 +msgid "Voice" +msgstr "صدا" + +#: lib/app.php:205 +msgid "Message" +msgstr "پیغام" + +#: lib/app.php:206 +msgid "Fax" +msgstr "دورنگار:" + +#: lib/app.php:207 +msgid "Video" +msgstr "رسانه تصویری" + +#: lib/app.php:208 +msgid "Pager" +msgstr "صفحه" + +#: lib/app.php:215 +msgid "Internet" +msgstr "اینترنت" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "روزتولد" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "روز تولد {name} است" msgid "Contact" msgstr "اشخاص" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "افزودن اطلاعات شخص مورد نظر" @@ -533,13 +585,18 @@ msgstr "Format custom, Short name, Full name, Reverse or Reverse with comma" msgid "Edit name details" msgstr "ویرایش نام جزئیات" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "نهاد(ارگان)" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "پاک کردن" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "نام مستعار" @@ -547,7 +604,7 @@ msgstr "نام مستعار" msgid "Enter nickname" msgstr "یک نام مستعار وارد کنید" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "گروه ها" @@ -575,63 +632,84 @@ msgstr "جدا کردن گروه ها به وسیله درنگ نما" msgid "Edit groups" msgstr "ویرایش گروه ها" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "مقدم" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "لطفا یک پست الکترونیکی معتبر وارد کنید" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "یک پست الکترونیکی وارد کنید" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "به نشانی ارسال شد" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "پاک کردن نشانی پست الکترونیکی" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "شماره تلفن راوارد کنید" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "پاک کردن شماره تلفن" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "دیدن روی نقشه" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "ویرایش جزئیات نشانی ها" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "اینجا یادداشت ها را بیافزایید" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "اضافه کردن فیلد" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "شماره تلفن" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "نشانی پست الکترنیک" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "نشانی" + +#: templates/part.contact.php:133 msgid "Note" msgstr "یادداشت" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "دانلود مشخصات اشخاص" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "پاک کردن اطلاعات شخص مورد نظر" @@ -802,19 +880,15 @@ msgstr "شماهیچ شخصی در کتابچه نشانی خود ندارید" msgid "Add contact" msgstr "افزودن اطلاعات شخص مورد نظر" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "پیکربندی کتابچه ی نشانی ها" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "بارگیری" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "ویرایش" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "کتابچه نشانه های جدید" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "ذخیره سازی" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "انصراف" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/fa/files.po b/l10n/fa/files.po index d83a2a2427..5dc2cb2c38 100644 --- a/l10n/fa/files.po +++ b/l10n/fa/files.po @@ -4,14 +4,15 @@ # # Translators: # Hossein nag , 2012. +# Mohammad Dashtizadeh , 2012. # vahid chakoshy , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-07 02:04+0200\n" -"PO-Revision-Date: 2012-08-06 01:10+0000\n" -"Last-Translator: vahid chakoshy \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:17+0000\n" +"Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +54,7 @@ msgstr "نوشتن بر روی دیسک سخت ناموفق بود" msgid "Files" msgstr "فایل ها" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "پاک کردن" @@ -67,73 +64,73 @@ msgstr "وجود دارد" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "جایگزین" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "لغو" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "جایگزین‌شده" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "همراه" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "بازگشت" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "حذف شده" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "در حال ساخت فایل فشرده ممکن است زمان زیادی به طول بیانجامد" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "ناتوان در بارگذاری یا فایل یک پوشه است یا 0بایت دارد" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "خطا در بار گذاری" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "در انتظار" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "بار گذاری لغو شد" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "نام نامناسب '/' غیرفعال است" -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "اندازه" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "تغییر یافته" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "پوشه" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "پوشه ها" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "پرونده" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "پرونده ها" diff --git a/l10n/fa/files_encryption.po b/l10n/fa/files_encryption.po index ff23cb72c9..d1409ea24b 100644 --- a/l10n/fa/files_encryption.po +++ b/l10n/fa/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mohammad Dashtizadeh , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:18+0000\n" +"Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "رمزگذاری" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" @@ -27,8 +28,8 @@ msgstr "" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "هیچ‌کدام" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "فعال کردن رمزگذاری" diff --git a/l10n/fa/files_sharing.po b/l10n/fa/files_sharing.po index 8afa64d981..9b11f7a5ec 100644 --- a/l10n/fa/files_sharing.po +++ b/l10n/fa/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mohammad Dashtizadeh , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:07+0000\n" +"Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "اندازه" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "تاریخ" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "حذف همه" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "حذف" diff --git a/l10n/fa/files_versions.po b/l10n/fa/files_versions.po index 8fe77cc79f..10bdb92792 100644 --- a/l10n/fa/files_versions.po +++ b/l10n/fa/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mohammad Dashtizadeh , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:14+0000\n" +"Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "انقضای تمامی نسخه‌ها" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "فعال‌کردن پرونده‌های نسخه‌بندی" diff --git a/l10n/fa/lib.po b/l10n/fa/lib.po index f0abd9d4d8..7e1c82ad5e 100644 --- a/l10n/fa/lib.po +++ b/l10n/fa/lib.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mohammad Dashtizadeh , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:23+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:01+0000\n" +"Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,43 +18,43 @@ msgstr "" "Language: fa\n" "Plural-Forms: nplurals=1; plural=0\n" -#: app.php:287 +#: app.php:288 msgid "Help" -msgstr "" +msgstr "راه‌نما" -#: app.php:294 +#: app.php:295 msgid "Personal" -msgstr "" +msgstr "شخصی" -#: app.php:299 +#: app.php:300 msgid "Settings" -msgstr "" +msgstr "تنظیمات" -#: app.php:304 +#: app.php:305 msgid "Users" -msgstr "" +msgstr "کاربران" -#: app.php:311 +#: app.php:312 msgid "Apps" msgstr "" -#: app.php:313 +#: app.php:314 msgid "Admin" -msgstr "" +msgstr "مدیر" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." msgstr "" -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." msgstr "" -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" msgstr "" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." msgstr "" @@ -71,24 +72,24 @@ msgstr "" #: template.php:86 msgid "seconds ago" -msgstr "" +msgstr "ثانیه‌ها پیش" #: template.php:87 msgid "1 minute ago" -msgstr "" +msgstr "1 دقیقه پیش" #: template.php:88 #, php-format msgid "%d minutes ago" -msgstr "" +msgstr "%d دقیقه پیش" #: template.php:91 msgid "today" -msgstr "" +msgstr "امروز" #: template.php:92 msgid "yesterday" -msgstr "" +msgstr "دیروز" #: template.php:93 #, php-format @@ -97,16 +98,16 @@ msgstr "" #: template.php:94 msgid "last month" -msgstr "" +msgstr "ماه قبل" #: template.php:95 msgid "months ago" -msgstr "" +msgstr "ماه‌های قبل" #: template.php:96 msgid "last year" -msgstr "" +msgstr "سال قبل" #: template.php:97 msgid "years ago" -msgstr "" +msgstr "سال‌های قبل" diff --git a/l10n/fa/settings.po b/l10n/fa/settings.po index 0c86f80460..38f01f759c 100644 --- a/l10n/fa/settings.po +++ b/l10n/fa/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "سایر" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/fa/tasks.po b/l10n/fa/tasks.po index a8a28b716d..90c396946b 100644 --- a/l10n/fa/tasks.po +++ b/l10n/fa/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Mohammad Dashtizadeh , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 19:59+0000\n" +"Last-Translator: Mohammad Dashtizadeh \n" "Language-Team: Persian (http://www.transifex.com/projects/p/owncloud/language/fa/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +24,7 @@ msgstr "" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "وظایف" #: js/tasks.js:415 msgid "No category" @@ -35,15 +36,15 @@ msgstr "" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=بیش‌ترین" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=متوسط" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=کم‌ترین" #: lib/app.php:81 msgid "Empty Summary" @@ -87,20 +88,20 @@ msgstr "" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "درحال بارگزاری وظایف" #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "مهم" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "بیش‌تر" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "کم‌تر" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "حذف" diff --git a/l10n/fi/contacts.po b/l10n/fi/contacts.po index 537fe182c3..da37fef417 100644 --- a/l10n/fi/contacts.po +++ b/l10n/fi/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/owncloud/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/fi/files.po b/l10n/fi/files.po index 63aaeba9a9..edf5daa8da 100644 --- a/l10n/fi/files.po +++ b/l10n/fi/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-09 02:02+0200\n" -"PO-Revision-Date: 2011-08-13 02:19+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/owncloud/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/fi/files_sharing.po b/l10n/fi/files_sharing.po index 375cb6c6e3..b8c06567b5 100644 --- a/l10n/fi/files_sharing.po +++ b/l10n/fi/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/owncloud/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: fi\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/fi/settings.po b/l10n/fi/settings.po index c7d75c2d6a..823276532f 100644 --- a/l10n/fi/settings.po +++ b/l10n/fi/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (http://www.transifex.com/projects/p/owncloud/language/fi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/fi_FI/admin_dependencies_chk.po b/l10n/fi_FI/admin_dependencies_chk.po index 46b0ad55d7..a9a1eac7b0 100644 --- a/l10n/fi_FI/admin_dependencies_chk.po +++ b/l10n/fi_FI/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:01+0200\n" +"PO-Revision-Date: 2012-08-23 13:01+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,15 +32,15 @@ msgstr "" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "php-gd-moduuli vaaditaan, jotta kuvista on mahdollista luoda esikatselukuvia" #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "php-ldap-moduuli vaaditaan, jotta yhteys ldap-palvelimeen on mahdollista" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "php-zip-moduuli vaaditaan, jotta useiden tiedostojen samanaikainen lataus on mahdollista" #: settings.php:63 msgid "" @@ -52,7 +53,7 @@ msgstr "" #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "php-xml-moduuli vaaditaan, jotta tiedostojen jako webdavia käyttäen on mahdollista" #: settings.php:81 msgid "" @@ -62,12 +63,12 @@ msgstr "" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "php-pdo-moduuli tarvitaan, jotta ownCloud-tietojen tallennus tietokantaan on mahdollista" #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Riippuvuuksien tila" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Käyttökohde:" diff --git a/l10n/fi_FI/admin_migrate.po b/l10n/fi_FI/admin_migrate.po index ba949be087..ce68f4275d 100644 --- a/l10n/fi_FI/admin_migrate.po +++ b/l10n/fi_FI/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 10:55+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Vie tämä ownCloud-istanssi" #: templates/settings.php:4 msgid "" @@ -29,4 +30,4 @@ msgstr "" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Vie" diff --git a/l10n/fi_FI/calendar.po b/l10n/fi_FI/calendar.po index f8b5e83e77..6b129f3ee9 100644 --- a/l10n/fi_FI/calendar.po +++ b/l10n/fi_FI/calendar.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 12:14+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -70,7 +70,7 @@ msgstr "Aikavyöhyke vaihdettu" msgid "Invalid request" msgstr "Virheellinen pyyntö" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:37 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "Kalenteri" @@ -479,7 +479,7 @@ msgstr "Tänään" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Asetukset" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -733,7 +733,7 @@ msgstr "" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Yleiset" #: templates/settings.php:15 msgid "Timezone" @@ -741,11 +741,11 @@ msgstr "Aikavyöhyke" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Päivitä aikavyöhykkeet automaattisesti" #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "Ajan näyttömuoto" #: templates/settings.php:57 msgid "24h" @@ -757,7 +757,7 @@ msgstr "12 tuntia" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "Viikon alkamispäivä" #: templates/settings.php:76 msgid "Cache" @@ -781,7 +781,7 @@ msgstr "" #: templates/settings.php:89 msgid "Primary address (Kontact et al)" -msgstr "" +msgstr "Ensisijainen osoite (Kontact ja muut vastaavat)" #: templates/settings.php:91 msgid "iOS/OS X" diff --git a/l10n/fi_FI/contacts.po b/l10n/fi_FI/contacts.po index 35b090e46b..a80843bf7e 100644 --- a/l10n/fi_FI/contacts.po +++ b/l10n/fi_FI/contacts.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +26,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -83,18 +83,18 @@ msgstr "Vähintään yksi osoitekenttä tulee täyttää." msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "vCardin tiedot eivät kelpaa. Lataa sivu uudelleen." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Virhe poistettaessa yhteystiedon ominaisuutta." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -115,10 +115,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Virhe päivitettäessä yhteystiedon ominaisuutta." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -222,7 +218,7 @@ msgstr "Väliaikaiskuvan lataus epäonnistui:" msgid "No file was uploaded. Unknown error" msgstr "Tiedostoa ei lähetetty. Tuntematon virhe" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Yhteystiedot" @@ -239,57 +235,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Virhe" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Muokkaa nimeä" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Tiedostoja ei ole valittu lähetettäväksi." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Virhe profiilikuvaa ladatessa." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" -msgstr "" +msgstr "Valitse tyyppi" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "Jotkin yhteystiedot on merkitty poistettaviksi, mutta niitä ei ole vielä poistettu. Odota hetki, että kyseiset yhteystiedot poistetaan." +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Haluatko yhdistää nämä osoitekirjat?" + #: js/loader.js:49 msgid "Result: " msgstr "Tulos: " @@ -302,133 +315,164 @@ msgstr " tuotu, " msgid " failed." msgstr " epäonnistui." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Näyttönimi ei voi olla tyhjä." #: lib/app.php:36 msgid "Addressbook not found: " msgstr "Osoitekirjaa ei löytynyt:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Tämä ei ole osoitekirjasi." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Yhteystietoa ei löytynyt." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Osoite" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Puhelin" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Sähköposti" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisaatio" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "Google Talk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Työ" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Koti" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobiili" - -#: lib/app.php:135 -msgid "Text" -msgstr "Teksti" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Ääni" - -#: lib/app.php:137 -msgid "Message" -msgstr "Viesti" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faksi" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Hakulaite" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Syntymäpäivä" - -#: lib/app.php:184 -msgid "Business" -msgstr "Työ" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Muu" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobiili" + +#: lib/app.php:203 +msgid "Text" +msgstr "Teksti" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Ääni" + +#: lib/app.php:205 +msgid "Message" +msgstr "Viesti" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faksi" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Hakulaite" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Syntymäpäivä" + +#: lib/app.php:253 +msgid "Business" +msgstr "Työ" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Kysymykset" @@ -440,6 +484,14 @@ msgstr "Henkilön {name} syntymäpäivä" msgid "Contact" msgstr "Yhteystieto" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Lisää yhteystieto" @@ -536,13 +588,18 @@ msgstr "" msgid "Edit name details" msgstr "Muokkaa nimitietoja" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisaatio" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Poista" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Kutsumanimi" @@ -550,7 +607,7 @@ msgstr "Kutsumanimi" msgid "Enter nickname" msgstr "Anna kutsumanimi" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Verkkosivu" @@ -566,7 +623,7 @@ msgstr "Siirry verkkosivulle" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Ryhmät" @@ -578,63 +635,84 @@ msgstr "Erota ryhmät pilkuilla" msgid "Edit groups" msgstr "Muokkaa ryhmiä" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Ensisijainen" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Anna kelvollinen sähköpostiosoite." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Anna sähköpostiosoite" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" -msgstr "" +msgstr "Lähetä sähköpostia" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Poista sähköpostiosoite" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Anna puhelinnumero" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Poista puhelinnumero" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Pikaviestin" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Näytä kartalla" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Muokkaa osoitetietoja" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Lisää huomiot tähän." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Lisää kenttä" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Puhelin" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Sähköposti" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Osoite" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Huomio" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Lataa yhteystieto" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Poista yhteystieto" @@ -805,19 +883,15 @@ msgstr "Osoitekirjassasi ei ole yhteystietoja." msgid "Add contact" msgstr "Lisää yhteystieto" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Muokkaa osoitekirjoja" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Valitse osoitekirjat" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Anna nimi" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Anna kuvaus" @@ -846,33 +920,37 @@ msgid "Show read-only VCF link" msgstr "Näytä vain luku -muodossa oleva VCF-linkki" #: templates/settings.php:26 +msgid "Share" +msgstr "Jaa" + +#: templates/settings.php:29 msgid "Download" msgstr "Lataa" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Muokkaa" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Uusi osoitekirja" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Nimi" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Kuvaus" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Tallenna" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Peru" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Lisää..." diff --git a/l10n/fi_FI/files.po b/l10n/fi_FI/files.po index c441d2eba1..e4ee45867c 100644 --- a/l10n/fi_FI/files.po +++ b/l10n/fi_FI/files.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-03 02:02+0200\n" -"PO-Revision-Date: 2012-08-02 18:24+0000\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 12:10+0000\n" "Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" @@ -55,11 +55,7 @@ msgstr "Levylle kirjoitus epäonnistui" msgid "Files" msgstr "Tiedostot" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Lopeta jakaminen" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Poista" @@ -83,59 +79,59 @@ msgstr "korvattu" msgid "with" msgstr "käyttäen" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "kumoa" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "poistettu" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "luodaan ZIP-tiedostoa, tämä saattaa kestää hetken." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Tiedoston lähetys epäonnistui, koska sen koko on 0 tavua tai kyseessä on kansio" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Lähetysvirhe." -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Odottaa" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Lähetys peruttu." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Virheellinen nimi, merkki '/' ei ole sallittu." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Koko" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Muutettu" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "kansio" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "kansiota" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "tiedosto" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "tiedostoa" @@ -149,7 +145,7 @@ msgstr "Lähetettävän tiedoston suurin sallittu koko" #: templates/admin.php:7 msgid "max. possible: " -msgstr "" +msgstr "suurin mahdollinen:" #: templates/admin.php:9 msgid "Needed for multi-file and folder downloads." diff --git a/l10n/fi_FI/files_encryption.po b/l10n/fi_FI/files_encryption.po index 62b43dfc31..89ad916e38 100644 --- a/l10n/fi_FI/files_encryption.po +++ b/l10n/fi_FI/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 10:56+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Salaus" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Jätä seuraavat tiedostotyypit salaamatta" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Ei mitään" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Käytä salausta" diff --git a/l10n/fi_FI/files_external.po b/l10n/fi_FI/files_external.po index 101691c078..2cee464ea2 100644 --- a/l10n/fi_FI/files_external.po +++ b/l10n/fi_FI/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 11:04+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,23 +20,23 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Erillinen tallennusväline" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "Liitospiste" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "Taustaosa" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Asetukset" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Valinnat" #: templates/settings.php:11 msgid "Applicable" @@ -43,35 +44,35 @@ msgstr "" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Lisää liitospiste" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "Ei asetettu" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Kaikki käyttäjät" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Ryhmät" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Käyttäjät" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Poista" #: templates/settings.php:88 msgid "SSL root certificates" -msgstr "" +msgstr "SSL-juurivarmenteet" #: templates/settings.php:102 msgid "Import Root Certificate" -msgstr "" +msgstr "Tuo juurivarmenne" #: templates/settings.php:108 msgid "Enable User External Storage" @@ -79,4 +80,4 @@ msgstr "" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "Salli käyttäjien liittää omia erillisiä tallennusvälineitä" diff --git a/l10n/fi_FI/files_sharing.po b/l10n/fi_FI/files_sharing.po index defc8793ba..dba2e1225d 100644 --- a/l10n/fi_FI/files_sharing.po +++ b/l10n/fi_FI/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 11:35+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: fi_FI\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Koko" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Muokattu" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Poista kaikki" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Poista" diff --git a/l10n/fi_FI/files_versions.po b/l10n/fi_FI/files_versions.po index 678c8cda62..c4bdbdc582 100644 --- a/l10n/fi_FI/files_versions.po +++ b/l10n/fi_FI/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 10:59+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Vanhenna kaikki versiot" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Käytä tiedostojen versiointia" diff --git a/l10n/fi_FI/settings.po b/l10n/fi_FI/settings.po index 0649c23395..f3610fa859 100644 --- a/l10n/fi_FI/settings.po +++ b/l10n/fi_FI/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 12:07+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -73,7 +73,7 @@ msgstr "Turvallisuusvaroitus" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" @@ -85,7 +85,7 @@ msgstr "" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "käytä järjestelmän cron-palvelua" #: templates/admin.php:39 msgid "Log" @@ -145,7 +145,7 @@ msgstr "Olet käyttänyt" #: templates/personal.php:8 msgid "of the available" -msgstr "käytettävissäsi on yhteensä" +msgstr ", käytettävissäsi on yhteensä" #: templates/personal.php:12 msgid "Desktop and Mobile Syncing Clients" @@ -189,7 +189,7 @@ msgstr "Sähköpostiosoitteesi" #: templates/personal.php:32 msgid "Fill in an email address to enable password recovery" -msgstr "Kirjoita sähköpostiosoitteesi alle, jotta unohdettu salasana voidaan palauttaa" +msgstr "Anna sähköpostiosoitteesi, jotta unohdettu salasana on mahdollista palauttaa" #: templates/personal.php:38 templates/personal.php:39 msgid "Language" @@ -228,7 +228,7 @@ msgid "Other" msgstr "Muu" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/fi_FI/tasks.po b/l10n/fi_FI/tasks.po index 0e179f0b47..b8857baee6 100644 --- a/l10n/fi_FI/tasks.po +++ b/l10n/fi_FI/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 13:23+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,35 +20,35 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Virheellinen päivä tai aika" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Tehtävät" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Ei luokkaa" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Määrittelemätön" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=korkein" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=keskitaso" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=matalin" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Tyhjä yhteenveto" #: lib/app.php:93 msgid "Invalid percent complete" @@ -55,11 +56,11 @@ msgstr "" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Virheellinen prioriteetti" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Lisää tehtävä" #: templates/tasks.php:4 msgid "Order Due" @@ -87,20 +88,20 @@ msgstr "" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Ladataan tehtäviä..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Tärkeä" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Enemmän" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Vähemmän" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Poista" diff --git a/l10n/fi_FI/user_ldap.po b/l10n/fi_FI/user_ldap.po index 601e9c1d35..a8c8f4e5c8 100644 --- a/l10n/fi_FI/user_ldap.po +++ b/l10n/fi_FI/user_ldap.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 18:00+0000\n" +"Last-Translator: kyyberi \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,43 +21,43 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "Isäntä" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "Voit jättää protokollan määrittämättä, paitsi kun käytät SSL:ää. Aloita silloin ldaps://" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Oletus DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "Voit määrittää käyttäjien ja ryhmien oletus DN:n (distinguished name) 'tarkemmat asetukset' välilehdeltä " #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "Käyttäjän DN" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "Asiakasohjelman DN, jolla yhdistäminen tehdään, ts. uid=agent,dc=example,dc=com. Mahdollistaaksesi anonyymin yhteyden, jätä DN ja salasana tyhjäksi." #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Salasana" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "Jos haluat mahdollistaa anonyymin pääsyn, jätä DN ja Salasana tyhjäksi " #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "Login suodatus" #: templates/settings.php:12 #, php-format @@ -67,73 +69,73 @@ msgstr "" #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "käytä %%uid paikanvaraajaa, ts. \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "Käyttäjien suodatus" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "Määrittelee käytettävän suodattimen, kun käyttäjiä haetaan. " #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "ilman paikanvaraustermiä, ts. \"objectClass=person\"." #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "Ryhmien suodatus" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "Määrittelee käytettävän suodattimen, kun ryhmiä haetaan. " #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "ilman paikanvaraustermiä, ts. \"objectClass=posixGroup\"." #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Portti" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "Oletus käyttäjäpuu" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "Ryhmien juuri" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "" +msgstr "Ryhmä-jäsen assosiaatio (yhteys)" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Käytä TLS:ää" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "Älä käytä SSL yhteyttä varten, se epäonnistuu. " #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "Kirjainkoosta piittamaton LDAP-palvelin (Windows)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "Sulje SSL sertifikaatin käyttö" #: templates/settings.php:23 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "" +msgstr "Jos yhteys toimii vain tällä optiolla, siirrä LDAP palvelimen SSL sertifikaatti onwCloud palvelimellesi. " #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Ei suositella, käytä vain testausta varten." #: templates/settings.php:24 msgid "User Display Name Field" @@ -153,12 +155,12 @@ msgstr "" #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "tavuissa" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "sekunneissa. Muutos tyhjentää välimuistin." #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Ohje" diff --git a/l10n/fi_FI/user_migrate.po b/l10n/fi_FI/user_migrate.po index 17bff479f0..b0ab682451 100644 --- a/l10n/fi_FI/user_migrate.po +++ b/l10n/fi_FI/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 11:06+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,28 +20,28 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Vie" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "" +msgstr "Jokin meni pieleen vientiä suorittaessa" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "Tapahtui virhe" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "Vie käyttäjätilisi" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "Tämä luo ownCloud-käyttäjätilisi sisältävän pakatun tiedoston." #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "Tuo käyttäjätili" #: templates/settings.php:15 msgid "ownCloud User Zip" @@ -48,4 +49,4 @@ msgstr "" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Tuo" diff --git a/l10n/fi_FI/user_openid.po b/l10n/fi_FI/user_openid.po index 7b5195bbcc..36900815c7 100644 --- a/l10n/fi_FI/user_openid.po +++ b/l10n/fi_FI/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Jiri Grönroos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 11:37+0000\n" +"Last-Translator: Jiri Grönroos \n" "Language-Team: Finnish (Finland) (http://www.transifex.com/projects/p/owncloud/language/fi_FI/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,23 +24,23 @@ msgstr "" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Identiteetti: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Alue: " #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Käyttäjä: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Kirjaudu" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "Virhe: Käyttäjää ei valittu" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" diff --git a/l10n/fr/contacts.po b/l10n/fr/contacts.po index 6680c0a183..3415f7b733 100644 --- a/l10n/fr/contacts.po +++ b/l10n/fr/contacts.po @@ -6,9 +6,10 @@ # Borjan Tchakaloff , 2012. # Cyril Glapa , 2012. # , 2011. -# , 2011. +# , 2011, 2012. # , 2012. # Jan-Christoph Borchardt , 2011. +# , 2012. # Nahir Mohamed , 2012. # Nicolas , 2012. # Robert Di Rosa <>, 2012. @@ -18,9 +19,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 13:55+0000\n" +"Last-Translator: MathieuP \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -33,7 +34,7 @@ msgid "Error (de)activating addressbook." msgstr "Des erreurs se sont produites lors de l'activation/désactivation du carnet d'adresses." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "L'ID n'est pas défini." @@ -90,18 +91,18 @@ msgstr "Au moins un des champs d'adresses doit être complété." msgid "Trying to add duplicate property: " msgstr "Ajout d'une propriété en double:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Erreur pendant l'ajout de la propriété du contact :" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Paramètre de Messagerie Instantanée manquants." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Messagerie Instantanée inconnue" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Les informations relatives à cette vCard sont incorrectes. Veuillez recharger la page." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Erreur lors de la suppression du champ." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID manquant" @@ -122,10 +123,6 @@ msgstr "L'informatiion à propos de la vCard est incorrect. Merci de rafraichir msgid "Something went FUBAR. " msgstr "Quelque chose est FUBAR." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Erreur lors de la mise à jour du champ." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -229,13 +226,13 @@ msgstr "Impossible de charger l'image temporaire :" msgid "No file was uploaded. Unknown error" msgstr "Aucun fichier n'a été chargé. Erreur inconnue" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Contacts" #: js/contacts.js:71 msgid "Sorry, this functionality has not been implemented yet" -msgstr "Désolé cette fonctionnalité n'a pas encore été implementée" +msgstr "Désolé cette fonctionnalité n'a pas encore été implémentée" #: js/contacts.js:71 msgid "Not implemented" @@ -246,56 +243,73 @@ msgid "Couldn't get a valid address." msgstr "Impossible de trouver une adresse valide." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Erreur" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "Vous n'avez pas l'autorisation d'ajouter des contacts à" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Veuillez sélectionner l'un de vos carnets d'adresses." + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Erreur de permission" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Cette valeur ne doit pas être vide" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." -msgstr "Impossible de sérialiser les éléments" +msgstr "Impossible de sérialiser les éléments." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' a été appelé sans type d'arguments. Merci de rapporter un bug à bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Éditer le nom" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Aucun fichiers choisis pour être chargés" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." -msgstr "Le fichier que vous tenter de charger dépasse la taille maximum de fichier autorisé sur ce serveur." +msgstr "Le fichier que vous tentez de charger dépasse la taille maximum de fichier autorisée sur ce serveur." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Erreur pendant le chargement de la photo de profil." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Sélectionner un type" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "Certains contacts sont marqués pour être supprimés mais sont encore présents, veuillez attendre que l'opération se termine." +msgstr "Certains contacts sont marqués pour être supprimés, mais ne le sont pas encore. Veuillez attendre que l'opération se termine." + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Voulez-vous fusionner ces carnets d'adresses ?" #: js/loader.js:49 msgid "Result: " @@ -309,7 +323,7 @@ msgstr "importé," msgid " failed." msgstr "échoué." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "Le nom d'affichage ne peut pas être vide." @@ -317,125 +331,156 @@ msgstr "Le nom d'affichage ne peut pas être vide." msgid "Addressbook not found: " msgstr "Carnet d'adresse introuvable : " -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ce n'est pas votre carnet d'adresses." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Ce contact n'a pu être trouvé." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresse" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Téléphone" +#: lib/app.php:121 +msgid "AIM" +msgstr "Messagerie Instantanée" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Société" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Travail" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" -msgstr "Maison" +msgstr "Domicile" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobile" - -#: lib/app.php:135 -msgid "Text" -msgstr "Texte" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voix" - -#: lib/app.php:137 -msgid "Message" -msgstr "Message" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Vidéo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Bipeur" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Anniversaire" - -#: lib/app.php:184 -msgid "Business" -msgstr "Business" - -#: lib/app.php:185 -msgid "Call" -msgstr "Appel" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Clients" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "Livreur" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Vacances" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Idées" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Trajet" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Jubilé" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Rendez-vous" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Autre" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobile" + +#: lib/app.php:203 +msgid "Text" +msgstr "Texte" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voix" + +#: lib/app.php:205 +msgid "Message" +msgstr "Message" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Vidéo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Bipeur" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Anniversaire" + +#: lib/app.php:253 +msgid "Business" +msgstr "Business" + +#: lib/app.php:254 +msgid "Call" +msgstr "Appel" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Clients" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Livreur" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Vacances" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Idées" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Trajet" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Jubilé" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Rendez-vous" + +#: lib/app.php:263 msgid "Personal" msgstr "Personnel" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projets" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Questions" @@ -447,6 +492,14 @@ msgstr "Anniversaire de {name}" msgid "Contact" msgstr "Contact" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "Vous n'avez pas l'autorisation de modifier ce contact." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "Vous n'avez pas l'autorisation de supprimer ce contact." + #: templates/index.php:14 msgid "Add Contact" msgstr "Ajouter un Contact" @@ -543,13 +596,18 @@ msgstr "Formatage personnalisé, Nom court, Nom complet, Inversé, Inversé avec msgid "Edit name details" msgstr "Editer les noms" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Société" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Supprimer" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Surnom" @@ -557,7 +615,7 @@ msgstr "Surnom" msgid "Enter nickname" msgstr "Entrer un surnom" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Page web" @@ -573,7 +631,7 @@ msgstr "Allez à la page web" msgid "dd-mm-yyyy" msgstr "jj-mm-aaaa" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Groupes" @@ -585,63 +643,84 @@ msgstr "Séparer les groupes avec des virgules" msgid "Edit groups" msgstr "Editer les groupes" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Préféré" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Merci d'entrer une adresse e-mail valide." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Entrer une adresse e-mail" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Envoyer à l'adresse" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Supprimer l'adresse e-mail" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Entrer un numéro de téléphone" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Supprimer le numéro de téléphone" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Supprimer la Messagerie Instantanée" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Voir sur une carte" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Editer les adresses" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Ajouter des notes ici." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Ajouter un champ." -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Téléphone" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Messagerie instantanée" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresse" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Note" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Télécharger le contact" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Supprimer le contact" @@ -812,19 +891,15 @@ msgstr "Il n'y a pas de contact dans votre carnet d'adresses." msgid "Add contact" msgstr "Ajouter un contact" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Paramétrer carnet d'adresses" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Choix du carnet d'adresses" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Saisissez le nom" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Saisissez une description" @@ -853,33 +928,37 @@ msgid "Show read-only VCF link" msgstr "Afficher les liens VCF en lecture seule" #: templates/settings.php:26 +msgid "Share" +msgstr "Partager" + +#: templates/settings.php:29 msgid "Download" msgstr "Télécharger" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Modifier" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nouveau Carnet d'adresses" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Nom" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Description" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Sauvegarder" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Annuler" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Plus…" diff --git a/l10n/fr/files.po b/l10n/fr/files.po index 1cc50dacf8..19cb780d18 100644 --- a/l10n/fr/files.po +++ b/l10n/fr/files.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-07 02:04+0200\n" -"PO-Revision-Date: 2012-08-06 20:30+0000\n" -"Last-Translator: Cyril Glapa \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -57,11 +57,7 @@ msgstr "Erreur d'écriture sur le disque" msgid "Files" msgstr "Fichiers" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Ne plus partager" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Supprimer" @@ -85,59 +81,59 @@ msgstr "remplacé" msgid "with" msgstr "avec" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "annuler" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "supprimé" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "Générer un fichier ZIP, cela peut prendre du temps" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Impossible de charger vos fichiers car il s'agit d'un dossier ou le fichier fait 0 octet." -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Erreur de chargement" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "En cours" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Chargement annulé" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Nom invalide, '/' n'est pas autorisé." -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Taille" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modifié" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "dossier" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "dossiers" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "fichier" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "fichiers" diff --git a/l10n/fr/files_sharing.po b/l10n/fr/files_sharing.po index 60c8ad25a5..254df78bd1 100644 --- a/l10n/fr/files_sharing.po +++ b/l10n/fr/files_sharing.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Romain DEP. , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 16:40+0000\n" -"Last-Translator: Romain DEP. \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,38 +19,18 @@ msgstr "" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "Vos documents partagés" +#: templates/get.php:4 +msgid "Size" +msgstr "Taille" -#: templates/list.php:6 -msgid "Item" -msgstr "Item" +#: templates/get.php:5 +msgid "Modified" +msgstr "Modifié" -#: templates/list.php:7 -msgid "Shared With" -msgstr "Partagé avec" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Tout effacer" -#: templates/list.php:8 -msgid "Permissions" -msgstr "Permissions" - -#: templates/list.php:16 -msgid "Read" -msgstr "Lecture" - -#: templates/list.php:16 -msgid "Edit" -msgstr "Édition" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "Effacement" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "Permettre le repartage" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "Permettre aux utilisateurs de repartager des fichiers dont ils ne sont pas propriétaires" diff --git a/l10n/fr/media.po b/l10n/fr/media.po index e8dc770632..9f757f487c 100644 --- a/l10n/fr/media.po +++ b/l10n/fr/media.po @@ -3,32 +3,34 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. +# Nahir Mohamed , 2012. # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: French (http://www.transifex.net/projects/p/owncloud/language/fr/)\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 11:57+0000\n" +"Last-Translator: MathieuP \n" +"Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: fr\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: appinfo/app.php:32 templates/player.php:8 +#: appinfo/app.php:45 templates/player.php:8 msgid "Music" msgstr "Musique" #: js/music.js:18 msgid "Add album to playlist" -msgstr "" +msgstr "Ajouter l'album à la playlist" #: templates/music.php:3 templates/player.php:12 msgid "Play" -msgstr "Play" +msgstr "Lire" #: templates/music.php:4 templates/music.php:26 templates/player.php:13 msgid "Pause" diff --git a/l10n/fr/settings.po b/l10n/fr/settings.po index 6682f4c9e0..c1d17de2c4 100644 --- a/l10n/fr/settings.po +++ b/l10n/fr/settings.po @@ -5,6 +5,7 @@ # Translators: # Cyril Glapa , 2012. # , 2011. +# , 2012. # , 2012. # Jan-Christoph Borchardt , 2011. # Nahir Mohamed , 2012. @@ -15,9 +16,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 15:19+0000\n" +"Last-Translator: gp4004 \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -79,19 +80,19 @@ msgstr "Alertes de sécurité" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "exécuter une tâche pour chaque page chargée" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php est enregistré comme un service webcron" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "utiliser le service cron du système " #: templates/admin.php:39 msgid "Log" @@ -234,8 +235,8 @@ msgid "Other" msgstr "Autre" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "Groupe Admin" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/fr/tasks.po b/l10n/fr/tasks.po index 5fd6929892..8bb451354c 100644 --- a/l10n/fr/tasks.po +++ b/l10n/fr/tasks.po @@ -3,14 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Romain DEP. , 2012. +# Xavier BOUTEVILLAIN , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 15:49+0000\n" -"Last-Translator: Romain DEP. \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 12:01+0000\n" +"Last-Translator: MathieuP \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -64,27 +66,27 @@ msgstr "Ajouter une tâche" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Echéance tâche" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Liste tâche" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Tâche réalisée" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Lieu" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Priorité" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Etiquette tâche" #: templates/tasks.php:16 msgid "Loading tasks..." diff --git a/l10n/fr/user_ldap.po b/l10n/fr/user_ldap.po index afaa4b5d41..1ca6075cb6 100644 --- a/l10n/fr/user_ldap.po +++ b/l10n/fr/user_ldap.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Romain DEP. , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 17:06+0000\n" -"Last-Translator: Zertrin \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:01+0000\n" +"Last-Translator: Romain DEP. \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -63,12 +64,12 @@ msgstr "Filtre d'identifiants utilisateur" msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "Définit le filtre à appliquer lors d'une tentative de connexion. %%uid remplace le nom d'utilisateur lors de la connexion." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "veuillez utiliser le champ %%uid , ex.: \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" diff --git a/l10n/fr/user_migrate.po b/l10n/fr/user_migrate.po index 6528dc9e74..2b2802bbc8 100644 --- a/l10n/fr/user_migrate.po +++ b/l10n/fr/user_migrate.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Romain DEP. , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 16:23+0000\n" -"Last-Translator: Romain DEP. \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 12:00+0000\n" +"Last-Translator: MathieuP \n" "Language-Team: French (http://www.transifex.com/projects/p/owncloud/language/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +25,7 @@ msgstr "Exporter" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "Une erreur s'est produit pendant la génération du fichier d'export" +msgstr "Une erreur s'est produite pendant la génération du fichier d'export" #: js/export.js:19 msgid "An error has occurred" diff --git a/l10n/gl/contacts.po b/l10n/gl/contacts.po index 609d951621..5ee98a039d 100644 --- a/l10n/gl/contacts.po +++ b/l10n/gl/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "Produciuse un erro (des)activando a axenda." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "non se estableceu o id." @@ -81,18 +81,18 @@ msgstr "Polo menos un dos campos do enderezo ten que ser cuberto." msgid "Trying to add duplicate property: " msgstr "Tentando engadir propiedade duplicada: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "A información sobre a vCard é incorrecta. Por favor volva cargar a páxina." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Produciuse un erro borrando a propiedade do contacto." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID perdido" @@ -113,10 +113,6 @@ msgstr "A información sobre a vCard é incorrecta. Por favor, recargue a páxin msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Produciuse un erro actualizando a propiedade do contacto." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "Non se puido cargar a imaxe temporal: " msgid "No file was uploaded. Unknown error" msgstr "Non se subeu ningún ficheiro. Erro descoñecido." -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Contactos" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "Non se puido obter un enderezo de correo válido." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Erro" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Esta propiedade non pode quedar baldeira." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Non se puido serializar os elementos." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' chamado sen argumento. Por favor, informe en bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Editar nome" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Sen ficheiros escollidos para subir." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "O ficheiro que tenta subir supera o tamaño máximo permitido neste servidor." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Seleccione tipo" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Resultado: " @@ -300,7 +313,7 @@ msgstr " importado, " msgid " failed." msgstr " fallou." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Esta non é a súa axenda." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Non se atopou o contacto." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Enderezo" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Teléfono" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Correo electrónico" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organización" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Traballo" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Casa" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Móbil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Texto" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voz" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mensaxe" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Vídeo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Paxinador" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Aniversario" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Móbil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voz" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mensaxe" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Vídeo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Paxinador" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Aniversario" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -438,6 +482,14 @@ msgstr "Cumpleanos de {name}" msgid "Contact" msgstr "Contacto" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Engadir contacto" @@ -534,13 +586,18 @@ msgstr "Formato personalizado, Nome corto, Nome completo, Inverso ou Inverso con msgid "Edit name details" msgstr "Editar detalles do nome" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organización" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Eliminar" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Apodo" @@ -548,7 +605,7 @@ msgstr "Apodo" msgid "Enter nickname" msgstr "Introuza apodo" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -564,7 +621,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupos" @@ -576,63 +633,84 @@ msgstr "Separe grupos con comas" msgid "Edit groups" msgstr "Editar grupos" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferido" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Por favor indique un enderezo de correo electrónico válido." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Introduza enderezo de correo electrónico" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Correo ao enderezo" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Borrar enderezo de correo electrónico" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Introducir número de teléfono" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Borrar número de teléfono" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Ver no mapa" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Editar detalles do enderezo" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Engadir aquí as notas." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Engadir campo" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Teléfono" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Correo electrónico" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Enderezo" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Descargar contacto" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Borrar contacto" @@ -803,19 +881,15 @@ msgstr "Non ten contactos na súa libreta de enderezos." msgid "Add contact" msgstr "Engadir contacto" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Configurar libretas de enderezos" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Descargar" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editar" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nova axenda" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Gardar" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Cancelar" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/gl/files.po b/l10n/gl/files.po index 884f224b3b..6725283e33 100644 --- a/l10n/gl/files.po +++ b/l10n/gl/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,87 +53,83 @@ msgstr "Erro ao escribir no disco" msgid "Files" msgstr "Ficheiros" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Eliminar" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "xa existe" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "substituír" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "cancelar" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "substituído" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "con" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "desfacer" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "eliminado" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "xerando ficheiro ZIP, pode levar un anaco." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Non se puido subir o ficheiro pois ou é un directorio ou ten 0 bytes" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Erro na subida" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Pendentes" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Subida cancelada." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Nome non válido, '/' non está permitido." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Tamaño" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificado" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "cartafol" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "cartafoles" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "ficheiro" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "ficheiros" diff --git a/l10n/gl/files_sharing.po b/l10n/gl/files_sharing.po index ddde4141dc..ef1d19e933 100644 --- a/l10n/gl/files_sharing.po +++ b/l10n/gl/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: gl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/gl/settings.po b/l10n/gl/settings.po index f48a73f502..8c45f0bd13 100644 --- a/l10n/gl/settings.po +++ b/l10n/gl/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Galician (http://www.transifex.com/projects/p/owncloud/language/gl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,7 +21,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Non se puido cargar a lista desde a App Store" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -41,7 +41,7 @@ msgstr "Petición incorrecta" #: ajax/removeuser.php:13 ajax/setquota.php:18 ajax/togglegroups.php:18 msgid "Authentication error" -msgstr "" +msgstr "Erro na autenticación" #: ajax/setlanguage.php:18 msgid "Language changed" @@ -49,7 +49,7 @@ msgstr "O idioma mudou" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Erro" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -69,23 +69,23 @@ msgstr "Galego" #: templates/admin.php:14 msgid "Security Warning" -msgstr "" +msgstr "Aviso de seguridade" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "executar unha tarefa con cada páxina cargada" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php está rexistrada como un servizo webcron" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "utilice o servizo cron do sistema" #: templates/admin.php:39 msgid "Log" @@ -228,7 +228,7 @@ msgid "Other" msgstr "Outro" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/he/contacts.po b/l10n/he/contacts.po index 95a5b199da..df2a4bdc4e 100644 --- a/l10n/he/contacts.po +++ b/l10n/he/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "שגיאה בהפעלה או בנטרול פנקס הכתובות." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "מספר מזהה לא נקבע." @@ -82,18 +82,18 @@ msgstr "יש למלא לפחות אחד משדות הכתובת." msgid "Trying to add duplicate property: " msgstr "ניסיון להוספת מאפיין כפול: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "המידע אודות vCard אינו נכון. נא לטעון מחדש את הדף." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "שגיאה במחיקת מאפיין של איש הקשר." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "מזהה חסר" @@ -114,10 +114,6 @@ msgstr "המידע עבור ה vCard אינו נכון. אנא טען את הע msgid "Something went FUBAR. " msgstr "משהו לא התנהל כצפוי." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "שגיאה בעדכון המאפיין של איש הקשר." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "אנשי קשר" @@ -238,57 +234,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -301,7 +314,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -309,125 +322,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "זהו אינו ספר הכתובות שלך" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "לא ניתן לאתר איש קשר" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "כתובת" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "טלפון" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "דואר אלקטרוני" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "ארגון" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "עבודה" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "בית" -#: lib/app.php:133 -msgid "Mobile" -msgstr "נייד" - -#: lib/app.php:135 -msgid "Text" -msgstr "טקסט" - -#: lib/app.php:136 -msgid "Voice" -msgstr "קולי" - -#: lib/app.php:137 -msgid "Message" -msgstr "הודעה" - -#: lib/app.php:138 -msgid "Fax" -msgstr "פקס" - -#: lib/app.php:139 -msgid "Video" -msgstr "וידאו" - -#: lib/app.php:140 -msgid "Pager" -msgstr "זימונית" - -#: lib/app.php:146 -msgid "Internet" -msgstr "אינטרנט" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "יום הולדת" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "נייד" + +#: lib/app.php:203 +msgid "Text" +msgstr "טקסט" + +#: lib/app.php:204 +msgid "Voice" +msgstr "קולי" + +#: lib/app.php:205 +msgid "Message" +msgstr "הודעה" + +#: lib/app.php:206 +msgid "Fax" +msgstr "פקס" + +#: lib/app.php:207 +msgid "Video" +msgstr "וידאו" + +#: lib/app.php:208 +msgid "Pager" +msgstr "זימונית" + +#: lib/app.php:215 +msgid "Internet" +msgstr "אינטרנט" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "יום הולדת" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -439,6 +483,14 @@ msgstr "יום ההולדת של {name}" msgid "Contact" msgstr "איש קשר" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "הוספת איש קשר" @@ -535,13 +587,18 @@ msgstr "" msgid "Edit name details" msgstr "ערוך פרטי שם" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "ארגון" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "מחיקה" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "כינוי" @@ -549,7 +606,7 @@ msgstr "כינוי" msgid "Enter nickname" msgstr "הכנס כינוי" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -565,7 +622,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "קבוצות" @@ -577,63 +634,84 @@ msgstr "הפרד קבוצות עם פסיקים" msgid "Edit groups" msgstr "ערוך קבוצות" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "מועדף" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "אנא הזן כתובת דוא\"ל חוקית" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "הזן כתובת דוא\"ל" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "כתובת" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "מחק כתובת דוא\"ל" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "הכנס מספר טלפון" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "מחק מספר טלפון" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "ראה במפה" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "ערוך פרטי כתובת" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "הוסף הערות כאן." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "הוסף שדה" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "טלפון" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "דואר אלקטרוני" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "כתובת" + +#: templates/part.contact.php:133 msgid "Note" msgstr "הערה" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "הורדת איש קשר" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "מחיקת איש קשר" @@ -804,19 +882,15 @@ msgstr "איך לך אנשי קשר בספר הכתובות" msgid "Add contact" msgstr "הוסף איש קשר" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "הגדר ספרי כתובות" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -845,33 +919,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "הורדה" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "עריכה" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "פנקס כתובות חדש" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "שמירה" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "ביטול" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/he/files.po b/l10n/he/files.po index 760821f2eb..ae9614b348 100644 --- a/l10n/he/files.po +++ b/l10n/he/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,11 +54,7 @@ msgstr "הכתיבה לכונן נכשלה" msgid "Files" msgstr "קבצים" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "מחיקה" @@ -82,59 +78,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "יוצר קובץ ZIP, אנא המתן." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "לא יכול להעלות את הקובץ מכיוון שזו תקיה או שמשקל הקובץ 0 בתים" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "שגיאת העלאה" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "ממתין" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "ההעלאה בוטלה." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "שם לא חוקי, '/' אסור לשימוש." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "גודל" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "זמן שינוי" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "תקיה" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "תקיות" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "קובץ" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "קבצים" diff --git a/l10n/he/files_sharing.po b/l10n/he/files_sharing.po index 30342046df..75c35f1462 100644 --- a/l10n/he/files_sharing.po +++ b/l10n/he/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/he/settings.po b/l10n/he/settings.po index 194fa463ab..cd199ce76a 100644 --- a/l10n/he/settings.po +++ b/l10n/he/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/owncloud/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -229,7 +229,7 @@ msgid "Other" msgstr "אחר" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/hr/contacts.po b/l10n/hr/contacts.po index 75ab0abdb2..1e98b00807 100644 --- a/l10n/hr/contacts.po +++ b/l10n/hr/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "Pogreška pri (de)aktivaciji adresara." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id nije postavljen." @@ -81,18 +81,18 @@ msgstr "Morate ispuniti barem jedno od adresnih polja." msgid "Trying to add duplicate property: " msgstr "Pokušali ste dodati duplo svojstvo:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informacija o vCard je neispravna. Osvježite stranicu." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Pogreška pri brisanju svojstva kontakta." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Nedostupan ID identifikator" @@ -113,10 +113,6 @@ msgstr "Informacije o VCard su pogrešne. Molimo, učitajte ponovno stranicu:" msgid "Something went FUBAR. " msgstr "Nešto je otišlo... krivo..." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Pogreška pri ažuriranju svojstva kontakta." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontakti" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -300,7 +313,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ovo nije vaš adresar." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakt ne postoji." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresa" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizacija" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Posao" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Kuća" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobitel" - -#: lib/app.php:135 -msgid "Text" -msgstr "Tekst" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Glasovno" - -#: lib/app.php:137 -msgid "Message" -msgstr "Poruka" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Rođendan" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobitel" + +#: lib/app.php:203 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Glasovno" + +#: lib/app.php:205 +msgid "Message" +msgstr "Poruka" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Rođendan" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -438,6 +482,14 @@ msgstr "{name} Rođendan" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Dodaj kontakt" @@ -534,13 +586,18 @@ msgstr "" msgid "Edit name details" msgstr "Uredi detalje imena" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizacija" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Obriši" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Nadimak" @@ -548,7 +605,7 @@ msgstr "Nadimak" msgid "Enter nickname" msgstr "Unesi nadimank" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -564,7 +621,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupe" @@ -576,63 +633,84 @@ msgstr "" msgid "Edit groups" msgstr "Uredi grupe" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferirano" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Unesi email adresu" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Unesi broj telefona" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Prikaži na karti" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Uredi detalje adrese" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Dodaj bilješke ovdje." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Dodaj polje" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresa" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Bilješka" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Preuzmi kontakt" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Izbriši kontakt" @@ -803,19 +881,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Preuzimanje" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Uredi" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Novi adresar" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Spremi" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Prekini" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/hr/files.po b/l10n/hr/files.po index 2cd29927c8..b14a71388e 100644 --- a/l10n/hr/files.po +++ b/l10n/hr/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "Neuspjelo pisanje na disk" msgid "Files" msgstr "Datoteke" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Briši" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "generiranje ZIP datoteke, ovo može potrajati." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nemoguće poslati datoteku jer je prazna ili je direktorij" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Pogreška pri slanju" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "U tijeku" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Slanje poništeno." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Neispravan naziv, znak '/' nije dozvoljen." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Veličina" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Zadnja promjena" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "mapa" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "mape" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "datoteka" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "datoteke" diff --git a/l10n/hr/files_sharing.po b/l10n/hr/files_sharing.po index 218ed39d84..902174e80e 100644 --- a/l10n/hr/files_sharing.po +++ b/l10n/hr/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: hr\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/hr/settings.po b/l10n/hr/settings.po index 77abd3cbb3..1d03b6f4e4 100644 --- a/l10n/hr/settings.po +++ b/l10n/hr/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Croatian (http://www.transifex.com/projects/p/owncloud/language/hr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "ostali" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/hu_HU/contacts.po b/l10n/hu_HU/contacts.po index 5c441e68be..e1ab92a5a4 100644 --- a/l10n/hu_HU/contacts.po +++ b/l10n/hu_HU/contacts.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +26,7 @@ msgid "Error (de)activating addressbook." msgstr "Címlista (de)aktiválása sikertelen" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID nincs beállítva" @@ -83,18 +83,18 @@ msgstr "Legalább egy címmező kitöltendő" msgid "Trying to add duplicate property: " msgstr "Kísérlet dupla tulajdonság hozzáadására: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "A vCardról szóló információ helytelen. Töltsd újra az oldalt." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Hiba a kapcsolat-tulajdonság törlésekor" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Hiányzó ID" @@ -115,10 +115,6 @@ msgstr "Helytelen információ a vCardról. Töltse újra az oldalt: " msgid "Something went FUBAR. " msgstr "Valami balul sült el." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Hiba a kapcsolat-tulajdonság frissítésekor" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -222,7 +218,7 @@ msgstr "Ideiglenes kép betöltése sikertelen" msgid "No file was uploaded. Unknown error" msgstr "Nem történt feltöltés. Ismeretlen hiba" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kapcsolatok" @@ -239,57 +235,74 @@ msgid "Couldn't get a valid address." msgstr "Érvényes cím lekérése sikertelen" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Hiba" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Ezt a tulajdonságot muszáj kitölteni" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Sorbarakás sikertelen" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "A 'deleteProperty' argumentum nélkül lett meghívva. Kérjük, jelezze a hibát." -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Név szerkesztése" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Nincs kiválasztva feltöltendő fájl" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "A feltöltendő fájl mérete meghaladja a megengedett mértéket" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Típus kiválasztása" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Eredmény: " @@ -302,7 +315,7 @@ msgstr " beimportálva, " msgid " failed." msgstr " sikertelen" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -310,125 +323,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ez nem a te címjegyzéked." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kapcsolat nem található." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Cím" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefonszám" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Szervezet" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Munkahelyi" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Otthoni" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobiltelefonszám" - -#: lib/app.php:135 -msgid "Text" -msgstr "Szöveg" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Hang" - -#: lib/app.php:137 -msgid "Message" -msgstr "Üzenet" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Személyhívó" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Születésnap" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobiltelefonszám" + +#: lib/app.php:203 +msgid "Text" +msgstr "Szöveg" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Hang" + +#: lib/app.php:205 +msgid "Message" +msgstr "Üzenet" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Személyhívó" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Születésnap" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -440,6 +484,14 @@ msgstr "{name} születésnapja" msgid "Contact" msgstr "Kapcsolat" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Kapcsolat hozzáadása" @@ -536,13 +588,18 @@ msgstr "Formátum egyedi, Rövid név, Teljes név, Visszafelé vagy Visszafelé msgid "Edit name details" msgstr "Név részleteinek szerkesztése" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Szervezet" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Törlés" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Becenév" @@ -550,7 +607,7 @@ msgstr "Becenév" msgid "Enter nickname" msgstr "Becenév megadása" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -566,7 +623,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "yyyy-mm-dd" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Csoportok" @@ -578,63 +635,84 @@ msgstr "Vesszővel válassza el a csoportokat" msgid "Edit groups" msgstr "Csoportok szerkesztése" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Előnyben részesített" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Adjon meg érvényes email címet" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Adja meg az email címet" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Postai cím" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Email cím törlése" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Adja meg a telefonszámot" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Telefonszám törlése" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Megtekintés a térképen" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Cím részleteinek szerkesztése" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Megjegyzések" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Mező hozzáadása" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefonszám" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Cím" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Jegyzet" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Kapcsolat letöltése" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Kapcsolat törlése" @@ -805,19 +883,15 @@ msgstr "Nincsenek kapcsolatok a címlistában" msgid "Add contact" msgstr "Kapcsolat hozzáadása" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Címlisták beállítása" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -846,33 +920,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Letöltés" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Szerkesztés" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Új címlista" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Mentés" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Mégsem" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/hu_HU/files.po b/l10n/hu_HU/files.po index afa43a5036..7ad223a345 100644 --- a/l10n/hu_HU/files.po +++ b/l10n/hu_HU/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,87 +54,83 @@ msgstr "Nem írható lemezre" msgid "Files" msgstr "Fájlok" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Törlés" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "már létezik" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "cserél" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "mégse" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "kicserélve" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "-val/-vel" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "visszavon" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "törölve" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "ZIP-fájl generálása, ez eltarthat egy ideig." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nem tölthető fel, mert mappa volt, vagy 0 byte méretű" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Feltöltési hiba" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Folyamatban" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Feltöltés megszakítva" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Érvénytelen név, a '/' nem megengedett" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Méret" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Módosítva" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "mappa" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "mappák" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fájl" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "fájlok" diff --git a/l10n/hu_HU/files_sharing.po b/l10n/hu_HU/files_sharing.po index 582e43e332..3b03c6a943 100644 --- a/l10n/hu_HU/files_sharing.po +++ b/l10n/hu_HU/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: hu_HU\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/hu_HU/settings.po b/l10n/hu_HU/settings.po index 4040e9e564..0b5b94d6c6 100644 --- a/l10n/hu_HU/settings.po +++ b/l10n/hu_HU/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Hungarian (Hungary) (http://www.transifex.com/projects/p/owncloud/language/hu_HU/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,8 +228,8 @@ msgid "Other" msgstr "Egyéb" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "al-Admin" +msgid "Group Admin" +msgstr "" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/hy/contacts.po b/l10n/hy/contacts.po index 582ad7d76f..4cffb4779e 100644 --- a/l10n/hy/contacts.po +++ b/l10n/hy/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Armenian (http://www.transifex.com/projects/p/owncloud/language/hy/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/hy/files.po b/l10n/hy/files.po index 596ee32660..7d158306ff 100644 --- a/l10n/hy/files.po +++ b/l10n/hy/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Armenian (http://www.transifex.com/projects/p/owncloud/language/hy/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/hy/files_sharing.po b/l10n/hy/files_sharing.po index 082dcd23fc..d7ecd0cfa1 100644 --- a/l10n/hy/files_sharing.po +++ b/l10n/hy/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Armenian (http://www.transifex.com/projects/p/owncloud/language/hy/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: hy\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/hy/settings.po b/l10n/hy/settings.po index dcc8a87679..13b4e16635 100644 --- a/l10n/hy/settings.po +++ b/l10n/hy/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Armenian (http://www.transifex.com/projects/p/owncloud/language/hy/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/ia/contacts.po b/l10n/ia/contacts.po index 5a436a7a25..8b6bbeb675 100644 --- a/l10n/ia/contacts.po +++ b/l10n/ia/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -81,18 +81,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -113,10 +113,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Contactos" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -300,7 +313,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Iste non es tu libro de adresses" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Contacto non poterea esser legite" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresse" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telephono" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-posta" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisation" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Travalio" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Domo" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobile" - -#: lib/app.php:135 -msgid "Text" -msgstr "Texto" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voce" - -#: lib/app.php:137 -msgid "Message" -msgstr "Message" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Anniversario" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobile" + +#: lib/app.php:203 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voce" + +#: lib/app.php:205 +msgid "Message" +msgstr "Message" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Anniversario" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -438,6 +482,14 @@ msgstr "" msgid "Contact" msgstr "Contacto" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Adder contacto" @@ -534,13 +586,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisation" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Deler" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Pseudonymo" @@ -548,7 +605,7 @@ msgstr "Pseudonymo" msgid "Enter nickname" msgstr "Inserer pseudonymo" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -564,7 +621,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Gruppos" @@ -576,63 +633,84 @@ msgstr "" msgid "Edit groups" msgstr "Modificar gruppos" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferite" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Entrar un adresse de e-posta" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Deler adresse de E-posta" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Entrar un numero de telephono" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Deler numero de telephono" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Vider in un carta" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Adder notas hic" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Adder campo" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Phono" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-posta" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresse" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Discargar contacto" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Deler contacto" @@ -803,19 +881,15 @@ msgstr "" msgid "Add contact" msgstr "Adder adressario" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Discargar" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Modificar" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nove adressario" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Salveguardar" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Cancellar" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/ia/files.po b/l10n/ia/files.po index 5e995f4fbf..64f2fc617a 100644 --- a/l10n/ia/files.po +++ b/l10n/ia/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "" msgid "Files" msgstr "Files" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Deler" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Dimension" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificate" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/ia/files_sharing.po b/l10n/ia/files_sharing.po index 1fe706ecf4..55cfbbcf2e 100644 --- a/l10n/ia/files_sharing.po +++ b/l10n/ia/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: ia\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/ia/settings.po b/l10n/ia/settings.po index 62fb9fe13f..fe56aae5b9 100644 --- a/l10n/ia/settings.po +++ b/l10n/ia/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Interlingua (http://www.transifex.com/projects/p/owncloud/language/ia/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "Altere" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/id/contacts.po b/l10n/id/contacts.po index 3e58eff041..0b3df912c2 100644 --- a/l10n/id/contacts.po +++ b/l10n/id/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/id/files.po b/l10n/id/files.po index 8b632afd50..3a96e71072 100644 --- a/l10n/id/files.po +++ b/l10n/id/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "Gagal menulis ke disk" msgid "Files" msgstr "Berkas" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Hapus" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Ukuran" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Dimodifikasi" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/id/files_sharing.po b/l10n/id/files_sharing.po index d960b8fa4f..0a4a395144 100644 --- a/l10n/id/files_sharing.po +++ b/l10n/id/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: id\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/id/settings.po b/l10n/id/settings.po index d8c65bc9f6..8b4f28abc2 100644 --- a/l10n/id/settings.po +++ b/l10n/id/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (http://www.transifex.com/projects/p/owncloud/language/id/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "Lain-lain" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/id_ID/contacts.po b/l10n/id_ID/contacts.po index 2fec0e3728..a7964324da 100644 --- a/l10n/id_ID/contacts.po +++ b/l10n/id_ID/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/owncloud/language/id_ID/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/id_ID/files.po b/l10n/id_ID/files.po index cc6601b9fa..4e35fb7c4e 100644 --- a/l10n/id_ID/files.po +++ b/l10n/id_ID/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/owncloud/language/id_ID/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/id_ID/files_sharing.po b/l10n/id_ID/files_sharing.po index e98ec0d21f..fdba039609 100644 --- a/l10n/id_ID/files_sharing.po +++ b/l10n/id_ID/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/owncloud/language/id_ID/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: id_ID\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/id_ID/settings.po b/l10n/id_ID/settings.po index d03aaed81d..e6873fc49b 100644 --- a/l10n/id_ID/settings.po +++ b/l10n/id_ID/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Indonesian (Indonesia) (http://www.transifex.com/projects/p/owncloud/language/id_ID/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/it/admin_dependencies_chk.po b/l10n/it/admin_dependencies_chk.po index a999a2c2bd..46d1082e63 100644 --- a/l10n/it/admin_dependencies_chk.po +++ b/l10n/it/admin_dependencies_chk.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 14:54+0000\n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 05:51+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -59,7 +59,7 @@ msgstr "Il modulo php-xml è richiesto per condividere i file con webdav." msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "La direttiva allow_url_fopen del tuo php.ini deve essere impostata a 1 per recuperare la base di conoscenza dai server di OCS" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." diff --git a/l10n/it/admin_migrate.po b/l10n/it/admin_migrate.po index df7e4841cc..2da23d877f 100644 --- a/l10n/it/admin_migrate.po +++ b/l10n/it/admin_migrate.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 14:55+0000\n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 05:47+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -20,7 +20,7 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "Esporta questa istanza di ownClou" +msgstr "Esporta questa istanza di ownCloud" #: templates/settings.php:4 msgid "" diff --git a/l10n/it/contacts.po b/l10n/it/contacts.po index b702f2eab3..3512cf8d11 100644 --- a/l10n/it/contacts.po +++ b/l10n/it/contacts.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 06:59+0000\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 05:41+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -26,7 +26,7 @@ msgid "Error (de)activating addressbook." msgstr "Errore nel (dis)attivare la rubrica." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID non impostato." @@ -83,18 +83,18 @@ msgstr "Deve essere inserito almeno un indirizzo." msgid "Trying to add duplicate property: " msgstr "P" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Errore durante l'aggiunta della proprietà del contatto: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Parametro IM mancante." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "IM sconosciuto:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informazioni sulla vCard non corrette. Ricarica la pagina." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Errore durante l'eliminazione della proprietà del contatto." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID mancante" @@ -115,10 +115,6 @@ msgstr "Le informazioni della vCard non sono corrette. Ricarica la pagina: " msgid "Something went FUBAR. " msgstr "Qualcosa è andato storto. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Errore durante l'aggiornamento della proprietà del contatto." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -222,7 +218,7 @@ msgstr "Impossibile caricare l'immagine temporanea: " msgid "No file was uploaded. Unknown error" msgstr "Nessun file è stato inviato. Errore sconosciuto" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Contatti" @@ -239,57 +235,74 @@ msgid "Couldn't get a valid address." msgstr "Impossibile ottenere un indirizzo valido." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Errore" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "Non hai i permessi per aggiungere contatti a" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Seleziona una delle tue rubriche." + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Errore relativo ai permessi" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Questa proprietà non può essere vuota." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Impossibile serializzare gli elementi." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' invocata senza l'argomento di tipo. Segnalalo a bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Modifica il nome" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Nessun file selezionato per l'invio" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Il file che stai cercando di inviare supera la dimensione massima per l'invio dei file su questo server." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "Errore durante il caricamento dell'immagine di profilo." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Seleziona il tipo" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "Alcuni contatti sono marcati per l'eliminazione, ma non sono stati ancora rimossi. Attendi fino al completamento dell'operazione." +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Vuoi unire queste rubriche?" + #: js/loader.js:49 msgid "Result: " msgstr "Risultato: " @@ -302,7 +315,7 @@ msgstr " importato, " msgid " failed." msgstr " non riuscito." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "Il nome visualizzato non può essere vuoto." @@ -310,125 +323,156 @@ msgstr "Il nome visualizzato non può essere vuoto." msgid "Addressbook not found: " msgstr "Rubrica non trovata:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Questa non è la tua rubrica." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Il contatto non può essere trovato." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Indirizzo" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefono" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizzazione" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Lavoro" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Casa" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Cellulare" - -#: lib/app.php:135 -msgid "Text" -msgstr "Testo" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voce" - -#: lib/app.php:137 -msgid "Message" -msgstr "Messaggio" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Cercapersone" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Compleanno" - -#: lib/app.php:184 -msgid "Business" -msgstr "Lavoro" - -#: lib/app.php:185 -msgid "Call" -msgstr "Chiama" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Client" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "Corriere" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Festività" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Idee" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Viaggio" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Anniversario" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Riunione" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Altro" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Cellulare" + +#: lib/app.php:203 +msgid "Text" +msgstr "Testo" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voce" + +#: lib/app.php:205 +msgid "Message" +msgstr "Messaggio" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Cercapersone" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Compleanno" + +#: lib/app.php:253 +msgid "Business" +msgstr "Lavoro" + +#: lib/app.php:254 +msgid "Call" +msgstr "Chiama" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Client" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Corriere" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Festività" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Idee" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Viaggio" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Anniversario" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Riunione" + +#: lib/app.php:263 msgid "Personal" msgstr "Personale" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Progetti" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Domande" @@ -440,6 +484,14 @@ msgstr "Data di nascita di {name}" msgid "Contact" msgstr "Contatto" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "Non hai i permessi per modificare questo contatto." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "Non hai i permessi per eliminare questo contatto." + #: templates/index.php:14 msgid "Add Contact" msgstr "Aggiungi contatto" @@ -536,13 +588,18 @@ msgstr "Formato personalizzato, nome breve, nome completo, invertito o invertito msgid "Edit name details" msgstr "Modifica dettagli del nome" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizzazione" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Elimina" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Pseudonimo" @@ -550,7 +607,7 @@ msgstr "Pseudonimo" msgid "Enter nickname" msgstr "Inserisci pseudonimo" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Sito web" @@ -566,7 +623,7 @@ msgstr "Vai al sito web" msgid "dd-mm-yyyy" msgstr "gg-mm-aaaa" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Gruppi" @@ -578,63 +635,84 @@ msgstr "Separa i gruppi con virgole" msgid "Edit groups" msgstr "Modifica gruppi" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferito" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Specifica un indirizzo email valido" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Inserisci indirizzo email" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Invia per email" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Elimina l'indirizzo email" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Inserisci il numero di telefono" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Elimina il numero di telefono" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Client di messaggistica istantanea" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Elimina IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Visualizza sulla mappa" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Modifica dettagli dell'indirizzo" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Aggiungi qui le note." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Aggiungi campo" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefono" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Messaggistica istantanea" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Indirizzo" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Scarica contatto" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Elimina contatto" @@ -805,19 +883,15 @@ msgstr "Non hai contatti nella rubrica." msgid "Add contact" msgstr "Aggiungi contatto" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Configura rubriche" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Seleziona rubriche" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Inserisci il nome" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Inserisci una descrizione" @@ -846,33 +920,37 @@ msgid "Show read-only VCF link" msgstr "Mostra collegamento VCF in sola lettura" #: templates/settings.php:26 +msgid "Share" +msgstr "Condividi" + +#: templates/settings.php:29 msgid "Download" msgstr "Scarica" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Modifica" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nuova rubrica" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Nome" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Descrizione" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Salva" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Annulla" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Altro..." diff --git a/l10n/it/files.po b/l10n/it/files.po index 8e9ebacf2e..664d569fd4 100644 --- a/l10n/it/files.po +++ b/l10n/it/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-01 02:01+0200\n" -"PO-Revision-Date: 2012-07-31 21:18+0000\n" -"Last-Translator: Vincenzo Reale \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,11 +55,7 @@ msgstr "Scrittura su disco non riuscita" msgid "Files" msgstr "File" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Rimuovi condivisione" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Elimina" @@ -83,59 +79,59 @@ msgstr "sostituito" msgid "with" msgstr "con" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "annulla" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "eliminati" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "creazione file ZIP, potrebbe richiedere del tempo." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Impossibile inviare il file poiché è una cartella o ha dimensione 0 byte" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Errore di invio" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "In corso" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Invio annullato" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Nome non valido" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Dimensione" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificato" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "cartella" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "cartelle" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "file" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "file" diff --git a/l10n/it/files_sharing.po b/l10n/it/files_sharing.po index ffb62b14fe..94313868ad 100644 --- a/l10n/it/files_sharing.po +++ b/l10n/it/files_sharing.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 12:10+0000\n" -"Last-Translator: Vincenzo Reale \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,38 +18,18 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "I tuoi file condivisi" +#: templates/get.php:4 +msgid "Size" +msgstr "Dimensione" -#: templates/list.php:6 -msgid "Item" -msgstr "Elemento" +#: templates/get.php:5 +msgid "Modified" +msgstr "Modificato" -#: templates/list.php:7 -msgid "Shared With" -msgstr "Condiviso con" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Elimina tutto" -#: templates/list.php:8 -msgid "Permissions" -msgstr "Permessi" - -#: templates/list.php:16 -msgid "Read" -msgstr "Lettura" - -#: templates/list.php:16 -msgid "Edit" -msgstr "Modifica" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "Eliminazione" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/it/settings.po b/l10n/it/settings.po index 4867951b19..b14c9fcd47 100644 --- a/l10n/it/settings.po +++ b/l10n/it/settings.po @@ -14,8 +14,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 14:56+0000\n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 20:01+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -162,7 +162,7 @@ msgstr "Scaricamento" #: templates/personal.php:19 msgid "Your password got changed" -msgstr "La tua password è stata cambiat" +msgstr "La tua password è stata cambiata" #: templates/personal.php:20 msgid "Unable to change your password" @@ -194,7 +194,7 @@ msgstr "Il tuo indirizzo email" #: templates/personal.php:32 msgid "Fill in an email address to enable password recovery" -msgstr "Inserici il tuo indirizzo email per abilitare il recupero della password" +msgstr "Inserisci il tuo indirizzo email per abilitare il recupero della password" #: templates/personal.php:38 templates/personal.php:39 msgid "Language" @@ -233,8 +233,8 @@ msgid "Other" msgstr "Altro" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "Gruppo di amministrazione" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/it/tasks.po b/l10n/it/tasks.po index 829120fa8a..6e5f07a087 100644 --- a/l10n/it/tasks.po +++ b/l10n/it/tasks.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 12:07+0000\n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 06:00+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -48,7 +48,7 @@ msgstr "9=minima" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Riepilogo vuoto" #: lib/app.php:93 msgid "Invalid percent complete" @@ -64,27 +64,27 @@ msgstr "Aggiungi attività" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Ordina per scadenza" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Ordina per elenco" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Ordina per completamento" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Ordina per posizione" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Ordina per priorità" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Ordina per etichetta" #: templates/tasks.php:16 msgid "Loading tasks..." @@ -96,11 +96,11 @@ msgstr "Importante" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Più" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Meno" #: templates/tasks.php:29 msgid "Delete" diff --git a/l10n/it/user_ldap.po b/l10n/it/user_ldap.po index cfd6cf566e..e99e56fc15 100644 --- a/l10n/it/user_ldap.po +++ b/l10n/it/user_ldap.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 14:56+0000\n" -"Last-Translator: Innocenzo Ventre \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 20:31+0000\n" +"Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -57,23 +57,23 @@ msgstr "Per l'accesso anonimo, lasciare vuoti i campi DN e Password" #: templates/settings.php:12 msgid "User Login Filter" -msgstr "Filtro per il login utente" +msgstr "Filtro per l'accesso utente" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "Specifica quale filtro utilizzare quando si tenta il login. %%uid sostituisce il nome utente all'atto del login." +msgstr "Specifica quale filtro utilizzare quando si tenta l'accesso. %%uid sostituisce il nome utente all'atto dell'accesso." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "utilizza il segnaposto %%uid, per esempio \"uid=%%uid\"" +msgstr "utilizza il segnaposto %%uid, ad esempio \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "Filtro per la lista utente" +msgstr "Filtro per l'elenco utenti" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." diff --git a/l10n/it/user_openid.po b/l10n/it/user_openid.po index b769535161..b8036426bc 100644 --- a/l10n/it/user_openid.po +++ b/l10n/it/user_openid.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 11:46+0000\n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 20:39+0000\n" "Last-Translator: Vincenzo Reale \n" "Language-Team: Italian (http://www.transifex.com/projects/p/owncloud/language/it/)\n" "MIME-Version: 1.0\n" @@ -20,7 +20,7 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "Questo è un server OpenID. Per ulteriori informazioni, vedi" +msgstr "Questo è un server OpenID. Per ulteriori informazioni, vedi " #: templates/nomode.php:14 msgid "Identity: " diff --git a/l10n/ja_JP/admin_dependencies_chk.po b/l10n/ja_JP/admin_dependencies_chk.po index 1d928c91bd..be8f217eba 100644 --- a/l10n/ja_JP/admin_dependencies_chk.po +++ b/l10n/ja_JP/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 03:08+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "php-jsonモジュールはアプリケーション間の内部通信に必要です" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "php-curlモジュールはブックマーク追加時のページタイトル取得に必要です" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "php-gdモジュールはサムネイル画像の生成に必要です" #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "php-ldapモジュールはLDAPサーバへの接続に必要です" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "php-zipモジュールは複数ファイルの同時ダウンロードに必要です" #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "php-mb_multibyteモジュールはエンコードを正しく扱うために必要です" #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "php-ctypeモジュールはデータのバリデーションに必要です" #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "php-xmlモジュールはWebDAVでのファイル共有に必要です" #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "php.iniのallow_url_fopenはOCSサーバから知識ベースを取得するために1に設定しなくてはなりません" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "php-pdoモジュールはデータベースにownCloudのデータを格納するために必要です" #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "依存関係の状況" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "利用先 :" diff --git a/l10n/ja_JP/admin_migrate.po b/l10n/ja_JP/admin_migrate.po index b0603a4f42..4411d9e77c 100644 --- a/l10n/ja_JP/admin_migrate.po +++ b/l10n/ja_JP/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 05:29+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "ownCloudをエクスポート" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "このownCloudのデータを含む圧縮ファイルを生成します。\nエクスポートの種類を選択してください:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "エクスポート" diff --git a/l10n/ja_JP/calendar.po b/l10n/ja_JP/calendar.po index 90254140d2..605bf02d2e 100644 --- a/l10n/ja_JP/calendar.po +++ b/l10n/ja_JP/calendar.po @@ -4,13 +4,14 @@ # # Translators: # Daisuke Deguchi , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-22 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 02:29+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -68,7 +69,7 @@ msgstr "タイムゾーンが変更されました" msgid "Invalid request" msgstr "無効なリクエストです" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:37 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "カレンダー" @@ -159,7 +160,7 @@ msgstr "週の始まり" #: lib/app.php:351 lib/app.php:361 msgid "by" -msgstr "" +msgstr "による" #: lib/app.php:359 lib/app.php:399 msgid "unnamed" @@ -469,7 +470,7 @@ msgstr "月" #: templates/calendar.php:41 msgid "List" -msgstr "リスト" +msgstr "予定リスト" #: templates/calendar.php:45 msgid "Today" @@ -477,7 +478,7 @@ msgstr "今日" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "設定" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -731,7 +732,7 @@ msgstr "at" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "一般" #: templates/settings.php:15 msgid "Timezone" @@ -739,11 +740,11 @@ msgstr "タイムゾーン" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "自動的にタイムゾーンを更新" #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "時刻の表示形式" #: templates/settings.php:57 msgid "24h" @@ -755,7 +756,7 @@ msgstr "12h" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "1週間の初めの曜日" #: templates/settings.php:76 msgid "Cache" @@ -763,11 +764,11 @@ msgstr "キャッシュ" #: templates/settings.php:80 msgid "Clear cache for repeating events" -msgstr "イベントを繰り返すためにキャッシュをクリアしてください" +msgstr "繰り返しイベントのキャッシュをクリア" #: templates/settings.php:85 msgid "URLs" -msgstr "" +msgstr "URL" #: templates/settings.php:87 msgid "Calendar CalDAV syncing addresses" diff --git a/l10n/ja_JP/contacts.po b/l10n/ja_JP/contacts.po index 1643d768f3..0cf04a8a0a 100644 --- a/l10n/ja_JP/contacts.po +++ b/l10n/ja_JP/contacts.po @@ -4,13 +4,14 @@ # # Translators: # Daisuke Deguchi , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 02:39+0000\n" +"Last-Translator: ttyn \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,21 +21,21 @@ msgstr "" #: ajax/addressbook/activate.php:24 ajax/addressbook/update.php:32 msgid "Error (de)activating addressbook." -msgstr "アドレスブックの有効/無効化に失敗しました。" +msgstr "アドレス帳の有効/無効化に失敗しました。" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "idが設定されていません。" #: ajax/addressbook/update.php:24 msgid "Cannot update addressbook with an empty name." -msgstr "空白の名前でアドレスブックを更新することはできません。" +msgstr "空白の名前でアドレス帳を更新することはできません。" #: ajax/addressbook/update.php:28 msgid "Error updating addressbook." -msgstr "アドレスブックの更新に失敗しました。" +msgstr "アドレス帳の更新に失敗しました。" #: ajax/categories/categoriesfor.php:17 msgid "No ID provided" @@ -50,7 +51,7 @@ msgstr "削除するカテゴリが選択されていません。" #: ajax/categories/delete.php:26 msgid "No address books found." -msgstr "アドレスブックが見つかりません。" +msgstr "アドレス帳が見つかりません。" #: ajax/categories/delete.php:34 msgid "No contacts found." @@ -80,18 +81,18 @@ msgstr "住所の項目のうち1つは入力して下さい。" msgid "Trying to add duplicate property: " msgstr "重複する属性を追加: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "コンタクト属性の追加エラー: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "IMのパラメータが不足しています。" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "不明なIM:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "vCardの情報に誤りがあります。ページをリロードして下さい。" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "連絡先の削除に失敗しました。" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "IDが見つかりません" @@ -112,10 +113,6 @@ msgstr "vCardの情報が正しくありません。ページを再読み込み msgid "Something went FUBAR. " msgstr "何かがFUBARへ移動しました。" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "連絡先の更新に失敗しました。" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -135,7 +132,7 @@ msgstr "写真の読み込みは無効です。" #: ajax/editname.php:31 msgid "Contact ID is missing." -msgstr "コンタクトIDが見つかりません。" +msgstr "連絡先 IDが見つかりません。" #: ajax/oc_photo.php:32 msgid "No photo path was submitted." @@ -151,7 +148,7 @@ msgstr "画像の読み込みエラー。" #: ajax/savecrop.php:69 msgid "Error getting contact object." -msgstr "コンタクトオブジェクトの取得エラー。" +msgstr "連絡先オブジェクトの取得エラー。" #: ajax/savecrop.php:79 msgid "Error getting PHOTO property." @@ -159,7 +156,7 @@ msgstr "写真属性の取得エラー。" #: ajax/savecrop.php:98 msgid "Error saving contact." -msgstr "コンタクトの保存エラー。" +msgstr "連絡先の保存エラー。" #: ajax/savecrop.php:109 msgid "Error resizing image" @@ -219,7 +216,7 @@ msgstr "一時的な画像の読み込みができませんでした: " msgid "No file was uploaded. Unknown error" msgstr "ファイルは何もアップロードされていません。不明なエラー" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "連絡先" @@ -236,56 +233,73 @@ msgid "Couldn't get a valid address." msgstr "有効なアドレスを取得できませんでした。" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "エラー" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "連絡先を追加する権限がありません" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "アドレス帳を一つ選択してください" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "権限エラー" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "この属性は空にできません。" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "要素をシリアライズできませんでした。" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' は型の引数無しで呼び出されました。bugs.owncloud.org へ報告してください。" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "名前を編集" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "アップロードするファイルが選択されていません。" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "アップロードしようとしているファイルは、このサーバの最大ファイルアップロードサイズを超えています。" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "プロファイルの画像の読み込みエラー" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "タイプを選択" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "" +msgstr "いくつかの連絡先が削除とマークされていますが、まだ削除されていません。削除するまでお待ちください。" + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "これらのアドレス帳をマージしてもよろしいですか?" #: js/loader.js:49 msgid "Result: " @@ -299,133 +313,164 @@ msgstr " をインポート、 " msgid " failed." msgstr " は失敗しました。" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "表示名は空にできません。" #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "連絡先が見つかりません:" +msgstr "アドレス帳が見つかりません:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "これはあなたの電話帳ではありません。" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "連絡先を見つける事ができません。" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "住所" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "電話番号" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "メールアドレス" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "所属" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "Googleトーク" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "勤務先" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "住居" -#: lib/app.php:133 -msgid "Mobile" -msgstr "携帯電話" - -#: lib/app.php:135 -msgid "Text" -msgstr "TTY TDD" - -#: lib/app.php:136 -msgid "Voice" -msgstr "音声番号" - -#: lib/app.php:137 -msgid "Message" -msgstr "メッセージ" - -#: lib/app.php:138 -msgid "Fax" -msgstr "FAX" - -#: lib/app.php:139 -msgid "Video" -msgstr "テレビ電話" - -#: lib/app.php:140 -msgid "Pager" -msgstr "ポケベル" - -#: lib/app.php:146 -msgid "Internet" -msgstr "インターネット" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "誕生日" - -#: lib/app.php:184 -msgid "Business" -msgstr "ビジネス" - -#: lib/app.php:185 -msgid "Call" -msgstr "電話" - -#: lib/app.php:186 -msgid "Clients" -msgstr "顧客" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "運送会社" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "休日" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "アイデア" - -#: lib/app.php:190 -msgid "Journey" -msgstr "旅行" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "記念祭" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "打ち合わせ" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "その他" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "携帯電話" + +#: lib/app.php:203 +msgid "Text" +msgstr "TTY TDD" + +#: lib/app.php:204 +msgid "Voice" +msgstr "音声番号" + +#: lib/app.php:205 +msgid "Message" +msgstr "メッセージ" + +#: lib/app.php:206 +msgid "Fax" +msgstr "FAX" + +#: lib/app.php:207 +msgid "Video" +msgstr "テレビ電話" + +#: lib/app.php:208 +msgid "Pager" +msgstr "ポケベル" + +#: lib/app.php:215 +msgid "Internet" +msgstr "インターネット" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "誕生日" + +#: lib/app.php:253 +msgid "Business" +msgstr "ビジネス" + +#: lib/app.php:254 +msgid "Call" +msgstr "電話" + +#: lib/app.php:255 +msgid "Clients" +msgstr "顧客" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "運送会社" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "休日" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "アイデア" + +#: lib/app.php:259 +msgid "Journey" +msgstr "旅行" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "記念祭" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "打ち合わせ" + +#: lib/app.php:263 msgid "Personal" msgstr "個人" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "プロジェクト" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "質問" @@ -437,6 +482,14 @@ msgstr "{name}の誕生日" msgid "Contact" msgstr "連絡先" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "この連絡先を編集する権限がありません" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "この連絡先を削除する権限がありません" + #: templates/index.php:14 msgid "Add Contact" msgstr "連絡先の追加" @@ -451,7 +504,7 @@ msgstr "設定" #: templates/index.php:18 templates/settings.php:9 msgid "Addressbooks" -msgstr "電話帳" +msgstr "アドレス帳" #: templates/index.php:36 templates/part.import.php:24 msgid "Close" @@ -467,23 +520,23 @@ msgstr "ナビゲーション" #: templates/index.php:42 msgid "Next contact in list" -msgstr "リスト内の次のコンタクト" +msgstr "リスト内の次の連絡先" #: templates/index.php:44 msgid "Previous contact in list" -msgstr "リスト内の前のコンタクト" +msgstr "リスト内の前の連絡先" #: templates/index.php:46 msgid "Expand/collapse current addressbook" -msgstr "現在の連絡帳を展開する/折りたたむ" +msgstr "現在のアドレス帳を展開する/折りたたむ" #: templates/index.php:48 msgid "Next addressbook" -msgstr "次の連絡先" +msgstr "次のアドレス帳" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "前の連絡先" +msgstr "前のアドレス帳" #: templates/index.php:54 msgid "Actions" @@ -495,15 +548,15 @@ msgstr "連絡先リストを再読込する" #: templates/index.php:59 msgid "Add new contact" -msgstr "新しいコンタクトを追加" +msgstr "新しい連絡先を追加" #: templates/index.php:61 msgid "Add new addressbook" -msgstr "新しいアドレスブックを追加" +msgstr "新しいアドレス帳を追加" #: templates/index.php:63 msgid "Delete current contact" -msgstr "現在のコンタクトを削除" +msgstr "現在の連絡先を削除" #: templates/part.contact.php:17 msgid "Drop photo to upload" @@ -527,19 +580,24 @@ msgstr "ownCloudから写真を選択" #: templates/part.contact.php:35 msgid "Format custom, Short name, Full name, Reverse or Reverse with comma" -msgstr "" +msgstr "編集フォーマット、ショートネーム、フルネーム、逆順、カンマ区切りの逆順" #: templates/part.contact.php:36 msgid "Edit name details" msgstr "名前の詳細を編集" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "所属" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "削除" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "ニックネーム" @@ -547,7 +605,7 @@ msgstr "ニックネーム" msgid "Enter nickname" msgstr "ニックネームを入力" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "ウェブサイト" @@ -563,7 +621,7 @@ msgstr "Webサイトへ移動" msgid "dd-mm-yyyy" msgstr "yyyy-mm-dd" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "グループ" @@ -575,63 +633,84 @@ msgstr "コンマでグループを分割" msgid "Edit groups" msgstr "グループを編集" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "推奨" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." -msgstr "連絡先を追加" +msgstr "有効なメールアドレスを指定してください。" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "メールアドレスを入力" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "アドレスへメールを送る" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "メールアドレスを削除" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "電話番号を入力" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "電話番号を削除" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "インスタントメッセンジャー" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "IMを削除" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "地図で表示" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "住所の詳細を編集" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "ここにメモを追加。" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "項目を追加" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "電話番号" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "メールアドレス" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "インスタントメッセージ" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "住所" + +#: templates/part.contact.php:133 msgid "Note" msgstr "メモ" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "連絡先のダウンロード" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "連絡先の削除" @@ -696,11 +775,11 @@ msgstr "国名" #: templates/part.edit_name_dialog.php:16 msgid "Addressbook" -msgstr "アドレスブック" +msgstr "アドレス帳" #: templates/part.edit_name_dialog.php:23 msgid "Hon. prefixes" -msgstr "" +msgstr "敬称" #: templates/part.edit_name_dialog.php:27 msgid "Miss" @@ -740,7 +819,7 @@ msgstr "姓" #: templates/part.edit_name_dialog.php:41 msgid "Hon. suffixes" -msgstr "ストレージへの連絡先のアップロードエラー。" +msgstr "称号" #: templates/part.edit_name_dialog.php:45 msgid "J.D." @@ -776,15 +855,15 @@ msgstr "Sn." #: templates/part.import.php:1 msgid "Import a contacts file" -msgstr "コンタクトファイルをインポート" +msgstr "連絡先ファイルをインポート" #: templates/part.import.php:6 msgid "Please choose the addressbook" -msgstr "アドレスブックを選択してください" +msgstr "アドレス帳を選択してください" #: templates/part.import.php:10 msgid "create a new addressbook" -msgstr "新しいアドレスブックを作成" +msgstr "新しいアドレス帳を作成" #: templates/part.import.php:15 msgid "Name of new addressbook" @@ -792,29 +871,25 @@ msgstr "新しいアドレスブックの名前" #: templates/part.import.php:20 msgid "Importing contacts" -msgstr "コンタクトをインポート" +msgstr "連絡先をインポート" #: templates/part.no_contacts.php:3 msgid "You have no contacts in your addressbook." -msgstr "アドレスブックに連絡先が登録されていません。" +msgstr "アドレス帳に連絡先が登録されていません。" #: templates/part.no_contacts.php:5 msgid "Add contact" msgstr "連絡先を追加" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "アドレス帳を設定" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" -msgstr "連絡先を洗濯してください" +msgstr "アドレス帳を選択してください" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "名前を入力" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "説明を入力してください" @@ -843,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "読み取り専用のVCFリンクを表示" #: templates/settings.php:26 +msgid "Share" +msgstr "共有" + +#: templates/settings.php:29 msgid "Download" msgstr "ダウンロード" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "編集" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" -msgstr "新規電話帳" +msgstr "新規のアドレス帳" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "名前" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "説明" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "保存" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "取り消し" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "もっと..." diff --git a/l10n/ja_JP/files.po b/l10n/ja_JP/files.po index e014bfa99f..97c519439b 100644 --- a/l10n/ja_JP/files.po +++ b/l10n/ja_JP/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,87 +52,83 @@ msgstr "ディスクへの書き込みに失敗しました" msgid "Files" msgstr "ファイル" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "削除" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "既に存在します" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "置き換え" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "キャンセル" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "置換:" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "←" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "元に戻す" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "削除" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "ZIPファイルを生成中です、しばらくお待ちください。" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "アップロード使用としているファイルがディレクトリ、もしくはサイズが0バイトのため、アップロードできません。" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "アップロードエラー" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "保留" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "アップロードはキャンセルされました。" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "無効な名前、'/' は使用できません。" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "サイズ" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "更新日時" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "フォルダ" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "フォルダ" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "ファイル" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "ファイル" diff --git a/l10n/ja_JP/files_encryption.po b/l10n/ja_JP/files_encryption.po index 5cf8f5a4c0..c9941a81c9 100644 --- a/l10n/ja_JP/files_encryption.po +++ b/l10n/ja_JP/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 02:43+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "暗号化" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "暗号化から除外するファイルタイプ" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "なし" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "暗号化を有効にする" diff --git a/l10n/ja_JP/files_external.po b/l10n/ja_JP/files_external.po index 6096d9408f..1de6cdac43 100644 --- a/l10n/ja_JP/files_external.po +++ b/l10n/ja_JP/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 02:46+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,64 +20,64 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "外部ストレージ" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "マウントポイント" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "バックエンド" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "設定" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "オプション" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "適用範囲" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "マウントポイントを追加" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "未設定" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "すべてのユーザ" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "グループ" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "ユーザ" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "削除" #: templates/settings.php:88 msgid "SSL root certificates" -msgstr "" +msgstr "SSLルート証明書" #: templates/settings.php:102 msgid "Import Root Certificate" -msgstr "" +msgstr "ルート証明書をインポート" #: templates/settings.php:108 msgid "Enable User External Storage" -msgstr "" +msgstr "ユーザの外部ストレージを有効にする" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "ユーザに外部ストレージのマウントを許可する" diff --git a/l10n/ja_JP/files_sharing.po b/l10n/ja_JP/files_sharing.po index fcadb4bdc9..b76508218b 100644 --- a/l10n/ja_JP/files_sharing.po +++ b/l10n/ja_JP/files_sharing.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +19,18 @@ msgstr "" "Language: ja_JP\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "サイズ" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "変更" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "すべて削除" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "削除" diff --git a/l10n/ja_JP/files_versions.po b/l10n/ja_JP/files_versions.po index e61c39bff4..893e07db20 100644 --- a/l10n/ja_JP/files_versions.po +++ b/l10n/ja_JP/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 02:41+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "すべてのバージョンを削除する" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "ファイルのバージョン管理を有効にする" diff --git a/l10n/ja_JP/settings.po b/l10n/ja_JP/settings.po index 79aec21152..d269151c24 100644 --- a/l10n/ja_JP/settings.po +++ b/l10n/ja_JP/settings.po @@ -4,13 +4,14 @@ # # Translators: # Daisuke Deguchi , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 01:31+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -72,19 +73,19 @@ msgstr "セキュリティ警告" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "cron(自動定期実行)" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "ページを開く毎にタスクを1つ実行" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.phpをwebcronサービスに登録しました" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "システムのcronサービスを使用" #: templates/admin.php:39 msgid "Log" @@ -227,8 +228,8 @@ msgid "Other" msgstr "その他" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "サブ管理者" +msgid "Group Admin" +msgstr "グループ管理者" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/ja_JP/tasks.po b/l10n/ja_JP/tasks.po index fdd063c3ca..13b0423ca1 100644 --- a/l10n/ja_JP/tasks.po +++ b/l10n/ja_JP/tasks.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 03:40+0000\n" +"Last-Translator: ttyn \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,88 +21,88 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "無効な日付/時刻" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "タスク" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "カテゴリ無し" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "未指定" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=高" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=中" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=低" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "要旨が未記入" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "進捗%が不正" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "無効な優先度" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "タスクを追加" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "期日で並べ替え" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "リストで並び替え" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "完了で並べ替え" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "場所で並べ替え" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "優先度で並べ替え" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "ラベルで並べ替え" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "タスクをロード中..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "重要" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "詳細" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "閉じる" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "削除" diff --git a/l10n/ja_JP/user_ldap.po b/l10n/ja_JP/user_ldap.po index d19e9c5dd8..5c22b913b4 100644 --- a/l10n/ja_JP/user_ldap.po +++ b/l10n/ja_JP/user_ldap.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 05:33+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,146 +21,146 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "ホスト" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "SSL通信しない場合には、プロトコル名を省略することができます。そうでない場合には、ldaps:// から始めてください。" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "ベースDN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "拡張タブでユーザとグループのベースDNを指定することができます。" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "ユーザDN" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "クライアントユーザーのDNは、特定のものに結びつけることはしません。 例えば uid=agent,dc=example,dc=com. だと匿名アクセスの場合、DNとパスワードは空のままです。" #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "パスワード" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "匿名アクセスの場合は、DNとパスワードを空にしてください。" #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "ユーザログインフィルタ" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "ログインするときに適用するフィルターを定義する。%%uid がログイン時にユーザー名に置き換えられます。" #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "%%uid プレースホルダーを利用してください。例 \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "ユーザリストフィルタ" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "ユーザーを取得するときに適用するフィルターを定義する。" #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "プレースホルダーを利用しないでください。例 \"objectClass=person\"" #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "グループフィルタ" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "グループを取得するときに適用するフィルターを定義する。" #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "プレースホルダーを利用しないでください。例 \"objectClass=posixGroup\"" #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "ポート" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "ベースユーザツリー" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "ベースグループツリー" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "" +msgstr "グループとメンバーの関連付け" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "TLSを利用" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "SSL接続に利用しないでください、失敗します。" #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "大文字/小文字を区別しないLDAPサーバ(Windows)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "SSL証明書の確認を無効にする。" #: templates/settings.php:23 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "" +msgstr "接続がこのオプションでのみ動作する場合は、LDAPサーバのSSL証明書をownCloudサーバにインポートしてください。" #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "推奨しません、テスト目的でのみ利用してください。" #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "" +msgstr "ユーザ表示名のフィールド" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." -msgstr "" +msgstr "ユーザのownCloud名の生成に利用するLDAP属性。" #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "" +msgstr "グループ表示名のフィールド" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." -msgstr "" +msgstr "グループのownCloud名の生成に利用するLDAP属性。" #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "バイト" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "秒。変更後にキャッシュがクリアされます。" #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "ヘルプ" diff --git a/l10n/ja_JP/user_migrate.po b/l10n/ja_JP/user_migrate.po index 04d95df0be..71b2c612ed 100644 --- a/l10n/ja_JP/user_migrate.po +++ b/l10n/ja_JP/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 05:28+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,33 +20,33 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "エクスポート" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "" +msgstr "エクスポートファイルの生成時に何か不具合が発生しました。" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "エラーが発生しました" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "ユーザアカウントのエクスポート" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "あなたのownCloudアカウントを含む圧縮ファイルを生成します。" #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "ユーザアカウントをインポート" #: templates/settings.php:15 msgid "ownCloud User Zip" -msgstr "" +msgstr "ownCloudユーザZip" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "インポート" diff --git a/l10n/ja_JP/user_openid.po b/l10n/ja_JP/user_openid.po index 877dc59cdf..5fe4094e68 100644 --- a/l10n/ja_JP/user_openid.po +++ b/l10n/ja_JP/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daisuke Deguchi , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 06:36+0000\n" +"Last-Translator: Daisuke Deguchi \n" "Language-Team: Japanese (Japan) (http://www.transifex.com/projects/p/owncloud/language/ja_JP/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,36 +20,36 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "" +msgstr "これはOpenIDサーバのエンドポイントです。詳細は下記をチェックしてください。" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "識別子: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "レルム: " #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "ユーザ: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "ログイン" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "エラー: ユーザが選択されていません" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" -msgstr "" +msgstr "他のサイトにこのアドレスで認証することができます" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "" +msgstr "認証されたOpenIDプロバイダ" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "" +msgstr "Wordpressのアドレス、Identi.ca、…" diff --git a/l10n/ko/contacts.po b/l10n/ko/contacts.po index 5ade5e1187..410011e082 100644 --- a/l10n/ko/contacts.po +++ b/l10n/ko/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "주소록을 (비)활성화하는 데 실패했습니다." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "아이디가 설정되어 있지 않습니다. " @@ -81,18 +81,18 @@ msgstr "최소한 하나의 주소록 항목을 입력해야 합니다." msgid "Trying to add duplicate property: " msgstr "중복 속성 추가 시도: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "vCard 정보가 올바르지 않습니다. 페이지를 새로 고치십시오." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "연락처 속성을 삭제할 수 없습니다." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "아이디 분실" @@ -113,10 +113,6 @@ msgstr " vCard에 대한 정보가 잘못되었습니다. 페이지를 다시 msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "연락처 속성을 업데이트할 수 없습니다." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "임시 이미지를 불러올 수 없습니다. " msgid "No file was uploaded. Unknown error" msgstr "파일이 업로드 되지 않았습니다. 알 수 없는 오류." -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "연락처" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "유효한 주소를 얻을 수 없습니다." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "오류" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "요소를 직렬화 할 수 없습니다." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty'가 문서형식이 없이 불려왔습니다. bugs.owncloud.org에 보고해주세요. " -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "이름 편집" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "업로드를 위한 파일이 선택되지 않았습니다. " -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "이 파일은 이 서버 파일 업로드 최대 용량을 초과 합니다. " -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "유형 선택" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "결과:" @@ -300,7 +313,7 @@ msgstr "불러오기," msgid " failed." msgstr "실패." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "내 주소록이 아닙니다." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "연락처를 찾을 수 없습니다." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "주소" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "전화 번호" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "전자 우편" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "조직" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "직장" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "자택" -#: lib/app.php:133 -msgid "Mobile" -msgstr "휴대폰" - -#: lib/app.php:135 -msgid "Text" -msgstr "문자 번호" - -#: lib/app.php:136 -msgid "Voice" -msgstr "음성 번호" - -#: lib/app.php:137 -msgid "Message" -msgstr "메세지" - -#: lib/app.php:138 -msgid "Fax" -msgstr "팩스 번호" - -#: lib/app.php:139 -msgid "Video" -msgstr "영상 번호" - -#: lib/app.php:140 -msgid "Pager" -msgstr "호출기" - -#: lib/app.php:146 -msgid "Internet" -msgstr "인터넷" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "생일" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "휴대폰" + +#: lib/app.php:203 +msgid "Text" +msgstr "문자 번호" + +#: lib/app.php:204 +msgid "Voice" +msgstr "음성 번호" + +#: lib/app.php:205 +msgid "Message" +msgstr "메세지" + +#: lib/app.php:206 +msgid "Fax" +msgstr "팩스 번호" + +#: lib/app.php:207 +msgid "Video" +msgstr "영상 번호" + +#: lib/app.php:208 +msgid "Pager" +msgstr "호출기" + +#: lib/app.php:215 +msgid "Internet" +msgstr "인터넷" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "생일" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -438,6 +482,14 @@ msgstr "{이름}의 생일" msgid "Contact" msgstr "연락처" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "연락처 추가" @@ -534,13 +586,18 @@ msgstr "Format custom, Short name, Full name, Reverse or Reverse with comma" msgid "Edit name details" msgstr "이름 세부사항을 편집합니다. " +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "조직" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "삭제" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "별명" @@ -548,7 +605,7 @@ msgstr "별명" msgid "Enter nickname" msgstr "별명 입력" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -564,7 +621,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "일-월-년" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "그룹" @@ -576,63 +633,84 @@ msgstr "쉼표로 그룹 구분" msgid "Edit groups" msgstr "그룹 편집" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "선호함" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "올바른 이메일 주소를 입력하세요." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "이메일 주소 입력" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "이메일 주소 삭제" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "전화번호 입력" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "전화번호 삭제" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "지도에서 보기" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "상세 주소 수정" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "여기에 노트 추가." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "파일 추가" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "전화 번호" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "전자 우편" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "주소" + +#: templates/part.contact.php:133 msgid "Note" msgstr "노트" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "연락처 다운로드" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "연락처 삭제" @@ -803,19 +881,15 @@ msgstr "당신의 주소록에는 연락처가 없습니다. " msgid "Add contact" msgstr "연락처 추가" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "주소록 구성" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "다운로드" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "편집" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "새 주소록" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "저장" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "취소" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/ko/files.po b/l10n/ko/files.po index 76eb1bf66d..375947a292 100644 --- a/l10n/ko/files.po +++ b/l10n/ko/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "디스크에 쓰지 못했습니다" msgid "Files" msgstr "파일" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "삭제" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "ZIP파일 생성에 시간이 걸릴 수 있습니다." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "업로드 에러" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "보류 중" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "업로드 취소." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "잘못된 이름, '/' 은 허용이 되지 않습니다." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "크기" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "수정됨" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "폴더" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "폴더" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "파일" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "파일" diff --git a/l10n/ko/files_sharing.po b/l10n/ko/files_sharing.po index ab00c1b050..970803e48a 100644 --- a/l10n/ko/files_sharing.po +++ b/l10n/ko/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: ko\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/ko/settings.po b/l10n/ko/settings.po index ad845081a5..a4bfa5daca 100644 --- a/l10n/ko/settings.po +++ b/l10n/ko/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Korean (http://www.transifex.com/projects/p/owncloud/language/ko/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "다른" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/lb/contacts.po b/l10n/lb/contacts.po index e2d248e453..2d22dc6b1e 100644 --- a/l10n/lb/contacts.po +++ b/l10n/lb/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "Fehler beim (de)aktivéieren vum Adressbuch." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID ass net gesat." @@ -80,18 +80,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "Probéieren duebel Proprietéit bäi ze setzen:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informatioun iwwert vCard ass net richteg. Lued d'Säit wegl nei." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Fehler beim läschen vun der Kontakt Proprietéit." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID fehlt" @@ -112,10 +112,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Fehler beim updaten vun der Kontakt Proprietéit." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontakter" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Fehler" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Resultat: " @@ -299,7 +312,7 @@ msgstr " importéiert, " msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Dat do ass net däin Adressbuch." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Konnt den Kontakt net fannen." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adress" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon's Nummer" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Firma" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Aarbecht" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Doheem" -#: lib/app.php:133 -msgid "Mobile" -msgstr "GSM" - -#: lib/app.php:135 -msgid "Text" -msgstr "SMS" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voice" - -#: lib/app.php:137 -msgid "Message" -msgstr "Message" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Gebuertsdag" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "GSM" + +#: lib/app.php:203 +msgid "Text" +msgstr "SMS" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voice" + +#: lib/app.php:205 +msgid "Message" +msgstr "Message" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Gebuertsdag" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "{name} säi Gebuertsdag" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Kontakt bäisetzen" @@ -533,13 +585,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Firma" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Läschen" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Spëtznumm" @@ -547,7 +604,7 @@ msgstr "Spëtznumm" msgid "Enter nickname" msgstr "Gëff e Spëtznumm an" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Gruppen" @@ -575,63 +632,84 @@ msgstr "" msgid "Edit groups" msgstr "Gruppen editéieren" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Telefonsnummer aginn" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Telefonsnummer läschen" -#: templates/part.contact.php:92 -msgid "View on map" -msgstr "Op da Kaart uweisen" +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "Adress Detailer editéieren" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 +msgid "View on map" +msgstr "Op da Kaart uweisen" + +#: templates/part.contact.php:110 +msgid "Edit address details" +msgstr "Adress Detailer editéieren" + +#: templates/part.contact.php:116 +msgid "Add notes here." +msgstr "" + +#: templates/part.contact.php:124 msgid "Add field" msgstr "" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adress" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Note" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Kontakt eroflueden" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Kontakt läschen" @@ -802,19 +880,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Download" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editéieren" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Neit Adressbuch" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Späicheren" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Ofbriechen" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/lb/files.po b/l10n/lb/files.po index 23fcc19514..c84f38bdc0 100644 --- a/l10n/lb/files.po +++ b/l10n/lb/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "Konnt net op den Disk schreiwen" msgid "Files" msgstr "Dateien" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Läschen" @@ -80,59 +76,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Gréisst" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Geännert" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/lb/files_sharing.po b/l10n/lb/files_sharing.po index c2f614a934..ca81053d9a 100644 --- a/l10n/lb/files_sharing.po +++ b/l10n/lb/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: lb\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/lb/settings.po b/l10n/lb/settings.po index 55306588cc..6b1e939e53 100644 --- a/l10n/lb/settings.po +++ b/l10n/lb/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Luxembourgish (http://www.transifex.com/projects/p/owncloud/language/lb/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -227,7 +227,7 @@ msgid "Other" msgstr "Aner" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/lt_LT/admin_dependencies_chk.po b/l10n/lt_LT/admin_dependencies_chk.po index 52d674cbee..3cf43f2491 100644 --- a/l10n/lt_LT/admin_dependencies_chk.po +++ b/l10n/lt_LT/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:02+0200\n" +"PO-Revision-Date: 2012-08-22 13:30+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "Php-json modulis yra reikalingas duomenų keitimuisi tarp programų" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "Php-curl modulis automatiškai nuskaito tinklapio pavadinimą kuomet išsaugoma žymelė." #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "Php-gd modulis yra naudojamas paveikslėlių miniatiūroms kurti." #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "Php-ldap modulis yra reikalingas prisijungimui prie jūsų ldap serverio" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "Php-zip modulis yra reikalingas kelių failų atsiuntimui iš karto." #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "Php-mb_multibyte modulis yra naudojamas apdoroti įvairius teksto kodavimo formatus." #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "Php-ctype modulis yra reikalingas duomenų tikrinimui." #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "Php-xml modulis yra reikalingas failų dalinimuisi naudojant webdav." #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "allow_url_fopen direktyva turėtų būti nustatyta į \"1\" jei norite automatiškai gauti žinių bazės informaciją iš OCS serverių." #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "Php-pdo modulis yra reikalingas duomenų saugojimui į owncloud duomenų bazę." #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Priklausomybės" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Naudojama:" diff --git a/l10n/lt_LT/admin_migrate.po b/l10n/lt_LT/admin_migrate.po index d35d28001f..8f3d5927ff 100644 --- a/l10n/lt_LT/admin_migrate.po +++ b/l10n/lt_LT/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:02+0200\n" +"PO-Revision-Date: 2012-08-22 14:12+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Eksportuoti šią ownCloud instaliaciją" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Bus sukurtas archyvas su visais owncloud duomenimis ir failais.\n Pasirinkite eksportavimo tipą:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Eksportuoti" diff --git a/l10n/lt_LT/bookmarks.po b/l10n/lt_LT/bookmarks.po index fbda0e4853..4593ae1ec6 100644 --- a/l10n/lt_LT/bookmarks.po +++ b/l10n/lt_LT/bookmarks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:17+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:02+0200\n" +"PO-Revision-Date: 2012-08-22 12:36+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +24,7 @@ msgstr "" #: bookmarksHelper.php:99 msgid "unnamed" -msgstr "" +msgstr "be pavadinimo" #: templates/bookmarklet.php:5 msgid "" diff --git a/l10n/lt_LT/contacts.po b/l10n/lt_LT/contacts.po index 04921869c8..963907b297 100644 --- a/l10n/lt_LT/contacts.po +++ b/l10n/lt_LT/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "Klaida (de)aktyvuojant adresų knygą." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -80,18 +80,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informacija apie vCard yra neteisinga. " -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -112,10 +112,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontaktai" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -299,7 +312,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Tai ne jūsų adresų knygelė." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontaktas nerastas" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresas" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefonas" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "El. paštas" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizacija" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Darbo" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Namų" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobilusis" - -#: lib/app.php:135 -msgid "Text" -msgstr "Žinučių" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Balso" - -#: lib/app.php:137 -msgid "Message" -msgstr "Žinutė" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faksas" - -#: lib/app.php:139 -msgid "Video" -msgstr "Vaizdo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pranešimų gaviklis" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internetas" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Gimtadienis" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobilusis" + +#: lib/app.php:203 +msgid "Text" +msgstr "Žinučių" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Balso" + +#: lib/app.php:205 +msgid "Message" +msgstr "Žinutė" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faksas" + +#: lib/app.php:207 +msgid "Video" +msgstr "Vaizdo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pranešimų gaviklis" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internetas" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Gimtadienis" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "" msgid "Contact" msgstr "Kontaktas" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Pridėti kontaktą" @@ -533,21 +585,26 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizacija" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Trinti" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Slapyvardis" #: templates/part.contact.php:42 msgid "Enter nickname" -msgstr "" +msgstr "Įveskite slapyvardį" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -575,63 +632,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 +msgid "View on map" +msgstr "" + +#: templates/part.contact.php:110 +msgid "Edit address details" +msgstr "" + +#: templates/part.contact.php:116 +msgid "Add notes here." +msgstr "" + +#: templates/part.contact.php:124 msgid "Add field" msgstr "" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefonas" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "El. paštas" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresas" + +#: templates/part.contact.php:133 msgid "Note" msgstr "" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Atsisųsti kontaktą" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Ištrinti kontaktą" @@ -802,19 +880,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Atsisiųsti" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Keisti" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nauja adresų knyga" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Išsaugoti" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Atšaukti" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/lt_LT/files.po b/l10n/lt_LT/files.po index 2eb293733c..bae53dc5d6 100644 --- a/l10n/lt_LT/files.po +++ b/l10n/lt_LT/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 07:58+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "Nepavyko įrašyti į diską" msgid "Files" msgstr "Failai" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Ištrinti" @@ -71,7 +67,7 @@ msgstr "" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "atšaukti" #: js/filelist.js:195 msgid "replaced" @@ -81,69 +77,69 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "kuriamas ZIP archyvas, tai gali užtrukti šiek tiek laiko." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Neįmanoma įkelti failo - jo dydis gali būti 0 bitų arba tai katalogas" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Įkėlimo klaida" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" -msgstr "" +msgstr "Laukiantis" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Įkėlimas atšauktas." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Pavadinime negali būti naudojamas ženklas \"/\"." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Dydis" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Pakeista" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "katalogas" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "katalogai" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "failas" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "failai" #: templates/admin.php:5 msgid "File handling" -msgstr "" +msgstr "Failų tvarkymas" #: templates/admin.php:7 msgid "Maximum upload size" -msgstr "Maksimalus failo dydis" +msgstr "Maksimalus įkeliamo failo dydis" #: templates/admin.php:7 msgid "max. possible: " diff --git a/l10n/lt_LT/files_encryption.po b/l10n/lt_LT/files_encryption.po index 098eec3378..41529366d3 100644 --- a/l10n/lt_LT/files_encryption.po +++ b/l10n/lt_LT/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 12:29+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Šifravimas" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Nešifruoti pasirinkto tipo failų" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Nieko" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Įjungti šifravimą" diff --git a/l10n/lt_LT/files_external.po b/l10n/lt_LT/files_external.po index c24158d494..d4208432fa 100644 --- a/l10n/lt_LT/files_external.po +++ b/l10n/lt_LT/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 12:31+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -31,11 +32,11 @@ msgstr "" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Konfigūracija" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Nustatymai" #: templates/settings.php:11 msgid "Applicable" @@ -47,23 +48,23 @@ msgstr "" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "Nieko nepasirinkta" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Visi vartotojai" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Grupės" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Vartotojai" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Ištrinti" #: templates/settings.php:88 msgid "SSL root certificates" diff --git a/l10n/lt_LT/files_sharing.po b/l10n/lt_LT/files_sharing.po index f834a4d60d..d1693bb806 100644 --- a/l10n/lt_LT/files_sharing.po +++ b/l10n/lt_LT/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: lt_LT\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Dydis" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Pakeista" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Ištrinti viską" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Ištrinti" diff --git a/l10n/lt_LT/files_versions.po b/l10n/lt_LT/files_versions.po index 32374a3c35..78d03bc051 100644 --- a/l10n/lt_LT/files_versions.po +++ b/l10n/lt_LT/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 12:34+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Panaikinti visų versijų galiojimą" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Įjungti failų versijų vedimą" diff --git a/l10n/lt_LT/lib.po b/l10n/lt_LT/lib.po index 11f020d545..cf1cc1edba 100644 --- a/l10n/lt_LT/lib.po +++ b/l10n/lt_LT/lib.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:23+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 12:43+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,53 +18,53 @@ msgstr "" "Language: lt_LT\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: app.php:287 +#: app.php:288 msgid "Help" -msgstr "" +msgstr "Pagalba" -#: app.php:294 +#: app.php:295 msgid "Personal" -msgstr "" +msgstr "Asmeniniai" -#: app.php:299 +#: app.php:300 msgid "Settings" -msgstr "" +msgstr "Nustatymai" -#: app.php:304 +#: app.php:305 msgid "Users" -msgstr "" +msgstr "Vartotojai" -#: app.php:311 +#: app.php:312 msgid "Apps" -msgstr "" +msgstr "Programos" -#: app.php:313 +#: app.php:314 msgid "Admin" -msgstr "" +msgstr "Administravimas" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." -msgstr "" +msgstr "ZIP atsisiuntimo galimybė yra išjungta." -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." -msgstr "" +msgstr "Failai turi būti parsiunčiami vienas po kito." -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" -msgstr "" +msgstr "Atgal į Failus" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." -msgstr "" +msgstr "Pasirinkti failai per dideli archyvavimui į ZIP." #: json.php:28 msgid "Application is not enabled" -msgstr "" +msgstr "Programa neįjungta" #: json.php:39 json.php:63 json.php:75 msgid "Authentication error" -msgstr "" +msgstr "Autentikacijos klaida" #: json.php:51 msgid "Token expired. Please reload page." @@ -75,29 +76,29 @@ msgstr "" #: template.php:87 msgid "1 minute ago" -msgstr "" +msgstr "prieš 1 minutę" #: template.php:88 #, php-format msgid "%d minutes ago" -msgstr "" +msgstr "prieš %d minučių" #: template.php:91 msgid "today" -msgstr "" +msgstr "šiandien" #: template.php:92 msgid "yesterday" -msgstr "" +msgstr "vakar" #: template.php:93 #, php-format msgid "%d days ago" -msgstr "" +msgstr "prieš %d dienų" #: template.php:94 msgid "last month" -msgstr "" +msgstr "praėjusį mėnesį" #: template.php:95 msgid "months ago" @@ -105,7 +106,7 @@ msgstr "" #: template.php:96 msgid "last year" -msgstr "" +msgstr "pereitais metais" #: template.php:97 msgid "years ago" diff --git a/l10n/lt_LT/settings.po b/l10n/lt_LT/settings.po index b4e462f1d0..8b8a184019 100644 --- a/l10n/lt_LT/settings.po +++ b/l10n/lt_LT/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 07:15+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -20,11 +20,11 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Neįmanoma įkelti sąrašo iš Programų Katalogo" #: ajax/lostpassword.php:14 msgid "Email saved" -msgstr "" +msgstr "El. paštas išsaugotas" #: ajax/lostpassword.php:16 msgid "Invalid email" @@ -48,7 +48,7 @@ msgstr "Kalba pakeista" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Klaida" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -68,11 +68,11 @@ msgstr "Kalba" #: templates/admin.php:14 msgid "Security Warning" -msgstr "" +msgstr "Saugumo įspėjimas" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" @@ -84,7 +84,7 @@ msgstr "" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "naudoti sistemos cron servisą" #: templates/admin.php:39 msgid "Log" @@ -227,7 +227,7 @@ msgid "Other" msgstr "Kita" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/lt_LT/tasks.po b/l10n/lt_LT/tasks.po index 5bbe766c2b..4d53aef5a7 100644 --- a/l10n/lt_LT/tasks.po +++ b/l10n/lt_LT/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 14:05+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,7 +20,7 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Netinkama data/laikas" #: appinfo/app.php:11 msgid "Tasks" @@ -27,7 +28,7 @@ msgstr "" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Be kategorijos" #: lib/app.php:33 msgid "Unspecified" @@ -47,11 +48,11 @@ msgstr "" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Tuščias aprašymas" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Netinkamas baigimo procentas" #: lib/app.php:107 msgid "Invalid priority" @@ -91,16 +92,16 @@ msgstr "" #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Svarbūs" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Daugiau" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Mažiau" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Ištrinti" diff --git a/l10n/lt_LT/user_ldap.po b/l10n/lt_LT/user_ldap.po index 4002c36aa5..d648d9ba0c 100644 --- a/l10n/lt_LT/user_ldap.po +++ b/l10n/lt_LT/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 13:55+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -47,7 +48,7 @@ msgstr "" #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Slaptažodis" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." @@ -83,7 +84,7 @@ msgstr "" #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "Grupės filtras" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." @@ -95,7 +96,7 @@ msgstr "" #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Prievadas" #: templates/settings.php:18 msgid "Base User Tree" @@ -111,7 +112,7 @@ msgstr "" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Naudoti TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." @@ -123,7 +124,7 @@ msgstr "" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "Išjungti SSL sertifikato tikrinimą." #: templates/settings.php:23 msgid "" @@ -133,7 +134,7 @@ msgstr "" #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Nerekomenduojama, naudokite tik testavimui." #: templates/settings.php:24 msgid "User Display Name Field" @@ -161,4 +162,4 @@ msgstr "" #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Pagalba" diff --git a/l10n/lt_LT/user_migrate.po b/l10n/lt_LT/user_migrate.po index 391a7cbec4..a0c8819f79 100644 --- a/l10n/lt_LT/user_migrate.po +++ b/l10n/lt_LT/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Dr. ROX , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 13:34+0000\n" +"Last-Translator: Dr. ROX \n" "Language-Team: Lithuanian (Lithuania) (http://www.transifex.com/projects/p/owncloud/language/lt_LT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,33 +20,33 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Eksportuoti" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "" +msgstr "Įvyko klaida kuriant eksportuojamą failą" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "Įvyko klaida" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "Eksportuoti jūsų vartotojo paskyrą" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "Bus sukurtas suglaudintas failas su jūsų ownCloud vartotojo paskyra." #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "Importuoti vartotojo paskyrą" #: templates/settings.php:15 msgid "ownCloud User Zip" -msgstr "" +msgstr "ownCloud vartotojo paskyros Zip archyvas" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Importuoti" diff --git a/l10n/lv/contacts.po b/l10n/lv/contacts.po index 18a053d129..206e0cb05d 100644 --- a/l10n/lv/contacts.po +++ b/l10n/lv/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/lv/files.po b/l10n/lv/files.po index 621deceffc..3f19f36b91 100644 --- a/l10n/lv/files.po +++ b/l10n/lv/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "" msgid "Files" msgstr "Faili" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Pārtraukt līdzdalīšanu" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Izdzēst" @@ -80,59 +76,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Augšuplādēšanas laikā radās kļūda" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Gaida savu kārtu" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Augšuplāde ir atcelta" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Šis simbols '/', nav atļauts." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Izmērs" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Izmainīts" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "mape" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "mapes" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fails" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "faili" diff --git a/l10n/lv/files_sharing.po b/l10n/lv/files_sharing.po index 940df7205e..4d7325ca83 100644 --- a/l10n/lv/files_sharing.po +++ b/l10n/lv/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: lv\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/lv/settings.po b/l10n/lv/settings.po index 64a7220d64..725d953126 100644 --- a/l10n/lv/settings.po +++ b/l10n/lv/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/owncloud/language/lv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -227,7 +227,7 @@ msgid "Other" msgstr "Cits" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/mk/contacts.po b/l10n/mk/contacts.po index 421574eb07..5ad0cf2831 100644 --- a/l10n/mk/contacts.po +++ b/l10n/mk/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "Грешка (де)активирање на адресарот." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ид не е поставено." @@ -81,18 +81,18 @@ msgstr "Барем една од полињата за адреса треба msgid "Trying to add duplicate property: " msgstr "Се обидовте да внесете дупликат вредност:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Информацијата за vCard не е точна. Ве молам превчитајте ја страницава." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Греш при бришење на вредноста за контакт." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Недостасува ИД" @@ -113,10 +113,6 @@ msgstr "Информацијата за vCard не е точна. Ве мола msgid "Something went FUBAR. " msgstr "Нешто се расипа." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Грешка при ажурирање на вредноста за контакт." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "Не можеше да се вчита привремената фото msgid "No file was uploaded. Unknown error" msgstr "Ниту еден фајл не се вчита. Непозната грешка" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Контакти" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "Не можев да добијам исправна адреса." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Грешка" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Својството не смее да биде празно." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Не може да се серијализираат елементите." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' повикан без тип на аргументот. Пријавете грешка/проблем на bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Уреди го името" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Ниту еден фајл не е избран за вчитување." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Датотеката која се обидувате да ја префрлите ја надминува максималната големина дефинирана за пренос на овој сервер." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Одбери тип" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Резултат: " @@ -300,7 +313,7 @@ msgstr "увезено," msgid " failed." msgstr "неуспешно." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ова не е во Вашиот адресар." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Контактот неможе да биде најден." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Адреса" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Телефон" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Е-пошта" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Организација" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Работа" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Дома" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Мобилен" - -#: lib/app.php:135 -msgid "Text" -msgstr "Текст" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Глас" - -#: lib/app.php:137 -msgid "Message" -msgstr "Порака" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Факс" - -#: lib/app.php:139 -msgid "Video" -msgstr "Видео" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Пејџер" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Интернет" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Роденден" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Мобилен" + +#: lib/app.php:203 +msgid "Text" +msgstr "Текст" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Глас" + +#: lib/app.php:205 +msgid "Message" +msgstr "Порака" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Факс" + +#: lib/app.php:207 +msgid "Video" +msgstr "Видео" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Пејџер" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Интернет" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Роденден" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -438,6 +482,14 @@ msgstr "Роденден на {name}" msgid "Contact" msgstr "Контакт" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Додади контакт" @@ -534,13 +586,18 @@ msgstr "Прилагоден формат, кратко име, цело име, msgid "Edit name details" msgstr "Уреди детали за име" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Организација" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Избриши" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Прекар" @@ -548,7 +605,7 @@ msgstr "Прекар" msgid "Enter nickname" msgstr "Внеси прекар" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -564,7 +621,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Групи" @@ -576,63 +633,84 @@ msgstr "Одвоете ги групите со запирка" msgid "Edit groups" msgstr "Уреди групи" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Претпочитано" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Ве молам внесете правилна адреса за е-пошта." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Внесете е-пошта" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Прати порака до адреса" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Избриши адреса за е-пошта" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Внесете телефонски број" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Избриши телефонски број" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Погледајте на мапа" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Уреди детали за адреса" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Внесете забелешки тука." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Додади поле" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Телефон" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Е-пошта" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Адреса" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Забелешка" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Преземи го контактот" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Избриши го контактот" @@ -803,19 +881,15 @@ msgstr "Немате контакти во Вашиот адресар." msgid "Add contact" msgstr "Додади контакт" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Уреди адресари" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Преземи" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Уреди" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Нов адресар" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Сними" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Откажи" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/mk/files.po b/l10n/mk/files.po index 41b9f39120..374cb87139 100644 --- a/l10n/mk/files.po +++ b/l10n/mk/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,11 +54,7 @@ msgstr "Неуспеав да запишам на диск" msgid "Files" msgstr "Датотеки" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Избриши" @@ -82,59 +78,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "Се генерира ZIP фајлот, ќе треба извесно време." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Не може да се преземе вашата датотека бидејќи фолдерот во кој се наоѓа фајлот има големина од 0 бајти" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Грешка при преземање" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Чека" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Преземањето е прекинато." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "неисправно име, '/' не е дозволено." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Големина" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Променето" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "фолдер" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "фолдери" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "датотека" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "датотеки" diff --git a/l10n/mk/files_sharing.po b/l10n/mk/files_sharing.po index 161d976c65..eedc221287 100644 --- a/l10n/mk/files_sharing.po +++ b/l10n/mk/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: mk\n" "Plural-Forms: nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/mk/settings.po b/l10n/mk/settings.po index 384ec05fd8..6fd5df90dc 100644 --- a/l10n/mk/settings.po +++ b/l10n/mk/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Macedonian (http://www.transifex.com/projects/p/owncloud/language/mk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "Останато" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/ms_MY/contacts.po b/l10n/ms_MY/contacts.po index a5435b96a5..f3b425c71f 100644 --- a/l10n/ms_MY/contacts.po +++ b/l10n/ms_MY/contacts.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +27,7 @@ msgid "Error (de)activating addressbook." msgstr "Ralat nyahaktif buku alamat." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID tidak ditetapkan." @@ -84,18 +84,18 @@ msgstr "Sekurangnya satu ruangan alamat perlu diisikan." msgid "Trying to add duplicate property: " msgstr "Cuba untuk letak nilai duplikasi:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Maklumat vCard tidak tepat. Sila reload semula halaman ini." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Masalah memadam maklumat." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID Hilang" @@ -116,10 +116,6 @@ msgstr "Maklumat tentang vCard tidak betul." msgid "Something went FUBAR. " msgstr "Sesuatu tidak betul." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Masalah mengemaskini maklumat." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -223,7 +219,7 @@ msgstr "Tidak boleh membuka imej sementara: " msgid "No file was uploaded. Unknown error" msgstr "Tiada fail dimuatnaik. Ralat tidak diketahui." -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Hubungan-hubungan" @@ -240,57 +236,74 @@ msgid "Couldn't get a valid address." msgstr "Tidak boleh mendapat alamat yang sah." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Ralat" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Nilai ini tidak boleh kosong." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Tidak boleh menggabungkan elemen." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' dipanggil tanpa argumen taip. Sila maklumkan di bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Ubah nama" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Tiada fail dipilih untuk muatnaik." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Fail yang ingin dimuatnaik melebihi saiz yang dibenarkan." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "PIlih jenis" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Hasil: " @@ -303,7 +316,7 @@ msgstr " import, " msgid " failed." msgstr " gagal." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -311,125 +324,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "Buku alamat tidak ditemui:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ini bukan buku alamat anda." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Hubungan tidak dapat ditemui" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Alamat" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Emel" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisasi" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Kerja" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Rumah" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mudah alih" - -#: lib/app.php:135 -msgid "Text" -msgstr "Teks" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Suara" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mesej" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Alat Kelui" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Hari lahir" - -#: lib/app.php:184 -msgid "Business" -msgstr "Perniagaan" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "klien" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Hari kelepasan" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Idea" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Perjalanan" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Jubli" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Mesyuarat" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Lain" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mudah alih" + +#: lib/app.php:203 +msgid "Text" +msgstr "Teks" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Suara" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mesej" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Alat Kelui" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Hari lahir" + +#: lib/app.php:253 +msgid "Business" +msgstr "Perniagaan" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "klien" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Hari kelepasan" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Idea" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Perjalanan" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Jubli" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Mesyuarat" + +#: lib/app.php:263 msgid "Personal" msgstr "Peribadi" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projek" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -441,6 +485,14 @@ msgstr "Hari Lahir {name}" msgid "Contact" msgstr "Hubungan" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Tambah kenalan" @@ -537,13 +589,18 @@ msgstr "Format bebas, Nama pendek, Nama penuh, Unduran dengan koma" msgid "Edit name details" msgstr "Ubah butiran nama" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisasi" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Padam" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Nama Samaran" @@ -551,7 +608,7 @@ msgstr "Nama Samaran" msgid "Enter nickname" msgstr "Masukkan nama samaran" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -567,7 +624,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Kumpulan" @@ -579,63 +636,84 @@ msgstr "Asingkan kumpulan dengan koma" msgid "Edit groups" msgstr "Ubah kumpulan" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Pilihan" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Berikan alamat emel yang sah." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Masukkan alamat emel" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Hantar ke alamat" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Padam alamat emel" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Masukkan nombor telefon" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Padam nombor telefon" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Lihat pada peta" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Ubah butiran alamat" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Letak nota disini." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Letak ruangan" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Emel" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Alamat" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Muat turun hubungan" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Padam hubungan" @@ -806,19 +884,15 @@ msgstr "Anda tidak mempunyai sebarang kenalan didalam buku alamat." msgid "Add contact" msgstr "Letak kenalan" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Konfigurasi buku alamat" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Pilih Buku Alamat" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Masukkan nama" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Masukkan keterangan" @@ -847,33 +921,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Muat naik" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Sunting" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Buku Alamat Baru" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Nama" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Keterangan" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Simpan" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Batal" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Lagi..." diff --git a/l10n/ms_MY/files.po b/l10n/ms_MY/files.po index d008381d5d..d25d888cfc 100644 --- a/l10n/ms_MY/files.po +++ b/l10n/ms_MY/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,87 +55,83 @@ msgstr "Gagal untuk disimpan" msgid "Files" msgstr "fail" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Padam" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "Sudah wujud" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "ganti" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "Batal" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "diganti" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "dengan" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "dihapus" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "sedang menghasilkan fail ZIP, mungkin mengambil sedikit masa." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Tidak boleh memuatnaik fail anda kerana mungkin ianya direktori atau saiz fail 0 bytes" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Muat naik ralat" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Dalam proses" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Muatnaik dibatalkan." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "penggunaa nama tidak sah, '/' tidak dibenarkan." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Saiz" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Dimodifikasi" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "direktori" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "direktori" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fail" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "fail" diff --git a/l10n/ms_MY/files_sharing.po b/l10n/ms_MY/files_sharing.po index 6de1cf4ae5..ced7a00ab3 100644 --- a/l10n/ms_MY/files_sharing.po +++ b/l10n/ms_MY/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: ms_MY\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/ms_MY/settings.po b/l10n/ms_MY/settings.po index 4caf358d9b..07857601be 100644 --- a/l10n/ms_MY/settings.po +++ b/l10n/ms_MY/settings.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Malay (Malaysia) (http://www.transifex.com/projects/p/owncloud/language/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -230,8 +230,8 @@ msgid "Other" msgstr "Lain" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/nb_NO/admin_migrate.po b/l10n/nb_NO/admin_migrate.po index 9d35d80bc3..12728fa65e 100644 --- a/l10n/nb_NO/admin_migrate.po +++ b/l10n/nb_NO/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Arvid Nornes , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:01+0200\n" +"PO-Revision-Date: 2012-08-23 17:37+0000\n" +"Last-Translator: Arvid Nornes \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Eksporter denne ownCloud forekomsten" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Dette vil opprette en komprimert fil som inneholder dataene fra denne ownCloud forekomsten.⏎ Vennligst velg eksporttype:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Eksport" diff --git a/l10n/nb_NO/bookmarks.po b/l10n/nb_NO/bookmarks.po index 65673a48ac..ff93307a65 100644 --- a/l10n/nb_NO/bookmarks.po +++ b/l10n/nb_NO/bookmarks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Arvid Nornes , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:17+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:23+0000\n" +"Last-Translator: Arvid Nornes \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,41 +20,41 @@ msgstr "" #: appinfo/app.php:14 msgid "Bookmarks" -msgstr "" +msgstr "Bokmerker" #: bookmarksHelper.php:99 msgid "unnamed" -msgstr "" +msgstr "uten navn" #: templates/bookmarklet.php:5 msgid "" "Drag this to your browser bookmarks and click it, when you want to bookmark " "a webpage quickly:" -msgstr "" +msgstr "Dra denne over din nettlesers bokmerker og klikk den, hvis du ønsker å hurtig legge til bokmerke for en nettside" #: templates/bookmarklet.php:7 msgid "Read later" -msgstr "" +msgstr "Les senere" #: templates/list.php:13 msgid "Address" -msgstr "" +msgstr "Adresse" #: templates/list.php:14 msgid "Title" -msgstr "" +msgstr "Tittel" #: templates/list.php:15 msgid "Tags" -msgstr "" +msgstr "Etikett" #: templates/list.php:16 msgid "Save bookmark" -msgstr "" +msgstr "Lagre bokmerke" #: templates/list.php:22 msgid "You have no bookmarks" -msgstr "" +msgstr "Du har ingen bokmerker" #: templates/settings.php:11 msgid "Bookmarklet
    " diff --git a/l10n/nb_NO/contacts.po b/l10n/nb_NO/contacts.po index ea159661fe..524dec3bd0 100644 --- a/l10n/nb_NO/contacts.po +++ b/l10n/nb_NO/contacts.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +26,7 @@ msgid "Error (de)activating addressbook." msgstr "Et problem oppsto med å (de)aktivere adresseboken." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id er ikke satt." @@ -83,18 +83,18 @@ msgstr "Minst en av adressefeltene må oppgis." msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informasjonen om vCard-filen er ikke riktig. Last inn siden på nytt." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Et problem oppsto med å fjerne kontaktfeltet." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Manglende ID" @@ -115,10 +115,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "Noe gikk fryktelig galt." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Et problem oppsto med å legge til kontaktfeltet." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -222,7 +218,7 @@ msgstr "Kunne ikke laste midlertidig bilde:" msgid "No file was uploaded. Unknown error" msgstr "Ingen filer ble lastet opp. Ukjent feil." -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontakter" @@ -239,57 +235,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Feil" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Endre navn" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Ingen filer valgt for opplasting." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Filen du prøver å laste opp er for stor." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Velg type" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Resultat:" @@ -302,7 +315,7 @@ msgstr "importert," msgid " failed." msgstr "feilet." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -310,125 +323,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Dette er ikke dine adressebok." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakten ble ikke funnet." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresse" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-post" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisasjon" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Arbeid" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Hjem" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Tekst" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Svarer" - -#: lib/app.php:137 -msgid "Message" -msgstr "Melding" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faks" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internett" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Bursdag" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Svarer" + +#: lib/app.php:205 +msgid "Message" +msgstr "Melding" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internett" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Bursdag" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -440,6 +484,14 @@ msgstr "{name}s bursdag" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Ny kontakt" @@ -536,13 +588,18 @@ msgstr "" msgid "Edit name details" msgstr "Endre detaljer rundt navn" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisasjon" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Slett" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Kallenavn" @@ -550,7 +607,7 @@ msgstr "Kallenavn" msgid "Enter nickname" msgstr "Skriv inn kallenavn" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -566,7 +623,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-åååå" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupper" @@ -578,63 +635,84 @@ msgstr "Skill gruppene med komma" msgid "Edit groups" msgstr "Endre grupper" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Foretrukket" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Vennligst angi en gyldig e-postadresse." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Skriv inn e-postadresse" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Send e-post til adresse" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Fjern e-postadresse" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Skriv inn telefonnummer" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Fjern telefonnummer" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Se på kart" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Endre detaljer rundt adresse" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Legg inn notater her." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Legg til felt" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-post" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresse" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Notat" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Hend ned kontakten" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Slett kontakt" @@ -805,19 +883,15 @@ msgstr "Du har ingen kontakter i din adressebok" msgid "Add contact" msgstr "Ny kontakt" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Konfigurer adressebøker" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -846,33 +920,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Hent ned" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Rediger" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Ny adressebok" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Lagre" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Avbryt" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/nb_NO/files.po b/l10n/nb_NO/files.po index 60ac64821f..b242837904 100644 --- a/l10n/nb_NO/files.po +++ b/l10n/nb_NO/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,11 +55,7 @@ msgstr "Klarte ikke å skrive til disk" msgid "Files" msgstr "Filer" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Slett" @@ -83,59 +79,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "opprettet ZIP-fil, dette kan ta litt tid" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Ventende" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Størrelse" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Endret" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "mappe" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "mapper" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "fil" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "filer" diff --git a/l10n/nb_NO/files_encryption.po b/l10n/nb_NO/files_encryption.po index 2a9b9beeb9..a74d1bacc7 100644 --- a/l10n/nb_NO/files_encryption.po +++ b/l10n/nb_NO/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Arvid Nornes , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:13+0000\n" +"Last-Translator: Arvid Nornes \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Kryptering" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Ekskluder følgende filer fra kryptering" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Ingen" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Slå på kryptering" diff --git a/l10n/nb_NO/files_sharing.po b/l10n/nb_NO/files_sharing.po index fc3364ed34..f869bfc1fb 100644 --- a/l10n/nb_NO/files_sharing.po +++ b/l10n/nb_NO/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Arvid Nornes , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:27+0000\n" +"Last-Translator: Arvid Nornes \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Størrelse" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Endret" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Slett alle" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Slett" diff --git a/l10n/nb_NO/files_versions.po b/l10n/nb_NO/files_versions.po index 2b2437b579..9b44f48273 100644 --- a/l10n/nb_NO/files_versions.po +++ b/l10n/nb_NO/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Arvid Nornes , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:25+0000\n" +"Last-Translator: Arvid Nornes \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,4 +24,4 @@ msgstr "" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Slå på versjonering" diff --git a/l10n/nb_NO/lib.po b/l10n/nb_NO/lib.po index dada31bd02..0d9ea115ad 100644 --- a/l10n/nb_NO/lib.po +++ b/l10n/nb_NO/lib.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Arvid Nornes , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:23+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:31+0000\n" +"Last-Translator: Arvid Nornes \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,53 +18,53 @@ msgstr "" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: app.php:287 +#: app.php:288 msgid "Help" -msgstr "" +msgstr "Hjelp" -#: app.php:294 +#: app.php:295 msgid "Personal" -msgstr "" +msgstr "Personlig" -#: app.php:299 +#: app.php:300 msgid "Settings" -msgstr "" +msgstr "Innstillinger" -#: app.php:304 +#: app.php:305 msgid "Users" -msgstr "" +msgstr "Brukere" -#: app.php:311 +#: app.php:312 msgid "Apps" -msgstr "" +msgstr "Apper" -#: app.php:313 +#: app.php:314 msgid "Admin" -msgstr "" +msgstr "Admin" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." -msgstr "" +msgstr "ZIP-nedlasting av avslått" -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." -msgstr "" +msgstr "Filene må lastes ned en om gangen" -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" -msgstr "" +msgstr "Tilbake til filer" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." -msgstr "" +msgstr "De valgte filene er for store til å kunne generere ZIP-fil" #: json.php:28 msgid "Application is not enabled" -msgstr "" +msgstr "Applikasjon er ikke påslått" #: json.php:39 json.php:63 json.php:75 msgid "Authentication error" -msgstr "" +msgstr "Autentiseringsfeil" #: json.php:51 msgid "Token expired. Please reload page." @@ -71,42 +72,42 @@ msgstr "" #: template.php:86 msgid "seconds ago" -msgstr "" +msgstr "sekunder siden" #: template.php:87 msgid "1 minute ago" -msgstr "" +msgstr "1 minuitt siden" #: template.php:88 #, php-format msgid "%d minutes ago" -msgstr "" +msgstr "%d minutter siden" #: template.php:91 msgid "today" -msgstr "" +msgstr "i dag" #: template.php:92 msgid "yesterday" -msgstr "" +msgstr "i går" #: template.php:93 #, php-format msgid "%d days ago" -msgstr "" +msgstr "%d dager siden" #: template.php:94 msgid "last month" -msgstr "" +msgstr "forrige måned" #: template.php:95 msgid "months ago" -msgstr "" +msgstr "måneder siden" #: template.php:96 msgid "last year" -msgstr "" +msgstr "i fjor" #: template.php:97 msgid "years ago" -msgstr "" +msgstr "år siden" diff --git a/l10n/nb_NO/settings.po b/l10n/nb_NO/settings.po index 51ea270fd4..551c484ea5 100644 --- a/l10n/nb_NO/settings.po +++ b/l10n/nb_NO/settings.po @@ -12,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -231,7 +231,7 @@ msgid "Other" msgstr "Annet" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/nb_NO/tasks.po b/l10n/nb_NO/tasks.po index bcfe213161..bf07aa76d0 100644 --- a/l10n/nb_NO/tasks.po +++ b/l10n/nb_NO/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Arvid Nornes , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:17+0000\n" +"Last-Translator: Arvid Nornes \n" "Language-Team: Norwegian Bokmål (Norway) (http://www.transifex.com/projects/p/owncloud/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,31 +20,31 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "feil i dato/klokkeslett" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Oppgaver" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Ingen kategori" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Uspesifisert" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=høyest" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=middels" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=lavest" #: lib/app.php:81 msgid "Empty Summary" @@ -51,15 +52,15 @@ msgstr "" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Feil i prosent fullført" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Ulovlig prioritet" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Legg til oppgave" #: templates/tasks.php:4 msgid "Order Due" @@ -87,20 +88,20 @@ msgstr "" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Henter oppgaver..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Viktig" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Mer" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Mindre" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Slett" diff --git a/l10n/nl/admin_migrate.po b/l10n/nl/admin_migrate.po index ad085a1d15..aa9f340dcd 100644 --- a/l10n/nl/admin_migrate.po +++ b/l10n/nl/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 16:56+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Exporteer deze ownCloud instantie" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Dit maakt een gecomprimeerd bestand, met de inhoud van deze ownCloud instantie. Kies het export type:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Exporteer" diff --git a/l10n/nl/bookmarks.po b/l10n/nl/bookmarks.po index 7aa6cc6bfc..598af3f83a 100644 --- a/l10n/nl/bookmarks.po +++ b/l10n/nl/bookmarks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:17+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 19:06+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,41 +20,41 @@ msgstr "" #: appinfo/app.php:14 msgid "Bookmarks" -msgstr "" +msgstr "Bladwijzers" #: bookmarksHelper.php:99 msgid "unnamed" -msgstr "" +msgstr "geen naam" #: templates/bookmarklet.php:5 msgid "" "Drag this to your browser bookmarks and click it, when you want to bookmark " "a webpage quickly:" -msgstr "" +msgstr "Sleep dit naar uw browser bladwijzers en klik erop, wanneer u een webpagina snel wilt voorzien van een bladwijzer:" #: templates/bookmarklet.php:7 msgid "Read later" -msgstr "" +msgstr "Lees later" #: templates/list.php:13 msgid "Address" -msgstr "" +msgstr "Adres" #: templates/list.php:14 msgid "Title" -msgstr "" +msgstr "Titel" #: templates/list.php:15 msgid "Tags" -msgstr "" +msgstr "Tags" #: templates/list.php:16 msgid "Save bookmark" -msgstr "" +msgstr "Bewaar bookmark" #: templates/list.php:22 msgid "You have no bookmarks" -msgstr "" +msgstr "U heeft geen bookmarks" #: templates/settings.php:11 msgid "Bookmarklet
    " diff --git a/l10n/nl/calendar.po b/l10n/nl/calendar.po index 8ef2a74f32..5c283653c4 100644 --- a/l10n/nl/calendar.po +++ b/l10n/nl/calendar.po @@ -9,13 +9,14 @@ # , 2012. # , 2012. # , 2012. +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 08:53+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,11 +26,11 @@ msgstr "" #: ajax/cache/status.php:19 msgid "Not all calendars are completely cached" -msgstr "" +msgstr "Niet alle agenda's zijn volledig gecached" #: ajax/cache/status.php:21 msgid "Everything seems to be completely cached" -msgstr "" +msgstr "Alles lijkt volledig gecached te zijn" #: ajax/categories/rescan.php:29 msgid "No calendars found." @@ -47,19 +48,19 @@ msgstr "Verkeerde kalender" msgid "" "The file contained either no events or all events are already saved in your " "calendar." -msgstr "" +msgstr "Het bestand bevat geen gebeurtenissen of alle gebeurtenissen worden al in uw agenda bewaard." #: ajax/import/dropimport.php:31 ajax/import/import.php:67 msgid "events has been saved in the new calendar" -msgstr "" +msgstr "De gebeurtenissen worden in de nieuwe agenda bewaard" #: ajax/import/import.php:56 msgid "Import failed" -msgstr "" +msgstr "import is gefaald" #: ajax/import/import.php:69 msgid "events has been saved in your calendar" -msgstr "" +msgstr "de gebeurtenissen zijn in uw agenda opgeslagen " #: ajax/settings/guesstimezone.php:25 msgid "New Timezone:" @@ -73,7 +74,7 @@ msgstr "Tijdzone is veranderd" msgid "Invalid request" msgstr "Ongeldige aanvraag" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:41 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "Kalender" @@ -164,7 +165,7 @@ msgstr "Werk" #: lib/app.php:351 lib/app.php:361 msgid "by" -msgstr "" +msgstr "door" #: lib/app.php:359 lib/app.php:399 msgid "unnamed" @@ -353,79 +354,79 @@ msgstr "Cal." #: templates/calendar.php:6 msgid "Sun." -msgstr "" +msgstr "Zon." #: templates/calendar.php:6 msgid "Mon." -msgstr "" +msgstr "Maa." #: templates/calendar.php:6 msgid "Tue." -msgstr "" +msgstr "Din." #: templates/calendar.php:6 msgid "Wed." -msgstr "" +msgstr "Woe." #: templates/calendar.php:6 msgid "Thu." -msgstr "" +msgstr "Don." #: templates/calendar.php:6 msgid "Fri." -msgstr "" +msgstr "Vrij." #: templates/calendar.php:6 msgid "Sat." -msgstr "" +msgstr "Zat." #: templates/calendar.php:8 msgid "Jan." -msgstr "" +msgstr "Jan." #: templates/calendar.php:8 msgid "Feb." -msgstr "" +msgstr "Feb." #: templates/calendar.php:8 msgid "Mar." -msgstr "" +msgstr "Maa." #: templates/calendar.php:8 msgid "Apr." -msgstr "" +msgstr "Apr." #: templates/calendar.php:8 msgid "May." -msgstr "" +msgstr "Mei." #: templates/calendar.php:8 msgid "Jun." -msgstr "" +msgstr "Jun." #: templates/calendar.php:8 msgid "Jul." -msgstr "" +msgstr "Jul." #: templates/calendar.php:8 msgid "Aug." -msgstr "" +msgstr "Aug." #: templates/calendar.php:8 msgid "Sep." -msgstr "" +msgstr "Sep." #: templates/calendar.php:8 msgid "Oct." -msgstr "" +msgstr "Okt." #: templates/calendar.php:8 msgid "Nov." -msgstr "" +msgstr "Nov." #: templates/calendar.php:8 msgid "Dec." -msgstr "" +msgstr "Dec." #: templates/calendar.php:11 msgid "All day" @@ -482,7 +483,7 @@ msgstr "Vandaag" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Instellingen" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -690,7 +691,7 @@ msgstr "Importeer een agenda bestand" #: templates/part.import.php:24 msgid "Please choose a calendar" -msgstr "" +msgstr "Kies een agenda" #: templates/part.import.php:36 msgid "Name of new calendar" @@ -698,13 +699,13 @@ msgstr "Naam van de nieuwe agenda" #: templates/part.import.php:44 msgid "Take an available name!" -msgstr "" +msgstr "Kies een beschikbare naam!" #: templates/part.import.php:45 msgid "" "A Calendar with this name already exists. If you continue anyhow, these " "calendars will be merged." -msgstr "" +msgstr "Een agenda met deze naam bestaat al. Als u doorgaat, worden deze agenda's samengevoegd" #: templates/part.import.php:47 msgid "Import" @@ -736,7 +737,7 @@ msgstr "op" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Algemeen" #: templates/settings.php:15 msgid "Timezone" @@ -744,11 +745,11 @@ msgstr "Tijdzone" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Werk de tijdzone automatisch bij" #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "Tijd formaat" #: templates/settings.php:57 msgid "24h" @@ -760,39 +761,39 @@ msgstr "12uur" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "Begin de week op" #: templates/settings.php:76 msgid "Cache" -msgstr "" +msgstr "Cache" #: templates/settings.php:80 msgid "Clear cache for repeating events" -msgstr "" +msgstr "Leeg cache voor repeterende gebeurtenissen" #: templates/settings.php:85 msgid "URLs" -msgstr "" +msgstr "URLs" #: templates/settings.php:87 msgid "Calendar CalDAV syncing addresses" -msgstr "" +msgstr "Agenda CalDAV synchronisatie adres" #: templates/settings.php:87 msgid "more info" -msgstr "" +msgstr "meer informatie" #: templates/settings.php:89 msgid "Primary address (Kontact et al)" -msgstr "" +msgstr "Primary adres (voor Kontact en dergelijke)" #: templates/settings.php:91 msgid "iOS/OS X" -msgstr "" +msgstr "iOS/OS X" #: templates/settings.php:93 msgid "Read only iCalendar link(s)" -msgstr "" +msgstr "Alleen lezen iCalendar link(en)" #: templates/share.dropdown.php:20 msgid "Users" diff --git a/l10n/nl/contacts.po b/l10n/nl/contacts.po index 695acef5f6..fd2159c7ac 100644 --- a/l10n/nl/contacts.po +++ b/l10n/nl/contacts.po @@ -8,13 +8,14 @@ # Erik Bent , 2012. # , 2012. # , 2012. +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 16:50+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -27,7 +28,7 @@ msgid "Error (de)activating addressbook." msgstr "Fout bij het (de)activeren van het adresboek." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id is niet ingesteld." @@ -70,7 +71,7 @@ msgstr "onderdeel naam is niet opgegeven." #: ajax/contact/addproperty.php:46 msgid "Could not parse contact: " -msgstr "" +msgstr "Kon het contact niet verwerken" #: ajax/contact/addproperty.php:56 msgid "Cannot add empty property." @@ -84,18 +85,18 @@ msgstr "Minstens één van de adresvelden moet ingevuld worden." msgid "Trying to add duplicate property: " msgstr "Eigenschap bestaat al: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "IM parameter ontbreekt" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Onbekende IM:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informatie over de vCard is onjuist. Herlaad de pagina." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Fout bij het verwijderen van de contacteigenschap." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Ontbrekend ID" @@ -116,10 +117,6 @@ msgstr "Informatie over vCard is fout. Herlaad de pagina: " msgid "Something went FUBAR. " msgstr "Er ging iets totaal verkeerd. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Fout bij het updaten van de contacteigenschap." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -155,31 +152,31 @@ msgstr "Fout bij laden plaatje." #: ajax/savecrop.php:69 msgid "Error getting contact object." -msgstr "" +msgstr "Fout om contact object te verkrijgen" #: ajax/savecrop.php:79 msgid "Error getting PHOTO property." -msgstr "" +msgstr "Fout om PHOTO eigenschap te verkrijgen" #: ajax/savecrop.php:98 msgid "Error saving contact." -msgstr "" +msgstr "Fout om contact op te slaan" #: ajax/savecrop.php:109 msgid "Error resizing image" -msgstr "" +msgstr "Fout tijdens aanpassen plaatje" #: ajax/savecrop.php:112 msgid "Error cropping image" -msgstr "" +msgstr "Fout tijdens aanpassen plaatje" #: ajax/savecrop.php:115 msgid "Error creating temporary image" -msgstr "" +msgstr "Fout om een tijdelijk plaatje te maken" #: ajax/savecrop.php:118 msgid "Error finding image: " -msgstr "" +msgstr "Fout kan plaatje niet vinden:" #: ajax/uploadimport.php:44 ajax/uploadimport.php:76 msgid "Error uploading contacts to storage." @@ -213,225 +210,273 @@ msgstr "Er ontbreekt een tijdelijke map" #: ajax/uploadphoto.php:59 ajax/uploadphoto.php:109 msgid "Couldn't save temporary image: " -msgstr "" +msgstr "Kan tijdelijk plaatje niet op slaan:" #: ajax/uploadphoto.php:62 ajax/uploadphoto.php:112 msgid "Couldn't load temporary image: " -msgstr "" +msgstr "Kan tijdelijk plaatje niet op laden:" #: ajax/uploadphoto.php:71 msgid "No file was uploaded. Unknown error" -msgstr "" +msgstr "Er was geen bestand geladen. Onbekende fout" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Contacten" #: js/contacts.js:71 msgid "Sorry, this functionality has not been implemented yet" -msgstr "" +msgstr "Sorry, deze functionaliteit is nog niet geïmplementeerd" #: js/contacts.js:71 msgid "Not implemented" -msgstr "" +msgstr "Niet geïmplementeerd" #: js/contacts.js:76 msgid "Couldn't get a valid address." -msgstr "" +msgstr "Kan geen geldig adres krijgen" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" -msgstr "" +msgstr "Fout" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "U hebt geen permissie om contacten toe te voegen aan" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Selecteer één van uw eigen adresboeken" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Permissie fout" + +#: js/contacts.js:763 msgid "This property has to be non-empty." -msgstr "" +msgstr "Dit veld mag niet leeg blijven" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." -msgstr "" +msgstr "Kan de elementen niet serializen" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" -msgstr "" +msgstr "'deleteProperty' aangeroepen zonder type argument. Rapporteer dit a.u.b. via http://bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" -msgstr "" +msgstr "Pas naam aan" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." -msgstr "" +msgstr "Geen bestanden geselecteerd voor upload." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." -msgstr "" +msgstr "Het bestand dat u probeert te uploaden overschrijdt de maximale bestand grootte voor bestand uploads voor deze server." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Fout profiel plaatje kan niet worden geladen." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" -msgstr "" +msgstr "Selecteer type" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "" +msgstr "Enkele contacten zijn gemarkeerd om verwijderd te worden, maar zijn nog niet verwijderd. Wacht totdat ze zijn verwijderd." + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Wilt u deze adresboeken samenvoegen?" #: js/loader.js:49 msgid "Result: " -msgstr "" +msgstr "Resultaat:" #: js/loader.js:49 msgid " imported, " -msgstr "" +msgstr "geïmporteerd," #: js/loader.js:49 msgid " failed." -msgstr "" +msgstr "gefaald." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Displaynaam mag niet leeg zijn." #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "" +msgstr "Adresboek niet gevonden:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Dit is niet uw adresboek." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Contact kon niet worden gevonden." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adres" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefoon" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisatie" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Werk" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Thuis" -#: lib/app.php:133 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 +msgid "Other" +msgstr "Anders" + +#: lib/app.php:201 msgid "Mobile" msgstr "Mobiel" -#: lib/app.php:135 +#: lib/app.php:203 msgid "Text" msgstr "Tekst" -#: lib/app.php:136 +#: lib/app.php:204 msgid "Voice" msgstr "Stem" -#: lib/app.php:137 +#: lib/app.php:205 msgid "Message" msgstr "Bericht" -#: lib/app.php:138 +#: lib/app.php:206 msgid "Fax" msgstr "Fax" -#: lib/app.php:139 +#: lib/app.php:207 msgid "Video" msgstr "Video" -#: lib/app.php:140 +#: lib/app.php:208 msgid "Pager" msgstr "Pieper" -#: lib/app.php:146 +#: lib/app.php:215 msgid "Internet" msgstr "Internet" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 msgid "Birthday" msgstr "Verjaardag" -#: lib/app.php:184 +#: lib/app.php:253 msgid "Business" -msgstr "" +msgstr "Business" -#: lib/app.php:185 +#: lib/app.php:254 msgid "Call" -msgstr "" +msgstr "Bel" -#: lib/app.php:186 +#: lib/app.php:255 msgid "Clients" -msgstr "" +msgstr "Klanten" -#: lib/app.php:187 +#: lib/app.php:256 msgid "Deliverer" -msgstr "" +msgstr "Leverancier" -#: lib/app.php:188 +#: lib/app.php:257 msgid "Holidays" -msgstr "" +msgstr "Vakanties" -#: lib/app.php:189 +#: lib/app.php:258 msgid "Ideas" -msgstr "" +msgstr "Ideeën" -#: lib/app.php:190 +#: lib/app.php:259 msgid "Journey" -msgstr "" +msgstr "Reis" -#: lib/app.php:191 +#: lib/app.php:260 msgid "Jubilee" -msgstr "" +msgstr "Jubileum" -#: lib/app.php:192 +#: lib/app.php:261 msgid "Meeting" -msgstr "" +msgstr "Vergadering" -#: lib/app.php:193 -msgid "Other" -msgstr "" - -#: lib/app.php:194 +#: lib/app.php:263 msgid "Personal" -msgstr "" +msgstr "Persoonlijk" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" -msgstr "" +msgstr "Projecten" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" -msgstr "" +msgstr "Vragen" #: lib/hooks.php:102 msgid "{name}'s Birthday" @@ -441,6 +486,14 @@ msgstr "{name}'s verjaardag" msgid "Contact" msgstr "Contact" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "U heeft geen permissie om dit contact te bewerken." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "U heeft geen permissie om dit contact te verwijderen." + #: templates/index.php:14 msgid "Add Contact" msgstr "Contact toevoegen" @@ -451,7 +504,7 @@ msgstr "Importeer" #: templates/index.php:18 msgid "Settings" -msgstr "" +msgstr "Instellingen" #: templates/index.php:18 templates/settings.php:9 msgid "Addressbooks" @@ -459,55 +512,55 @@ msgstr "Adresboeken" #: templates/index.php:36 templates/part.import.php:24 msgid "Close" -msgstr "" +msgstr "Sluiten" #: templates/index.php:37 msgid "Keyboard shortcuts" -msgstr "" +msgstr "Sneltoetsen" #: templates/index.php:39 msgid "Navigation" -msgstr "" +msgstr "Navigatie" #: templates/index.php:42 msgid "Next contact in list" -msgstr "" +msgstr "Volgende contact in de lijst" #: templates/index.php:44 msgid "Previous contact in list" -msgstr "" +msgstr "Vorige contact in de lijst" #: templates/index.php:46 msgid "Expand/collapse current addressbook" -msgstr "" +msgstr "Uitklappen / inklappen huidig adresboek" #: templates/index.php:48 msgid "Next addressbook" -msgstr "" +msgstr "Volgende adresboek" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "" +msgstr "Vorige adresboek" #: templates/index.php:54 msgid "Actions" -msgstr "" +msgstr "Acties" #: templates/index.php:57 msgid "Refresh contacts list" -msgstr "" +msgstr "Vernieuw contact lijst" #: templates/index.php:59 msgid "Add new contact" -msgstr "" +msgstr "Voeg nieuw contact toe" #: templates/index.php:61 msgid "Add new addressbook" -msgstr "" +msgstr "Voeg nieuw adresboek toe" #: templates/index.php:63 msgid "Delete current contact" -msgstr "" +msgstr "Verwijder huidig contact" #: templates/part.contact.php:17 msgid "Drop photo to upload" @@ -537,13 +590,18 @@ msgstr "Formateer aangepast, Korte naam, Volledige naam, Achteruit of Achteruit msgid "Edit name details" msgstr "Wijzig naam gegevens" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisatie" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Verwijderen" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Roepnaam" @@ -551,23 +609,23 @@ msgstr "Roepnaam" msgid "Enter nickname" msgstr "Voer roepnaam in" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" -msgstr "" +msgstr "Website" #: templates/part.contact.php:44 msgid "http://www.somesite.com" -msgstr "" +msgstr "http://www.willekeurigesite.com" #: templates/part.contact.php:44 msgid "Go to web site" -msgstr "" +msgstr "Ga naar website" #: templates/part.contact.php:46 msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Groepen" @@ -579,69 +637,90 @@ msgstr "Gebruik komma bij meerder groepen" msgid "Edit groups" msgstr "Wijzig groepen" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Voorkeur" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Geef een geldig email adres op." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Voer email adres in" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Mail naar adres" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Verwijder email adres" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Voer telefoonnummer in" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Verwijdere telefoonnummer" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Verwijder IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Bekijk op een kaart" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Wijzig adres gegevens" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Voeg notitie toe" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Voeg veld toe" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefoon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Instant Messaging" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adres" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Notitie" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Download contact" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Verwijder contact" #: templates/part.cropphoto.php:65 msgid "The temporary image has been removed from cache." -msgstr "" +msgstr "Het tijdelijke plaatje is uit de cache verwijderd." #: templates/part.edit_address_dialog.php:6 msgid "Edit address" @@ -658,11 +737,11 @@ msgstr "Postbus" #: templates/part.edit_address_dialog.php:24 msgid "Street address" -msgstr "" +msgstr "Adres" #: templates/part.edit_address_dialog.php:27 msgid "Street and number" -msgstr "" +msgstr "Straat en nummer" #: templates/part.edit_address_dialog.php:30 msgid "Extended" @@ -670,7 +749,7 @@ msgstr "Uitgebreide" #: templates/part.edit_address_dialog.php:33 msgid "Apartment number etc." -msgstr "" +msgstr "Apartement nummer" #: templates/part.edit_address_dialog.php:36 #: templates/part.edit_address_dialog.php:39 @@ -683,7 +762,7 @@ msgstr "Regio" #: templates/part.edit_address_dialog.php:45 msgid "E.g. state or province" -msgstr "" +msgstr "Provincie" #: templates/part.edit_address_dialog.php:48 msgid "Zipcode" @@ -691,7 +770,7 @@ msgstr "Postcode" #: templates/part.edit_address_dialog.php:51 msgid "Postal code" -msgstr "" +msgstr "Postcode" #: templates/part.edit_address_dialog.php:54 #: templates/part.edit_address_dialog.php:57 @@ -708,27 +787,27 @@ msgstr "Hon. prefixes" #: templates/part.edit_name_dialog.php:27 msgid "Miss" -msgstr "" +msgstr "Mw" #: templates/part.edit_name_dialog.php:28 msgid "Ms" -msgstr "" +msgstr "Mw" #: templates/part.edit_name_dialog.php:29 msgid "Mr" -msgstr "" +msgstr "M" #: templates/part.edit_name_dialog.php:30 msgid "Sir" -msgstr "" +msgstr "M" #: templates/part.edit_name_dialog.php:31 msgid "Mrs" -msgstr "" +msgstr "Mw" #: templates/part.edit_name_dialog.php:32 msgid "Dr" -msgstr "" +msgstr "M" #: templates/part.edit_name_dialog.php:35 msgid "Given name" @@ -806,21 +885,17 @@ msgstr "Je hebt geen contacten in je adresboek" msgid "Add contact" msgstr "Contactpersoon toevoegen" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Bewerken adresboeken" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" -msgstr "" +msgstr "Selecteer adresboeken" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" -msgstr "" +msgstr "Naam" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" -msgstr "" +msgstr "Beschrijving" #: templates/settings.php:3 msgid "CardDAV syncing addresses" @@ -840,40 +915,44 @@ msgstr "IOS/OS X" #: templates/settings.php:20 msgid "Show CardDav link" -msgstr "" +msgstr "Laat CardDav link zien" #: templates/settings.php:23 msgid "Show read-only VCF link" -msgstr "" +msgstr "Laat alleen lezen VCF link zien" #: templates/settings.php:26 +msgid "Share" +msgstr "Deel" + +#: templates/settings.php:29 msgid "Download" msgstr "Download" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Bewerken" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nieuw Adresboek" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" -msgstr "" +msgstr "Naam" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" -msgstr "" +msgstr "Beschrijving" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Opslaan" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Anuleren" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." -msgstr "" +msgstr "Meer..." diff --git a/l10n/nl/files.po b/l10n/nl/files.po index fd294e92b5..ab52fb7028 100644 --- a/l10n/nl/files.po +++ b/l10n/nl/files.po @@ -10,13 +10,14 @@ # , 2012. # , 2011. # , 2012. +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 08:34+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -58,87 +59,83 @@ msgstr "Schrijven naar schijf mislukt" msgid "Files" msgstr "Bestanden" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:111 templates/index.php:56 msgid "Delete" msgstr "Verwijder" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "bestaat al" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "vervang" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "annuleren" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "vervangen" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "door" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "ongedaan maken" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "verwijderd" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "aanmaken ZIP-file, dit kan enige tijd duren." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "uploaden van de file mislukt, het is of een directory of de bestandsgrootte is 0 bytes" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Upload Fout" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Wachten" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Uploaden geannuleerd." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Ongeldige naam, '/' is niet toegestaan." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Bestandsgrootte" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Laatst aangepast" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "map" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "mappen" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "bestand" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "bestanden" diff --git a/l10n/nl/files_encryption.po b/l10n/nl/files_encryption.po index bae30cdd15..bd80bdcae7 100644 --- a/l10n/nl/files_encryption.po +++ b/l10n/nl/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 19:11+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Versleuteling" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Versleutel de volgende bestand types niet" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Geen" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Zet versleuteling aan" diff --git a/l10n/nl/files_sharing.po b/l10n/nl/files_sharing.po index 9a3b58a554..dc30969ea7 100644 --- a/l10n/nl/files_sharing.po +++ b/l10n/nl/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 19:16+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Grootte" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Aangepast" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Verwijder alles" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Vewijder" diff --git a/l10n/nl/files_versions.po b/l10n/nl/files_versions.po index 94bdd0d707..cd67120849 100644 --- a/l10n/nl/files_versions.po +++ b/l10n/nl/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 16:58+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Alle versies laten verlopen" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Activeer file versioning" diff --git a/l10n/nl/gallery.po b/l10n/nl/gallery.po index 8548603b7b..4297c4c479 100644 --- a/l10n/nl/gallery.po +++ b/l10n/nl/gallery.po @@ -5,92 +5,37 @@ # Translators: # Erik Bent , 2012. # , 2012. +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Dutch (http://www.transifex.net/projects/p/owncloud/language/nl/)\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 16:54+0000\n" +"Last-Translator: Richard Bos \n" +"Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:37 +#: appinfo/app.php:42 msgid "Pictures" msgstr "Plaatjes" -#: js/album_cover.js:44 +#: js/pictures.js:12 msgid "Share gallery" -msgstr "" +msgstr "Deel gallerie" -#: js/album_cover.js:64 js/album_cover.js:100 js/album_cover.js:133 +#: js/pictures.js:32 msgid "Error: " -msgstr "" +msgstr "Fout:" -#: js/album_cover.js:64 js/album_cover.js:100 +#: js/pictures.js:32 msgid "Internal error" -msgstr "" +msgstr "Interne fout" -#: js/album_cover.js:114 -msgid "Scanning root" -msgstr "" - -#: js/album_cover.js:115 -msgid "Default order" -msgstr "" - -#: js/album_cover.js:116 -msgid "Ascending" -msgstr "" - -#: js/album_cover.js:116 -msgid "Descending" -msgstr "" - -#: js/album_cover.js:117 templates/index.php:19 -msgid "Settings" -msgstr "Instellingen" - -#: js/album_cover.js:122 -msgid "Scanning root cannot be empty" -msgstr "" - -#: js/album_cover.js:122 js/album_cover.js:133 -msgid "Error" -msgstr "" - -#: templates/index.php:16 -msgid "Rescan" -msgstr "Opnieuw doorzoeken" - -#: templates/index.php:17 -msgid "Stop" -msgstr "Stop" - -#: templates/index.php:18 -msgid "Share" -msgstr "Deel" - -#: templates/view_album.php:19 -msgid "Back" -msgstr "Terug" - -#: templates/view_album.php:36 -msgid "Remove confirmation" -msgstr "Verwijder bevestiging" - -#: templates/view_album.php:37 -msgid "Do you want to remove album" -msgstr "Wil je het album verwijderen: " - -#: templates/view_album.php:40 -msgid "Change album name" -msgstr "Wijzig album naam" - -#: templates/view_album.php:43 -msgid "New album name" -msgstr "Nieuwe album naam" +#: templates/index.php:27 +msgid "Slideshow" +msgstr "Diashow" diff --git a/l10n/nl/lib.po b/l10n/nl/lib.po index fbe8ced9f7..2715403dba 100644 --- a/l10n/nl/lib.po +++ b/l10n/nl/lib.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:23+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 15:58+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,96 +18,96 @@ msgstr "" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: app.php:287 +#: app.php:288 msgid "Help" -msgstr "" +msgstr "Help" -#: app.php:294 +#: app.php:295 msgid "Personal" -msgstr "" +msgstr "Persoonlijk" -#: app.php:299 +#: app.php:300 msgid "Settings" -msgstr "" +msgstr "Instellingen" -#: app.php:304 +#: app.php:305 msgid "Users" -msgstr "" +msgstr "Gebruikers" -#: app.php:311 +#: app.php:312 msgid "Apps" -msgstr "" +msgstr "Apps" -#: app.php:313 +#: app.php:314 msgid "Admin" -msgstr "" +msgstr "Administrator" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." -msgstr "" +msgstr "ZIP download is uitgeschakeld." -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." -msgstr "" +msgstr "Bestanden moeten één voor één worden gedownload." -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" -msgstr "" +msgstr "Terug naar bestanden" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." -msgstr "" +msgstr "De geselecteerde bestanden zijn te groot om een zip bestand te maken." #: json.php:28 msgid "Application is not enabled" -msgstr "" +msgstr "De applicatie is niet actief" #: json.php:39 json.php:63 json.php:75 msgid "Authentication error" -msgstr "" +msgstr "Authenticatie fout" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "" +msgstr "Token verlopen. Herlaad de pagina." #: template.php:86 msgid "seconds ago" -msgstr "" +msgstr "seconden geleden" #: template.php:87 msgid "1 minute ago" -msgstr "" +msgstr "1 minuut geleden" #: template.php:88 #, php-format msgid "%d minutes ago" -msgstr "" +msgstr "%d minuten geleden" #: template.php:91 msgid "today" -msgstr "" +msgstr "vandaag" #: template.php:92 msgid "yesterday" -msgstr "" +msgstr "gisteren" #: template.php:93 #, php-format msgid "%d days ago" -msgstr "" +msgstr "%d dagen geleden" #: template.php:94 msgid "last month" -msgstr "" +msgstr "vorige maand" #: template.php:95 msgid "months ago" -msgstr "" +msgstr "maanden geleden" #: template.php:96 msgid "last year" -msgstr "" +msgstr "vorig jaar" #: template.php:97 msgid "years ago" -msgstr "" +msgstr "jaar geleden" diff --git a/l10n/nl/settings.po b/l10n/nl/settings.po index b056a1747b..7f2741fcf9 100644 --- a/l10n/nl/settings.po +++ b/l10n/nl/settings.po @@ -9,13 +9,14 @@ # , 2012. # , 2011. # , 2012. +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 08:40+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +26,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Kan de lijst niet van de App store laden" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -45,7 +46,7 @@ msgstr "Ongeldig verzoek" #: ajax/removeuser.php:13 ajax/setquota.php:18 ajax/togglegroups.php:18 msgid "Authentication error" -msgstr "" +msgstr "Authenticatie fout" #: ajax/setlanguage.php:18 msgid "Language changed" @@ -53,7 +54,7 @@ msgstr "Taal aangepast" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Fout" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -73,23 +74,23 @@ msgstr "Nederlands" #: templates/admin.php:14 msgid "Security Warning" -msgstr "" +msgstr "Veiligheidswaarschuwing" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "Voer 1 taak uit bij elke geladen pagina" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php is geregistreerd bij een webcron service" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "gebruik de systeem cron service" #: templates/admin.php:39 msgid "Log" @@ -232,8 +233,8 @@ msgid "Other" msgstr "Andere" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "" +msgid "Group Admin" +msgstr "Groep Administrator" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/nl/user_openid.po b/l10n/nl/user_openid.po index c046633481..4b7c8f7370 100644 --- a/l10n/nl/user_openid.po +++ b/l10n/nl/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Richard Bos , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 19:20+0000\n" +"Last-Translator: Richard Bos \n" "Language-Team: Dutch (http://www.transifex.com/projects/p/owncloud/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,36 +20,36 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "" +msgstr "Dit is een OpenID server. Voor meer informatie, zie" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Identiteit: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Realm: " #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Gebruiker: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Login" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "Fout: Geen gebruiker geselecteerd" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" -msgstr "" +msgstr "u kan met dit adres bij andere sites authenticeren" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "" +msgstr "Geautoriseerde OpenID provider" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "" +msgstr "Uw adres bij Wordpress, Identi.ca, …" diff --git a/l10n/nn_NO/contacts.po b/l10n/nn_NO/contacts.po index e9742c79bc..aee7e87256 100644 --- a/l10n/nn_NO/contacts.po +++ b/l10n/nn_NO/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "Ein feil oppstod ved (de)aktivering av adressebok." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -81,18 +81,18 @@ msgstr "Minst eit av adressefelta må fyllast ut." msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informasjonen om vCard-et er feil, ver venleg og last sida på nytt." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Eit problem oppstod ved å slette kontaktfeltet." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -113,10 +113,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Eit problem oppstod ved å endre kontaktfeltet." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kotaktar" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -300,7 +313,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Dette er ikkje di adressebok." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Fann ikkje kontakten." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresse" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefonnummer" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Epost" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisasjon" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Arbeid" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Heime" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Tekst" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Tale" - -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faks" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Personsøkjar" - -#: lib/app.php:146 -msgid "Internet" -msgstr "" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Bursdag" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Tale" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Personsøkjar" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Bursdag" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -438,6 +482,14 @@ msgstr "" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Legg til kontakt" @@ -534,13 +586,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisasjon" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Slett" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -548,7 +605,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -564,7 +621,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -576,63 +633,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Føretrekt" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 +msgid "View on map" +msgstr "" + +#: templates/part.contact.php:110 +msgid "Edit address details" +msgstr "" + +#: templates/part.contact.php:116 +msgid "Add notes here." +msgstr "" + +#: templates/part.contact.php:124 msgid "Add field" msgstr "" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefonnummer" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Epost" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresse" + +#: templates/part.contact.php:133 msgid "Note" msgstr "" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Last ned kontakt" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Slett kontakt" @@ -803,19 +881,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Last ned" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Endra" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Ny adressebok" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Lagre" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Kanseller" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/nn_NO/files.po b/l10n/nn_NO/files.po index 5d14be6b12..f0ce0b444a 100644 --- a/l10n/nn_NO/files.po +++ b/l10n/nn_NO/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "" msgid "Files" msgstr "Filer" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Slett" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Storleik" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Endra" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/nn_NO/files_sharing.po b/l10n/nn_NO/files_sharing.po index a2531fd678..1ae9969855 100644 --- a/l10n/nn_NO/files_sharing.po +++ b/l10n/nn_NO/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: nn_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/nn_NO/settings.po b/l10n/nn_NO/settings.po index e9d4c7ed3e..465d4e3f60 100644 --- a/l10n/nn_NO/settings.po +++ b/l10n/nn_NO/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 06:17+0000\n" +"Last-Translator: Alexander Stevenson \n" "Language-Team: Norwegian Nynorsk (Norway) (http://www.transifex.com/projects/p/owncloud/language/nn_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,15 +21,15 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Klarer ikkje å laste inn liste fra App Store" #: ajax/lostpassword.php:14 msgid "Email saved" -msgstr "" +msgstr "E-postadresse lagra" #: ajax/lostpassword.php:16 msgid "Invalid email" -msgstr "" +msgstr "Ugyldig e-postadresse" #: ajax/openid.php:16 msgid "OpenID Changed" @@ -41,7 +41,7 @@ msgstr "Ugyldig førespurnad" #: ajax/removeuser.php:13 ajax/setquota.php:18 ajax/togglegroups.php:18 msgid "Authentication error" -msgstr "" +msgstr "Feil i autentisering" #: ajax/setlanguage.php:18 msgid "Language changed" @@ -49,15 +49,15 @@ msgstr "Språk endra" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Feil" #: js/apps.js:39 js/apps.js:73 msgid "Disable" -msgstr "" +msgstr "Slå av" #: js/apps.js:39 js/apps.js:62 msgid "Enable" -msgstr "" +msgstr "Slå på" #: js/personal.js:69 msgid "Saving..." @@ -228,7 +228,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/pl/admin_dependencies_chk.po b/l10n/pl/admin_dependencies_chk.po index bdec632155..952d2fda7b 100644 --- a/l10n/pl/admin_dependencies_chk.po +++ b/l10n/pl/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Cyryl Sochacki <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 09:01+0000\n" +"Last-Translator: Cyryl Sochacki <>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "Moduł php-json jest wymagane przez wiele aplikacji do wewnętrznej łączności" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "Modude php-curl jest wymagany do pobrania tytułu strony podczas dodawania zakładki" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "Moduł php-gd jest wymagany do tworzenia miniatury obrazów" #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "Moduł php-ldap jest wymagany aby połączyć się z serwerem ldap" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "Moduł php-zip jest wymagany aby pobrać wiele plików na raz" #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "Moduł php-mb_multibyte jest wymagany do poprawnego zarządzania kodowaniem." #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "Moduł php-ctype jest wymagany do sprawdzania poprawności danych." #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "Moduł php-xml jest wymagany do udostępniania plików przy użyciu protokołu webdav." #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "Dyrektywy allow_url_fopen użytkownika php.ini powinna być ustawiona na 1 do pobierania bazy wiedzy z serwerów OCS" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "Moduł php-pdo jest wymagany do przechowywania danych owncloud w bazie danych." #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Stan zależności" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Używane przez:" diff --git a/l10n/pl/contacts.po b/l10n/pl/contacts.po index 04c9ce97a2..c0d1d34b69 100644 --- a/l10n/pl/contacts.po +++ b/l10n/pl/contacts.po @@ -5,15 +5,16 @@ # Translators: # Bartek , 2012. # Cyryl Sochacki <>, 2012. +# , 2012. # Marcin Małecki , 2011, 2012. # Piotr Sokół , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +27,7 @@ msgid "Error (de)activating addressbook." msgstr "Błąd (de)aktywowania książki adresowej." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id nie ustawione." @@ -83,18 +84,18 @@ msgstr "Należy wypełnić przynajmniej jedno pole adresu." msgid "Trying to add duplicate property: " msgstr "Próba dodania z duplikowanej właściwości:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Błąd przy dodawaniu właściwości kontaktu:" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informacje o vCard są nieprawidłowe. Proszę odświeżyć stronę." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Błąd usuwania elementu." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Brak ID" @@ -115,10 +116,6 @@ msgstr "Informacje na temat vCard są niepoprawne. Proszę przeładuj stronę:" msgid "Something went FUBAR. " msgstr "Gdyby coś poszło FUBAR." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Błąd uaktualniania elementu." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -222,7 +219,7 @@ msgstr "Nie można wczytać obrazu tymczasowego: " msgid "No file was uploaded. Unknown error" msgstr "Plik nie został załadowany. Nieznany błąd" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontakty" @@ -239,56 +236,73 @@ msgid "Couldn't get a valid address." msgstr "Nie można pobrać prawidłowego adresu." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Błąd" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Ta właściwość nie może być pusta." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Nie można serializować elementów." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "\"deleteProperty' wywołana bez argumentu typu. Proszę raportuj na bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Zmień nazwę" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Żadne pliki nie zostały zaznaczone do wysłania." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Plik, który próbujesz wysłać przekracza maksymalny rozmiar pliku przekazywania na tym serwerze." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Błąd wczytywania zdjęcia profilu." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Wybierz typ" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "" +msgstr "Niektóre kontakty są zaznaczone do usunięcia, ale nie są usunięte jeszcze. Proszę czekać na ich usunięcie." + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Czy chcesz scalić te książki adresowe?" #: js/loader.js:49 msgid "Result: " @@ -302,133 +316,164 @@ msgstr " importowane, " msgid " failed." msgstr " nie powiodło się." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Nazwa nie może być pusta." #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "" +msgstr "Nie znaleziono książki adresowej:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "To nie jest Twoja książka adresowa." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Nie można odnaleźć kontaktu." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adres" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizacja" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GG" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Praca" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Dom" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Komórka" - -#: lib/app.php:135 -msgid "Text" -msgstr "Połączenie tekstowe" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Połączenie głosowe" - -#: lib/app.php:137 -msgid "Message" -msgstr "Wiadomość" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faks" - -#: lib/app.php:139 -msgid "Video" -msgstr "Połączenie wideo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Urodziny" - -#: lib/app.php:184 -msgid "Business" -msgstr "Biznesowe" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Klienci" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Święta" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Pomysły" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Podróż" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Spotkanie" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Inne" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Komórka" + +#: lib/app.php:203 +msgid "Text" +msgstr "Połączenie tekstowe" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Połączenie głosowe" + +#: lib/app.php:205 +msgid "Message" +msgstr "Wiadomość" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:207 +msgid "Video" +msgstr "Połączenie wideo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Urodziny" + +#: lib/app.php:253 +msgid "Business" +msgstr "Biznesowe" + +#: lib/app.php:254 +msgid "Call" +msgstr "Wywołanie" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Klienci" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Doręczanie" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Święta" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Pomysły" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Podróż" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Jubileusz" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Spotkanie" + +#: lib/app.php:263 msgid "Personal" msgstr "Osobiste" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projekty" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Pytania" @@ -440,6 +485,14 @@ msgstr "{name} Urodzony" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Dodaj kontakt" @@ -478,15 +531,15 @@ msgstr "Poprzedni kontakt na liście" #: templates/index.php:46 msgid "Expand/collapse current addressbook" -msgstr "" +msgstr "Rozwiń/Zwiń bieżącą książkę adresową" #: templates/index.php:48 msgid "Next addressbook" -msgstr "" +msgstr "Następna książka adresowa" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "" +msgstr "Poprzednia książka adresowa" #: templates/index.php:54 msgid "Actions" @@ -536,13 +589,18 @@ msgstr "Format niestandardowy, krótkie nazwy, imię i nazwisko, Odwracać lub O msgid "Edit name details" msgstr "Edytuj szczegóły nazwy" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizacja" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Usuwa książkę adresową" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Nazwa" @@ -550,7 +608,7 @@ msgstr "Nazwa" msgid "Enter nickname" msgstr "Wpisz nazwę" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Strona www" @@ -566,7 +624,7 @@ msgstr "Idż do strony www" msgid "dd-mm-yyyy" msgstr "dd-mm-rrrr" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupy" @@ -578,63 +636,84 @@ msgstr "Oddziel grupy przecinkami" msgid "Edit groups" msgstr "Edytuj grupy" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferowane" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Określ prawidłowy adres e-mail." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Wpisz adres email" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Mail na adres" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Usuń adres mailowy" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Wpisz numer telefonu" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Usuń numer telefonu" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Zobacz na mapie" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Edytuj szczegóły adresu" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Dodaj notatkę tutaj." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Dodaj pole" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adres" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Uwaga" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Pobiera kontakt" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Usuwa kontakt" @@ -657,7 +736,7 @@ msgstr "Skrzynka pocztowa" #: templates/part.edit_address_dialog.php:24 msgid "Street address" -msgstr "" +msgstr "Ulica" #: templates/part.edit_address_dialog.php:27 msgid "Street and number" @@ -669,7 +748,7 @@ msgstr "Rozszerzony" #: templates/part.edit_address_dialog.php:33 msgid "Apartment number etc." -msgstr "" +msgstr "Numer lokalu" #: templates/part.edit_address_dialog.php:36 #: templates/part.edit_address_dialog.php:39 @@ -682,7 +761,7 @@ msgstr "Region" #: templates/part.edit_address_dialog.php:45 msgid "E.g. state or province" -msgstr "" +msgstr "Np. stanu lub prowincji" #: templates/part.edit_address_dialog.php:48 msgid "Zipcode" @@ -805,19 +884,15 @@ msgstr "Nie masz żadnych kontaktów w swojej książce adresowej." msgid "Add contact" msgstr "Dodaj kontakt" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Konfiguruj książkę adresową" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Wybierz książki adresowe" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Wpisz nazwę" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Wprowadź opis" @@ -839,40 +914,44 @@ msgstr "iOS/OS X" #: templates/settings.php:20 msgid "Show CardDav link" -msgstr "" +msgstr "Pokaż link CardDAV" #: templates/settings.php:23 msgid "Show read-only VCF link" -msgstr "" +msgstr "Pokaż tylko do odczytu łącze VCF" #: templates/settings.php:26 +msgid "Share" +msgstr "Udostępnij" + +#: templates/settings.php:29 msgid "Download" msgstr "Pobiera książkę adresową" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Edytuje książkę adresową" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nowa książka adresowa" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" -msgstr "" +msgstr "Nazwa" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" -msgstr "" +msgstr "Opis" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Zapisz" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Anuluj" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." -msgstr "" +msgstr "Więcej..." diff --git a/l10n/pl/files.po b/l10n/pl/files.po index 8f4aad1f4e..706d14931b 100644 --- a/l10n/pl/files.po +++ b/l10n/pl/files.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,87 +55,83 @@ msgstr "Błąd zapisu na dysk" msgid "Files" msgstr "Pliki" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Usuwa element" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "Już istnieje" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "zastap" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "anuluj" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "zastąpione" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "z" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "wróć" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "skasuj" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "Generowanie pliku ZIP, może potrwać pewien czas." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nie można wczytać pliku jeśli jest katalogiem lub ma 0 bajtów" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Błąd wczytywania" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Oczekujące" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Wczytywanie anulowane." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Nieprawidłowa nazwa '/' jest niedozwolone." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Rozmiar" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Czas modyfikacji" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "folder" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "foldery" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "plik" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "pliki" diff --git a/l10n/pl/files_external.po b/l10n/pl/files_external.po index f86f0148ff..6257d72599 100644 --- a/l10n/pl/files_external.po +++ b/l10n/pl/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Cyryl Sochacki <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 09:06+0000\n" +"Last-Translator: Cyryl Sochacki <>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,64 +20,64 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Zewnętrzna zasoby dyskowe" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "Punkt montowania" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "Zaplecze" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Konfiguracja" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Opcje" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "Zastosowanie" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Dodaj punkt montowania" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "Nie ustawione" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Wszyscy uzytkownicy" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Grupy" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Użytkownicy" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Usuń" #: templates/settings.php:88 msgid "SSL root certificates" -msgstr "" +msgstr "Główny certyfikat SSL" #: templates/settings.php:102 msgid "Import Root Certificate" -msgstr "" +msgstr "Importuj główny certyfikat" #: templates/settings.php:108 msgid "Enable User External Storage" -msgstr "" +msgstr "Włącz zewnętrzne zasoby dyskowe użytkownika" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "Zezwalaj użytkownikom na montowanie ich własnych zewnętrznych zasobów dyskowych" diff --git a/l10n/pl/files_sharing.po b/l10n/pl/files_sharing.po index 6816ef762e..576158713d 100644 --- a/l10n/pl/files_sharing.po +++ b/l10n/pl/files_sharing.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-13 12:29+0000\n" -"Last-Translator: Cyryl Sochacki <>\n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,38 +18,18 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "Twoje udostępnione pliki" +#: templates/get.php:4 +msgid "Size" +msgstr "Rozmiar" -#: templates/list.php:6 -msgid "Item" -msgstr "Element" +#: templates/get.php:5 +msgid "Modified" +msgstr "Zmodyfikowane" -#: templates/list.php:7 -msgid "Shared With" -msgstr "Udostępnione dla" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Usuń wszystko" -#: templates/list.php:8 -msgid "Permissions" -msgstr "Uprawnienia" - -#: templates/list.php:16 -msgid "Read" -msgstr "Odczyt" - -#: templates/list.php:16 -msgid "Edit" -msgstr "Edycja" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "Usuń" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "Włącz ponowne udostępnianie" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "Zezwalaj użytkownikom na ponowne udostępnienie plików, które są im udostępnione" diff --git a/l10n/pl/settings.po b/l10n/pl/settings.po index a3c4bafc1d..b9273c4c45 100644 --- a/l10n/pl/settings.po +++ b/l10n/pl/settings.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 07:48+0000\n" +"Last-Translator: Cyryl Sochacki <>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +26,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Nie mogę załadować listy aplikacji" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -54,7 +54,7 @@ msgstr "Język zmieniony" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Błąd" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -78,19 +78,19 @@ msgstr "Ostrzeżenia bezpieczeństwa" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "wykonanie jednego zadania z każdej załadowanej strony" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php jest zarejestrowany w usłudze webcron" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "korzystaj z usługi systemowej cron" #: templates/admin.php:39 msgid "Log" @@ -233,8 +233,8 @@ msgid "Other" msgstr "Inne" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "SubAdmin" +msgid "Group Admin" +msgstr "Grupa Admin" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/pl/tasks.po b/l10n/pl/tasks.po index 563964d39b..39026f9020 100644 --- a/l10n/pl/tasks.po +++ b/l10n/pl/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Cyryl Sochacki <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 09:20+0000\n" +"Last-Translator: Cyryl Sochacki <>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,88 +20,88 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Zła data/czas" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Zadania" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Brak kategorii" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Nieokreślona" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=najwyższy" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=średni" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=mało ważny " #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Podsumowanie puste" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Nieprawidłowy procent wykonania" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Nieprawidłowy priorytet" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Dodaj zadanie" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Kolejność - domyślna" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Kolejność - wg lista" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Kolejność - wg kompletności" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Kolejność - wg lokalizacja" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Kolejność - wg priorytetu" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Kolejność - wg nazywy" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Ładuję zadania" #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Ważne" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Więcej" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Mniej" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Usuń" diff --git a/l10n/pl/user_ldap.po b/l10n/pl/user_ldap.po index 89148af24b..8dce1f22d4 100644 --- a/l10n/pl/user_ldap.po +++ b/l10n/pl/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Cyryl Sochacki <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 08:52+0000\n" +"Last-Translator: Cyryl Sochacki <>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,146 +20,146 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "Host" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "Można pominąć protokół, z wyjątkiem wymaganego protokołu SSL. Następnie uruchom z ldaps://" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Baza DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "Bazę DN można określić dla użytkowników i grup w karcie Zaawansowane" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "Użytkownik DN" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "DN użytkownika klienta, z którym powiązanie wykonuje się, np. uid=agent,dc=example,dc=com. Dla dostępu anonimowego pozostawić DN i hasło puste" #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Hasło" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "Dla dostępu anonimowego pozostawić DN i hasło puste." #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "Filtr logowania użytkownika" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "Definiuje filtr do zastosowania, gdy podejmowana jest próba logowania. %%uid zastępuje nazwę użytkownika w działaniu logowania." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "Użyj %%uid zastępczy, np. \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "Lista filtrów użytkownika" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "Definiuje filtry do zastosowania, podczas pobierania użytkowników." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "bez żadnych symboli zastępczych np. \"objectClass=person\"." #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "Grupa filtrów" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "Definiuje filtry do zastosowania, podczas pobierania grup." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "bez żadnych symboli zastępczych np. \"objectClass=posixGroup\"." #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Port" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "Drzewo bazy użytkowników" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "Drzewo bazy grup" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "" +msgstr "Członek grupy stowarzyszenia" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Użyj TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "Nie używaj SSL dla połączeń, jeśli się nie powiedzie." #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "Wielkość liter serwera LDAP (Windows)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "Wyłączyć sprawdzanie poprawności certyfikatu SSL." #: templates/settings.php:23 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "" +msgstr "Jeśli połączenie działa tylko z tą opcją, zaimportuj certyfikat SSL serwera LDAP w serwerze ownCloud." #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Niezalecane, użyj tylko testowo." #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "" +msgstr "Pole wyświetlanej nazwy użytkownika" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." -msgstr "" +msgstr "Atrybut LDAP służy do generowania nazwy użytkownika ownCloud." #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "" +msgstr "Pole wyświetlanej nazwy grupy" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." -msgstr "" +msgstr "Atrybut LDAP służy do generowania nazwy grup ownCloud." #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "w bajtach" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "w sekundach. Zmiana opróżnia pamięć podręczną." #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Pomoc" diff --git a/l10n/pl/user_migrate.po b/l10n/pl/user_migrate.po index 656770d554..4b85ca025a 100644 --- a/l10n/pl/user_migrate.po +++ b/l10n/pl/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Cyryl Sochacki <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 09:09+0000\n" +"Last-Translator: Cyryl Sochacki <>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,33 +20,33 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Eksport" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "" +msgstr "Coś poszło źle, podczas generowania pliku eksportu" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "Wystąpił błąd" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "Eksportuj konto użytkownika" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "Spowoduje to utworzenie pliku skompresowanego, który zawiera konto ownCloud." #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "Importuj konto użytkownika" #: templates/settings.php:15 msgid "ownCloud User Zip" -msgstr "" +msgstr "paczka Zip użytkownika ownCloud" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Importuj" diff --git a/l10n/pl/user_openid.po b/l10n/pl/user_openid.po index 48f7a0f6dc..c199a51dcb 100644 --- a/l10n/pl/user_openid.po +++ b/l10n/pl/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Cyryl Sochacki <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-20 09:12+0000\n" +"Last-Translator: Cyryl Sochacki <>\n" "Language-Team: Polish (http://www.transifex.com/projects/p/owncloud/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,36 +20,36 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "" +msgstr "To jest punkt końcowy serwera OpenID. Aby uzyskać więcej informacji zobacz" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Tożsamość: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Obszar: " #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Użytkownik: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Login" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "Błąd:Nie wybrano użytkownika" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" -msgstr "" +msgstr "można uwierzytelniać do innych witryn z tego adresu" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "" +msgstr "Autoryzowani dostawcy OpenID" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "" +msgstr "Twój adres na Wordpress, Identi.ca, …" diff --git a/l10n/pt_BR/contacts.po b/l10n/pt_BR/contacts.po index e0aa5a97bd..e4a7f97946 100644 --- a/l10n/pt_BR/contacts.po +++ b/l10n/pt_BR/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "Erro ao (des)ativar agenda." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID não definido." @@ -82,18 +82,18 @@ msgstr "Pelo menos um dos campos de endereço tem que ser preenchido." msgid "Trying to add duplicate property: " msgstr "Tentando adiciona propriedade duplicada:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informações sobre vCard é incorreta. Por favor, recarregue a página." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Erro ao excluir propriedade de contato." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Faltando ID" @@ -114,10 +114,6 @@ msgstr "Informação sobre vCard incorreto. Por favor, recarregue a página:" msgid "Something went FUBAR. " msgstr "Something went FUBAR. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Erro ao atualizar propriedades do contato." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "Não foi possível carregar a imagem temporária:" msgid "No file was uploaded. Unknown error" msgstr "Nenhum arquivo foi transferido. Erro desconhecido" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Contatos" @@ -238,57 +234,74 @@ msgid "Couldn't get a valid address." msgstr "Não foi possível obter um endereço válido." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Erro" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Esta propriedade não pode estar vazia." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Não foi possível serializar elementos." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "\"deleteProperty\" chamado sem argumento de tipo. Por favor, informe a bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Editar nome" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Nenhum arquivo selecionado para carregar." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "O arquivo que você está tentando carregar excede o tamanho máximo para este servidor." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Selecione o tipo" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Resultado:" @@ -301,7 +314,7 @@ msgstr "importado," msgid " failed." msgstr "falhou." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -309,125 +322,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Esta não é a sua agenda de endereços." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Contato não pôde ser encontrado." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Endereço" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefone" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organização" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Trabalho" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Home" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Móvel" - -#: lib/app.php:135 -msgid "Text" -msgstr "Texto" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voz" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mensagem" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Vídeo" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Aniversário" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Móvel" + +#: lib/app.php:203 +msgid "Text" +msgstr "Texto" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voz" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mensagem" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Vídeo" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Aniversário" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -439,6 +483,14 @@ msgstr "Aniversário de {name}" msgid "Contact" msgstr "Contato" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Adicionar Contato" @@ -535,13 +587,18 @@ msgstr "Formato personalizado, Nome curto, Nome completo, Inverter ou Inverter c msgid "Edit name details" msgstr "Editar detalhes do nome" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organização" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Excluir" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Apelido" @@ -549,7 +606,7 @@ msgstr "Apelido" msgid "Enter nickname" msgstr "Digite o apelido" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -565,7 +622,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-aaaa" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupos" @@ -577,63 +634,84 @@ msgstr "Separe grupos por virgula" msgid "Edit groups" msgstr "Editar grupos" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferido" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Por favor, especifique um email válido." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Digite um endereço de email" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Correio para endereço" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Remover endereço de email" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Digite um número de telefone" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Remover número de telefone" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Visualizar no mapa" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Editar detalhes de endereço" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Adicionar notas" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Adicionar campo" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefone" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Endereço" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Baixar contato" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Apagar contato" @@ -804,19 +882,15 @@ msgstr "Voce não tem contatos em sua agenda de endereços." msgid "Add contact" msgstr "Adicionar contatos" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Configurar agenda de endereços" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -845,33 +919,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Baixar" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editar" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nova agenda" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Salvar" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Cancelar" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/pt_BR/files.po b/l10n/pt_BR/files.po index 66f9894b6a..ccac7b79d1 100644 --- a/l10n/pt_BR/files.po +++ b/l10n/pt_BR/files.po @@ -4,6 +4,7 @@ # # Translators: # Guilherme Maluf Balzana , 2012. +# , 2012. # Thiago Vicente , 2012. # Unforgiving Fallout <>, 2012. # Van Der Fran , 2011, 2012. @@ -11,9 +12,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 22:17+0000\n" +"Last-Translator: targinosilveira \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -55,87 +56,83 @@ msgstr "Falha ao escrever no disco" msgid "Files" msgstr "Arquivos" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:111 templates/index.php:56 msgid "Delete" msgstr "Excluir" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "já existe" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "substituir" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "cancelar" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "substituido " #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "com" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "desfazer" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "deletado" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "gerando arquivo ZIP, isso pode levar um tempo." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Impossível enviar seus arquivo como diretório ou ele tem 0 bytes." -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Erro de envio" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Pendente" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Envio cancelado." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Nome inválido, '/' não é permitido." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Tamanho" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificado" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "pasta" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "pastas" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "arquivo" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "arquivos" diff --git a/l10n/pt_BR/files_sharing.po b/l10n/pt_BR/files_sharing.po index 88d7f7093c..3e73c6ab3c 100644 --- a/l10n/pt_BR/files_sharing.po +++ b/l10n/pt_BR/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/pt_BR/settings.po b/l10n/pt_BR/settings.po index 9900cd1902..901713f7c8 100644 --- a/l10n/pt_BR/settings.po +++ b/l10n/pt_BR/settings.po @@ -6,15 +6,16 @@ # , 2011. # Guilherme Maluf Balzana , 2012. # Sandro Venezuela , 2012. +# , 2012. # Thiago Vicente , 2012. # Van Der Fran , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 22:19+0000\n" +"Last-Translator: targinosilveira \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/owncloud/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -44,7 +45,7 @@ msgstr "Pedido inválido" #: ajax/removeuser.php:13 ajax/setquota.php:18 ajax/togglegroups.php:18 msgid "Authentication error" -msgstr "" +msgstr "erro de autenticação" #: ajax/setlanguage.php:18 msgid "Language changed" @@ -52,7 +53,7 @@ msgstr "Mudou Idioma" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Erro" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -72,7 +73,7 @@ msgstr "Português" #: templates/admin.php:14 msgid "Security Warning" -msgstr "" +msgstr "Aviso de Segurança" #: templates/admin.php:29 msgid "Cron" @@ -80,11 +81,11 @@ msgstr "" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "executar uma tarefa com cada página em aberto" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php esta registrado no serviço de webcron" #: templates/admin.php:35 msgid "use systems cron service" @@ -231,8 +232,8 @@ msgid "Other" msgstr "Outro" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "" +msgid "Group Admin" +msgstr "Grupo Administrativo" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/pt_PT/calendar.po b/l10n/pt_PT/calendar.po index 190c42bb94..b82792c41e 100644 --- a/l10n/pt_PT/calendar.po +++ b/l10n/pt_PT/calendar.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # , 2011. # Helder Meneses , 2012. # , 2012. @@ -10,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 20:06+0000\n" +"Last-Translator: rlameiro \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,11 +23,11 @@ msgstr "" #: ajax/cache/status.php:19 msgid "Not all calendars are completely cached" -msgstr "" +msgstr "Nem todos os calendários estão completamente pré-carregados" #: ajax/cache/status.php:21 msgid "Everything seems to be completely cached" -msgstr "" +msgstr "Parece que tudo está completamente pré-carregado" #: ajax/categories/rescan.php:29 msgid "No calendars found." @@ -44,19 +45,19 @@ msgstr "Calendário errado" msgid "" "The file contained either no events or all events are already saved in your " "calendar." -msgstr "" +msgstr "O ficheiro não continha nenhuns eventos ou então todos os eventos já estavam carregados no seu calendário" #: ajax/import/dropimport.php:31 ajax/import/import.php:67 msgid "events has been saved in the new calendar" -msgstr "" +msgstr "Os eventos foram guardados no novo calendário" #: ajax/import/import.php:56 msgid "Import failed" -msgstr "" +msgstr "Falha na importação" #: ajax/import/import.php:69 msgid "events has been saved in your calendar" -msgstr "" +msgstr "Os eventos foram guardados no seu calendário" #: ajax/settings/guesstimezone.php:25 msgid "New Timezone:" @@ -70,7 +71,7 @@ msgstr "Zona horária alterada" msgid "Invalid request" msgstr "Pedido inválido" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:37 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "Calendário" @@ -161,7 +162,7 @@ msgstr "Trabalho" #: lib/app.php:351 lib/app.php:361 msgid "by" -msgstr "" +msgstr "por" #: lib/app.php:359 lib/app.php:399 msgid "unnamed" @@ -350,79 +351,79 @@ msgstr "Cal." #: templates/calendar.php:6 msgid "Sun." -msgstr "" +msgstr "Dom." #: templates/calendar.php:6 msgid "Mon." -msgstr "" +msgstr "Seg." #: templates/calendar.php:6 msgid "Tue." -msgstr "" +msgstr "ter." #: templates/calendar.php:6 msgid "Wed." -msgstr "" +msgstr "Qua." #: templates/calendar.php:6 msgid "Thu." -msgstr "" +msgstr "Qui." #: templates/calendar.php:6 msgid "Fri." -msgstr "" +msgstr "Sex." #: templates/calendar.php:6 msgid "Sat." -msgstr "" +msgstr "Sáb." #: templates/calendar.php:8 msgid "Jan." -msgstr "" +msgstr "Jan." #: templates/calendar.php:8 msgid "Feb." -msgstr "" +msgstr "Fev," #: templates/calendar.php:8 msgid "Mar." -msgstr "" +msgstr "Mar." #: templates/calendar.php:8 msgid "Apr." -msgstr "" +msgstr "Abr." #: templates/calendar.php:8 msgid "May." -msgstr "" +msgstr "Mai." #: templates/calendar.php:8 msgid "Jun." -msgstr "" +msgstr "Jun." #: templates/calendar.php:8 msgid "Jul." -msgstr "" +msgstr "Jul." #: templates/calendar.php:8 msgid "Aug." -msgstr "" +msgstr "Ago." #: templates/calendar.php:8 msgid "Sep." -msgstr "" +msgstr "Set." #: templates/calendar.php:8 msgid "Oct." -msgstr "" +msgstr "Out." #: templates/calendar.php:8 msgid "Nov." -msgstr "" +msgstr "Nov." #: templates/calendar.php:8 msgid "Dec." -msgstr "" +msgstr "Dez." #: templates/calendar.php:11 msgid "All day" @@ -479,7 +480,7 @@ msgstr "Hoje" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Configurações" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -687,7 +688,7 @@ msgstr "Importar um ficheiro de calendário" #: templates/part.import.php:24 msgid "Please choose a calendar" -msgstr "" +msgstr "Escolha um calendário por favor" #: templates/part.import.php:36 msgid "Name of new calendar" @@ -695,13 +696,13 @@ msgstr "Nome do novo calendário" #: templates/part.import.php:44 msgid "Take an available name!" -msgstr "" +msgstr "Escolha um nome disponível!" #: templates/part.import.php:45 msgid "" "A Calendar with this name already exists. If you continue anyhow, these " "calendars will be merged." -msgstr "" +msgstr "Já existe um Calendário com esse nome. Se mesmo assim continuar, esses calendários serão fundidos." #: templates/part.import.php:47 msgid "Import" @@ -733,7 +734,7 @@ msgstr "em" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Geral" #: templates/settings.php:15 msgid "Timezone" @@ -741,11 +742,11 @@ msgstr "Zona horária" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Actualizar automaticamente o fuso horário" #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "Formato da hora" #: templates/settings.php:57 msgid "24h" @@ -757,39 +758,39 @@ msgstr "12h" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "Começar semana em" #: templates/settings.php:76 msgid "Cache" -msgstr "" +msgstr "Memória de pré-carregamento" #: templates/settings.php:80 msgid "Clear cache for repeating events" -msgstr "" +msgstr "Limpar a memória de pré carregamento para eventos recorrentes" #: templates/settings.php:85 msgid "URLs" -msgstr "" +msgstr "Endereço(s) web" #: templates/settings.php:87 msgid "Calendar CalDAV syncing addresses" -msgstr "" +msgstr "Endereços de sincronização de calendários CalDAV" #: templates/settings.php:87 msgid "more info" -msgstr "" +msgstr "mais informação" #: templates/settings.php:89 msgid "Primary address (Kontact et al)" -msgstr "" +msgstr "Endereço principal (contactos et al.)" #: templates/settings.php:91 msgid "iOS/OS X" -msgstr "" +msgstr "iOS/OS X" #: templates/settings.php:93 msgid "Read only iCalendar link(s)" -msgstr "" +msgstr "Ligaç(ão/ões) só de leitura do iCalendar" #: templates/share.dropdown.php:20 msgid "Users" diff --git a/l10n/pt_PT/contacts.po b/l10n/pt_PT/contacts.po index 964dae2196..ee8c370515 100644 --- a/l10n/pt_PT/contacts.po +++ b/l10n/pt_PT/contacts.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # , 2011. # Helder Meneses , 2012. # , 2012. @@ -10,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +26,7 @@ msgid "Error (de)activating addressbook." msgstr "Erro a (des)ativar o livro de endereços" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id não está definido" @@ -68,7 +69,7 @@ msgstr "o nome do elemento não está definido." #: ajax/contact/addproperty.php:46 msgid "Could not parse contact: " -msgstr "" +msgstr "Incapaz de processar contacto" #: ajax/contact/addproperty.php:56 msgid "Cannot add empty property." @@ -82,18 +83,18 @@ msgstr "Pelo menos um dos campos de endereço precisa de estar preenchido" msgid "Trying to add duplicate property: " msgstr "A tentar adicionar propriedade duplicada: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Falta o parâmetro de mensagens instantâneas (IM)" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Mensagens instantâneas desconhecida (IM)" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "A informação sobre o vCard está incorreta. Por favor refresque a página" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Erro ao apagar propriedade do contato" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Falta ID" @@ -114,10 +115,6 @@ msgstr "A informação sobre o VCard está incorrecta. Por favor refresque a pá msgid "Something went FUBAR. " msgstr "Algo provocou um FUBAR. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Erro ao atualizar propriedade do contato" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +218,7 @@ msgstr "Não é possível carregar a imagem temporária: " msgid "No file was uploaded. Unknown error" msgstr "Nenhum ficheiro foi carregado. Erro desconhecido" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Contactos" @@ -238,56 +235,73 @@ msgid "Couldn't get a valid address." msgstr "Não foi possível obter um endereço válido." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Erro" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Esta propriedade não pode estar vazia." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Não foi possivel serializar os elementos" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' chamada sem argumento definido. Por favor report o problema em bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Editar nome" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Nenhum ficheiro seleccionado para enviar." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "O tamanho do ficheiro que está a tentar carregar ultrapassa o limite máximo definido para ficheiros no servidor." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Erro ao carregar imagem de perfil." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Seleccionar tipo" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "" +msgstr "Alguns contactos forma marcados para apagar, mas ainda não foram apagados. Por favor espere que ele sejam apagados." + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Quer fundir estes Livros de endereços?" #: js/loader.js:49 msgid "Result: " @@ -301,135 +315,166 @@ msgstr " importado, " msgid " failed." msgstr " falhou." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Displayname não pode ser vazio" #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "" +msgstr "Livro de endereços não encontrado." -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Esta não é a sua lista de contactos" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "O contacto não foi encontrado" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Morada" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefone" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organização" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Emprego" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Casa" -#: lib/app.php:133 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 +msgid "Other" +msgstr "Outro" + +#: lib/app.php:201 msgid "Mobile" msgstr "Telemovel" -#: lib/app.php:135 +#: lib/app.php:203 msgid "Text" msgstr "Texto" -#: lib/app.php:136 +#: lib/app.php:204 msgid "Voice" msgstr "Voz" -#: lib/app.php:137 +#: lib/app.php:205 msgid "Message" msgstr "Mensagem" -#: lib/app.php:138 +#: lib/app.php:206 msgid "Fax" msgstr "Fax" -#: lib/app.php:139 +#: lib/app.php:207 msgid "Video" msgstr "Vídeo" -#: lib/app.php:140 +#: lib/app.php:208 msgid "Pager" msgstr "Pager" -#: lib/app.php:146 +#: lib/app.php:215 msgid "Internet" msgstr "Internet" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 msgid "Birthday" msgstr "Aniversário" -#: lib/app.php:184 +#: lib/app.php:253 msgid "Business" -msgstr "" +msgstr "Empresa" -#: lib/app.php:185 +#: lib/app.php:254 msgid "Call" -msgstr "" +msgstr "Telefonar" -#: lib/app.php:186 +#: lib/app.php:255 msgid "Clients" -msgstr "" +msgstr "Clientes" -#: lib/app.php:187 +#: lib/app.php:256 msgid "Deliverer" -msgstr "" +msgstr "Fornecedor" -#: lib/app.php:188 +#: lib/app.php:257 msgid "Holidays" -msgstr "" +msgstr "Férias" -#: lib/app.php:189 +#: lib/app.php:258 msgid "Ideas" -msgstr "" +msgstr "Ideias" -#: lib/app.php:190 +#: lib/app.php:259 msgid "Journey" -msgstr "" +msgstr "Viagem" -#: lib/app.php:191 +#: lib/app.php:260 msgid "Jubilee" -msgstr "" +msgstr "Jubileu" -#: lib/app.php:192 +#: lib/app.php:261 msgid "Meeting" -msgstr "" +msgstr "Encontro" -#: lib/app.php:193 -msgid "Other" -msgstr "" - -#: lib/app.php:194 +#: lib/app.php:263 msgid "Personal" -msgstr "" +msgstr "Pessoal" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" -msgstr "" +msgstr "Projectos" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" -msgstr "" +msgstr "Questões" #: lib/hooks.php:102 msgid "{name}'s Birthday" @@ -439,6 +484,14 @@ msgstr "Aniversário de {name}" msgid "Contact" msgstr "Contacto" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Adicionar Contacto" @@ -449,7 +502,7 @@ msgstr "Importar" #: templates/index.php:18 msgid "Settings" -msgstr "" +msgstr "Configurações" #: templates/index.php:18 templates/settings.php:9 msgid "Addressbooks" @@ -461,51 +514,51 @@ msgstr "Fechar" #: templates/index.php:37 msgid "Keyboard shortcuts" -msgstr "" +msgstr "Atalhos de teclado" #: templates/index.php:39 msgid "Navigation" -msgstr "" +msgstr "Navegação" #: templates/index.php:42 msgid "Next contact in list" -msgstr "" +msgstr "Próximo contacto na lista" #: templates/index.php:44 msgid "Previous contact in list" -msgstr "" +msgstr "Contacto anterior na lista" #: templates/index.php:46 msgid "Expand/collapse current addressbook" -msgstr "" +msgstr "Expandir/encolher o livro de endereços atual" #: templates/index.php:48 msgid "Next addressbook" -msgstr "" +msgstr "Próximo livro de endereços" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "" +msgstr "Livro de endereços anterior" #: templates/index.php:54 msgid "Actions" -msgstr "" +msgstr "Ações" #: templates/index.php:57 msgid "Refresh contacts list" -msgstr "" +msgstr "Recarregar lista de contactos" #: templates/index.php:59 msgid "Add new contact" -msgstr "" +msgstr "Adicionar novo contacto" #: templates/index.php:61 msgid "Add new addressbook" -msgstr "" +msgstr "Adicionar novo Livro de endereços" #: templates/index.php:63 msgid "Delete current contact" -msgstr "" +msgstr "Apagar o contacto atual" #: templates/part.contact.php:17 msgid "Drop photo to upload" @@ -535,13 +588,18 @@ msgstr "Formate personalizado, Nome curto, Nome completo, Reverso ou Reverso com msgid "Edit name details" msgstr "Editar detalhes do nome" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organização" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Apagar" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Alcunha" @@ -549,23 +607,23 @@ msgstr "Alcunha" msgid "Enter nickname" msgstr "Introduza alcunha" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" -msgstr "" +msgstr "Página web" #: templates/part.contact.php:44 msgid "http://www.somesite.com" -msgstr "" +msgstr "http://www.somesite.com" #: templates/part.contact.php:44 msgid "Go to web site" -msgstr "" +msgstr "Ir para página web" #: templates/part.contact.php:46 msgid "dd-mm-yyyy" msgstr "dd-mm-aaaa" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupos" @@ -577,63 +635,84 @@ msgstr "Separe os grupos usando virgulas" msgid "Edit groups" msgstr "Editar grupos" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferido" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Por favor indique um endereço de correio válido" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Introduza endereço de email" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Enviar correio para o endereço" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Eliminar o endereço de correio" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Insira o número de telefone" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Eliminar o número de telefone" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Mensageiro instantâneo" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Apagar mensageiro instantâneo (IM)" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Ver no mapa" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Editar os detalhes do endereço" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Insira notas aqui." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Adicionar campo" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefone" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Mensagens Instantâneas" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Morada" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Nota" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Transferir contacto" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Apagar contato" @@ -656,11 +735,11 @@ msgstr "Apartado" #: templates/part.edit_address_dialog.php:24 msgid "Street address" -msgstr "" +msgstr "Endereço da Rua" #: templates/part.edit_address_dialog.php:27 msgid "Street and number" -msgstr "" +msgstr "Rua e número" #: templates/part.edit_address_dialog.php:30 msgid "Extended" @@ -668,7 +747,7 @@ msgstr "Extendido" #: templates/part.edit_address_dialog.php:33 msgid "Apartment number etc." -msgstr "" +msgstr "Número de Apartamento, etc." #: templates/part.edit_address_dialog.php:36 #: templates/part.edit_address_dialog.php:39 @@ -681,7 +760,7 @@ msgstr "Região" #: templates/part.edit_address_dialog.php:45 msgid "E.g. state or province" -msgstr "" +msgstr "Por Ex. Estado ou província" #: templates/part.edit_address_dialog.php:48 msgid "Zipcode" @@ -689,7 +768,7 @@ msgstr "Código Postal" #: templates/part.edit_address_dialog.php:51 msgid "Postal code" -msgstr "" +msgstr "Código Postal" #: templates/part.edit_address_dialog.php:54 #: templates/part.edit_address_dialog.php:57 @@ -804,21 +883,17 @@ msgstr "Não tem contactos no seu livro de endereços." msgid "Add contact" msgstr "Adicionar contacto" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Configurar livros de endereços" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" -msgstr "" +msgstr "Selecionar Livros de contactos" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" -msgstr "" +msgstr "Introduzir nome" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" -msgstr "" +msgstr "Introduzir descrição" #: templates/settings.php:3 msgid "CardDAV syncing addresses" @@ -838,40 +913,44 @@ msgstr "iOS/OS X" #: templates/settings.php:20 msgid "Show CardDav link" -msgstr "" +msgstr "Mostrar ligação CardDAV" #: templates/settings.php:23 msgid "Show read-only VCF link" -msgstr "" +msgstr "Mostrar ligações VCF só de leitura" #: templates/settings.php:26 +msgid "Share" +msgstr "Partilhar" + +#: templates/settings.php:29 msgid "Download" msgstr "Transferir" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editar" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Novo livro de endereços" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" -msgstr "" +msgstr "Nome" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" -msgstr "" +msgstr "Descrição" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Guardar" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Cancelar" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." -msgstr "" +msgstr "Mais..." diff --git a/l10n/pt_PT/files.po b/l10n/pt_PT/files.po index 346dbc3139..d816aedc33 100644 --- a/l10n/pt_PT/files.po +++ b/l10n/pt_PT/files.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Helder Meneses , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 19:39+0000\n" +"Last-Translator: rlameiro \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,87 +54,83 @@ msgstr "Falhou a escrita no disco" msgid "Files" msgstr "Ficheiros" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Apagar" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "Já existe" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "substituir" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "cancelar" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "substituido" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "com" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "desfazer" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "apagado" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "a gerar o ficheiro ZIP, poderá demorar algum tempo." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Não é possivel fazer o upload do ficheiro devido a ser uma pasta ou ter 0 bytes" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Erro no upload" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Pendente" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "O upload foi cancelado." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "nome inválido, '/' não permitido." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Tamanho" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificado" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "pasta" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "pastas" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "ficheiro" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "ficheiros" diff --git a/l10n/pt_PT/files_sharing.po b/l10n/pt_PT/files_sharing.po index 50e951397c..3a92189327 100644 --- a/l10n/pt_PT/files_sharing.po +++ b/l10n/pt_PT/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/pt_PT/gallery.po b/l10n/pt_PT/gallery.po index 5a8f443a91..91c5cb1853 100644 --- a/l10n/pt_PT/gallery.po +++ b/l10n/pt_PT/gallery.po @@ -3,6 +3,7 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # , 2012. # Helder Meneses , 2012. # , 2012. @@ -10,88 +11,32 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Portuguese (Portugal) (http://www.transifex.net/projects/p/owncloud/language/pt_PT/)\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 19:50+0000\n" +"Last-Translator: rlameiro \n" +"Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_PT\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:37 +#: appinfo/app.php:42 msgid "Pictures" msgstr "Imagens" -#: js/album_cover.js:44 +#: js/pictures.js:12 msgid "Share gallery" -msgstr "" +msgstr "Partilhar a galeria" -#: js/album_cover.js:64 js/album_cover.js:100 js/album_cover.js:133 +#: js/pictures.js:32 msgid "Error: " -msgstr "" +msgstr "Erro: " -#: js/album_cover.js:64 js/album_cover.js:100 +#: js/pictures.js:32 msgid "Internal error" -msgstr "" +msgstr "Erro interno" -#: js/album_cover.js:114 -msgid "Scanning root" -msgstr "" - -#: js/album_cover.js:115 -msgid "Default order" -msgstr "" - -#: js/album_cover.js:116 -msgid "Ascending" -msgstr "" - -#: js/album_cover.js:116 -msgid "Descending" -msgstr "" - -#: js/album_cover.js:117 templates/index.php:19 -msgid "Settings" -msgstr "Definições" - -#: js/album_cover.js:122 -msgid "Scanning root cannot be empty" -msgstr "" - -#: js/album_cover.js:122 js/album_cover.js:133 -msgid "Error" -msgstr "" - -#: templates/index.php:16 -msgid "Rescan" -msgstr "Atualizar" - -#: templates/index.php:17 -msgid "Stop" -msgstr "Parar" - -#: templates/index.php:18 -msgid "Share" -msgstr "Partilhar" - -#: templates/view_album.php:19 -msgid "Back" -msgstr "Voltar" - -#: templates/view_album.php:36 -msgid "Remove confirmation" -msgstr "Remove confirmação" - -#: templates/view_album.php:37 -msgid "Do you want to remove album" -msgstr "Deseja remover o album" - -#: templates/view_album.php:40 -msgid "Change album name" -msgstr "Mudar o nome do album" - -#: templates/view_album.php:43 -msgid "New album name" -msgstr "Novo nome do album" +#: templates/index.php:27 +msgid "Slideshow" +msgstr "Slideshow" diff --git a/l10n/pt_PT/settings.po b/l10n/pt_PT/settings.po index db32bde84e..1cc82a6ea4 100644 --- a/l10n/pt_PT/settings.po +++ b/l10n/pt_PT/settings.po @@ -3,15 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. # Helder Meneses , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 19:46+0000\n" +"Last-Translator: rlameiro \n" "Language-Team: Portuguese (Portugal) (http://www.transifex.com/projects/p/owncloud/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,7 +22,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Incapaz de carregar a lista da App Store" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -41,7 +42,7 @@ msgstr "Pedido inválido" #: ajax/removeuser.php:13 ajax/setquota.php:18 ajax/togglegroups.php:18 msgid "Authentication error" -msgstr "" +msgstr "Erro de autenticação" #: ajax/setlanguage.php:18 msgid "Language changed" @@ -49,7 +50,7 @@ msgstr "Idioma alterado" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Erro" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -69,23 +70,23 @@ msgstr "__language_name__" #: templates/admin.php:14 msgid "Security Warning" -msgstr "" +msgstr "Aviso de Segurança" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "Executar uma tarefa com cada página carregada" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php está registado num serviço webcron" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "usar o serviço cron do sistema" #: templates/admin.php:39 msgid "Log" @@ -228,8 +229,8 @@ msgid "Other" msgstr "Outro" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "" +msgid "Group Admin" +msgstr "Grupo Administrador" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/ro/contacts.po b/l10n/ro/contacts.po index 0881e6a3b5..ab7e082bbe 100644 --- a/l10n/ro/contacts.po +++ b/l10n/ro/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "(Dez)activarea agendei a întâmpinat o eroare." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID-ul nu este stabilit" @@ -82,18 +82,18 @@ msgstr "Cel puțin unul din câmpurile adresei trebuie completat." msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informațiile cărții de vizită sunt incorecte. Te rog reîncarcă pagina." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Eroare la ștergerea proprietăților contactului." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID lipsă" @@ -114,10 +114,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Eroare la actualizarea proprietăților contactului." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Contacte" @@ -238,57 +234,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -301,7 +314,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -309,125 +322,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Nu se găsește în agendă." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Contactul nu a putut fi găsit." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresă" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizație" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Servicu" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Acasă" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Text" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Voce" - -#: lib/app.php:137 -msgid "Message" -msgstr "Mesaj" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Zi de naștere" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Text" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Voce" + +#: lib/app.php:205 +msgid "Message" +msgstr "Mesaj" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Zi de naștere" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -439,6 +483,14 @@ msgstr "Ziua de naștere a {name}" msgid "Contact" msgstr "Contact" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Adaugă contact" @@ -535,13 +587,18 @@ msgstr "" msgid "Edit name details" msgstr "Introdu detalii despre nume" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizație" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Șterge" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Pseudonim" @@ -549,7 +606,7 @@ msgstr "Pseudonim" msgid "Enter nickname" msgstr "Introdu pseudonim" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -565,7 +622,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "zz-ll-aaaa" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupuri" @@ -577,63 +634,84 @@ msgstr "Separă grupurile cu virgule" msgid "Edit groups" msgstr "Editează grupuri" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Preferat" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Te rog să specifici un e-mail corect" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Introdu adresa de e-mail" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Trimite mesaj la e-mail" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Șterge e-mail" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 +msgid "View on map" +msgstr "" + +#: templates/part.contact.php:110 +msgid "Edit address details" +msgstr "" + +#: templates/part.contact.php:116 +msgid "Add notes here." +msgstr "" + +#: templates/part.contact.php:124 msgid "Add field" msgstr "" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresă" + +#: templates/part.contact.php:133 msgid "Note" msgstr "" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Descarcă acest contact" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Șterge contact" @@ -804,19 +882,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -845,33 +919,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Descarcă" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Editează" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Agendă nouă" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Salvează" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Anulează" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/ro/files.po b/l10n/ro/files.po index d936c43c2c..e7d65b7a03 100644 --- a/l10n/ro/files.po +++ b/l10n/ro/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,11 +54,7 @@ msgstr "Eroare la scriere pe disc" msgid "Files" msgstr "Fișiere" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Șterge" @@ -82,59 +78,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Dimensiune" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Modificat" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/ro/files_sharing.po b/l10n/ro/files_sharing.po index 55de7e186d..ab93603538 100644 --- a/l10n/ro/files_sharing.po +++ b/l10n/ro/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1))\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/ro/settings.po b/l10n/ro/settings.po index 5b75657102..736ab30fa1 100644 --- a/l10n/ro/settings.po +++ b/l10n/ro/settings.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Romanian (http://www.transifex.com/projects/p/owncloud/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -230,7 +230,7 @@ msgid "Other" msgstr "Altele" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/ru/admin_dependencies_chk.po b/l10n/ru/admin_dependencies_chk.po index 1d16b4f757..fefbc12755 100644 --- a/l10n/ru/admin_dependencies_chk.po +++ b/l10n/ru/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 09:02+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "Модуль php-json необходим многим приложениям для внутренних связей" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "Модуль php-curl необходим для получения заголовка страницы при добавлении закладок" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "Модуль php-gd необходим для создания уменьшенной копии для предпросмотра ваших картинок." #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "Модуль php-ldap необходим для соединения с вашим ldap сервером" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "Модуль php-zip необходим для загрузки нескольких файлов за раз" #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "Модуль php-mb_multibyte необходим для корректного управления кодировками." #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "Модуль php-ctype необходим для проверки данных." #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "Модуль php-xml необходим для открытия файлов через webdav." #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "Директива allow_url_fopen в файле php.ini должна быть установлена в 1 для получения базы знаний с серверов OCS" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "Модуль php-pdo необходим для хранения данных ownСloud в базе данных." #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Статус зависимостей" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Используется:" diff --git a/l10n/ru/admin_migrate.po b/l10n/ru/admin_migrate.po index 9f8eb42ef7..c022979b52 100644 --- a/l10n/ru/admin_migrate.po +++ b/l10n/ru/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:51+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Экспортировать этот экземпляр ownCloud" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Будет создан сжатый файл, содержащий данные этого экземпляра owncloud.\n Выберите тип экспорта:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Экспорт" diff --git a/l10n/ru/bookmarks.po b/l10n/ru/bookmarks.po index 151205b731..96ffd483f1 100644 --- a/l10n/ru/bookmarks.po +++ b/l10n/ru/bookmarks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:17+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 13:15+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,11 +20,11 @@ msgstr "" #: appinfo/app.php:14 msgid "Bookmarks" -msgstr "" +msgstr "Закладки" #: bookmarksHelper.php:99 msgid "unnamed" -msgstr "" +msgstr "без имени" #: templates/bookmarklet.php:5 msgid "" @@ -33,28 +34,28 @@ msgstr "" #: templates/bookmarklet.php:7 msgid "Read later" -msgstr "" +msgstr "Прочитать позже" #: templates/list.php:13 msgid "Address" -msgstr "" +msgstr "Адрес" #: templates/list.php:14 msgid "Title" -msgstr "" +msgstr "Заголовок" #: templates/list.php:15 msgid "Tags" -msgstr "" +msgstr "Метки" #: templates/list.php:16 msgid "Save bookmark" -msgstr "" +msgstr "Сохранить закладки" #: templates/list.php:22 msgid "You have no bookmarks" -msgstr "" +msgstr "У вас нет закладок" #: templates/settings.php:11 msgid "Bookmarklet
    " -msgstr "" +msgstr "Букмарклет
    " diff --git a/l10n/ru/calendar.po b/l10n/ru/calendar.po index 33e20b02e3..64d5396094 100644 --- a/l10n/ru/calendar.po +++ b/l10n/ru/calendar.po @@ -6,15 +6,16 @@ # Denis , 2012. # , 2011, 2012. # Nick Remeslennikov , 2012. +# , 2012. # , 2011. # Victor Bravo <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 14:41+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -72,7 +73,7 @@ msgstr "Часовой пояс изменён" msgid "Invalid request" msgstr "Неверный запрос" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:41 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "Календарь" @@ -119,7 +120,7 @@ msgstr "Клиенты" #: lib/app.php:125 msgid "Deliverer" -msgstr "Доставщик" +msgstr "Посыльный" #: lib/app.php:126 msgid "Holidays" @@ -163,7 +164,7 @@ msgstr "Работа" #: lib/app.php:351 lib/app.php:361 msgid "by" -msgstr "" +msgstr "до свидания" #: lib/app.php:359 lib/app.php:399 msgid "unnamed" @@ -481,7 +482,7 @@ msgstr "Сегодня" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Параметры" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -494,15 +495,15 @@ msgstr "Ссылка для CalDav" #: templates/part.choosecalendar.php:31 msgid "Shared calendars" -msgstr "Общие календари" +msgstr "Опубликованные" #: templates/part.choosecalendar.php:48 msgid "No shared calendars" -msgstr "Нет общих календарей" +msgstr "Нет опубликованных календарей" #: templates/part.choosecalendar.rowfields.php:8 msgid "Share Calendar" -msgstr "Сделать календарь общим" +msgstr "Опубликовать" #: templates/part.choosecalendar.rowfields.php:14 msgid "Download" @@ -519,7 +520,7 @@ msgstr "Удалить" #: templates/part.choosecalendar.rowfields.shared.php:4 msgid "shared with you by" -msgstr "с вами поделился" +msgstr "опубликовал для вас" #: templates/part.editcalendar.php:9 msgid "New calendar" @@ -580,7 +581,7 @@ msgstr "Участники" #: templates/part.eventform.php:13 msgid "Share" -msgstr "Поделиться" +msgstr "Опубликовать" #: templates/part.eventform.php:21 msgid "Title of the Event" @@ -697,13 +698,13 @@ msgstr "Название нового календаря" #: templates/part.import.php:44 msgid "Take an available name!" -msgstr "" +msgstr "Возьмите разрешенное имя!" #: templates/part.import.php:45 msgid "" "A Calendar with this name already exists. If you continue anyhow, these " "calendars will be merged." -msgstr "" +msgstr "Календарь с таким именем уже существует. Если вы продолжите, одноименный календарь будет удален." #: templates/part.import.php:47 msgid "Import" @@ -735,7 +736,7 @@ msgstr "на" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Основные" #: templates/settings.php:15 msgid "Timezone" @@ -743,11 +744,11 @@ msgstr "Часовой пояс" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Автоматическое обновление временной зоны" #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "Формат времени" #: templates/settings.php:57 msgid "24h" @@ -759,23 +760,23 @@ msgstr "12ч" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "Начало недели" #: templates/settings.php:76 msgid "Cache" -msgstr "" +msgstr "Кэш" #: templates/settings.php:80 msgid "Clear cache for repeating events" -msgstr "" +msgstr "Очистить кэш повторяющихся событий" #: templates/settings.php:85 msgid "URLs" -msgstr "" +msgstr "URLs" #: templates/settings.php:87 msgid "Calendar CalDAV syncing addresses" -msgstr "" +msgstr "Адрес синхронизации CalDAV" #: templates/settings.php:87 msgid "more info" @@ -783,15 +784,15 @@ msgstr "подробнее" #: templates/settings.php:89 msgid "Primary address (Kontact et al)" -msgstr "" +msgstr "Основной адрес (Контакта)" #: templates/settings.php:91 msgid "iOS/OS X" -msgstr "" +msgstr "iOS/OS X" #: templates/settings.php:93 msgid "Read only iCalendar link(s)" -msgstr "" +msgstr "Читать только ссылки iCalendar" #: templates/share.dropdown.php:20 msgid "Users" diff --git a/l10n/ru/contacts.po b/l10n/ru/contacts.po index 4c7214c485..4476c9a4e1 100644 --- a/l10n/ru/contacts.po +++ b/l10n/ru/contacts.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 13:10+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -29,7 +29,7 @@ msgid "Error (de)activating addressbook." msgstr "Ошибка (де)активации адресной книги." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id не установлен." @@ -72,7 +72,7 @@ msgstr "имя элемента не установлено." #: ajax/contact/addproperty.php:46 msgid "Could not parse contact: " -msgstr "" +msgstr "Невозможно распознать контакт:" #: ajax/contact/addproperty.php:56 msgid "Cannot add empty property." @@ -86,18 +86,18 @@ msgstr "Как минимум одно поле адреса должно быт msgid "Trying to add duplicate property: " msgstr "При попытке добавить дубликат:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Отсутствует параметр IM." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Неизвестный IM:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Информация о vCard некорректна. Пожалуйста, обновите страницу." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Ошибка удаления информации из контакта." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Отсутствует ID" @@ -118,10 +118,6 @@ msgstr "Информация о vCard не корректна. Перезагр msgid "Something went FUBAR. " msgstr "Что-то пошло FUBAR." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Ошибка обновления информации контакта." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -225,7 +221,7 @@ msgstr "Не удалось загрузить временное изображ msgid "No file was uploaded. Unknown error" msgstr "Файл не был загружен. Неизвестная ошибка" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Контакты" @@ -242,56 +238,73 @@ msgid "Couldn't get a valid address." msgstr "Не удалось получить адрес." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Ошибка" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "У вас нет разрешений добавлять контакты в" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Выберите одну из ваших собственных адресных книг." + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Ошибка доступа" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Это свойство должно быть не пустым." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Не удалось сериализовать элементы." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' called without type argument. Please report at bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Изменить имя" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Нет выбранных файлов для загрузки." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Файл, который вы пытаетесь загрузить превышать максимальный размер загружаемых файлов на этом сервере." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Ошибка загрузки изображения профиля." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Выберите тип" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "" +msgstr "Некоторые контакты помечены на удаление, но ещё не удалены. Подождите, пока они удаляются." + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Вы хотите соединить эти адресные книги?" #: js/loader.js:49 msgid "Result: " @@ -305,135 +318,166 @@ msgstr "импортировано, " msgid " failed." msgstr "не удалось." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Отображаемое имя не может быть пустым." #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "" +msgstr "Адресная книга не найдена:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Это не ваша адресная книга." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Контакт не найден." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Адрес" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Телефон" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Ящик эл. почты" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Организация" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Рабочий" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Домашний" -#: lib/app.php:133 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 +msgid "Other" +msgstr "Другое" + +#: lib/app.php:201 msgid "Mobile" msgstr "Мобильный" -#: lib/app.php:135 +#: lib/app.php:203 msgid "Text" msgstr "Текст" -#: lib/app.php:136 +#: lib/app.php:204 msgid "Voice" msgstr "Голос" -#: lib/app.php:137 +#: lib/app.php:205 msgid "Message" msgstr "Сообщение" -#: lib/app.php:138 +#: lib/app.php:206 msgid "Fax" msgstr "Факс" -#: lib/app.php:139 +#: lib/app.php:207 msgid "Video" msgstr "Видео" -#: lib/app.php:140 +#: lib/app.php:208 msgid "Pager" msgstr "Пейджер" -#: lib/app.php:146 +#: lib/app.php:215 msgid "Internet" msgstr "Интернет" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 msgid "Birthday" msgstr "День рождения" -#: lib/app.php:184 +#: lib/app.php:253 msgid "Business" -msgstr "" +msgstr "Бизнес" -#: lib/app.php:185 +#: lib/app.php:254 msgid "Call" -msgstr "" +msgstr "Вызов" -#: lib/app.php:186 +#: lib/app.php:255 msgid "Clients" -msgstr "" +msgstr "Клиенты" -#: lib/app.php:187 +#: lib/app.php:256 msgid "Deliverer" -msgstr "" +msgstr "Посыльный" -#: lib/app.php:188 +#: lib/app.php:257 msgid "Holidays" -msgstr "" +msgstr "Праздники" -#: lib/app.php:189 +#: lib/app.php:258 msgid "Ideas" -msgstr "" +msgstr "Идеи" -#: lib/app.php:190 +#: lib/app.php:259 msgid "Journey" -msgstr "" +msgstr "Поездка" -#: lib/app.php:191 +#: lib/app.php:260 msgid "Jubilee" -msgstr "" +msgstr "Юбилей" -#: lib/app.php:192 +#: lib/app.php:261 msgid "Meeting" -msgstr "" +msgstr "Встреча" -#: lib/app.php:193 -msgid "Other" -msgstr "" - -#: lib/app.php:194 +#: lib/app.php:263 msgid "Personal" -msgstr "" +msgstr "Личный" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" -msgstr "" +msgstr "Проекты" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" -msgstr "" +msgstr "Вопросы" #: lib/hooks.php:102 msgid "{name}'s Birthday" @@ -443,6 +487,14 @@ msgstr "День рождения {name}" msgid "Contact" msgstr "Контакт" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "У вас нет разрешений редактировать этот контакт." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "У вас нет разрешений удалять этот контакт." + #: templates/index.php:14 msgid "Add Contact" msgstr "Добавить Контакт" @@ -453,7 +505,7 @@ msgstr "Импорт" #: templates/index.php:18 msgid "Settings" -msgstr "" +msgstr "Настройки" #: templates/index.php:18 templates/settings.php:9 msgid "Addressbooks" @@ -465,51 +517,51 @@ msgstr "Закрыть" #: templates/index.php:37 msgid "Keyboard shortcuts" -msgstr "" +msgstr "Горячие клавиши" #: templates/index.php:39 msgid "Navigation" -msgstr "" +msgstr "Навигация" #: templates/index.php:42 msgid "Next contact in list" -msgstr "" +msgstr "Следующий контакт в списке" #: templates/index.php:44 msgid "Previous contact in list" -msgstr "" +msgstr "Предыдущий контакт в списке" #: templates/index.php:46 msgid "Expand/collapse current addressbook" -msgstr "" +msgstr "Развернуть/свернуть текущую адресную книгу" #: templates/index.php:48 msgid "Next addressbook" -msgstr "" +msgstr "Следующая адресная книга" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "" +msgstr "Предыдущая адресная книга" #: templates/index.php:54 msgid "Actions" -msgstr "" +msgstr "Действия" #: templates/index.php:57 msgid "Refresh contacts list" -msgstr "" +msgstr "Обновить список контактов" #: templates/index.php:59 msgid "Add new contact" -msgstr "" +msgstr "Добавить новый контакт" #: templates/index.php:61 msgid "Add new addressbook" -msgstr "" +msgstr "Добавить новую адресную книгу" #: templates/index.php:63 msgid "Delete current contact" -msgstr "" +msgstr "Удалить текущий контакт" #: templates/part.contact.php:17 msgid "Drop photo to upload" @@ -539,13 +591,18 @@ msgstr "Формат Краткое имя, Полное имя" msgid "Edit name details" msgstr "Изменить детали имени" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Организация" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Удалить" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Псевдоним" @@ -553,23 +610,23 @@ msgstr "Псевдоним" msgid "Enter nickname" msgstr "Введите псевдоним" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" -msgstr "" +msgstr "Веб-сайт" #: templates/part.contact.php:44 msgid "http://www.somesite.com" -msgstr "" +msgstr "http://www.somesite.com" #: templates/part.contact.php:44 msgid "Go to web site" -msgstr "" +msgstr "Перейти на веб-сайт" #: templates/part.contact.php:46 msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Группы" @@ -581,63 +638,84 @@ msgstr "Разделить группы запятыми" msgid "Edit groups" msgstr "Редактировать группы" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Предпочитаемый" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Укажите действительный адрес электронной почты." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Укажите адрес электронной почты" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Написать по адресу" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Удалить адрес электронной почты" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Ввести номер телефона" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Удалить номер телефона" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Удалить IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Показать на карте" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Ввести детали адреса" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Добавьте заметки здесь." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Добавить поле" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Телефон" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Ящик эл. почты" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Быстрые сообщения" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Адрес" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Заметка" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Скачать контакт" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Удалить контакт" @@ -660,11 +738,11 @@ msgstr "АО" #: templates/part.edit_address_dialog.php:24 msgid "Street address" -msgstr "" +msgstr "Улица" #: templates/part.edit_address_dialog.php:27 msgid "Street and number" -msgstr "" +msgstr "Улица и дом" #: templates/part.edit_address_dialog.php:30 msgid "Extended" @@ -672,7 +750,7 @@ msgstr "Расширенный" #: templates/part.edit_address_dialog.php:33 msgid "Apartment number etc." -msgstr "" +msgstr "Номер квартиры и т.д." #: templates/part.edit_address_dialog.php:36 #: templates/part.edit_address_dialog.php:39 @@ -685,7 +763,7 @@ msgstr "Область" #: templates/part.edit_address_dialog.php:45 msgid "E.g. state or province" -msgstr "" +msgstr "Например, область или район" #: templates/part.edit_address_dialog.php:48 msgid "Zipcode" @@ -693,7 +771,7 @@ msgstr "Почтовый индекс" #: templates/part.edit_address_dialog.php:51 msgid "Postal code" -msgstr "" +msgstr "Почтовый индекс" #: templates/part.edit_address_dialog.php:54 #: templates/part.edit_address_dialog.php:57 @@ -808,21 +886,17 @@ msgstr "В адресной книге нет контактов." msgid "Add contact" msgstr "Добавить контакт" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Настроить адресную книгу" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" -msgstr "" +msgstr "Выбрать адресную книгу" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" -msgstr "" +msgstr "Введите имя" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" -msgstr "" +msgstr "Ввдите описание" #: templates/settings.php:3 msgid "CardDAV syncing addresses" @@ -842,40 +916,44 @@ msgstr "iOS/OS X" #: templates/settings.php:20 msgid "Show CardDav link" -msgstr "" +msgstr "Показать ссылку CardDav" #: templates/settings.php:23 msgid "Show read-only VCF link" -msgstr "" +msgstr "Показать нередактируемую ссылку VCF" #: templates/settings.php:26 +msgid "Share" +msgstr "Опубликовать" + +#: templates/settings.php:29 msgid "Download" msgstr "Скачать" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Редактировать" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Новая адресная книга" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" -msgstr "" +msgstr "Имя" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" -msgstr "" +msgstr "Описание" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Сохранить" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Отменить" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." -msgstr "" +msgstr "Ещё..." diff --git a/l10n/ru/files.po b/l10n/ru/files.po index 96d5af69cd..624859e9c9 100644 --- a/l10n/ru/files.po +++ b/l10n/ru/files.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 13:06+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -57,87 +57,83 @@ msgstr "Ошибка записи на диск" msgid "Files" msgstr "Файлы" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Снять общий доступ" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:111 templates/index.php:56 msgid "Delete" msgstr "Удалить" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "уже существует" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "заменить" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "отмена" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "заменён" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "с" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "отмена" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "удален" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "создание ZIP-файла, это может занять некоторое время." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Не удается загрузить файл размером 0 байт в каталог" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Ошибка загрузки" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Ожидание" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Загрузка отменена." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Неверное имя, '/' не допускается." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Размер" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" -msgstr "Изменен" +msgstr "Изменён" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "папка" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "папки" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "файл" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "файлы" @@ -147,7 +143,7 @@ msgstr "Управление файлами" #: templates/admin.php:7 msgid "Maximum upload size" -msgstr "Максимальный размер файла" +msgstr "Максимальный размер загружаемого файла" #: templates/admin.php:7 msgid "max. possible: " @@ -155,11 +151,11 @@ msgstr "макс. возможно: " #: templates/admin.php:9 msgid "Needed for multi-file and folder downloads." -msgstr "Требуется для загрузки нескольких файорв и папок" +msgstr "Требуется для скачивания нескольких файлов и папок" #: templates/admin.php:9 msgid "Enable ZIP-download" -msgstr "Включить ZIP-загрузку" +msgstr "Включить ZIP-скачивание" #: templates/admin.php:11 msgid "0 is unlimited" @@ -187,15 +183,15 @@ msgstr "С url" #: templates/index.php:21 msgid "Upload" -msgstr "Закачать" +msgstr "Загрузить" #: templates/index.php:27 msgid "Cancel upload" -msgstr "Отмена закачки" +msgstr "Отмена загрузки" #: templates/index.php:39 msgid "Nothing in here. Upload something!" -msgstr "Здесь ничего нет. Закачайте что-нибудь!" +msgstr "Здесь ничего нет. Загрузите что-нибудь!" #: templates/index.php:47 msgid "Name" @@ -203,7 +199,7 @@ msgstr "Название" #: templates/index.php:49 msgid "Share" -msgstr "Поделиться" +msgstr "Опубликовать" #: templates/index.php:51 msgid "Download" @@ -217,7 +213,7 @@ msgstr "Файл слишком большой" msgid "" "The files you are trying to upload exceed the maximum size for file uploads " "on this server." -msgstr "Файлы, которые Вы пытаетесь закачать, превышают лимит для файлов на этом сервере." +msgstr "Файлы, которые Вы пытаетесь загрузить, превышают лимит для файлов на этом сервере." #: templates/index.php:71 msgid "Files are being scanned, please wait." diff --git a/l10n/ru/files_encryption.po b/l10n/ru/files_encryption.po index 51c8bc94cc..5ae5f48522 100644 --- a/l10n/ru/files_encryption.po +++ b/l10n/ru/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:47+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Шифрование" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Исключить шифрование следующих типов файлов" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Ничего" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Включить шифрование" diff --git a/l10n/ru/files_external.po b/l10n/ru/files_external.po index 72084a423c..7e2f7fe861 100644 --- a/l10n/ru/files_external.po +++ b/l10n/ru/files_external.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:34+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:35+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,64 +20,64 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Внешний носитель" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "Точка монтирования" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "Подсистема" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Конфигурация" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Опции" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "Применимый" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Добавить точку монтирования" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "Не установлено" #: templates/settings.php:63 msgid "All Users" -msgstr "" +msgstr "Все пользователи" #: templates/settings.php:64 msgid "Groups" -msgstr "" +msgstr "Группы" #: templates/settings.php:69 msgid "Users" -msgstr "" +msgstr "Пользователи" #: templates/settings.php:77 templates/settings.php:96 msgid "Delete" -msgstr "" +msgstr "Удалить" #: templates/settings.php:88 msgid "SSL root certificates" -msgstr "" +msgstr "Корневые сертификаты SSL" #: templates/settings.php:102 msgid "Import Root Certificate" -msgstr "" +msgstr "Импортировать корневые сертификаты" #: templates/settings.php:108 msgid "Enable User External Storage" -msgstr "" +msgstr "Включить пользовательские внешние носители" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "Разрешить пользователям монтировать их собственные внешние носители" diff --git a/l10n/ru/files_sharing.po b/l10n/ru/files_sharing.po index 1c0dc27e38..39aaa41151 100644 --- a/l10n/ru/files_sharing.po +++ b/l10n/ru/files_sharing.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:48+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +18,18 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "" +#: templates/get.php:4 +msgid "Size" +msgstr "Размер" -#: templates/list.php:6 -msgid "Item" -msgstr "" +#: templates/get.php:5 +msgid "Modified" +msgstr "Изменён" -#: templates/list.php:7 -msgid "Shared With" -msgstr "" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Удалить все" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" -msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" +msgstr "Удалить" diff --git a/l10n/ru/files_versions.po b/l10n/ru/files_versions.po index f9d067172c..466c1629db 100644 --- a/l10n/ru/files_versions.po +++ b/l10n/ru/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:24+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Просрочить все версии" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Включить ведение версий файлов" diff --git a/l10n/ru/gallery.po b/l10n/ru/gallery.po index 34a7474dd4..c80be67674 100644 --- a/l10n/ru/gallery.po +++ b/l10n/ru/gallery.po @@ -7,92 +7,37 @@ # , 2012. # , 2012. # Soul Kim , 2012. +# Victor Bravo <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Russian (http://www.transifex.net/projects/p/owncloud/language/ru/)\n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 17:08+0000\n" +"Last-Translator: Denis \n" +"Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: appinfo/app.php:37 +#: appinfo/app.php:42 msgid "Pictures" msgstr "Рисунки" -#: js/album_cover.js:44 +#: js/pictures.js:12 msgid "Share gallery" -msgstr "" +msgstr "Опубликовать" -#: js/album_cover.js:64 js/album_cover.js:100 js/album_cover.js:133 +#: js/pictures.js:32 msgid "Error: " -msgstr "" +msgstr "Ошибка" -#: js/album_cover.js:64 js/album_cover.js:100 +#: js/pictures.js:32 msgid "Internal error" -msgstr "" +msgstr "Внутренняя ошибка" -#: js/album_cover.js:114 -msgid "Scanning root" -msgstr "" - -#: js/album_cover.js:115 -msgid "Default order" -msgstr "" - -#: js/album_cover.js:116 -msgid "Ascending" -msgstr "" - -#: js/album_cover.js:116 -msgid "Descending" -msgstr "" - -#: js/album_cover.js:117 templates/index.php:19 -msgid "Settings" -msgstr "Настройки" - -#: js/album_cover.js:122 -msgid "Scanning root cannot be empty" -msgstr "" - -#: js/album_cover.js:122 js/album_cover.js:133 -msgid "Error" -msgstr "" - -#: templates/index.php:16 -msgid "Rescan" -msgstr "Обновить" - -#: templates/index.php:17 -msgid "Stop" -msgstr "Остановить" - -#: templates/index.php:18 -msgid "Share" -msgstr "Поделиться" - -#: templates/view_album.php:19 -msgid "Back" -msgstr "Назад" - -#: templates/view_album.php:36 -msgid "Remove confirmation" -msgstr "Подтверждение удаления" - -#: templates/view_album.php:37 -msgid "Do you want to remove album" -msgstr "Вы хотите удалить альбом?" - -#: templates/view_album.php:40 -msgid "Change album name" -msgstr "Изменить имя альбома" - -#: templates/view_album.php:43 -msgid "New album name" -msgstr "Новое имя альбома" +#: templates/index.php:27 +msgid "Slideshow" +msgstr "Слайдшоу" diff --git a/l10n/ru/lib.po b/l10n/ru/lib.po index 97723dd617..8c24f83b94 100644 --- a/l10n/ru/lib.po +++ b/l10n/ru/lib.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:23+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 09:37+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,96 +18,96 @@ msgstr "" "Language: ru\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: app.php:287 +#: app.php:288 msgid "Help" -msgstr "" +msgstr "Помощь" -#: app.php:294 +#: app.php:295 msgid "Personal" -msgstr "" +msgstr "Личное" -#: app.php:299 +#: app.php:300 msgid "Settings" -msgstr "" +msgstr "Настройки" -#: app.php:304 +#: app.php:305 msgid "Users" -msgstr "" +msgstr "Пользователи" -#: app.php:311 +#: app.php:312 msgid "Apps" -msgstr "" +msgstr "Приложения" -#: app.php:313 +#: app.php:314 msgid "Admin" -msgstr "" +msgstr "Admin" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." -msgstr "" +msgstr "ZIP-скачивание отключено." -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." -msgstr "" +msgstr "Файлы должны быть загружены по одному." -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" -msgstr "" +msgstr "Назад к файлам" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." -msgstr "" +msgstr "Выбранные файлы слишком велики, чтобы создать zip файл." #: json.php:28 msgid "Application is not enabled" -msgstr "" +msgstr "Приложение не разрешено" #: json.php:39 json.php:63 json.php:75 msgid "Authentication error" -msgstr "" +msgstr "Ошибка аутентификации" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "" +msgstr "Токен просрочен. Перезагрузите страницу." #: template.php:86 msgid "seconds ago" -msgstr "" +msgstr "менее минуты" #: template.php:87 msgid "1 minute ago" -msgstr "" +msgstr "1 минуту назад" #: template.php:88 #, php-format msgid "%d minutes ago" -msgstr "" +msgstr "%d минут назад" #: template.php:91 msgid "today" -msgstr "" +msgstr "сегодня" #: template.php:92 msgid "yesterday" -msgstr "" +msgstr "вчера" #: template.php:93 #, php-format msgid "%d days ago" -msgstr "" +msgstr "%d дней назад" #: template.php:94 msgid "last month" -msgstr "" +msgstr "в прошлом месяце" #: template.php:95 msgid "months ago" -msgstr "" +msgstr "месяцы назад" #: template.php:96 msgid "last year" -msgstr "" +msgstr "в прошлом году" #: template.php:97 msgid "years ago" -msgstr "" +msgstr "годы назад" diff --git a/l10n/ru/settings.po b/l10n/ru/settings.po index 8097464189..8dfb19bb77 100644 --- a/l10n/ru/settings.po +++ b/l10n/ru/settings.po @@ -8,15 +8,16 @@ # , 2012. # , 2012. # Nick Remeslennikov , 2012. +# , 2012. # , 2011. # Victor Bravo <>, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 11:59+0000\n" +"Last-Translator: rasperepodvipodvert \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -26,7 +27,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "Загрузка из App Store запрещена" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -54,7 +55,7 @@ msgstr "Язык изменён" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "Ошибка" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -78,19 +79,19 @@ msgstr "Предупреждение безопасности" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Задание" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "Запускать задание при загрузке каждой страницы" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php зарегистрирован в webcron сервисе" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "использовать системные задания" #: templates/admin.php:39 msgid "Log" @@ -233,8 +234,8 @@ msgid "Other" msgstr "Другое" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "" +msgid "Group Admin" +msgstr "Группа Администраторы" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/ru/tasks.po b/l10n/ru/tasks.po index 202e76b9a5..d7a46fb6a8 100644 --- a/l10n/ru/tasks.po +++ b/l10n/ru/tasks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:44+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:18+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,88 +20,88 @@ msgstr "" #: ajax/update_property.php:51 lib/app.php:89 lib/app.php:101 msgid "Invalid date/time" -msgstr "" +msgstr "Неверные дата/время" #: appinfo/app.php:11 msgid "Tasks" -msgstr "" +msgstr "Задачи" #: js/tasks.js:415 msgid "No category" -msgstr "" +msgstr "Нет категории" #: lib/app.php:33 msgid "Unspecified" -msgstr "" +msgstr "Не указан" #: lib/app.php:34 msgid "1=highest" -msgstr "" +msgstr "1=наибольший" #: lib/app.php:38 msgid "5=medium" -msgstr "" +msgstr "5=средний" #: lib/app.php:42 msgid "9=lowest" -msgstr "" +msgstr "9=наименьший" #: lib/app.php:81 msgid "Empty Summary" -msgstr "" +msgstr "Пустая сводка" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Неверный процент завершения" #: lib/app.php:107 msgid "Invalid priority" -msgstr "" +msgstr "Неверный приоритет" #: templates/tasks.php:3 msgid "Add Task" -msgstr "" +msgstr "Добавить задачу" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Срок заказа" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Order List" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Заказ выполнен" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Местонахождение заказа" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Приоритет заказа" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Метка заказа" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Загрузка задач..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Важный" #: templates/tasks.php:23 msgid "More" -msgstr "" +msgstr "Больше" #: templates/tasks.php:26 msgid "Less" -msgstr "" +msgstr "Меньше" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Удалить" diff --git a/l10n/ru/user_ldap.po b/l10n/ru/user_ldap.po index 01320218dc..bb1f2d6239 100644 --- a/l10n/ru/user_ldap.po +++ b/l10n/ru/user_ldap.po @@ -3,13 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# <4671992@gmail.com>, 2012. +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 15:13+0000\n" +"Last-Translator: wpns <4671992@gmail.com>\n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,75 +21,75 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "Сервер" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "Можно опустить протокол, за исключением того, когда вам требуется SSL. Тогда начните с ldaps :/ /" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Базовый DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "Вы можете задать Base DN для пользователей и групп на вкладке \"Расширенное\"" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "DN пользователя" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "DN-клиента пользователя, с которым связывают должно быть заполнено, например, uid=агент, dc=пример, dc=com. Для анонимного доступа, оставьте DN и пароль пустыми." #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Пароль" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "Для анонимного доступа оставьте DN и пароль пустыми." #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "Фильтр входа пользователей" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "Определяет фильтр для применения при попытке входа. %%uid заменяет имя пользователя при входе в систему." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "используйте заполнитель %%uid, например: \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "Фильтр списка пользователей" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "Определяет фильтр для применения при получении пользователей." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "без заполнителя, например: \"objectClass=person\"." #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "Фильтр группы" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "Определяет фильтр для применения при получении группы." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." @@ -95,7 +97,7 @@ msgstr "" #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Порт" #: templates/settings.php:18 msgid "Base User Tree" @@ -111,11 +113,11 @@ msgstr "" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Использовать TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "Не используйте для соединений SSL" #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" @@ -123,7 +125,7 @@ msgstr "" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "Отключить проверку сертификата SSL." #: templates/settings.php:23 msgid "" @@ -133,7 +135,7 @@ msgstr "" #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Не рекомендуется, используйте только для тестирования." #: templates/settings.php:24 msgid "User Display Name Field" @@ -153,12 +155,12 @@ msgstr "" #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "в байтах" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "в секундах. Изменение очистит кэш." #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Помощь" diff --git a/l10n/ru/user_migrate.po b/l10n/ru/user_migrate.po index bf0f6d4c8b..79fd4f0cfa 100644 --- a/l10n/ru/user_migrate.po +++ b/l10n/ru/user_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:55+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,33 +20,33 @@ msgstr "" #: js/export.js:14 js/export.js:20 msgid "Export" -msgstr "" +msgstr "Экспорт" #: js/export.js:19 msgid "Something went wrong while the export file was being generated" -msgstr "" +msgstr "В процессе создания файла экспорта что-то пошло не так" #: js/export.js:19 msgid "An error has occurred" -msgstr "" +msgstr "Произошла ошибка" #: templates/settings.php:2 msgid "Export your user account" -msgstr "" +msgstr "Экспортировать ваш аккаунт пользователя" #: templates/settings.php:3 msgid "" "This will create a compressed file that contains your ownCloud account." -msgstr "" +msgstr "Будет создан сжатый файл, содержащий ваш аккаунт ownCloud" #: templates/settings.php:13 msgid "Import user account" -msgstr "" +msgstr "Импортировать аккаунт пользователя" #: templates/settings.php:15 msgid "ownCloud User Zip" -msgstr "" +msgstr "Архив пользователя ownCloud" #: templates/settings.php:17 msgid "Import" -msgstr "" +msgstr "Импорт" diff --git a/l10n/ru/user_openid.po b/l10n/ru/user_openid.po index 354e17e01d..22feb4f291 100644 --- a/l10n/ru/user_openid.po +++ b/l10n/ru/user_openid.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Denis , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:00+0000\n" +"Last-Translator: Denis \n" "Language-Team: Russian (http://www.transifex.com/projects/p/owncloud/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,36 +20,36 @@ msgstr "" #: templates/nomode.php:12 msgid "This is an OpenID server endpoint. For more information, see " -msgstr "" +msgstr "Это точка подключения сервера OpenID. Для информации смотрите" #: templates/nomode.php:14 msgid "Identity: " -msgstr "" +msgstr "Личность: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Realm: " #: templates/nomode.php:16 msgid "User: " -msgstr "" +msgstr "Пользователь: " #: templates/nomode.php:17 msgid "Login" -msgstr "" +msgstr "Логин" #: templates/nomode.php:22 msgid "Error: No user Selected" -msgstr "" +msgstr "Ошибка: Пользователь не выбран" #: templates/settings.php:4 msgid "you can authenticate to other sites with this address" -msgstr "" +msgstr "вы можете аутентифицироваться на других сайтах с этим адресом" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "" +msgstr "Авторизованный провайдер OpenID" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "" +msgstr "Ваш адрес в Wordpress, Identi.ca, …" diff --git a/l10n/sk_SK/contacts.po b/l10n/sk_SK/contacts.po index ef45c76a92..d66125ae02 100644 --- a/l10n/sk_SK/contacts.po +++ b/l10n/sk_SK/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "Chyba (de)aktivácie adresára." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID nie je nastavené." @@ -82,18 +82,18 @@ msgstr "Musí byť uvedený aspoň jeden adresný údaj." msgid "Trying to add duplicate property: " msgstr "Pokúšate sa pridať rovnaký atribút:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informácie o vCard sú neplatné. Prosím obnovte stránku." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Chyba odstránenia údaju kontaktu." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Chýba ID" @@ -114,10 +114,6 @@ msgstr "Informácia o vCard je nesprávna. Obnovte stránku, prosím." msgid "Something went FUBAR. " msgstr "Niečo sa pokazilo." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Chyba aktualizovania údaju kontaktu." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "Nemôžem načítať dočasný obrázok: " msgid "No file was uploaded. Unknown error" msgstr "Žiaden súbor nebol odoslaný. Neznáma chyba" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kontakty" @@ -238,57 +234,74 @@ msgid "Couldn't get a valid address." msgstr "Nemôžem získať platnú adresu." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Chyba" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Tento parameter nemôže byť prázdny." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Nemôžem previesť prvky." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' zavolané bez argument. Prosím oznámte chybu na bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Upraviť meno" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Žiadne súbory neboli vybrané k nahratiu" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Súbor, ktorý sa pokúšate nahrať, presahuje maximálnu povolenú veľkosť." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Vybrať typ" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Výsledok: " @@ -301,7 +314,7 @@ msgstr " importovaných, " msgid " failed." msgstr " zlyhaných." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -309,125 +322,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Toto nie je váš adresár." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakt nebol nájdený." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresa" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefón" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizácia" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Práca" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Domov" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "SMS" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Odkazová schránka" - -#: lib/app.php:137 -msgid "Message" -msgstr "Správa" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pager" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Narodeniny" - -#: lib/app.php:184 -msgid "Business" -msgstr "Biznis" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Klienti" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Prázdniny" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Stretnutie" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Iné" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "SMS" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Odkazová schránka" + +#: lib/app.php:205 +msgid "Message" +msgstr "Správa" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pager" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Narodeniny" + +#: lib/app.php:253 +msgid "Business" +msgstr "Biznis" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Klienti" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Prázdniny" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Stretnutie" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projekty" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Otázky" @@ -439,6 +483,14 @@ msgstr "Narodeniny {name}" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Pridať Kontakt." @@ -535,13 +587,18 @@ msgstr "Formát vlastný, krátke meno, celé meno, obrátené alebo obrátené msgid "Edit name details" msgstr "Upraviť podrobnosti mena" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizácia" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Odstrániť" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Prezývka" @@ -549,7 +606,7 @@ msgstr "Prezývka" msgid "Enter nickname" msgstr "Zadajte prezývku" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -565,7 +622,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd. mm. yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Skupiny" @@ -577,63 +634,84 @@ msgstr "Oddelte skupiny čiarkami" msgid "Edit groups" msgstr "Úprava skupín" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Uprednostňované" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Prosím zadajte platnú e-mailovú adresu." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Zadajte e-mailové adresy" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Odoslať na adresu" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Odstrániť e-mailové adresy" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Zadajte telefónne číslo" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Odstrániť telefónne číslo" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Zobraziť na mape" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Upraviť podrobnosti adresy" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Tu môžete pridať poznámky." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Pridať pole" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefón" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresa" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Poznámka" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Stiahnuť kontakt" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Odstrániť kontakt" @@ -804,19 +882,15 @@ msgstr "Nemáte žiadne kontakty v adresári." msgid "Add contact" msgstr "Pridať kontakt" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Nastaviť adresáre" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Zadaj meno" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -845,33 +919,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Stiahnuť" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Upraviť" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nový adresár" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Uložiť" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Zrušiť" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/sk_SK/files.po b/l10n/sk_SK/files.po index dbbe973d3f..cadb54078e 100644 --- a/l10n/sk_SK/files.po +++ b/l10n/sk_SK/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "Zápis na disk sa nepodaril" msgid "Files" msgstr "Súbory" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Odstrániť" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "generujem ZIP-súbor, môže to chvíľu trvať." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nemôžem nahrať súbor lebo je to priečinok alebo má 0 bajtov." -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Chyba nahrávania" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Čaká sa" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Nahrávanie zrušené" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Chybný názov, \"/\" nie je povolené" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Veľkosť" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Upravené" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "priečinok" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "priečinky" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "súbor" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "súbory" diff --git a/l10n/sk_SK/files_sharing.po b/l10n/sk_SK/files_sharing.po index 30cc68b231..3a4f00533b 100644 --- a/l10n/sk_SK/files_sharing.po +++ b/l10n/sk_SK/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: sk_SK\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/sk_SK/settings.po b/l10n/sk_SK/settings.po index ed5268ef8b..8184b87355 100644 --- a/l10n/sk_SK/settings.po +++ b/l10n/sk_SK/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovak (Slovakia) (http://www.transifex.com/projects/p/owncloud/language/sk_SK/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -229,7 +229,7 @@ msgid "Other" msgstr "Iné" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/sl/admin_dependencies_chk.po b/l10n/sl/admin_dependencies_chk.po index 0dc3432799..f60a8e1d14 100644 --- a/l10n/sl/admin_dependencies_chk.po +++ b/l10n/sl/admin_dependencies_chk.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Peter Peroša , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-17 00:44+0200\n" +"PO-Revision-Date: 2012-08-16 20:55+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -21,53 +22,53 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "Modul php-json je potreben za medsebojno komunikacijo veliko aplikacij." #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "Modul php-curl je potreben za pridobivanje naslova strani pri dodajanju zaznamkov." #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "Modul php-gd je potreben za ustvarjanje sličic za predogled." #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "Modul php-ldap je potreben za povezavo z vašim ldap strežnikom." #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "Modul php-zip je potreben za prenašanje večih datotek hkrati." #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "Modul php-mb_multibyte je potreben za pravilno upravljanje kodiranja." #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "Modul php-ctype je potreben za preverjanje veljavnosti podatkov." #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "Modul php-xml je potreben za izmenjavo datotek preko protokola WebDAV." #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "Direktiva allow_url_fopen v vaši php.ini datoteki mora biti nastavljena na 1, če želite omogočiti dostop do zbirke znanja na strežnikih OCS." #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "Modul php-pdo je potreben za shranjevanje ownCloud podatkov v podatkovno zbirko." #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "Stanje odvisnosti" #: templates/settings.php:7 msgid "Used by :" -msgstr "" +msgstr "Uporablja:" diff --git a/l10n/sl/admin_migrate.po b/l10n/sl/admin_migrate.po index e4aec295fb..5a600890b7 100644 --- a/l10n/sl/admin_migrate.po +++ b/l10n/sl/admin_migrate.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Peter Peroša , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:32+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 00:17+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,14 +20,14 @@ msgstr "" #: templates/settings.php:3 msgid "Export this ownCloud instance" -msgstr "" +msgstr "Izvozi to ownCloud namestitev" #: templates/settings.php:4 msgid "" "This will create a compressed file that contains the data of this owncloud instance.\n" " Please choose the export type:" -msgstr "" +msgstr "Ustvarjena bo stisnjena datoteka s podatki te ownCloud namestitve.\n Prosimo, če izberete vrsto izvoza:" #: templates/settings.php:12 msgid "Export" -msgstr "" +msgstr "Izvozi" diff --git a/l10n/sl/calendar.po b/l10n/sl/calendar.po index b1792961b6..8d2ba48009 100644 --- a/l10n/sl/calendar.po +++ b/l10n/sl/calendar.po @@ -11,9 +11,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:02+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 13:25+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,11 +23,11 @@ msgstr "" #: ajax/cache/status.php:19 msgid "Not all calendars are completely cached" -msgstr "" +msgstr "Vsi koledarji niso povsem predpomnjeni" #: ajax/cache/status.php:21 msgid "Everything seems to be completely cached" -msgstr "" +msgstr "Izgleda, da je vse v predpomnilniku" #: ajax/categories/rescan.php:29 msgid "No calendars found." @@ -45,19 +45,19 @@ msgstr "Napačen koledar" msgid "" "The file contained either no events or all events are already saved in your " "calendar." -msgstr "" +msgstr "Datoteka ni vsebovala dogodkov ali pa so vsi dogodki že shranjeni v koledarju." #: ajax/import/dropimport.php:31 ajax/import/import.php:67 msgid "events has been saved in the new calendar" -msgstr "" +msgstr "dogodki so bili shranjeni v nov koledar" #: ajax/import/import.php:56 msgid "Import failed" -msgstr "" +msgstr "Uvoz je spodletel" #: ajax/import/import.php:69 msgid "events has been saved in your calendar" -msgstr "" +msgstr "dogodki so bili shranjeni v vaš koledar" #: ajax/settings/guesstimezone.php:25 msgid "New Timezone:" @@ -162,7 +162,7 @@ msgstr "Delo" #: lib/app.php:351 lib/app.php:361 msgid "by" -msgstr "" +msgstr "od" #: lib/app.php:359 lib/app.php:399 msgid "unnamed" @@ -351,79 +351,79 @@ msgstr "Kol." #: templates/calendar.php:6 msgid "Sun." -msgstr "" +msgstr "ned." #: templates/calendar.php:6 msgid "Mon." -msgstr "" +msgstr "pon." #: templates/calendar.php:6 msgid "Tue." -msgstr "" +msgstr "tor." #: templates/calendar.php:6 msgid "Wed." -msgstr "" +msgstr "sre." #: templates/calendar.php:6 msgid "Thu." -msgstr "" +msgstr "čet." #: templates/calendar.php:6 msgid "Fri." -msgstr "" +msgstr "pet." #: templates/calendar.php:6 msgid "Sat." -msgstr "" +msgstr "sob." #: templates/calendar.php:8 msgid "Jan." -msgstr "" +msgstr "jan." #: templates/calendar.php:8 msgid "Feb." -msgstr "" +msgstr "feb." #: templates/calendar.php:8 msgid "Mar." -msgstr "" +msgstr "mar." #: templates/calendar.php:8 msgid "Apr." -msgstr "" +msgstr "apr." #: templates/calendar.php:8 msgid "May." -msgstr "" +msgstr "maj" #: templates/calendar.php:8 msgid "Jun." -msgstr "" +msgstr "jun." #: templates/calendar.php:8 msgid "Jul." -msgstr "" +msgstr "jul." #: templates/calendar.php:8 msgid "Aug." -msgstr "" +msgstr "avg." #: templates/calendar.php:8 msgid "Sep." -msgstr "" +msgstr "sep." #: templates/calendar.php:8 msgid "Oct." -msgstr "" +msgstr "okt." #: templates/calendar.php:8 msgid "Nov." -msgstr "" +msgstr "nov." #: templates/calendar.php:8 msgid "Dec." -msgstr "" +msgstr "dec." #: templates/calendar.php:11 msgid "All day" @@ -480,7 +480,7 @@ msgstr "Danes" #: templates/calendar.php:46 templates/calendar.php:47 msgid "Settings" -msgstr "" +msgstr "Nastavitve" #: templates/part.choosecalendar.php:2 msgid "Your calendars" @@ -688,7 +688,7 @@ msgstr "Uvozi datoteko koledarja" #: templates/part.import.php:24 msgid "Please choose a calendar" -msgstr "" +msgstr "Prosimo, če izberete koledar" #: templates/part.import.php:36 msgid "Name of new calendar" @@ -696,13 +696,13 @@ msgstr "Ime novega koledarja" #: templates/part.import.php:44 msgid "Take an available name!" -msgstr "" +msgstr "Izberite prosto ime!" #: templates/part.import.php:45 msgid "" "A Calendar with this name already exists. If you continue anyhow, these " "calendars will be merged." -msgstr "" +msgstr "Koledar s tem imenom že obstaja. Če nadaljujete, bosta koledarja združena." #: templates/part.import.php:47 msgid "Import" @@ -734,7 +734,7 @@ msgstr "pri" #: templates/settings.php:10 msgid "General" -msgstr "" +msgstr "Splošno" #: templates/settings.php:15 msgid "Timezone" @@ -742,11 +742,11 @@ msgstr "Časovni pas" #: templates/settings.php:47 msgid "Update timezone automatically" -msgstr "" +msgstr "Samodejno posodobi časovni pas" #: templates/settings.php:52 msgid "Time format" -msgstr "" +msgstr "Oblika zapisa časa" #: templates/settings.php:57 msgid "24h" @@ -758,39 +758,39 @@ msgstr "12ur" #: templates/settings.php:64 msgid "Start week on" -msgstr "" +msgstr "Začni teden z" #: templates/settings.php:76 msgid "Cache" -msgstr "" +msgstr "Predpomnilnik" #: templates/settings.php:80 msgid "Clear cache for repeating events" -msgstr "" +msgstr "Počisti predpomnilnik za ponavljajoče dogodke" #: templates/settings.php:85 msgid "URLs" -msgstr "" +msgstr "URLji" #: templates/settings.php:87 msgid "Calendar CalDAV syncing addresses" -msgstr "" +msgstr "CalDAV naslov za usklajevanje koledarjev" #: templates/settings.php:87 msgid "more info" -msgstr "" +msgstr "dodatne informacije" #: templates/settings.php:89 msgid "Primary address (Kontact et al)" -msgstr "" +msgstr "Glavni naslov (Kontakt et al)" #: templates/settings.php:91 msgid "iOS/OS X" -msgstr "" +msgstr "iOS/OS X" #: templates/settings.php:93 msgid "Read only iCalendar link(s)" -msgstr "" +msgstr "iCalendar povezava/e samo za branje" #: templates/share.dropdown.php:20 msgid "Users" diff --git a/l10n/sl/contacts.po b/l10n/sl/contacts.po index 765e127a41..a31210ca6e 100644 --- a/l10n/sl/contacts.po +++ b/l10n/sl/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 09:09+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "Napaka med (de)aktivacijo imenika." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id ni nastavljen." @@ -68,7 +68,7 @@ msgstr "ime elementa ni nastavljeno." #: ajax/contact/addproperty.php:46 msgid "Could not parse contact: " -msgstr "" +msgstr "Ne morem razčleniti stika:" #: ajax/contact/addproperty.php:56 msgid "Cannot add empty property." @@ -82,18 +82,18 @@ msgstr "Vsaj eno izmed polj je še potrebno izpolniti." msgid "Trying to add duplicate property: " msgstr "Poskušam dodati podvojeno lastnost:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "Manjkajoč IM parameter." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Neznan IM:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Informacije o vCard niso pravilne. Prosimo, če ponovno naložite stran." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Napaka pri brisanju lastnosti stika." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Manjkajoč ID" @@ -114,10 +114,6 @@ msgstr "Informacija o vCard je napačna. Prosimo, če ponovno naložite stran: " msgid "Something went FUBAR. " msgstr "Nekaj je šlo v franže. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Napaka pri posodabljanju lastnosti stika." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "Začasne slike ni bilo mogoče naložiti: " msgid "No file was uploaded. Unknown error" msgstr "Nobena datoteka ni bila naložena. Neznana napaka" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Stiki" @@ -238,56 +234,73 @@ msgid "Couldn't get a valid address." msgstr "Ne morem dobiti veljavnega naslova." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Napaka" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "Nimate dovoljenja za dodajanje stikov v" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Prosimo, če izberete enega izmed vaših adresarjev." + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Napaka dovoljenj" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Ta lastnost ne sme biti prazna" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Predmetov ni bilo mogoče dati v zaporedje." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "\"deleteProperty\" je bila klicana brez vrste argumenta. Prosimo, če oddate poročilo o napaki na bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Uredi ime" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Nobena datoteka ni bila izbrana za nalaganje." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Datoteka, ki jo poskušate naložiti, presega največjo dovoljeno velikost za nalaganje na tem strežniku." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Napaka pri nalaganju slike profila." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Izberite vrsto" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." -msgstr "" +msgstr "Nekateri stiki so označeni za izbris, vendar še niso izbrisani. Prosimo, če počakate na njihov izbris." + +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Ali želite združiti adresarje?" #: js/loader.js:49 msgid "Result: " @@ -301,135 +314,166 @@ msgstr " uvoženih, " msgid " failed." msgstr " je spodletelo." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." -msgstr "" +msgstr "Ime za prikaz ne more biti prazno." #: lib/app.php:36 msgid "Addressbook not found: " -msgstr "" +msgstr "Adresar ni bil najden:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "To ni vaš imenik." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Stika ni bilo mogoče najti." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Naslov" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-pošta" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizacija" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Delo" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Doma" -#: lib/app.php:133 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 +msgid "Other" +msgstr "Drugo" + +#: lib/app.php:201 msgid "Mobile" msgstr "Mobilni telefon" -#: lib/app.php:135 +#: lib/app.php:203 msgid "Text" msgstr "Besedilo" -#: lib/app.php:136 +#: lib/app.php:204 msgid "Voice" msgstr "Glas" -#: lib/app.php:137 +#: lib/app.php:205 msgid "Message" msgstr "Sporočilo" -#: lib/app.php:138 +#: lib/app.php:206 msgid "Fax" msgstr "Faks" -#: lib/app.php:139 +#: lib/app.php:207 msgid "Video" msgstr "Video" -#: lib/app.php:140 +#: lib/app.php:208 msgid "Pager" msgstr "Pozivnik" -#: lib/app.php:146 +#: lib/app.php:215 msgid "Internet" msgstr "Internet" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 msgid "Birthday" msgstr "Rojstni dan" -#: lib/app.php:184 +#: lib/app.php:253 msgid "Business" -msgstr "" +msgstr "Poslovno" -#: lib/app.php:185 +#: lib/app.php:254 msgid "Call" -msgstr "" +msgstr "Klic" -#: lib/app.php:186 +#: lib/app.php:255 msgid "Clients" -msgstr "" +msgstr "Stranka" -#: lib/app.php:187 +#: lib/app.php:256 msgid "Deliverer" -msgstr "" +msgstr "Dostavljalec" -#: lib/app.php:188 +#: lib/app.php:257 msgid "Holidays" -msgstr "" +msgstr "Prazniki" -#: lib/app.php:189 +#: lib/app.php:258 msgid "Ideas" -msgstr "" +msgstr "Ideje" -#: lib/app.php:190 +#: lib/app.php:259 msgid "Journey" -msgstr "" +msgstr "Potovanje" -#: lib/app.php:191 +#: lib/app.php:260 msgid "Jubilee" -msgstr "" +msgstr "Jubilej" -#: lib/app.php:192 +#: lib/app.php:261 msgid "Meeting" -msgstr "" +msgstr "Sestanek" -#: lib/app.php:193 -msgid "Other" -msgstr "" - -#: lib/app.php:194 +#: lib/app.php:263 msgid "Personal" -msgstr "" +msgstr "Osebno" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" -msgstr "" +msgstr "Projekti" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" -msgstr "" +msgstr "Vprašanja" #: lib/hooks.php:102 msgid "{name}'s Birthday" @@ -439,6 +483,14 @@ msgstr "{name} - rojstni dan" msgid "Contact" msgstr "Stik" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "Nimate dovoljenj za urejanje tega stika." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "Nimate dovoljenj za izbris tega stika." + #: templates/index.php:14 msgid "Add Contact" msgstr "Dodaj stik" @@ -449,7 +501,7 @@ msgstr "Uvozi" #: templates/index.php:18 msgid "Settings" -msgstr "" +msgstr "Nastavitve" #: templates/index.php:18 templates/settings.php:9 msgid "Addressbooks" @@ -461,51 +513,51 @@ msgstr "Zapri" #: templates/index.php:37 msgid "Keyboard shortcuts" -msgstr "" +msgstr "Bližnjice na tipkovnici" #: templates/index.php:39 msgid "Navigation" -msgstr "" +msgstr "Krmarjenje" #: templates/index.php:42 msgid "Next contact in list" -msgstr "" +msgstr "Naslednji stik na seznamu" #: templates/index.php:44 msgid "Previous contact in list" -msgstr "" +msgstr "Predhodni stik na seznamu" #: templates/index.php:46 msgid "Expand/collapse current addressbook" -msgstr "" +msgstr "Razširi/skrči trenutni adresar" #: templates/index.php:48 msgid "Next addressbook" -msgstr "" +msgstr "Naslednji adresar" #: templates/index.php:50 msgid "Previous addressbook" -msgstr "" +msgstr "Predhodni adresar" #: templates/index.php:54 msgid "Actions" -msgstr "" +msgstr "Dejanja" #: templates/index.php:57 msgid "Refresh contacts list" -msgstr "" +msgstr "Osveži seznam stikov" #: templates/index.php:59 msgid "Add new contact" -msgstr "" +msgstr "Dodaj nov stik" #: templates/index.php:61 msgid "Add new addressbook" -msgstr "" +msgstr "Dodaj nov adresar" #: templates/index.php:63 msgid "Delete current contact" -msgstr "" +msgstr "Izbriši trenutni stik" #: templates/part.contact.php:17 msgid "Drop photo to upload" @@ -535,13 +587,18 @@ msgstr "Format po meri, Kratko ime, Polno ime, Obratno ali Obratno z vejico" msgid "Edit name details" msgstr "Uredite podrobnosti imena" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizacija" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Izbriši" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Vzdevek" @@ -549,23 +606,23 @@ msgstr "Vzdevek" msgid "Enter nickname" msgstr "Vnesite vzdevek" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" -msgstr "" +msgstr "Spletna stran" #: templates/part.contact.php:44 msgid "http://www.somesite.com" -msgstr "" +msgstr "http://www.nekastran.si" #: templates/part.contact.php:44 msgid "Go to web site" -msgstr "" +msgstr "Pojdi na spletno stran" #: templates/part.contact.php:46 msgid "dd-mm-yyyy" msgstr "dd. mm. yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Skupine" @@ -577,63 +634,84 @@ msgstr "Skupine ločite z vejicami" msgid "Edit groups" msgstr "Uredi skupine" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Prednosten" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Prosimo, če navedete veljaven e-poštni naslov." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Vnesite e-poštni naslov" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "E-pošta naslovnika" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Izbriši e-poštni naslov" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Vpiši telefonsko številko" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Izbriši telefonsko številko" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Takojšni sporočilnik" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Izbriši IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Prikaz na zemljevidu" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Uredi podrobnosti" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Opombe dodajte tukaj." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Dodaj polje" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-pošta" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Neposredno sporočanje" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Naslov" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Opomba" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Prenesi stik" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Izbriši stik" @@ -656,11 +734,11 @@ msgstr "Poštni predal" #: templates/part.edit_address_dialog.php:24 msgid "Street address" -msgstr "" +msgstr "Ulični naslov" #: templates/part.edit_address_dialog.php:27 msgid "Street and number" -msgstr "" +msgstr "Ulica in štelika" #: templates/part.edit_address_dialog.php:30 msgid "Extended" @@ -668,7 +746,7 @@ msgstr "Razširjeno" #: templates/part.edit_address_dialog.php:33 msgid "Apartment number etc." -msgstr "" +msgstr "Številka stanovanja itd." #: templates/part.edit_address_dialog.php:36 #: templates/part.edit_address_dialog.php:39 @@ -681,7 +759,7 @@ msgstr "Regija" #: templates/part.edit_address_dialog.php:45 msgid "E.g. state or province" -msgstr "" +msgstr "Npr. dežela ali pokrajina" #: templates/part.edit_address_dialog.php:48 msgid "Zipcode" @@ -689,7 +767,7 @@ msgstr "Poštna št." #: templates/part.edit_address_dialog.php:51 msgid "Postal code" -msgstr "" +msgstr "Poštna številka" #: templates/part.edit_address_dialog.php:54 #: templates/part.edit_address_dialog.php:57 @@ -804,21 +882,17 @@ msgstr "V vašem imeniku ni stikov." msgid "Add contact" msgstr "Dodaj stik" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Nastavi imenike" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" -msgstr "" +msgstr "Izberite adresarje" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" -msgstr "" +msgstr "Vnesite ime" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" -msgstr "" +msgstr "Vnesite opis" #: templates/settings.php:3 msgid "CardDAV syncing addresses" @@ -838,40 +912,44 @@ msgstr "iOS/OS X" #: templates/settings.php:20 msgid "Show CardDav link" -msgstr "" +msgstr "Pokaži CardDav povezavo" #: templates/settings.php:23 msgid "Show read-only VCF link" -msgstr "" +msgstr "Pokaži VCF povezavo samo za branje" #: templates/settings.php:26 +msgid "Share" +msgstr "Souporaba" + +#: templates/settings.php:29 msgid "Download" msgstr "Prenesi" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Uredi" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Nov imenik" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" -msgstr "" +msgstr "Ime" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" -msgstr "" +msgstr "Opis" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Shrani" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Prekliči" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." -msgstr "" +msgstr "Več..." diff --git a/l10n/sl/files.po b/l10n/sl/files.po index 4fa6cd3746..11c8ef1804 100644 --- a/l10n/sl/files.po +++ b/l10n/sl/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 13:04+0000\n" -"Last-Translator: Peter Peroša \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,11 +54,7 @@ msgstr "Pisanje na disk je spodletelo" msgid "Files" msgstr "Datoteke" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Vzemi iz souporabe" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Izbriši" @@ -82,59 +78,59 @@ msgstr "nadomeščen" msgid "with" msgstr "z" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "razveljavi" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "izbrisano" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "Ustvarjam ZIP datoteko. To lahko traja nekaj časa." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Nalaganje ni mogoče, saj gre za mapo, ali pa ima datoteka velikost 0 bajtov." -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Napaka pri nalaganju" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Na čakanju" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Nalaganje je bilo preklicano." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Neveljavno ime. Znak '/' ni dovoljen." -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Velikost" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Spremenjeno" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "mapa" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "mape" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "datoteka" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "datoteke" diff --git a/l10n/sl/files_encryption.po b/l10n/sl/files_encryption.po index ee97cf3b74..294eea91d1 100644 --- a/l10n/sl/files_encryption.po +++ b/l10n/sl/files_encryption.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Peter Peroša , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:33+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 00:19+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,16 +20,16 @@ msgstr "" #: templates/settings.php:3 msgid "Encryption" -msgstr "" +msgstr "Šifriranje" #: templates/settings.php:4 msgid "Exclude the following file types from encryption" -msgstr "" +msgstr "Naslednje vrste datotek naj se ne šifrirajo" #: templates/settings.php:5 msgid "None" -msgstr "" +msgstr "Brez" #: templates/settings.php:10 msgid "Enable Encryption" -msgstr "" +msgstr "Omogoči šifriranje" diff --git a/l10n/sl/files_external.po b/l10n/sl/files_external.po index b43660a42e..19d395b99d 100644 --- a/l10n/sl/files_external.po +++ b/l10n/sl/files_external.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-15 00:03+0000\n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 00:14+0000\n" "Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" @@ -20,35 +20,35 @@ msgstr "" #: templates/settings.php:3 msgid "External Storage" -msgstr "" +msgstr "Zunanja podatkovna shramba" #: templates/settings.php:7 templates/settings.php:19 msgid "Mount point" -msgstr "" +msgstr "Priklopna točka" #: templates/settings.php:8 msgid "Backend" -msgstr "" +msgstr "Zaledje" #: templates/settings.php:9 msgid "Configuration" -msgstr "" +msgstr "Nastavitve" #: templates/settings.php:10 msgid "Options" -msgstr "" +msgstr "Možnosti" #: templates/settings.php:11 msgid "Applicable" -msgstr "" +msgstr "Se uporablja" #: templates/settings.php:23 msgid "Add mount point" -msgstr "" +msgstr "Dodaj priklopno točko" #: templates/settings.php:54 templates/settings.php:62 msgid "None set" -msgstr "" +msgstr "Ni nastavljeno" #: templates/settings.php:63 msgid "All Users" @@ -76,8 +76,8 @@ msgstr "Uvozi korenski certifikat" #: templates/settings.php:108 msgid "Enable User External Storage" -msgstr "Omogoči" +msgstr "Omogoči uporabo zunanje podatkovne shrambe za uporabnike" #: templates/settings.php:109 msgid "Allow users to mount their own external storage" -msgstr "" +msgstr "Dovoli uporabnikom priklop lastne zunanje podatkovne shrambe" diff --git a/l10n/sl/files_sharing.po b/l10n/sl/files_sharing.po index e6928f35fa..56ed4e9046 100644 --- a/l10n/sl/files_sharing.po +++ b/l10n/sl/files_sharing.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 12:59+0000\n" -"Last-Translator: Peter Peroša \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,38 +18,18 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "Vaše datoteke v souporabi" +#: templates/get.php:4 +msgid "Size" +msgstr "Velikost" -#: templates/list.php:6 -msgid "Item" -msgstr "Predmet" +#: templates/get.php:5 +msgid "Modified" +msgstr "Spremenjeno" -#: templates/list.php:7 -msgid "Shared With" -msgstr "V souporabi z" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Izbriši vse" -#: templates/list.php:8 -msgid "Permissions" -msgstr "Dovoljenja" - -#: templates/list.php:16 -msgid "Read" -msgstr "Branje" - -#: templates/list.php:16 -msgid "Edit" -msgstr "Pisanje" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "Izbris" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "Omogoči nadaljnjo izmenjavo" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "Dovoli uporabnikom nadaljnjo izmenjavo tujih datotek" diff --git a/l10n/sl/files_versions.po b/l10n/sl/files_versions.po index 29a2310e26..5e6bbbb485 100644 --- a/l10n/sl/files_versions.po +++ b/l10n/sl/files_versions.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Peter Peroša , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:37+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 00:25+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,8 +20,8 @@ msgstr "" #: js/settings-personal.js:31 msgid "Expire all versions" -msgstr "" +msgstr "Zastaraj vse različice" #: templates/settings.php:3 msgid "Enable Files Versioning" -msgstr "" +msgstr "Omogoči sledenje različicam datotek" diff --git a/l10n/sl/lib.po b/l10n/sl/lib.po index fb1e393186..58fda36869 100644 --- a/l10n/sl/lib.po +++ b/l10n/sl/lib.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-29 02:04+0200\n" -"PO-Revision-Date: 2012-07-28 02:09+0000\n" +"POT-Creation-Date: 2012-08-22 02:04+0200\n" +"PO-Revision-Date: 2012-08-21 13:10+0000\n" "Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" @@ -18,43 +18,43 @@ msgstr "" "Language: sl\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3)\n" -#: app.php:287 +#: app.php:288 msgid "Help" msgstr "Pomoč" -#: app.php:294 +#: app.php:295 msgid "Personal" msgstr "Osebno" -#: app.php:299 +#: app.php:300 msgid "Settings" msgstr "Nastavitve" -#: app.php:304 +#: app.php:305 msgid "Users" msgstr "Uporabniki" -#: app.php:311 +#: app.php:312 msgid "Apps" msgstr "Aplikacije" -#: app.php:313 +#: app.php:314 msgid "Admin" msgstr "Skrbnik" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." msgstr "ZIP prenos je onemogočen." -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." msgstr "Datoteke morajo biti prenešene posamezno." -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" msgstr "Nazaj na datoteke" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." msgstr "Izbrane datoteke so prevelike, da bi lahko ustvarili zip datoteko." @@ -72,7 +72,7 @@ msgstr "Žeton je potekel. Prosimo, če spletno stran znova naložite." #: template.php:86 msgid "seconds ago" -msgstr "" +msgstr "sekund nazaj" #: template.php:87 msgid "1 minute ago" @@ -102,7 +102,7 @@ msgstr "prejšnji mesec" #: template.php:95 msgid "months ago" -msgstr "" +msgstr "mesecev nazaj" #: template.php:96 msgid "last year" @@ -110,4 +110,4 @@ msgstr "lani" #: template.php:97 msgid "years ago" -msgstr "" +msgstr "let nazaj" diff --git a/l10n/sl/settings.po b/l10n/sl/settings.po index 31f679ac7f..32ff133a37 100644 --- a/l10n/sl/settings.po +++ b/l10n/sl/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:09+0000\n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 13:08+0000\n" "Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" @@ -229,8 +229,8 @@ msgid "Other" msgstr "Drugo" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "PodSkrbnik" +msgid "Group Admin" +msgstr "Administrator skupine" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/sl/tasks.po b/l10n/sl/tasks.po index 484d5c1f72..ac56c8067f 100644 --- a/l10n/sl/tasks.po +++ b/l10n/sl/tasks.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:45+0000\n" +"POT-Creation-Date: 2012-08-22 02:04+0200\n" +"PO-Revision-Date: 2012-08-21 11:22+0000\n" "Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" @@ -52,7 +52,7 @@ msgstr "Prazen povzetek" #: lib/app.php:93 msgid "Invalid percent complete" -msgstr "" +msgstr "Neveljaven odstotek dokončanja" #: lib/app.php:107 msgid "Invalid priority" @@ -64,35 +64,35 @@ msgstr "Dodaj opravilo" #: templates/tasks.php:4 msgid "Order Due" -msgstr "" +msgstr "Razvrsti po roku" #: templates/tasks.php:5 msgid "Order List" -msgstr "" +msgstr "Razvrsti v seznam" #: templates/tasks.php:6 msgid "Order Complete" -msgstr "" +msgstr "Razvrsti po zaključenosti" #: templates/tasks.php:7 msgid "Order Location" -msgstr "" +msgstr "Razvrsti po lokacijah" #: templates/tasks.php:8 msgid "Order Priority" -msgstr "" +msgstr "Razvrsti po prednosti" #: templates/tasks.php:9 msgid "Order Label" -msgstr "" +msgstr "Razvrsti po oznakah" #: templates/tasks.php:16 msgid "Loading tasks..." -msgstr "" +msgstr "Nalagam opravila..." #: templates/tasks.php:20 msgid "Important" -msgstr "" +msgstr "Pomembno" #: templates/tasks.php:23 msgid "More" @@ -104,4 +104,4 @@ msgstr "Manj" #: templates/tasks.php:29 msgid "Delete" -msgstr "" +msgstr "Izbriši" diff --git a/l10n/sl/user_ldap.po b/l10n/sl/user_ldap.po index b46b9b6797..c405fb64d9 100644 --- a/l10n/sl/user_ldap.po +++ b/l10n/sl/user_ldap.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Peter Peroša , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:45+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-22 02:04+0200\n" +"PO-Revision-Date: 2012-08-21 11:45+0000\n" +"Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,146 +20,146 @@ msgstr "" #: templates/settings.php:8 msgid "Host" -msgstr "" +msgstr "Gostitelj" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "Protokol lahko izpustite, razen če zahtevate SSL. V tem primeru začnite z ldaps://" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "Osnovni DN" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "Osnovni DN za uporabnike in skupine lahko določite v zavihku Napredno" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "Uporabnik DN" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "DN uporabnikovega odjemalca, s katerim naj se opravi vezava, npr. uid=agent,dc=example,dc=com. Za anonimni dostop pustite polji DN in geslo prazni." #: templates/settings.php:11 msgid "Password" -msgstr "" +msgstr "Geslo" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "Za anonimni dostop pustite polji DN in geslo prazni." #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "Filter prijav uporabnikov" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "Določi filter uporabljen pri prijavi. %%uid nadomesti uporaniško ime pri prijavi." #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "Uporabite ogrado %%uid, npr. \"uid=%%uid\"." #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "Filter seznama uporabnikov" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "Določi filter za uporabo med pridobivanjem uporabnikov." #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "Brez katerekoli ograde, npr. \"objectClass=person\"." #: templates/settings.php:14 msgid "Group Filter" -msgstr "" +msgstr "Filter skupin" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "Določi filter za uporabo med pridobivanjem skupin." #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "Brez katerekoli ograde, npr. \"objectClass=posixGroup\"." #: templates/settings.php:17 msgid "Port" -msgstr "" +msgstr "Vrata" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "Osnovno uporabniško drevo" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "Osnovno drevo skupine" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "" +msgstr "Povezava člana skupine" #: templates/settings.php:21 msgid "Use TLS" -msgstr "" +msgstr "Uporabi TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "Ne uporabljajte ga za SSL povezave, saj ne bo delovalo." #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "LDAP strežnik je neobčutljiv na velikost črk (Windows)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "Onemogoči potrditev veljavnosti SSL certifikata." #: templates/settings.php:23 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "" +msgstr "Če povezava deluje samo s to možnostjo, uvozite SSL potrdilo iz LDAP strežnika v vaš ownCloud strežnik." #: templates/settings.php:23 msgid "Not recommended, use for testing only." -msgstr "" +msgstr "Odsvetovano, uporabite le v namene preizkušanja." #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "" +msgstr "Polje za uporabnikovo prikazano ime" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." -msgstr "" +msgstr "LDAP atribut uporabljen pri ustvarjanju ownCloud uporabniških imen." #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "" +msgstr "Polje za prikazano ime skupine" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." -msgstr "" +msgstr "LDAP atribut uporabljen pri ustvarjanju ownCloud imen skupin." #: templates/settings.php:27 msgid "in bytes" -msgstr "" +msgstr "v bajtih" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "v sekundah. Sprememba izprazni predpomnilnik." #: templates/settings.php:31 msgid "Help" -msgstr "" +msgstr "Pomoč" diff --git a/l10n/sl/user_openid.po b/l10n/sl/user_openid.po index 62302b6911..38b1064849 100644 --- a/l10n/sl/user_openid.po +++ b/l10n/sl/user_openid.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:13+0000\n" +"POT-Creation-Date: 2012-08-16 02:04+0200\n" +"PO-Revision-Date: 2012-08-15 00:29+0000\n" "Last-Translator: Peter Peroša \n" "Language-Team: Slovenian (http://www.transifex.com/projects/p/owncloud/language/sl/)\n" "MIME-Version: 1.0\n" @@ -24,11 +24,11 @@ msgstr "To je OpenID strežniška končna točka. Za več informacij si oglejte" #: templates/nomode.php:14 msgid "Identity: " -msgstr "Istovetnost: " +msgstr "Identiteta: " #: templates/nomode.php:15 msgid "Realm: " -msgstr "" +msgstr "Področje: " #: templates/nomode.php:16 msgid "User: " @@ -48,8 +48,8 @@ msgstr "s tem naslovom se lahko overite tudi na drugih straneh" #: templates/settings.php:5 msgid "Authorized OpenID provider" -msgstr "Odobren OpenID ponudnik" +msgstr "Odobren ponudnik OpenID" #: templates/settings.php:6 msgid "Your address at Wordpress, Identi.ca, …" -msgstr "Vaš naslov na Wordpress, Identi.ca, …" +msgstr "Vaš naslov pri Wordpress, Identi.ca, …" diff --git a/l10n/so/contacts.po b/l10n/so/contacts.po index 48bc4a90b1..2e9f2b1c0d 100644 --- a/l10n/so/contacts.po +++ b/l10n/so/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Somali (http://www.transifex.com/projects/p/owncloud/language/so/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/so/files.po b/l10n/so/files.po index f8fd36a22b..576444ca8e 100644 --- a/l10n/so/files.po +++ b/l10n/so/files.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Somali (http://www.transifex.com/projects/p/owncloud/language/so/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/so/files_sharing.po b/l10n/so/files_sharing.po index c0534448ee..c05e0f049b 100644 --- a/l10n/so/files_sharing.po +++ b/l10n/so/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Somali (http://www.transifex.com/projects/p/owncloud/language/so/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: so\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/so/settings.po b/l10n/so/settings.po index d9257419c7..bc0ef8b76c 100644 --- a/l10n/so/settings.po +++ b/l10n/so/settings.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Somali (http://www.transifex.com/projects/p/owncloud/language/so/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/sr/contacts.po b/l10n/sr/contacts.po index 87d87ab2e5..9b88aad65b 100644 --- a/l10n/sr/contacts.po +++ b/l10n/sr/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -80,18 +80,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Подаци о вКарти су неисправни. Поново учитајте страницу." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -112,10 +112,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Контакти" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -299,7 +312,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ово није ваш адресар." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Контакт се не може наћи." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Адреса" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Телефон" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Е-маил" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Организација" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Посао" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Кућа" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Мобилни" - -#: lib/app.php:135 -msgid "Text" -msgstr "Текст" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Глас" - -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Факс" - -#: lib/app.php:139 -msgid "Video" -msgstr "Видео" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Пејџер" - -#: lib/app.php:146 -msgid "Internet" -msgstr "" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Рођендан" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Мобилни" + +#: lib/app.php:203 +msgid "Text" +msgstr "Текст" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Глас" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Факс" + +#: lib/app.php:207 +msgid "Video" +msgstr "Видео" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Пејџер" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Рођендан" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "" msgid "Contact" msgstr "Контакт" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Додај контакт" @@ -533,13 +585,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Организација" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Обриши" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -547,7 +604,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -575,63 +632,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Пожељан" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 +msgid "View on map" +msgstr "" + +#: templates/part.contact.php:110 +msgid "Edit address details" +msgstr "" + +#: templates/part.contact.php:116 +msgid "Add notes here." +msgstr "" + +#: templates/part.contact.php:124 msgid "Add field" msgstr "" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Телефон" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Е-маил" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Адреса" + +#: templates/part.contact.php:133 msgid "Note" msgstr "" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Преузми контакт" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Обриши контакт" @@ -802,19 +880,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Преузимање" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Уреди" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Нови адресар" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Сними" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Откажи" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/sr/files.po b/l10n/sr/files.po index a6c92cc1ce..f8aaefdd55 100644 --- a/l10n/sr/files.po +++ b/l10n/sr/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "" msgid "Files" msgstr "Фајлови" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Обриши" @@ -80,59 +76,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Величина" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Задња измена" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/sr/files_sharing.po b/l10n/sr/files_sharing.po index b3e8247b76..b7dbb671d2 100644 --- a/l10n/sr/files_sharing.po +++ b/l10n/sr/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: sr\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/sr/settings.po b/l10n/sr/settings.po index 8a1ec02ddb..58e3af2ba4 100644 --- a/l10n/sr/settings.po +++ b/l10n/sr/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (http://www.transifex.com/projects/p/owncloud/language/sr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -227,7 +227,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/sr@latin/contacts.po b/l10n/sr@latin/contacts.po index 25c7058c75..826a00d5e6 100644 --- a/l10n/sr@latin/contacts.po +++ b/l10n/sr@latin/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -80,18 +80,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Podaci o vKarti su neispravni. Ponovo učitajte stranicu." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -112,10 +112,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -299,7 +312,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Ovo nije vaš adresar." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakt se ne može naći." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adresa" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-mail" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizacija" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Posao" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Kuća" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobilni" - -#: lib/app.php:135 -msgid "Text" -msgstr "Tekst" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Glas" - -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faks" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Pejdžer" - -#: lib/app.php:146 -msgid "Internet" -msgstr "" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Rođendan" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobilni" + +#: lib/app.php:203 +msgid "Text" +msgstr "Tekst" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Glas" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Pejdžer" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Rođendan" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Dodaj kontakt" @@ -533,13 +585,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizacija" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Obriši" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -547,7 +604,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -575,63 +632,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" -msgstr "Telefon" - -#: templates/part.contact.php:118 -msgid "Note" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "Telefon" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-mail" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adresa" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -802,19 +880,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Uredi" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/sr@latin/files.po b/l10n/sr@latin/files.po index f0c1194be7..b72a13bcbb 100644 --- a/l10n/sr@latin/files.po +++ b/l10n/sr@latin/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "" msgid "Files" msgstr "Fajlovi" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Obriši" @@ -80,59 +76,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Veličina" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Zadnja izmena" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/sr@latin/files_sharing.po b/l10n/sr@latin/files_sharing.po index 43f1f498e7..4f3a03c203 100644 --- a/l10n/sr@latin/files_sharing.po +++ b/l10n/sr@latin/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: sr@latin\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/sr@latin/settings.po b/l10n/sr@latin/settings.po index b0d7bcaa1a..75b8006fa2 100644 --- a/l10n/sr@latin/settings.po +++ b/l10n/sr@latin/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Serbian (Latin) (http://www.transifex.com/projects/p/owncloud/language/sr@latin/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -227,7 +227,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/sv/contacts.po b/l10n/sv/contacts.po index ec6bc7bdca..635ea51f8e 100644 --- a/l10n/sv/contacts.po +++ b/l10n/sv/contacts.po @@ -13,9 +13,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 07:00+0000\n" +"Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -28,7 +28,7 @@ msgid "Error (de)activating addressbook." msgstr "Fel (av)aktivera adressbok." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ID är inte satt." @@ -83,20 +83,20 @@ msgstr "Minst ett fält måste fyllas i." #: ajax/contact/addproperty.php:76 msgid "Trying to add duplicate property: " -msgstr "" +msgstr "Försöker lägga till dubblett:" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Kunde inte lägga till egenskap för kontakt:" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "IM parameter saknas." + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "Okänt IM:" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "Information om vCard är felaktigt. Vänligen ladda om sidan." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Fel uppstod när kontaktegenskap skulle tas bort." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "ID saknas" @@ -117,10 +117,6 @@ msgstr "Informationen om vCard är fel. Ladda om sidan:" msgid "Something went FUBAR. " msgstr "Något gick fel." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Fel uppstod när kontaktegenskap skulle uppdateras." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -224,7 +220,7 @@ msgstr "Kunde inte ladda tillfällig bild:" msgid "No file was uploaded. Unknown error" msgstr "Ingen fil uppladdad. Okänt fel" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "Kontakter" @@ -241,57 +237,74 @@ msgid "Couldn't get a valid address." msgstr "Kunde inte hitta en giltig adress." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Fel" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "Du saknar behörighet att skapa kontakter i" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "Välj en av dina egna adressböcker." + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "Behörighetsfel" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Denna egenskap får inte vara tom." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Kunde inte serialisera element." -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "\"deleteProperty\" anropades utan typargument. Vänligen rapportera till bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "Ändra namn" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Inga filer valda för uppladdning" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Filen du försöker ladda upp är större än den maximala storleken för filuppladdning på denna server." -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." -msgstr "" +msgstr "Fel vid hämtning av profilbild." -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Välj typ" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "Vissa kontakter är markerade för radering, men är inte raderade än. Vänta tills dom är raderade." +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "Vill du slå samman dessa adressböcker?" + #: js/loader.js:49 msgid "Result: " msgstr "Resultat:" @@ -304,7 +317,7 @@ msgstr "importerad," msgid " failed." msgstr "misslyckades." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "Visningsnamn får inte vara tomt." @@ -312,125 +325,156 @@ msgstr "Visningsnamn får inte vara tomt." msgid "Addressbook not found: " msgstr "Adressboken hittades inte:" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Det här är inte din adressbok." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kontakt kunde inte hittas." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adress" +#: lib/app.php:116 +msgid "Jabber" +msgstr "Jabber" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "AIM" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "E-post" +#: lib/app.php:126 +msgid "MSN" +msgstr "MSN" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organisation" +#: lib/app.php:131 +msgid "Twitter" +msgstr "Twitter" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "GoogleTalk" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "Facebook" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "XMPP" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "ICQ" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "Yahoo" + +#: lib/app.php:161 +msgid "Skype" +msgstr "Skype" + +#: lib/app.php:166 +msgid "QQ" +msgstr "QQ" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "GaduGadu" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "Arbete" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Hem" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Text" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Röst" - -#: lib/app.php:137 -msgid "Message" -msgstr "Meddelande" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Personsökare" - -#: lib/app.php:146 -msgid "Internet" -msgstr "Internet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Födelsedag" - -#: lib/app.php:184 -msgid "Business" -msgstr "Företag" - -#: lib/app.php:185 -msgid "Call" -msgstr "Ring" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Kunder" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "Leverera" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Helgdagar" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Idéer" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Resa" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Jubileum" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Möte" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Annat" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Text" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Röst" + +#: lib/app.php:205 +msgid "Message" +msgstr "Meddelande" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Personsökare" + +#: lib/app.php:215 +msgid "Internet" +msgstr "Internet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Födelsedag" + +#: lib/app.php:253 +msgid "Business" +msgstr "Företag" + +#: lib/app.php:254 +msgid "Call" +msgstr "Ring" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Kunder" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Leverera" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Helgdagar" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Idéer" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Resa" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Jubileum" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Möte" + +#: lib/app.php:263 msgid "Personal" msgstr "Privat" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projekt" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Frågor" @@ -442,6 +486,14 @@ msgstr "{name}'s födelsedag" msgid "Contact" msgstr "Kontakt" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "Du saknar behörighet för att ändra denna kontakt." + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "Du saknar behörighet för att radera denna kontakt." + #: templates/index.php:14 msgid "Add Contact" msgstr "Lägg till kontakt" @@ -538,13 +590,18 @@ msgstr " anpassad, korta namn, hela namn, bakåt eller bakåt med komma" msgid "Edit name details" msgstr "Redigera detaljer för namn" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organisation" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Radera" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Smeknamn" @@ -552,7 +609,7 @@ msgstr "Smeknamn" msgid "Enter nickname" msgstr "Ange smeknamn" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Webbplats" @@ -568,7 +625,7 @@ msgstr "Gå till webbplats" msgid "dd-mm-yyyy" msgstr "dd-mm-åååå" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Grupper" @@ -580,63 +637,84 @@ msgstr "Separera grupperna med kommatecken" msgid "Edit groups" msgstr "Editera grupper" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Föredragen" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Vänligen ange en giltig e-postadress." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Ange e-postadress" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Posta till adress." -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Ta bort e-postadress" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Ange telefonnummer" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Ta bort telefonnummer" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "Instant Messenger" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "Radera IM" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Visa på karta" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Redigera detaljer för adress" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Lägg till noteringar här." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Lägg till fält" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "E-post" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "Instant Messaging" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adress" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Notering" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Ladda ner kontakt" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Radera kontakt" @@ -705,7 +783,7 @@ msgstr "Adressbok" #: templates/part.edit_name_dialog.php:23 msgid "Hon. prefixes" -msgstr "" +msgstr "Ledande titlar" #: templates/part.edit_name_dialog.php:27 msgid "Miss" @@ -713,7 +791,7 @@ msgstr "Fröken" #: templates/part.edit_name_dialog.php:28 msgid "Ms" -msgstr "" +msgstr "Fru" #: templates/part.edit_name_dialog.php:29 msgid "Mr" @@ -725,11 +803,11 @@ msgstr "Herr" #: templates/part.edit_name_dialog.php:31 msgid "Mrs" -msgstr "Fröken" +msgstr "Fru" #: templates/part.edit_name_dialog.php:32 msgid "Dr" -msgstr "Dr" +msgstr "Dr." #: templates/part.edit_name_dialog.php:35 msgid "Given name" @@ -745,23 +823,23 @@ msgstr "Efternamn" #: templates/part.edit_name_dialog.php:41 msgid "Hon. suffixes" -msgstr "" +msgstr "Efterställda titlar" #: templates/part.edit_name_dialog.php:45 msgid "J.D." -msgstr "" +msgstr "Kand. Jur." #: templates/part.edit_name_dialog.php:46 msgid "M.D." -msgstr "" +msgstr "M.D." #: templates/part.edit_name_dialog.php:47 msgid "D.O." -msgstr "" +msgstr "D.O." #: templates/part.edit_name_dialog.php:48 msgid "D.C." -msgstr "" +msgstr "D.C." #: templates/part.edit_name_dialog.php:49 msgid "Ph.D." @@ -769,15 +847,15 @@ msgstr "Fil.dr." #: templates/part.edit_name_dialog.php:50 msgid "Esq." -msgstr "" +msgstr "Esq." #: templates/part.edit_name_dialog.php:51 msgid "Jr." -msgstr "" +msgstr "Jr." #: templates/part.edit_name_dialog.php:52 msgid "Sn." -msgstr "" +msgstr "Sn." #: templates/part.import.php:1 msgid "Import a contacts file" @@ -807,19 +885,15 @@ msgstr "Du har inga kontakter i din adressbok." msgid "Add contact" msgstr "Lägg till en kontakt" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Anpassa adressböcker." - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Välj adressböcker" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "Ange namn" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Ange beskrivning" @@ -848,33 +922,37 @@ msgid "Show read-only VCF link" msgstr "Visa skrivskyddad VCF-länk" #: templates/settings.php:26 +msgid "Share" +msgstr "Dela" + +#: templates/settings.php:29 msgid "Download" msgstr "Nedladdning" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Redigera" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Ny adressbok" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "Namn" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "Beskrivning" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Spara" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Avbryt" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "Mer..." diff --git a/l10n/sv/core.po b/l10n/sv/core.po index 3017915cbb..92631fa760 100644 --- a/l10n/sv/core.po +++ b/l10n/sv/core.po @@ -6,15 +6,16 @@ # Christer Eriksson , 2012. # Daniel Sandman , 2012. # , 2011. +# Magnus Höglund , 2012. # , 2012. # , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-02 02:02+0200\n" -"PO-Revision-Date: 2012-08-02 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-22 02:04+0200\n" +"PO-Revision-Date: 2012-08-21 08:33+0000\n" +"Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +25,7 @@ msgstr "" #: ajax/vcategories/add.php:23 ajax/vcategories/delete.php:23 msgid "Application name not provided." -msgstr "Programnamn har inte angetts" +msgstr "Programnamn har inte angetts." #: ajax/vcategories/add.php:29 msgid "No category to add?" @@ -38,55 +39,55 @@ msgstr "Denna kategori finns redan:" msgid "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" msgstr "ui-datepicker-group';if(i[1]>1)switch(G){case 0:y+=" -#: js/js.js:185 templates/layout.user.php:64 templates/layout.user.php:65 +#: js/js.js:190 templates/layout.user.php:64 templates/layout.user.php:65 msgid "Settings" msgstr "Inställningar" -#: js/js.js:573 +#: js/js.js:575 msgid "January" msgstr "Januari" -#: js/js.js:573 +#: js/js.js:575 msgid "February" msgstr "Februari" -#: js/js.js:573 +#: js/js.js:575 msgid "March" msgstr "Mars" -#: js/js.js:573 +#: js/js.js:575 msgid "April" msgstr "April" -#: js/js.js:573 +#: js/js.js:575 msgid "May" msgstr "Maj" -#: js/js.js:573 +#: js/js.js:575 msgid "June" msgstr "Juni" -#: js/js.js:574 +#: js/js.js:576 msgid "July" msgstr "Juli" -#: js/js.js:574 +#: js/js.js:576 msgid "August" msgstr "Augusti" -#: js/js.js:574 +#: js/js.js:576 msgid "September" msgstr "September" -#: js/js.js:574 +#: js/js.js:576 msgid "October" msgstr "Oktober" -#: js/js.js:574 +#: js/js.js:576 msgid "November" msgstr "November" -#: js/js.js:574 +#: js/js.js:576 msgid "December" msgstr "December" @@ -132,7 +133,7 @@ msgstr "Begärd" #: lostpassword/templates/lostpassword.php:8 msgid "Login failed!" -msgstr "Inloggning misslyckades!" +msgstr "Misslyckad inloggning!" #: lostpassword/templates/lostpassword.php:11 templates/installation.php:25 #: templates/login.php:9 @@ -149,7 +150,7 @@ msgstr "Ditt lösenord har återställts" #: lostpassword/templates/resetpassword.php:5 msgid "To login page" -msgstr "Till logga in sidan" +msgstr "Till logginsidan" #: lostpassword/templates/resetpassword.php:8 msgid "New password" @@ -161,7 +162,7 @@ msgstr "Återställ lösenordet" #: strings.php:5 msgid "Personal" -msgstr "Personlig" +msgstr "Personligt" #: strings.php:6 msgid "Users" @@ -222,15 +223,15 @@ msgstr "kommer att användas" #: templates/installation.php:82 msgid "Database user" -msgstr "Databas-användare" +msgstr "Databasanvändare" #: templates/installation.php:86 msgid "Database password" -msgstr "Lösenord för databasen" +msgstr "Lösenord till databasen" #: templates/installation.php:90 msgid "Database name" -msgstr "Databasens namn" +msgstr "Databasnamn" #: templates/installation.php:96 msgid "Database host" @@ -262,7 +263,7 @@ msgstr "Logga in" #: templates/logout.php:1 msgid "You are logged out." -msgstr "Du är utloggad" +msgstr "Du är utloggad." #: templates/part.pagenavi.php:3 msgid "prev" diff --git a/l10n/sv/files.po b/l10n/sv/files.po index 819753d4bf..14004c7fae 100644 --- a/l10n/sv/files.po +++ b/l10n/sv/files.po @@ -13,8 +13,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-06 02:01+0200\n" -"PO-Revision-Date: 2012-08-05 17:06+0000\n" +"POT-Creation-Date: 2012-08-22 02:04+0200\n" +"PO-Revision-Date: 2012-08-21 08:24+0000\n" "Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" @@ -39,7 +39,7 @@ msgstr "Den uppladdade filen överstiger MAX_FILE_SIZE direktivet som anges i HT #: ajax/upload.php:23 msgid "The uploaded file was only partially uploaded" -msgstr "Den uppladdade filen var endast delvist uppladdad" +msgstr "Den uppladdade filen var endast delvis uppladdad" #: ajax/upload.php:24 msgid "No file was uploaded" @@ -57,13 +57,9 @@ msgstr "Misslyckades spara till disk" msgid "Files" msgstr "Filer" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Sluta dela" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" -msgstr "Ta bort" +msgstr "Radera" #: js/filelist.js:141 msgid "already exists" @@ -85,59 +81,59 @@ msgstr "ersatt" msgid "with" msgstr "med" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "ångra" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "raderad" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." -msgstr "Gererar ZIP-fil. Det kan ta lite tid." +msgstr "genererar ZIP-fil, det kan ta lite tid." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Kunde inte ladda upp dina filer eftersom det antingen är en mapp eller har 0 bytes." -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Uppladdningsfel" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Väntar" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Uppladdning avbruten." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Ogiltigt namn, '/' är inte tillåten." -#: js/files.js:690 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Storlek" -#: js/files.js:691 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Ändrad" -#: js/files.js:718 +#: js/files.js:731 msgid "folder" msgstr "mapp" -#: js/files.js:720 +#: js/files.js:733 msgid "folders" msgstr "mappar" -#: js/files.js:728 +#: js/files.js:741 msgid "file" msgstr "fil" -#: js/files.js:730 +#: js/files.js:743 msgid "files" msgstr "filer" @@ -155,7 +151,7 @@ msgstr "max. möjligt:" #: templates/admin.php:9 msgid "Needed for multi-file and folder downloads." -msgstr "Krävs för nerladdning av flera mappar och filer" +msgstr "Krävs för nerladdning av flera mappar och filer." #: templates/admin.php:9 msgid "Enable ZIP-download" @@ -163,11 +159,11 @@ msgstr "Aktivera ZIP-nerladdning" #: templates/admin.php:11 msgid "0 is unlimited" -msgstr "0 är lika med oändligt" +msgstr "0 är oändligt" #: templates/admin.php:12 msgid "Maximum input size for ZIP files" -msgstr "Största tillåtna storlek för ZIP filer" +msgstr "Största tillåtna storlek för ZIP-filer" #: templates/index.php:7 msgid "New" @@ -207,7 +203,7 @@ msgstr "Dela" #: templates/index.php:51 msgid "Download" -msgstr "Ladda ned" +msgstr "Ladda ner" #: templates/index.php:64 msgid "Upload too large" @@ -221,8 +217,8 @@ msgstr "Filerna du försöker ladda upp överstiger den maximala storleken för #: templates/index.php:71 msgid "Files are being scanned, please wait." -msgstr "Filerna skannas, var god vänta" +msgstr "Filer skannas, var god vänta" #: templates/index.php:74 msgid "Current scanning" -msgstr "Aktuell avsökning" +msgstr "Aktuell skanning" diff --git a/l10n/sv/files_sharing.po b/l10n/sv/files_sharing.po index d48e54c277..dada4f4e79 100644 --- a/l10n/sv/files_sharing.po +++ b/l10n/sv/files_sharing.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-13 10:19+0000\n" -"Last-Translator: Magnus Höglund \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,38 +18,18 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "Dina delade filer" +#: templates/get.php:4 +msgid "Size" +msgstr "Storlek" -#: templates/list.php:6 -msgid "Item" -msgstr "Objekt" +#: templates/get.php:5 +msgid "Modified" +msgstr "Ändrad" -#: templates/list.php:7 -msgid "Shared With" -msgstr "Delad med" +#: templates/get.php:5 +msgid "Delete all" +msgstr "Radera alla" -#: templates/list.php:8 -msgid "Permissions" -msgstr "Rättigheter" - -#: templates/list.php:16 -msgid "Read" -msgstr "Läsa" - -#: templates/list.php:16 -msgid "Edit" -msgstr "Ändra" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "Radera" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "Aktivera dela vidare" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "Tillåter användare att dela filer som dom inte äger" diff --git a/l10n/sv/lib.po b/l10n/sv/lib.po index eda07bdbe0..b4e0a3e865 100644 --- a/l10n/sv/lib.po +++ b/l10n/sv/lib.po @@ -3,14 +3,15 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Magnus Höglund , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-30 02:03+0200\n" -"PO-Revision-Date: 2012-07-29 07:56+0000\n" -"Last-Translator: maghog \n" +"POT-Creation-Date: 2012-08-22 02:04+0200\n" +"PO-Revision-Date: 2012-08-21 08:40+0000\n" +"Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,43 +19,43 @@ msgstr "" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: app.php:287 +#: app.php:288 msgid "Help" msgstr "Hjälp" -#: app.php:294 +#: app.php:295 msgid "Personal" msgstr "Personligt" -#: app.php:299 +#: app.php:300 msgid "Settings" msgstr "Inställningar" -#: app.php:304 +#: app.php:305 msgid "Users" msgstr "Användare" -#: app.php:311 +#: app.php:312 msgid "Apps" msgstr "Program" -#: app.php:313 +#: app.php:314 msgid "Admin" msgstr "Admin" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." -msgstr "Nedladdning av ZIP är avstängd." +msgstr "Nerladdning av ZIP är avstängd." -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." msgstr "Filer laddas ner en åt gången." -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" msgstr "Tillbaka till Filer" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." msgstr "Valda filer är för stora för att skapa zip-fil." diff --git a/l10n/sv/media.po b/l10n/sv/media.po index b5dc072040..f6f24a1626 100644 --- a/l10n/sv/media.po +++ b/l10n/sv/media.po @@ -3,28 +3,30 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# Daniel Sandman , 2012. +# Magnus Höglund , 2012. # , 2011. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Swedish (http://www.transifex.net/projects/p/owncloud/language/sv/)\n" +"POT-Creation-Date: 2012-08-22 02:04+0200\n" +"PO-Revision-Date: 2012-08-21 08:29+0000\n" +"Last-Translator: Magnus Höglund \n" +"Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: sv\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -#: appinfo/app.php:32 templates/player.php:8 +#: appinfo/app.php:45 templates/player.php:8 msgid "Music" msgstr "Musik" #: js/music.js:18 msgid "Add album to playlist" -msgstr "" +msgstr "Lägg till album till spellistan" #: templates/music.php:3 templates/player.php:12 msgid "Play" diff --git a/l10n/sv/settings.po b/l10n/sv/settings.po index 759aac3b94..f764a35f03 100644 --- a/l10n/sv/settings.po +++ b/l10n/sv/settings.po @@ -14,9 +14,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 06:21+0000\n" +"Last-Translator: Magnus Höglund \n" "Language-Team: Swedish (http://www.transifex.com/projects/p/owncloud/language/sv/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -58,7 +58,7 @@ msgstr "Fel" #: js/apps.js:39 js/apps.js:73 msgid "Disable" -msgstr "Avaktivera" +msgstr "Deaktivera" #: js/apps.js:39 js/apps.js:62 msgid "Enable" @@ -78,19 +78,19 @@ msgstr "Säkerhetsvarning" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "Cron" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "utför en uppgift vid varje sidladdning" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" -msgstr "" +msgstr "cron.php är registrerad på en webcron-tjänst" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "använd systemets cron-tjänst" #: templates/admin.php:39 msgid "Log" @@ -134,11 +134,11 @@ msgstr "Ställ en fråga" #: templates/help.php:22 msgid "Problems connecting to help database." -msgstr "Problem med att ansluta till hjälp-databasen." +msgstr "Problem med att ansluta till hjälpdatabasen." #: templates/help.php:23 msgid "Go there manually." -msgstr "Gå dit manuellt" +msgstr "Gå dit manuellt." #: templates/help.php:31 msgid "Answer" @@ -162,7 +162,7 @@ msgstr "Ladda ner" #: templates/personal.php:19 msgid "Your password got changed" -msgstr "Ditt lösenord ändrades" +msgstr "Ditt lösenord har ändrats" #: templates/personal.php:20 msgid "Unable to change your password" @@ -233,8 +233,8 @@ msgid "Other" msgstr "Annat" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "Underadministratör" +msgid "Group Admin" +msgstr "Gruppadministratör" #: templates/users.php:82 msgid "Quota" @@ -242,4 +242,4 @@ msgstr "Kvot" #: templates/users.php:146 msgid "Delete" -msgstr "Ta bort" +msgstr "Radera" diff --git a/l10n/templates/admin_dependencies_chk.pot b/l10n/templates/admin_dependencies_chk.pot index 7ebf04e55c..ae9512efe8 100644 --- a/l10n/templates/admin_dependencies_chk.pot +++ b/l10n/templates/admin_dependencies_chk.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/admin_migrate.pot b/l10n/templates/admin_migrate.pot index e905c22f86..78b49fcdb8 100644 --- a/l10n/templates/admin_migrate.pot +++ b/l10n/templates/admin_migrate.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/bookmarks.pot b/l10n/templates/bookmarks.pot index b96ce9f1e7..7668869f08 100644 --- a/l10n/templates/bookmarks.pot +++ b/l10n/templates/bookmarks.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/calendar.pot b/l10n/templates/calendar.pot index 751969a0bf..b1a31a8a73 100644 --- a/l10n/templates/calendar.pot +++ b/l10n/templates/calendar.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -67,7 +67,7 @@ msgstr "" msgid "Invalid request" msgstr "" -#: appinfo/app.php:35 templates/calendar.php:15 +#: appinfo/app.php:41 templates/calendar.php:15 #: templates/part.eventform.php:33 templates/part.showevent.php:33 msgid "Calendar" msgstr "" diff --git a/l10n/templates/contacts.pot b/l10n/templates/contacts.pot index 92d0ca5fc1..0166743621 100644 --- a/l10n/templates/contacts.pot +++ b/l10n/templates/contacts.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:25 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at bugs." "owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,10 +879,6 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/templates/core.pot b/l10n/templates/core.pot index 99b041e1c8..e5769a1a08 100644 --- a/l10n/templates/core.pot +++ b/l10n/templates/core.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -37,51 +37,51 @@ msgstr "" msgid "Settings" msgstr "" -#: js/js.js:574 +#: js/js.js:575 msgid "January" msgstr "" -#: js/js.js:574 +#: js/js.js:575 msgid "February" msgstr "" -#: js/js.js:574 +#: js/js.js:575 msgid "March" msgstr "" -#: js/js.js:574 +#: js/js.js:575 msgid "April" msgstr "" -#: js/js.js:574 +#: js/js.js:575 msgid "May" msgstr "" -#: js/js.js:574 +#: js/js.js:575 msgid "June" msgstr "" -#: js/js.js:575 +#: js/js.js:576 msgid "July" msgstr "" -#: js/js.js:575 +#: js/js.js:576 msgid "August" msgstr "" -#: js/js.js:575 +#: js/js.js:576 msgid "September" msgstr "" -#: js/js.js:575 +#: js/js.js:576 msgid "October" msgstr "" -#: js/js.js:575 +#: js/js.js:576 msgid "November" msgstr "" -#: js/js.js:575 +#: js/js.js:576 msgid "December" msgstr "" diff --git a/l10n/templates/files.pot b/l10n/templates/files.pot index 26f5eacee8..603136b53b 100644 --- a/l10n/templates/files.pot +++ b/l10n/templates/files.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -51,11 +51,7 @@ msgstr "" msgid "Files" msgstr "" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:111 templates/index.php:56 msgid "Delete" msgstr "" @@ -79,59 +75,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/templates/files_encryption.pot b/l10n/templates/files_encryption.pot index a463731bf9..4abd4bfe4a 100644 --- a/l10n/templates/files_encryption.pot +++ b/l10n/templates/files_encryption.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_external.pot b/l10n/templates/files_external.pot index 0674e0b95d..b845f7d27d 100644 --- a/l10n/templates/files_external.pot +++ b/l10n/templates/files_external.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/files_sharing.pot b/l10n/templates/files_sharing.pot index c74bc72d36..d95745ec23 100644 --- a/l10n/templates/files_sharing.pot +++ b/l10n/templates/files_sharing.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,38 +17,18 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/templates/files_versions.pot b/l10n/templates/files_versions.pot index 7a68a39a41..7a55f7e131 100644 --- a/l10n/templates/files_versions.pot +++ b/l10n/templates/files_versions.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/gallery.pot b/l10n/templates/gallery.pot index e77e777229..f4431a9c81 100644 --- a/l10n/templates/gallery.pot +++ b/l10n/templates/gallery.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: appinfo/app.php:39 +#: appinfo/app.php:42 msgid "Pictures" msgstr "" diff --git a/l10n/templates/lib.pot b/l10n/templates/lib.pot index 97bbaa8645..3f4dc1e461 100644 --- a/l10n/templates/lib.pot +++ b/l10n/templates/lib.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -41,19 +41,19 @@ msgstr "" msgid "Admin" msgstr "" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." msgstr "" -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." msgstr "" -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" msgstr "" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." msgstr "" diff --git a/l10n/templates/media.pot b/l10n/templates/media.pot index fb5d0a755d..c3946d4ab8 100644 --- a/l10n/templates/media.pot +++ b/l10n/templates/media.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/settings.pot b/l10n/templates/settings.pot index b0ea4703cc..b8338fb6fc 100644 --- a/l10n/templates/settings.pot +++ b/l10n/templates/settings.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -226,7 +226,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/templates/tasks.pot b/l10n/templates/tasks.pot index b23ae36239..5f237d3c50 100644 --- a/l10n/templates/tasks.pot +++ b/l10n/templates/tasks.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_ldap.pot b/l10n/templates/user_ldap.pot index f554a64978..808b7c6d3b 100644 --- a/l10n/templates/user_ldap.pot +++ b/l10n/templates/user_ldap.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_migrate.pot b/l10n/templates/user_migrate.pot index 0367e1a634..6a63226f92 100644 --- a/l10n/templates/user_migrate.pot +++ b/l10n/templates/user_migrate.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/templates/user_openid.pot b/l10n/templates/user_openid.pot index 211f8054b1..144f4bece5 100644 --- a/l10n/templates/user_openid.pot +++ b/l10n/templates/user_openid.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/l10n/th_TH/admin_dependencies_chk.po b/l10n/th_TH/admin_dependencies_chk.po index 6ba6dff16a..95abe0c652 100644 --- a/l10n/th_TH/admin_dependencies_chk.po +++ b/l10n/th_TH/admin_dependencies_chk.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 13:17+0000\n" +"POT-Creation-Date: 2012-08-20 02:01+0200\n" +"PO-Revision-Date: 2012-08-19 14:18+0000\n" "Last-Translator: AriesAnywhere Anywhere \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" @@ -22,52 +22,52 @@ msgstr "" msgid "" "The php-json module is needed by the many applications for inter " "communications" -msgstr "" +msgstr "โมดูล php-json จำเป็นต้องใช้สำหรับแอพพลิเคชั่นหลายๆตัวเพื่อการเชื่อมต่อสากล" #: settings.php:39 msgid "" "The php-curl modude is needed to fetch the page title when adding a " "bookmarks" -msgstr "" +msgstr "โมดูล php-curl จำเป็นต้องใช้สำหรับดึงข้อมูลชื่อหัวเว็บเมื่อเพิ่มเข้าไปยังรายการโปรด" #: settings.php:45 msgid "The php-gd module is needed to create thumbnails of your images" -msgstr "" +msgstr "โมดูล php-gd จำเป็นต้องใช้สำหรับสร้างรูปภาพขนาดย่อของรูปภาพของคุณ" #: settings.php:51 msgid "The php-ldap module is needed connect to your ldap server" -msgstr "" +msgstr "โมดูล php-ldap จำเป็นต้องใช้สำหรับการเชื่อมต่อกับเซิร์ฟเวอร์ ldap ของคุณ" #: settings.php:57 msgid "The php-zip module is needed download multiple files at once" -msgstr "" +msgstr "โมดูล php-zip จำเป็นต้องใช้สำหรับดาวน์โหลดไฟล์พร้อมกันหลายๆไฟล์ในครั้งเดียว" #: settings.php:63 msgid "" "The php-mb_multibyte module is needed to manage correctly the encoding." -msgstr "" +msgstr "โมดูล php-mb_multibyte จำเป็นต้องใช้สำหรับการจัดการการแปลงรหัสไฟล์อย่างถูกต้อง" #: settings.php:69 msgid "The php-ctype module is needed validate data." -msgstr "" +msgstr "โมดูล php-ctype จำเป็นต้องใช้สำหรับตรวจสอบความถูกต้องของข้อมูล" #: settings.php:75 msgid "The php-xml module is needed to share files with webdav." -msgstr "" +msgstr "โมดูล php-xml จำเป็นต้องใช้สำหรับแชร์ไฟล์ด้วย webdav" #: settings.php:81 msgid "" "The allow_url_fopen directive of your php.ini should be set to 1 to retrieve" " knowledge base from OCS servers" -msgstr "" +msgstr "คำสั่ง allow_url_fopen ที่อยู่ในไฟล์ php.ini ของคุณ ควรกำหนดเป็น 1 เพื่อดึงข้อมูลของฐานความรู้ต่างๆจากเซิร์ฟเวอร์ของ OCS" #: settings.php:87 msgid "The php-pdo module is needed to store owncloud data into a database." -msgstr "" +msgstr "โมดูล php-pdo จำเป็นต้องใช้สำหรับจัดเก็บข้อมูลใน owncloud เข้าไปไว้ยังฐานข้อมูล" #: templates/settings.php:2 msgid "Dependencies status" -msgstr "" +msgstr "สถานะการอ้างอิง" #: templates/settings.php:7 msgid "Used by :" diff --git a/l10n/th_TH/contacts.po b/l10n/th_TH/contacts.po index 88f3f467d4..978e20b066 100644 --- a/l10n/th_TH/contacts.po +++ b/l10n/th_TH/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 14:39+0000\n" -"Last-Translator: AriesAnywhere Anywhere \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "เกิดข้อผิดพลาดใน (ยกเลิก)การเปิดใช้งานสมุดบันทึกที่อยู่" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "ยังไม่ได้กำหนดรหัส" @@ -81,18 +81,18 @@ msgstr "อย่างน้อยที่สุดช่องข้อมู msgid "Trying to add duplicate property: " msgstr "พยายามที่จะเพิ่มทรัพยากรที่ซ้ำซ้อนกัน: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "เกิดข้อผิดพลาดในการเพิ่มคุณสมบัติข้อมูลผู้ติดต่อ" +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "ข้อมูลเกี่ยวกับ vCard ไม่ถูกต้อง กรุณาโหลดหน้าเวปใหม่อีกครั้ง" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "เกิดข้อผิดพลาดในการลบรายละเอียดการติดต่อ" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "รหัสสูญหาย" @@ -113,10 +113,6 @@ msgstr "ข้อมูล vCard ไม่ถูกต้อง กรุณา msgid "Something went FUBAR. " msgstr "มีบางอย่างเกิดการ FUBAR. " -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "เกิดข้อผิดพลาดในการอัพเดทข้อมูลการติดต่อ" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "ไม่สามารถโหลดรูปภาพชั่วค msgid "No file was uploaded. Unknown error" msgstr "ยังไม่มีไฟล์ใดที่ถูกอัพโหลด เกิดข้อผิดพลาดที่ไม่ทราบสาเหตุ" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "ข้อมูลการติดต่อ" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "ไม่สามารถดึงที่อยู่ที่ถูกต้องได้" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "พบข้อผิดพลาด" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "คุณสมบัตินี้ต้องไม่มีข้อมูลว่างอยู่" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "ไม่สามารถทำสัญลักษณ์องค์ประกอบต่างๆให้เป็นตัวเลขตามลำดับได้" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' ถูกเรียกใช้โดยไม่มีอาร์กิวเมนต์ กรุณาแจ้งได้ที่ bugs.owncloud.org" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "แก้ไขชื่อ" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "ยังไม่ได้เลือกไฟล์ำสำหรับอัพโหลด" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "ไฟล์ที่คุณกำลังพยายามที่จะอัพโหลดมีขนาดเกินจำนวนสูงสุดที่สามารถอัพโหลดได้สำหรับเซิร์ฟเวอร์นี้" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "เกิดข้อผิดพลาดในการโหลดรูปภาพประจำตัว" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "เลือกชนิด" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "ข้อมูลผู้ติดต่อบางรายการได้ถูกทำเครื่องหมายสำหรับลบทิ้งเอาไว้, แต่ยังไม่ได้ถูกลบทิ้ง, กรุณารอให้รายการดังกล่าวถูกลบทิ้งเสียก่อน" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "คุณต้องการผสานข้อมูลสมุดบันทึกที่อยู่เหล่านี้หรือไม่?" + #: js/loader.js:49 msgid "Result: " msgstr "ผลลัพธ์: " @@ -300,7 +313,7 @@ msgstr " นำเข้าข้อมูลแล้ว, " msgid " failed." msgstr " ล้มเหลว." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "ชื่อที่ใช้แสดงไม่สามารถเว้นว่างได้" @@ -308,125 +321,156 @@ msgstr "ชื่อที่ใช้แสดงไม่สามารถเ msgid "Addressbook not found: " msgstr "ไม่พบสมุดบันทึกที่อยู่ที่ต้องการ" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "นี่ไม่ใช่สมุดบันทึกที่อยู่ของคุณ" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "ไม่พบข้อมูลการติดต่อ" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "ที่อยู่" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "โทรศัพท์" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "อีเมล์" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "หน่วยงาน" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "ที่ทำงาน" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "บ้าน" -#: lib/app.php:133 -msgid "Mobile" -msgstr "มือถือ" - -#: lib/app.php:135 -msgid "Text" -msgstr "ข้อความ" - -#: lib/app.php:136 -msgid "Voice" -msgstr "เสียงพูด" - -#: lib/app.php:137 -msgid "Message" -msgstr "ข้อความ" - -#: lib/app.php:138 -msgid "Fax" -msgstr "โทรสาร" - -#: lib/app.php:139 -msgid "Video" -msgstr "วีดีโอ" - -#: lib/app.php:140 -msgid "Pager" -msgstr "เพจเจอร์" - -#: lib/app.php:146 -msgid "Internet" -msgstr "อินเทอร์เน็ต" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "วันเกิด" - -#: lib/app.php:184 -msgid "Business" -msgstr "ธุรกิจ" - -#: lib/app.php:185 -msgid "Call" -msgstr "โทร" - -#: lib/app.php:186 -msgid "Clients" -msgstr "ลูกค้า" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "ผู้จัดส่ง" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "วันหยุด" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "ไอเดีย" - -#: lib/app.php:190 -msgid "Journey" -msgstr "การเดินทาง" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "งานเฉลิมฉลอง" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "ประชุม" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "อื่นๆ" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "มือถือ" + +#: lib/app.php:203 +msgid "Text" +msgstr "ข้อความ" + +#: lib/app.php:204 +msgid "Voice" +msgstr "เสียงพูด" + +#: lib/app.php:205 +msgid "Message" +msgstr "ข้อความ" + +#: lib/app.php:206 +msgid "Fax" +msgstr "โทรสาร" + +#: lib/app.php:207 +msgid "Video" +msgstr "วีดีโอ" + +#: lib/app.php:208 +msgid "Pager" +msgstr "เพจเจอร์" + +#: lib/app.php:215 +msgid "Internet" +msgstr "อินเทอร์เน็ต" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "วันเกิด" + +#: lib/app.php:253 +msgid "Business" +msgstr "ธุรกิจ" + +#: lib/app.php:254 +msgid "Call" +msgstr "โทร" + +#: lib/app.php:255 +msgid "Clients" +msgstr "ลูกค้า" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "ผู้จัดส่ง" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "วันหยุด" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "ไอเดีย" + +#: lib/app.php:259 +msgid "Journey" +msgstr "การเดินทาง" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "งานเฉลิมฉลอง" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "ประชุม" + +#: lib/app.php:263 msgid "Personal" msgstr "ส่วนตัว" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "โปรเจค" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "คำถาม" @@ -438,6 +482,14 @@ msgstr "วันเกิดของ {name}" msgid "Contact" msgstr "ข้อมูลการติดต่อ" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "เพิ่มรายชื่อผู้ติดต่อใหม่" @@ -534,13 +586,18 @@ msgstr "กำหนดรูปแบบของชื่อย่อ, ชื msgid "Edit name details" msgstr "แก้ไขรายละเอียดของชื่อ" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "หน่วยงาน" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "ลบ" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "ชื่อเล่น" @@ -548,7 +605,7 @@ msgstr "ชื่อเล่น" msgid "Enter nickname" msgstr "กรอกชื่อเล่น" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "เว็บไซต์" @@ -564,7 +621,7 @@ msgstr "ไปที่เว็บไซต์" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "กลุ่ม" @@ -576,63 +633,84 @@ msgstr "คั่นระหว่างรายชื่อกลุ่มด msgid "Edit groups" msgstr "แก้ไขกลุ่ม" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "พิเศษ" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "กรุณาระบุที่อยู่อีเมลที่ถูกต้อง" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "กรอกที่อยู่อีเมล" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "ส่งอีเมลไปที่" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "ลบที่อยู่อีเมล" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "กรอกหมายเลขโทรศัพท์" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "ลบหมายเลขโทรศัพท์" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "ดูบนแผนที่" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "แก้ไขรายละเอียดที่อยู่" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "เพิ่มหมายเหตุกำกับไว้ที่นี่" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "เพิ่มช่องรับข้อมูล" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "โทรศัพท์" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "อีเมล์" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "ที่อยู่" + +#: templates/part.contact.php:133 msgid "Note" msgstr "หมายเหตุ" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "ดาวน์โหลดข้อมูลการติดต่อ" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "ลบข้อมูลการติดต่อ" @@ -803,10 +881,6 @@ msgstr "คุณยังไม่มีข้อมูลการติดต msgid "Add contact" msgstr "เพิ่มชื่อผู้ติดต่อ" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "กำหนดค่าสมุดบันทึกที่อยู่" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "เลือกสมุดบันทึกที่อยู่" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "แสดงลิงก์ VCF สำหรับอ่านเท่านั้น" #: templates/settings.php:26 +msgid "Share" +msgstr "แชร์" + +#: templates/settings.php:29 msgid "Download" msgstr "ดาวน์โหลด" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "แก้ไข" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "สร้างสมุดบันทึกข้อมูลการติดต่อใหม่" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "ชื่อ" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "คำอธิบาย" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "บันทึก" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "ยกเลิก" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "เพิ่มเติม..." diff --git a/l10n/th_TH/files.po b/l10n/th_TH/files.po index c5a8f013b6..773e125153 100644 --- a/l10n/th_TH/files.po +++ b/l10n/th_TH/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:02+0200\n" -"PO-Revision-Date: 2012-08-14 12:47+0000\n" -"Last-Translator: AriesAnywhere Anywhere \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "เขียนข้อมูลลงแผ่นดิสก์ล้ msgid "Files" msgstr "ไฟล์" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "ยกเลิกการแชร์ข้อมูล" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "ลบ" @@ -81,59 +77,59 @@ msgstr "แทนที่แล้ว" msgid "with" msgstr "กับ" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "เลิกทำ" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "ลบแล้ว" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "กำลังสร้างไฟล์บีบอัด ZIP อาจใช้เวลาสักครู่" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "ไม่สามารถอัพโหลดไฟล์ของคุณได้ เนื่องจากไฟล์ดังกล่าวเป็นไดเร็กทอรี่หรือมีขนาด 0 ไบต์" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "เกิดข้อผิดพลาดในการอัพโหลด" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "อยู่ระหว่างดำเนินการ" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "การอัพโหลดถูกยกเลิก" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "ชื่อที่ใช้ไม่ถูกต้อง '/' ไม่อนุญาตให้ใช้งาน" -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "ขนาด" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "ปรับปรุงล่าสุด" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "โฟลเดอร์" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "โฟลเดอร์" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "ไฟล์" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "ไฟล์" diff --git a/l10n/th_TH/files_sharing.po b/l10n/th_TH/files_sharing.po index 250856835f..6e5fafa72c 100644 --- a/l10n/th_TH/files_sharing.po +++ b/l10n/th_TH/files_sharing.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 13:14+0000\n" -"Last-Translator: AriesAnywhere Anywhere \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -18,38 +18,18 @@ msgstr "" "Language: th_TH\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" -msgstr "ไฟล์ของคุณที่แชร์ไว้" +#: templates/get.php:4 +msgid "Size" +msgstr "ขนาด" -#: templates/list.php:6 -msgid "Item" -msgstr "ไอเท็ม" +#: templates/get.php:5 +msgid "Modified" +msgstr "แก้ไขแล้ว" -#: templates/list.php:7 -msgid "Shared With" -msgstr "แชร์พร้อมกับ" +#: templates/get.php:5 +msgid "Delete all" +msgstr "ลบทั้งหมด" -#: templates/list.php:8 -msgid "Permissions" -msgstr "สิทธิ์การเข้าใช้งาน" - -#: templates/list.php:16 -msgid "Read" -msgstr "อ่าน" - -#: templates/list.php:16 -msgid "Edit" -msgstr "แก้ไข" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "ลบ" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "เปิดให้มีการแชร์ใหม่อีกครั้งได้" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "อนุญาตให้ผู้ใช้งานสามารถแชร์ไฟล์ที่ไม่ได้เป็นเจ้าของใหม่ได้" diff --git a/l10n/th_TH/settings.po b/l10n/th_TH/settings.po index 0dc69f7f22..f2de2ffdc5 100644 --- a/l10n/th_TH/settings.po +++ b/l10n/th_TH/settings.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 12:49+0000\n" +"POT-Creation-Date: 2012-08-20 02:01+0200\n" +"PO-Revision-Date: 2012-08-19 15:11+0000\n" "Last-Translator: AriesAnywhere Anywhere \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" @@ -229,8 +229,8 @@ msgid "Other" msgstr "อื่นๆ" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "ผู้ดูแลย่อย" +msgid "Group Admin" +msgstr "ผู้ดูแลกลุ่ม" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/th_TH/user_ldap.po b/l10n/th_TH/user_ldap.po index 1f8d946d7a..b87bd07fa5 100644 --- a/l10n/th_TH/user_ldap.po +++ b/l10n/th_TH/user_ldap.po @@ -8,8 +8,8 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-15 02:03+0200\n" -"PO-Revision-Date: 2012-08-14 15:30+0000\n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-22 18:47+0000\n" "Last-Translator: AriesAnywhere Anywhere \n" "Language-Team: Thai (Thailand) (http://www.transifex.com/projects/p/owncloud/language/th_TH/)\n" "MIME-Version: 1.0\n" @@ -25,26 +25,26 @@ msgstr "โฮสต์" #: templates/settings.php:8 msgid "" "You can omit the protocol, except you require SSL. Then start with ldaps://" -msgstr "" +msgstr "คุณสามารถปล่อยช่องโปรโตคอลเว้นไว้ได้, ยกเว้นกรณีที่คุณต้องการใช้ SSL จากนั้นเริ่มต้นด้วย ldaps://" #: templates/settings.php:9 msgid "Base DN" -msgstr "" +msgstr "DN ฐาน" #: templates/settings.php:9 msgid "You can specify Base DN for users and groups in the Advanced tab" -msgstr "" +msgstr "คุณสามารถระบุ DN หลักสำหรับผู้ใช้งานและกลุ่มต่างๆในแท็บขั้นสูงได้" #: templates/settings.php:10 msgid "User DN" -msgstr "" +msgstr "DN ของผู้ใช้งาน" #: templates/settings.php:10 msgid "" "The DN of the client user with which the bind shall be done, e.g. " "uid=agent,dc=example,dc=com. For anonymous access, leave DN and Password " "empty." -msgstr "" +msgstr "DN ของผู้ใช้งานที่เป็นลูกค้าอะไรก็ตามที่ผูกอยู่ด้วย เช่น uid=agent, dc=example, dc=com, สำหรับการเข้าถึงโดยบุคคลนิรนาม, ให้เว้นว่าง DN และ รหัสผ่านเอาไว้" #: templates/settings.php:11 msgid "Password" @@ -52,35 +52,35 @@ msgstr "รหัสผ่าน" #: templates/settings.php:11 msgid "For anonymous access, leave DN and Password empty." -msgstr "" +msgstr "สำหรับการเข้าถึงโดยบุคคลนิรนาม ให้เว้นว่าง DN และรหัสผ่านไว้" #: templates/settings.php:12 msgid "User Login Filter" -msgstr "" +msgstr "ตัวกรองข้อมูลการเข้าสู่ระบบของผู้ใช้งาน" #: templates/settings.php:12 #, php-format msgid "" "Defines the filter to apply, when login is attempted. %%uid replaces the " "username in the login action." -msgstr "" +msgstr "กำหนดตัวกรองข้อมูลที่ต้องการนำไปใช้งาน, เมื่อมีความพยายามในการเข้าสู่ระบบ %%uid จะถูกนำไปแทนที่ชื่อผู้ใช้งานในการกระทำของการเข้าสู่ระบบ" #: templates/settings.php:12 #, php-format msgid "use %%uid placeholder, e.g. \"uid=%%uid\"" -msgstr "" +msgstr "ใช้ตัวยึด %%uid, เช่น \"uid=%%uid\"" #: templates/settings.php:13 msgid "User List Filter" -msgstr "" +msgstr "ตัวกรองข้อมูลรายชื่อผู้ใช้งาน" #: templates/settings.php:13 msgid "Defines the filter to apply, when retrieving users." -msgstr "" +msgstr "ระบุตัวกรองข้อมูลที่ต้องการนำไปใช้งาน, เมื่อดึงข้อมูลผู้ใช้งาน" #: templates/settings.php:13 msgid "without any placeholder, e.g. \"objectClass=person\"." -msgstr "" +msgstr "โดยไม่ต้องมีตัวยึดใดๆ, เช่น \"objectClass=person\"," #: templates/settings.php:14 msgid "Group Filter" @@ -88,11 +88,11 @@ msgstr "ตัวกรองข้อมูลกลุ่ม" #: templates/settings.php:14 msgid "Defines the filter to apply, when retrieving groups." -msgstr "" +msgstr "ระบุตัวกรองข้อมูลที่ต้องการนำไปใช้งาน, เมื่อดึงข้อมูลกลุ่ม" #: templates/settings.php:14 msgid "without any placeholder, e.g. \"objectClass=posixGroup\"." -msgstr "" +msgstr "โดยไม่ต้องมีตัวยึดใดๆ, เช่น \"objectClass=posixGroup\"," #: templates/settings.php:17 msgid "Port" @@ -100,15 +100,15 @@ msgstr "พอร์ต" #: templates/settings.php:18 msgid "Base User Tree" -msgstr "" +msgstr "รายการผู้ใช้งานหลักแบบ Tree" #: templates/settings.php:19 msgid "Base Group Tree" -msgstr "" +msgstr "รายการกลุ่มหลักแบบ Tree" #: templates/settings.php:20 msgid "Group-Member association" -msgstr "" +msgstr "ความสัมพันธ์ของสมาชิกในกลุ่ม" #: templates/settings.php:21 msgid "Use TLS" @@ -116,21 +116,21 @@ msgstr "ใช้ TLS" #: templates/settings.php:21 msgid "Do not use it for SSL connections, it will fail." -msgstr "" +msgstr "กรุณาอย่าใช้การเชื่อมต่อแบบ SSL การเชื่อมต่อจะเกิดการล้มเหลว" #: templates/settings.php:22 msgid "Case insensitve LDAP server (Windows)" -msgstr "" +msgstr "เซิร์ฟเวอร์ LDAP ประเภท Case insensitive (วินโดวส์)" #: templates/settings.php:23 msgid "Turn off SSL certificate validation." -msgstr "" +msgstr "ปิดใช้งานการตรวจสอบความถูกต้องของใบรับรองความปลอดภัย SSL" #: templates/settings.php:23 msgid "" "If connection only works with this option, import the LDAP server's SSL " "certificate in your ownCloud server." -msgstr "" +msgstr "หากการเชื่อมต่อสามารถทำงานได้เฉพาะกับตัวเลือกนี้เท่านั้น, ให้นำเข้าข้อมูลใบรับรองความปลอดภัยแบบ SSL ของเซิร์ฟเวอร์ LDAP ดังกล่าวเข้าไปไว้ในเซิร์ฟเวอร์ ownCloud" #: templates/settings.php:23 msgid "Not recommended, use for testing only." @@ -138,19 +138,19 @@ msgstr "ไม่แนะนำให้ใช้งาน, ใช้สำห #: templates/settings.php:24 msgid "User Display Name Field" -msgstr "" +msgstr "ช่องแสดงชื่อผู้ใช้งานที่ต้องการ" #: templates/settings.php:24 msgid "The LDAP attribute to use to generate the user`s ownCloud name." -msgstr "" +msgstr "คุณลักษณะ LDAP ที่ต้องการใช้สำหรับสร้างชื่อของผู้ใช้งาน ownCloud" #: templates/settings.php:25 msgid "Group Display Name Field" -msgstr "" +msgstr "ช่องแสดงชื่อกลุ่มที่ต้องการ" #: templates/settings.php:25 msgid "The LDAP attribute to use to generate the groups`s ownCloud name." -msgstr "" +msgstr "คุณลักษณะ LDAP ที่ต้องการใช้สร้างชื่อกลุ่มของ ownCloud" #: templates/settings.php:27 msgid "in bytes" @@ -158,7 +158,7 @@ msgstr "ในหน่วยไบต์" #: templates/settings.php:29 msgid "in seconds. A change empties the cache." -msgstr "" +msgstr "ในอีกไม่กี่วินาที ระบบจะเปลี่ยนแปลงข้อมูลในแคชให้ว่างเปล่า" #: templates/settings.php:31 msgid "Help" diff --git a/l10n/tr/contacts.po b/l10n/tr/contacts.po index 79c0485edd..8feffd0706 100644 --- a/l10n/tr/contacts.po +++ b/l10n/tr/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "Adres defteri etkisizleştirilirken hata oluştu." #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id atanmamış." @@ -82,18 +82,18 @@ msgstr "En az bir adres alanı doldurulmalı." msgid "Trying to add duplicate property: " msgstr "Yinelenen özellik eklenmeye çalışılıyor: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " -msgstr "Kişi özelliği eklenirken hata oluştu." +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " +msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "vCard bilgileri doğru değil. Lütfen sayfayı yenileyin." -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "Kişi özelliği silinirken hata oluştu." - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Eksik ID" @@ -114,10 +114,6 @@ msgstr "vCard hakkındaki bilgi hatalı. Lütfen sayfayı yeniden yükleyin: " msgid "Something went FUBAR. " msgstr "Bir şey FUBAR gitti." -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "Kişi özelliği güncellenirken hata oluştu." - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "Geçici resmi yükleyemedi :" msgid "No file was uploaded. Unknown error" msgstr "Dosya yüklenmedi. Bilinmeyen hata" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Kişiler" @@ -238,57 +234,74 @@ msgid "Couldn't get a valid address." msgstr "Geçerli bir adres alınamadı." #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "Hata" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "Bu özellik boş bırakılmamalı." -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "Öğeler seri hale getiremedi" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' tip argümanı olmadan çağrıldı. Lütfen bugs.owncloud.org a rapor ediniz." -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "İsmi düzenle" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "Yükleme için dosya seçilmedi." -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "Yüklemeye çalıştığınız dosya sunucudaki dosya yükleme maksimum boyutunu aşmaktadır. " -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "Tür seç" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "Sonuç: " @@ -301,7 +314,7 @@ msgstr " içe aktarıldı, " msgid " failed." msgstr " hatalı." -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -309,125 +322,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Bu sizin adres defteriniz değil." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "Kişi bulunamadı." -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Adres" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Telefon" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Eposta" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Organizasyon" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "İş" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "Ev" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Mobil" - -#: lib/app.php:135 -msgid "Text" -msgstr "Metin" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Ses" - -#: lib/app.php:137 -msgid "Message" -msgstr "mesaj" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Faks" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Sayfalayıcı" - -#: lib/app.php:146 -msgid "Internet" -msgstr "İnternet" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Doğum günü" - -#: lib/app.php:184 -msgid "Business" -msgstr "İş" - -#: lib/app.php:185 -msgid "Call" -msgstr "Çağrı" - -#: lib/app.php:186 -msgid "Clients" -msgstr "Müşteriler" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "Dağıtıcı" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "Tatiller" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "Fikirler" - -#: lib/app.php:190 -msgid "Journey" -msgstr "Seyahat" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "Yıl Dönümü" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "Toplantı" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "Diğer" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Mobil" + +#: lib/app.php:203 +msgid "Text" +msgstr "Metin" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Ses" + +#: lib/app.php:205 +msgid "Message" +msgstr "mesaj" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Faks" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Sayfalayıcı" + +#: lib/app.php:215 +msgid "Internet" +msgstr "İnternet" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Doğum günü" + +#: lib/app.php:253 +msgid "Business" +msgstr "İş" + +#: lib/app.php:254 +msgid "Call" +msgstr "Çağrı" + +#: lib/app.php:255 +msgid "Clients" +msgstr "Müşteriler" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "Dağıtıcı" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "Tatiller" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "Fikirler" + +#: lib/app.php:259 +msgid "Journey" +msgstr "Seyahat" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "Yıl Dönümü" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "Toplantı" + +#: lib/app.php:263 msgid "Personal" msgstr "Kişisel" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "Projeler" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "Sorular" @@ -439,6 +483,14 @@ msgstr "{name}'nin Doğumgünü" msgid "Contact" msgstr "Kişi" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Kişi Ekle" @@ -535,13 +587,18 @@ msgstr "Biçin özel, Kısa isim, Tam isim, Ters veya noktalı ters" msgid "Edit name details" msgstr "İsim detaylarını düzenle" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Organizasyon" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Sil" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "Takma ad" @@ -549,7 +606,7 @@ msgstr "Takma ad" msgid "Enter nickname" msgstr "Takma adı girin" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "Web sitesi" @@ -565,7 +622,7 @@ msgstr "Web sitesine git" msgid "dd-mm-yyyy" msgstr "gg-aa-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "Gruplar" @@ -577,63 +634,84 @@ msgstr "Grupları birbirinden virgülle ayırın" msgid "Edit groups" msgstr "Grupları düzenle" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "Tercih edilen" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "Lütfen geçerli bir eposta adresi belirtin." -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "Eposta adresini girin" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "Eposta adresi" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "Eposta adresini sil" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "Telefon numarasını gir" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "Telefon numarasını sil" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "Haritada gör" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "Adres detaylarını düzenle" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "Notları buraya ekleyin." -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "Alan ekle" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "Telefon" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Eposta" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Adres" + +#: templates/part.contact.php:133 msgid "Note" msgstr "Not" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "Kişiyi indir" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Kişiyi sil" @@ -804,19 +882,15 @@ msgstr "Adres defterinizde hiç bağlantı yok." msgid "Add contact" msgstr "Bağlatı ekle" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "Adres defterini yapılandır" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "Adres deftelerini seçiniz" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "İsim giriniz" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "Tanım giriniz" @@ -845,33 +919,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "İndir" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Düzenle" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Yeni Adres Defteri" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Kaydet" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "İptal" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/tr/files.po b/l10n/tr/files.po index d63bb38a57..3498950112 100644 --- a/l10n/tr/files.po +++ b/l10n/tr/files.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -54,11 +54,7 @@ msgstr "Diske yazılamadı" msgid "Files" msgstr "Dosyalar" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Paylaşılmayan" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Sil" @@ -82,59 +78,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "geri al" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "silindi" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "ZIP dosyası oluşturuluyor, biraz sürebilir." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Dosyanızın boyutu 0 byte olduğundan veya bir dizin olduğundan yüklenemedi" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Yükleme hatası" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Bekliyor" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Yükleme iptal edildi." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Geçersiz isim, '/' işaretine izin verilmiyor." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Boyut" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Değiştirilme" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "dizin" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "dizinler" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "dosya" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "dosyalar" diff --git a/l10n/tr/files_sharing.po b/l10n/tr/files_sharing.po index 47f149e2b3..3f6c26efdc 100644 --- a/l10n/tr/files_sharing.po +++ b/l10n/tr/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/tr/settings.po b/l10n/tr/settings.po index 1ea3973f52..f2a34211a7 100644 --- a/l10n/tr/settings.po +++ b/l10n/tr/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Turkish (http://www.transifex.com/projects/p/owncloud/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -229,8 +229,8 @@ msgid "Other" msgstr "Diğer" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "Alt Yönetici" +msgid "Group Admin" +msgstr "" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/uk/contacts.po b/l10n/uk/contacts.po index 3cb6c2aa24..f415e863cc 100644 --- a/l10n/uk/contacts.po +++ b/l10n/uk/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -80,18 +80,18 @@ msgstr "Має бути заповнено щонайменше одне пол msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -112,10 +112,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -299,7 +312,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "Це не ваша адресна книга." -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Адреса" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Телефон" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Ел.пошта" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Організація" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "" -#: lib/app.php:133 -msgid "Mobile" -msgstr "Мобільний" - -#: lib/app.php:135 -msgid "Text" -msgstr "Текст" - -#: lib/app.php:136 -msgid "Voice" -msgstr "Голос" - -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "Факс" - -#: lib/app.php:139 -msgid "Video" -msgstr "Відео" - -#: lib/app.php:140 -msgid "Pager" -msgstr "Пейджер" - -#: lib/app.php:146 -msgid "Internet" -msgstr "" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "День народження" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Мобільний" + +#: lib/app.php:203 +msgid "Text" +msgstr "Текст" + +#: lib/app.php:204 +msgid "Voice" +msgstr "Голос" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Факс" + +#: lib/app.php:207 +msgid "Video" +msgstr "Відео" + +#: lib/app.php:208 +msgid "Pager" +msgstr "Пейджер" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "День народження" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Додати контакт" @@ -533,13 +585,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Організація" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Видалити" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -547,7 +604,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -575,63 +632,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" -msgstr "Телефон" - -#: templates/part.contact.php:118 -msgid "Note" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "Телефон" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Ел.пошта" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Адреса" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Видалити контакт" @@ -802,19 +880,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Завантажити" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "Нова адресна книга" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/uk/files.po b/l10n/uk/files.po index ef13ab4cc1..8fb3ea8778 100644 --- a/l10n/uk/files.po +++ b/l10n/uk/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "" msgid "Files" msgstr "Файли" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "Заборонити доступ" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Видалити" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "відмінити" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "видалені" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "Створення ZIP-файлу, це може зайняти певний час." -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "Неможливо завантажити ваш файл тому, що він тека або файл розміром 0 байт" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Помилка завантаження" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Очікування" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Завантаження перервано." -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Некоректне ім'я, '/' не дозволено." -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Розмір" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Змінено" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "тека" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "теки" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "файл" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "файли" diff --git a/l10n/uk/files_sharing.po b/l10n/uk/files_sharing.po index bb60168265..4786918c70 100644 --- a/l10n/uk/files_sharing.po +++ b/l10n/uk/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: uk\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/uk/settings.po b/l10n/uk/settings.po index e779674bc4..f32d1abccf 100644 --- a/l10n/uk/settings.po +++ b/l10n/uk/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Ukrainian (http://www.transifex.com/projects/p/owncloud/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -227,7 +227,7 @@ msgid "Other" msgstr "" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/vi/contacts.po b/l10n/vi/contacts.po index 3568844e5b..924eb994b8 100644 --- a/l10n/vi/contacts.po +++ b/l10n/vi/contacts.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,7 +23,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "id không được thiết lập." @@ -80,18 +80,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "Missing ID" @@ -112,10 +112,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -219,7 +215,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "Liên lạc" @@ -236,57 +232,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -299,7 +312,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -307,125 +320,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "Địa chỉ" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "Điện thoại bàn" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "Email" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "Tổ chức" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "Công việc" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "Nhà" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "Di động" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" +#: lib/app.php:141 +msgid "Facebook" msgstr "" -#: lib/app.php:138 -msgid "Fax" -msgstr "Fax" - -#: lib/app.php:139 -msgid "Video" -msgstr "Video" - -#: lib/app.php:140 -msgid "Pager" -msgstr "số trang" - #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "Ngày sinh nhật" - -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:189 -msgid "Ideas" -msgstr "" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" +msgstr "Công việc" -#: lib/app.php:190 -msgid "Journey" -msgstr "" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" +msgstr "Nhà" -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "Di động" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "Fax" + +#: lib/app.php:207 +msgid "Video" +msgstr "Video" + +#: lib/app.php:208 +msgid "Pager" +msgstr "số trang" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "Ngày sinh nhật" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -437,6 +481,14 @@ msgstr "" msgid "Contact" msgstr "Danh sách" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "Thêm liên lạc" @@ -533,13 +585,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "Tổ chức" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "Xóa" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -547,7 +604,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -563,7 +620,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -575,63 +632,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" -msgstr "Điện thoại" - -#: templates/part.contact.php:118 -msgid "Note" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "Điện thoại" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "Email" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "Địa chỉ" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "Xóa liên lạc" @@ -802,19 +880,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -843,33 +917,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "Tải về" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "Sửa" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "Lưu" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "Hủy" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/vi/files.po b/l10n/vi/files.po index fa964a6646..8ce76018a8 100644 --- a/l10n/vi/files.po +++ b/l10n/vi/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "" msgid "Files" msgstr "Tập tin" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "Xóa" @@ -80,59 +76,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "Tải lên lỗi" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Chờ" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "Hủy tải lên" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "Tên không hợp lệ ,không được phép dùng '/'" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "Kích cỡ" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "Thay đổi" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "folder" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "folders" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "file" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "files" diff --git a/l10n/vi/files_sharing.po b/l10n/vi/files_sharing.po index 4aa6347091..87e7cce9bd 100644 --- a/l10n/vi/files_sharing.po +++ b/l10n/vi/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: vi\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/vi/settings.po b/l10n/vi/settings.po index 3cf80bee1c..41c0adc6ef 100644 --- a/l10n/vi/settings.po +++ b/l10n/vi/settings.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Vietnamese (http://www.transifex.com/projects/p/owncloud/language/vi/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -228,7 +228,7 @@ msgid "Other" msgstr "Khác" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/l10n/zh_CN.GB2312/contacts.po b/l10n/zh_CN.GB2312/contacts.po index 8a348956c1..d4431695ae 100644 --- a/l10n/zh_CN.GB2312/contacts.po +++ b/l10n/zh_CN.GB2312/contacts.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgid "Error (de)activating addressbook." msgstr "" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -79,18 +79,18 @@ msgstr "" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "" @@ -111,10 +111,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -218,7 +214,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "" @@ -235,57 +231,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -298,7 +311,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -306,125 +319,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" +#: lib/app.php:116 +msgid "Jabber" msgstr "" -#: lib/app.php:113 -msgid "Telephone" +#: lib/app.php:121 +msgid "AIM" msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" +#: lib/app.php:126 +msgid "MSN" msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "" - -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 -msgid "Work" -msgstr "" - -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 -msgid "Home" -msgstr "" - -#: lib/app.php:133 -msgid "Mobile" -msgstr "" - -#: lib/app.php:135 -msgid "Text" +#: lib/app.php:131 +msgid "Twitter" msgstr "" #: lib/app.php:136 -msgid "Voice" +msgid "GoogleTalk" msgstr "" -#: lib/app.php:137 -msgid "Message" -msgstr "" - -#: lib/app.php:138 -msgid "Fax" -msgstr "" - -#: lib/app.php:139 -msgid "Video" -msgstr "" - -#: lib/app.php:140 -msgid "Pager" +#: lib/app.php:141 +msgid "Facebook" msgstr "" #: lib/app.php:146 -msgid "Internet" +msgid "XMPP" msgstr "" -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" +#: lib/app.php:151 +msgid "ICQ" msgstr "" -#: lib/app.php:184 -msgid "Business" +#: lib/app.php:156 +msgid "Yahoo" msgstr "" -#: lib/app.php:185 -msgid "Call" +#: lib/app.php:161 +msgid "Skype" msgstr "" -#: lib/app.php:186 -msgid "Clients" +#: lib/app.php:166 +msgid "QQ" msgstr "" -#: lib/app.php:187 -msgid "Deliverer" +#: lib/app.php:171 +msgid "GaduGadu" msgstr "" -#: lib/app.php:188 -msgid "Holidays" +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 +msgid "Work" msgstr "" -#: lib/app.php:189 -msgid "Ideas" +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 +msgid "Home" msgstr "" -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "" + +#: lib/app.php:203 +msgid "Text" +msgstr "" + +#: lib/app.php:204 +msgid "Voice" +msgstr "" + +#: lib/app.php:205 +msgid "Message" +msgstr "" + +#: lib/app.php:206 +msgid "Fax" +msgstr "" + +#: lib/app.php:207 +msgid "Video" +msgstr "" + +#: lib/app.php:208 +msgid "Pager" +msgstr "" + +#: lib/app.php:215 +msgid "Internet" +msgstr "" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -436,6 +480,14 @@ msgstr "" msgid "Contact" msgstr "" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "" @@ -532,13 +584,18 @@ msgstr "" msgid "Edit name details" msgstr "" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "" @@ -546,7 +603,7 @@ msgstr "" msgid "Enter nickname" msgstr "" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -562,7 +619,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "" @@ -574,63 +631,84 @@ msgstr "" msgid "Edit groups" msgstr "" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "" -#: templates/part.contact.php:92 -msgid "View on map" +#: templates/part.contact.php:100 +msgid "Instant Messenger" msgstr "" -#: templates/part.contact.php:92 -msgid "Edit address details" -msgstr "" - -#: templates/part.contact.php:103 -msgid "Add notes here." +#: templates/part.contact.php:101 +msgid "Delete IM" msgstr "" #: templates/part.contact.php:110 -msgid "Add field" +msgid "View on map" msgstr "" -#: templates/part.contact.php:115 -msgid "Phone" +#: templates/part.contact.php:110 +msgid "Edit address details" msgstr "" -#: templates/part.contact.php:118 -msgid "Note" -msgstr "" - -#: templates/part.contact.php:123 -msgid "Download contact" +#: templates/part.contact.php:116 +msgid "Add notes here." msgstr "" #: templates/part.contact.php:124 +msgid "Add field" +msgstr "" + +#: templates/part.contact.php:129 +msgid "Phone" +msgstr "" + +#: templates/part.contact.php:130 +msgid "Email" +msgstr "" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "" + +#: templates/part.contact.php:133 +msgid "Note" +msgstr "" + +#: templates/part.contact.php:138 +msgid "Download contact" +msgstr "" + +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "" @@ -801,19 +879,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -842,33 +916,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/zh_CN.GB2312/files.po b/l10n/zh_CN.GB2312/files.po index b1da62d32e..80307c381e 100644 --- a/l10n/zh_CN.GB2312/files.po +++ b/l10n/zh_CN.GB2312/files.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 14:04+0000\n" -"Last-Translator: bluehattree \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,11 +52,7 @@ msgstr "写磁盘失败" msgid "Files" msgstr "文件" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "未分享的" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "删除" @@ -80,59 +76,59 @@ msgstr "替换过了" msgid "with" msgstr "随着" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "撤销" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "删除" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "正在生成ZIP文件,这可能需要点时间" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "不能上传你指定的文件,可能因为它是个文件夹或者大小为0" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "上传错误" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "Pending" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "上传取消了" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "非法文件名,\"/\"是不被许可的" -#: js/files.js:694 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "大小" -#: js/files.js:695 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "修改日期" -#: js/files.js:722 +#: js/files.js:731 msgid "folder" msgstr "文件夹" -#: js/files.js:724 +#: js/files.js:733 msgid "folders" msgstr "文件夹" -#: js/files.js:732 +#: js/files.js:741 msgid "file" msgstr "文件" -#: js/files.js:734 +#: js/files.js:743 msgid "files" msgstr "文件" diff --git a/l10n/zh_CN.GB2312/files_sharing.po b/l10n/zh_CN.GB2312/files_sharing.po index a3a249084f..0243a9ebaa 100644 --- a/l10n/zh_CN.GB2312/files_sharing.po +++ b/l10n/zh_CN.GB2312/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: zh_CN.GB2312\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/zh_CN.GB2312/settings.po b/l10n/zh_CN.GB2312/settings.po index b451fb6d41..70f3d9d228 100644 --- a/l10n/zh_CN.GB2312/settings.po +++ b/l10n/zh_CN.GB2312/settings.po @@ -8,9 +8,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-18 02:01+0200\n" +"PO-Revision-Date: 2012-08-18 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (GB2312) (http://www.transifex.com/projects/p/owncloud/language/zh_CN.GB2312/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -227,8 +227,8 @@ msgid "Other" msgstr "其他的" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "子专辑" +msgid "Group Admin" +msgstr "" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/zh_CN/bookmarks.po b/l10n/zh_CN/bookmarks.po index 1164856a06..65c4c5efc1 100644 --- a/l10n/zh_CN/bookmarks.po +++ b/l10n/zh_CN/bookmarks.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:17+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 01:10+0000\n" +"Last-Translator: hanfeng \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -19,42 +20,42 @@ msgstr "" #: appinfo/app.php:14 msgid "Bookmarks" -msgstr "" +msgstr "书签" #: bookmarksHelper.php:99 msgid "unnamed" -msgstr "" +msgstr "未命名" #: templates/bookmarklet.php:5 msgid "" "Drag this to your browser bookmarks and click it, when you want to bookmark " "a webpage quickly:" -msgstr "" +msgstr "拖曳此处到您的浏览器书签处,点击可以将网页快速添加到书签中。" #: templates/bookmarklet.php:7 msgid "Read later" -msgstr "" +msgstr "稍后阅读" #: templates/list.php:13 msgid "Address" -msgstr "" +msgstr "地址" #: templates/list.php:14 msgid "Title" -msgstr "" +msgstr "标题" #: templates/list.php:15 msgid "Tags" -msgstr "" +msgstr "标签" #: templates/list.php:16 msgid "Save bookmark" -msgstr "" +msgstr "保存书签" #: templates/list.php:22 msgid "You have no bookmarks" -msgstr "" +msgstr "您暂无书签" #: templates/settings.php:11 msgid "Bookmarklet
    " -msgstr "" +msgstr "书签应用" diff --git a/l10n/zh_CN/contacts.po b/l10n/zh_CN/contacts.po index 0c73f885ca..78d0fb242f 100644 --- a/l10n/zh_CN/contacts.po +++ b/l10n/zh_CN/contacts.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:02+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -25,7 +25,7 @@ msgid "Error (de)activating addressbook." msgstr "(取消)激活地址簿错误。" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "没有设置 id。" @@ -82,18 +82,18 @@ msgstr "至少需要填写一项地址。" msgid "Trying to add duplicate property: " msgstr "试图添加重复属性: " -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "vCard 的信息不正确。请重新加载页面。" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "删除联系人属性错误。" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "缺少 ID" @@ -114,10 +114,6 @@ msgstr "vCard 信息不正确。请刷新页面: " msgid "Something went FUBAR. " msgstr "有一些信息无法被处理。" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "更新联系人属性错误。" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -221,7 +217,7 @@ msgstr "无法加载临时图像: " msgid "No file was uploaded. Unknown error" msgstr "没有文件被上传。未知错误" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "联系人" @@ -238,57 +234,74 @@ msgid "Couldn't get a valid address." msgstr "无法获取一个合法的地址。" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "错误" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "这个属性必须是非空的" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "无法序列化元素" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "'deleteProperty' 调用时没有类型声明。请到 bugs.owncloud.org 汇报错误" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "编辑名称" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "没有选择文件以上传" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "您试图上传的文件超出了该服务器的最大文件限制" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "选择类型" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "结果: " @@ -301,7 +314,7 @@ msgstr " 已导入, " msgid " failed." msgstr " 失败。" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -309,125 +322,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "这不是您的地址簿。" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "无法找到联系人。" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "地址" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "电话" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "电子邮件" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "组织" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "工作" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "家庭" -#: lib/app.php:133 -msgid "Mobile" -msgstr "移动电话" - -#: lib/app.php:135 -msgid "Text" -msgstr "文本" - -#: lib/app.php:136 -msgid "Voice" -msgstr "语音" - -#: lib/app.php:137 -msgid "Message" -msgstr "消息" - -#: lib/app.php:138 -msgid "Fax" -msgstr "传真" - -#: lib/app.php:139 -msgid "Video" -msgstr "视频" - -#: lib/app.php:140 -msgid "Pager" -msgstr "传呼机" - -#: lib/app.php:146 -msgid "Internet" -msgstr "互联网" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "生日" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "移动电话" + +#: lib/app.php:203 +msgid "Text" +msgstr "文本" + +#: lib/app.php:204 +msgid "Voice" +msgstr "语音" + +#: lib/app.php:205 +msgid "Message" +msgstr "消息" + +#: lib/app.php:206 +msgid "Fax" +msgstr "传真" + +#: lib/app.php:207 +msgid "Video" +msgstr "视频" + +#: lib/app.php:208 +msgid "Pager" +msgstr "传呼机" + +#: lib/app.php:215 +msgid "Internet" +msgstr "互联网" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "生日" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -439,6 +483,14 @@ msgstr "{name} 的生日" msgid "Contact" msgstr "联系人" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "添加联系人" @@ -535,13 +587,18 @@ msgstr "自定义格式,简称,全名,姓在前,姓在前并用逗号分 msgid "Edit name details" msgstr "编辑名称详情" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "组织" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "删除" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "昵称" @@ -549,7 +606,7 @@ msgstr "昵称" msgid "Enter nickname" msgstr "输入昵称" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -565,7 +622,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "yyyy-mm-dd" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "分组" @@ -577,63 +634,84 @@ msgstr "用逗号隔开分组" msgid "Edit groups" msgstr "编辑分组" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "偏好" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "请指定合法的电子邮件地址" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "输入电子邮件地址" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "发送邮件到地址" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "删除电子邮件地址" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "输入电话号码" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "删除电话号码" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "在地图上显示" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "编辑地址细节。" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "添加注释。" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "添加字段" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "电话" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "电子邮件" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "地址" + +#: templates/part.contact.php:133 msgid "Note" msgstr "注释" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "下载联系人" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "删除联系人" @@ -804,19 +882,15 @@ msgstr "您的地址簿中没有联系人。" msgid "Add contact" msgstr "添加联系人" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "配置地址簿" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -845,33 +919,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "下载" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "编辑" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "新建地址簿" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "保存" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "取消" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/zh_CN/files.po b/l10n/zh_CN/files.po index 2c67531722..8698bb536d 100644 --- a/l10n/zh_CN/files.po +++ b/l10n/zh_CN/files.po @@ -3,14 +3,16 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. +# , 2012. # , 2011, 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 01:52+0000\n" +"Last-Translator: hanfeng \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -52,87 +54,83 @@ msgstr "写入磁盘失败" msgid "Files" msgstr "文件" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:111 templates/index.php:56 msgid "Delete" msgstr "删除" #: js/filelist.js:141 msgid "already exists" -msgstr "" +msgstr "已经存在" #: js/filelist.js:141 msgid "replace" -msgstr "" +msgstr "替换" #: js/filelist.js:141 msgid "cancel" -msgstr "" +msgstr "取消" #: js/filelist.js:195 msgid "replaced" -msgstr "" +msgstr "已经替换" #: js/filelist.js:195 msgid "with" -msgstr "" +msgstr "随着" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" -msgstr "" +msgstr "撤销" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" -msgstr "" +msgstr "已经删除" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "正在生成 ZIP 文件,可能需要一些时间" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "无法上传文件,因为它是一个目录或者大小为 0 字节" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "上传错误" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "操作等待中" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "上传已取消" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "非法的名称,不允许使用‘/’。" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "大小" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "修改日期" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "文件夹" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "文件夹" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "文件" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "文件" diff --git a/l10n/zh_CN/files_sharing.po b/l10n/zh_CN/files_sharing.po index 60a76214fe..6c3271e513 100644 --- a/l10n/zh_CN/files_sharing.po +++ b/l10n/zh_CN/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/zh_CN/gallery.po b/l10n/zh_CN/gallery.po index 23d106c760..e268331a6e 100644 --- a/l10n/zh_CN/gallery.po +++ b/l10n/zh_CN/gallery.po @@ -4,93 +4,38 @@ # # Translators: # Bartek , 2012. +# , 2012. # , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-06-06 00:12+0200\n" -"PO-Revision-Date: 2012-06-05 22:15+0000\n" -"Last-Translator: icewind \n" -"Language-Team: Chinese (China) (http://www.transifex.net/projects/p/owncloud/language/zh_CN/)\n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 05:50+0000\n" +"Last-Translator: leonfeng \n" +"Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" -#: appinfo/app.php:37 +#: appinfo/app.php:39 msgid "Pictures" msgstr "图片" -#: js/album_cover.js:44 +#: js/pictures.js:12 msgid "Share gallery" -msgstr "" +msgstr "分享图库" -#: js/album_cover.js:64 js/album_cover.js:100 js/album_cover.js:133 +#: js/pictures.js:32 msgid "Error: " -msgstr "" +msgstr "错误:" -#: js/album_cover.js:64 js/album_cover.js:100 +#: js/pictures.js:32 msgid "Internal error" -msgstr "" +msgstr "内部错误" -#: js/album_cover.js:114 -msgid "Scanning root" -msgstr "" - -#: js/album_cover.js:115 -msgid "Default order" -msgstr "" - -#: js/album_cover.js:116 -msgid "Ascending" -msgstr "" - -#: js/album_cover.js:116 -msgid "Descending" -msgstr "" - -#: js/album_cover.js:117 templates/index.php:19 -msgid "Settings" -msgstr "设置" - -#: js/album_cover.js:122 -msgid "Scanning root cannot be empty" -msgstr "" - -#: js/album_cover.js:122 js/album_cover.js:133 -msgid "Error" -msgstr "" - -#: templates/index.php:16 -msgid "Rescan" -msgstr "重新扫描" - -#: templates/index.php:17 -msgid "Stop" -msgstr "停止" - -#: templates/index.php:18 -msgid "Share" -msgstr "分享" - -#: templates/view_album.php:19 -msgid "Back" -msgstr "返回" - -#: templates/view_album.php:36 -msgid "Remove confirmation" -msgstr "移除确认" - -#: templates/view_album.php:37 -msgid "Do you want to remove album" -msgstr "您是否想要移除相册" - -#: templates/view_album.php:40 -msgid "Change album name" -msgstr "修改相册名称" - -#: templates/view_album.php:43 -msgid "New album name" -msgstr "新相册名称" +#: templates/index.php:27 +msgid "Slideshow" +msgstr "幻灯片" diff --git a/l10n/zh_CN/lib.po b/l10n/zh_CN/lib.po index 35460873c8..4a52e2838c 100644 --- a/l10n/zh_CN/lib.po +++ b/l10n/zh_CN/lib.po @@ -3,13 +3,14 @@ # This file is distributed under the same license as the PACKAGE package. # # Translators: +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-28 02:02+0200\n" -"PO-Revision-Date: 2012-07-27 22:23+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-23 12:13+0000\n" +"Last-Translator: leonfeng \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,96 +18,96 @@ msgstr "" "Language: zh_CN\n" "Plural-Forms: nplurals=1; plural=0\n" -#: app.php:287 +#: app.php:288 msgid "Help" -msgstr "" +msgstr "帮助" -#: app.php:294 +#: app.php:295 msgid "Personal" -msgstr "" +msgstr "个人" -#: app.php:299 +#: app.php:300 msgid "Settings" -msgstr "" +msgstr "设置" -#: app.php:304 +#: app.php:305 msgid "Users" -msgstr "" +msgstr "用户" -#: app.php:311 +#: app.php:312 msgid "Apps" -msgstr "" +msgstr "应用" -#: app.php:313 +#: app.php:314 msgid "Admin" -msgstr "" +msgstr "管理" -#: files.php:245 +#: files.php:276 msgid "ZIP download is turned off." -msgstr "" +msgstr "ZIP 下载已经关闭" -#: files.php:246 +#: files.php:277 msgid "Files need to be downloaded one by one." -msgstr "" +msgstr "需要逐一下载文件" -#: files.php:246 files.php:271 +#: files.php:277 files.php:302 msgid "Back to Files" -msgstr "" +msgstr "回到文件" -#: files.php:270 +#: files.php:301 msgid "Selected files too large to generate zip file." -msgstr "" +msgstr "选择的文件太大,无法生成 zip 文件。" #: json.php:28 msgid "Application is not enabled" -msgstr "" +msgstr "不需要程序" #: json.php:39 json.php:63 json.php:75 msgid "Authentication error" -msgstr "" +msgstr "认证错误" #: json.php:51 msgid "Token expired. Please reload page." -msgstr "" +msgstr "Token 过期,请刷新页面。" #: template.php:86 msgid "seconds ago" -msgstr "" +msgstr "几秒前" #: template.php:87 msgid "1 minute ago" -msgstr "" +msgstr "1分钟前" #: template.php:88 #, php-format msgid "%d minutes ago" -msgstr "" +msgstr "%d 分钟前" #: template.php:91 msgid "today" -msgstr "" +msgstr "今天" #: template.php:92 msgid "yesterday" -msgstr "" +msgstr "昨天" #: template.php:93 #, php-format msgid "%d days ago" -msgstr "" +msgstr "%d 天前" #: template.php:94 msgid "last month" -msgstr "" +msgstr "上月" #: template.php:95 msgid "months ago" -msgstr "" +msgstr "几月前" #: template.php:96 msgid "last year" -msgstr "" +msgstr "上年" #: template.php:97 msgid "years ago" -msgstr "" +msgstr "几年前" diff --git a/l10n/zh_CN/settings.po b/l10n/zh_CN/settings.po index 14d709456d..7dffc01ef6 100644 --- a/l10n/zh_CN/settings.po +++ b/l10n/zh_CN/settings.po @@ -10,9 +10,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-19 02:02+0200\n" +"PO-Revision-Date: 2012-08-18 05:49+0000\n" +"Last-Translator: leonfeng \n" "Language-Team: Chinese (China) (http://www.transifex.com/projects/p/owncloud/language/zh_CN/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -22,7 +22,7 @@ msgstr "" #: ajax/apps/ocs.php:23 msgid "Unable to load list from App Store" -msgstr "" +msgstr "无法从应用商店载入列表" #: ajax/lostpassword.php:14 msgid "Email saved" @@ -42,7 +42,7 @@ msgstr "非法请求" #: ajax/removeuser.php:13 ajax/setquota.php:18 ajax/togglegroups.php:18 msgid "Authentication error" -msgstr "" +msgstr "认证错误" #: ajax/setlanguage.php:18 msgid "Language changed" @@ -50,7 +50,7 @@ msgstr "语言已修改" #: js/apps.js:18 msgid "Error" -msgstr "" +msgstr "错误" #: js/apps.js:39 js/apps.js:73 msgid "Disable" @@ -70,15 +70,15 @@ msgstr "简体中文" #: templates/admin.php:14 msgid "Security Warning" -msgstr "" +msgstr "安全警告" #: templates/admin.php:29 msgid "Cron" -msgstr "" +msgstr "计划任务" #: templates/admin.php:31 msgid "execute one task with each page loaded" -msgstr "" +msgstr "为每个装入的页面执行任务" #: templates/admin.php:33 msgid "cron.php is registered at a webcron service" @@ -86,7 +86,7 @@ msgstr "" #: templates/admin.php:35 msgid "use systems cron service" -msgstr "" +msgstr "实现系统 cron 服务" #: templates/admin.php:39 msgid "Log" @@ -229,8 +229,8 @@ msgid "Other" msgstr "其它" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" -msgstr "" +msgid "Group Admin" +msgstr "组管理" #: templates/users.php:82 msgid "Quota" diff --git a/l10n/zh_TW/contacts.po b/l10n/zh_TW/contacts.po index d3df1f2810..254da03e8b 100644 --- a/l10n/zh_TW/contacts.po +++ b/l10n/zh_TW/contacts.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-11 02:02+0200\n" -"PO-Revision-Date: 2012-08-11 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-24 02:02+0200\n" +"PO-Revision-Date: 2012-08-24 00:03+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -24,7 +24,7 @@ msgid "Error (de)activating addressbook." msgstr "在啟用或關閉電話簿時發生錯誤" #: ajax/addressbook/delete.php:31 ajax/addressbook/update.php:20 -#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:31 +#: ajax/contact/addproperty.php:42 ajax/contact/delete.php:32 #: ajax/contact/saveproperty.php:39 msgid "id is not set." msgstr "" @@ -81,18 +81,18 @@ msgstr "至少必須填寫一欄地址" msgid "Trying to add duplicate property: " msgstr "" -#: ajax/contact/addproperty.php:144 -msgid "Error adding contact property: " +#: ajax/contact/addproperty.php:115 ajax/contact/saveproperty.php:93 +msgid "Missing IM parameter." +msgstr "" + +#: ajax/contact/addproperty.php:119 ajax/contact/saveproperty.php:97 +msgid "Unknown IM: " msgstr "" #: ajax/contact/deleteproperty.php:37 msgid "Information about vCard is incorrect. Please reload the page." msgstr "有關 vCard 的資訊不正確,請重新載入此頁。" -#: ajax/contact/deleteproperty.php:44 -msgid "Error deleting contact property." -msgstr "刪除通訊錄內容中發生錯誤" - #: ajax/contact/details.php:31 msgid "Missing ID" msgstr "遺失ID" @@ -113,10 +113,6 @@ msgstr "" msgid "Something went FUBAR. " msgstr "" -#: ajax/contact/saveproperty.php:144 -msgid "Error updating contact property." -msgstr "更新通訊錄內容中發生錯誤" - #: ajax/currentphoto.php:30 ajax/oc_photo.php:28 ajax/uploadphoto.php:36 #: ajax/uploadphoto.php:68 msgid "No contact ID was submitted." @@ -220,7 +216,7 @@ msgstr "" msgid "No file was uploaded. Unknown error" msgstr "" -#: appinfo/app.php:19 +#: appinfo/app.php:21 msgid "Contacts" msgstr "通訊錄" @@ -237,57 +233,74 @@ msgid "Couldn't get a valid address." msgstr "" #: js/contacts.js:76 js/contacts.js:365 js/contacts.js:381 js/contacts.js:393 -#: js/contacts.js:675 js/contacts.js:715 js/contacts.js:741 js/contacts.js:850 -#: js/contacts.js:856 js/contacts.js:868 js/contacts.js:902 -#: js/contacts.js:1165 js/contacts.js:1173 js/contacts.js:1182 -#: js/contacts.js:1217 js/contacts.js:1249 js/contacts.js:1261 -#: js/contacts.js:1284 js/contacts.js:1421 js/contacts.js:1452 -#: js/settings.js:25 js/settings.js:42 js/settings.js:67 +#: js/contacts.js:723 js/contacts.js:763 js/contacts.js:789 js/contacts.js:921 +#: js/contacts.js:927 js/contacts.js:939 js/contacts.js:976 +#: js/contacts.js:1250 js/contacts.js:1258 js/contacts.js:1267 +#: js/contacts.js:1302 js/contacts.js:1338 js/contacts.js:1353 +#: js/contacts.js:1379 js/contacts.js:1609 js/contacts.js:1644 +#: js/contacts.js:1664 js/settings.js:26 js/settings.js:43 js/settings.js:68 msgid "Error" msgstr "" -#: js/contacts.js:715 +#: js/contacts.js:424 +msgid "You do not have permission to add contacts to " +msgstr "" + +#: js/contacts.js:425 +msgid "Please select one of your own address books." +msgstr "" + +#: js/contacts.js:425 +msgid "Permission error" +msgstr "" + +#: js/contacts.js:763 msgid "This property has to be non-empty." msgstr "" -#: js/contacts.js:741 +#: js/contacts.js:789 msgid "Couldn't serialize elements." msgstr "" -#: js/contacts.js:850 js/contacts.js:868 +#: js/contacts.js:921 js/contacts.js:939 msgid "" "'deleteProperty' called without type argument. Please report at " "bugs.owncloud.org" msgstr "" -#: js/contacts.js:884 +#: js/contacts.js:958 msgid "Edit name" msgstr "" -#: js/contacts.js:1165 +#: js/contacts.js:1250 msgid "No files selected for upload." msgstr "" -#: js/contacts.js:1173 +#: js/contacts.js:1258 msgid "" "The file you are trying to upload exceed the maximum size for file uploads " "on this server." msgstr "" -#: js/contacts.js:1236 +#: js/contacts.js:1322 msgid "Error loading profile picture." msgstr "" -#: js/contacts.js:1337 js/contacts.js:1371 +#: js/contacts.js:1457 js/contacts.js:1498 js/contacts.js:1517 +#: js/contacts.js:1560 msgid "Select type" msgstr "" -#: js/contacts.js:1390 +#: js/contacts.js:1578 msgid "" "Some contacts are marked for deletion, but not deleted yet. Please wait for " "them to be deleted." msgstr "" +#: js/contacts.js:1649 +msgid "Do you want to merge these address books?" +msgstr "" + #: js/loader.js:49 msgid "Result: " msgstr "" @@ -300,7 +313,7 @@ msgstr "" msgid " failed." msgstr "" -#: js/settings.js:67 +#: js/settings.js:68 msgid "Displayname cannot be empty." msgstr "" @@ -308,125 +321,156 @@ msgstr "" msgid "Addressbook not found: " msgstr "" -#: lib/app.php:49 +#: lib/app.php:52 msgid "This is not your addressbook." msgstr "這不是你的電話簿" -#: lib/app.php:68 +#: lib/app.php:71 msgid "Contact could not be found." msgstr "通訊錄未發現" -#: lib/app.php:112 templates/part.contact.php:117 -msgid "Address" -msgstr "地址" +#: lib/app.php:116 +msgid "Jabber" +msgstr "" -#: lib/app.php:113 -msgid "Telephone" -msgstr "電話" +#: lib/app.php:121 +msgid "AIM" +msgstr "" -#: lib/app.php:114 templates/part.contact.php:116 -msgid "Email" -msgstr "電子郵件" +#: lib/app.php:126 +msgid "MSN" +msgstr "" -#: lib/app.php:115 templates/part.contact.php:39 templates/part.contact.php:40 -#: templates/part.contact.php:112 -msgid "Organization" -msgstr "組織" +#: lib/app.php:131 +msgid "Twitter" +msgstr "" -#: lib/app.php:127 lib/app.php:134 lib/app.php:144 lib/app.php:197 +#: lib/app.php:136 +msgid "GoogleTalk" +msgstr "" + +#: lib/app.php:141 +msgid "Facebook" +msgstr "" + +#: lib/app.php:146 +msgid "XMPP" +msgstr "" + +#: lib/app.php:151 +msgid "ICQ" +msgstr "" + +#: lib/app.php:156 +msgid "Yahoo" +msgstr "" + +#: lib/app.php:161 +msgid "Skype" +msgstr "" + +#: lib/app.php:166 +msgid "QQ" +msgstr "" + +#: lib/app.php:171 +msgid "GaduGadu" +msgstr "" + +#: lib/app.php:194 lib/app.php:202 lib/app.php:213 lib/app.php:266 msgid "Work" msgstr "公司" -#: lib/app.php:128 lib/app.php:132 lib/app.php:145 +#: lib/app.php:195 lib/app.php:200 lib/app.php:214 msgid "Home" msgstr "住宅" -#: lib/app.php:133 -msgid "Mobile" -msgstr "行動電話" - -#: lib/app.php:135 -msgid "Text" -msgstr "文字" - -#: lib/app.php:136 -msgid "Voice" -msgstr "語音" - -#: lib/app.php:137 -msgid "Message" -msgstr "訊息" - -#: lib/app.php:138 -msgid "Fax" -msgstr "傳真" - -#: lib/app.php:139 -msgid "Video" -msgstr "影片" - -#: lib/app.php:140 -msgid "Pager" -msgstr "呼叫器" - -#: lib/app.php:146 -msgid "Internet" -msgstr "網際網路" - -#: lib/app.php:183 templates/part.contact.php:45 -#: templates/part.contact.php:114 -msgid "Birthday" -msgstr "生日" - -#: lib/app.php:184 -msgid "Business" -msgstr "" - -#: lib/app.php:185 -msgid "Call" -msgstr "" - -#: lib/app.php:186 -msgid "Clients" -msgstr "" - -#: lib/app.php:187 -msgid "Deliverer" -msgstr "" - -#: lib/app.php:188 -msgid "Holidays" -msgstr "" - -#: lib/app.php:189 -msgid "Ideas" -msgstr "" - -#: lib/app.php:190 -msgid "Journey" -msgstr "" - -#: lib/app.php:191 -msgid "Jubilee" -msgstr "" - -#: lib/app.php:192 -msgid "Meeting" -msgstr "" - -#: lib/app.php:193 +#: lib/app.php:196 lib/app.php:209 lib/app.php:262 lib/vcard.php:593 msgid "Other" msgstr "" -#: lib/app.php:194 +#: lib/app.php:201 +msgid "Mobile" +msgstr "行動電話" + +#: lib/app.php:203 +msgid "Text" +msgstr "文字" + +#: lib/app.php:204 +msgid "Voice" +msgstr "語音" + +#: lib/app.php:205 +msgid "Message" +msgstr "訊息" + +#: lib/app.php:206 +msgid "Fax" +msgstr "傳真" + +#: lib/app.php:207 +msgid "Video" +msgstr "影片" + +#: lib/app.php:208 +msgid "Pager" +msgstr "呼叫器" + +#: lib/app.php:215 +msgid "Internet" +msgstr "網際網路" + +#: lib/app.php:252 templates/part.contact.php:45 +#: templates/part.contact.php:128 +msgid "Birthday" +msgstr "生日" + +#: lib/app.php:253 +msgid "Business" +msgstr "" + +#: lib/app.php:254 +msgid "Call" +msgstr "" + +#: lib/app.php:255 +msgid "Clients" +msgstr "" + +#: lib/app.php:256 +msgid "Deliverer" +msgstr "" + +#: lib/app.php:257 +msgid "Holidays" +msgstr "" + +#: lib/app.php:258 +msgid "Ideas" +msgstr "" + +#: lib/app.php:259 +msgid "Journey" +msgstr "" + +#: lib/app.php:260 +msgid "Jubilee" +msgstr "" + +#: lib/app.php:261 +msgid "Meeting" +msgstr "" + +#: lib/app.php:263 msgid "Personal" msgstr "" -#: lib/app.php:195 +#: lib/app.php:264 msgid "Projects" msgstr "" -#: lib/app.php:196 +#: lib/app.php:265 msgid "Questions" msgstr "" @@ -438,6 +482,14 @@ msgstr "{name}的生日" msgid "Contact" msgstr "通訊錄" +#: lib/vcard.php:408 +msgid "You do not have the permissions to edit this contact." +msgstr "" + +#: lib/vcard.php:483 +msgid "You do not have the permissions to delete this contact." +msgstr "" + #: templates/index.php:14 msgid "Add Contact" msgstr "添加通訊錄" @@ -534,13 +586,18 @@ msgstr "" msgid "Edit name details" msgstr "編輯姓名詳細資訊" +#: templates/part.contact.php:39 templates/part.contact.php:40 +#: templates/part.contact.php:126 +msgid "Organization" +msgstr "組織" + #: templates/part.contact.php:40 templates/part.contact.php:42 #: templates/part.contact.php:44 templates/part.contact.php:46 -#: templates/part.contact.php:50 templates/settings.php:33 +#: templates/part.contact.php:50 templates/settings.php:36 msgid "Delete" msgstr "刪除" -#: templates/part.contact.php:41 templates/part.contact.php:113 +#: templates/part.contact.php:41 templates/part.contact.php:127 msgid "Nickname" msgstr "綽號" @@ -548,7 +605,7 @@ msgstr "綽號" msgid "Enter nickname" msgstr "輸入綽號" -#: templates/part.contact.php:43 templates/part.contact.php:119 +#: templates/part.contact.php:43 templates/part.contact.php:134 msgid "Web site" msgstr "" @@ -564,7 +621,7 @@ msgstr "" msgid "dd-mm-yyyy" msgstr "dd-mm-yyyy" -#: templates/part.contact.php:47 templates/part.contact.php:120 +#: templates/part.contact.php:47 templates/part.contact.php:135 msgid "Groups" msgstr "群組" @@ -576,63 +633,84 @@ msgstr "用逗號分隔群組" msgid "Edit groups" msgstr "編輯群組" -#: templates/part.contact.php:63 templates/part.contact.php:77 +#: templates/part.contact.php:59 templates/part.contact.php:73 +#: templates/part.contact.php:98 msgid "Preferred" msgstr "首選" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Please specify a valid email address." msgstr "註填入合法的電子郵件住址" -#: templates/part.contact.php:64 +#: templates/part.contact.php:60 msgid "Enter email address" msgstr "輸入電子郵件地址" -#: templates/part.contact.php:68 +#: templates/part.contact.php:64 msgid "Mail to address" msgstr "寄送住址" -#: templates/part.contact.php:69 +#: templates/part.contact.php:65 msgid "Delete email address" msgstr "刪除電子郵件住址" -#: templates/part.contact.php:78 +#: templates/part.contact.php:75 msgid "Enter phone number" msgstr "輸入電話號碼" -#: templates/part.contact.php:82 +#: templates/part.contact.php:79 msgid "Delete phone number" msgstr "刪除電話號碼" -#: templates/part.contact.php:92 +#: templates/part.contact.php:100 +msgid "Instant Messenger" +msgstr "" + +#: templates/part.contact.php:101 +msgid "Delete IM" +msgstr "" + +#: templates/part.contact.php:110 msgid "View on map" msgstr "" -#: templates/part.contact.php:92 +#: templates/part.contact.php:110 msgid "Edit address details" msgstr "電子郵件住址詳細資訊" -#: templates/part.contact.php:103 +#: templates/part.contact.php:116 msgid "Add notes here." msgstr "在這裡新增註解" -#: templates/part.contact.php:110 +#: templates/part.contact.php:124 msgid "Add field" msgstr "新增欄位" -#: templates/part.contact.php:115 +#: templates/part.contact.php:129 msgid "Phone" msgstr "電話" -#: templates/part.contact.php:118 +#: templates/part.contact.php:130 +msgid "Email" +msgstr "電子郵件" + +#: templates/part.contact.php:131 +msgid "Instant Messaging" +msgstr "" + +#: templates/part.contact.php:132 +msgid "Address" +msgstr "地址" + +#: templates/part.contact.php:133 msgid "Note" msgstr "註解" -#: templates/part.contact.php:123 +#: templates/part.contact.php:138 msgid "Download contact" msgstr "下載通訊錄" -#: templates/part.contact.php:124 +#: templates/part.contact.php:139 msgid "Delete contact" msgstr "刪除通訊錄" @@ -803,19 +881,15 @@ msgstr "" msgid "Add contact" msgstr "" -#: templates/part.no_contacts.php:6 -msgid "Configure addressbooks" -msgstr "" - #: templates/part.selectaddressbook.php:1 msgid "Select Address Books" msgstr "" -#: templates/part.selectaddressbook.php:20 +#: templates/part.selectaddressbook.php:27 msgid "Enter name" msgstr "" -#: templates/part.selectaddressbook.php:22 +#: templates/part.selectaddressbook.php:29 msgid "Enter description" msgstr "" @@ -844,33 +918,37 @@ msgid "Show read-only VCF link" msgstr "" #: templates/settings.php:26 +msgid "Share" +msgstr "" + +#: templates/settings.php:29 msgid "Download" msgstr "下載" -#: templates/settings.php:30 +#: templates/settings.php:33 msgid "Edit" msgstr "編輯" -#: templates/settings.php:40 +#: templates/settings.php:43 msgid "New Address Book" msgstr "新電話簿" -#: templates/settings.php:41 +#: templates/settings.php:44 msgid "Name" msgstr "" -#: templates/settings.php:42 +#: templates/settings.php:45 msgid "Description" msgstr "" -#: templates/settings.php:43 +#: templates/settings.php:46 msgid "Save" msgstr "儲存" -#: templates/settings.php:44 +#: templates/settings.php:47 msgid "Cancel" msgstr "取消" -#: templates/settings.php:49 +#: templates/settings.php:52 msgid "More..." msgstr "" diff --git a/l10n/zh_TW/files.po b/l10n/zh_TW/files.po index 8c8f682614..627c3aa115 100644 --- a/l10n/zh_TW/files.po +++ b/l10n/zh_TW/files.po @@ -9,9 +9,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-07-31 22:53+0200\n" -"PO-Revision-Date: 2012-07-31 20:54+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-21 02:03+0200\n" +"PO-Revision-Date: 2012-08-21 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -53,11 +53,7 @@ msgstr "寫入硬碟失敗" msgid "Files" msgstr "檔案" -#: js/fileactions.js:95 -msgid "Unshare" -msgstr "" - -#: js/fileactions.js:97 templates/index.php:56 +#: js/fileactions.js:107 templates/index.php:56 msgid "Delete" msgstr "刪除" @@ -81,59 +77,59 @@ msgstr "" msgid "with" msgstr "" -#: js/filelist.js:195 js/filelist.js:256 +#: js/filelist.js:195 js/filelist.js:246 msgid "undo" msgstr "" -#: js/filelist.js:256 +#: js/filelist.js:246 msgid "deleted" msgstr "" -#: js/files.js:170 +#: js/files.js:171 msgid "generating ZIP-file, it may take some time." msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Unable to upload your file as it is a directory or has 0 bytes" msgstr "" -#: js/files.js:199 +#: js/files.js:200 msgid "Upload Error" msgstr "" -#: js/files.js:227 js/files.js:318 js/files.js:347 +#: js/files.js:228 js/files.js:319 js/files.js:348 msgid "Pending" msgstr "" -#: js/files.js:332 +#: js/files.js:333 msgid "Upload cancelled." msgstr "" -#: js/files.js:456 +#: js/files.js:457 msgid "Invalid name, '/' is not allowed." msgstr "" -#: js/files.js:631 templates/index.php:55 +#: js/files.js:703 templates/index.php:55 msgid "Size" msgstr "大小" -#: js/files.js:632 templates/index.php:56 +#: js/files.js:704 templates/index.php:56 msgid "Modified" msgstr "修改" -#: js/files.js:659 +#: js/files.js:731 msgid "folder" msgstr "" -#: js/files.js:661 +#: js/files.js:733 msgid "folders" msgstr "" -#: js/files.js:669 +#: js/files.js:741 msgid "file" msgstr "" -#: js/files.js:671 +#: js/files.js:743 msgid "files" msgstr "" diff --git a/l10n/zh_TW/files_sharing.po b/l10n/zh_TW/files_sharing.po index 29566a0bae..4a2aa509e9 100644 --- a/l10n/zh_TW/files_sharing.po +++ b/l10n/zh_TW/files_sharing.po @@ -7,9 +7,9 @@ msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-13 23:12+0200\n" -"PO-Revision-Date: 2012-08-12 22:35+0000\n" -"Last-Translator: FULL NAME \n" +"POT-Creation-Date: 2012-08-23 02:03+0200\n" +"PO-Revision-Date: 2012-08-23 00:04+0000\n" +"Last-Translator: I Robot \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -17,38 +17,18 @@ msgstr "" "Language: zh_TW\n" "Plural-Forms: nplurals=1; plural=0\n" -#: templates/list.php:2 -msgid "Your Shared Files" +#: templates/get.php:4 +msgid "Size" msgstr "" -#: templates/list.php:6 -msgid "Item" +#: templates/get.php:5 +msgid "Modified" msgstr "" -#: templates/list.php:7 -msgid "Shared With" +#: templates/get.php:5 +msgid "Delete all" msgstr "" -#: templates/list.php:8 -msgid "Permissions" -msgstr "" - -#: templates/list.php:16 -msgid "Read" -msgstr "" - -#: templates/list.php:16 -msgid "Edit" -msgstr "" - -#: templates/list.php:16 templates/list.php:17 +#: templates/get.php:5 msgid "Delete" msgstr "" - -#: templates/settings.php:3 -msgid "Enable Resharing" -msgstr "" - -#: templates/settings.php:4 -msgid "Allow users to reshare files they don't own" -msgstr "" diff --git a/l10n/zh_TW/settings.po b/l10n/zh_TW/settings.po index 890940b397..d333fc726b 100644 --- a/l10n/zh_TW/settings.po +++ b/l10n/zh_TW/settings.po @@ -4,13 +4,14 @@ # # Translators: # Donahue Chuang , 2012. +# , 2012. msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: http://bugs.owncloud.org/\n" -"POT-Creation-Date: 2012-08-12 02:02+0200\n" -"PO-Revision-Date: 2012-08-12 00:03+0000\n" -"Last-Translator: owncloud_robot \n" +"POT-Creation-Date: 2012-08-25 02:04+0200\n" +"PO-Revision-Date: 2012-08-24 03:42+0000\n" +"Last-Translator: weiyu \n" "Language-Team: Chinese (Taiwan) (http://www.transifex.com/projects/p/owncloud/language/zh_TW/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -188,7 +189,7 @@ msgstr "你的電子郵件信箱" #: templates/personal.php:32 msgid "Fill in an email address to enable password recovery" -msgstr "請甜入店子郵件信箱以便回復密碼" +msgstr "請填入電子郵件信箱以便回復密碼" #: templates/personal.php:38 templates/personal.php:39 msgid "Language" @@ -227,7 +228,7 @@ msgid "Other" msgstr "其他" #: templates/users.php:80 templates/users.php:112 -msgid "SubAdmin" +msgid "Group Admin" msgstr "" #: templates/users.php:82 diff --git a/lib/app.php b/lib/app.php index 1c91818ca7..7431590346 100755 --- a/lib/app.php +++ b/lib/app.php @@ -147,7 +147,7 @@ class OC_App{ if(!OC_Config::getValue('installed', false)) return array(); $apps=array('files'); - $query = OC_DB::prepare( 'SELECT appid FROM *PREFIX*appconfig WHERE configkey = \'enabled\' AND configvalue=\'yes\'' ); + $query = OC_DB::prepare( 'SELECT `appid` FROM `*PREFIX*appconfig` WHERE `configkey` = \'enabled\' AND `configvalue`=\'yes\'' ); $result=$query->execute(); while($row=$result->fetchRow()){ if(array_search($row['appid'],$apps)===false){ @@ -586,7 +586,7 @@ class OC_App{ return $versions; // when function is used besides in checkUpgrade } $versions=array(); - $query = OC_DB::prepare( 'SELECT appid, configvalue FROM *PREFIX*appconfig WHERE configkey = \'installed_version\'' ); + $query = OC_DB::prepare( 'SELECT `appid`, `configvalue` FROM `*PREFIX*appconfig` WHERE `configkey` = \'installed_version\'' ); $result = $query->execute(); while($row = $result->fetchRow()){ $versions[$row['appid']]=$row['configvalue']; diff --git a/lib/appconfig.php b/lib/appconfig.php index c6216974dd..372cded9a5 100644 --- a/lib/appconfig.php +++ b/lib/appconfig.php @@ -47,7 +47,7 @@ class OC_Appconfig{ */ public static function getApps(){ // No magic in here! - $query = OC_DB::prepare( 'SELECT DISTINCT appid FROM *PREFIX*appconfig' ); + $query = OC_DB::prepare( 'SELECT DISTINCT `appid` FROM `*PREFIX*appconfig`' ); $result = $query->execute(); $apps = array(); @@ -68,7 +68,7 @@ class OC_Appconfig{ */ public static function getKeys( $app ){ // No magic in here as well - $query = OC_DB::prepare( 'SELECT configkey FROM *PREFIX*appconfig WHERE appid = ?' ); + $query = OC_DB::prepare( 'SELECT `configkey` FROM `*PREFIX*appconfig` WHERE `appid` = ?' ); $result = $query->execute( array( $app )); $keys = array(); @@ -91,7 +91,7 @@ class OC_Appconfig{ */ public static function getValue( $app, $key, $default = null ){ // At least some magic in here :-) - $query = OC_DB::prepare( 'SELECT configvalue FROM *PREFIX*appconfig WHERE appid = ? AND configkey = ?' ); + $query = OC_DB::prepare( 'SELECT `configvalue` FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?' ); $result = $query->execute( array( $app, $key )); $row = $result->fetchRow(); if($row){ @@ -124,11 +124,11 @@ class OC_Appconfig{ public static function setValue( $app, $key, $value ){ // Does the key exist? yes: update. No: insert if(! self::hasKey($app,$key)){ - $query = OC_DB::prepare( 'INSERT INTO *PREFIX*appconfig ( appid, configkey, configvalue ) VALUES( ?, ?, ? )' ); + $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*appconfig` ( `appid`, `configkey`, `configvalue` ) VALUES( ?, ?, ? )' ); $query->execute( array( $app, $key, $value )); } else{ - $query = OC_DB::prepare( 'UPDATE *PREFIX*appconfig SET configvalue = ? WHERE appid = ? AND configkey = ?' ); + $query = OC_DB::prepare( 'UPDATE `*PREFIX*appconfig` SET `configvalue` = ? WHERE `appid` = ? AND `configkey` = ?' ); $query->execute( array( $value, $app, $key )); } } @@ -143,7 +143,7 @@ class OC_Appconfig{ */ public static function deleteKey( $app, $key ){ // Boring! - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*appconfig WHERE appid = ? AND configkey = ?' ); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ? AND `configkey` = ?' ); $query->execute( array( $app, $key )); return true; @@ -158,7 +158,7 @@ class OC_Appconfig{ */ public static function deleteApp( $app ){ // Nothing special - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*appconfig WHERE appid = ?' ); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*appconfig` WHERE `appid` = ?' ); $query->execute( array( $app )); return true; @@ -174,21 +174,21 @@ class OC_Appconfig{ if($app!==false and $key!==false){ return false; } + $fields='`configvalue`'; $where='WHERE'; - $fields='configvalue'; $params=array(); if($app!==false){ - $where.=' appid = ?'; - $fields.=', configkey'; + $fields.=', `configkey`'; + $where.=' `appid` = ?'; $params[]=$app; $key='configkey'; }else{ - $fields.=', appid'; - $where.=' configkey = ?'; + $fields.=', `appid`'; + $where.=' `configkey` = ?'; $params[]=$key; $key='appid'; } - $queryString='SELECT '.$fields.' FROM *PREFIX*appconfig '.$where; + $queryString='SELECT '.$fields.' FROM `*PREFIX*appconfig` '.$where; $query=OC_DB::prepare($queryString); $result=$query->execute($params); $values=array(); diff --git a/lib/archive.php b/lib/archive.php index 113f92e960..fabd7cc7a5 100644 --- a/lib/archive.php +++ b/lib/archive.php @@ -112,4 +112,25 @@ abstract class OC_Archive{ * @return resource */ abstract function getStream($path,$mode); + /** + * add a folder and all it's content + * @param string $path + * @param string source + * @return bool + */ + function addRecursive($path,$source){ + if($dh=opendir($source)){ + $this->addFolder($path); + while($file=readdir($dh)){ + if($file=='.' or $file=='..'){ + continue; + } + if(is_dir($source.'/'.$file)){ + $this->addRecursive($path.'/'.$file,$source.'/'.$file); + }else{ + $this->addFile($path.'/'.$file,$source.'/'.$file); + } + } + } + } } diff --git a/lib/archive/tar.php b/lib/archive/tar.php index 944a0ac4ba..f6efd6d0ec 100644 --- a/lib/archive/tar.php +++ b/lib/archive/tar.php @@ -56,14 +56,21 @@ class OC_Archive_TAR extends OC_Archive{ * @return bool */ function addFolder($path){ - $tmpBase=get_temp_dir().'/'; + $tmpBase=OC_Helper::tmpFolder(); if(substr($path,-1,1)!='/'){ $path.='/'; } if($this->fileExists($path)){ return false; } - mkdir($tmpBase.$path); + $parts=explode('/',$path); + $folder=$tmpBase; + foreach($parts as $part){ + $folder.='/'.$part; + if(!is_dir($folder)){ + mkdir($folder); + } + } $result=$this->tar->addModify(array($tmpBase.$path),'',$tmpBase); rmdir($tmpBase.$path); $this->fileList=false; @@ -79,7 +86,7 @@ class OC_Archive_TAR extends OC_Archive{ if($this->fileExists($path)){ $this->remove($path); } - if(file_exists($source)){ + if($source and $source[0]=='/' and file_exists($source)){ $header=array(); $dummy=''; $this->tar->_openAppend(); diff --git a/lib/archive/zip.php b/lib/archive/zip.php index b2d6674d63..c1a5c35738 100644 --- a/lib/archive/zip.php +++ b/lib/archive/zip.php @@ -36,7 +36,7 @@ class OC_Archive_ZIP extends OC_Archive{ * @return bool */ function addFile($path,$source=''){ - if(file_exists($source)){ + if($source and $source[0]=='/' and file_exists($source)){ $result=$this->zip->addFile($source,$path); }else{ $result=$this->zip->addFromString($path,$source); diff --git a/lib/backgroundjob/queuedtask.php b/lib/backgroundjob/queuedtask.php index 68ba97c1e3..a7ec3efbf3 100644 --- a/lib/backgroundjob/queuedtask.php +++ b/lib/backgroundjob/queuedtask.php @@ -30,7 +30,7 @@ class OC_BackgroundJob_QueuedTask{ * @return associative array */ public static function find( $id ){ - $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*queuedtasks WHERE id = ?' ); + $stmt = OC_DB::prepare( 'SELECT * FROM `*PREFIX*queuedtasks` WHERE `id` = ?' ); $result = $stmt->execute(array($id)); return $result->fetchRow(); } @@ -44,7 +44,7 @@ class OC_BackgroundJob_QueuedTask{ $return = array(); // Get Data - $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*queuedtasks' ); + $stmt = OC_DB::prepare( 'SELECT * FROM `*PREFIX*queuedtasks`' ); $result = $stmt->execute(array()); while( $row = $result->fetchRow()){ $return[] = $row; @@ -63,7 +63,7 @@ class OC_BackgroundJob_QueuedTask{ $return = array(); // Get Data - $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*queuedtasks WHERE app = ?' ); + $stmt = OC_DB::prepare( 'SELECT * FROM `*PREFIX*queuedtasks` WHERE `app` = ?' ); $result = $stmt->execute(array($app)); while( $row = $result->fetchRow()){ $return[] = $row; @@ -82,7 +82,7 @@ class OC_BackgroundJob_QueuedTask{ * @return id of task */ public static function add( $app, $klass, $method, $parameters ){ - $stmt = OC_DB::prepare( 'INSERT INTO *PREFIX*queuedtasks (app, klass, method, parameters) VALUES(?,?,?,?)' ); + $stmt = OC_DB::prepare( 'INSERT INTO `*PREFIX*queuedtasks` (`app`, `klass`, `method`, `parameters`) VALUES(?,?,?,?)' ); $result = $stmt->execute(array($app, $klass, $method, $parameters )); return OC_DB::insertid(); @@ -96,7 +96,7 @@ class OC_BackgroundJob_QueuedTask{ * Deletes a report */ public static function delete( $id ){ - $stmt = OC_DB::prepare( 'DELETE FROM *PREFIX*queuedtasks WHERE id = ?' ); + $stmt = OC_DB::prepare( 'DELETE FROM `*PREFIX*queuedtasks` WHERE `id` = ?' ); $result = $stmt->execute(array($id)); return true; diff --git a/lib/connector/sabre/directory.php b/lib/connector/sabre/directory.php index 09c65f19b8..cd3ed60292 100644 --- a/lib/connector/sabre/directory.php +++ b/lib/connector/sabre/directory.php @@ -121,7 +121,7 @@ class OC_Connector_Sabre_Directory extends OC_Connector_Sabre_Node implements Sa $properties = array_fill_keys($paths, array()); if(count($paths)>0){ $placeholders = join(',', array_fill(0, count($paths), '?')); - $query = OC_DB::prepare( 'SELECT * FROM *PREFIX*properties WHERE userid = ?' . ' AND propertypath IN ('.$placeholders.')' ); + $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ?' . ' AND `propertypath` IN ('.$placeholders.')' ); array_unshift($paths, OC_User::getUser()); // prepend userid $result = $query->execute( $paths ); while($row = $result->fetchRow()) { diff --git a/lib/connector/sabre/locks.php b/lib/connector/sabre/locks.php index 1db4fc0944..0ddc8b18d2 100644 --- a/lib/connector/sabre/locks.php +++ b/lib/connector/sabre/locks.php @@ -44,7 +44,7 @@ class OC_Connector_Sabre_Locks extends Sabre_DAV_Locks_Backend_Abstract { // NOTE: SQLite requires time() to be inserted directly. That's ugly // but otherwise reading locks from SQLite Databases will return // nothing - $query = 'SELECT * FROM *PREFIX*locks WHERE userid = ? AND (created + timeout) > '.time().' AND (( uri = ?)'; + $query = 'SELECT * FROM `*PREFIX*locks` WHERE `userid` = ? AND (`created` + `timeout`) > '.time().' AND (( `uri` = ?)'; $params = array(OC_User::getUser(),$uri); // We need to check locks for every part in the uri. @@ -60,20 +60,20 @@ class OC_Connector_Sabre_Locks extends Sabre_DAV_Locks_Backend_Abstract { if ($currentPath) $currentPath.='/'; $currentPath.=$part; - $query.=' OR (depth!=0 AND uri = ?)'; + $query.=' OR (`depth` != 0 AND `uri` = ?)'; $params[] = $currentPath; } if ($returnChildLocks) { - $query.=' OR (uri LIKE ?)'; + $query.=' OR (`uri` LIKE ?)'; $params[] = $uri . '/%'; } $query.=')'; - $stmt = OC_DB::prepare($query ); + $stmt = OC_DB::prepare( $query ); $result = $stmt->execute( $params ); $lockList = array(); @@ -116,10 +116,10 @@ class OC_Connector_Sabre_Locks extends Sabre_DAV_Locks_Backend_Abstract { } if ($exists) { - $query = OC_DB::prepare( 'UPDATE *PREFIX*locks SET owner = ?, timeout = ?, scope = ?, depth = ?, uri = ?, created = ? WHERE userid = ? AND token = ?' ); + $query = OC_DB::prepare( 'UPDATE `*PREFIX*locks` SET `owner` = ?, `timeout` = ?, `scope` = ?, `depth` = ?, `uri` = ?, `created` = ? WHERE `userid` = ? AND `token` = ?' ); $result = $query->execute( array($lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,OC_User::getUser(),$lockInfo->token)); } else { - $query = OC_DB::prepare( 'INSERT INTO *PREFIX*locks (userid,owner,timeout,scope,depth,uri,created,token) VALUES (?,?,?,?,?,?,?,?)' ); + $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*locks` (`userid`,`owner`,`timeout`,`scope`,`depth`,`uri`,`created`,`token`) VALUES (?,?,?,?,?,?,?,?)' ); $result = $query->execute( array(OC_User::getUser(),$lockInfo->owner,$lockInfo->timeout,$lockInfo->scope,$lockInfo->depth,$uri,$lockInfo->created,$lockInfo->token)); } @@ -136,7 +136,7 @@ class OC_Connector_Sabre_Locks extends Sabre_DAV_Locks_Backend_Abstract { */ public function unlock($uri,Sabre_DAV_Locks_LockInfo $lockInfo) { - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*locks WHERE userid = ? AND uri=? AND token=?' ); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*locks` WHERE `userid` = ? AND `uri` = ? AND `token` = ?' ); $result = $query->execute( array(OC_User::getUser(),$uri,$lockInfo->token)); return $result->numRows() === 1; diff --git a/lib/connector/sabre/node.php b/lib/connector/sabre/node.php index f268f8b57c..b9bf474a04 100644 --- a/lib/connector/sabre/node.php +++ b/lib/connector/sabre/node.php @@ -83,7 +83,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr $this->path = $newPath; - $query = OC_DB::prepare( 'UPDATE *PREFIX*properties SET propertypath = ? WHERE userid = ? AND propertypath = ?' ); + $query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertypath` = ? WHERE `userid` = ? AND `propertypath` = ?' ); $query->execute( array( $newPath,OC_User::getUser(), $oldPath )); } @@ -146,7 +146,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr // If it was null, we need to delete the property if (is_null($propertyValue)) { if(array_key_exists( $propertyName, $existing )){ - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*properties WHERE userid = ? AND propertypath = ? AND propertyname = ?' ); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = ?' ); $query->execute( array( OC_User::getUser(), $this->path, $propertyName )); } } @@ -155,10 +155,10 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr $this->touch($propertyValue); } else { if(!array_key_exists( $propertyName, $existing )){ - $query = OC_DB::prepare( 'INSERT INTO *PREFIX*properties (userid,propertypath,propertyname,propertyvalue) VALUES(?,?,?,?)' ); + $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*properties` (`userid`,`propertypath`,`propertyname`,`propertyvalue`) VALUES(?,?,?,?)' ); $query->execute( array( OC_User::getUser(), $this->path, $propertyName,$propertyValue )); } else { - $query = OC_DB::prepare( 'UPDATE *PREFIX*properties SET propertyvalue = ? WHERE userid = ? AND propertypath = ? AND propertyname = ?' ); + $query = OC_DB::prepare( 'UPDATE `*PREFIX*properties` SET `propertyvalue` = ? WHERE `userid` = ? AND `propertypath` = ? AND `propertyname` = ?' ); $query->execute( array( $propertyValue,OC_User::getUser(), $this->path, $propertyName )); } } @@ -182,7 +182,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr */ public function getProperties($properties) { if (is_null($this->property_cache)) { - $query = OC_DB::prepare( 'SELECT * FROM *PREFIX*properties WHERE userid = ? AND propertypath = ?' ); + $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*properties` WHERE `userid` = ? AND `propertypath` = ?' ); $result = $query->execute( array( OC_User::getUser(), $this->path )); $this->property_cache = array(); @@ -223,7 +223,7 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr return null; } $etag = '"'.$tag.'"'; - $query = OC_DB::prepare( 'INSERT INTO *PREFIX*properties (userid,propertypath,propertyname,propertyvalue) VALUES(?,?,?,?)' ); + $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*properties` (`userid`,`propertypath`,`propertyname`,`propertyvalue`) VALUES(?,?,?,?)' ); $query->execute( array( OC_User::getUser(), $path, self::GETETAG_PROPERTYNAME, $etag )); return $etag; } @@ -244,10 +244,10 @@ abstract class OC_Connector_Sabre_Node implements Sabre_DAV_INode, Sabre_DAV_IPr } $paths[] = $path; $path_placeholders = join(',', array_fill(0, count($paths), '?')); - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*properties' - .' WHERE userid = ?' - .' AND propertyname = ?' - .' AND propertypath IN ('.$path_placeholders.')' + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*properties`' + .' WHERE `userid` = ?' + .' AND `propertyname` = ?' + .' AND `propertypath` IN ('.$path_placeholders.')' ); $vals = array( OC_User::getUser(), self::GETETAG_PROPERTYNAME ); $query->execute(array_merge( $vals, $paths )); diff --git a/lib/db.php b/lib/db.php index f1928e6823..5ef67202a1 100644 --- a/lib/db.php +++ b/lib/db.php @@ -42,15 +42,18 @@ class OC_DB { * @return BACKEND_MDB2 or BACKEND_PDO */ private static function getDBBackend(){ - $backend=self::BACKEND_MDB2; if(class_exists('PDO') && OC_Config::getValue('installed', false)){//check if we can use PDO, else use MDB2 (installation always needs to be done my mdb2) $type = OC_Config::getValue( "dbtype", "sqlite" ); + if($type=='oci') { //oracle also always needs mdb2 + return self::BACKEND_MDB2; + } if($type=='sqlite3') $type='sqlite'; $drivers=PDO::getAvailableDrivers(); if(array_search($type,$drivers)!==false){ - $backend=self::BACKEND_PDO; + return self::BACKEND_PDO; } } + return self::BACKEND_MDB2; } /** @@ -135,6 +138,13 @@ class OC_DB { $dsn .= ";user='$e_user';password='$e_password'"; /** END OF FIX***/ break; + case 'oci': // Oracle with PDO is unsupported + if ($port) { + $dsn = 'oci:dbname=//' . $host . ':' . $port . '/' . $name; + } else { + $dsn = 'oci:dbname=//' . $host . '/' . $name; + } + break; } try{ self::$PDO=new PDO($dsn,$user,$pass,$opts); @@ -210,6 +220,19 @@ class OC_DB { 'database' => $name ); break; + case 'oci': + $dsn = array( + 'phptype' => 'oci8', + 'username' => $user, + 'password' => $pass, + ); + if ($host != '') { + $dsn['hostspec'] = $host; + $dsn['database'] = $name; + } else { // use dbname for hostspec + $dsn['hostspec'] = $name; + } + break; } // Try to establish connection @@ -220,7 +243,7 @@ class OC_DB { echo( 'can not connect to database, using '.$type.'. ('.self::$MDB2->getUserInfo().')'); OC_Log::write('core',self::$MDB2->getUserInfo(),OC_Log::FATAL); OC_Log::write('core',self::$MDB2->getMessage(),OC_Log::FATAL); - die(); + die( $error ); } // We always, really always want associative arrays @@ -238,7 +261,30 @@ class OC_DB { * * SQL query via MDB2 prepare(), needs to be execute()'d! */ - static public function prepare( $query ){ + static public function prepare( $query , $limit=null, $offset=null ){ + + if (!is_null($limit) && $limit != -1) { + if (self::$backend == self::BACKEND_MDB2) { + //MDB2 uses or emulates limits & offset internally + self::$MDB2->setLimit($limit, $offset); + } else { + //PDO does not handle limit and offset. + //FIXME: check limit notation for other dbs + //the following sql thus might needs to take into account db ways of representing it + //(oracle has no LIMIT / OFFSET) + $limitsql = ' LIMIT ' . $limit; + if (!is_null($offset)) { + $limitsql .= ' OFFSET ' . $offset; + } + //insert limitsql + if (substr($query, -1) == ';') { //if query ends with ; + $query = substr($query, 0, -1) . $limitsql . ';'; + } else { + $query.=$limitsql; + } + } + } + // Optimize the query $query = self::processQuery( $query ); @@ -353,9 +399,17 @@ class OC_DB { $file2 = 'static://db_scheme'; $content = str_replace( '*dbname*', $CONFIG_DBNAME, $content ); $content = str_replace( '*dbprefix*', $CONFIG_DBTABLEPREFIX, $content ); - if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't - $content = str_replace( '0000-00-00 00:00:00', 'CURRENT_TIMESTAMP', $content ); - } + /* FIXME: REMOVE this commented code + * actually mysql, postgresql, sqlite and oracle support CURRENT_TIMESTAMP + * http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html + * http://www.postgresql.org/docs/8.1/static/functions-datetime.html + * http://www.sqlite.org/lang_createtable.html + * http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm + + if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't + $content = str_replace( '0000-00-00 00:00:00', 'CURRENT_TIMESTAMP', $content ); + } + */ file_put_contents( $file2, $content ); // Try to create tables @@ -368,10 +422,17 @@ class OC_DB { if( $definition instanceof MDB2_Schema_Error ){ die( $definition->getMessage().': '.$definition->getUserInfo()); } + if(OC_Config::getValue('dbtype','sqlite')==='oci'){ + unset($definition['charset']); //or MDB2 tries SHUTDOWN IMMEDIATE + $oldname = $definition['name']; + $definition['name']=OC_Config::getValue( "dbuser", $oldname ); + } + $ret=self::$schema->createDatabase( $definition ); // Die in case something went wrong if( $ret instanceof MDB2_Error ){ + echo (self::$MDB2->getDebugOutput()); die ($ret->getMessage() . ': ' . $ret->getUserInfo()); } @@ -402,9 +463,16 @@ class OC_DB { $file2 = 'static://db_scheme'; $content = str_replace( '*dbname*', $previousSchema['name'], $content ); $content = str_replace( '*dbprefix*', $CONFIG_DBTABLEPREFIX, $content ); + /* FIXME: REMOVE this commented code + * actually mysql, postgresql, sqlite and oracle support CUURENT_TIMESTAMP + * http://dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html + * http://www.postgresql.org/docs/8.1/static/functions-datetime.html + * http://www.sqlite.org/lang_createtable.html + * http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions037.htm if( $CONFIG_DBTYPE == 'pgsql' ){ //mysql support it too but sqlite doesn't $content = str_replace( '0000-00-00 00:00:00', 'CURRENT_TIMESTAMP', $content ); } + */ file_put_contents( $file2, $content ); $op = self::$schema->updateDatabase($file2, $previousSchema, array(), false); @@ -469,7 +537,7 @@ class OC_DB { }elseif( $type == 'mysql' ){ $query = str_replace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); $query = str_replace( 'now()', 'CURRENT_TIMESTAMP', $query ); - }elseif( $type == 'pgsql' ){ + }elseif( $type == 'pgsql' || $type == 'oci' ){ $query = str_replace( '`', '"', $query ); $query = str_replace( 'NOW()', 'CURRENT_TIMESTAMP', $query ); $query = str_replace( 'now()', 'CURRENT_TIMESTAMP', $query ); diff --git a/lib/filecache.php b/lib/filecache.php index e8b17e254e..e85d6747f9 100644 --- a/lib/filecache.php +++ b/lib/filecache.php @@ -101,7 +101,7 @@ class OC_FileCache{ $data['encrypted']=(int)$data['encrypted']; $data['versioned']=(int)$data['versioned']; $user=OC_User::getUser(); - $query=OC_DB::prepare('INSERT INTO *PREFIX*fscache(parent, name, path, path_hash, size, mtime, ctime, mimetype, mimepart,`user`,writable,encrypted,versioned) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)'); + $query=OC_DB::prepare('INSERT INTO `*PREFIX*fscache`(`parent`, `name`, `path`, `path_hash`, `size`, `mtime`, `ctime`, `mimetype`, `mimepart`,`user`,`writable`,`encrypted`,`versioned`) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?)'); $result=$query->execute(array($parent,basename($fullpath),$fullpath,md5($fullpath),$data['size'],$data['mtime'],$data['ctime'],$data['mimetype'],$mimePart,$user,$data['writable'],$data['encrypted'],$data['versioned'])); if(OC_DB::isError($result)){ OC_Log::write('files','error while writing file('.$fullpath.') to cache',OC_Log::ERROR); @@ -123,18 +123,21 @@ class OC_FileCache{ foreach(array('size','mtime','ctime','mimetype','encrypted','versioned','writable') as $attribute){ if(isset($data[$attribute])){ //Convert to int it args are false - if($data[$attribute] === false) $arguments[] = 0; - else $arguments[] = $data[$attribute]; - $queryParts[]=$attribute.'=?'; + if($data[$attribute] === false){ + $arguments[] = 0; + }else{ + $arguments[] = $data[$attribute]; + } + $queryParts[]='`'.$attribute.'`=?'; } } if(isset($data['mimetype'])){ $arguments[]=dirname($data['mimetype']); - $queryParts[]='mimepart=?'; + $queryParts[]='`mimepart`=?'; } $arguments[]=$id; - $sql = 'UPDATE *PREFIX*fscache SET '.implode(' , ',$queryParts).' WHERE id=?'; + $sql = 'UPDATE `*PREFIX*fscache` SET '.implode(' , ',$queryParts).' WHERE `id`=?'; $query=OC_DB::prepare($sql); $result=$query->execute($arguments); if(OC_DB::isError($result)){ @@ -155,7 +158,7 @@ class OC_FileCache{ $oldPath=$root.$oldPath; $newPath=$root.$newPath; $newParent=self::getParentId($newPath); - $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET parent=? ,name=?, path=?, path_hash=? WHERE path_hash=?'); + $query=OC_DB::prepare('UPDATE `*PREFIX*fscache` SET `parent`=? ,`name`=?, `path`=?, `path_hash`=? WHERE `path_hash`=?'); $query->execute(array($newParent,basename($newPath),$newPath,md5($newPath),md5($oldPath))); if(($cache=OC_Cache::getUserCache(true)) && $cache->hasKey('fileid/'.$oldPath)){ @@ -163,9 +166,9 @@ class OC_FileCache{ $cache->remove('fileid/'.$oldPath); } - $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE path LIKE ?'); + $query=OC_DB::prepare('SELECT `path` FROM `*PREFIX*fscache` WHERE `path` LIKE ?'); $oldLength=strlen($oldPath); - $updateQuery=OC_DB::prepare('UPDATE *PREFIX*fscache SET path=?, path_hash=? WHERE path_hash=?'); + $updateQuery=OC_DB::prepare('UPDATE `*PREFIX*fscache` SET `path`=?, `path_hash`=? WHERE `path_hash`=?'); while($row= $query->execute(array($oldPath.'/%'))->fetchRow()){ $old=$row['path']; $new=$newPath.substr($old,$oldLength); @@ -187,11 +190,11 @@ class OC_FileCache{ if($root===false){ $root=OC_Filesystem::getRoot(); } - $query=OC_DB::prepare('DELETE FROM *PREFIX*fscache WHERE path_hash=?'); + $query=OC_DB::prepare('DELETE FROM `*PREFIX*fscache` WHERE `path_hash`=?'); $query->execute(array(md5($root.$path))); //delete everything inside the folder - $query=OC_DB::prepare('DELETE FROM *PREFIX*fscache WHERE path LIKE ?'); + $query=OC_DB::prepare('DELETE FROM `*PREFIX*fscache` WHERE `path` LIKE ?'); $query->execute(array($root.$path.'/%')); OC_Cache::remove('fileid/'.$root.$path); @@ -210,9 +213,9 @@ class OC_FileCache{ } $rootLen=strlen($root); if(!$returnData){ - $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE name LIKE ? AND `user`=?'); + $query=OC_DB::prepare('SELECT `path` FROM `*PREFIX*fscache` WHERE `name` LIKE ? AND `user`=?'); }else{ - $query=OC_DB::prepare('SELECT * FROM *PREFIX*fscache WHERE name LIKE ? AND `user`=?'); + $query=OC_DB::prepare('SELECT * FROM `*PREFIX*fscache` WHERE `name` LIKE ? AND `user`=?'); } $result=$query->execute(array("%$search%",OC_User::getUser())); $names=array(); @@ -275,7 +278,7 @@ class OC_FileCache{ return $cache->get('fileid/'.$fullPath); } - $query=OC_DB::prepare('SELECT id FROM *PREFIX*fscache WHERE path_hash=?'); + $query=OC_DB::prepare('SELECT `id` FROM `*PREFIX*fscache` WHERE `path_hash`=?'); $result=$query->execute(array(md5($fullPath))); if(OC_DB::isError($result)){ OC_Log::write('files','error while getting file id of '.$path,OC_Log::ERROR); @@ -305,7 +308,7 @@ class OC_FileCache{ if(!$user){ $user=OC_User::getUser(); } - $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE id=? AND `user`=?'); + $query=OC_DB::prepare('SELECT `path` FROM `*PREFIX*fscache` WHERE `id`=? AND `user`=?'); $result=$query->execute(array($id,$user)); $row=$result->fetchRow(); $path=$row['path']; @@ -339,7 +342,7 @@ class OC_FileCache{ if($sizeDiff==0) return; $id=self::getId($path,$root); while($id!=-1){//walk up the filetree increasing the size of all parent folders - $query=OC_DB::prepare('UPDATE *PREFIX*fscache SET size=size+? WHERE id=?'); + $query=OC_DB::prepare('UPDATE `*PREFIX*fscache` SET `size`=`size`+? WHERE `id`=?'); $query->execute(array($sizeDiff,$id)); $id=self::getParentId($path); $path=dirname($path); @@ -358,6 +361,10 @@ class OC_FileCache{ $eventSource->send('scanning',array('file'=>$path,'count'=>$count)); } $lastSend=$count; + // NOTE: Ugly hack to prevent shared files from going into the cache (the source already exists somewhere in the cache) + if (substr($path, 0, 7) == '/Shared') { + return; + } if($root===false){ $view=OC_Filesystem::getView(); }else{ @@ -395,6 +402,10 @@ class OC_FileCache{ * @return int size of the scanned file */ public static function scanFile($path,$root=false){ + // NOTE: Ugly hack to prevent shared files from going into the cache (the source already exists somewhere in the cache) + if (substr($path, 0, 7) == '/Shared') { + return; + } if($root===false){ $view=OC_Filesystem::getView(); }else{ @@ -439,10 +450,10 @@ class OC_FileCache{ $root .= '%'; $user=OC_User::getUser(); if(!$part2){ - $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE mimepart=? AND `user`=? AND path LIKE ?'); + $query=OC_DB::prepare('SELECT `path` FROM `*PREFIX*fscache` WHERE `mimepart`=? AND `user`=? AND `path` LIKE ?'); $result=$query->execute(array($part1,$user, $root)); }else{ - $query=OC_DB::prepare('SELECT path FROM *PREFIX*fscache WHERE mimetype=? AND `user`=? AND path LIKE ? '); + $query=OC_DB::prepare('SELECT `path` FROM `*PREFIX*fscache` WHERE `mimetype`=? AND `user`=? AND `path` LIKE ? '); $result=$query->execute(array($part1.'/'.$part2,$user, $root)); } $names=array(); @@ -456,7 +467,7 @@ class OC_FileCache{ * clean old pre-path_hash entries */ public static function clean(){ - $query=OC_DB::prepare('DELETE FROM *PREFIX*fscache WHERE LENGTH(path_hash)<30'); + $query=OC_DB::prepare('DELETE FROM `*PREFIX*fscache` WHERE LENGTH(`path_hash`)<30'); $query->execute(); } } diff --git a/lib/filecache/cached.php b/lib/filecache/cached.php index 17a792a23d..95cc0ac300 100644 --- a/lib/filecache/cached.php +++ b/lib/filecache/cached.php @@ -18,7 +18,7 @@ class OC_FileCache_Cached{ $root=OC_Filesystem::getRoot(); } $path=$root.$path; - $query=OC_DB::prepare('SELECT path,ctime,mtime,mimetype,size,encrypted,versioned,writable FROM *PREFIX*fscache WHERE path_hash=?'); + $query=OC_DB::prepare('SELECT `path`,`ctime`,`mtime`,`mimetype`,`size`,`encrypted`,`versioned`,`writable` FROM `*PREFIX*fscache` WHERE `path_hash`=?'); $result=$query->execute(array(md5($path)))->fetchRow(); if(is_array($result)){ if(isset(self::$savedData[$path])){ @@ -58,7 +58,7 @@ class OC_FileCache_Cached{ if($parent==-1){ return array(); } - $query=OC_DB::prepare('SELECT path,name,ctime,mtime,mimetype,size,encrypted,versioned,writable FROM *PREFIX*fscache WHERE parent=? AND (mimetype LIKE ? OR mimetype = ?)'); + $query=OC_DB::prepare('SELECT `id`,`path`,`name`,`ctime`,`mtime`,`mimetype`,`size`,`encrypted`,`versioned`,`writable` FROM `*PREFIX*fscache` WHERE `parent`=? AND (`mimetype` LIKE ? OR `mimetype` = ?)'); $result=$query->execute(array($parent, $mimetype_filter.'%', 'httpd/unix-directory'))->fetchAll(); if(is_array($result)){ return $result; diff --git a/lib/fileproxy.php b/lib/fileproxy.php index 82c9298788..ec04faa9bc 100644 --- a/lib/fileproxy.php +++ b/lib/fileproxy.php @@ -112,4 +112,4 @@ class OC_FileProxy{ public static function clearProxies(){ self::$proxies=array(); } -} \ No newline at end of file +} diff --git a/lib/files.php b/lib/files.php index d5bebb7e54..1a1fffa0a5 100644 --- a/lib/files.php +++ b/lib/files.php @@ -33,10 +33,42 @@ class OC_Files { * @param dir $directory path under datadirectory */ public static function getDirectoryContent($directory, $mimetype_filter = ''){ - $files=OC_FileCache::getFolderContent($directory, false, $mimetype_filter); - foreach($files as &$file){ - $file['directory']=$directory; - $file['type']=($file['mimetype']=='httpd/unix-directory')?'dir':'file'; + $directory=OC_Filesystem::normalizePath($directory); + if($directory=='/'){ + $directory=''; + } + $files = array(); + if (($directory == '/Shared' || substr($directory, 0, 8) == '/Shared/') && OC_App::isEnabled('files_sharing')) { + if ($directory == '/Shared') { + $files = OCP\Share::getItemsSharedWith('file', OC_Share_Backend_File::FORMAT_FILE_APP, array('folder' => $directory, 'mimetype_filter' => $mimetype_filter)); + } else { + $pos = strpos($directory, '/', 8); + // Get shared folder name + if ($pos !== false) { + $itemTarget = substr($directory, 7, $pos - 7); + } else { + $itemTarget = substr($directory, 7); + } + $files = OCP\Share::getItemSharedWith('folder', $itemTarget, OC_Share_Backend_File::FORMAT_FILE_APP, array('folder' => $directory, 'mimetype_filter' => $mimetype_filter)); + } + } else { + $files = OC_FileCache::getFolderContent($directory, false, $mimetype_filter); + foreach ($files as &$file) { + $file['directory'] = $directory; + $file['type'] = ($file['mimetype'] == 'httpd/unix-directory') ? 'dir' : 'file'; + $permissions = OCP\Share::PERMISSION_READ | OCP\Share::PERMISSION_SHARE; + if ($file['type'] == 'dir' && $file['writable']) { + $permissions |= OCP\Share::PERMISSION_CREATE; + } + if ($file['writable']) { + $permissions |= OCP\Share::PERMISSION_UPDATE | OCP\Share::PERMISSION_DELETE; + } + $file['permissions'] = $permissions; + } + if ($directory == '' && OC_App::isEnabled('files_sharing')) { + // Add 'Shared' folder + $files = array_merge($files, OCP\Share::getItemsSharedWith('file', OC_Share_Backend_File::FORMAT_FILE_APP_ROOT)); + } } usort($files, "fileCmp");//TODO: remove this once ajax is merged return $files; @@ -104,8 +136,7 @@ class OC_Files { header('Content-Type: application/zip'); header('Content-Length: ' . filesize($filename)); }else{ - $fileData=OC_FileCache::get($filename); - header('Content-Type: ' . $fileData['mimetype']); + header('Content-Type: '.OC_Filesystem::getMimeType($filename)); } }elseif($zip or !OC_Filesystem::file_exists($filename)){ header("HTTP/1.0 404 Not Found"); diff --git a/lib/filestorage.php b/lib/filestorage.php index fd4ad36530..5bfd09253d 100644 --- a/lib/filestorage.php +++ b/lib/filestorage.php @@ -33,8 +33,11 @@ abstract class OC_Filestorage{ abstract public function stat($path); abstract public function filetype($path); abstract public function filesize($path); - abstract public function is_readable($path); - abstract public function is_writable($path); + abstract public function isCreatable($path); + abstract public function isReadable($path); + abstract public function isUpdatable($path); + abstract public function isDeletable($path); + abstract public function isSharable($path); abstract public function file_exists($path); abstract public function filectime($path); abstract public function filemtime($path); @@ -50,6 +53,7 @@ abstract class OC_Filestorage{ abstract public function search($query); abstract public function touch($path, $mtime=null); abstract public function getLocalFile($path);// get a path to a local version of the file, whether the original file is local or remote + abstract public function getLocalFolder($path);// get a path to a local version of the folder, whether the original file is local or remote /** * check if a file or folder has been updated since $time * @param int $time diff --git a/lib/filestorage/common.php b/lib/filestorage/common.php index c77df38e6b..c829be62f7 100644 --- a/lib/filestorage/common.php +++ b/lib/filestorage/common.php @@ -54,8 +54,17 @@ abstract class OC_Filestorage_Common extends OC_Filestorage { return $stat['size']; } } -// abstract public function is_readable($path); -// abstract public function is_writable($path); + public function isCreatable($path) { + return $this->isUpdatable($path); + } +// abstract public function isReadable($path); +// abstract public function isUpdatable($path); + public function isDeletable($path) { + return $this->isUpdatable($path); + } + public function isSharable($path) { + return $this->isReadable($path); + } // abstract public function file_exists($path); public function filectime($path) { $stat = $this->stat($path); @@ -223,6 +232,26 @@ abstract class OC_Filestorage_Common extends OC_Filestorage { OC_Helper::streamCopy($source,$target); return $tmpFile; } + public function getLocalFolder($path){ + $baseDir=OC_Helper::tmpFolder(); + $this->addLocalFolder($path,$baseDir); + return $baseDir; + } + private function addLocalFolder($path,$target){ + if($dh=$this->opendir($path)){ + while($file=readdir($dh)){ + if($file!=='.' and $file!=='..'){ + if($this->is_dir($path.'/'.$file)){ + mkdir($target.'/'.$file); + $this->addLocalFolder($path.'/'.$file,$target.'/'.$file); + }else{ + $tmp=$this->toTmpFile($path.'/'.$file); + rename($tmp,$target.'/'.$file); + } + } + } + } + } // abstract public function touch($path, $mtime=null); protected function searchInDir($query,$dir=''){ diff --git a/lib/filestorage/commontest.php b/lib/filestorage/commontest.php index 1b01ff856a..b5126a407b 100644 --- a/lib/filestorage/commontest.php +++ b/lib/filestorage/commontest.php @@ -51,11 +51,11 @@ class OC_Filestorage_CommonTest extends OC_Filestorage_Common{ public function filetype($path){ return $this->storage->filetype($path); } - public function is_readable($path){ - return $this->storage->is_readable($path); + public function isReadable($path){ + return $this->storage->isReadable($path); } - public function is_writable($path){ - return $this->storage->is_writable($path); + public function isUpdatable($path){ + return $this->storage->isUpdatable($path); } public function file_exists($path){ return $this->storage->file_exists($path); diff --git a/lib/filestorage/local.php b/lib/filestorage/local.php index d60f32b15b..22d17469df 100644 --- a/lib/filestorage/local.php +++ b/lib/filestorage/local.php @@ -45,10 +45,10 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{ return filesize($this->datadir.$path); } } - public function is_readable($path){ + public function isReadable($path){ return is_readable($this->datadir.$path); } - public function is_writable($path){ + public function isUpdatable($path){ return is_writable($this->datadir.$path); } public function file_exists($path){ @@ -85,7 +85,7 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{ return $this->delTree($path); } public function rename($path1,$path2){ - if (!$this->is_writable($path1)) { + if (!$this->isUpdatable($path1)) { OC_Log::write('core','unable to rename, file is not writable : '.$path1,OC_Log::ERROR); return false; } @@ -128,7 +128,7 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{ } public function getMimeType($path){ - if($this->is_readable($path)){ + if($this->isReadable($path)){ return OC_Helper::getMimeType($this->datadir.$path); }else{ return false; @@ -168,7 +168,10 @@ class OC_Filestorage_Local extends OC_Filestorage_Common{ return $this->searchInDir($query); } public function getLocalFile($path){ - return $this->datadir.$path; + return $this->datadir.$path; + } + public function getLocalFolder($path){ + return $this->datadir.$path; } protected function searchInDir($query,$dir=''){ diff --git a/lib/filesystem.php b/lib/filesystem.php index 6cba6b1b54..82fbf11afd 100644 --- a/lib/filesystem.php +++ b/lib/filesystem.php @@ -336,6 +336,13 @@ class OC_Filesystem{ static public function getLocalFile($path){ return self::$defaultInstance->getLocalFile($path); } + /** + * @param string path + * @return string + */ + static public function getLocalFolder($path){ + return self::$defaultInstance->getLocalFolder($path); + } /** * return path to file which reflects one visible in browser @@ -419,12 +426,33 @@ class OC_Filesystem{ static public function readfile($path){ return self::$defaultInstance->readfile($path); } + /** + * @deprecated Replaced by isReadable() as part of CRUDS + */ static public function is_readable($path){ return self::$defaultInstance->is_readable($path); } + /** + * @deprecated Replaced by isCreatable(), isUpdatable(), isDeletable() as part of CRUDS + */ static public function is_writable($path){ return self::$defaultInstance->is_writable($path); } + static public function isCreatable($path) { + return self::$defaultInstance->isCreatable($path); + } + static public function isReadable($path) { + return self::$defaultInstance->isReadable($path); + } + static public function isUpdatable($path) { + return self::$defaultInstance->isUpdatable($path); + } + static public function isDeletable($path) { + return self::$defaultInstance->isDeletable($path); + } + static public function isSharable($path) { + return self::$defaultInstance->isSharable($path); + } static public function file_exists($path){ return self::$defaultInstance->file_exists($path); } @@ -495,7 +523,16 @@ class OC_Filesystem{ OC_Connector_Sabre_Node::removeETagPropertyForPath($path); } - public static function normalizePath($path){ + /** + * normalize a path + * @param string path + * @param bool $stripTrailingSlash + * @return string + */ + public static function normalizePath($path,$stripTrailingSlash=true){ + if($path==''){ + return '/'; + } //no windows style slashes $path=str_replace('\\','/',$path); //add leading slash @@ -503,7 +540,7 @@ class OC_Filesystem{ $path='/'.$path; } //remove trainling slash - if(strlen($path)>1 and substr($path,-1,1)==='/'){ + if($stripTrailingSlash and strlen($path)>1 and substr($path,-1,1)==='/'){ $path=substr($path,0,-1); } //remove duplicate slashes diff --git a/lib/filesystemview.php b/lib/filesystemview.php index 9d85befdc8..a888e5340e 100644 --- a/lib/filesystemview.php +++ b/lib/filesystemview.php @@ -54,7 +54,7 @@ class OC_FilesystemView { if($path[0]!=='/'){ $path='/'.$path; } - return OC_Filesystem::normalizePath($this->fakeRoot.$path); + return $this->fakeRoot.$path; } /** @@ -147,6 +147,16 @@ class OC_FilesystemView { return $storage->getLocalFile($this->getInternalPath($path)); } } + /** + * @param string path + * @return string + */ + public function getLocalFolder($path) { + $parent=substr($path, 0, strrpos($path,'/')); + if(OC_Filesystem::isValidPath($parent) and $storage=$this->getStorage($path)) { + return $storage->getLocalFolder($this->getInternalPath($path)); + } + } /** * the following functions operate with arguments and return values identical @@ -201,11 +211,32 @@ class OC_FilesystemView { } return false; } - public function is_readable($path) { - return $this->basicOperation('is_readable', $path); + /** + * @deprecated Replaced by isReadable() as part of CRUDS + */ + public function is_readable($path){ + return $this->basicOperation('isReadable',$path); } - public function is_writable($path) { - return $this->basicOperation('is_writable', $path); + /** + * @deprecated Replaced by isCreatable(), isUpdatable(), isDeletable() as part of CRUDS + */ + public function is_writable($path){ + return $this->basicOperation('isUpdatable',$path); + } + public function isCreatable($path) { + return $this->basicOperation('isCreatable', $path); + } + public function isReadable($path) { + return $this->basicOperation('isReadable', $path); + } + public function isUpdatable($path) { + return $this->basicOperation('isUpdatable', $path); + } + public function isDeletable($path) { + return $this->basicOperation('isDeletable', $path); + } + public function isSharable($path) { + return $this->basicOperation('isSharable', $path); } public function file_exists($path) { if($path=='/'){ @@ -227,7 +258,7 @@ class OC_FilesystemView { } public function file_put_contents($path, $data) { if(is_resource($data)) {//not having to deal with streams in file_put_contents makes life easier - $absolutePath = $this->getAbsolutePath($path); + $absolutePath = OC_Filesystem::normalizePath($this->getAbsolutePath($path)); if (OC_FileProxy::runPreProxies('file_put_contents', $absolutePath, $data) && OC_Filesystem::isValidPath($path)) { $path = $this->getRelativePath($absolutePath); $exists = $this->file_exists($path); @@ -287,11 +318,14 @@ class OC_FilesystemView { return $this->basicOperation( 'deleteAll', $directory, array('delete'), $empty ); } public function rename($path1, $path2) { - $absolutePath1 = $this->getAbsolutePath($path1); - $absolutePath2 = $this->getAbsolutePath($path2); + $postFix1=(substr($path1,-1,1)==='/')?'/':''; + $postFix2=(substr($path2,-1,1)==='/')?'/':''; + $absolutePath1 = OC_Filesystem::normalizePath($this->getAbsolutePath($path1)); + $absolutePath2 = OC_Filesystem::normalizePath($this->getAbsolutePath($path2)); if(OC_FileProxy::runPreProxies('rename', $absolutePath1, $absolutePath2) and OC_Filesystem::isValidPath($path2)) { $path1 = $this->getRelativePath($absolutePath1); $path2 = $this->getRelativePath($absolutePath2); + if($path1 == null or $path2 == null) { return false; } @@ -305,20 +339,20 @@ class OC_FilesystemView { ) ); if($run) { - $mp1 = $this->getMountPoint($path1); - $mp2 = $this->getMountPoint($path2); + $mp1 = $this->getMountPoint($path1.$postFix1); + $mp2 = $this->getMountPoint($path2.$postFix2); if($mp1 == $mp2) { if($storage = $this->getStorage($path1)) { - $result = $storage->rename($this->getInternalPath($path1), $this->getInternalPath($path2)); + $result = $storage->rename($this->getInternalPath($path1.$postFix1), $this->getInternalPath($path2.$postFix2)); } } else { - $source = $this->fopen($path1, 'r'); - $target = $this->fopen($path2, 'w'); + $source = $this->fopen($path1.$postFix1, 'r'); + $target = $this->fopen($path2.$postFix2, 'w'); $count = OC_Helper::streamCopy($source, $target); $storage1 = $this->getStorage($path1); - $storage1->unlink($this->getInternalPath($path1)); + $storage1->unlink($this->getInternalPath($path1.$postFix1)); $result = $count>0; - } + } OC_Hook::emit( OC_Filesystem::CLASSNAME, OC_Filesystem::signal_post_rename, @@ -332,11 +366,14 @@ class OC_FilesystemView { } } public function copy($path1, $path2) { - $absolutePath1 = $this->getAbsolutePath($path1); - $absolutePath2 = $this->getAbsolutePath($path2); + $postFix1=(substr($path1,-1,1)==='/')?'/':''; + $postFix2=(substr($path2,-1,1)==='/')?'/':''; + $absolutePath1 = OC_Filesystem::normalizePath($this->getAbsolutePath($path1)); + $absolutePath2 = OC_Filesystem::normalizePath($this->getAbsolutePath($path2)); if(OC_FileProxy::runPreProxies('copy', $absolutePath1, $absolutePath2) and OC_Filesystem::isValidPath($path2)) { $path1 = $this->getRelativePath($absolutePath1); $path2 = $this->getRelativePath($absolutePath2); + if($path1 == null or $path2 == null) { return false; } @@ -372,15 +409,15 @@ class OC_FilesystemView { ); } if($run) { - $mp1=$this->getMountPoint($path1); - $mp2=$this->getMountPoint($path2); + $mp1=$this->getMountPoint($path1.$postFix1); + $mp2=$this->getMountPoint($path2.$postFix2); if($mp1 == $mp2){ - if($storage = $this->getStorage($path1)) { - $result=$storage->copy($this->getInternalPath($path1), $this->getInternalPath($path2)); + if($storage = $this->getStorage($path1.$postFix1)) { + $result=$storage->copy($this->getInternalPath($path1.$postFix1), $this->getInternalPath($path2.$postFix2)); } } else { - $source = $this->fopen($path1, 'r'); - $target = $this->fopen($path2, 'w'); + $source = $this->fopen($path1.$postFix1, 'r'); + $target = $this->fopen($path2.$postFix2, 'w'); $result = OC_Helper::streamCopy($source, $target); } OC_Hook::emit( @@ -475,7 +512,8 @@ class OC_FilesystemView { return $this->basicOperation('getMimeType', $path); } public function hash($type, $path, $raw = false) { - $absolutePath = $this->getAbsolutePath($path); + $postFix=(substr($path,-1,1)==='/')?'/':''; + $absolutePath = OC_Filesystem::normalizePath($this->getAbsolutePath($path)); if (OC_FileProxy::runPreProxies('hash', $absolutePath) && OC_Filesystem::isValidPath($path)) { $path = $this->getRelativePath($absolutePath); if ($path == null) { @@ -488,8 +526,8 @@ class OC_FilesystemView { array( OC_Filesystem::signal_param_path => $path) ); } - if ($storage = $this->getStorage($path)) { - $result = $storage->hash($type, $this->getInternalPath($path), $raw); + if ($storage = $this->getStorage($path.$postFix)) { + $result = $storage->hash($type, $this->getInternalPath($path.$postFix), $raw); $result = OC_FileProxy::runPostProxies('hash', $absolutePath, $result); return $result; } @@ -514,35 +552,16 @@ class OC_FilesystemView { * OC_Filestorage for delegation to a storage backend for execution */ private function basicOperation($operation, $path, $hooks=array(), $extraParam=null) { - $absolutePath = $this->getAbsolutePath($path); + $postFix=(substr($path,-1,1)==='/')?'/':''; + $absolutePath = OC_Filesystem::normalizePath($this->getAbsolutePath($path)); if(OC_FileProxy::runPreProxies($operation, $absolutePath, $extraParam) and OC_Filesystem::isValidPath($path)) { $path = $this->getRelativePath($absolutePath); if($path == null) { return false; } - $internalPath = $this->getInternalPath($path); - $run = true; - if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()) { - foreach($hooks as $hook) { - if($hook!='read') { - OC_Hook::emit( - OC_Filesystem::CLASSNAME, - $hook, - array( - OC_Filesystem::signal_param_path => $path, - OC_Filesystem::signal_param_run => &$run - ) - ); - } else { - OC_Hook::emit( - OC_Filesystem::CLASSNAME, - $hook, - array( OC_Filesystem::signal_param_path => $path) - ); - } - } - } - if($run and $storage = $this->getStorage($path)) { + $internalPath = $this->getInternalPath($path.$postFix); + $run=$this->runHooks($hooks,$path); + if($run and $storage = $this->getStorage($path.$postFix)) { if(!is_null($extraParam)) { $result = $storage->$operation($internalPath, $extraParam); } else { @@ -551,15 +570,7 @@ class OC_FilesystemView { $result = OC_FileProxy::runPostProxies($operation, $this->getAbsolutePath($path), $result); if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()) { if($operation!='fopen') {//no post hooks for fopen, the file stream is still open - foreach($hooks as $hook) { - if($hook!='read'){ - OC_Hook::emit( - OC_Filesystem::CLASSNAME, - 'post_'.$hook, - array( OC_Filesystem::signal_param_path => $path) - ); - } - } + $this->runHooks($hooks,$path,true); } } return $result; @@ -568,6 +579,34 @@ class OC_FilesystemView { return null; } + private function runHooks($hooks,$path,$post=false){ + $prefix=($post)?'post_':''; + $run=true; + if(OC_Filesystem::$loaded and $this->fakeRoot==OC_Filesystem::getRoot()) { + foreach($hooks as $hook) { + if($hook!='read') { + OC_Hook::emit( + OC_Filesystem::CLASSNAME, + $prefix.$hook, + array( + OC_Filesystem::signal_param_run => &$run, + OC_Filesystem::signal_param_path => $path + ) + ); + } elseif(!$post) { + OC_Hook::emit( + OC_Filesystem::CLASSNAME, + $prefix.$hook, + array( + OC_Filesystem::signal_param_path => $path + ) + ); + } + } + } + return $run; + } + /** * check if a file or folder has been updated since $time * @param int $time diff --git a/lib/group/backend.php b/lib/group/backend.php index 4c7d09bcb1..5969986c65 100644 --- a/lib/group/backend.php +++ b/lib/group/backend.php @@ -105,6 +105,7 @@ abstract class OC_Group_Backend implements OC_Group_Interface { * * Returns a list with all groups */ + public function getGroups($search = '', $limit = -1, $offset = 0) { return array(); } @@ -115,7 +116,7 @@ abstract class OC_Group_Backend implements OC_Group_Interface { * @return bool */ public function groupExists($gid){ - return in_array($gid, $this->getGroups()); + return in_array($gid, $this->getGroups($gid, 1)); } /** diff --git a/lib/group/database.php b/lib/group/database.php index 1cb4171f49..52608b2db7 100644 --- a/lib/group/database.php +++ b/lib/group/database.php @@ -52,8 +52,8 @@ class OC_Group_Database extends OC_Group_Backend { */ public function createGroup( $gid ){ // Check for existence - $query = OC_DB::prepare( "SELECT gid FROM `*PREFIX*groups` WHERE gid = ?" ); - $result = $query->execute( array( $gid )); + $stmt = OC_DB::prepare( "SELECT `gid` FROM `*PREFIX*groups` WHERE `gid` = ?" ); + $result = $stmt->execute( array( $gid )); if( $result->fetchRow() ){ // Can not add an existing group @@ -61,8 +61,8 @@ class OC_Group_Database extends OC_Group_Backend { } else{ // Add group and exit - $query = OC_DB::prepare( "INSERT INTO `*PREFIX*groups` ( `gid` ) VALUES( ? )" ); - $result = $query->execute( array( $gid )); + $stmt = OC_DB::prepare( "INSERT INTO `*PREFIX*groups` ( `gid` ) VALUES( ? )" ); + $result = $stmt->execute( array( $gid )); return $result ? true : false; } @@ -77,12 +77,12 @@ class OC_Group_Database extends OC_Group_Backend { */ public function deleteGroup( $gid ){ // Delete the group - $query = OC_DB::prepare( "DELETE FROM `*PREFIX*groups` WHERE gid = ?" ); - $result = $query->execute( array( $gid )); + $stmt = OC_DB::prepare( "DELETE FROM `*PREFIX*groups` WHERE `gid` = ?" ); + $result = $stmt->execute( array( $gid )); // Delete the group-user relation - $query = OC_DB::prepare( "DELETE FROM `*PREFIX*group_user` WHERE gid = ?" ); - $result = $query->execute( array( $gid )); + $stmt = OC_DB::prepare( "DELETE FROM `*PREFIX*group_user` WHERE `gid` = ?" ); + $result = $stmt->execute( array( $gid )); return true; } @@ -97,8 +97,8 @@ class OC_Group_Database extends OC_Group_Backend { */ public function inGroup( $uid, $gid ){ // check - $query = OC_DB::prepare( "SELECT uid FROM `*PREFIX*group_user` WHERE gid = ? AND uid = ?" ); - $result = $query->execute( array( $gid, $uid )); + $stmt = OC_DB::prepare( "SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid` = ? AND `uid` = ?" ); + $result = $stmt->execute( array( $gid, $uid )); return $result->fetchRow() ? true : false; } @@ -114,8 +114,8 @@ class OC_Group_Database extends OC_Group_Backend { public function addToGroup( $uid, $gid ){ // No duplicate entries! if( !$this->inGroup( $uid, $gid )){ - $query = OC_DB::prepare( "INSERT INTO `*PREFIX*group_user` ( `uid`, `gid` ) VALUES( ?, ? )" ); - $query->execute( array( $uid, $gid )); + $stmt = OC_DB::prepare( "INSERT INTO `*PREFIX*group_user` ( `uid`, `gid` ) VALUES( ?, ? )" ); + $stmt->execute( array( $uid, $gid )); return true; }else{ return false; @@ -131,8 +131,8 @@ class OC_Group_Database extends OC_Group_Backend { * removes the user from a group. */ public function removeFromGroup( $uid, $gid ){ - $query = OC_DB::prepare( "DELETE FROM *PREFIX*group_user WHERE uid = ? AND gid = ?" ); - $query->execute( array( $uid, $gid )); + $stmt = OC_DB::prepare( "DELETE FROM `*PREFIX*group_user` WHERE `uid` = ? AND `gid` = ?" ); + $stmt->execute( array( $uid, $gid )); return true; } @@ -147,8 +147,8 @@ class OC_Group_Database extends OC_Group_Backend { */ public function getUserGroups( $uid ){ // No magic! - $query = OC_DB::prepare( "SELECT gid FROM `*PREFIX*group_user` WHERE uid = ?" ); - $result = $query->execute( array( $uid )); + $stmt = OC_DB::prepare( "SELECT `gid` FROM `*PREFIX*group_user` WHERE `uid` = ?" ); + $result = $stmt->execute( array( $uid )); $groups = array(); while( $row = $result->fetchRow()){ @@ -164,13 +164,9 @@ class OC_Group_Database extends OC_Group_Backend { * * Returns a list with all groups */ - public function getGroups($search = '', $limit = -1, $offset = 0) { - if ($limit == -1) { - $query = OC_DB::prepare('SELECT gid FROM *PREFIX*groups WHERE gid LIKE ?'); - } else { - $query = OC_DB::prepare('SELECT gid FROM *PREFIX*groups WHERE gid LIKE ? LIMIT '.$limit.' OFFSET '.$offset); - } - $result = $query->execute(array($search.'%')); + public function getGroups($search = '', $limit = null, $offset = null) { + $stmt = OC_DB::prepare('SELECT `gid` FROM `*PREFIX*groups` WHERE `gid` LIKE ?', $limit, $offset); + $result = $stmt->execute(array($search.'%')); $groups = array(); while ($row = $result->fetchRow()) { $groups[] = $row['gid']; @@ -178,17 +174,27 @@ class OC_Group_Database extends OC_Group_Backend { return $groups; } + /** + * check if a group exists + * @param string $gid + * @return bool + */ + public function groupExists($gid) { + $query = OC_DB::prepare('SELECT `gid` FROM `*PREFIX*groups` WHERE `gid` = ?'); + $result = $query->execute(array($gid))->fetchOne(); + if ($result) { + return true; + } + return false; + } + /** * @brief get a list of all users in a group * @returns array with user ids */ - public function usersInGroup($gid, $search = '', $limit = -1, $offset = 0) { - if ($limit == -1) { - $query = OC_DB::prepare('SELECT uid FROM *PREFIX*group_user WHERE gid = ? AND uid LIKE ?'); - } else { - $query = OC_DB::prepare('SELECT uid FROM *PREFIX*group_user WHERE gid = ? AND uid LIKE ? LIMIT '.$limit.' OFFSET '.$offset); - } - $result = $query->execute(array($gid, $search.'%')); + public function usersInGroup($gid, $search = '', $limit = null, $offset = null) { + $stmt = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*group_user` WHERE `gid` = ? AND `uid` LIKE ?', $limit, $offset); + $result = $stmt->execute(array($gid, $search.'%')); $users = array(); while ($row = $result->fetchRow()) { $users[] = $row['uid']; diff --git a/lib/l10n/cs_CZ.php b/lib/l10n/cs_CZ.php new file mode 100644 index 0000000000..933dbe541f --- /dev/null +++ b/lib/l10n/cs_CZ.php @@ -0,0 +1,25 @@ + "Nápověda", +"Personal" => "Osobní", +"Settings" => "Nastavení", +"Users" => "Uživatelé", +"Apps" => "Aplikace", +"Admin" => "Admin", +"ZIP download is turned off." => "Stahování ZIPu je vypnuto.", +"Files need to be downloaded one by one." => "Soubory je nutno stahovat samostatně.", +"Back to Files" => "Zpět k souborům", +"Selected files too large to generate zip file." => "Vybarné soubory jsou pro vytvoření zipu příliš velké.", +"Application is not enabled" => "Aplikace není povolena", +"Authentication error" => "Chyba autorizace", +"Token expired. Please reload page." => "Realce expirovala. Obnovte prosím stranu.", +"seconds ago" => "před vteřinami", +"1 minute ago" => "před 1 minutou", +"%d minutes ago" => "před %d minutami", +"today" => "dnes", +"yesterday" => "včera", +"%d days ago" => "před %d dny", +"last month" => "minulý měsíc", +"months ago" => "před měsíci", +"last year" => "loni", +"years ago" => "před lety" +); diff --git a/lib/l10n/de.php b/lib/l10n/de.php index d3548c7a13..e77ec97df7 100644 --- a/lib/l10n/de.php +++ b/lib/l10n/de.php @@ -5,14 +5,14 @@ "Users" => "Benutzer", "Apps" => "Apps", "Admin" => "Administrator", -"ZIP download is turned off." => "ZIP-Download ist deaktiviert.", +"ZIP download is turned off." => "Der ZIP-Download ist deaktiviert.", "Files need to be downloaded one by one." => "Die Dateien müssen einzeln heruntergeladen werden.", "Back to Files" => "Zurück zu \"Dateien\"", -"Selected files too large to generate zip file." => "Die gewählten Dateien sind zu groß, um eine zip-Datei zu generieren.", -"Application is not enabled" => "Anwendung ist nicht aktiviert", +"Selected files too large to generate zip file." => "Die gewählten Dateien sind zu groß, um eine ZIP-Datei zu erstellen.", +"Application is not enabled" => "Die Anwendung ist nicht aktiviert", "Authentication error" => "Authentifizierungs-Fehler", -"Token expired. Please reload page." => "Token abgelaufen. Bitte Seite neuladen.", -"seconds ago" => "vor wenigen Sekunden", +"Token expired. Please reload page." => "Token abgelaufen. Bitte laden Sie die Seite neu.", +"seconds ago" => "Vor wenigen Sekunden", "1 minute ago" => "Vor einer Minute", "%d minutes ago" => "Vor %d Minuten", "today" => "Heute", diff --git a/lib/l10n/fa.php b/lib/l10n/fa.php new file mode 100644 index 0000000000..3579329820 --- /dev/null +++ b/lib/l10n/fa.php @@ -0,0 +1,16 @@ + "راه‌نما", +"Personal" => "شخصی", +"Settings" => "تنظیمات", +"Users" => "کاربران", +"Admin" => "مدیر", +"seconds ago" => "ثانیه‌ها پیش", +"1 minute ago" => "1 دقیقه پیش", +"%d minutes ago" => "%d دقیقه پیش", +"today" => "امروز", +"yesterday" => "دیروز", +"last month" => "ماه قبل", +"months ago" => "ماه‌های قبل", +"last year" => "سال قبل", +"years ago" => "سال‌های قبل" +); diff --git a/lib/l10n/lt_LT.php b/lib/l10n/lt_LT.php new file mode 100644 index 0000000000..c6702a6228 --- /dev/null +++ b/lib/l10n/lt_LT.php @@ -0,0 +1,21 @@ + "Pagalba", +"Personal" => "Asmeniniai", +"Settings" => "Nustatymai", +"Users" => "Vartotojai", +"Apps" => "Programos", +"Admin" => "Administravimas", +"ZIP download is turned off." => "ZIP atsisiuntimo galimybė yra išjungta.", +"Files need to be downloaded one by one." => "Failai turi būti parsiunčiami vienas po kito.", +"Back to Files" => "Atgal į Failus", +"Selected files too large to generate zip file." => "Pasirinkti failai per dideli archyvavimui į ZIP.", +"Application is not enabled" => "Programa neįjungta", +"Authentication error" => "Autentikacijos klaida", +"1 minute ago" => "prieš 1 minutę", +"%d minutes ago" => "prieš %d minučių", +"today" => "šiandien", +"yesterday" => "vakar", +"%d days ago" => "prieš %d dienų", +"last month" => "praėjusį mėnesį", +"last year" => "pereitais metais" +); diff --git a/lib/l10n/nb_NO.php b/lib/l10n/nb_NO.php new file mode 100644 index 0000000000..af9503b7bf --- /dev/null +++ b/lib/l10n/nb_NO.php @@ -0,0 +1,24 @@ + "Hjelp", +"Personal" => "Personlig", +"Settings" => "Innstillinger", +"Users" => "Brukere", +"Apps" => "Apper", +"Admin" => "Admin", +"ZIP download is turned off." => "ZIP-nedlasting av avslått", +"Files need to be downloaded one by one." => "Filene må lastes ned en om gangen", +"Back to Files" => "Tilbake til filer", +"Selected files too large to generate zip file." => "De valgte filene er for store til å kunne generere ZIP-fil", +"Application is not enabled" => "Applikasjon er ikke påslått", +"Authentication error" => "Autentiseringsfeil", +"seconds ago" => "sekunder siden", +"1 minute ago" => "1 minuitt siden", +"%d minutes ago" => "%d minutter siden", +"today" => "i dag", +"yesterday" => "i går", +"%d days ago" => "%d dager siden", +"last month" => "forrige måned", +"months ago" => "måneder siden", +"last year" => "i fjor", +"years ago" => "år siden" +); diff --git a/lib/l10n/nl.php b/lib/l10n/nl.php new file mode 100644 index 0000000000..01bc4d3e19 --- /dev/null +++ b/lib/l10n/nl.php @@ -0,0 +1,25 @@ + "Help", +"Personal" => "Persoonlijk", +"Settings" => "Instellingen", +"Users" => "Gebruikers", +"Apps" => "Apps", +"Admin" => "Administrator", +"ZIP download is turned off." => "ZIP download is uitgeschakeld.", +"Files need to be downloaded one by one." => "Bestanden moeten één voor één worden gedownload.", +"Back to Files" => "Terug naar bestanden", +"Selected files too large to generate zip file." => "De geselecteerde bestanden zijn te groot om een zip bestand te maken.", +"Application is not enabled" => "De applicatie is niet actief", +"Authentication error" => "Authenticatie fout", +"Token expired. Please reload page." => "Token verlopen. Herlaad de pagina.", +"seconds ago" => "seconden geleden", +"1 minute ago" => "1 minuut geleden", +"%d minutes ago" => "%d minuten geleden", +"today" => "vandaag", +"yesterday" => "gisteren", +"%d days ago" => "%d dagen geleden", +"last month" => "vorige maand", +"months ago" => "maanden geleden", +"last year" => "vorig jaar", +"years ago" => "jaar geleden" +); diff --git a/lib/l10n/ru.php b/lib/l10n/ru.php new file mode 100644 index 0000000000..07dacc598a --- /dev/null +++ b/lib/l10n/ru.php @@ -0,0 +1,25 @@ + "Помощь", +"Personal" => "Личное", +"Settings" => "Настройки", +"Users" => "Пользователи", +"Apps" => "Приложения", +"Admin" => "Admin", +"ZIP download is turned off." => "ZIP-скачивание отключено.", +"Files need to be downloaded one by one." => "Файлы должны быть загружены по одному.", +"Back to Files" => "Назад к файлам", +"Selected files too large to generate zip file." => "Выбранные файлы слишком велики, чтобы создать zip файл.", +"Application is not enabled" => "Приложение не разрешено", +"Authentication error" => "Ошибка аутентификации", +"Token expired. Please reload page." => "Токен просрочен. Перезагрузите страницу.", +"seconds ago" => "менее минуты", +"1 minute ago" => "1 минуту назад", +"%d minutes ago" => "%d минут назад", +"today" => "сегодня", +"yesterday" => "вчера", +"%d days ago" => "%d дней назад", +"last month" => "в прошлом месяце", +"months ago" => "месяцы назад", +"last year" => "в прошлом году", +"years ago" => "годы назад" +); diff --git a/lib/l10n/sl.php b/lib/l10n/sl.php index 7889335d97..fad1641725 100644 --- a/lib/l10n/sl.php +++ b/lib/l10n/sl.php @@ -12,11 +12,14 @@ "Application is not enabled" => "Aplikacija ni omogočena", "Authentication error" => "Napaka overitve", "Token expired. Please reload page." => "Žeton je potekel. Prosimo, če spletno stran znova naložite.", +"seconds ago" => "sekund nazaj", "1 minute ago" => "pred minuto", "%d minutes ago" => "pred %d minutami", "today" => "danes", "yesterday" => "včeraj", "%d days ago" => "pred %d dnevi", "last month" => "prejšnji mesec", -"last year" => "lani" +"months ago" => "mesecev nazaj", +"last year" => "lani", +"years ago" => "let nazaj" ); diff --git a/lib/l10n/sv.php b/lib/l10n/sv.php index 4d9a63c34b..cff3a63c44 100644 --- a/lib/l10n/sv.php +++ b/lib/l10n/sv.php @@ -5,7 +5,7 @@ "Users" => "Användare", "Apps" => "Program", "Admin" => "Admin", -"ZIP download is turned off." => "Nedladdning av ZIP är avstängd.", +"ZIP download is turned off." => "Nerladdning av ZIP är avstängd.", "Files need to be downloaded one by one." => "Filer laddas ner en åt gången.", "Back to Files" => "Tillbaka till Filer", "Selected files too large to generate zip file." => "Valda filer är för stora för att skapa zip-fil.", diff --git a/lib/l10n/zh_CN.php b/lib/l10n/zh_CN.php new file mode 100644 index 0000000000..2d05ad3567 --- /dev/null +++ b/lib/l10n/zh_CN.php @@ -0,0 +1,25 @@ + "帮助", +"Personal" => "个人", +"Settings" => "设置", +"Users" => "用户", +"Apps" => "应用", +"Admin" => "管理", +"ZIP download is turned off." => "ZIP 下载已经关闭", +"Files need to be downloaded one by one." => "需要逐一下载文件", +"Back to Files" => "回到文件", +"Selected files too large to generate zip file." => "选择的文件太大,无法生成 zip 文件。", +"Application is not enabled" => "不需要程序", +"Authentication error" => "认证错误", +"Token expired. Please reload page." => "Token 过期,请刷新页面。", +"seconds ago" => "几秒前", +"1 minute ago" => "1分钟前", +"%d minutes ago" => "%d 分钟前", +"today" => "今天", +"yesterday" => "昨天", +"%d days ago" => "%d 天前", +"last month" => "上月", +"months ago" => "几月前", +"last year" => "上年", +"years ago" => "几年前" +); diff --git a/lib/migration/content.php b/lib/migration/content.php index 7ef88f36e4..5c89e6bacd 100644 --- a/lib/migration/content.php +++ b/lib/migration/content.php @@ -109,7 +109,7 @@ class OC_Migration_Content{ foreach( $options['matchval'] as $matchval ){ // Run the query for this match value (where x = y value) - $sql = "SELECT * FROM *PREFIX*" . $options['table'] . " WHERE " . $options['matchcol'] . " LIKE ?"; + $sql = 'SELECT * FROM `*PREFIX*' . $options['table'] . '` WHERE `' . $options['matchcol'] . '` LIKE ?'; $query = OC_DB::prepare( $sql ); $results = $query->execute( array( $matchval ) ); $newreturns = $this->insertData( $results, $options ); @@ -118,7 +118,7 @@ class OC_Migration_Content{ } else { // Just get everything - $sql = "SELECT * FROM *PREFIX*" . $options['table']; + $sql = 'SELECT * FROM `*PREFIX*' . $options['table'] . '`'; $query = OC_DB::prepare( $sql ); $results = $query->execute(); $return = $this->insertData( $results, $options ); diff --git a/lib/mimetypes.list.php b/lib/mimetypes.list.php index 37d50756d5..8386bcb93f 100644 --- a/lib/mimetypes.list.php +++ b/lib/mimetypes.list.php @@ -93,4 +93,5 @@ return array( 'pptx'=>'application/mspowerpoint', 'sgf' => 'application/sgf', 'cdr' => 'application/coreldraw', + 'impress' => 'text/impress', ); diff --git a/lib/preferences.php b/lib/preferences.php index c91423e69b..b6c4c3a163 100644 --- a/lib/preferences.php +++ b/lib/preferences.php @@ -47,7 +47,7 @@ class OC_Preferences{ */ public static function getUsers(){ // No need for more comments - $query = OC_DB::prepare( 'SELECT DISTINCT( userid ) FROM *PREFIX*preferences' ); + $query = OC_DB::prepare( 'SELECT DISTINCT( `userid` ) FROM `*PREFIX*preferences`' ); $result = $query->execute(); $users = array(); @@ -68,7 +68,7 @@ class OC_Preferences{ */ public static function getApps( $user ){ // No need for more comments - $query = OC_DB::prepare( 'SELECT DISTINCT( appid ) FROM *PREFIX*preferences WHERE userid = ?' ); + $query = OC_DB::prepare( 'SELECT DISTINCT( `appid` ) FROM `*PREFIX*preferences` WHERE `userid` = ?' ); $result = $query->execute( array( $user )); $apps = array(); @@ -90,7 +90,7 @@ class OC_Preferences{ */ public static function getKeys( $user, $app ){ // No need for more comments - $query = OC_DB::prepare( 'SELECT configkey FROM *PREFIX*preferences WHERE userid = ? AND appid = ?' ); + $query = OC_DB::prepare( 'SELECT `configkey` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?' ); $result = $query->execute( array( $user, $app )); $keys = array(); @@ -114,7 +114,7 @@ class OC_Preferences{ */ public static function getValue( $user, $app, $key, $default = null ){ // Try to fetch the value, return default if not exists. - $query = OC_DB::prepare( 'SELECT configvalue FROM *PREFIX*preferences WHERE userid = ? AND appid = ? AND configkey = ?' ); + $query = OC_DB::prepare( 'SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?' ); $result = $query->execute( array( $user, $app, $key )); $row = $result->fetchRow(); @@ -138,16 +138,16 @@ class OC_Preferences{ */ public static function setValue( $user, $app, $key, $value ){ // Check if the key does exist - $query = OC_DB::prepare( 'SELECT configvalue FROM *PREFIX*preferences WHERE userid = ? AND appid = ? AND configkey = ?' ); + $query = OC_DB::prepare( 'SELECT `configvalue` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?' ); $values=$query->execute(array($user,$app,$key))->fetchAll(); $exists=(count($values)>0); if( !$exists ){ - $query = OC_DB::prepare( 'INSERT INTO *PREFIX*preferences ( userid, appid, configkey, configvalue ) VALUES( ?, ?, ?, ? )' ); + $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*preferences` ( `userid`, `appid`, `configkey`, `configvalue` ) VALUES( ?, ?, ?, ? )' ); $query->execute( array( $user, $app, $key, $value )); } else{ - $query = OC_DB::prepare( 'UPDATE *PREFIX*preferences SET configvalue = ? WHERE userid = ? AND appid = ? AND configkey = ?' ); + $query = OC_DB::prepare( 'UPDATE `*PREFIX*preferences` SET `configvalue` = ? WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?' ); $query->execute( array( $value, $user, $app, $key )); } return true; @@ -164,8 +164,8 @@ class OC_Preferences{ */ public static function deleteKey( $user, $app, $key ){ // No need for more comments - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*preferences WHERE userid = ? AND appid = ? AND configkey = ?' ); - $query->execute( array( $user, $app, $key )); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ?' ); + $result = $query->execute( array( $user, $app, $key )); return true; } @@ -180,8 +180,8 @@ class OC_Preferences{ */ public static function deleteApp( $user, $app ){ // No need for more comments - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*preferences WHERE userid = ? AND appid = ?' ); - $query->execute( array( $user, $app )); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ?' ); + $result = $query->execute( array( $user, $app )); return true; } @@ -195,8 +195,8 @@ class OC_Preferences{ */ public static function deleteUser( $user ){ // No need for more comments - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*preferences WHERE userid = ?' ); - $query->execute( array( $user )); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*preferences` WHERE `userid` = ?' ); + $result = $query->execute( array( $user )); return true; } @@ -210,8 +210,8 @@ class OC_Preferences{ */ public static function deleteAppFromAllUsers( $app ){ // No need for more comments - $query = OC_DB::prepare( 'DELETE FROM *PREFIX*preferences WHERE appid = ?' ); - $query->execute( array( $app )); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*preferences` WHERE `appid` = ?' ); + $result = $query->execute( array( $app )); return true; } diff --git a/lib/public/db.php b/lib/public/db.php index 3a33f7674d..23c670cf44 100644 --- a/lib/public/db.php +++ b/lib/public/db.php @@ -43,8 +43,8 @@ class DB { * * SQL query via MDB2 prepare(), needs to be execute()'d! */ - static public function prepare( $query ){ - return(\OC_DB::prepare($query)); + static public function prepare( $query, $limit=null, $offset=null ){ + return(\OC_DB::prepare($query,$limit,$offset)); } diff --git a/lib/public/share.php b/lib/public/share.php new file mode 100644 index 0000000000..93820760d1 --- /dev/null +++ b/lib/public/share.php @@ -0,0 +1,1053 @@ +. +*/ +namespace OCP; + +\OC_Hook::connect('OC_User', 'post_deleteUser', 'OCP\Share', 'post_deleteUser'); +\OC_Hook::connect('OC_User', 'post_addToGroup', 'OCP\Share', 'post_addToGroup'); +\OC_Hook::connect('OC_User', 'post_removeFromGroup', 'OCP\Share', 'post_removeFromGroup'); + +/** +* This class provides the ability for apps to share their content between users. +* Apps must create a backend class that implements OCP\Share_Backend and register it with this class. +*/ +class Share { + + const SHARE_TYPE_USER = 0; + const SHARE_TYPE_GROUP = 1; + const SHARE_TYPE_PRIVATE_LINK = 3; + const SHARE_TYPE_EMAIL = 4; + const SHARE_TYPE_CONTACT = 5; + const SHARE_TYPE_REMOTE = 6; + + /** CRUDS permissions (Create, Read, Update, Delete, Share) using a bitmask + * Construct permissions for share() and setPermissions with Or (|) e.g. Give user read and update permissions: PERMISSION_READ | PERMISSION_UPDATE + * Check if permission is granted with And (&) e.g. Check if delete is granted: if ($permissions & PERMISSION_DELETE) + * Remove permissions with And (&) and Not (~) e.g. Remove the update permission: $permissions &= ~PERMISSION_UPDATE + * Apps are required to handle permissions on their own, this class only stores and manages the permissions of shares + */ + const PERMISSION_CREATE = 4; + const PERMISSION_READ = 1; + const PERMISSION_UPDATE = 2; + const PERMISSION_DELETE = 8; + const PERMISSION_SHARE = 16; + + const FORMAT_NONE = -1; + const FORMAT_STATUSES = -2; + const FORMAT_SOURCES = -3; + + private static $shareTypeUserAndGroups = -1; + private static $shareTypeGroupUserUnique = 2; + private static $backends = array(); + private static $backendTypes = array(); + + /** + * @brief Register a sharing backend class that implements OCP\Share_Backend for an item type + * @param string Item type + * @param string Backend class + * @param string (optional) Depends on item type + * @param array (optional) List of supported file extensions if this item type depends on files + * @return Returns true if backend is registered or false if error + */ + public static function registerBackend($itemType, $class, $collectionOf = null, $supportedFileExtensions = null) { + if (!isset(self::$backendTypes[$itemType])) { + self::$backendTypes[$itemType] = array('class' => $class, 'collectionOf' => $collectionOf, 'supportedFileExtensions' => $supportedFileExtensions); + if(count(self::$backendTypes) === 1) { + \OC_Util::addScript('core', 'share'); + \OC_Util::addStyle('core', 'share'); + } + return true; + } + \OC_Log::write('OCP\Share', 'Sharing backend '.$class.' not registered, '.self::$backendTypes[$itemType]['class'].' is already registered for '.$itemType, \OC_Log::WARN); + return false; + } + + /** + * @brief Get the items of item type shared with the current user + * @param string Item type + * @param int Format (optional) Format type must be defined by the backend + * @param int Number of items to return (optional) Returns all by default + * @return Return depends on format + */ + public static function getItemsSharedWith($itemType, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { + return self::getItems($itemType, null, self::$shareTypeUserAndGroups, \OC_User::getUser(), null, $format, $parameters, $limit, $includeCollections); + } + + /** + * @brief Get the item of item type shared with the current user + * @param string Item type + * @param string Item target + * @param int Format (optional) Format type must be defined by the backend + * @return Return depends on format + */ + public static function getItemSharedWith($itemType, $itemTarget, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { + return self::getItems($itemType, $itemTarget, self::$shareTypeUserAndGroups, \OC_User::getUser(), null, $format, $parameters, 1, $includeCollections); + } + + /** + * @brief Get the item of item type shared with the current user by source + * @param string Item type + * @param string Item source + * @param int Format (optional) Format type must be defined by the backend + * @return Return depends on format + */ + public static function getItemSharedWithBySource($itemType, $itemSource, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { + return self::getItems($itemType, $itemSource, self::$shareTypeUserAndGroups, \OC_User::getUser(), null, $format, $parameters, 1, $includeCollections, true); + } + + /** + * @brief Get the shared items of item type owned by the current user + * @param string Item type + * @param int Format (optional) Format type must be defined by the backend + * @param int Number of items to return (optional) Returns all by default + * @return Return depends on format + */ + public static function getItemsShared($itemType, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false) { + return self::getItems($itemType, null, null, null, \OC_User::getUser(), $format, $parameters, $limit, $includeCollections); + } + + /** + * @brief Get the shared item of item type owned by the current user + * @param string Item type + * @param string Item source + * @param int Format (optional) Format type must be defined by the backend + * @return Return depends on format + */ + public static function getItemShared($itemType, $itemSource, $format = self::FORMAT_NONE, $parameters = null, $includeCollections = false) { + return self::getItems($itemType, $itemSource, null, null, \OC_User::getUser(), $format, $parameters, -1, $includeCollections); + } + + /** + * @brief Share an item with a user, group, or via private link + * @param string Item type + * @param string Item source + * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_PRIVATE_LINK + * @param string User or group the item is being shared with + * @param int CRUDS permissions + * @return bool Returns true on success or false on failure + */ + public static function shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions) { + $uidOwner = \OC_User::getUser(); + // Verify share type and sharing conditions are met + if ($shareType === self::SHARE_TYPE_USER) { + if ($shareWith == $uidOwner) { + $message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' is the item owner'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + if (!\OC_User::userExists($shareWith)) { + $message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' does not exist'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + $inGroup = array_intersect(\OC_Group::getUserGroups($uidOwner), \OC_Group::getUserGroups($shareWith)); + if (empty($inGroup)) { + $message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' is not a member of any groups that '.$uidOwner.' is a member of'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + // Check if the item source is already shared with the user, either from the same owner or a different user + if ($checkExists = self::getItems($itemType, $itemSource, self::$shareTypeUserAndGroups, $shareWith, null, self::FORMAT_NONE, null, 1, true, true)) { + // Only allow the same share to occur again if it is the same owner and is not a user share, this use case is for increasing permissions for a specific user + if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) { + $message = 'Sharing '.$itemSource.' failed, because this item is already shared with '.$shareWith; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + } + } else if ($shareType === self::SHARE_TYPE_GROUP) { + if (!\OC_Group::groupExists($shareWith)) { + $message = 'Sharing '.$itemSource.' failed, because the group '.$shareWith.' does not exist'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + if (!\OC_Group::inGroup($uidOwner, $shareWith)) { + $message = 'Sharing '.$itemSource.' failed, because '.$uidOwner.' is not a member of the group '.$shareWith; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + // Check if the item source is already shared with the group, either from the same owner or a different user + // The check for each user in the group is done inside the put() function + if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_GROUP, $shareWith, null, self::FORMAT_NONE, null, 1, true, true)) { + // Only allow the same share to occur again if it is the same owner and is not a group share, this use case is for increasing permissions for a specific user + if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) { + $message = 'Sharing '.$itemSource.' failed, because this item is already shared with '.$shareWith; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + } + // Convert share with into an array with the keys group and users + $group = $shareWith; + $shareWith = array(); + $shareWith['group'] = $group; + $shareWith['users'] = array_diff(\OC_Group::usersInGroup($group), array($uidOwner)); + } else if ($shareType === self::SHARE_TYPE_PRIVATE_LINK) { + $shareWith = md5(uniqid($itemSource, true)); + return self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions); + } else if ($shareType === self::SHARE_TYPE_CONTACT) { + if (!\OC_App::isEnabled('contacts')) { + $message = 'Sharing '.$itemSource.' failed, because the contacts app is not enabled'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + return false; + } + $vcard = \OC_Contacts_App::getContactVCard($shareWith); + if (!isset($vcard)) { + $message = 'Sharing '.$itemSource.' failed, because the contact does not exist'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + $details = \OC_Contacts_VCard::structureContact($vcard); + // TODO Add ownCloud user to contacts vcard + if (!isset($details['EMAIL'])) { + $message = 'Sharing '.$itemSource.' failed, because no email address is associated with the contact'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + return self::shareItem($itemType, $itemSource, self::SHARE_TYPE_EMAIL, $details['EMAIL'], $permissions); + } else { + // Future share types need to include their own conditions + $message = 'Share type '.$shareType.' is not valid for '.$itemSource; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + // If the item is a folder, scan through the folder looking for equivalent item types + if ($itemType == 'folder') { + $parentFolder = self::put('folder', $itemSource, $shareType, $shareWith, $uidOwner, $permissions, true); + if ($parentFolder && $files = \OC_Files::getDirectoryContent($itemSource)) { + for ($i = 0; $i < count($files); $i++) { + $name = substr($files[$i]['name'], strpos($files[$i]['name'], $itemSource) - strlen($itemSource)); + if ($files[$i]['mimetype'] == 'httpd/unix-directory' && $children = \OC_Files::getDirectoryContent($name, '/')) { + // Continue scanning into child folders + array_push($files, $children); + } else { + // Check file extension for an equivalent item type to convert to + $extension = strtolower(substr($itemSource, strrpos($itemSource, '.') + 1)); + foreach (self::$backends as $type => $backend) { + if (isset($backend->dependsOn) && $backend->dependsOn == 'file' && isset($backend->supportedFileExtensions) && in_array($extension, $backend->supportedFileExtensions)) { + $itemType = $type; + break; + } + } + // Pass on to put() to check if this item should be converted, the item won't be inserted into the database unless it can be converted + self::put($itemType, $name, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder); + } + } + return true; + } + return false; + } else { + // Put the item into the database + return self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions); + } + } + + /** + * @brief Unshare an item from a user, group, or delete a private link + * @param string Item type + * @param string Item source + * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_PRIVATE_LINK + * @param string User or group the item is being shared with + * @return Returns true on success or false on failure + */ + public static function unshare($itemType, $itemSource, $shareType, $shareWith) { + if ($item = self::getItems($itemType, $itemSource, $shareType, $shareWith, \OC_User::getUser(), self::FORMAT_NONE, null, 1)) { + self::delete($item['id']); + return true; + } + return false; + } + + /** + * @brief Unshare an item shared with the current user + * @param string Item type + * @param string Item target + * @return Returns true on success or false on failure + * + * Unsharing from self is not allowed for items inside collections + * + */ + public static function unshareFromSelf($itemType, $itemTarget) { + if ($item = self::getItemSharedWith($itemType, $itemTarget)) { + if ((int)$item['share_type'] === self::SHARE_TYPE_GROUP) { + // TODO + } + // Delete + return self::delete($item['id'], true); + } + return false; + } + + /** + * @brief Set the permissions of an item for a specific user or group + * @param string Item type + * @param string Item source + * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_PRIVATE_LINK + * @param string User or group the item is being shared with + * @param int CRUDS permissions + * @return Returns true on success or false on failure + */ + public static function setPermissions($itemType, $itemSource, $shareType, $shareWith, $permissions) { + if ($item = self::getItems($itemType, $itemSource, $shareType, $shareWith, \OC_User::getUser(), self::FORMAT_NONE, null, 1, false)) { + // Check if this item is a reshare and verify that the permissions granted don't exceed the parent shared item + if (isset($item['parent'])) { + $query = \OC_DB::prepare('SELECT `permissions` FROM `*PREFIX*share` WHERE `id` = ?',1); + $result = $query->execute(array($item['parent']))->fetchRow(); + if (~(int)$result['permissions'] & $permissions) { + $message = 'Setting permissions for '.$itemSource.' failed, because the permissions exceed permissions granted to '.\OC_User::getUser(); + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + } + $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `permissions` = ? WHERE `id` = ?'); + $query->execute(array($permissions, $item['id'])); + // Check if permissions were removed + if ($item['permissions'] & ~$permissions) { + // If share permission is removed all reshares must be deleted + if (($item['permissions'] & self::PERMISSION_SHARE) && (~$permissions & self::PERMISSION_SHARE)) { + self::delete($item['id'], true); + } else { + $ids = array(); + $parents = array($item['id']); + while (!empty($parents)) { + $parents = "'".implode("','", $parents)."'"; + $query = \OC_DB::prepare('SELECT `id`, `permissions` FROM `*PREFIX*share` WHERE `parent` IN ('.$parents.')'); + $result = $query->execute(); + // Reset parents array, only go through loop again if items are found that need permissions removed + $parents = array(); + while ($item = $result->fetchRow()) { + // Check if permissions need to be removed + if ($item['permissions'] & ~$permissions) { + // Add to list of items that need permissions removed + $ids[] = $item['id']; + $parents[] = $item['id']; + } + } + } + // Remove the permissions for all reshares of this item + if (!empty($ids)) { + $ids = "'".implode("','", $ids)."'"; + $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `permissions` = `permissions` & ? WHERE `id` IN ('.$ids.')'); + $query->execute(array($permissions)); + } + } + } + return true; + } + $message = 'Setting permissions for '.$itemSource.' failed, because the item was not found'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + + /** + * @brief Get the backend class for the specified item type + * @param string Item type + * @return Sharing backend object + */ + private static function getBackend($itemType) { + if (isset(self::$backends[$itemType])) { + return self::$backends[$itemType]; + } else if (isset(self::$backendTypes[$itemType]['class'])) { + $class = self::$backendTypes[$itemType]['class']; + if (class_exists($class)) { + self::$backends[$itemType] = new $class; + if (!(self::$backends[$itemType] instanceof Share_Backend)) { + $message = 'Sharing backend '.$class.' must implement the interface OCP\Share_Backend'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + return self::$backends[$itemType]; + } else { + $message = 'Sharing backend '.$class.' not found'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + } + $message = 'Sharing backend for '.$itemType.' not found'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + + /** + * @brief Get a list of collection item types for the specified item type + * @param string Item type + * @return array + */ + private static function getCollectionItemTypes($itemType) { + $collectionTypes = array($itemType); + foreach (self::$backendTypes as $type => $backend) { + if (in_array($backend['collectionOf'], $collectionTypes)) { + $collectionTypes[] = $type; + } + } + if (count($collectionTypes) > 1) { + unset($collectionTypes[0]); + return $collectionTypes; + } + return false; + } + + /** + * @brief Get shared items from the database + * @param string Item type + * @param string Item source or target (optional) + * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, SHARE_TYPE_PRIVATE_LINK, $shareTypeUserAndGroups, or $shareTypeGroupUserUnique + * @param string User or group the item is being shared with + * @param string User that is the owner of shared items (optional) + * @param int Format to convert items to with formatItems() + * @param mixed Parameters to pass to formatItems() + * @param int Number of items to return, -1 to return all matches (optional) + * @param bool Include collection item types (optional) + * @return mixed + * + * See public functions getItem(s)... for parameter usage + * + */ + private static function getItems($itemType, $item = null, $shareType = null, $shareWith = null, $uidOwner = null, $format = self::FORMAT_NONE, $parameters = null, $limit = -1, $includeCollections = false, $itemShareWithBySource = false) { + $backend = self::getBackend($itemType); + // Get filesystem root to add it to the file target and remove from the file source, match file_source with the file cache + if ($itemType == 'file' || $itemType == 'folder') { + $root = \OC_Filesystem::getRoot(); + $where = 'INNER JOIN `*PREFIX*fscache` ON `file_source` = `*PREFIX*fscache`.`id`'; + if (!isset($item)) { + $where .= ' WHERE `file_target` IS NOT NULL'; + } + $fileDependent = true; + $queryArgs = array(); + } else { + $fileDependent = false; + $root = ''; + if ($includeCollections && !isset($item) && ($collectionTypes = self::getCollectionItemTypes($itemType))) { + // If includeCollections is true, find collections of this item type, e.g. a music album contains songs + $itemTypes = array_merge(array($itemType), $collectionTypes); + $placeholders = join(',', array_fill(0, count($itemTypes), '?')); + $where = ' WHERE `item_type` IN ('.$placeholders.')'; + $queryArgs = $itemTypes; + } else { + $where = ' WHERE `item_type` = ?'; + $queryArgs = array($itemType); + } + } + if (isset($shareType) && isset($shareWith)) { + // Include all user and group items + if ($shareType == self::$shareTypeUserAndGroups) { + $where .= ' AND `share_type` IN (?,?,?)'; + $queryArgs[] = self::SHARE_TYPE_USER; + $queryArgs[] = self::SHARE_TYPE_GROUP; + $queryArgs[] = self::$shareTypeGroupUserUnique; + $userAndGroups = array_merge(array($shareWith), \OC_Group::getUserGroups($shareWith)); + $placeholders = join(',', array_fill(0, count($userAndGroups), '?')); + $where .= ' AND `share_with` IN ('.$placeholders.')'; + $queryArgs = array_merge($queryArgs, $userAndGroups); + // Don't include own group shares + $where .= ' AND `uid_owner` != ?'; + $queryArgs[] = $shareWith; + } else { + $where .= ' AND `share_type` = ? AND `share_with` = ?'; + $queryArgs[] = $shareType; + $queryArgs[] = $shareWith; + } + } + if (isset($uidOwner)) { + $where .= ' AND `uid_owner` = ?'; + $queryArgs[] = $uidOwner; + if (!isset($shareType)) { + // Prevent unique user targets for group shares from being selected + $where .= ' AND `share_type` != ?'; + $queryArgs[] = self::$shareTypeGroupUserUnique; + } + if ($itemType == 'file' || $itemType == 'folder') { + $column = 'file_source'; + } else { + $column = 'item_source'; + } + } else { + if ($itemType == 'file' || $itemType == 'folder') { + $column = 'file_target'; + } else { + $column = 'item_target'; + } + } + if (isset($item)) { + // If looking for own shared items, check item_source else check item_target + if (isset($uidOwner) || $itemShareWithBySource) { + // If item type is a file, file source needs to be checked in case the item was converted + if ($itemType == 'file' || $itemType == 'folder') { + $where .= ' AND `file_source` = ?'; + $column = 'file_source'; + } else { + $where .= ' AND `item_source` = ?'; + $column = 'item_source'; + } + } else { + if ($itemType == 'file' || $itemType == 'folder') { + $where .= ' AND `file_target` = ?'; + } else { + $where .= ' AND `item_target` = ?'; + } + } + $queryArgs[] = $item; + if ($includeCollections && $collectionTypes = self::getCollectionItemTypes($itemType)) { + // TODO Bart - this doesn't work with only one argument +// $placeholders = join(',', array_fill(0, count($collectionTypes), '?')); +// $where .= " OR item_type IN ('".$placeholders."')"; +// $queryArgs = array_merge($queryArgs, $collectionTypes); + } + } + if ($limit != -1 && !$includeCollections) { + if ($shareType == self::$shareTypeUserAndGroups) { + // Make sure the unique user target is returned if it exists, unique targets should follow the group share in the database + // If the limit is not 1, the filtering can be done later + $where .= ' ORDER BY `*PREFIX*share`.`id` DESC'; + } + // The limit must be at least 3, because filtering needs to be done + if ($limit < 3) { + $limit = 3; + } + } + // TODO Optimize selects + if ($format == self::FORMAT_STATUSES) { + if ($itemType == 'file' || $itemType == 'folder') { + $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `file_source`, `path`'; + } else { + $select = '`id`, `item_type`, `item_source`, `parent`, `share_type`'; + } + } else { + if (isset($uidOwner)) { + if ($itemType == 'file' || $itemType == 'folder') { + $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path`, `permissions`, `stime`'; + } else { + $select = '`id`, `item_type`, `item_source`, `parent`, `share_type`, `share_with`, `permissions`, `stime`, `file_source`'; + } + } else { + if ($fileDependent) { + if (($itemType == 'file' || $itemType == 'folder') && $format == \OC_Share_Backend_File::FORMAT_FILE_APP || $format == \OC_Share_Backend_File::FORMAT_FILE_APP_ROOT) { + $select = '`*PREFIX*share`.`id`, `item_type`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `file_source`, `path`, `file_target`, `permissions`, `name`, `ctime`, `mtime`, `mimetype`, `size`, `encrypted`, `versioned`, `writable`'; + } else { + $select = '`*PREFIX*share`.`id`, `item_type`, `item_source`, `item_target`, `*PREFIX*share`.`parent`, `share_type`, `share_with`, `uid_owner`, `file_source`, `path`, `file_target`, `permissions`, `stime`'; + } + } else { + $select = '*'; + } + } + } + $root = strlen($root); + $query = \OC_DB::prepare('SELECT '.$select.' FROM `*PREFIX*share` '.$where, $limit); + $result = $query->execute($queryArgs); + $items = array(); + $targets = array(); + while ($row = $result->fetchRow()) { + // Filter out duplicate group shares for users with unique targets + if ($row['share_type'] == self::$shareTypeGroupUserUnique && isset($items[$row['parent']])) { + $row['share_type'] = self::SHARE_TYPE_GROUP; + $row['share_with'] = $items[$row['parent']]['share_with']; + // Remove the parent group share + unset($items[$row['parent']]); + } else if (!isset($uidOwner)) { + // Check if the same target already exists + if (isset($targets[$row[$column]])) { + // Check if the same owner shared with the user twice through a group and user share - this is allowed + $id = $targets[$row[$column]]; + if ($items[$id]['uid_owner'] == $row['uid_owner']) { + // Switch to group share type to ensure resharing conditions aren't bypassed + if ($items[$id]['share_type'] != self::SHARE_TYPE_GROUP) { + $items[$id]['share_type'] = self::SHARE_TYPE_GROUP; + $items[$id]['share_with'] = $row['share_with']; + } + // Switch ids if sharing permission is granted on only one share to ensure correct parent is used if resharing + if (~(int)$items[$id]['permissions'] & self::PERMISSION_SHARE && (int)$row['permissions'] & self::PERMISSION_SHARE) { + $items[$row['id']] = $items[$id]; + unset($items[$id]); + $id = $row['id']; + } + // Combine the permissions for the item + $items[$id]['permissions'] |= (int)$row['permissions']; + continue; + } + } else { + $targets[$row[$column]] = $row['id']; + } + } + // Remove root from file source paths if retrieving own shared items + if (isset($uidOwner) && isset($row['path'])) { + if (isset($row['parent'])) { + $row['path'] = '/Shared/'.basename($row['path']); + } else { + $row['path'] = substr($row['path'], $root); + } + } + $items[$row['id']] = $row; + } + if (!empty($items)) { + $collectionItems = array(); + foreach ($items as &$row) { + // Return only the item instead of a 2-dimensional array + if ($limit == 1 && $row['item_type'] == $itemType && $row[$column] == $item) { + if ($format == self::FORMAT_NONE) { + return $row; + } else { + break; + } + } + // Check if this is a collection of the requested item type + if ($includeCollections && $row['item_type'] != $itemType && ($collectionBackend = self::getBackend($row['item_type'])) && $collectionBackend instanceof Share_Backend_Collection) { + $row['collection'] = array('item_type' => $itemType, $column => $row[$column]); + // Fetch all of the children sources + $children = $collectionBackend->getChildren($row[$column]); + foreach ($children as $child) { + $childItem = $row; + $childItem['item_source'] = $child; +// $childItem['item_target'] = $child['target']; TODO + if (isset($item)) { + if ($childItem[$column] == $item) { + // Return only the item instead of a 2-dimensional array + if ($limit == 1 && $format == self::FORMAT_NONE) { + return $childItem; + } else { + // Unset the items array and break out of both loops + $items = array(); + $items[] = $childItem; + break 2; + } + } + } else { + $collectionItems[] = $childItem; + } + } + // Remove collection item + unset($items[$row['id']]); + } + } + if (!empty($collectionItems)) { + $items = array_merge($items, $collectionItems); + } + if ($format == self::FORMAT_NONE) { + return $items; + } else if ($format == self::FORMAT_STATUSES) { + $statuses = array(); + // Switch column to path for files and folders, used for determining statuses inside of folders + if ($itemType == 'file' || $itemType == 'folder') { + $column = 'path'; + } + foreach ($items as $item) { + if ($item['share_type'] == self::SHARE_TYPE_PRIVATE_LINK) { + $statuses[$item[$column]] = true; + } else if (!isset($statuses[$item[$column]])) { + $statuses[$item[$column]] = false; + } + } + return $statuses; + } else { + return $backend->formatItems($items, $format, $parameters); + } + } else if ($limit == 1 || (isset($uidOwner) && isset($item))) { + return false; + } + return array(); + } + + /** + * @brief Put shared item into the database + * @param string Item type + * @param string Item source + * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_PRIVATE_LINK + * @param string User or group the item is being shared with + * @param int CRUDS permissions + * @param bool|array Parent folder target (optional) + * @return bool Returns true on success or false on failure + */ + private static function put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $parentFolder = null) { + $backend = self::getBackend($itemType); + // Check if this is a reshare + if ($checkReshare = self::getItemSharedWithBySource($itemType, $itemSource, self::FORMAT_NONE, null, true)) { + // Check if attempting to share back to owner + if ($checkReshare['uid_owner'] == $shareWith && $shareType == self::SHARE_TYPE_USER) { + $message = 'Sharing '.$itemSource.' failed, because the user '.$shareWith.' is the original sharer'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + // Check if share permissions is granted + if ((int)$checkReshare['permissions'] & self::PERMISSION_SHARE) { + if (~(int)$checkReshare['permissions'] & $permissions) { + $message = 'Sharing '.$itemSource.' failed, because the permissions exceed permissions granted to '.$uidOwner; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } else { + // TODO Don't check if inside folder + $parent = $checkReshare['id']; + $itemSource = $checkReshare['item_source']; + // TODO Suggest item/file target + $suggestedItemTarget = $checkReshare['item_target']; + $fileSource = $checkReshare['file_source']; + $filePath = $checkReshare['file_target']; + } + } else { + $message = 'Sharing '.$itemSource.' failed, because resharing is not allowed'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + } else { + $parent = null; + if (!$backend->isValidSource($itemSource, $uidOwner)) { + $message = 'Sharing '.$itemSource.' failed, because the sharing backend for '.$itemType.' could not find its source'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + $parent = null; + if ($backend instanceof Share_Backend_File_Dependent) { + $filePath = $backend->getFilePath($itemSource, $uidOwner); + if ($itemType == 'file' && $itemType == 'folder') { + $fileSource = $itemSource; + } else { + $fileSource = \OC_FileCache::getId($filePath); + } + if ($fileSource == -1) { + $message = 'Sharing '.$itemSource.' failed, because the file could not be found in the file cache'; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + } else { + $filePath = null; + $fileSource = null; + } + } + $query = \OC_DB::prepare('INSERT INTO `*PREFIX*share` (`item_type`, `item_source`, `item_target`, `parent`, `share_type`, `share_with`, `uid_owner`, `permissions`, `stime`, `file_source`, `file_target`) VALUES (?,?,?,?,?,?,?,?,?,?,?)'); + // Share with a group + if ($shareType == self::SHARE_TYPE_GROUP) { + if (isset($fileSource)) { + if ($parentFolder) { + if ($parentFolder === true) { + $groupFileTarget = self::generateTarget('file', $filePath, $shareType, $shareWith['group'], $uidOwner); + // Set group default file target for future use + $parentFolders[0]['folder'] = $groupFileTarget; + } else { + // Get group default file target + $groupFileTarget = $parentFolder[0]['folder'].$itemSource; + $parent = $parentFolder[0]['id']; + unset($parentFolder[0]); + // Only loop through users we know have different file target paths + $uidSharedWith = array_keys($parentFolder); + } + } else { + $groupFileTarget = self::generateTarget('file', $filePath, $shareType, $shareWith['group'], $uidOwner); + } + } else { + $groupFileTarget = null; + } + $groupItemTarget = self::generateTarget($itemType, $itemSource, $shareType, $shareWith['group'], $uidOwner); + $uniqueTargets = array(); + // Loop through all users of this group in case we need to add an extra row + foreach ($shareWith['users'] as $uid) { + $itemTarget = self::generateTarget($itemType, $itemSource, self::SHARE_TYPE_USER, $uid, $uidOwner); + if (isset($fileSource)) { + if ($parentFolder) { + if ($parentFolder === true) { + $fileTarget = self::generateTarget('file', $filePath, self::SHARE_TYPE_USER, $uid, $uidOwner); + if ($fileTarget != $groupFileTarget) { + $parentFolders[$uid]['folder'] = $fileTarget; + } + } else if (isset($parentFolder[$uid])) { + $fileTarget = $parentFolder[$uid]['folder'].$itemSource; + $parent = $parentFolder[$uid]['id']; + } + } else { + $fileTarget = self::generateTarget('file', $filePath, self::SHARE_TYPE_USER, $uid, $uidOwner); + } + } else { + $fileTarget = null; + } + // Insert an extra row for the group share if the item or file target is unique for this user + if ($itemTarget != $groupItemTarget || (isset($fileSource) && $fileTarget != $groupFileTarget)) { + $uniqueTargets[] = array('uid' => $uid, 'item_target' => $itemTarget, 'file_target' => $fileTarget); + } + } + $query->execute(array($itemType, $itemSource, $groupItemTarget, $parent, $shareType, $shareWith['group'], $uidOwner, $permissions, time(), $fileSource, $groupFileTarget)); + // Save this id, any extra rows for this group share will need to reference it + $parent = \OC_DB::insertid('*PREFIX*share'); + foreach ($uniqueTargets as $unique) { + $query->execute(array($itemType, $itemSource, $unique['item_target'], $parent, self::$shareTypeGroupUserUnique, $unique['uid'], $uidOwner, $permissions, time(), $fileSource, $unique['file_target'])); + $id = \OC_DB::insertid('*PREFIX*share'); + if ($parentFolder === true) { + $parentFolders['id'] = $id; + } + } + if ($parentFolder === true) { + // Return parent folders to preserve file target paths for potential children + return $parentFolders; + } + } else { + $itemTarget = self::generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner); + if (isset($fileSource)) { + if ($parentFolder) { + if ($parentFolder === true) { + $fileTarget = self::generateTarget('file', $filePath, $shareType, $shareWith, $uidOwner); + $parentFolders['folder'] = $fileTarget; + } else { + $fileTarget = $parentFolder['folder'].$itemSource; + $parent = $parentFolder['id']; + } + } else { + $fileTarget = self::generateTarget('file', $filePath, $shareType, $shareWith, $uidOwner); + } + } else { + $fileTarget = null; + } + $query->execute(array($itemType, $itemSource, $itemTarget, $parent, $shareType, $shareWith, $uidOwner, $permissions, time(), $fileSource, $fileTarget)); + $id = \OC_DB::insertid('*PREFIX*share'); + if ($parentFolder === true) { + $parentFolders['id'] = $id; + // Return parent folder to preserve file target paths for potential children + return $parentFolders; + } + } + return true; + } + + /** + * @brief Generate a unique target for the item + * @param string Item type + * @param string Item source + * @param int SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_PRIVATE_LINK + * @param string User or group the item is being shared with + * @return string Item target + * + * TODO Use a suggested item target by default + * + */ + private static function generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner) { + $backend = self::getBackend($itemType); + if ($shareType == self::SHARE_TYPE_PRIVATE_LINK) { + return $backend->generateTarget($itemSource, false); + } else { + if ($itemType == 'file' || $itemType == 'folder') { + $column = 'file_target'; + } else { + $column = 'item_target'; + } + if ($shareType == self::SHARE_TYPE_USER) { + // Share with is a user, so set share type to user and groups + $shareType = self::$shareTypeUserAndGroups; + $userAndGroups = array_merge(array($shareWith), \OC_Group::getUserGroups($shareWith)); + } else { + $userAndGroups = false; + } + $exclude = null; + // Backend has 3 opportunities to generate a unique target + for ($i = 0; $i < 2; $i++) { + if ($shareType == self::SHARE_TYPE_GROUP) { + $target = $backend->generateTarget($itemSource, false, $exclude); + } else { + $target = $backend->generateTarget($itemSource, $shareWith, $exclude); + } + if (is_array($exclude) && in_array($target, $exclude)) { + break; + } + // Check if target already exists + if ($checkTarget = self::getItems($itemType, $target, $shareType, $shareWith, null, self::FORMAT_NONE, null, 1)) { + // If matching target is from the same owner, use the same target. The share type will be different so this isn't the same share. + if ($checkTarget['uid_owner'] == $uidOwner) { + return $target; + } + if (!isset($exclude)) { + $exclude = array(); + } + // Find similar targets to improve backend's chances to generate a unqiue target + if ($userAndGroups) { + $checkTargets = \OC_DB::prepare('SELECT `'.$column.'` FROM `*PREFIX*share` WHERE `item_type` = ? AND `share_type` IN (?,?,?) AND `share_with` IN (\''.implode('\',\'', $userAndGroups).'\') AND `'.$column.'` LIKE ?'); + $result = $checkTargets->execute(array($itemType, self::SHARE_TYPE_USER, self::SHARE_TYPE_GROUP, self::$shareTypeGroupUserUnique, '%'.$target.'%')); + } else { + $checkTargets = \OC_DB::prepare('SELECT `'.$column.'` FROM `*PREFIX*share` WHERE `item_type` = ? AND `share_type` = ? AND `share_with` = ? AND `'.$column.'` LIKE ?'); + $result = $checkTargets->execute(array($itemType, self::SHARE_TYPE_GROUP, $shareWith, '%'.$target.'%')); + } + while ($row = $result->fetchRow()) { + $exclude[] = $row[$column]; + } + } else { + return $target; + } + } + } + $message = 'Sharing backend registered for '.$itemType.' did not generate a unique target for '.$itemSource; + \OC_Log::write('OCP\Share', $message, \OC_Log::ERROR); + throw new \Exception($message); + } + + /** + * @brief Delete all reshares of an item + * @param int Id of item to delete + * @param bool If true, exclude the parent from the delete (optional) + * @param string The user that the parent was shared with (optinal) + */ + private static function delete($parent, $excludeParent = false, $uidOwner = null) { + $ids = array($parent); + $parents = array($parent); + while (!empty($parents)) { + $parents = "'".implode("','", $parents)."'"; + // Check the owner on the first search of reshares, useful for finding and deleting the reshares by a single user of a group share + if (count($ids) == 1 && isset($uidOwner)) { + $query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*share` WHERE `parent` IN ('.$parents.') AND `uid_owner` = ?'); + $result = $query->execute(array($uidOwner)); + } else { + $query = \OC_DB::prepare('SELECT `id`, `item_type`, `item_target`, `parent`, `uid_owner` FROM `*PREFIX*share` WHERE `parent` IN ('.$parents.')'); + $result = $query->execute(); + } + // Reset parents array, only go through loop again if items are found + $parents = array(); + while ($item = $result->fetchRow()) { + // Search for a duplicate parent share, this occurs when an item is shared to the same user through a group and user or the same item is shared by different users + $userAndGroups = array_merge(array($item['uid_owner']), \OC_Group::getUserGroups($item['uid_owner'])); + $query = \OC_DB::prepare('SELECT `id`, `permissions` FROM `*PREFIX*share` WHERE `item_type` = ? AND `item_target` = ? AND `share_type` IN (?,?,?) AND `share_with` IN (\''.implode('\',\'', $userAndGroups).'\') AND `uid_owner` != ? AND `id` != ?'); + $duplicateParent = $query->execute(array($item['item_type'], $item['item_target'], self::SHARE_TYPE_USER, self::SHARE_TYPE_GROUP, self::$shareTypeGroupUserUnique, $item['uid_owner'], $item['parent']))->fetchRow(); + if ($duplicateParent) { + // Change the parent to the other item id if share permission is granted + if ($duplicateParent['permissions'] & self::PERMISSION_SHARE) { + $query = \OC_DB::prepare('UPDATE `*PREFIX*share` SET `parent` = ? WHERE `id` = ?'); + $query->execute(array($duplicateParent['id'], $item['id'])); + continue; + } + } + $ids[] = $item['id']; + $parents[] = $item['id']; + } + } + if ($excludeParent) { + unset($ids[0]); + } + if (!empty($ids)) { + $ids = "'".implode("','", $ids)."'"; + $query = \OC_DB::prepare('DELETE FROM `*PREFIX*share` WHERE `id` IN ('.$ids.')'); + $query->execute(); + } + } + + /** + * Hook Listeners + */ + + public static function post_deleteUser($arguments) { + // Delete any items shared with the deleted user + $query = \OC_DB::prepare('DELETE FROM `*PREFIX*share` WHERE `share_with` = ? AND `share_type` = ? OR `share_type` = ?'); + $result = $query->execute(array($arguments['uid'], self::SHARE_TYPE_USER, self::$shareTypeGroupUserUnique)); + // Delete any items the deleted user shared + $query = \OC_DB::prepare('SELECT `id` FROM `*PREFIX*share` WHERE `uid_owner` = ?'); + $result = $query->execute(array($arguments['uid'])); + while ($item = $result->fetchRow()) { + self::delete($item['id']); + } + } + + public static function post_addToGroup($arguments) { + // TODO + } + + public static function post_removeFromGroup($arguments) { + // TODO Don't call if user deleted? + $query = \OC_DB::prepare('SELECT `id`, `share_type` FROM `*PREFIX*share` WHERE (`share_type` = ? AND `share_with` = ?) OR (`share_type` = ? AND `share_with` = ?)'); + $result = $query->execute(array(self::SHARE_TYPE_GROUP, $arguments['gid'], self::$shareTypeGroupUserUnique, $arguments['uid'])); + while ($item = $result->fetchRow()) { + if ($item['share_type'] == self::SHARE_TYPE_GROUP) { + // Delete all reshares by this user of the group share + self::delete($item['id'], true, $arguments['uid']); + } else { + self::delete($item['id']); + } + } + } + +} + +/** +* Interface that apps must implement to share content. +*/ +interface Share_Backend { + + /** + * @brief Get the source of the item to be stored in the database + * @param string Item source + * @param string Owner of the item + * @return mixed|array|false Source + * + * Return an array if the item is file dependent, the array needs two keys: 'item' and 'file' + * Return false if the item does not exist for the user + * + * The formatItems() function will translate the source returned back into the item + */ + public function isValidSource($itemSource, $uidOwner); + + /** + * @brief Get a unique name of the item for the specified user + * @param string Item source + * @param string|false User the item is being shared with + * @param array|null List of similar item names already existing as shared items + * @return string Target name + * + * This function needs to verify that the user does not already have an item with this name. + * If it does generate a new name e.g. name_# + */ + public function generateTarget($itemSource, $shareWith, $exclude = null); + + /** + * @brief Converts the shared item sources back into the item in the specified format + * @param array Shared items + * @param int Format + * @return ? + * + * The items array is a 3-dimensional array with the item_source as the first key and the share id as the second key to an array with the share info. + * The key/value pairs included in the share info depend on the function originally called: + * If called by getItem(s)Shared: id, item_type, item, item_source, share_type, share_with, permissions, stime, file_source + * If called by getItem(s)SharedWith: id, item_type, item, item_source, item_target, share_type, share_with, permissions, stime, file_source, file_target + * This function allows the backend to control the output of shared items with custom formats. + * It is only called through calls to the public getItem(s)Shared(With) functions. + */ + public function formatItems($items, $format, $parameters = null); + +} + +/** +* Interface for share backends that share content that is dependent on files. +* Extends the Share_Backend interface. +*/ +interface Share_Backend_File_Dependent extends Share_Backend { + + /** + * @brief Get the file path of the item + * @param + * @param + * @return + */ + public function getFilePath($itemSource, $uidOwner); + +} + +/** +* Interface for collections of of items implemented by another share backend. +* Extends the Share_Backend interface. +*/ +interface Share_Backend_Collection extends Share_Backend { + + /** + * @brief Get the sources of the children of the item + * @param string Item source + * @return array Returns an array of sources + */ + public function getChildren($itemSource); + +} + +?> diff --git a/lib/setup.php b/lib/setup.php index 4d71bed86e..f7e8c6950c 100644 --- a/lib/setup.php +++ b/lib/setup.php @@ -3,11 +3,13 @@ $hasSQLite = (is_callable('sqlite_open') or class_exists('SQLite3')); $hasMySQL = is_callable('mysql_connect'); $hasPostgreSQL = is_callable('pg_connect'); +$hasOracle = is_callable('oci_connect'); $datadir = OC_Config::getValue('datadirectory', OC::$SERVERROOT.'/data'); $opts = array( 'hasSQLite' => $hasSQLite, 'hasMySQL' => $hasMySQL, 'hasPostgreSQL' => $hasPostgreSQL, + 'hasOracle' => $hasOracle, 'directory' => $datadir, 'errors' => array(), ); @@ -46,11 +48,14 @@ class OC_Setup { $error[] = 'Specify a data folder.'; } - if($dbtype=='mysql' or $dbtype=='pgsql') { //mysql and postgresql needs more config options + if($dbtype=='mysql' or $dbtype == 'pgsql' or $dbtype == 'oci') { //mysql and postgresql needs more config options if($dbtype=='mysql') $dbprettyname = 'MySQL'; - else - $dbprettyname = 'PostgreSQL'; + else if($dbtype=='pgsql') + $dbprettyname = 'PostgreSQL'; + else + $dbprettyname = 'Oracle'; + if(empty($options['dbuser'])) { $error[] = "$dbprettyname enter the database username."; @@ -107,7 +112,7 @@ class OC_Setup { if(mysql_query($query, $connection)) { //use the admin login data for the new database user - //add prefix to the mysql user name to prevent collissions + //add prefix to the mysql user name to prevent collisions $dbusername=substr('oc_'.$username,0,16); if($dbusername!=$oldUser){ //hash the password so we don't need to store the admin config in the config file @@ -175,7 +180,7 @@ class OC_Setup { if($result and pg_num_rows($result) > 0) { //use the admin login data for the new database user - //add prefix to the postgresql user name to prevent collissions + //add prefix to the postgresql user name to prevent collisions $dbusername='oc_'.$username; //create a new password so we don't need to store the admin config in the config file $dbpassword=md5(time()); @@ -227,6 +232,117 @@ class OC_Setup { } } } + elseif($dbtype == 'oci') { + $dbuser = $options['dbuser']; + $dbpass = $options['dbpass']; + $dbname = $options['dbname']; + $dbtablespace = $options['dbtablespace']; + $dbhost = $options['dbhost']; + $dbtableprefix = isset($options['dbtableprefix']) ? $options['dbtableprefix'] : 'oc_'; + OC_CONFIG::setValue('dbname', $dbname); + OC_CONFIG::setValue('dbtablespace', $dbtablespace); + OC_CONFIG::setValue('dbhost', $dbhost); + OC_CONFIG::setValue('dbtableprefix', $dbtableprefix); + + $e_host = addslashes($dbhost); + $e_dbname = addslashes($dbname); + //check if the database user has admin right + $connection_string = '//'.$e_host.'/'.$e_dbname; + $connection = @oci_connect($dbuser, $dbpass, $connection_string); + if(!$connection) { + $e = oci_error(); + $error[] = array( + 'error' => 'Oracle username and/or password not valid', + 'hint' => 'You need to enter either an existing account or the administrator.' + ); + return $error; + } else { + //check for roles creation rights in oracle + + $query="SELECT count(*) FROM user_role_privs, role_sys_privs WHERE user_role_privs.granted_role = role_sys_privs.role AND privilege = 'CREATE ROLE'"; + $stmt = oci_parse($connection, $query); + if (!$stmt) { + $entry='DB Error: "'.oci_last_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + $result = oci_execute($stmt); + if($result) { + $row = oci_fetch_row($stmt); + } + if($result and $row[0] > 0) { + //use the admin login data for the new database user + + //add prefix to the oracle user name to prevent collisions + $dbusername='oc_'.$username; + //create a new password so we don't need to store the admin config in the config file + $dbpassword=md5(time().$dbpass); + + //oracle passwords are treated as identifiers: + // must start with aphanumeric char + // needs to be shortened to 30 bytes, as the two " needed to escape the identifier count towards the identifier length. + $dbpassword=substr($dbpassword, 0, 30); + + self::oci_createDBUser($dbusername, $dbpassword, $dbtablespace, $connection); + + OC_CONFIG::setValue('dbuser', $dbusername); + OC_CONFIG::setValue('dbname', $dbusername); + OC_CONFIG::setValue('dbpassword', $dbpassword); + + //create the database not neccessary, oracle implies user = schema + //self::oci_createDatabase($dbname, $dbusername, $connection); + } else { + + OC_CONFIG::setValue('dbuser', $dbuser); + OC_CONFIG::setValue('dbname', $dbname); + OC_CONFIG::setValue('dbpassword', $dbpass); + + //create the database not neccessary, oracle implies user = schema + //self::oci_createDatabase($dbname, $dbuser, $connection); + } + + //FIXME check tablespace exists: select * from user_tablespaces + + // the connection to dbname=oracle is not needed anymore + oci_close($connection); + + // connect to the oracle database (schema=$dbuser) an check if the schema needs to be filled + $dbuser = OC_CONFIG::getValue('dbuser'); + //$dbname = OC_CONFIG::getValue('dbname'); + $dbpass = OC_CONFIG::getValue('dbpassword'); + + $e_host = addslashes($dbhost); + $e_dbname = addslashes($dbname); + + $connection_string = '//'.$e_host.'/'.$e_dbname; + $connection = @oci_connect($dbuser, $dbpass, $connection_string); + if(!$connection) { + $error[] = array( + 'error' => 'Oracle username and/or password not valid', + 'hint' => 'You need to enter either an existing account or the administrator.' + ); + return $error; + } else { + $query = "SELECT count(*) FROM user_tables WHERE table_name = :un"; + $stmt = oci_parse($connection, $query); + $un = $dbtableprefix.'users'; + oci_bind_by_name($stmt, ':un', $un); + if (!$stmt) { + $entry='DB Error: "'.oci_last_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + $result = oci_execute($stmt); + + if($result) { + $row = oci_fetch_row($stmt); + } + if(!$result or $row[0]==0) { + OC_DB::createDbFromStructure('db_structure.xml'); + } + } + } + } else { //delete the old sqlite database first, might cause infinte loops otherwise if(file_exists("$datadir/owncloud.db")){ @@ -346,6 +462,79 @@ class OC_Setup { } } } + /** + * + * @param String $name + * @param String $password + * @param String $tablespace + * @param resource $connection + */ + private static function oci_createDBUser($name, $password, $tablespace, $connection) { + + $query = "SELECT * FROM all_users WHERE USERNAME = :un"; + $stmt = oci_parse($connection, $query); + if (!$stmt) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + oci_bind_by_name($stmt, ':un', $name); + $result = oci_execute($stmt); + if(!$result) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + + if(! oci_fetch_row($stmt)) { + //user does not exists let's create it :) + //password must start with alphabetic character in oracle + $query = 'CREATE USER '.$name.' IDENTIFIED BY "'.$password.'" DEFAULT TABLESPACE '.$tablespace; //TODO set default tablespace + $stmt = oci_parse($connection, $query); + if (!$stmt) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + //oci_bind_by_name($stmt, ':un', $name); + $result = oci_execute($stmt); + if(!$result) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.', name:'.$name.', password:'.$password.'
    '; + echo($entry); + } + } else { // change password of the existing role + $query = "ALTER USER :un IDENTIFIED BY :pw"; + $stmt = oci_parse($connection, $query); + if (!$stmt) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + oci_bind_by_name($stmt, ':un', $name); + oci_bind_by_name($stmt, ':pw', $password); + $result = oci_execute($stmt); + if(!$result) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + } + // grant neccessary roles + $query = 'GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE TRIGGER, UNLIMITED TABLESPACE TO '.$name; + $stmt = oci_parse($connection, $query); + if (!$stmt) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.'
    '; + echo($entry); + } + $result = oci_execute($stmt); + if(!$result) { + $entry='DB Error: "'.oci_error($connection).'"
    '; + $entry.='Offending command was: '.$query.', name:'.$name.', password:'.$password.'
    '; + echo($entry); + } + } /** * create .htaccess files for apache hosts diff --git a/lib/subadmin.php b/lib/subadmin.php index 0806f27a6b..8d4f413b10 100644 --- a/lib/subadmin.php +++ b/lib/subadmin.php @@ -37,7 +37,7 @@ class OC_SubAdmin{ * @return boolean */ public static function createSubAdmin($uid, $gid){ - $stmt = OC_DB::prepare('INSERT INTO *PREFIX*group_admin (gid,uid) VALUES(?,?)'); + $stmt = OC_DB::prepare('INSERT INTO `*PREFIX*group_admin` (`gid`,`uid`) VALUES(?,?)'); $result = $stmt->execute(array($gid, $uid)); OC_Hook::emit( "OC_SubAdmin", "post_createSubAdmin", array( "gid" => $gid )); return true; @@ -50,7 +50,7 @@ class OC_SubAdmin{ * @return boolean */ public static function deleteSubAdmin($uid, $gid){ - $stmt = OC_DB::prepare('DELETE FROM *PREFIX*group_admin WHERE gid = ? AND uid = ?'); + $stmt = OC_DB::prepare('DELETE FROM `*PREFIX*group_admin` WHERE `gid` = ? AND `uid` = ?'); $result = $stmt->execute(array($gid, $uid)); OC_Hook::emit( "OC_SubAdmin", "post_deleteSubAdmin", array( "gid" => $gid )); return true; @@ -62,7 +62,7 @@ class OC_SubAdmin{ * @return array */ public static function getSubAdminsGroups($uid){ - $stmt = OC_DB::prepare('SELECT gid FROM *PREFIX*group_admin WHERE uid = ?'); + $stmt = OC_DB::prepare('SELECT `gid` FROM `*PREFIX*group_admin` WHERE `uid` = ?'); $result = $stmt->execute(array($uid)); $gids = array(); while($row = $result->fetchRow()){ @@ -77,7 +77,7 @@ class OC_SubAdmin{ * @return array */ public static function getGroupsSubAdmins($gid){ - $stmt = OC_DB::prepare('SELECT uid FROM *PREFIX*group_admin WHERE gid = ?'); + $stmt = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*group_admin` WHERE `gid` = ?'); $result = $stmt->execute(array($gid)); $uids = array(); while($row = $result->fetchRow()){ @@ -91,7 +91,7 @@ class OC_SubAdmin{ * @return array */ public static function getAllSubAdmins(){ - $stmt = OC_DB::prepare('SELECT * FROM *PREFIX*group_admin'); + $stmt = OC_DB::prepare('SELECT * FROM `*PREFIX*group_admin`'); $result = $stmt->execute(); $subadmins = array(); while($row = $result->fetchRow()){ @@ -107,7 +107,7 @@ class OC_SubAdmin{ * @return bool */ public static function isSubAdminofGroup($uid, $gid){ - $stmt = OC_DB::prepare('SELECT COUNT(*) as count FROM *PREFIX*group_admin where uid = ? AND gid = ?'); + $stmt = OC_DB::prepare('SELECT COUNT(*) AS `count` FROM `*PREFIX*group_admin` WHERE `uid` = ? AND `gid` = ?'); $result = $stmt->execute(array($uid, $gid)); $result = $result->fetchRow(); if($result['count'] >= 1){ @@ -122,7 +122,7 @@ class OC_SubAdmin{ * @return bool */ public static function isSubAdmin($uid){ - $stmt = OC_DB::prepare('SELECT COUNT(*) as count FROM *PREFIX*group_admin WHERE uid = ?'); + $stmt = OC_DB::prepare('SELECT COUNT(*) AS `count` FROM `*PREFIX*group_admin` WHERE `uid` = ?'); $result = $stmt->execute(array($uid)); $result = $result->fetchRow(); if($result['count'] > 0){ @@ -163,7 +163,7 @@ class OC_SubAdmin{ * @return boolean */ public static function post_deleteUser($parameters){ - $stmt = OC_DB::prepare('DELETE FROM *PREFIX*group_admin WHERE uid = ?'); + $stmt = OC_DB::prepare('DELETE FROM `*PREFIX*group_admin` WHERE `uid` = ?'); $result = $stmt->execute(array($parameters['uid'])); return true; } @@ -174,7 +174,7 @@ class OC_SubAdmin{ * @return boolean */ public static function post_deleteGroup($parameters){ - $stmt = OC_DB::prepare('DELETE FROM *PREFIX*group_admin WHERE gid = ?'); + $stmt = OC_DB::prepare('DELETE FROM `*PREFIX*group_admin` WHERE `gid` = ?'); $result = $stmt->execute(array($parameters['gid'])); return true; } diff --git a/lib/template.php b/lib/template.php index 5b6999af53..a10ddcd5c3 100644 --- a/lib/template.php +++ b/lib/template.php @@ -475,7 +475,7 @@ class OC_Template{ public static function printGuestPage( $application, $name, $parameters = array() ){ $content = new OC_Template( $application, $name, "guest" ); foreach( $parameters as $key => $value ){ - $content->assign( $key, $value,false ); + $content->assign( $key, $value, false ); } return $content->printPage(); } diff --git a/lib/updater.php b/lib/updater.php index 332cea03bf..967f64c0b3 100644 --- a/lib/updater.php +++ b/lib/updater.php @@ -71,6 +71,7 @@ class OC_Updater{ return($txt); } + /** * do ownCloud update */ diff --git a/lib/user.php b/lib/user.php index cbd1400844..06a56b7f4a 100644 --- a/lib/user.php +++ b/lib/user.php @@ -338,7 +338,7 @@ class OC_User { * * Get a list of all users. */ - public static function getUsers($search = '', $limit = -1, $offset = 0) { + public static function getUsers($search = '', $limit = null, $offset = null) { $users = array(); foreach (self::$_usedBackends as $backend) { $backendUsers = $backend->getUsers($search, $limit, $offset); @@ -370,7 +370,7 @@ class OC_User { * @param string $userid the user to disable */ public static function disableUser($userid){ - $query = "INSERT INTO *PREFIX*preferences (`userid`, `appid`, `configkey`, `configvalue`) VALUES(?, ?, ?, ?)"; + $query = "INSERT INTO `*PREFIX*preferences` (`userid`, `appid`, `configkey`, `configvalue`) VALUES(?, ?, ?, ?)"; $query = OC_DB::prepare($query); $query->execute(array($userid, 'core', 'enabled', 'false')); } @@ -380,7 +380,7 @@ class OC_User { * @param string $userid */ public static function enableUser($userid){ - $query = "DELETE FROM *PREFIX*preferences WHERE userid = ? AND appid = ? AND configkey = ? AND configvalue = ?"; + $query = "DELETE FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? AND `configvalue` = ?"; $query = OC_DB::prepare($query); $query->execute(array($userid, 'core', 'enabled', 'false')); } @@ -391,7 +391,7 @@ class OC_User { * @return bool */ public static function isEnabled($userid){ - $query = "SELECT userid FROM *PREFIX*preferences WHERE userid = ? AND appid = ? AND configkey = ? AND configvalue = ?"; + $query = "SELECT `userid` FROM `*PREFIX*preferences` WHERE `userid` = ? AND `appid` = ? AND `configkey` = ? AND `configvalue` = ?"; $query = OC_DB::prepare($query); $results = $query->execute(array($userid, 'core', 'enabled', 'false')); return $results->numRows() ? false : true; diff --git a/lib/user/database.php b/lib/user/database.php index 1deed51761..dff4d145fc 100644 --- a/lib/user/database.php +++ b/lib/user/database.php @@ -69,7 +69,7 @@ class OC_User_Database extends OC_User_Backend { }else{ $hasher=$this->getHasher(); $hash = $hasher->HashPassword($password.OC_Config::getValue('passwordsalt', '')); - $query = OC_DB::prepare( "INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )" ); + $query = OC_DB::prepare( 'INSERT INTO `*PREFIX*users` ( `uid`, `password` ) VALUES( ?, ? )' ); $result = $query->execute( array( $uid, $hash)); return $result ? true : false; @@ -85,7 +85,7 @@ class OC_User_Database extends OC_User_Backend { */ public function deleteUser( $uid ){ // Delete user-group-relation - $query = OC_DB::prepare( "DELETE FROM `*PREFIX*users` WHERE uid = ?" ); + $query = OC_DB::prepare( 'DELETE FROM `*PREFIX*users` WHERE uid = ?' ); $query->execute( array( $uid )); return true; } @@ -102,7 +102,7 @@ class OC_User_Database extends OC_User_Backend { if( $this->userExists($uid) ){ $hasher=$this->getHasher(); $hash = $hasher->HashPassword($password.OC_Config::getValue('passwordsalt', '')); - $query = OC_DB::prepare( "UPDATE *PREFIX*users SET password = ? WHERE uid = ?" ); + $query = OC_DB::prepare( 'UPDATE `*PREFIX*users` SET `password` = ? WHERE `uid` = ?' ); $query->execute( array( $hash, $uid )); return true; @@ -121,7 +121,7 @@ class OC_User_Database extends OC_User_Backend { * returns the user id or false */ public function checkPassword( $uid, $password ){ - $query = OC_DB::prepare( "SELECT uid, password FROM *PREFIX*users WHERE uid = ?" ); + $query = OC_DB::prepare( 'SELECT `uid`, `password` FROM `*PREFIX*users` WHERE `uid` = ?' ); $result = $query->execute( array( $uid)); $row=$result->fetchRow(); @@ -154,12 +154,8 @@ class OC_User_Database extends OC_User_Backend { * * Get a list of all users. */ - public function getUsers($search = '', $limit = -1, $offset = 0) { - if ($limit == -1) { - $query = OC_DB::prepare('SELECT uid FROM *PREFIX*users WHERE uid LIKE ?'); - } else { - $query = OC_DB::prepare('SELECT uid FROM *PREFIX*users WHERE uid LIKE ? LIMIT '.$limit.' OFFSET '.$offset); - } + public function getUsers($search = '', $limit = null, $offset = null) { + $query = OC_DB::prepare('SELECT `uid` FROM `*PREFIX*users` WHERE `uid` LIKE ?',$limit,$offset); $result = $query->execute(array($search.'%')); $users = array(); while ($row = $result->fetchRow()) { @@ -174,7 +170,7 @@ class OC_User_Database extends OC_User_Backend { * @return boolean */ public function userExists($uid){ - $query = OC_DB::prepare( "SELECT * FROM `*PREFIX*users` WHERE uid = ?" ); + $query = OC_DB::prepare( 'SELECT * FROM `*PREFIX*users` WHERE `uid` = ?' ); $result = $query->execute( array( $uid )); return $result->numRows() > 0; diff --git a/lib/util.php b/lib/util.php index 0ef030e440..e63eb5b24c 100755 --- a/lib/util.php +++ b/lib/util.php @@ -66,7 +66,7 @@ class OC_Util { * @return array */ public static function getVersion(){ - return array(4,81,3); + return array(4,82,4); } /** @@ -74,7 +74,7 @@ class OC_Util { * @return string */ public static function getVersionString(){ - return '5 pre alpha'; + return '5 pre alpha 1'; } /** diff --git a/lib/vcategories.php b/lib/vcategories.php index d15b7b166e..20d9e3b5d6 100644 --- a/lib/vcategories.php +++ b/lib/vcategories.php @@ -121,7 +121,7 @@ class OC_VCategories { * To get the object array, do something like: * // For Addressbook: * $categories = new OC_VCategories('contacts'); - * $stmt = OC_DB::prepare( 'SELECT carddata FROM *PREFIX*contacts_cards' ); + * $stmt = OC_DB::prepare( 'SELECT `carddata` FROM `*PREFIX*contacts_cards`' ); * $result = $stmt->execute(); * $objects = array(); * if(!is_null($result)) { diff --git a/settings/ajax/apps/ocs.php b/settings/ajax/apps/ocs.php index 5a326c125f..082f1cfb92 100644 --- a/settings/ajax/apps/ocs.php +++ b/settings/ajax/apps/ocs.php @@ -35,7 +35,7 @@ if(is_array($catagoryNames)){ // show only external apps that aren't enabled yet $local=false; foreach($enabledApps as $a){ - if($a['name'] == $app['name']) { + if($a == $app['name']) { $local=true; } } diff --git a/settings/ajax/changepassword.php b/settings/ajax/changepassword.php index fa778de5c9..c7cb651233 100644 --- a/settings/ajax/changepassword.php +++ b/settings/ajax/changepassword.php @@ -2,6 +2,7 @@ // Init owncloud require_once('../../lib/base.php'); +OCP\JSON::callCheck(); $username = isset($_POST["username"]) ? $_POST["username"] : OC_User::getUser(); $password = $_POST["password"]; diff --git a/settings/ajax/creategroup.php b/settings/ajax/creategroup.php index af8ad3dd8c..16cf57aebb 100644 --- a/settings/ajax/creategroup.php +++ b/settings/ajax/creategroup.php @@ -2,6 +2,7 @@ // Init owncloud require_once('../../lib/base.php'); +OCP\JSON::callCheck(); // Check if we are a user if( !OC_User::isLoggedIn() || !OC_Group::inGroup( OC_User::getUser(), 'admin' )){ diff --git a/settings/ajax/createuser.php b/settings/ajax/createuser.php index f16e91e200..eaca5b5074 100644 --- a/settings/ajax/createuser.php +++ b/settings/ajax/createuser.php @@ -2,6 +2,7 @@ // Init owncloud require_once('../../lib/base.php'); +OCP\JSON::callCheck(); // Check if we are a user if( !OC_User::isLoggedIn() || (!OC_Group::inGroup( OC_User::getUser(), 'admin' ) && !OC_SubAdmin::isSubAdmin(OC_User::getUser()))){ diff --git a/settings/img/admin.png b/settings/img/admin.png index c1e6d6b8a7..13d653f92a 100644 Binary files a/settings/img/admin.png and b/settings/img/admin.png differ diff --git a/settings/img/apps.png b/settings/img/apps.png index 17f47d632b..e9845d012b 100644 Binary files a/settings/img/apps.png and b/settings/img/apps.png differ diff --git a/settings/img/help.png b/settings/img/help.png index 2257d144d1..37ccb35683 100644 Binary files a/settings/img/help.png and b/settings/img/help.png differ diff --git a/settings/img/log.png b/settings/img/log.png index c84b3b29f1..b34a58f844 100644 Binary files a/settings/img/log.png and b/settings/img/log.png differ diff --git a/settings/img/personal.png b/settings/img/personal.png index 8204028f70..8edc5a16cd 100644 Binary files a/settings/img/personal.png and b/settings/img/personal.png differ diff --git a/settings/img/users.png b/settings/img/users.png index f56e2442c9..79ad3d667e 100644 Binary files a/settings/img/users.png and b/settings/img/users.png differ diff --git a/settings/js/users.js b/settings/js/users.js index 29f70f24df..6026b22d1a 100644 --- a/settings/js/users.js +++ b/settings/js/users.js @@ -73,7 +73,7 @@ UserList={ groupsSelect.data('userGroups', groups); tr.find('td.groups').empty(); if (tr.find('td.subadmins').length > 0) { - var subadminSelect = $(''); subadminSelect.data('username', username); subadminSelect.data('userGroups', groups); subadminSelect.data('subadmin', subadmin); @@ -88,8 +88,10 @@ UserList={ }); tr.find('td.groups').append(groupsSelect); UserList.applyMultiplySelect(groupsSelect); - tr.find('td.subadmins').append(subadminSelect); - UserList.applyMultiplySelect(subadminSelect); + if (tr.find('td.subadmins').length > 0) { + tr.find('td.subadmins').append(subadminSelect); + UserList.applyMultiplySelect(subadminSelect); + } if (tr.find('td.remove img').length == 0 && OC.currentUser != username) { tr.find('td.remove').append($('Delete')); } else if (OC.currentUser == username) { diff --git a/settings/l10n/ca.php b/settings/l10n/ca.php index 0bb70e0438..7b95d6f9af 100644 --- a/settings/l10n/ca.php +++ b/settings/l10n/ca.php @@ -51,7 +51,7 @@ "Create" => "Crea", "Default Quota" => "Quota per defecte", "Other" => "Altre", -"SubAdmin" => "SubAdmin", +"Group Admin" => "Grup Admin", "Quota" => "Quota", "Delete" => "Suprimeix" ); diff --git a/settings/l10n/cs_CZ.php b/settings/l10n/cs_CZ.php index d71ae497d3..ed7378b80c 100644 --- a/settings/l10n/cs_CZ.php +++ b/settings/l10n/cs_CZ.php @@ -1,13 +1,21 @@ "Nepodařílo se stáhnout seznam z App Store", "Email saved" => "E-mail uložen", "Invalid email" => "Neplatný e-mail", "OpenID Changed" => "OpenID změněn", "Invalid request" => "Chybný dotaz", +"Authentication error" => "Chyba autorizace", "Language changed" => "Jazyk byl změněn", +"Error" => "Chyba", "Disable" => "Vypnout", "Enable" => "Zapnout", "Saving..." => "Ukládám...", "__language_name__" => "Česky", +"Security Warning" => "Bezpečnostní upozornění", +"Cron" => "Cron", +"execute one task with each page loaded" => "spustit jednu úlohu s každou nataženou stranou", +"cron.php is registered at a webcron service" => "cron.php je registrován jako služba webcron", +"use systems cron service" => "použijte systémovou službu cron", "Log" => "Log", "More" => "Více", "Add your App" => "Přidat vaší aplikaci", diff --git a/settings/l10n/da.php b/settings/l10n/da.php index 569abd58cb..f17fb11fa7 100644 --- a/settings/l10n/da.php +++ b/settings/l10n/da.php @@ -12,6 +12,8 @@ "Saving..." => "Gemmer...", "__language_name__" => "Dansk", "Security Warning" => "Sikkerhedsadvarsel", +"Cron" => "Cron", +"cron.php is registered at a webcron service" => "cron.php er tilmeldt en webcron tjeneste", "Log" => "Log", "More" => "Mere", "Add your App" => "Tilføj din App", @@ -47,7 +49,6 @@ "Create" => "Ny", "Default Quota" => "Standard kvote", "Other" => "Andet", -"SubAdmin" => "SubAdmin", "Quota" => "Kvote", "Delete" => "Slet" ); diff --git a/settings/l10n/de.php b/settings/l10n/de.php index 05e227cbc2..791a75fd7c 100644 --- a/settings/l10n/de.php +++ b/settings/l10n/de.php @@ -18,7 +18,7 @@ "use systems cron service" => "Nutze System-Cron-Service", "Log" => "Log", "More" => "Mehr", -"Add your App" => "Füge deine App hinzu", +"Add your App" => "Fügen Sie Ihre App hinzu", "Select an App" => "Wähle eine Anwendung aus", "See application page at apps.owncloud.com" => "Weitere Anwendungen auf apps.owncloud.com", "-licensed" => "-lizenziert", @@ -29,11 +29,11 @@ "Problems connecting to help database." => "Probleme bei der Verbindung zur Hilfe-Datenbank.", "Go there manually." => "Datenbank direkt besuchen.", "Answer" => "Antwort", -"You use" => "Du nutzt", +"You use" => "Sie nutzen", "of the available" => "der verfügbaren", "Desktop and Mobile Syncing Clients" => "Desktop- und mobile Synchronierungs-Clients", "Download" => "Download", -"Your password got changed" => "Dein Passwort wurde geändert.", +"Your password got changed" => "Ihr Passwort wurde geändert.", "Unable to change your password" => "Passwort konnte nicht geändert werden", "Current password" => "Aktuelles Passwort", "New password" => "Neues Passwort", @@ -41,17 +41,17 @@ "Change password" => "Passwort ändern", "Email" => "E-Mail", "Your email address" => "Ihre E-Mail-Adresse", -"Fill in an email address to enable password recovery" => "Trage eine E-Mail-Adresse ein, um die Passwort-Wiederherstellung zu aktivieren.", +"Fill in an email address to enable password recovery" => "Tragen Sie eine E-Mail-Adresse ein, um die Passwort-Wiederherstellung zu aktivieren.", "Language" => "Sprache", -"Help translate" => "Hilf bei der Übersetzung", -"use this address to connect to your ownCloud in your file manager" => "Benutze diese Adresse, um deine ownCloud mit deinem Dateimanager zu verbinden.", +"Help translate" => "Helfen Sie bei der Übersetzung", +"use this address to connect to your ownCloud in your file manager" => "Benutzen Sie diese Adresse, um Ihr ownCloud mit deinem Dateimanager zu verbinden.", "Name" => "Name", "Password" => "Passwort", "Groups" => "Gruppen", "Create" => "Anlegen", -"Default Quota" => "Standard Quota", +"Default Quota" => "Standard-Quota", "Other" => "Andere", -"SubAdmin" => "Unteradministrator", +"Group Admin" => "Gruppenadministrator", "Quota" => "Quota", "Delete" => "Löschen" ); diff --git a/settings/l10n/el.php b/settings/l10n/el.php index c0ab65a81a..d7333fab2c 100644 --- a/settings/l10n/el.php +++ b/settings/l10n/el.php @@ -1,15 +1,21 @@ "Σφάλμα στην φόρτωση της λίστας από το App Store", "Email saved" => "Το Email αποθηκεύτηκε ", "Invalid email" => "Μη έγκυρο email", "OpenID Changed" => "Το OpenID άλλαξε", "Invalid request" => "Μη έγκυρο αίτημα", "Authentication error" => "Σφάλμα πιστοποίησης", "Language changed" => "Η γλώσσα άλλαξε", +"Error" => "Σφάλμα", "Disable" => "Απενεργοποίηση", "Enable" => "Ενεργοποίηση", "Saving..." => "Αποθήκευση...", "__language_name__" => "__όνομα_γλώσσας__", "Security Warning" => "Προειδοποίηση Ασφαλείας", +"Cron" => "Cron", +"execute one task with each page loaded" => "Εκτέλεση μίας εργασίας με κάθε σελίδα που φορτώνεται", +"cron.php is registered at a webcron service" => "Το cron.php έχει καταχωρηθεί σε μια webcron υπηρεσία", +"use systems cron service" => "Χρήση της υπηρεσίας cron του συστήματος", "Log" => "Αρχείο καταγραφής", "More" => "Περισσότερο", "Add your App" => "Πρόσθεσε τη δικιά σου εφαρμογή ", @@ -45,7 +51,7 @@ "Create" => "Δημιουργία", "Default Quota" => "Προεπιλεγμένο όριο", "Other" => "Άλλα", -"SubAdmin" => "SubAdmin", +"Group Admin" => "Διαχειρηστής ομάδας", "Quota" => "Σύνολο χώρου", "Delete" => "Διαγραφή" ); diff --git a/settings/l10n/eo.php b/settings/l10n/eo.php index 55a7482d24..c0ad6ef105 100644 --- a/settings/l10n/eo.php +++ b/settings/l10n/eo.php @@ -12,7 +12,11 @@ "Saving..." => "Konservante...", "__language_name__" => "Esperanto", "Security Warning" => "Sekureca averto", -"Log" => "Registro", +"Cron" => "Cron", +"execute one task with each page loaded" => "lanĉi unu taskon po ĉiu paĝo ŝargita", +"cron.php is registered at a webcron service" => "cron.php estas registrita kiel webcron-servilo", +"use systems cron service" => "uzi la cron-servon de la sistemo", +"Log" => "Protokolo", "More" => "Pli", "Add your App" => "Aldonu vian aplikaĵon", "Select an App" => "Elekti aplikaĵon", @@ -47,7 +51,7 @@ "Create" => "Krei", "Default Quota" => "Defaŭlta kvoto", "Other" => "Alia", -"SubAdmin" => "Subadministranto", +"Group Admin" => "Grupadministranto", "Quota" => "Kvoto", "Delete" => "Forigi" ); diff --git a/settings/l10n/es.php b/settings/l10n/es.php index 8da36b421a..8403b6d388 100644 --- a/settings/l10n/es.php +++ b/settings/l10n/es.php @@ -1,7 +1,7 @@ "Imposible cargar la lista desde App Store", -"Email saved" => "Correo salvado", -"Invalid email" => "Correo Incorrecto", +"Unable to load list from App Store" => "Imposible cargar la lista desde el App Store", +"Email saved" => "Correo guardado", +"Invalid email" => "Correo no válido", "OpenID Changed" => "OpenID cambiado", "Invalid request" => "Solicitud no válida", "Authentication error" => "Error de autenticación", @@ -9,14 +9,18 @@ "Error" => "Error", "Disable" => "Desactivar", "Enable" => "Activar", -"Saving..." => "Salvando..", +"Saving..." => "Guardando...", "__language_name__" => "Castellano", "Security Warning" => "Advertencia de seguridad", +"Cron" => "Cron", +"execute one task with each page loaded" => "ejecutar una tarea con cada página cargada", +"cron.php is registered at a webcron service" => "cron.php se registra en un servicio webcron", +"use systems cron service" => "usar servicio cron del sistema", "Log" => "Registro", "More" => "Más", "Add your App" => "Añade tu aplicación", "Select an App" => "Seleccionar una aplicación", -"See application page at apps.owncloud.com" => "Revisa la web de apps apps.owncloud.com", +"See application page at apps.owncloud.com" => "Echa un vistazo a la web de aplicaciones apps.owncloud.com", "-licensed" => "-autorizado", "by" => "por", "Documentation" => "Documentación", @@ -47,7 +51,7 @@ "Create" => "Crear", "Default Quota" => "Cuota predeterminada", "Other" => "Otro", -"SubAdmin" => "SubAdmin", +"Group Admin" => "Grupo admin", "Quota" => "Cuota", "Delete" => "Eliminar" ); diff --git a/settings/l10n/eu.php b/settings/l10n/eu.php index 009cd1a8a8..1ead8b14b6 100644 --- a/settings/l10n/eu.php +++ b/settings/l10n/eu.php @@ -45,7 +45,6 @@ "Create" => "Sortu", "Default Quota" => "Kuota lehentsia", "Other" => "Besteak", -"SubAdmin" => "SubAdmin", "Quota" => "Kuota", "Delete" => "Ezabatu" ); diff --git a/settings/l10n/fi_FI.php b/settings/l10n/fi_FI.php index 81d1b9d0e6..bfcf1a59dd 100644 --- a/settings/l10n/fi_FI.php +++ b/settings/l10n/fi_FI.php @@ -11,6 +11,8 @@ "Saving..." => "Tallennetaan...", "__language_name__" => "_kielen_nimi_", "Security Warning" => "Turvallisuusvaroitus", +"Cron" => "Cron", +"use systems cron service" => "käytä järjestelmän cron-palvelua", "Log" => "Loki", "More" => "Lisää", "Add your App" => "Lisää ohjelmasi", @@ -25,7 +27,7 @@ "Go there manually." => "Ohje löytyy sieltä.", "Answer" => "Vastaus", "You use" => "Olet käyttänyt", -"of the available" => "käytettävissäsi on yhteensä", +"of the available" => ", käytettävissäsi on yhteensä", "Desktop and Mobile Syncing Clients" => "Tietokoneen ja mobiililaitteiden synkronointisovellukset", "Download" => "Lataa", "Your password got changed" => "Salasanasi on vaihdettu", @@ -36,7 +38,7 @@ "Change password" => "Vaihda salasana", "Email" => "Sähköposti", "Your email address" => "Sähköpostiosoitteesi", -"Fill in an email address to enable password recovery" => "Kirjoita sähköpostiosoitteesi alle, jotta unohdettu salasana voidaan palauttaa", +"Fill in an email address to enable password recovery" => "Anna sähköpostiosoitteesi, jotta unohdettu salasana on mahdollista palauttaa", "Language" => "Kieli", "Help translate" => "Auta kääntämisessä", "use this address to connect to your ownCloud in your file manager" => "voit yhdistää tiedostonhallintasovelluksellasi ownCloudiin käyttämällä tätä osoitetta", diff --git a/settings/l10n/fr.php b/settings/l10n/fr.php index 1c2f94620f..89516b1c7f 100644 --- a/settings/l10n/fr.php +++ b/settings/l10n/fr.php @@ -12,6 +12,10 @@ "Saving..." => "Sauvegarde...", "__language_name__" => "Français", "Security Warning" => "Alertes de sécurité", +"Cron" => "Cron", +"execute one task with each page loaded" => "exécuter une tâche pour chaque page chargée", +"cron.php is registered at a webcron service" => "cron.php est enregistré comme un service webcron", +"use systems cron service" => "utiliser le service cron du système ", "Log" => "Journaux", "More" => "Plus", "Add your App" => "Ajoutez votre application", @@ -47,7 +51,7 @@ "Create" => "Créer", "Default Quota" => "Quota par défaut", "Other" => "Autre", -"SubAdmin" => "SubAdmin", +"Group Admin" => "Groupe Admin", "Quota" => "Quota", "Delete" => "Supprimer" ); diff --git a/settings/l10n/gl.php b/settings/l10n/gl.php index 5ab1f91e6d..67937e4921 100644 --- a/settings/l10n/gl.php +++ b/settings/l10n/gl.php @@ -1,13 +1,21 @@ "Non se puido cargar a lista desde a App Store", "Email saved" => "Correo electrónico gardado", "Invalid email" => "correo electrónico non válido", "OpenID Changed" => "Mudou o OpenID", "Invalid request" => "Petición incorrecta", +"Authentication error" => "Erro na autenticación", "Language changed" => "O idioma mudou", +"Error" => "Erro", "Disable" => "Deshabilitar", "Enable" => "Habilitar", "Saving..." => "Gardando...", "__language_name__" => "Galego", +"Security Warning" => "Aviso de seguridade", +"Cron" => "Cron", +"execute one task with each page loaded" => "executar unha tarefa con cada páxina cargada", +"cron.php is registered at a webcron service" => "cron.php está rexistrada como un servizo webcron", +"use systems cron service" => "utilice o servizo cron do sistema", "Log" => "Conectar", "More" => "Máis", "Add your App" => "Engade o teu aplicativo", diff --git a/settings/l10n/hu_HU.php b/settings/l10n/hu_HU.php index 48a6e14ebb..4981f44654 100644 --- a/settings/l10n/hu_HU.php +++ b/settings/l10n/hu_HU.php @@ -47,7 +47,6 @@ "Create" => "Létrehozás", "Default Quota" => "Alapértelmezett kvóta", "Other" => "Egyéb", -"SubAdmin" => "al-Admin", "Quota" => "Kvóta", "Delete" => "Törlés" ); diff --git a/settings/l10n/it.php b/settings/l10n/it.php index bc02a7a833..e33eddacb5 100644 --- a/settings/l10n/it.php +++ b/settings/l10n/it.php @@ -33,7 +33,7 @@ "of the available" => "su un totale di", "Desktop and Mobile Syncing Clients" => "Client di sincronizzazione desktop e mobile", "Download" => "Scaricamento", -"Your password got changed" => "La tua password è stata cambiat", +"Your password got changed" => "La tua password è stata cambiata", "Unable to change your password" => "Modifica password non riuscita", "Current password" => "Password attuale", "New password" => "Nuova password", @@ -41,7 +41,7 @@ "Change password" => "Modifica password", "Email" => "Email", "Your email address" => "Il tuo indirizzo email", -"Fill in an email address to enable password recovery" => "Inserici il tuo indirizzo email per abilitare il recupero della password", +"Fill in an email address to enable password recovery" => "Inserisci il tuo indirizzo email per abilitare il recupero della password", "Language" => "Lingua", "Help translate" => "Migliora la traduzione", "use this address to connect to your ownCloud in your file manager" => "usa questo indirizzo per connetterti al tuo ownCloud dal gestore file", @@ -51,7 +51,7 @@ "Create" => "Crea", "Default Quota" => "Quota predefinita", "Other" => "Altro", -"SubAdmin" => "SubAdmin", +"Group Admin" => "Gruppo di amministrazione", "Quota" => "Quote", "Delete" => "Elimina" ); diff --git a/settings/l10n/ja_JP.php b/settings/l10n/ja_JP.php index ae1ebaf991..93201a9dfe 100644 --- a/settings/l10n/ja_JP.php +++ b/settings/l10n/ja_JP.php @@ -12,6 +12,10 @@ "Saving..." => "保存中...", "__language_name__" => "Japanese (日本語)", "Security Warning" => "セキュリティ警告", +"Cron" => "cron(自動定期実行)", +"execute one task with each page loaded" => "ページを開く毎にタスクを1つ実行", +"cron.php is registered at a webcron service" => "cron.phpをwebcronサービスに登録しました", +"use systems cron service" => "システムのcronサービスを使用", "Log" => "ログ", "More" => "もっと", "Add your App" => "アプリを追加", @@ -47,7 +51,7 @@ "Create" => "作成", "Default Quota" => "デフォルトのクォータサイズ", "Other" => "その他", -"SubAdmin" => "サブ管理者", +"Group Admin" => "グループ管理者", "Quota" => "クオータ", "Delete" => "削除" ); diff --git a/settings/l10n/lt_LT.php b/settings/l10n/lt_LT.php index 409fa9517f..e8076e293b 100644 --- a/settings/l10n/lt_LT.php +++ b/settings/l10n/lt_LT.php @@ -1,12 +1,18 @@ "Neįmanoma įkelti sąrašo iš Programų Katalogo", +"Email saved" => "El. paštas išsaugotas", "Invalid email" => "Netinkamas el. paštas", "OpenID Changed" => "OpenID pakeistas", "Invalid request" => "Klaidinga užklausa", "Language changed" => "Kalba pakeista", +"Error" => "Klaida", "Disable" => "Išjungti", "Enable" => "Įjungti", "Saving..." => "Saugoma..", "__language_name__" => "Kalba", +"Security Warning" => "Saugumo įspėjimas", +"Cron" => "Cron", +"use systems cron service" => "naudoti sistemos cron servisą", "Log" => "Žurnalas", "More" => "Daugiau", "Add your App" => "Pridėti programėlę", diff --git a/settings/l10n/ms_MY.php b/settings/l10n/ms_MY.php index 969468117e..de2384a4ae 100644 --- a/settings/l10n/ms_MY.php +++ b/settings/l10n/ms_MY.php @@ -45,7 +45,6 @@ "Create" => "Buat", "Default Quota" => "Kuota Lalai", "Other" => "Lain", -"SubAdmin" => "SubAdmin", "Quota" => "Kuota", "Delete" => "Padam" ); diff --git a/settings/l10n/nl.php b/settings/l10n/nl.php index a1db0f457f..6048cbd63b 100644 --- a/settings/l10n/nl.php +++ b/settings/l10n/nl.php @@ -1,13 +1,21 @@ "Kan de lijst niet van de App store laden", "Email saved" => "E-mail bewaard", "Invalid email" => "Ongeldige e-mail", "OpenID Changed" => "OpenID is aangepast", "Invalid request" => "Ongeldig verzoek", +"Authentication error" => "Authenticatie fout", "Language changed" => "Taal aangepast", +"Error" => "Fout", "Disable" => "Uitschakelen", "Enable" => "Inschakelen", "Saving..." => "Aan het bewaren.....", "__language_name__" => "Nederlands", +"Security Warning" => "Veiligheidswaarschuwing", +"Cron" => "Cron", +"execute one task with each page loaded" => "Voer 1 taak uit bij elke geladen pagina", +"cron.php is registered at a webcron service" => "cron.php is geregistreerd bij een webcron service", +"use systems cron service" => "gebruik de systeem cron service", "Log" => "Log", "More" => "Meer", "Add your App" => "Voeg je App toe", @@ -43,6 +51,7 @@ "Create" => "Creëer", "Default Quota" => "Standaard limiet", "Other" => "Andere", +"Group Admin" => "Groep Administrator", "Quota" => "Limieten", "Delete" => "verwijderen" ); diff --git a/settings/l10n/nn_NO.php b/settings/l10n/nn_NO.php index 87c9cecb24..e5968bcd4a 100644 --- a/settings/l10n/nn_NO.php +++ b/settings/l10n/nn_NO.php @@ -1,7 +1,14 @@ "Klarer ikkje å laste inn liste fra App Store", +"Email saved" => "E-postadresse lagra", +"Invalid email" => "Ugyldig e-postadresse", "OpenID Changed" => "OpenID endra", "Invalid request" => "Ugyldig førespurnad", +"Authentication error" => "Feil i autentisering", "Language changed" => "Språk endra", +"Error" => "Feil", +"Disable" => "Slå av", +"Enable" => "Slå på", "__language_name__" => "Nynorsk", "Select an App" => "Vel ein applikasjon", "-licensed" => "-lisensiert", diff --git a/settings/l10n/pl.php b/settings/l10n/pl.php index c000bc4150..de9384a244 100644 --- a/settings/l10n/pl.php +++ b/settings/l10n/pl.php @@ -1,15 +1,21 @@ "Nie mogę załadować listy aplikacji", "Email saved" => "Email zapisany", "Invalid email" => "Niepoprawny email", "OpenID Changed" => "Zmieniono OpenID", "Invalid request" => "Nieprawidłowe żądanie", "Authentication error" => "Błąd uwierzytelniania", "Language changed" => "Język zmieniony", +"Error" => "Błąd", "Disable" => "Wyłączone", "Enable" => "Włączone", "Saving..." => "Zapisywanie...", "__language_name__" => "Polski", "Security Warning" => "Ostrzeżenia bezpieczeństwa", +"Cron" => "Cron", +"execute one task with each page loaded" => "wykonanie jednego zadania z każdej załadowanej strony", +"cron.php is registered at a webcron service" => "cron.php jest zarejestrowany w usłudze webcron", +"use systems cron service" => "korzystaj z usługi systemowej cron", "Log" => "Log", "More" => "Więcej", "Add your App" => "Dodaj aplikacje", @@ -45,7 +51,7 @@ "Create" => "Utwórz", "Default Quota" => "Domyślny udział", "Other" => "Inne", -"SubAdmin" => "SubAdmin", +"Group Admin" => "Grupa Admin", "Quota" => "Udział", "Delete" => "Usuń" ); diff --git a/settings/l10n/pt_BR.php b/settings/l10n/pt_BR.php index e8154dfca7..57aaa27260 100644 --- a/settings/l10n/pt_BR.php +++ b/settings/l10n/pt_BR.php @@ -3,11 +3,16 @@ "Invalid email" => "Email inválido", "OpenID Changed" => "Mudou OpenID", "Invalid request" => "Pedido inválido", +"Authentication error" => "erro de autenticação", "Language changed" => "Mudou Idioma", +"Error" => "Erro", "Disable" => "Desabilitado", "Enable" => "Habilitado", "Saving..." => "Gravando...", "__language_name__" => "Português", +"Security Warning" => "Aviso de Segurança", +"execute one task with each page loaded" => "executar uma tarefa com cada página em aberto", +"cron.php is registered at a webcron service" => "cron.php esta registrado no serviço de webcron", "Log" => "Log", "More" => "Mais", "Add your App" => "Adicione seu Aplicativo", @@ -43,6 +48,7 @@ "Create" => "Criar", "Default Quota" => "Quota Padrão", "Other" => "Outro", +"Group Admin" => "Grupo Administrativo", "Quota" => "Cota", "Delete" => "Apagar" ); diff --git a/settings/l10n/pt_PT.php b/settings/l10n/pt_PT.php index 159c3a7d07..af12c42de4 100644 --- a/settings/l10n/pt_PT.php +++ b/settings/l10n/pt_PT.php @@ -1,13 +1,21 @@ "Incapaz de carregar a lista da App Store", "Email saved" => "Email guardado", "Invalid email" => "Email inválido", "OpenID Changed" => "OpenID alterado", "Invalid request" => "Pedido inválido", +"Authentication error" => "Erro de autenticação", "Language changed" => "Idioma alterado", +"Error" => "Erro", "Disable" => "Desativar", "Enable" => "Ativar", "Saving..." => "A guardar...", "__language_name__" => "__language_name__", +"Security Warning" => "Aviso de Segurança", +"Cron" => "Cron", +"execute one task with each page loaded" => "Executar uma tarefa com cada página carregada", +"cron.php is registered at a webcron service" => "cron.php está registado num serviço webcron", +"use systems cron service" => "usar o serviço cron do sistema", "Log" => "Log", "More" => "Mais", "Add your App" => "Adicione a sua aplicação", @@ -43,6 +51,7 @@ "Create" => "Criar", "Default Quota" => "Quota por defeito", "Other" => "Outro", +"Group Admin" => "Grupo Administrador", "Quota" => "Quota", "Delete" => "Apagar" ); diff --git a/settings/l10n/ru.php b/settings/l10n/ru.php index ac169fa398..949e9572c1 100644 --- a/settings/l10n/ru.php +++ b/settings/l10n/ru.php @@ -1,15 +1,21 @@ "Загрузка из App Store запрещена", "Email saved" => "Email сохранен", "Invalid email" => "Неправильный Email", "OpenID Changed" => "OpenID изменён", "Invalid request" => "Неверный запрос", "Authentication error" => "Ошибка авторизации", "Language changed" => "Язык изменён", +"Error" => "Ошибка", "Disable" => "Отключить", "Enable" => "Включить", "Saving..." => "Сохранение...", "__language_name__" => "Русский ", "Security Warning" => "Предупреждение безопасности", +"Cron" => "Задание", +"execute one task with each page loaded" => "Запускать задание при загрузке каждой страницы", +"cron.php is registered at a webcron service" => "cron.php зарегистрирован в webcron сервисе", +"use systems cron service" => "использовать системные задания", "Log" => "Журнал", "More" => "Ещё", "Add your App" => "Добавить приложение", @@ -45,6 +51,7 @@ "Create" => "Создать", "Default Quota" => "Квота по умолчанию", "Other" => "Другое", +"Group Admin" => "Группа Администраторы", "Quota" => "Квота", "Delete" => "Удалить" ); diff --git a/settings/l10n/sl.php b/settings/l10n/sl.php index 574aa75bbf..a2404d212b 100644 --- a/settings/l10n/sl.php +++ b/settings/l10n/sl.php @@ -51,7 +51,7 @@ "Create" => "Ustvari", "Default Quota" => "Privzeta količinska omejitev", "Other" => "Drugo", -"SubAdmin" => "PodSkrbnik", +"Group Admin" => "Administrator skupine", "Quota" => "Količinska omejitev", "Delete" => "Izbriši" ); diff --git a/settings/l10n/sv.php b/settings/l10n/sv.php index 0b4462876e..7603b6b09f 100644 --- a/settings/l10n/sv.php +++ b/settings/l10n/sv.php @@ -7,11 +7,15 @@ "Authentication error" => "Autentiseringsfel", "Language changed" => "Språk ändrades", "Error" => "Fel", -"Disable" => "Avaktivera", +"Disable" => "Deaktivera", "Enable" => "Aktivera", "Saving..." => "Sparar...", "__language_name__" => "__language_name__", "Security Warning" => "Säkerhetsvarning", +"Cron" => "Cron", +"execute one task with each page loaded" => "utför en uppgift vid varje sidladdning", +"cron.php is registered at a webcron service" => "cron.php är registrerad på en webcron-tjänst", +"use systems cron service" => "använd systemets cron-tjänst", "Log" => "Logg", "More" => "Mera", "Add your App" => "Lägg till din applikation", @@ -22,14 +26,14 @@ "Documentation" => "Dokumentation", "Managing Big Files" => "Hantering av stora filer", "Ask a question" => "Ställ en fråga", -"Problems connecting to help database." => "Problem med att ansluta till hjälp-databasen.", -"Go there manually." => "Gå dit manuellt", +"Problems connecting to help database." => "Problem med att ansluta till hjälpdatabasen.", +"Go there manually." => "Gå dit manuellt.", "Answer" => "Svar", "You use" => "Du använder", "of the available" => "av tillgängliga", "Desktop and Mobile Syncing Clients" => "Synkroniseringsklienter för dator och mobil", "Download" => "Ladda ner", -"Your password got changed" => "Ditt lösenord ändrades", +"Your password got changed" => "Ditt lösenord har ändrats", "Unable to change your password" => "Kunde inte ändra ditt lösenord", "Current password" => "Nuvarande lösenord", "New password" => "Nytt lösenord", @@ -47,7 +51,7 @@ "Create" => "Skapa", "Default Quota" => "Förvald datakvot", "Other" => "Annat", -"SubAdmin" => "Underadministratör", +"Group Admin" => "Gruppadministratör", "Quota" => "Kvot", -"Delete" => "Ta bort" +"Delete" => "Radera" ); diff --git a/settings/l10n/th_TH.php b/settings/l10n/th_TH.php index 6c9386d3ae..a062c374c6 100644 --- a/settings/l10n/th_TH.php +++ b/settings/l10n/th_TH.php @@ -51,7 +51,7 @@ "Create" => "สร้าง", "Default Quota" => "โควต้าที่กำหนดไว้เริ่มต้น", "Other" => "อื่นๆ", -"SubAdmin" => "ผู้ดูแลย่อย", +"Group Admin" => "ผู้ดูแลกลุ่ม", "Quota" => "พื้นที่", "Delete" => "ลบ" ); diff --git a/settings/l10n/tr.php b/settings/l10n/tr.php index e3ba426f5f..8182236a2d 100644 --- a/settings/l10n/tr.php +++ b/settings/l10n/tr.php @@ -45,7 +45,6 @@ "Create" => "Oluştur", "Default Quota" => "Varsayılan Kota", "Other" => "Diğer", -"SubAdmin" => "Alt Yönetici", "Quota" => "Kota", "Delete" => "Sil" ); diff --git a/settings/l10n/zh_CN.GB2312.php b/settings/l10n/zh_CN.GB2312.php index cb662c1b64..faf125225b 100644 --- a/settings/l10n/zh_CN.GB2312.php +++ b/settings/l10n/zh_CN.GB2312.php @@ -48,7 +48,6 @@ "Create" => "新建", "Default Quota" => "默认限额", "Other" => "其他的", -"SubAdmin" => "子专辑", "Quota" => "限额", "Delete" => "删除" ); diff --git a/settings/l10n/zh_CN.php b/settings/l10n/zh_CN.php index 2e043f0266..410772e080 100644 --- a/settings/l10n/zh_CN.php +++ b/settings/l10n/zh_CN.php @@ -1,13 +1,20 @@ "无法从应用商店载入列表", "Email saved" => "电子邮件已保存", "Invalid email" => "无效的电子邮件", "OpenID Changed" => "OpenID 已修改", "Invalid request" => "非法请求", +"Authentication error" => "认证错误", "Language changed" => "语言已修改", +"Error" => "错误", "Disable" => "禁用", "Enable" => "启用", "Saving..." => "正在保存", "__language_name__" => "简体中文", +"Security Warning" => "安全警告", +"Cron" => "计划任务", +"execute one task with each page loaded" => "为每个装入的页面执行任务", +"use systems cron service" => "实现系统 cron 服务", "Log" => "日志", "More" => "更多", "Add your App" => "添加应用", @@ -43,6 +50,7 @@ "Create" => "创建", "Default Quota" => "默认配额", "Other" => "其它", +"Group Admin" => "组管理", "Quota" => "配额", "Delete" => "删除" ); diff --git a/settings/l10n/zh_TW.php b/settings/l10n/zh_TW.php index aeb1db4871..0218133f65 100644 --- a/settings/l10n/zh_TW.php +++ b/settings/l10n/zh_TW.php @@ -27,7 +27,7 @@ "Change password" => "變更密碼", "Email" => "電子郵件", "Your email address" => "你的電子郵件信箱", -"Fill in an email address to enable password recovery" => "請甜入店子郵件信箱以便回復密碼", +"Fill in an email address to enable password recovery" => "請填入電子郵件信箱以便回復密碼", "Language" => "語言", "Help translate" => "幫助翻譯", "use this address to connect to your ownCloud in your file manager" => "使用這個位址去連接到你的私有雲檔案管理員", diff --git a/settings/templates/users.php b/settings/templates/users.php index 3e9faddadf..5298237f67 100644 --- a/settings/templates/users.php +++ b/settings/templates/users.php @@ -77,7 +77,7 @@ var isadmin = ;
    - + @@ -109,7 +109,7 @@ var isadmin = ; class="subadminsselect" data-username="" data-subadmin="" - data-placeholder="subadmins" title="t('SubAdmin')?>" + data-placeholder="subadmins" title="t('Group Admin')?>" multiple="multiple">
    t( 'Password' ); ?> t( 'Groups' ); ?> t('SubAdmin'); ?>t('Group Admin'); ?> t( 'Quota' ); ?>