diff --git a/README.translate b/README.translate new file mode 100644 index 000000000..2deba4388 --- /dev/null +++ b/README.translate @@ -0,0 +1,97 @@ +Friendica translations +====================== + +Translation Process +------------------- + +The strings used in the UI of Friendica is translated at Transifex [1] and then +included in the git repository at github. If you want to help with translation +for any language, be it correcting terms or translating friendica to a +currently not supported language, please register an account at transifex.com +and contact the friendica translation team there. + +Translating friendica is simple. Just use the online tool at transifex. If you +don't want to deal with git & co. that is fine, we check the status of the +translations regularly and import them into the source tree at github so that +others can use them. + +We do not include every translation from transifex in the source tree to avoid +a scattered and disturbed overall experience. As an uneducated guess we have a +lower limit of 50% translated strings before we include the language. This +limit is judging only by the amount of translated strings under the assumption +that the most prominent strings for the UI will be translated first by a +translation team. If you feel your translation useable before this limit, +please contact us and we will probably include your teams work in the source +tree. + +If you want to get your work into the source tree yourself, feel free to do so +and contact us with and question that arises. The process is simple and +friendica ships with all the tools necessary. + +The location of the translated files in the source tree is + /view/LNG-CODE/ +where LNG-CODE is the language code used, e.g. de for German or fr for French. +For the email templates (the *.tpl files) just place them into the directory +and you are done. The translated strings come as a "message.po" file from +transifex which needs to be translated into the PHP file friendica uses. To do +so, place the file in the directory mentioned above and use the "po2php" +utility from the util directory of your friendica installation. + +Assuming you want to convert the German localization which is placed in +view/de/message.po you would do the following. + + 1. Navigate at the command prompt to the base directory of your + friendica installation + + 2. Execute the po2php script, which will place the translation + in the strings.php file that is used by friendica. + + $> php util/po2php.php view/de/message.po + + The output of the script will be placed at view/de/strings.php where + froemdoca os expecting it, so you can test your translation mmediately. + + 3. Visit your friendica page to check if it still works in the language you + just translated. If not try to find the error, most likely PHP will give + you a hint in the log/warnings.about the error. + + For debugging you can also try to "run" the file with PHP. This should + not give any output if the file is ok but might give a hint for + searching the bug in the file. + + $> php view/de/strings.php + + 4. commit the two files with a meaningful commit message to your git + repository, push it to your fork of the friendica repository at github and + issue a pull request for that commit. + +Utilities +--------- + +Additional to the po2php script there are some more utilities for translation +in the "util" directory of the friendica source tree. If you only want to +translate friendica into another language you wont need any of these tools most +likely but it gives you an idea how the translation process of friendica +works. + +For further information see the utils/README file. + +Known Problems +-------------- + +Friendica uses the language setting of the visitors browser to determain the +language for the UI. Most of the time this works, but there are some known +quirks. + +One is that some browsers, like Safari, do the setting to "de-de" but friendica +only has a "de" localisation. A workaround would be to add a symbolic link +from + $friendica/view/de-de +pointing to + $friendica/view/de + +Links +----- + +[1] https://www.transifex.com/projects/p/friendica/ + diff --git a/include/conversation.php b/include/conversation.php index e659ca04d..c278ec2f1 100644 --- a/include/conversation.php +++ b/include/conversation.php @@ -684,6 +684,8 @@ function conversation(&$a, $items, $mode, $update, $preview = false) { continue; } + call_hooks('display_item', $arr); + $item['pagedrop'] = $page_dropping; if($item['id'] == $item['parent']) { diff --git a/library/fancybox/blank.gif b/library/fancybox/blank.gif deleted file mode 100644 index 35d42e808..000000000 Binary files a/library/fancybox/blank.gif and /dev/null differ diff --git a/library/fancybox/fancy_close.png b/library/fancybox/fancy_close.png deleted file mode 100644 index 07035307a..000000000 Binary files a/library/fancybox/fancy_close.png and /dev/null differ diff --git a/library/fancybox/fancy_loading.png b/library/fancybox/fancy_loading.png deleted file mode 100644 index 250301796..000000000 Binary files a/library/fancybox/fancy_loading.png and /dev/null differ diff --git a/library/fancybox/fancy_nav_left.png b/library/fancybox/fancy_nav_left.png deleted file mode 100644 index ebaa6a4fd..000000000 Binary files a/library/fancybox/fancy_nav_left.png and /dev/null differ diff --git a/library/fancybox/fancy_nav_right.png b/library/fancybox/fancy_nav_right.png deleted file mode 100644 index 873294e96..000000000 Binary files a/library/fancybox/fancy_nav_right.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_e.png b/library/fancybox/fancy_shadow_e.png deleted file mode 100644 index 2eda08936..000000000 Binary files a/library/fancybox/fancy_shadow_e.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_n.png b/library/fancybox/fancy_shadow_n.png deleted file mode 100644 index 69aa10e23..000000000 Binary files a/library/fancybox/fancy_shadow_n.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_ne.png b/library/fancybox/fancy_shadow_ne.png deleted file mode 100644 index 79f6980a3..000000000 Binary files a/library/fancybox/fancy_shadow_ne.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_nw.png b/library/fancybox/fancy_shadow_nw.png deleted file mode 100644 index 7182cd938..000000000 Binary files a/library/fancybox/fancy_shadow_nw.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_s.png b/library/fancybox/fancy_shadow_s.png deleted file mode 100644 index d8858bfb7..000000000 Binary files a/library/fancybox/fancy_shadow_s.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_se.png b/library/fancybox/fancy_shadow_se.png deleted file mode 100644 index 541e3ffd3..000000000 Binary files a/library/fancybox/fancy_shadow_se.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_sw.png b/library/fancybox/fancy_shadow_sw.png deleted file mode 100644 index b451689fa..000000000 Binary files a/library/fancybox/fancy_shadow_sw.png and /dev/null differ diff --git a/library/fancybox/fancy_shadow_w.png b/library/fancybox/fancy_shadow_w.png deleted file mode 100644 index 8a4e4a887..000000000 Binary files a/library/fancybox/fancy_shadow_w.png and /dev/null differ diff --git a/library/fancybox/fancy_title_left.png b/library/fancybox/fancy_title_left.png deleted file mode 100644 index 6049223d1..000000000 Binary files a/library/fancybox/fancy_title_left.png and /dev/null differ diff --git a/library/fancybox/fancy_title_main.png b/library/fancybox/fancy_title_main.png deleted file mode 100644 index 8044271f2..000000000 Binary files a/library/fancybox/fancy_title_main.png and /dev/null differ diff --git a/library/fancybox/fancy_title_over.png b/library/fancybox/fancy_title_over.png deleted file mode 100644 index d9f458f4b..000000000 Binary files a/library/fancybox/fancy_title_over.png and /dev/null differ diff --git a/library/fancybox/fancy_title_right.png b/library/fancybox/fancy_title_right.png deleted file mode 100644 index e36d9db2a..000000000 Binary files a/library/fancybox/fancy_title_right.png and /dev/null differ diff --git a/library/fancybox/fancybox-x.png b/library/fancybox/fancybox-x.png deleted file mode 100644 index c2130f869..000000000 Binary files a/library/fancybox/fancybox-x.png and /dev/null differ diff --git a/library/fancybox/fancybox-y.png b/library/fancybox/fancybox-y.png deleted file mode 100644 index 7ef399b99..000000000 Binary files a/library/fancybox/fancybox-y.png and /dev/null differ diff --git a/library/fancybox/fancybox.png b/library/fancybox/fancybox.png deleted file mode 100644 index 65e14f68f..000000000 Binary files a/library/fancybox/fancybox.png and /dev/null differ diff --git a/library/fancybox/fancybox_loading.gif b/library/fancybox/fancybox_loading.gif new file mode 100644 index 000000000..01586176d Binary files /dev/null and b/library/fancybox/fancybox_loading.gif differ diff --git a/library/fancybox/fancybox_overlay.png b/library/fancybox/fancybox_overlay.png new file mode 100644 index 000000000..a4391396a Binary files /dev/null and b/library/fancybox/fancybox_overlay.png differ diff --git a/library/fancybox/fancybox_sprite.png b/library/fancybox/fancybox_sprite.png new file mode 100644 index 000000000..fd8d5ca56 Binary files /dev/null and b/library/fancybox/fancybox_sprite.png differ diff --git a/library/fancybox/helpers/fancybox_buttons.png b/library/fancybox/helpers/fancybox_buttons.png new file mode 100644 index 000000000..078720727 Binary files /dev/null and b/library/fancybox/helpers/fancybox_buttons.png differ diff --git a/library/fancybox/helpers/jquery.fancybox-buttons.css b/library/fancybox/helpers/jquery.fancybox-buttons.css new file mode 100644 index 000000000..9453b464d --- /dev/null +++ b/library/fancybox/helpers/jquery.fancybox-buttons.css @@ -0,0 +1,96 @@ +#fancybox-buttons { + position: fixed; + left: 0; + width: 100%; + z-index: 8050; +} + +#fancybox-buttons.top { + top: 10px; +} + +#fancybox-buttons.bottom { + bottom: 10px; +} + +#fancybox-buttons ul { + display: block; + width: 166px; + height: 30px; + margin: 0 auto; + padding: 0; + list-style: none; + border: 1px solid #111; + border-radius: 3px; + -webkit-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + -moz-box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + box-shadow: inset 0 0 0 1px rgba(255,255,255,.05); + background: rgb(50,50,50); + background: -moz-linear-gradient(top, rgb(68,68,68) 0%, rgb(52,52,52) 50%, rgb(41,41,41) 50%, rgb(51,51,51) 100%); + background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgb(68,68,68)), color-stop(50%,rgb(52,52,52)), color-stop(50%,rgb(41,41,41)), color-stop(100%,rgb(51,51,51))); + background: -webkit-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: -o-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: -ms-linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + background: linear-gradient(top, rgb(68,68,68) 0%,rgb(52,52,52) 50%,rgb(41,41,41) 50%,rgb(51,51,51) 100%); + filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#444444', endColorstr='#222222',GradientType=0 ); +} + +#fancybox-buttons ul li { + float: left; + margin: 0; + padding: 0; +} + +#fancybox-buttons a { + display: block; + width: 30px; + height: 30px; + text-indent: -9999px; + background-image: url('fancybox_buttons.png'); + background-repeat: no-repeat; + outline: none; + opacity: 0.8; +} + +#fancybox-buttons a:hover { + opacity: 1; +} + +#fancybox-buttons a.btnPrev { + background-position: 5px 0; +} + +#fancybox-buttons a.btnNext { + background-position: -33px 0; + border-right: 1px solid #3e3e3e; +} + +#fancybox-buttons a.btnPlay { + background-position: 0 -30px; +} + +#fancybox-buttons a.btnPlayOn { + background-position: -30px -30px; +} + +#fancybox-buttons a.btnToggle { + background-position: 3px -60px; + border-left: 1px solid #111; + border-right: 1px solid #3e3e3e; + width: 35px +} + +#fancybox-buttons a.btnToggleOn { + background-position: -27px -60px; +} + +#fancybox-buttons a.btnClose { + border-left: 1px solid #111; + width: 35px; + background-position: -56px 0px; +} + +#fancybox-buttons a.btnDisabled { + opacity : 0.4; + cursor: default; +} \ No newline at end of file diff --git a/library/fancybox/helpers/jquery.fancybox-buttons.js b/library/fancybox/helpers/jquery.fancybox-buttons.js new file mode 100644 index 000000000..50baeca42 --- /dev/null +++ b/library/fancybox/helpers/jquery.fancybox-buttons.js @@ -0,0 +1,121 @@ + /*! + * Buttons helper for fancyBox + * version: 1.0.5 (Mon, 15 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * buttons: { + * position : 'top' + * } + * } + * }); + * + */ +(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.buttons = { + defaults : { + skipSingle : false, // disables if gallery contains single image + position : 'top', // 'top' or 'bottom' + tpl : '
' + }, + + list : null, + buttons: null, + + beforeLoad: function (opts, obj) { + //Remove self if gallery do not have at least two items + + if (opts.skipSingle && obj.group.length < 2) { + obj.helpers.buttons = false; + obj.closeBtn = true; + + return; + } + + //Increase top margin to give space for buttons + obj.margin[ opts.position === 'bottom' ? 2 : 0 ] += 30; + }, + + onPlayStart: function () { + if (this.buttons) { + this.buttons.play.attr('title', 'Pause slideshow').addClass('btnPlayOn'); + } + }, + + onPlayEnd: function () { + if (this.buttons) { + this.buttons.play.attr('title', 'Start slideshow').removeClass('btnPlayOn'); + } + }, + + afterShow: function (opts, obj) { + var buttons = this.buttons; + + if (!buttons) { + this.list = $(opts.tpl).addClass(opts.position).appendTo('body'); + + buttons = { + prev : this.list.find('.btnPrev').click( F.prev ), + next : this.list.find('.btnNext').click( F.next ), + play : this.list.find('.btnPlay').click( F.play ), + toggle : this.list.find('.btnToggle').click( F.toggle ) + } + } + + //Prev + if (obj.index > 0 || obj.loop) { + buttons.prev.removeClass('btnDisabled'); + } else { + buttons.prev.addClass('btnDisabled'); + } + + //Next / Play + if (obj.loop || obj.index < obj.group.length - 1) { + buttons.next.removeClass('btnDisabled'); + buttons.play.removeClass('btnDisabled'); + + } else { + buttons.next.addClass('btnDisabled'); + buttons.play.addClass('btnDisabled'); + } + + this.buttons = buttons; + + this.onUpdate(opts, obj); + }, + + onUpdate: function (opts, obj) { + var toggle; + + if (!this.buttons) { + return; + } + + toggle = this.buttons.toggle.removeClass('btnDisabled btnToggleOn'); + + //Size toggle button + if (obj.canShrink) { + toggle.addClass('btnToggleOn'); + + } else if (!obj.canExpand) { + toggle.addClass('btnDisabled'); + } + }, + + beforeClose: function () { + if (this.list) { + this.list.remove(); + } + + this.list = null; + this.buttons = null; + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/library/fancybox/helpers/jquery.fancybox-media.js b/library/fancybox/helpers/jquery.fancybox-media.js new file mode 100644 index 000000000..4b5e78356 --- /dev/null +++ b/library/fancybox/helpers/jquery.fancybox-media.js @@ -0,0 +1,196 @@ +/*! + * Media helper for fancyBox + * version: 1.0.5 (Tue, 23 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * media: true + * } + * }); + * + * Set custom URL parameters: + * $(".fancybox").fancybox({ + * helpers : { + * media: { + * youtube : { + * params : { + * autoplay : 0 + * } + * } + * } + * } + * }); + * + * Or: + * $(".fancybox").fancybox({, + * helpers : { + * media: true + * }, + * youtube : { + * autoplay: 0 + * } + * }); + * + * Supports: + * + * Youtube + * http://www.youtube.com/watch?v=opj24KnzrWo + * http://www.youtube.com/embed/opj24KnzrWo + * http://youtu.be/opj24KnzrWo + * Vimeo + * http://vimeo.com/40648169 + * http://vimeo.com/channels/staffpicks/38843628 + * http://vimeo.com/groups/surrealism/videos/36516384 + * http://player.vimeo.com/video/45074303 + * Metacafe + * http://www.metacafe.com/watch/7635964/dr_seuss_the_lorax_movie_trailer/ + * http://www.metacafe.com/watch/7635964/ + * Dailymotion + * http://www.dailymotion.com/video/xoytqh_dr-seuss-the-lorax-premiere_people + * Twitvid + * http://twitvid.com/QY7MD + * Twitpic + * http://twitpic.com/7p93st + * Instagram + * http://instagr.am/p/IejkuUGxQn/ + * http://instagram.com/p/IejkuUGxQn/ + * Google maps + * http://maps.google.com/maps?q=Eiffel+Tower,+Avenue+Gustave+Eiffel,+Paris,+France&t=h&z=17 + * http://maps.google.com/?ll=48.857995,2.294297&spn=0.007666,0.021136&t=m&z=16 + * http://maps.google.com/?ll=48.859463,2.292626&spn=0.000965,0.002642&t=m&z=19&layer=c&cbll=48.859524,2.292532&panoid=YJ0lq28OOy3VT2IqIuVY0g&cbp=12,151.58,,0,-15.56 + */ +(function ($) { + "use strict"; + + //Shortcut for fancyBox object + var F = $.fancybox, + format = function( url, rez, params ) { + params = params || ''; + + if ( $.type( params ) === "object" ) { + params = $.param(params, true); + } + + $.each(rez, function(key, value) { + url = url.replace( '$' + key, value || '' ); + }); + + if (params.length) { + url += ( url.indexOf('?') > 0 ? '&' : '?' ) + params; + } + + return url; + }; + + //Add helper object + F.helpers.media = { + defaults : { + youtube : { + matcher : /(youtube\.com|youtu\.be)\/(watch\?v=|v\/|u\/|embed\/?)?(videoseries\?list=(.*)|[\w-]{11}|\?listType=(.*)&list=(.*)).*/i, + params : { + autoplay : 1, + autohide : 1, + fs : 1, + rel : 0, + hd : 1, + wmode : 'opaque', + enablejsapi : 1 + }, + type : 'iframe', + url : '//www.youtube.com/embed/$3' + }, + vimeo : { + matcher : /(?:vimeo(?:pro)?.com)\/(?:[^\d]+)?(\d+)(?:.*)/, + params : { + autoplay : 1, + hd : 1, + show_title : 1, + show_byline : 1, + show_portrait : 0, + fullscreen : 1 + }, + type : 'iframe', + url : '//player.vimeo.com/video/$1' + }, + metacafe : { + matcher : /metacafe.com\/(?:watch|fplayer)\/([\w\-]{1,10})/, + params : { + autoPlay : 'yes' + }, + type : 'swf', + url : function( rez, params, obj ) { + obj.swf.flashVars = 'playerVars=' + $.param( params, true ); + + return '//www.metacafe.com/fplayer/' + rez[1] + '/.swf'; + } + }, + dailymotion : { + matcher : /dailymotion.com\/video\/(.*)\/?(.*)/, + params : { + additionalInfos : 0, + autoStart : 1 + }, + type : 'swf', + url : '//www.dailymotion.com/swf/video/$1' + }, + twitvid : { + matcher : /twitvid\.com\/([a-zA-Z0-9_\-\?\=]+)/i, + params : { + autoplay : 0 + }, + type : 'iframe', + url : '//www.twitvid.com/embed.php?guid=$1' + }, + twitpic : { + matcher : /twitpic\.com\/(?!(?:place|photos|events)\/)([a-zA-Z0-9\?\=\-]+)/i, + type : 'image', + url : '//twitpic.com/show/full/$1/' + }, + instagram : { + matcher : /(instagr\.am|instagram\.com)\/p\/([a-zA-Z0-9_\-]+)\/?/i, + type : 'image', + url : '//$1/p/$2/media/' + }, + google_maps : { + matcher : /maps\.google\.([a-z]{2,3}(\.[a-z]{2})?)\/(\?ll=|maps\?)(.*)/i, + type : 'iframe', + url : function( rez ) { + return '//maps.google.' + rez[1] + '/' + rez[3] + '' + rez[4] + '&output=' + (rez[4].indexOf('layer=c') > 0 ? 'svembed' : 'embed'); + } + } + }, + + beforeLoad : function(opts, obj) { + var url = obj.href || '', + type = false, + what, + item, + rez, + params; + + for (what in opts) { + item = opts[ what ]; + rez = url.match( item.matcher ); + + if (rez) { + type = item.type; + params = $.extend(true, {}, item.params, obj[ what ] || ($.isPlainObject(opts[ what ]) ? opts[ what ].params : null)); + + url = $.type( item.url ) === "function" ? item.url.call( this, rez, params, obj ) : format( item.url, rez, params ); + + break; + } + } + + if (type) { + obj.href = url; + obj.type = type; + + obj.autoHeight = false; + } + } + }; + +}(jQuery)); \ No newline at end of file diff --git a/library/fancybox/helpers/jquery.fancybox-thumbs.css b/library/fancybox/helpers/jquery.fancybox-thumbs.css new file mode 100644 index 000000000..e40ae820b --- /dev/null +++ b/library/fancybox/helpers/jquery.fancybox-thumbs.css @@ -0,0 +1,54 @@ +#fancybox-thumbs { + position: fixed; + left: 0; + width: 100%; + overflow: hidden; + z-index: 8050; +} + +#fancybox-thumbs.bottom { + bottom: 2px; +} + +#fancybox-thumbs.top { + top: 2px; +} + +#fancybox-thumbs ul { + position: relative; + list-style: none; + margin: 0; + padding: 0; +} + +#fancybox-thumbs ul li { + float: left; + padding: 1px; + opacity: 0.5; +} + +#fancybox-thumbs ul li.active { + opacity: 0.75; + padding: 0; + border: 1px solid #fff; +} + +#fancybox-thumbs ul li:hover { + opacity: 1; +} + +#fancybox-thumbs ul li a { + display: block; + position: relative; + overflow: hidden; + border: 1px solid #222; + background: #111; + outline: none; +} + +#fancybox-thumbs ul li img { + display: block; + position: relative; + border: 0; + padding: 0; +} \ No newline at end of file diff --git a/library/fancybox/helpers/jquery.fancybox-thumbs.js b/library/fancybox/helpers/jquery.fancybox-thumbs.js new file mode 100644 index 000000000..5db3d4ac2 --- /dev/null +++ b/library/fancybox/helpers/jquery.fancybox-thumbs.js @@ -0,0 +1,162 @@ + /*! + * Thumbnail helper for fancyBox + * version: 1.0.7 (Mon, 01 Oct 2012) + * @requires fancyBox v2.0 or later + * + * Usage: + * $(".fancybox").fancybox({ + * helpers : { + * thumbs: { + * width : 50, + * height : 50 + * } + * } + * }); + * + */ +(function ($) { + //Shortcut for fancyBox object + var F = $.fancybox; + + //Add helper object + F.helpers.thumbs = { + defaults : { + width : 50, // thumbnail width + height : 50, // thumbnail height + position : 'bottom', // 'top' or 'bottom' + source : function ( item ) { // function to obtain the URL of the thumbnail image + var href; + + if (item.element) { + href = $(item.element).find('img').attr('src'); + } + + if (!href && item.type === 'image' && item.href) { + href = item.href; + } + + return href; + } + }, + + wrap : null, + list : null, + width : 0, + + init: function (opts, obj) { + var that = this, + list, + thumbWidth = opts.width, + thumbHeight = opts.height, + thumbSource = opts.source; + + //Build list structure + list = ''; + + for (var n = 0; n < obj.group.length; n++) { + list += 'The requested content cannot be loaded.
Please try again later.
' + title + ' |
The requested content cannot be loaded.
Please try again later.
'+s+' |
The requested content cannot be loaded.
Please try again later.
The requested content cannot be loaded.
Please try again later.