diff --git a/.htaccess b/.htaccess old mode 100644 new mode 100755 index 095a0cc637..11ee1d59f8 --- a/.htaccess +++ b/.htaccess @@ -1,8 +1,8 @@ ErrorDocument 403 /core/templates/403.php ErrorDocument 404 /core/templates/404.php -php_value upload_max_filesize 512M -php_value post_max_size 512M +php_value upload_max_filesize 513M +php_value post_max_size 513M php_value memory_limit 512M SetEnv htaccessWorking true diff --git a/3rdparty/mediawiki/CSSMin.php b/3rdparty/mediawiki/CSSMin.php new file mode 100644 index 0000000000..1ee2919140 --- /dev/null +++ b/3rdparty/mediawiki/CSSMin.php @@ -0,0 +1,229 @@ + + * @copyright Copyright 2010 Wikimedia Foundation + * @license http://www.apache.org/licenses/LICENSE-2.0 + */ + +/** + * Transforms CSS data + * + * This class provides minification, URL remapping, URL extracting, and data-URL embedding. + */ +class CSSMin { + + /* Constants */ + + /** + * Maximum file size to still qualify for in-line embedding as a data-URI + * + * 24,576 is used because Internet Explorer has a 32,768 byte limit for data URIs, + * which when base64 encoded will result in a 1/3 increase in size. + */ + const EMBED_SIZE_LIMIT = 24576; + const URL_REGEX = 'url\(\s*[\'"]?(?P[^\?\)\'"]*)(?P\??[^\)\'"]*)[\'"]?\s*\)'; + + /* Protected Static Members */ + + /** @var array List of common image files extensions and mime-types */ + protected static $mimeTypes = array( + 'gif' => 'image/gif', + 'jpe' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'jpg' => 'image/jpeg', + 'png' => 'image/png', + 'tif' => 'image/tiff', + 'tiff' => 'image/tiff', + 'xbm' => 'image/x-xbitmap', + ); + + /* Static Methods */ + + /** + * Gets a list of local file paths which are referenced in a CSS style sheet + * + * @param $source string CSS data to remap + * @param $path string File path where the source was read from (optional) + * @return array List of local file references + */ + public static function getLocalFileReferences( $source, $path = null ) { + $files = array(); + $rFlags = PREG_OFFSET_CAPTURE | PREG_SET_ORDER; + if ( preg_match_all( '/' . self::URL_REGEX . '/', $source, $matches, $rFlags ) ) { + foreach ( $matches as $match ) { + $file = ( isset( $path ) + ? rtrim( $path, '/' ) . '/' + : '' ) . "{$match['file'][0]}"; + + // Only proceed if we can access the file + if ( !is_null( $path ) && file_exists( $file ) ) { + $files[] = $file; + } + } + } + return $files; + } + + /** + * @param $file string + * @return bool|string + */ + protected static function getMimeType( $file ) { + $realpath = realpath( $file ); + // Try a couple of different ways to get the mime-type of a file, in order of + // preference + if ( + $realpath + && function_exists( 'finfo_file' ) + && function_exists( 'finfo_open' ) + && defined( 'FILEINFO_MIME_TYPE' ) + ) { + // As of PHP 5.3, this is how you get the mime-type of a file; it uses the Fileinfo + // PECL extension + return finfo_file( finfo_open( FILEINFO_MIME_TYPE ), $realpath ); + } elseif ( function_exists( 'mime_content_type' ) ) { + // Before this was deprecated in PHP 5.3, this was how you got the mime-type of a file + return mime_content_type( $file ); + } else { + // Worst-case scenario has happened, use the file extension to infer the mime-type + $ext = strtolower( pathinfo( $file, PATHINFO_EXTENSION ) ); + if ( isset( self::$mimeTypes[$ext] ) ) { + return self::$mimeTypes[$ext]; + } + } + return false; + } + + /** + * Remaps CSS URL paths and automatically embeds data URIs for URL rules + * preceded by an /* @embed * / comment + * + * @param $source string CSS data to remap + * @param $local string File path where the source was read from + * @param $remote string URL path to the file + * @param $embedData bool If false, never do any data URI embedding, even if / * @embed * / is found + * @return string Remapped CSS data + */ + public static function remap( $source, $local, $remote, $embedData = true ) { + $pattern = '/((?P\s*\/\*\s*\@embed\s*\*\/)(?P
[^\;\}]*))?' .
+			self::URL_REGEX . '(?P[^;]*)[\;]?/';
+		$offset = 0;
+		while ( preg_match( $pattern, $source, $match, PREG_OFFSET_CAPTURE, $offset ) ) {
+			// Skip fully-qualified URLs and data URIs
+			$urlScheme = parse_url( $match['file'][0], PHP_URL_SCHEME );
+			if ( $urlScheme ) {
+				// Move the offset to the end of the match, leaving it alone
+				$offset = $match[0][1] + strlen( $match[0][0] );
+				continue;
+			}
+			// URLs with absolute paths like /w/index.php need to be expanded
+			// to absolute URLs but otherwise left alone
+			if ( $match['file'][0] !== '' && $match['file'][0][0] === '/' ) {
+				// Replace the file path with an expanded (possibly protocol-relative) URL
+				// ...but only if wfExpandUrl() is even available.
+				// This will not be the case if we're running outside of MW
+				$lengthIncrease = 0;
+				if ( function_exists( 'wfExpandUrl' ) ) {
+					$expanded = wfExpandUrl( $match['file'][0], PROTO_RELATIVE );
+					$origLength = strlen( $match['file'][0] );
+					$lengthIncrease = strlen( $expanded ) - $origLength;
+					$source = substr_replace( $source, $expanded,
+						$match['file'][1], $origLength
+					);
+				}
+				// Move the offset to the end of the match, leaving it alone
+				$offset = $match[0][1] + strlen( $match[0][0] ) + $lengthIncrease;
+				continue;
+			}
+			// Shortcuts
+			$embed = $match['embed'][0];
+			$pre = $match['pre'][0];
+			$post = $match['post'][0];
+			$query = $match['query'][0];
+			$url = "{$remote}/{$match['file'][0]}";
+			$file = "{$local}/{$match['file'][0]}";
+			// bug 27052 - Guard against double slashes, because foo//../bar
+			// apparently resolves to foo/bar on (some?) clients
+			$url = preg_replace( '#([^:])//+#', '\1/', $url );
+			$replacement = false;
+			if ( $local !== false && file_exists( $file ) ) {
+				// Add version parameter as a time-stamp in ISO 8601 format,
+				// using Z for the timezone, meaning GMT
+				$url .= '?' . gmdate( 'Y-m-d\TH:i:s\Z', round( filemtime( $file ), -2 ) );
+				// Embedding requires a bit of extra processing, so let's skip that if we can
+				if ( $embedData && $embed ) {
+					$type = self::getMimeType( $file );
+					// Detect when URLs were preceeded with embed tags, and also verify file size is
+					// below the limit
+			var_dump($match['embed'], $file, filesize($file));
+					if (
+						$type
+						&& $match['embed'][1] > 0
+						&& filesize( $file ) < self::EMBED_SIZE_LIMIT
+					) {
+						// Strip off any trailing = symbols (makes browsers freak out)
+						$data = base64_encode( file_get_contents( $file ) );
+						// Build 2 CSS properties; one which uses a base64 encoded data URI in place
+						// of the @embed comment to try and retain line-number integrity, and the
+						// other with a remapped an versioned URL and an Internet Explorer hack
+						// making it ignored in all browsers that support data URIs
+						$replacement = "{$pre}url(data:{$type};base64,{$data}){$post};";
+						$replacement .= "{$pre}url({$url}){$post}!ie;";
+					}
+				}
+				if ( $replacement === false ) {
+					// Assume that all paths are relative to $remote, and make them absolute
+					$replacement = "{$embed}{$pre}url({$url}){$post};";
+				}
+			} elseif ( $local === false ) {
+				// Assume that all paths are relative to $remote, and make them absolute
+				$replacement = "{$embed}{$pre}url({$url}{$query}){$post};";
+			}
+			if ( $replacement !== false ) {
+				// Perform replacement on the source
+				$source = substr_replace(
+					$source, $replacement, $match[0][1], strlen( $match[0][0] )
+				);
+				// Move the offset to the end of the replacement in the source
+				$offset = $match[0][1] + strlen( $replacement );
+				continue;
+			}
+			// Move the offset to the end of the match, leaving it alone
+			$offset = $match[0][1] + strlen( $match[0][0] );
+		}
+		return $source;
+	}
+
+	/**
+	 * Removes whitespace from CSS data
+	 *
+	 * @param $css string CSS data to minify
+	 * @return string Minified CSS data
+	 */
+	public static function minify( $css ) {
+		return trim(
+			str_replace(
+				array( '; ', ': ', ' {', '{ ', ', ', '} ', ';}' ),
+				array( ';', ':', '{', '{', ',', '}', '}' ),
+				preg_replace( array( '/\s+/', '/\/\*.*?\*\//s' ), array( ' ', '' ), $css )
+			)
+		);
+	}
+}
diff --git a/3rdparty/mediawiki/JavaScriptMinifier.php b/3rdparty/mediawiki/JavaScriptMinifier.php
new file mode 100644
index 0000000000..db5326c7cf
--- /dev/null
+++ b/3rdparty/mediawiki/JavaScriptMinifier.php
@@ -0,0 +1,606 @@
+
+ * @license Choose any of Apache, MIT, GPL, LGPL
+ */
+
+/**
+ * This class is meant to safely minify javascript code, while leaving syntactically correct
+ * programs intact. Other libraries, such as JSMin require a certain coding style to work
+ * correctly. OTOH, libraries like jsminplus, that do parse the code correctly are rather
+ * slow, because they construct a complete parse tree before outputting the code minified.
+ * So this class is meant to allow arbitrary (but syntactically correct) input, while being
+ * fast enough to be used for on-the-fly minifying.
+ */
+class JavaScriptMinifier {
+
+	/* Class constants */
+	/* Parsing states.
+	 * The state machine is only necessary to decide whether to parse a slash as division
+	 * operator or as regexp literal.
+	 * States are named after the next expected item. We only distinguish states when the
+	 * distinction is relevant for our purpose.
+	 */
+	const STATEMENT                = 0;
+	const CONDITION                = 1;
+	const PROPERTY_ASSIGNMENT      = 2;
+	const EXPRESSION               = 3;
+	const EXPRESSION_NO_NL         = 4; // only relevant for semicolon insertion
+	const EXPRESSION_OP            = 5;
+	const EXPRESSION_FUNC          = 6;
+	const EXPRESSION_TERNARY       = 7; // used to determine the role of a colon
+	const EXPRESSION_TERNARY_OP    = 8;
+	const EXPRESSION_TERNARY_FUNC  = 9;
+	const PAREN_EXPRESSION         = 10; // expression which is not on the top level
+	const PAREN_EXPRESSION_OP      = 11;
+	const PAREN_EXPRESSION_FUNC    = 12;
+	const PROPERTY_EXPRESSION      = 13; // expression which is within an object literal
+	const PROPERTY_EXPRESSION_OP   = 14;
+	const PROPERTY_EXPRESSION_FUNC = 15;
+
+	/* Token types */
+	const TYPE_UN_OP       = 1; // unary operators
+	const TYPE_INCR_OP     = 2; // ++ and --
+	const TYPE_BIN_OP      = 3; // binary operators
+	const TYPE_ADD_OP      = 4; // + and - which can be either unary or binary ops
+	const TYPE_HOOK        = 5; // ?
+	const TYPE_COLON       = 6; // :
+	const TYPE_COMMA       = 7; // ,
+	const TYPE_SEMICOLON   = 8; // ;
+	const TYPE_BRACE_OPEN  = 9; // {
+	const TYPE_BRACE_CLOSE = 10; // }
+	const TYPE_PAREN_OPEN  = 11; // ( and [
+	const TYPE_PAREN_CLOSE = 12; // ) and ]
+	const TYPE_RETURN      = 13; // keywords: break, continue, return, throw
+	const TYPE_IF          = 14; // keywords: catch, for, with, switch, while, if
+	const TYPE_DO          = 15; // keywords: case, var, finally, else, do, try
+	const TYPE_FUNC        = 16; // keywords: function
+	const TYPE_LITERAL     = 17; // all literals, identifiers and unrecognised tokens
+
+	// Sanity limit to avoid excessive memory usage
+	const STACK_LIMIT = 1000;
+
+	/* Static functions */
+
+	/**
+	 * Returns minified JavaScript code.
+	 *
+	 * NOTE: $maxLineLength isn't a strict maximum. Longer lines will be produced when
+	 *       literals (e.g. quoted strings) longer than $maxLineLength are encountered
+	 *       or when required to guard against semicolon insertion.
+	 *
+	 * @param $s String JavaScript code to minify
+	 * @param $statementsOnOwnLine Bool Whether to put each statement on its own line
+	 * @param $maxLineLength Int Maximum length of a single line, or -1 for no maximum.
+	 * @return String Minified code
+	 */
+	public static function minify( $s, $statementsOnOwnLine = false, $maxLineLength = 1000 ) {
+		// First we declare a few tables that contain our parsing rules
+
+		// $opChars : characters, which can be combined without whitespace in between them
+		$opChars = array(
+			'!' => true,
+			'"' => true,
+			'%' => true,
+			'&' => true,
+			"'" => true,
+			'(' => true,
+			')' => true,
+			'*' => true,
+			'+' => true,
+			',' => true,
+			'-' => true,
+			'.' => true,
+			'/' => true,
+			':' => true,
+			';' => true,
+			'<' => true,
+			'=' => true,
+			'>' => true,
+			'?' => true,
+			'[' => true,
+			']' => true,
+			'^' => true,
+			'{' => true,
+			'|' => true,
+			'}' => true,
+			'~' => true
+		);
+
+		// $tokenTypes : maps keywords and operators to their corresponding token type
+		$tokenTypes = array(
+			'!'          => self::TYPE_UN_OP,
+			'~'          => self::TYPE_UN_OP,
+			'delete'     => self::TYPE_UN_OP,
+			'new'        => self::TYPE_UN_OP,
+			'typeof'     => self::TYPE_UN_OP,
+			'void'       => self::TYPE_UN_OP,
+			'++'         => self::TYPE_INCR_OP,
+			'--'         => self::TYPE_INCR_OP,
+			'!='         => self::TYPE_BIN_OP,
+			'!=='        => self::TYPE_BIN_OP,
+			'%'          => self::TYPE_BIN_OP,
+			'%='         => self::TYPE_BIN_OP,
+			'&'          => self::TYPE_BIN_OP,
+			'&&'         => self::TYPE_BIN_OP,
+			'&='         => self::TYPE_BIN_OP,
+			'*'          => self::TYPE_BIN_OP,
+			'*='         => self::TYPE_BIN_OP,
+			'+='         => self::TYPE_BIN_OP,
+			'-='         => self::TYPE_BIN_OP,
+			'.'          => self::TYPE_BIN_OP,
+			'/'          => self::TYPE_BIN_OP,
+			'/='         => self::TYPE_BIN_OP,
+			'<'          => self::TYPE_BIN_OP,
+			'<<'         => self::TYPE_BIN_OP,
+			'<<='        => self::TYPE_BIN_OP,
+			'<='         => self::TYPE_BIN_OP,
+			'='          => self::TYPE_BIN_OP,
+			'=='         => self::TYPE_BIN_OP,
+			'==='        => self::TYPE_BIN_OP,
+			'>'          => self::TYPE_BIN_OP,
+			'>='         => self::TYPE_BIN_OP,
+			'>>'         => self::TYPE_BIN_OP,
+			'>>='        => self::TYPE_BIN_OP,
+			'>>>'        => self::TYPE_BIN_OP,
+			'>>>='       => self::TYPE_BIN_OP,
+			'^'          => self::TYPE_BIN_OP,
+			'^='         => self::TYPE_BIN_OP,
+			'|'          => self::TYPE_BIN_OP,
+			'|='         => self::TYPE_BIN_OP,
+			'||'         => self::TYPE_BIN_OP,
+			'in'         => self::TYPE_BIN_OP,
+			'instanceof' => self::TYPE_BIN_OP,
+			'+'          => self::TYPE_ADD_OP,
+			'-'          => self::TYPE_ADD_OP,
+			'?'          => self::TYPE_HOOK,
+			':'          => self::TYPE_COLON,
+			','          => self::TYPE_COMMA,
+			';'          => self::TYPE_SEMICOLON,
+			'{'          => self::TYPE_BRACE_OPEN,
+			'}'          => self::TYPE_BRACE_CLOSE,
+			'('          => self::TYPE_PAREN_OPEN,
+			'['          => self::TYPE_PAREN_OPEN,
+			')'          => self::TYPE_PAREN_CLOSE,
+			']'          => self::TYPE_PAREN_CLOSE,
+			'break'      => self::TYPE_RETURN,
+			'continue'   => self::TYPE_RETURN,
+			'return'     => self::TYPE_RETURN,
+			'throw'      => self::TYPE_RETURN,
+			'catch'      => self::TYPE_IF,
+			'for'        => self::TYPE_IF,
+			'if'         => self::TYPE_IF,
+			'switch'     => self::TYPE_IF,
+			'while'      => self::TYPE_IF,
+			'with'       => self::TYPE_IF,
+			'case'       => self::TYPE_DO,
+			'do'         => self::TYPE_DO,
+			'else'       => self::TYPE_DO,
+			'finally'    => self::TYPE_DO,
+			'try'        => self::TYPE_DO,
+			'var'        => self::TYPE_DO,
+			'function'   => self::TYPE_FUNC
+		);
+
+		// $goto : This is the main table for our state machine. For every state/token pair
+		//         the following state is defined. When no rule exists for a given pair,
+		//         the state is left unchanged.
+		$goto = array(
+			self::STATEMENT => array(
+				self::TYPE_UN_OP      => self::EXPRESSION,
+				self::TYPE_INCR_OP    => self::EXPRESSION,
+				self::TYPE_ADD_OP     => self::EXPRESSION,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+				self::TYPE_RETURN     => self::EXPRESSION_NO_NL,
+				self::TYPE_IF         => self::CONDITION,
+				self::TYPE_FUNC       => self::CONDITION,
+				self::TYPE_LITERAL    => self::EXPRESSION_OP
+			),
+			self::CONDITION => array(
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+			),
+			self::PROPERTY_ASSIGNMENT => array(
+				self::TYPE_COLON      => self::PROPERTY_EXPRESSION,
+				self::TYPE_BRACE_OPEN => self::STATEMENT
+			),
+			self::EXPRESSION => array(
+				self::TYPE_SEMICOLON  => self::STATEMENT,
+				self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+				self::TYPE_FUNC       => self::EXPRESSION_FUNC,
+				self::TYPE_LITERAL    => self::EXPRESSION_OP
+			),
+			self::EXPRESSION_NO_NL => array(
+				self::TYPE_SEMICOLON  => self::STATEMENT,
+				self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+				self::TYPE_FUNC       => self::EXPRESSION_FUNC,
+				self::TYPE_LITERAL    => self::EXPRESSION_OP
+			),
+			self::EXPRESSION_OP => array(
+				self::TYPE_BIN_OP     => self::EXPRESSION,
+				self::TYPE_ADD_OP     => self::EXPRESSION,
+				self::TYPE_HOOK       => self::EXPRESSION_TERNARY,
+				self::TYPE_COLON      => self::STATEMENT,
+				self::TYPE_COMMA      => self::EXPRESSION,
+				self::TYPE_SEMICOLON  => self::STATEMENT,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+			),
+			self::EXPRESSION_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::STATEMENT
+			),
+			self::EXPRESSION_TERNARY => array(
+				self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+				self::TYPE_FUNC       => self::EXPRESSION_TERNARY_FUNC,
+				self::TYPE_LITERAL    => self::EXPRESSION_TERNARY_OP
+			),
+			self::EXPRESSION_TERNARY_OP => array(
+				self::TYPE_BIN_OP     => self::EXPRESSION_TERNARY,
+				self::TYPE_ADD_OP     => self::EXPRESSION_TERNARY,
+				self::TYPE_HOOK       => self::EXPRESSION_TERNARY,
+				self::TYPE_COMMA      => self::EXPRESSION_TERNARY,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+			),
+			self::EXPRESSION_TERNARY_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::STATEMENT
+			),
+			self::PAREN_EXPRESSION => array(
+				self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+				self::TYPE_FUNC       => self::PAREN_EXPRESSION_FUNC,
+				self::TYPE_LITERAL    => self::PAREN_EXPRESSION_OP
+			),
+			self::PAREN_EXPRESSION_OP => array(
+				self::TYPE_BIN_OP     => self::PAREN_EXPRESSION,
+				self::TYPE_ADD_OP     => self::PAREN_EXPRESSION,
+				self::TYPE_HOOK       => self::PAREN_EXPRESSION,
+				self::TYPE_COLON      => self::PAREN_EXPRESSION,
+				self::TYPE_COMMA      => self::PAREN_EXPRESSION,
+				self::TYPE_SEMICOLON  => self::PAREN_EXPRESSION,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+			),
+			self::PAREN_EXPRESSION_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::STATEMENT
+			),
+			self::PROPERTY_EXPRESSION => array(
+				self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION,
+				self::TYPE_FUNC       => self::PROPERTY_EXPRESSION_FUNC,
+				self::TYPE_LITERAL    => self::PROPERTY_EXPRESSION_OP
+			),
+			self::PROPERTY_EXPRESSION_OP => array(
+				self::TYPE_BIN_OP     => self::PROPERTY_EXPRESSION,
+				self::TYPE_ADD_OP     => self::PROPERTY_EXPRESSION,
+				self::TYPE_HOOK       => self::PROPERTY_EXPRESSION,
+				self::TYPE_COMMA      => self::PROPERTY_ASSIGNMENT,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION
+			),
+			self::PROPERTY_EXPRESSION_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::STATEMENT
+			)
+		);
+
+		// $push : This table contains the rules for when to push a state onto the stack.
+		//         The pushed state is the state to return to when the corresponding
+		//         closing token is found
+		$push = array(
+			self::STATEMENT => array(
+				self::TYPE_BRACE_OPEN => self::STATEMENT,
+				self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+			),
+			self::CONDITION => array(
+				self::TYPE_PAREN_OPEN => self::STATEMENT
+			),
+			self::PROPERTY_ASSIGNMENT => array(
+				self::TYPE_BRACE_OPEN => self::PROPERTY_ASSIGNMENT
+			),
+			self::EXPRESSION => array(
+				self::TYPE_BRACE_OPEN => self::EXPRESSION_OP,
+				self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+			),
+			self::EXPRESSION_NO_NL => array(
+				self::TYPE_BRACE_OPEN => self::EXPRESSION_OP,
+				self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+			),
+			self::EXPRESSION_OP => array(
+				self::TYPE_HOOK       => self::EXPRESSION,
+				self::TYPE_PAREN_OPEN => self::EXPRESSION_OP
+			),
+			self::EXPRESSION_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::EXPRESSION_OP
+			),
+			self::EXPRESSION_TERNARY => array(
+				self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP,
+				self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP
+			),
+			self::EXPRESSION_TERNARY_OP => array(
+				self::TYPE_HOOK       => self::EXPRESSION_TERNARY,
+				self::TYPE_PAREN_OPEN => self::EXPRESSION_TERNARY_OP
+			),
+			self::EXPRESSION_TERNARY_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::EXPRESSION_TERNARY_OP
+			),
+			self::PAREN_EXPRESSION => array(
+				self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP,
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP
+			),
+			self::PAREN_EXPRESSION_OP => array(
+				self::TYPE_PAREN_OPEN => self::PAREN_EXPRESSION_OP
+			),
+			self::PAREN_EXPRESSION_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::PAREN_EXPRESSION_OP
+			),
+			self::PROPERTY_EXPRESSION => array(
+				self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP,
+				self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
+			),
+			self::PROPERTY_EXPRESSION_OP => array(
+				self::TYPE_PAREN_OPEN => self::PROPERTY_EXPRESSION_OP
+			),
+			self::PROPERTY_EXPRESSION_FUNC => array(
+				self::TYPE_BRACE_OPEN => self::PROPERTY_EXPRESSION_OP
+			)
+		);
+
+		// $pop : Rules for when to pop a state from the stack
+		$pop = array(
+			self::STATEMENT              => array( self::TYPE_BRACE_CLOSE => true ),
+			self::PROPERTY_ASSIGNMENT    => array( self::TYPE_BRACE_CLOSE => true ),
+			self::EXPRESSION             => array( self::TYPE_BRACE_CLOSE => true ),
+			self::EXPRESSION_NO_NL       => array( self::TYPE_BRACE_CLOSE => true ),
+			self::EXPRESSION_OP          => array( self::TYPE_BRACE_CLOSE => true ),
+			self::EXPRESSION_TERNARY_OP  => array( self::TYPE_COLON       => true ),
+			self::PAREN_EXPRESSION       => array( self::TYPE_PAREN_CLOSE => true ),
+			self::PAREN_EXPRESSION_OP    => array( self::TYPE_PAREN_CLOSE => true ),
+			self::PROPERTY_EXPRESSION    => array( self::TYPE_BRACE_CLOSE => true ),
+			self::PROPERTY_EXPRESSION_OP => array( self::TYPE_BRACE_CLOSE => true )
+		);
+
+		// $semicolon : Rules for when a semicolon insertion is appropriate
+		$semicolon = array(
+			self::EXPRESSION_NO_NL => array(
+				self::TYPE_UN_OP      => true,
+				self::TYPE_INCR_OP    => true,
+				self::TYPE_ADD_OP     => true,
+				self::TYPE_BRACE_OPEN => true,
+				self::TYPE_PAREN_OPEN => true,
+				self::TYPE_RETURN     => true,
+				self::TYPE_IF         => true,
+				self::TYPE_DO         => true,
+				self::TYPE_FUNC       => true,
+				self::TYPE_LITERAL    => true
+			),
+			self::EXPRESSION_OP => array(
+				self::TYPE_UN_OP      => true,
+				self::TYPE_INCR_OP    => true,
+				self::TYPE_BRACE_OPEN => true,
+				self::TYPE_RETURN     => true,
+				self::TYPE_IF         => true,
+				self::TYPE_DO         => true,
+				self::TYPE_FUNC       => true,
+				self::TYPE_LITERAL    => true
+			)
+		);
+
+		// Rules for when newlines should be inserted if
+		// $statementsOnOwnLine is enabled.
+		// $newlineBefore is checked before switching state,
+		// $newlineAfter is checked after
+		$newlineBefore = array(
+			self::STATEMENT => array(
+				self::TYPE_BRACE_CLOSE => true,
+			),
+		);
+		$newlineAfter = array(
+			self::STATEMENT => array(
+				self::TYPE_BRACE_OPEN => true,
+				self::TYPE_PAREN_CLOSE => true,
+				self::TYPE_SEMICOLON => true,
+			),
+		);
+
+		// $divStates : Contains all states that can be followed by a division operator
+		$divStates = array(
+			self::EXPRESSION_OP          => true,
+			self::EXPRESSION_TERNARY_OP  => true,
+			self::PAREN_EXPRESSION_OP    => true,
+			self::PROPERTY_EXPRESSION_OP => true
+		);
+
+		// Here's where the minifying takes place: Loop through the input, looking for tokens
+		// and output them to $out, taking actions to the above defined rules when appropriate.
+		$out = '';
+		$pos = 0;
+		$length = strlen( $s );
+		$lineLength = 0;
+		$newlineFound = true;
+		$state = self::STATEMENT;
+		$stack = array();
+		$last = ';'; // Pretend that we have seen a semicolon yet
+		while( $pos < $length ) {
+			// First, skip over any whitespace and multiline comments, recording whether we
+			// found any newline character
+			$skip = strspn( $s, " \t\n\r\xb\xc", $pos );
+			if( !$skip ) {
+				$ch = $s[$pos];
+				if( $ch === '/' && substr( $s, $pos, 2 ) === '/*' ) {
+					// Multiline comment. Search for the end token or EOT.
+					$end = strpos( $s, '*/', $pos + 2 );
+					$skip = $end === false ? $length - $pos : $end - $pos + 2;
+				}
+			}
+			if( $skip ) {
+				// The semicolon insertion mechanism needs to know whether there was a newline
+				// between two tokens, so record it now.
+				if( !$newlineFound && strcspn( $s, "\r\n", $pos, $skip ) !== $skip ) {
+					$newlineFound = true;
+				}
+				$pos += $skip;
+				continue;
+			}
+			// Handle C++-style comments and html comments, which are treated as single line
+			// comments by the browser, regardless of whether the end tag is on the same line.
+			// Handle --> the same way, but only if it's at the beginning of the line
+			if( ( $ch === '/' && substr( $s, $pos, 2 ) === '//' )
+				|| ( $ch === '<' && substr( $s, $pos, 4 ) === '' )
+			) {
+				$pos += strcspn( $s, "\r\n", $pos );
+				continue;
+			}
+
+			// Find out which kind of token we're handling. $end will point past the end of it.
+			$end = $pos + 1;
+			// Handle string literals
+			if( $ch === "'" || $ch === '"' ) {
+				// Search to the end of the string literal, skipping over backslash escapes
+				$search = $ch . '\\';
+				do{
+					$end += strcspn( $s, $search, $end ) + 2;
+				} while( $end - 2 < $length && $s[$end - 2] === '\\' );
+				$end--;
+			// We have to distinguish between regexp literals and division operators
+			// A division operator is only possible in certain states
+			} elseif( $ch === '/' && !isset( $divStates[$state] ) ) {
+				// Regexp literal, search to the end, skipping over backslash escapes and
+				// character classes
+				for( ; ; ) {
+					do{
+						$end += strcspn( $s, '/[\\', $end ) + 2;
+					} while( $end - 2 < $length && $s[$end - 2] === '\\' );
+					$end--;
+					if( $end - 1 >= $length || $s[$end - 1] === '/' ) {
+						break;
+					}
+					do{
+						$end += strcspn( $s, ']\\', $end ) + 2;
+					} while( $end - 2 < $length && $s[$end - 2] === '\\' );
+					$end--;
+				};
+				// Search past the regexp modifiers (gi)
+				while( $end < $length && ctype_alpha( $s[$end] ) ) {
+					$end++;
+				}
+			} elseif(
+				$ch === '0'
+				&& ($pos + 1 < $length) && ($s[$pos + 1] === 'x' || $s[$pos + 1] === 'X' )
+			) {
+				// Hex numeric literal
+				$end++; // x or X
+				$len = strspn( $s, '0123456789ABCDEFabcdef', $end );
+				if ( !$len ) {
+					return self::parseError($s, $pos, 'Expected a hexadecimal number but found ' . substr( $s, $pos, 5 ) . '...' );
+				}
+				$end += $len;
+			} elseif(
+				ctype_digit( $ch )
+				|| ( $ch === '.' && $pos + 1 < $length && ctype_digit( $s[$pos + 1] ) )
+			) {
+				$end += strspn( $s, '0123456789', $end );
+				$decimal = strspn( $s, '.', $end );
+				if ($decimal) {
+					if ( $decimal > 2 ) {
+						return self::parseError($s, $end, 'The number has too many decimal points' );
+					}
+					$end += strspn( $s, '0123456789', $end + 1 ) + $decimal;
+				}
+				$exponent = strspn( $s, 'eE', $end );
+				if( $exponent ) {
+					if ( $exponent > 1 ) {
+						return self::parseError($s, $end, 'Number with several E' );
+					}
+					$end++;
+
+					// + sign is optional; - sign is required.
+					$end += strspn( $s, '-+', $end );
+					$len = strspn( $s, '0123456789', $end );
+					if ( !$len ) {
+						return self::parseError($s, $pos, 'No decimal digits after e, how many zeroes should be added?' );
+					}
+					$end += $len;
+				}
+			} elseif( isset( $opChars[$ch] ) ) {
+				// Punctuation character. Search for the longest matching operator.
+				while(
+					$end < $length
+					&& isset( $tokenTypes[substr( $s, $pos, $end - $pos + 1 )] )
+				) {
+					$end++;
+				}
+			} else {
+				// Identifier or reserved word. Search for the end by excluding whitespace and
+				// punctuation.
+				$end += strcspn( $s, " \t\n.;,=<>+-{}()[]?:*/%'\"!&|^~\xb\xc\r", $end );
+			}
+
+			// Now get the token type from our type array
+			$token = substr( $s, $pos, $end - $pos ); // so $end - $pos == strlen( $token )
+			$type = isset( $tokenTypes[$token] ) ? $tokenTypes[$token] : self::TYPE_LITERAL;
+
+			if( $newlineFound && isset( $semicolon[$state][$type] ) ) {
+				// This token triggers the semicolon insertion mechanism of javascript. While we
+				// could add the ; token here ourselves, keeping the newline has a few advantages.
+				$out .= "\n";
+				$state = self::STATEMENT;
+				$lineLength = 0;
+			} elseif( $maxLineLength > 0 && $lineLength + $end - $pos > $maxLineLength &&
+					!isset( $semicolon[$state][$type] ) && $type !== self::TYPE_INCR_OP )
+			{
+				// This line would get too long if we added $token, so add a newline first.
+				// Only do this if it won't trigger semicolon insertion and if it won't
+				// put a postfix increment operator on its own line, which is illegal in js.
+				$out .= "\n";
+				$lineLength = 0;
+			// Check, whether we have to separate the token from the last one with whitespace
+			} elseif( !isset( $opChars[$last] ) && !isset( $opChars[$ch] ) ) {
+				$out .= ' ';
+				$lineLength++;
+			// Don't accidentally create ++, -- or // tokens
+			} elseif( $last === $ch && ( $ch === '+' || $ch === '-' || $ch === '/' ) ) {
+				$out .= ' ';
+				$lineLength++;
+			}
+
+			$out .= $token;
+			$lineLength += $end - $pos; // += strlen( $token )
+			$last = $s[$end - 1];
+			$pos = $end;
+			$newlineFound = false;
+
+			// Output a newline after the token if required
+			// This is checked before AND after switching state
+			$newlineAdded = false;
+			if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineBefore[$state][$type] ) ) {
+				$out .= "\n";
+				$lineLength = 0;
+				$newlineAdded = true;
+			}
+
+			// Now that we have output our token, transition into the new state.
+			if( isset( $push[$state][$type] ) && count( $stack ) < self::STACK_LIMIT ) {
+				$stack[] = $push[$state][$type];
+			}
+			if( $stack && isset( $pop[$state][$type] ) ) {
+				$state = array_pop( $stack );
+			} elseif( isset( $goto[$state][$type] ) ) {
+				$state = $goto[$state][$type];
+			}
+
+			// Check for newline insertion again
+			if ( $statementsOnOwnLine && !$newlineAdded && isset( $newlineAfter[$state][$type] ) ) {
+				$out .= "\n";
+				$lineLength = 0;
+			}
+		}
+		return $out;
+	}
+
+	static function parseError($fullJavascript, $position, $errorMsg) {
+		// TODO: Handle the error: trigger_error, throw exception, return false...
+		return false;
+	}
+}
diff --git a/apps/calendar/ajax/import/import.php b/apps/calendar/ajax/import/import.php
index 904c07c52e..a3eaed844a 100644
--- a/apps/calendar/ajax/import/import.php
+++ b/apps/calendar/ajax/import/import.php
@@ -10,18 +10,22 @@ ob_start();
 
 OCP\JSON::checkLoggedIn();
 OCP\App::checkAppEnabled('calendar');
+session_write_close();
 
 $nl="\r\n";
 $comps = array('VEVENT'=>true, 'VTODO'=>true, 'VJOURNAL'=>true);
 
-$progressfile = 'import_tmp/' . md5(session_id()) . '.txt';
+global $progresskey;
+$progresskey = 'calendar.import-' . $_GET['progresskey'];
+
+if (isset($_GET['progress']) && $_GET['progress']) {
+	echo OC_Cache::get($progresskey);
+	die;
+}
 
 function writeProgress($pct) {
-	if(is_writable('import_tmp/')){
-		$progressfopen = fopen($progressfile, 'w');
-		fwrite($progressfopen, $pct);
-		fclose($progressfopen);
-	}
+	global $progresskey;
+	OC_Cache::set($progresskey, $pct, 300);
 }
 writeProgress('10');
 $file = OC_Filesystem::file_get_contents($_POST['path'] . '/' . $_POST['file']);
@@ -114,7 +118,5 @@ foreach($uids as $uid) {
 // finished import
 writeProgress('100');
 sleep(3);
-if(is_writable('import_tmp/')){
-	unlink($progressfile);
-}
+OC_Cache::remove($progresskey);
 OCP\JSON::success();
diff --git a/apps/calendar/import_tmp/Info b/apps/calendar/import_tmp/Info
deleted file mode 100644
index abafbce435..0000000000
--- a/apps/calendar/import_tmp/Info
+++ /dev/null
@@ -1,2 +0,0 @@
-This folder contains static files with the percentage of the import.
-Requires write permission
diff --git a/apps/calendar/js/loader.js b/apps/calendar/js/loader.js
index 60d92f448e..838521ec7f 100644
--- a/apps/calendar/js/loader.js
+++ b/apps/calendar/js/loader.js
@@ -43,8 +43,8 @@ Calendar_Import={
 			}
 			$('#newcalendar').attr('readonly', 'readonly');
 			$('#calendar').attr('disabled', 'disabled');
-			var progressfile = $('#progressfile').val();
-			$.post(OC.filePath('calendar', 'ajax/import', 'import.php'), {method: String (method), calname: String (calname), path: String (path), file: String (filename), id: String (calid)}, function(data){
+			var progresskey = $('#progresskey').val();
+			$.post(OC.filePath('calendar', 'ajax/import', 'import.php') + '?progresskey='+progresskey, {method: String (method), calname: String (calname), path: String (path), file: String (filename), id: String (calid)}, function(data){
 				if(data.status == 'success'){
 					$('#progressbar').progressbar('option', 'value', 100);
 					$('#import_done').css('display', 'block');
@@ -52,7 +52,7 @@ Calendar_Import={
 			});
 			$('#form_container').css('display', 'none');
 			$('#progressbar_container').css('display', 'block');
-			window.setTimeout('Calendar_Import.getimportstatus(\'' + progressfile + '\')', 500);
+			window.setTimeout('Calendar_Import.getimportstatus(\'' + progresskey + '\')', 500);
 		});
 		$('#calendar').change(function(){
 			if($('#calendar option:selected').val() == 'newcal'){
@@ -62,11 +62,11 @@ Calendar_Import={
 			}
 		});
 	},
-	getimportstatus: function(progressfile){
-		$.get(OC.filePath('calendar', 'import_tmp', progressfile), function(percent){
+	getimportstatus: function(progresskey){
+		$.get(OC.filePath('calendar', 'ajax/import', 'import.php') + '?progress=1&progresskey=' + progresskey, function(percent){
 			$('#progressbar').progressbar('option', 'value', parseInt(percent));
 			if(percent < 100){
-				window.setTimeout('Calendar_Import.getimportstatus(\'' + progressfile + '\')', 500);
+				window.setTimeout('Calendar_Import.getimportstatus(\'' + progresskey + '\')', 500);
 			}else{
 				$('#import_done').css('display', 'block');
 			}
diff --git a/apps/calendar/l10n/da.php b/apps/calendar/l10n/da.php
index 5154ef1096..36551a2a93 100644
--- a/apps/calendar/l10n/da.php
+++ b/apps/calendar/l10n/da.php
@@ -1,9 +1,12 @@
  "Der blev ikke fundet nogen kalendere.",
+"No events found." => "Der blev ikke fundet nogen begivenheder.",
 "Wrong calendar" => "Forkert kalender",
 "New Timezone:" => "Ny tidszone:",
 "Timezone changed" => "Tidszone ændret",
 "Invalid request" => "Ugyldig forespørgsel",
 "Calendar" => "Kalender",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ åååå]{ '—'[ MMM] d åååå}",
 "Birthday" => "Fødselsdag",
 "Business" => "Forretning",
 "Call" => "Ring",
@@ -19,6 +22,7 @@
 "Projects" => "Projekter",
 "Questions" => "Spørgsmål",
 "Work" => "Arbejde",
+"unnamed" => "unavngivet",
 "Does not repeat" => "Gentages ikke",
 "Daily" => "Daglig",
 "Weekly" => "Ugentlig",
@@ -80,10 +84,15 @@
 "Calendars" => "Kalendere",
 "There was a fail, while parsing the file." => "Der opstod en fejl under gennemlæsning af filen.",
 "Choose active calendars" => "Vælg aktive kalendere",
+"Your calendars" => "Dine kalendere",
 "CalDav Link" => "CalDav-link",
+"Shared calendars" => "Delte kalendere",
+"No shared calendars" => "Ingen delte kalendere",
+"Share Calendar" => "Del kalender",
 "Download" => "Hent",
 "Edit" => "Rediger",
 "Delete" => "Slet",
+"shared with you by" => "delt af dig",
 "New calendar" => "Ny kalender",
 "Edit calendar" => "Rediger kalender",
 "Displayname" => "Vist navn",
@@ -94,8 +103,15 @@
 "Cancel" => "Annuller",
 "Edit an event" => "Redigér en begivenhed",
 "Export" => "Eksporter",
+"Eventinfo" => "Begivenhedsinfo",
+"Repeating" => "Gentagende",
+"Alarm" => "Alarm",
+"Attendees" => "Deltagere",
+"Share" => "Del",
 "Title of the Event" => "Titel på begivenheden",
 "Category" => "Kategori",
+"Separate categories with commas" => "Opdel kategorier med kommaer",
+"Edit categories" => "Rediger kategorier",
 "All Day Event" => "Heldagsarrangement",
 "From" => "Fra",
 "To" => "Til",
@@ -125,11 +141,22 @@
 "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",
 "Select category" => "Vælg kategori",
+"of" => "fra",
+"at" => "kl.",
 "Timezone" => "Tidszone",
 "Check always for changes of the timezone" => "Check altid efter ændringer i tidszone",
 "Timeformat" => "Tidsformat",
 "24h" => "24T",
 "12h" => "12T",
-"Calendar CalDAV syncing address:" => "Synkroniseringsadresse til CalDAV:"
+"First day of the week" => "Ugens første dag",
+"Calendar CalDAV syncing address:" => "Synkroniseringsadresse til CalDAV:",
+"Users" => "Brugere",
+"select users" => "Vælg brugere",
+"Editable" => "Redigerbar",
+"Groups" => "Grupper",
+"select groups" => "Vælg grupper",
+"make public" => "Offentliggør"
 );
diff --git a/apps/calendar/l10n/de.php b/apps/calendar/l10n/de.php
index 34e6f05f10..f12a18baad 100644
--- a/apps/calendar/l10n/de.php
+++ b/apps/calendar/l10n/de.php
@@ -4,8 +4,9 @@
 "Wrong calendar" => "Falscher Kalender",
 "New Timezone:" => "Neue Zeitzone:",
 "Timezone changed" => "Zeitzone geändert",
-"Invalid request" => "Anfragefehler",
+"Invalid request" => "Fehlerhafte Anfrage",
 "Calendar" => "Kalender",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}",
 "Birthday" => "Geburtstag",
 "Business" => "Geschäftlich",
 "Call" => "Anruf",
@@ -30,7 +31,7 @@
 "Monthly" => "monatlich",
 "Yearly" => "jährlich",
 "never" => "niemals",
-"by occurrences" => "nach Vorkommen",
+"by occurrences" => "nach Terminen",
 "by date" => "nach Datum",
 "by monthday" => "an einem Monatstag",
 "by weekday" => "an einem Wochentag",
@@ -60,10 +61,10 @@
 "October" => "Oktober",
 "November" => "November",
 "December" => "Dezember",
-"by events date" => "bei Tag des Termins",
-"by yearday(s)" => "an einem Tag des Jahres",
-"by weeknumber(s)" => "an einer Wochennummer",
-"by day and month" => "an einer Tag und Monats Kombination",
+"by events date" => "nach Tag des Termins",
+"by yearday(s)" => "nach Tag des Jahres",
+"by weeknumber(s)" => "nach Wochennummer",
+"by day and month" => "nach Tag und Monat",
 "Date" => "Datum",
 "Cal." => "Kal.",
 "All day" => "Ganztags",
@@ -91,7 +92,7 @@
 "Download" => "Herunterladen",
 "Edit" => "Bearbeiten",
 "Delete" => "Löschen",
-"shared with you by" => "Von dir geteilt mit",
+"shared with you by" => "Geteilt mit dir von",
 "New calendar" => "Neuer Kalender",
 "Edit calendar" => "Kalender bearbeiten",
 "Displayname" => "Anzeigename",
@@ -109,7 +110,7 @@
 "Share" => "Teilen",
 "Title of the Event" => "Name",
 "Category" => "Kategorie",
-"Separate categories with commas" => "Kategorien trennen mittels Komma",
+"Separate categories with commas" => "Kategorien mit Kommas trennen",
 "Edit categories" => "Kategorien ändern",
 "All Day Event" => "Ganztägiges Ereignis",
 "From" => "von",
@@ -130,8 +131,8 @@
 "and the events week of year." => "und den Tag des Jahres vom Termin",
 "Interval" => "Intervall",
 "End" => "Ende",
-"occurrences" => "Vorkommen",
-"Import a calendar file" => "Kalender Datei Importieren",
+"occurrences" => "Termine",
+"Import a calendar file" => "Kalenderdatei Importieren",
 "Please choose the calendar" => "Bitte wählen Sie den Kalender.",
 "create a new calendar" => "Neuen Kalender anlegen",
 "Name of new calendar" => "Kalendername",
@@ -144,6 +145,7 @@
 "No categories selected" => "Keine Kategorie ausgewählt",
 "Select category" => "Kategorie auswählen",
 "of" => "von",
+"at" => "um",
 "Timezone" => "Zeitzone",
 "Check always for changes of the timezone" => "immer die Zeitzone überprüfen",
 "Timeformat" => "Zeitformat",
@@ -152,9 +154,9 @@
 "First day of the week" => "erster Wochentag",
 "Calendar CalDAV syncing address:" => "Kalender CalDAV Synchronisationsadresse:",
 "Users" => "Nutzer",
-"select users" => "gewählte Nutzer",
+"select users" => "Nutzer auswählen",
 "Editable" => "editierbar",
 "Groups" => "Gruppen",
-"select groups" => "Wähle Gruppen",
+"select groups" => "Gruppen auswählen",
 "make public" => "Veröffentlichen"
 );
diff --git a/apps/calendar/l10n/fi_FI.php b/apps/calendar/l10n/fi_FI.php
new file mode 100644
index 0000000000..4de94b7b7b
--- /dev/null
+++ b/apps/calendar/l10n/fi_FI.php
@@ -0,0 +1,138 @@
+ "Kalentereita ei löytynyt",
+"No events found." => "Tapahtumia ei löytynyt.",
+"Wrong calendar" => "Väärä kalenteri",
+"New Timezone:" => "Uusi aikavyöhyke:",
+"Timezone changed" => "Aikavyöhyke vaihdettu",
+"Invalid request" => "Virheellinen pyyntö",
+"Calendar" => "Kalenteri",
+"Birthday" => "Syntymäpäivä",
+"Call" => "Ota yhteyttä",
+"Clients" => "Asiakkaat",
+"Deliverer" => "Toimittaja",
+"Holidays" => "Vapaapäivät",
+"Ideas" => "Ideat",
+"Journey" => "Matkustus",
+"Jubilee" => "Vuosipäivät",
+"Meeting" => "Tapaamiset",
+"Other" => "Muut",
+"Personal" => "Henkilökohtainen",
+"Projects" => "Projektit",
+"Questions" => "Kysymykset",
+"Work" => "Työ",
+"unnamed" => "nimetön",
+"Does not repeat" => "Ei toistoa",
+"Daily" => "Päivittäin",
+"Weekly" => "Viikottain",
+"Every Weekday" => "Arkipäivisin",
+"Bi-Weekly" => "Joka toinen viikko",
+"Monthly" => "Kuukausittain",
+"Yearly" => "Vuosittain",
+"never" => "Ei koskaan",
+"Monday" => "Maanantai",
+"Tuesday" => "Tiistai",
+"Wednesday" => "Keskiviikko",
+"Thursday" => "Torstai",
+"Friday" => "Perjantai",
+"Saturday" => "Lauantai",
+"Sunday" => "Sunnuntai",
+"first" => "ensimmäinen",
+"second" => "toinen",
+"third" => "kolmas",
+"fourth" => "neljäs",
+"fifth" => "viides",
+"last" => "viimeinen",
+"January" => "Tammikuu",
+"February" => "Helmikuu",
+"March" => "Maaliskuu",
+"April" => "Huhtikuu",
+"May" => "Toukokuu",
+"June" => "Kesäkuu",
+"July" => "Heinäkuu",
+"August" => "Elokuu",
+"September" => "Syyskuu",
+"October" => "Lokakuu",
+"November" => "Marraskuu",
+"December" => "Joulukuu",
+"Date" => "Päivämäärä",
+"All day" => "Koko päivä",
+"New Calendar" => "Uusi kalenteri",
+"Missing fields" => "Puuttuvat kentät",
+"Title" => "Otsikko",
+"The event ends before it starts" => "Tapahtuma päättyy ennen alkamistaan",
+"There was a database fail" => "Tapahtui tietokantavirhe",
+"Week" => "Viikko",
+"Month" => "Kuukausi",
+"List" => "Lista",
+"Today" => "Tänään",
+"Calendars" => "Kalenterit",
+"There was a fail, while parsing the file." => "Tiedostoa jäsennettäessä tapahtui virhe.",
+"Choose active calendars" => "Valitse aktiiviset kalenterit",
+"Your calendars" => "Omat kalenterisi",
+"CalDav Link" => "CalDav-linkki",
+"Shared calendars" => "Jaetut kalenterit",
+"No shared calendars" => "Ei jaettuja kalentereita",
+"Share Calendar" => "Jaa kalenteri",
+"Download" => "Lataa",
+"Edit" => "Muokkaa",
+"Delete" => "Poista",
+"shared with you by" => "kanssasi jaettu",
+"New calendar" => "Uusi kalenteri",
+"Edit calendar" => "Muokkaa kalenteria",
+"Displayname" => "Kalenterin nimi",
+"Active" => "Aktiivinen",
+"Calendar color" => "Kalenterin väri",
+"Save" => "Tallenna",
+"Submit" => "Talleta",
+"Cancel" => "Peru",
+"Edit an event" => "Muokkaa tapahtumaa",
+"Export" => "Vie",
+"Eventinfo" => "Tapahtumatiedot",
+"Repeating" => "Toisto",
+"Alarm" => "Hälytys",
+"Attendees" => "Osallistujat",
+"Share" => "Jaa",
+"Title of the Event" => "Tapahtuman otsikko",
+"Category" => "Luokka",
+"Separate categories with commas" => "Erota luokat pilkuilla",
+"Edit categories" => "Muokkaa luokkia",
+"All Day Event" => "Koko päivän tapahtuma",
+"From" => "Alkaa",
+"To" => "Päättyy",
+"Advanced options" => "Tarkemmat asetukset",
+"Location" => "Sijainti",
+"Location of the Event" => "Tapahtuman sijainti",
+"Description" => "Kuvaus",
+"Description of the Event" => "Tapahtuman kuvaus",
+"Repeat" => "Toisto",
+"Select weekdays" => "Valitse viikonpäivät",
+"Select days" => "Valitse päivät",
+"Select months" => "Valitse kuukaudet",
+"Select weeks" => "Valitse viikot",
+"Interval" => "Intervalli",
+"Import a calendar file" => "Tuo kalenteritiedosto",
+"Please choose the calendar" => "Valitse kalenteri",
+"create a new calendar" => "luo uusi kalenteri",
+"Name of new calendar" => "Uuden kalenterin nimi",
+"Import" => "Tuo",
+"Importing calendar" => "Tuodaan kalenteria",
+"Calendar imported successfully" => "Kalenteri tuotu onnistuneesti",
+"Close Dialog" => "Sulje ikkuna",
+"Create a new event" => "Luo uusi tapahtuma",
+"View an event" => "Avaa tapahtuma",
+"No categories selected" => "Luokkia ei ole valittu",
+"Select category" => "Valitse luokka",
+"Timezone" => "Aikavyöhyke",
+"Check always for changes of the timezone" => "Tarkista aina aikavyöhykkeen muutokset",
+"Timeformat" => "Ajan esitysmuoto",
+"24h" => "24 tuntia",
+"12h" => "12 tuntia",
+"First day of the week" => "Viikon ensimmäinen päivä",
+"Calendar CalDAV syncing address:" => "Kalenterin CalDAV-synkronointiosoite:",
+"Users" => "Käyttäjät",
+"select users" => "valitse käyttäjät",
+"Editable" => "Muoktattava",
+"Groups" => "Ryhmät",
+"select groups" => "valitse ryhmät",
+"make public" => "aseta julkiseksi"
+);
diff --git a/apps/calendar/l10n/gl.php b/apps/calendar/l10n/gl.php
index 7c747be26f..3178b1819e 100644
--- a/apps/calendar/l10n/gl.php
+++ b/apps/calendar/l10n/gl.php
@@ -1,9 +1,12 @@
  "Non se atoparon calendarios.",
+"No events found." => "Non se atoparon eventos.",
 "Wrong calendar" => "Calendario equivocado",
 "New Timezone:" => "Novo fuso horario:",
 "Timezone changed" => "Fuso horario trocado",
 "Invalid request" => "Petición non válida",
 "Calendar" => "Calendario",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM[ yyyy]{ '—'d [ MMM] yyyy}",
 "Birthday" => "Aniversario",
 "Business" => "Traballo",
 "Call" => "Chamada",
@@ -19,6 +22,7 @@
 "Projects" => "Proxectos",
 "Questions" => "Preguntas",
 "Work" => "Traballo",
+"unnamed" => "sen nome",
 "Does not repeat" => "Non se repite",
 "Daily" => "A diario",
 "Weekly" => "Semanalmente",
@@ -80,10 +84,15 @@
 "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",
+"No shared calendars" => "Sen calendarios compartidos",
+"Share Calendar" => "Compartir calendario",
 "Download" => "Descargar",
 "Edit" => "Editar",
 "Delete" => "Borrar",
+"shared with you by" => "compartido con vostede por",
 "New calendar" => "Novo calendario",
 "Edit calendar" => "Editar calendario",
 "Displayname" => "Mostrar nome",
@@ -94,8 +103,15 @@
 "Cancel" => "Cancelar",
 "Edit an event" => "Editar un evento",
 "Export" => "Exportar",
+"Eventinfo" => "Info do evento",
+"Repeating" => "Repetido",
+"Alarm" => "Alarma",
+"Attendees" => "Participantes",
+"Share" => "Compartir",
 "Title of the Event" => "Título do evento",
 "Category" => "Categoría",
+"Separate categories with commas" => "Separe as categorías con comas",
+"Edit categories" => "Editar categorías",
 "All Day Event" => "Eventos do día",
 "From" => "Desde",
 "To" => "a",
@@ -125,11 +141,22 @@
 "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",
+"No categories selected" => "Non seleccionou as categorías",
 "Select category" => "Seleccionar categoría",
+"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",
-"Calendar CalDAV syncing address:" => "Enderezo de sincronización do calendario CalDAV:"
+"First day of the week" => "Primeiro día da semana",
+"Calendar CalDAV syncing address:" => "Enderezo de sincronización do calendario CalDAV:",
+"Users" => "Usuarios",
+"select users" => "escoller usuarios",
+"Editable" => "Editable",
+"Groups" => "Grupos",
+"select groups" => "escoller grupos",
+"make public" => "facer público"
 );
diff --git a/apps/calendar/l10n/he.php b/apps/calendar/l10n/he.php
index d8bd1c5f00..c161d3be2e 100644
--- a/apps/calendar/l10n/he.php
+++ b/apps/calendar/l10n/he.php
@@ -1,8 +1,12 @@
  "לא נמצאו לוחות שנה.",
+"No events found." => "לא נמצאו אירועים.",
 "Wrong calendar" => "לוח שנה לא נכון",
+"New Timezone:" => "אזור זמן חדש:",
 "Timezone changed" => "אזור זמן השתנה",
 "Invalid request" => "בקשה לא חוקית",
 "Calendar" => "ח שנה",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "d MMM [ yyyy]{ '—'d[ MMM] yyyy}",
 "Birthday" => "יום הולדת",
 "Business" => "עסקים",
 "Call" => "שיחה",
@@ -18,6 +22,7 @@
 "Projects" => "פרוייקטים",
 "Questions" => "שאלות",
 "Work" => "עבודה",
+"unnamed" => "ללא שם",
 "Does not repeat" => "ללא חזרה",
 "Daily" => "יומי",
 "Weekly" => "שבועי",
@@ -25,9 +30,53 @@
 "Bi-Weekly" => "דו שבועי",
 "Monthly" => "חודשי",
 "Yearly" => "שנתי",
+"never" => "לעולם לא",
+"by occurrences" => "לפי מופעים",
+"by date" => "לפי תאריך",
+"by monthday" => "לפי היום בחודש",
+"by weekday" => "לפי היום בשבוע",
+"Monday" => "יום שני",
+"Tuesday" => "יום שלישי",
+"Wednesday" => "יום רביעי",
+"Thursday" => "יום חמישי",
+"Friday" => "יום שישי",
+"Saturday" => "שבת",
+"Sunday" => "יום ראשון",
+"events week of month" => "שבוע בחודש לציון הפעילות",
+"first" => "ראשון",
+"second" => "שני",
+"third" => "שלישי",
+"fourth" => "רביעי",
+"fifth" => "חמישי",
+"last" => "אחרון",
+"January" => "ינואר",
+"February" => "פברואר",
+"March" => "מרץ",
+"April" => "אפריל",
+"May" => "מאי",
+"June" => "יוני",
+"July" => "יולי",
+"August" => "אוגוסט",
+"September" => "ספטמבר",
+"October" => "אוקטובר",
+"November" => "נובמבר",
+"December" => "דצמבר",
+"by events date" => "לפי תאריכי האירועים",
+"by yearday(s)" => "לפי ימים בשנה",
+"by weeknumber(s)" => "לפי מספרי השבועות",
+"by day and month" => "לפי יום וחודש",
+"Date" => "תאריך",
+"Cal." => "לוח שנה",
 "All day" => "היום",
 "New Calendar" => "לוח שנה חדש",
+"Missing fields" => "שדות חסרים",
 "Title" => "כותרת",
+"From Date" => "מתאריך",
+"From Time" => "משעה",
+"To Date" => "עד תאריך",
+"To Time" => "עד שעה",
+"The event ends before it starts" => "האירוע מסתיים עוד לפני שהתחיל",
+"There was a database fail" => "אירע כשל במסד הנתונים",
 "Week" => "שבוע",
 "Month" => "חודש",
 "List" => "רשימה",
@@ -35,10 +84,15 @@
 "Calendars" => "לוחות שנה",
 "There was a fail, while parsing the file." => "אירעה שגיאה בעת פענוח הקובץ.",
 "Choose active calendars" => "בחר לוחות שנה פעילים",
+"Your calendars" => "לוחות השנה שלך",
 "CalDav Link" => "קישור CalDav",
+"Shared calendars" => "לוחות שנה מושתפים",
+"No shared calendars" => "אין לוחות שנה משותפים",
+"Share Calendar" => "שיתוף לוח שנה",
 "Download" => "הורדה",
 "Edit" => "עריכה",
 "Delete" => "מחיקה",
+"shared with you by" => "שותף אתך על ידי",
 "New calendar" => "לוח שנה חדש",
 "Edit calendar" => "עריכת לוח שנה",
 "Displayname" => "שם תצוגה",
@@ -49,18 +103,60 @@
 "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" => "עבור",
+"Advanced options" => "אפשרויות מתקדמות",
 "Location" => "מיקום",
 "Location of the Event" => "מיקום האירוע",
 "Description" => "תיאור",
 "Description of the Event" => "תיאור האירוע",
 "Repeat" => "חזרה",
+"Advanced" => "מתקדם",
+"Select weekdays" => "יש לבחור ימים בשבוע",
+"Select days" => "יש לבחור בימים",
+"and the events day of year." => "ויום האירוע בשנה.",
+"and the events day of month." => "ויום האירוע בחודש.",
+"Select months" => "יש לבחור בחודשים",
+"Select weeks" => "יש לבחור בשבועות",
+"and the events week of year." => "ומספור השבוע הפעיל בשנה.",
+"Interval" => "משך",
+"End" => "סיום",
+"occurrences" => "מופעים",
+"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" => "צפייה באירוע",
+"No categories selected" => "לא נבחרו קטגוריות",
 "Select category" => "בחר קטגוריה",
-"Timezone" => "אזור זמן"
+"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" => "ניתן לעריכה",
+"Groups" => "קבוצות",
+"select groups" => "בחירת קבוצות",
+"make public" => "הפיכה לציבורי"
 );
diff --git a/apps/calendar/l10n/hr.php b/apps/calendar/l10n/hr.php
index 2b2efacd31..551bb4abbc 100644
--- a/apps/calendar/l10n/hr.php
+++ b/apps/calendar/l10n/hr.php
@@ -1,14 +1,18 @@
  "Nisu pronađeni kalendari",
+"No events found." => "Događaj nije pronađen.",
 "Wrong calendar" => "Pogrešan kalendar",
+"New Timezone:" => "Nova vremenska zona:",
 "Timezone changed" => "Vremenska zona promijenjena",
 "Invalid request" => "Neispravan zahtjev",
 "Calendar" => "Kalendar",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "Rođendan",
 "Business" => "Poslovno",
 "Call" => "Poziv",
 "Clients" => "Klijenti",
 "Deliverer" => "Dostavljač",
-"Holidays" => "Odmori",
+"Holidays" => "Praznici",
 "Ideas" => "Ideje",
 "Journey" => "Putovanje",
 "Jubilee" => "Obljetnica",
@@ -18,6 +22,7 @@
 "Projects" => "Projekti",
 "Questions" => "Pitanja",
 "Work" => "Posao",
+"unnamed" => "bezimeno",
 "Does not repeat" => "Ne ponavlja se",
 "Daily" => "Dnevno",
 "Weekly" => "Tjedno",
@@ -25,14 +30,50 @@
 "Bi-Weekly" => "Dvotjedno",
 "Monthly" => "Mjesečno",
 "Yearly" => "Godišnje",
+"never" => "nikad",
+"by occurrences" => "po pojavama",
+"by date" => "po datum",
+"by monthday" => "po dana mjeseca",
+"by weekday" => "po tjednu",
+"Monday" => "ponedeljak",
+"Tuesday" => "utorak",
+"Wednesday" => "srijeda",
+"Thursday" => "četvrtak",
+"Friday" => "petak",
+"Saturday" => "subota",
+"Sunday" => "nedelja",
+"first" => "prvi",
+"second" => "drugi",
+"third" => "treći",
+"fourth" => "četvrti",
+"fifth" => "peti",
+"last" => "zadnji",
+"January" => "siječanj",
+"February" => "veljača",
+"March" => "ožujak",
+"April" => "travanj",
+"May" => "svibanj",
+"June" => "lipanj",
+"July" => "srpanj",
+"August" => "kolovoz",
+"September" => "rujan",
+"October" => "listopad",
+"November" => "studeni",
+"December" => "prosinac",
+"by events date" => "po datumu događaja",
+"by yearday(s)" => "po godini(-nama)",
+"by weeknumber(s)" => "po broju tjedna(-ana)",
+"by day and month" => "po danu i mjeseca",
+"Date" => "datum",
+"Cal." => "Kal.",
 "All day" => "Cijeli dan",
-"New Calendar" => "Novi Kalendar",
+"New Calendar" => "Novi kalendar",
 "Missing fields" => "Nedostaju polja",
 "Title" => "Naslov",
-"From Date" => "Datum Od",
-"From Time" => "Vrijeme Od",
-"To Date" => "Datum Do",
-"To Time" => "Vrijeme Do",
+"From Date" => "Datum od",
+"From Time" => "Vrijeme od",
+"To Date" => "Datum do",
+"To Time" => "Vrijeme do",
 "The event ends before it starts" => "Događaj završava prije nego počinje",
 "There was a database fail" => "Pogreška u bazi podataka",
 "Week" => "Tjedan",
@@ -41,11 +82,16 @@
 "Today" => "Danas",
 "Calendars" => "Kalendari",
 "There was a fail, while parsing the file." => "Pogreška pri čitanju datoteke.",
-"Choose active calendars" => "Odaberite aktive kalendare",
-"CalDav Link" => "CalDav Poveznica",
+"Choose active calendars" => "Odabir aktivnih kalendara",
+"Your calendars" => "Vaši kalendari",
+"CalDav Link" => "CalDav poveznica",
+"Shared calendars" => "Podijeljeni kalendari",
+"No shared calendars" => "Nema zajedničkih kalendara",
+"Share Calendar" => "Podjeli kalendar",
 "Download" => "Spremi lokalno",
 "Edit" => "Uredi",
 "Delete" => "Briši",
+"shared with you by" => "podijeljeno s vama od ",
 "New calendar" => "Novi kalendar",
 "Edit calendar" => "Uredi kalendar",
 "Displayname" => "Naziv",
@@ -56,24 +102,57 @@
 "Cancel" => "Odustani",
 "Edit an event" => "Uredi događaj",
 "Export" => "Izvoz",
-"Title of the Event" => "Naslov Događaja",
+"Eventinfo" => "Informacije o događaju",
+"Repeating" => "Ponavljanje",
+"Alarm" => "Alarm",
+"Attendees" => "Polaznici",
+"Share" => "Podijeli",
+"Title of the Event" => "Naslov događaja",
 "Category" => "Kategorija",
+"Separate categories with commas" => "Odvoji kategorije zarezima",
+"Edit categories" => "Uredi kategorije",
 "All Day Event" => "Cjelodnevni događaj",
 "From" => "Od",
 "To" => "Za",
 "Advanced options" => "Napredne mogućnosti",
 "Location" => "Lokacija",
-"Location of the Event" => "Lokacija Događaja",
+"Location of the Event" => "Lokacija događaja",
 "Description" => "Opis",
 "Description of the Event" => "Opis događaja",
 "Repeat" => "Ponavljanje",
-"Please choose the calendar" => "Odaberite kalendar",
+"Advanced" => "Napredno",
+"Select weekdays" => "Odaberi dane u tjednu",
+"Select days" => "Odaberi dane",
+"Select months" => "Odaberi mjesece",
+"Select weeks" => "Odaberi tjedne",
+"Interval" => "Interval",
+"End" => "Kraj",
+"occurrences" => "pojave",
+"Import a calendar file" => "Uvozite datoteku kalendara",
+"Please choose the calendar" => "Odaberi kalendar",
+"create a new calendar" => "stvori novi kalendar",
+"Name of new calendar" => "Ime novog kalendara",
 "Import" => "Uvoz",
+"Importing calendar" => "Uvoz kalendara",
+"Calendar imported successfully" => "Kalendar je uspješno uvezen",
+"Close Dialog" => "Zatvori dijalog",
 "Create a new event" => "Unesi novi događaj",
+"View an event" => "Vidjeti događaj",
+"No categories selected" => "Nema odabranih kategorija",
 "Select category" => "Odabir kategorije",
+"of" => "od",
+"at" => "na",
 "Timezone" => "Vremenska zona",
+"Check always for changes of the timezone" => "Provjerite uvijek za promjene vremenske zone",
 "Timeformat" => "Format vremena",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Adresa za CalDAV sinkronizaciju kalendara"
+"First day of the week" => "Prvi dan tjedna",
+"Calendar CalDAV syncing address:" => "Adresa za CalDAV sinkronizaciju kalendara:",
+"Users" => "Korisnici",
+"select users" => "odaberi korisnike",
+"Editable" => "Može se uređivati",
+"Groups" => "Grupe",
+"select groups" => "izaberite grupe",
+"make public" => "podjeli s javnošću"
 );
diff --git a/apps/calendar/l10n/ja_JP.php b/apps/calendar/l10n/ja_JP.php
index d4a4b5f018..c533a9bd1a 100644
--- a/apps/calendar/l10n/ja_JP.php
+++ b/apps/calendar/l10n/ja_JP.php
@@ -1,9 +1,12 @@
  "カレンダーが見つかりませんでした。",
+"No events found." => "イベントが見つかりませんでした。",
 "Wrong calendar" => "誤ったカレンダーです",
 "New Timezone:" => "新しいタイムゾーン:",
 "Timezone changed" => "タイムゾーンが変更されました",
 "Invalid request" => "無効なリクエストです",
 "Calendar" => "カレンダー",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "誕生日",
 "Business" => "ビジネス",
 "Call" => "電話をかける",
@@ -18,7 +21,7 @@
 "Personal" => "個人",
 "Projects" => "プロジェクト",
 "Questions" => "質問事項",
-"Work" => "仕事",
+"Work" => "週の始まり",
 "Does not repeat" => "繰り返さない",
 "Daily" => "毎日",
 "Weekly" => "毎週",
@@ -31,13 +34,13 @@
 "by date" => "日付で指定",
 "by monthday" => "日にちで指定",
 "by weekday" => "曜日で指定",
-"Monday" => "月曜日",
-"Tuesday" => "火曜日",
-"Wednesday" => "水曜日",
-"Thursday" => "木曜日",
-"Friday" => "金曜日",
-"Saturday" => "土曜日",
-"Sunday" => "日曜日",
+"Monday" => "月曜",
+"Tuesday" => "火曜",
+"Wednesday" => "水曜",
+"Thursday" => "木曜",
+"Friday" => "金曜",
+"Saturday" => "土曜",
+"Sunday" => "日曜",
 "events week of month" => "予定のある週を指定",
 "first" => "1週目",
 "second" => "2週目",
@@ -64,7 +67,7 @@
 "Date" => "日付",
 "Cal." => "カレンダー",
 "All day" => "終日",
-"New Calendar" => "新しくカレンダーを作成する",
+"New Calendar" => "新しくカレンダーを作成",
 "Missing fields" => "項目がありません",
 "Title" => "タイトル",
 "From Date" => "開始日",
@@ -72,19 +75,23 @@
 "To Date" => "終了日",
 "To Time" => "終了時間",
 "The event ends before it starts" => "イベント終了時間が開始時間より先です",
-"There was a database fail" => "データベースフェイルがありました",
+"There was a database fail" => "データベースのエラーがありました",
 "Week" => "週",
 "Month" => "月",
 "List" => "リスト",
 "Today" => "今日",
 "Calendars" => "カレンダー",
-"There was a fail, while parsing the file." => "ファイルを構文解析する際に失敗しました",
-"Choose active calendars" => "アクティブなカレンダーを選択してください",
+"There was a fail, while parsing the file." => "ファイルの構文解析に失敗しました。",
+"Choose active calendars" => "アクティブなカレンダーを選択",
+"Your calendars" => "あなたのカレンダー",
 "CalDav Link" => "CalDavへのリンク",
+"Shared calendars" => "共有カレンダー",
+"No shared calendars" => "共有カレンダーはありません",
+"Share Calendar" => "カレンダーを共有する",
 "Download" => "ダウンロード",
 "Edit" => "編集",
 "Delete" => "削除",
-"New calendar" => "新しくカレンダーを作成する",
+"New calendar" => "新しいカレンダー",
 "Edit calendar" => "カレンダーを編集",
 "Displayname" => "表示名",
 "Active" => "アクティブ",
@@ -94,8 +101,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" => "終了",
@@ -103,8 +117,8 @@
 "Location" => "場所",
 "Location of the Event" => "イベントの場所",
 "Description" => "メモ",
-"Description of the Event" => "イベントのメモ",
-"Repeat" => "繰り返す",
+"Description of the Event" => "イベントの説明",
+"Repeat" => "繰り返し",
 "Advanced" => "詳細設定",
 "Select weekdays" => "曜日を指定",
 "Select days" => "日付を指定",
@@ -113,7 +127,7 @@
 "Select months" => "月を指定する",
 "Select weeks" => "週を指定する",
 "and the events week of year." => "対象の週を選択する。",
-"Interval" => "周期",
+"Interval" => "間隔",
 "End" => "繰り返す期間",
 "occurrences" => "回繰り返す",
 "Import a calendar file" => "カレンダーファイルをインポート",
@@ -123,13 +137,24 @@
 "Import" => "インポート",
 "Importing calendar" => "カレンダーを取り込み中",
 "Calendar imported successfully" => "カレンダーの取り込みに成功しました",
-"Close Dialog" => "閉じる",
-"Create a new event" => "新しいイベントを作成する",
+"Close Dialog" => "ダイアログを閉じる",
+"Create a new event" => "新しいイベントを作成",
+"View an event" => "イベントを閲覧",
+"No categories selected" => "カテゴリが選択されていません",
 "Select category" => "カテゴリーを選択してください",
+"of" => "of",
+"at" => "at",
 "Timezone" => "タイムゾーン",
-"Check always for changes of the timezone" => "タイムゾーン変更を常に確認する",
+"Check always for changes of the timezone" => "タイムゾーンの変更を常に確認",
 "Timeformat" => "時刻のフォーマット",
-"24h" => "24時間制",
-"12h" => "12時間制",
-"Calendar CalDAV syncing address:" => "カレンダーのCalDAVシンクアドレス"
+"24h" => "24h",
+"12h" => "12h",
+"First day of the week" => "週の始まり",
+"Calendar CalDAV syncing address:" => "CalDAVカレンダーの同期アドレス:",
+"Users" => "ユーザ",
+"select users" => "ユーザを選択",
+"Editable" => "編集可能",
+"Groups" => "グループ",
+"select groups" => "グループを選択",
+"make public" => "公開する"
 );
diff --git a/apps/calendar/l10n/lb.php b/apps/calendar/l10n/lb.php
index 23e94d1cd1..b40f652cc5 100644
--- a/apps/calendar/l10n/lb.php
+++ b/apps/calendar/l10n/lb.php
@@ -1,8 +1,12 @@
  "Keng Kalenner fonnt.",
+"No events found." => "Keng Evenementer fonnt.",
 "Wrong calendar" => "Falschen Kalenner",
+"New Timezone:" => "Nei Zäitzone:",
 "Timezone changed" => "Zäitzon geännert",
 "Invalid request" => "Ongülteg Requête",
 "Calendar" => "Kalenner",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "Gebuertsdag",
 "Business" => "Geschäftlech",
 "Call" => "Uruff",
@@ -25,6 +29,38 @@
 "Bi-Weekly" => "All zweet Woch",
 "Monthly" => "All Mount",
 "Yearly" => "All Joer",
+"never" => "ni",
+"by occurrences" => "no Virkommes",
+"by date" => "no Datum",
+"by monthday" => "no Mount-Dag",
+"by weekday" => "no Wochendag",
+"Monday" => "Méindes",
+"Tuesday" => "Dënschdes",
+"Wednesday" => "Mëttwoch",
+"Thursday" => "Donneschdes",
+"Friday" => "Freides",
+"Saturday" => "Samschdes",
+"Sunday" => "Sonndes",
+"first" => "éischt",
+"second" => "Sekonn",
+"third" => "Drëtt",
+"fourth" => "Féiert",
+"fifth" => "Fënneft",
+"last" => "Läscht",
+"January" => "Januar",
+"February" => "Februar",
+"March" => "Mäerz",
+"April" => "Abrëll",
+"May" => "Mee",
+"June" => "Juni",
+"July" => "Juli",
+"August" => "August",
+"September" => "September",
+"October" => "Oktober",
+"November" => "November",
+"December" => "Dezember",
+"Date" => "Datum",
+"Cal." => "Cal.",
 "All day" => "All Dag",
 "New Calendar" => "Neien Kalenner",
 "Missing fields" => "Felder déi feelen",
@@ -42,7 +78,10 @@
 "Calendars" => "Kalenneren",
 "There was a fail, while parsing the file." => "Feeler beim lueden vum Fichier.",
 "Choose active calendars" => "Wiel aktiv Kalenneren aus",
+"Your calendars" => "Deng Kalenneren",
 "CalDav Link" => "CalDav Link",
+"Shared calendars" => "Gedeelte Kalenneren",
+"No shared calendars" => "Keng gedeelten Kalenneren",
 "Download" => "Eroflueden",
 "Edit" => "Editéieren",
 "Delete" => "Läschen",
@@ -67,8 +106,22 @@
 "Description" => "Beschreiwung",
 "Description of the Event" => "Beschreiwung vum Evenement",
 "Repeat" => "Widderhuelen",
+"Advanced" => "Erweidert",
+"Select weekdays" => "Wochendeeg auswielen",
+"Select days" => "Deeg auswielen",
+"Select months" => "Méint auswielen",
+"Select weeks" => "Wochen auswielen",
+"Interval" => "Intervall",
+"End" => "Enn",
+"occurrences" => "Virkommes",
+"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",
diff --git a/apps/calendar/l10n/lt_LT.php b/apps/calendar/l10n/lt_LT.php
index 3edf7b5469..d7e15fb438 100644
--- a/apps/calendar/l10n/lt_LT.php
+++ b/apps/calendar/l10n/lt_LT.php
@@ -1,9 +1,12 @@
  "Kalendorių nerasta.",
+"No events found." => "Įvykių nerasta.",
 "Wrong calendar" => "Ne tas kalendorius",
 "New Timezone:" => "Nauja laiko juosta:",
 "Timezone changed" => "Laiko zona pakeista",
 "Invalid request" => "Klaidinga užklausa",
 "Calendar" => "Kalendorius",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "Gimtadienis",
 "Business" => "Verslas",
 "Call" => "Skambučiai",
@@ -19,6 +22,7 @@
 "Projects" => "Projektai",
 "Questions" => "Klausimai",
 "Work" => "Darbas",
+"unnamed" => "be pavadinimo",
 "Does not repeat" => "Nekartoti",
 "Daily" => "Kasdien",
 "Weekly" => "Kiekvieną savaitę",
@@ -68,7 +72,11 @@
 "Calendars" => "Kalendoriai",
 "There was a fail, while parsing the file." => "Apdorojant failą įvyko klaida.",
 "Choose active calendars" => "Pasirinkite naudojamus kalendorius",
+"Your calendars" => "Jūsų kalendoriai",
 "CalDav Link" => "CalDav adresas",
+"Shared calendars" => "Bendri kalendoriai",
+"No shared calendars" => "Bendrų kalendorių nėra",
+"Share Calendar" => "Dalintis kalendoriumi",
 "Download" => "Atsisiųsti",
 "Edit" => "Keisti",
 "Delete" => "Trinti",
@@ -82,8 +90,14 @@
 "Cancel" => "Atšaukti",
 "Edit an event" => "Taisyti įvykį",
 "Export" => "Eksportuoti",
+"Eventinfo" => "Informacija",
+"Repeating" => "Pasikartojantis",
+"Attendees" => "Dalyviai",
+"Share" => "Dalintis",
 "Title of the Event" => "Įvykio pavadinimas",
 "Category" => "Kategorija",
+"Separate categories with commas" => "Atskirkite kategorijas kableliais",
+"Edit categories" => "Redaguoti kategorijas",
 "All Day Event" => "Visos dienos įvykis",
 "From" => "Nuo",
 "To" => "Iki",
@@ -95,6 +109,8 @@
 "Repeat" => "Kartoti",
 "Select weekdays" => "Pasirinkite savaitės dienas",
 "Select days" => "Pasirinkite dienas",
+"Select months" => "Pasirinkite mėnesius",
+"Select weeks" => "Pasirinkite savaites",
 "Interval" => "Intervalas",
 "End" => "Pabaiga",
 "Import a calendar file" => "Importuoti kalendoriaus failą",
@@ -106,11 +122,19 @@
 "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",
 "Select category" => "Pasirinkite kategoriją",
 "Timezone" => "Laiko juosta",
 "Check always for changes of the timezone" => "Visada tikrinti laiko zonos pasikeitimus",
 "Timeformat" => "Laiko formatas",
 "24h" => "24val",
 "12h" => "12val",
-"Calendar CalDAV syncing address:" => "CalDAV kalendoriaus synchronizavimo adresas:"
+"Calendar CalDAV syncing address:" => "CalDAV kalendoriaus synchronizavimo adresas:",
+"Users" => "Vartotojai",
+"select users" => "pasirinkti vartotojus",
+"Editable" => "Redaguojamas",
+"Groups" => "Grupės",
+"select groups" => "pasirinkti grupes",
+"make public" => "viešinti"
 );
diff --git a/apps/calendar/l10n/nb_NO.php b/apps/calendar/l10n/nb_NO.php
index b9a7bf4cb1..95ba5a9dba 100644
--- a/apps/calendar/l10n/nb_NO.php
+++ b/apps/calendar/l10n/nb_NO.php
@@ -147,7 +147,7 @@
 "24h" => "24 t",
 "12h" => "12 t",
 "First day of the week" => "Ukens første dag",
-"Calendar CalDAV syncing address:" => "Kalender CalDAV synkroniseringsadresse",
+"Calendar CalDAV syncing address:" => "Synkroniseringsadresse fo kalender CalDAV:",
 "Users" => "Brukere",
 "select users" => "valgte brukere",
 "Editable" => "Redigerbar",
diff --git a/apps/calendar/l10n/pl.php b/apps/calendar/l10n/pl.php
index 520c67d424..e582cdbb9b 100644
--- a/apps/calendar/l10n/pl.php
+++ b/apps/calendar/l10n/pl.php
@@ -1,9 +1,12 @@
  "Brak kalendarzy",
+"No events found." => "Brak wydzarzeń",
 "Wrong calendar" => "Nieprawidłowy kalendarz",
 "New Timezone:" => "Nowa strefa czasowa:",
 "Timezone changed" => "Zmieniono strefę czasową",
 "Invalid request" => "Nieprawidłowe żądanie",
 "Calendar" => "Kalendarz",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "Urodziny",
 "Business" => "Interesy",
 "Call" => "Rozmowy",
@@ -19,6 +22,7 @@
 "Projects" => "Projekty",
 "Questions" => "Pytania",
 "Work" => "Zawodowe",
+"unnamed" => "nienazwany",
 "Does not repeat" => "Brak",
 "Daily" => "Codziennie",
 "Weekly" => "Tygodniowo",
@@ -80,10 +84,15 @@
 "Calendars" => "Kalendarze",
 "There was a fail, while parsing the file." => "Nie udało się przetworzyć pliku.",
 "Choose active calendars" => "Wybór aktywnych kalendarzy",
+"Your calendars" => "Twoje kalendarze",
 "CalDav Link" => "Wyświetla odnośnik CalDAV",
+"Shared calendars" => "Współdzielone kalendarze",
+"No shared calendars" => "Brak współdzielonych kalendarzy",
+"Share Calendar" => "Współdziel kalendarz",
 "Download" => "Pobiera kalendarz",
 "Edit" => "Edytuje kalendarz",
 "Delete" => "Usuwa kalendarz",
+"shared with you by" => "współdzielisz z",
 "New calendar" => "Nowy kalendarz",
 "Edit calendar" => "Edytowanie kalendarza",
 "Displayname" => "Wyświetlana nazwa",
@@ -94,8 +103,15 @@
 "Cancel" => "Anuluj",
 "Edit an event" => "Edytowanie wydarzenia",
 "Export" => "Wyeksportuj",
+"Eventinfo" => "Informacja o wydarzeniach",
+"Repeating" => "Powtarzanie",
+"Alarm" => "Alarm",
+"Attendees" => "Uczestnicy",
+"Share" => "Współdziel",
 "Title of the Event" => "Nazwa wydarzenia",
 "Category" => "Kategoria",
+"Separate categories with commas" => "Oddziel kategorie przecinkami",
+"Edit categories" => "Edytuj kategorie",
 "All Day Event" => "Wydarzenie całodniowe",
 "From" => "Od",
 "To" => "Do",
@@ -125,11 +141,22 @@
 "Calendar imported successfully" => "Zaimportowano kalendarz",
 "Close Dialog" => "Zamknij okno",
 "Create a new event" => "Tworzenie nowego wydarzenia",
+"View an event" => "Zobacz wydarzenie",
+"No categories selected" => "nie zaznaczono kategorii",
 "Select category" => "Wybierz kategorię",
+"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",
-"Calendar CalDAV syncing address:" => "Adres synchronizacji kalendarza CalDAV:"
+"First day of the week" => "Pierwszy dzień tygodnia",
+"Calendar CalDAV syncing address:" => "Adres synchronizacji kalendarza CalDAV:",
+"Users" => "Użytkownicy",
+"select users" => "wybierz użytkowników",
+"Editable" => "Edytowalne",
+"Groups" => "Grupy",
+"select groups" => "wybierz grupy",
+"make public" => "uczyń publicznym"
 );
diff --git a/apps/calendar/l10n/pt_PT.php b/apps/calendar/l10n/pt_PT.php
index 867a10a70b..33f85569cc 100644
--- a/apps/calendar/l10n/pt_PT.php
+++ b/apps/calendar/l10n/pt_PT.php
@@ -1,9 +1,12 @@
  "Nenhum calendário encontrado.",
+"No events found." => "Nenhum evento encontrado.",
 "Wrong calendar" => "Calendário errado",
 "New Timezone:" => "Nova zona horária",
 "Timezone changed" => "Zona horária alterada",
 "Invalid request" => "Pedido inválido",
 "Calendar" => "Calendário",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "Dia de anos",
 "Business" => "Negócio",
 "Call" => "Telefonar",
@@ -19,6 +22,7 @@
 "Projects" => "Projetos",
 "Questions" => "Perguntas",
 "Work" => "Trabalho",
+"unnamed" => "não definido",
 "Does not repeat" => "Não repete",
 "Daily" => "Diário",
 "Weekly" => "Semanal",
@@ -80,10 +84,15 @@
 "Calendars" => "Calendários",
 "There was a fail, while parsing the file." => "Houve uma falha durante a análise do ficheiro",
 "Choose active calendars" => "Escolhe calendários ativos",
+"Your calendars" => "Os seus calendários",
 "CalDav Link" => "Endereço CalDav",
+"Shared calendars" => "Calendários partilhados",
+"No shared calendars" => "Nenhum calendário partilhado",
+"Share Calendar" => "Partilhar calendário",
 "Download" => "Transferir",
 "Edit" => "Editar",
 "Delete" => "Apagar",
+"shared with you by" => "Partilhado consigo por",
 "New calendar" => "Novo calendário",
 "Edit calendar" => "Editar calendário",
 "Displayname" => "Nome de exibição",
@@ -94,8 +103,15 @@
 "Cancel" => "Cancelar",
 "Edit an event" => "Editar um evento",
 "Export" => "Exportar",
+"Eventinfo" => "Informação do evento",
+"Repeating" => "Repetição",
+"Alarm" => "Alarme",
+"Attendees" => "Participantes",
+"Share" => "Partilhar",
 "Title of the Event" => "Título do evento",
 "Category" => "Categoria",
+"Separate categories with commas" => "Separe categorias por virgulas",
+"Edit categories" => "Editar categorias",
 "All Day Event" => "Evento de dia inteiro",
 "From" => "De",
 "To" => "Para",
@@ -125,11 +141,22 @@
 "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",
 "Select category" => "Selecionar categoria",
+"of" => "de",
+"at" => "em",
 "Timezone" => "Zona horária",
 "Check always for changes of the timezone" => "Verificar sempre por alterações na zona horária",
 "Timeformat" => "Formato da hora",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Endereço de sincronização CalDav do calendário"
+"First day of the week" => "Primeiro dia da semana",
+"Calendar CalDAV syncing address:" => "Endereço de sincronização CalDav do calendário",
+"Users" => "Utilizadores",
+"select users" => "Selecione utilizadores",
+"Editable" => "Editavel",
+"Groups" => "Grupos",
+"select groups" => "Selecione grupos",
+"make public" => "Tornar público"
 );
diff --git a/apps/calendar/l10n/ro.php b/apps/calendar/l10n/ro.php
index f2b7707186..550afcd102 100644
--- a/apps/calendar/l10n/ro.php
+++ b/apps/calendar/l10n/ro.php
@@ -1,9 +1,12 @@
  "Nici un calendar găsit.",
+"No events found." => "Nici un eveniment găsit.",
 "Wrong calendar" => "Calendar greșit",
 "New Timezone:" => "Fus orar nou:",
 "Timezone changed" => "Fus orar schimbat",
 "Invalid request" => "Cerere eronată",
 "Calendar" => "Calendar",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "LLL z[aaaa]{'—'[LLL] z aaaa}",
 "Birthday" => "Zi de naștere",
 "Business" => "Afaceri",
 "Call" => "Sună",
@@ -19,6 +22,7 @@
 "Projects" => "Proiecte",
 "Questions" => "Întrebări",
 "Work" => "Servici",
+"unnamed" => "fără nume",
 "Does not repeat" => "Nerepetabil",
 "Daily" => "Zilnic",
 "Weekly" => "Săptămânal",
@@ -80,10 +84,15 @@
 "Calendars" => "Calendare",
 "There was a fail, while parsing the file." => "A fost întâmpinată o eroare în procesarea fișierului",
 "Choose active calendars" => "Alege calendarele active",
+"Your calendars" => "Calendarele tale",
 "CalDav Link" => "Legătură CalDav",
+"Shared calendars" => "Calendare partajate",
+"No shared calendars" => "Nici un calendar partajat",
+"Share Calendar" => "Partajați calendarul",
 "Download" => "Descarcă",
 "Edit" => "Modifică",
 "Delete" => "Șterge",
+"shared with you by" => "Partajat cu tine de",
 "New calendar" => "Calendar nou",
 "Edit calendar" => "Modifică calendarul",
 "Displayname" => "Nume afișat",
@@ -94,8 +103,15 @@
 "Cancel" => "Anulează",
 "Edit an event" => "Modifică un eveniment",
 "Export" => "Exportă",
+"Eventinfo" => "Informații despre eveniment",
+"Repeating" => "Ciclic",
+"Alarm" => "Alarmă",
+"Attendees" => "Participanți",
+"Share" => "Partajează",
 "Title of the Event" => "Numele evenimentului",
 "Category" => "Categorie",
+"Separate categories with commas" => "Separă categoriile prin virgule",
+"Edit categories" => "Editează categorii",
 "All Day Event" => "Toată ziua",
 "From" => "De la",
 "To" => "Către",
@@ -125,11 +141,22 @@
 "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",
+"No categories selected" => "Nici o categorie selectată",
 "Select category" => "Selecteză categoria",
+"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",
-"Calendar CalDAV syncing address:" => "Adresa pentru sincronizarea calendarului CalDAV"
+"First day of the week" => "Prima zi a săptămînii",
+"Calendar CalDAV syncing address:" => "Adresa pentru sincronizarea calendarului CalDAV",
+"Users" => "Utilizatori",
+"select users" => "utilizatori selectați",
+"Editable" => "Editabil",
+"Groups" => "Grupuri",
+"select groups" => "grupuri selectate",
+"make public" => "fă public"
 );
diff --git a/apps/calendar/l10n/ru.php b/apps/calendar/l10n/ru.php
index ff33dd6663..af40b06b9f 100644
--- a/apps/calendar/l10n/ru.php
+++ b/apps/calendar/l10n/ru.php
@@ -1,4 +1,6 @@
  "Календари не найдены.",
+"No events found." => "События не найдены.",
 "Wrong calendar" => "Неверный календарь",
 "New Timezone:" => "Новый часовой пояс:",
 "Timezone changed" => "Часовой пояс изменён",
@@ -19,6 +21,7 @@
 "Projects" => "Проекты",
 "Questions" => "Вопросы",
 "Work" => "Работа",
+"unnamed" => "без имени",
 "Does not repeat" => "Не повторяется",
 "Daily" => "Ежедневно",
 "Weekly" => "Еженедельно",
@@ -80,10 +83,15 @@
 "Calendars" => "Календари",
 "There was a fail, while parsing the file." => "Не удалось обработать файл.",
 "Choose active calendars" => "Выберите активные календари",
+"Your calendars" => "Ваши календари",
 "CalDav Link" => "Ссылка для CalDav",
+"Shared calendars" => "Общие календари",
+"No shared calendars" => "Нет общих календарей",
+"Share Calendar" => "Сделать календарь общим",
 "Download" => "Скачать",
 "Edit" => "Редактировать",
 "Delete" => "Удалить",
+"shared with you by" => "с вами поделился",
 "New calendar" => "Новый календарь",
 "Edit calendar" => "Редактировать календарь",
 "Displayname" => "Отображаемое имя",
@@ -94,8 +102,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" => "До",
@@ -125,11 +140,20 @@
 "Calendar imported successfully" => "Календарь успешно импортирован",
 "Close Dialog" => "Закрыть Сообщение",
 "Create a new event" => "Создать новое событие",
+"View an event" => "Показать событие",
+"No categories selected" => "Категории не выбраны",
 "Select category" => "Выбрать категорию",
 "Timezone" => "Часовой пояс",
 "Check always for changes of the timezone" => "Всегда проверяйте изменение часового пояса",
 "Timeformat" => "Формат времени",
 "24h" => "24ч",
 "12h" => "12ч",
-"Calendar CalDAV syncing address:" => "Адрес синхронизации календаря CalDAV:"
+"First day of the week" => "Первый день недели",
+"Calendar CalDAV syncing address:" => "Адрес синхронизации календаря CalDAV:",
+"Users" => "Пользователи",
+"select users" => "выбрать пользователей",
+"Editable" => "Редактируемо",
+"Groups" => "Группы",
+"select groups" => "выбрать группы",
+"make public" => "селать публичным"
 );
diff --git a/apps/calendar/l10n/sv.php b/apps/calendar/l10n/sv.php
index ee19c6b737..59f8c6e6b5 100644
--- a/apps/calendar/l10n/sv.php
+++ b/apps/calendar/l10n/sv.php
@@ -1,9 +1,12 @@
  "Inga kalendrar funna",
+"No events found." => "Inga händelser funna.",
 "Wrong calendar" => "Fel kalender",
 "New Timezone:" => "Ny tidszon:",
 "Timezone changed" => "Tidszon ändrad",
 "Invalid request" => "Ogiltig begäran",
 "Calendar" => "Kalender",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "Födelsedag",
 "Business" => "Företag",
 "Call" => "Ringa",
@@ -19,6 +22,7 @@
 "Projects" => "Projekt",
 "Questions" => "Frågor",
 "Work" => "Arbetet",
+"unnamed" => "Namn saknas",
 "Does not repeat" => "Upprepas inte",
 "Daily" => "Dagligen",
 "Weekly" => "Varje vecka",
@@ -80,10 +84,15 @@
 "Calendars" => "Kalendrar",
 "There was a fail, while parsing the file." => "Det blev ett fel medan filen analyserades.",
 "Choose active calendars" => "Välj aktiva kalendrar",
+"Your calendars" => "Dina kalendrar",
 "CalDav Link" => "CalDAV-länk",
+"Shared calendars" => "Delade kalendrar",
+"No shared calendars" => "Inga delade kalendrar",
+"Share Calendar" => "Dela kalender",
 "Download" => "Ladda ner",
 "Edit" => "Redigera",
 "Delete" => "Radera",
+"shared with you by" => "delad med dig av",
 "New calendar" => "Nya kalender",
 "Edit calendar" => "Redigera kalender",
 "Displayname" => "Visningsnamn",
@@ -94,8 +103,15 @@
 "Cancel" => "Avbryt",
 "Edit an event" => "Redigera en händelse",
 "Export" => "Exportera",
+"Eventinfo" => "Händelseinfo",
+"Repeating" => "Repetera",
+"Alarm" => "Alarm",
+"Attendees" => "Deltagare",
+"Share" => "Dela",
 "Title of the Event" => "Rubrik för händelsen",
 "Category" => "Kategori",
+"Separate categories with commas" => "Separera kategorier med komman",
+"Edit categories" => "Redigera kategorier",
 "All Day Event" => "Hela dagen",
 "From" => "Från",
 "To" => "Till",
@@ -125,11 +141,22 @@
 "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",
+"No categories selected" => "Inga kategorier valda",
 "Select category" => "Välj kategori",
+"of" => "av",
+"at" => "på",
 "Timezone" => "Tidszon",
 "Check always for changes of the timezone" => "Kontrollera alltid ändringar i tidszon.",
 "Timeformat" => "Tidsformat",
 "24h" => "24h",
 "12h" => "12h",
-"Calendar CalDAV syncing address:" => "Synkroniseringsadress för CalDAV kalender:"
+"First day of the week" => "Första dagen av veckan",
+"Calendar CalDAV syncing address:" => "Synkroniseringsadress för CalDAV kalender:",
+"Users" => "Användare",
+"select users" => "välj användare",
+"Editable" => "Redigerbar",
+"Groups" => "Grupper",
+"select groups" => "Välj grupper",
+"make public" => "Gör offentlig"
 );
diff --git a/apps/calendar/l10n/zh_CN.php b/apps/calendar/l10n/zh_CN.php
index 129aa8d8e8..bb7e0a2872 100644
--- a/apps/calendar/l10n/zh_CN.php
+++ b/apps/calendar/l10n/zh_CN.php
@@ -6,6 +6,7 @@
 "Timezone changed" => "时区已修改",
 "Invalid request" => "非法请求",
 "Calendar" => "日历",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "生日",
 "Business" => "商务",
 "Call" => "呼叫",
@@ -104,6 +105,7 @@
 "Export" => "导出",
 "Eventinfo" => "事件信息",
 "Repeating" => "重复",
+"Alarm" => "提醒",
 "Attendees" => "参加者",
 "Share" => "共享",
 "Title of the Event" => "事件标题",
@@ -142,6 +144,8 @@
 "View an event" => "查看事件",
 "No categories selected" => "无选中分类",
 "Select category" => "选择分类",
+"of" => "在",
+"at" => "在",
 "Timezone" => "时区",
 "Check always for changes of the timezone" => "选中则总是按照时区变化",
 "Timeformat" => "时间格式",
diff --git a/apps/calendar/l10n/zh_TW.php b/apps/calendar/l10n/zh_TW.php
index b4f1d4e9b8..746594462c 100644
--- a/apps/calendar/l10n/zh_TW.php
+++ b/apps/calendar/l10n/zh_TW.php
@@ -1,9 +1,12 @@
  "沒有找到行事曆",
+"No events found." => "沒有找到活動",
 "Wrong calendar" => "錯誤日曆",
 "New Timezone:" => "新時區:",
 "Timezone changed" => "時區已變更",
 "Invalid request" => "無效請求",
 "Calendar" => "日曆",
+"MMM d[ yyyy]{ '—'[ MMM] d yyyy}" => "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
 "Birthday" => "生日",
 "Business" => "商業",
 "Call" => "呼叫",
@@ -19,6 +22,7 @@
 "Projects" => "計畫",
 "Questions" => "問題",
 "Work" => "工作",
+"unnamed" => "無名稱的",
 "Does not repeat" => "不重覆",
 "Daily" => "每日",
 "Weekly" => "每週",
@@ -29,6 +33,7 @@
 "never" => "絕不",
 "by occurrences" => "由事件",
 "by date" => "由日期",
+"by monthday" => "依月份日期",
 "by weekday" => "由平日",
 "Monday" => "週一",
 "Tuesday" => "週二",
@@ -37,6 +42,7 @@
 "Friday" => "週五",
 "Saturday" => "週六",
 "Sunday" => "週日",
+"events week of month" => "月份中活動週",
 "first" => "第一",
 "second" => "第二",
 "third" => "第三",
@@ -56,9 +62,11 @@
 "November" => "十一月",
 "December" => "十二月",
 "by events date" => "由事件日期",
+"by yearday(s)" => "依年份日期",
 "by weeknumber(s)" => "由週數",
 "by day and month" => "由日與月",
 "Date" => "日期",
+"Cal." => "行事曆",
 "All day" => "整天",
 "New Calendar" => "新日曆",
 "Missing fields" => "遺失欄位",
@@ -76,10 +84,15 @@
 "Calendars" => "日曆",
 "There was a fail, while parsing the file." => "解析檔案時失敗。",
 "Choose active calendars" => "選擇一個作用中的日曆",
+"Your calendars" => "你的行事曆",
 "CalDav Link" => "CalDav 聯結",
+"Shared calendars" => "分享的行事曆",
+"No shared calendars" => "不分享的行事曆",
+"Share Calendar" => "分享行事曆",
 "Download" => "下載",
 "Edit" => "編輯",
 "Delete" => "刪除",
+"shared with you by" => "分享給你由",
 "New calendar" => "新日曆",
 "Edit calendar" => "編輯日曆",
 "Displayname" => "顯示名稱",
@@ -90,11 +103,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" => "至",
@@ -107,8 +124,11 @@
 "Advanced" => "進階",
 "Select weekdays" => "選擇平日",
 "Select days" => "選擇日",
+"and the events day of year." => "以及年中的活動日",
+"and the events day of month." => "以及月中的活動日",
 "Select months" => "選擇月",
 "Select weeks" => "選擇週",
+"and the events week of year." => "以及年中的活動週",
 "Interval" => "間隔",
 "End" => "結束",
 "occurrences" => "事件",
@@ -121,16 +141,22 @@
 "Calendar imported successfully" => "已成功匯入日曆",
 "Close Dialog" => "關閉對話",
 "Create a new event" => "建立一個新事件",
+"View an event" => "觀看一個活動",
+"No categories selected" => "沒有選擇分類",
 "Select category" => "選擇分類",
+"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" => "可編輯",
 "Groups" => "群組",
-"select groups" => "選擇群組"
+"select groups" => "選擇群組",
+"make public" => "公開"
 );
diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php
index f0a9bf050f..cc80a0bb70 100644
--- a/apps/calendar/lib/object.php
+++ b/apps/calendar/lib/object.php
@@ -600,8 +600,8 @@ class OC_Calendar_Object{
 
 	public static function updateVCalendarFromRequest($request, $vcalendar)
 	{
-		$title = $request["title"];
-		$location = $request["location"];
+		$title = strip_tags($request["title"]);
+		$location = strip_tags($request["location"]);
 		$categories = $request["categories"];
 		$allday = isset($request["allday"]);
 		$from = $request["from"];
@@ -611,7 +611,7 @@ class OC_Calendar_Object{
 			$totime = $request['totime'];
 		}
 		$vevent = $vcalendar->VEVENT;
-		$description = $request["description"];
+		$description = strip_tags($request["description"]);
 		$repeat = $request["repeat"];
 		if($repeat != 'doesnotrepeat'){
 			$rrule = '';
diff --git a/apps/calendar/templates/part.import.php b/apps/calendar/templates/part.import.php
index e93ea1af4c..39cda29c20 100644
--- a/apps/calendar/templates/part.import.php
+++ b/apps/calendar/templates/part.import.php
@@ -2,7 +2,7 @@
 
- +

t('Please choose the calendar'); ?>

- +
@@ -58,5 +59,8 @@ OCP\Util::writeLog('contacts','templates/part.cropphoto.php: tmp_path: '.$tmp_pa
- - +t('The temporary image has been removed from cache.'); +} +?> diff --git a/apps/contacts/templates/part.import.php b/apps/contacts/templates/part.import.php index b879304299..32c8dc50dd 100644 --- a/apps/contacts/templates/part.import.php +++ b/apps/contacts/templates/part.import.php @@ -2,7 +2,7 @@
- +

t('Please choose the addressbook'); ?>

'/>(t('max. possible: '); echo $_['maxPossibleUploadSize'] ?>)
/>
diff --git a/apps/files/templates/index.php b/apps/files/templates/index.php index c0a40081fe..3bd5a1ceef 100644 --- a/apps/files/templates/index.php +++ b/apps/files/templates/index.php @@ -53,7 +53,7 @@ t( 'Size' ); ?> - t( 'Modified' ); ?>t('Delete all')?> <?php echo $l->t('Delete')?>" /> + t( 'Modified' ); ?>t('Delete')?> <?php echo $l->t('Delete')?>" /> diff --git a/apps/files_imageviewer/js/lightbox.js b/apps/files_imageviewer/js/lightbox.js index fe8b975309..69cda7a0ec 100644 --- a/apps/files_imageviewer/js/lightbox.js +++ b/apps/files_imageviewer/js/lightbox.js @@ -22,10 +22,10 @@ function viewImage(dir, file) { if(file.indexOf('.psd')>0){//can't view those return; } - var location=OC.filePath('files','ajax','download.php')+'?files='+file+'&dir='+dir; + var location=OC.filePath('files','ajax','download.php')+'?files='+encodeURIComponent(file)+'&dir='+encodeURIComponent(dir); $.fancybox({ "href": location, - "title": file, + "title": file.replace(//, ">"), "titlePosition": "inside" }); } diff --git a/apps/files_texteditor/js/editor.js b/apps/files_texteditor/js/editor.js index 9d168c1c4f..70bb74a910 100644 --- a/apps/files_texteditor/js/editor.js +++ b/apps/files_texteditor/js/editor.js @@ -67,7 +67,7 @@ function setSyntaxMode(ext){ function showControls(filename,writeperms){ // Loads the control bar at the top. // Load the new toolbar. - var editorbarhtml = '