Update bonanza

This commit is contained in:
nikolark committed 2014-11-20 21:01:19 +01:00
1 parent cb55845271
commit b6ff45d1b4
146 files changed
+15771 -14876

No files matched your search

+1 -1
View File
@@ -9,7 +9,7 @@
<body>
<h1 id="logo">
<a href="https://wordpress.org/"><img alt="WordPress" src="wp-admin/images/wordpress-logo.png" /></a>
<br /> Version 4.0
<br /> Version 4.0.1
</h1>
<p style="text-align: center">Semantic Personal Publishing Platform</p>
+8
View File
@@ -41,6 +41,14 @@ include( ABSPATH . 'wp-admin/admin-header.php' );
</a>
</h2>
<div class="changelog point-releases">
<h3><?php echo _n( 'Maintenance and Security Release', 'Maintenance and Security Releases', 1 ); ?></h3>
<p><?php printf( _n( '<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bug.',
'<strong>Version %1$s</strong> addressed some security issues and fixed %2$s bugs.', 23 ), '4.0.1', number_format_i18n( 23 ) ); ?>
<?php printf( __( 'For more information, see <a href="%s">the release notes</a>.' ), 'http://codex.wordpress.org/Version_4.0.1' ); ?>
</p>
</div>
<div class="changelog">
<div class="about-overview">
<?php if ( ( $locale = get_locale() ) && 'en_' === substr( $locale, 0, 3 ) ) : ?>
@@ -273,7 +273,9 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
return;
}
if ( 'top' == $which ) { ?>
if ( 'top' == $which ) {
wp_referer_field();
?>
<div class="tablenav top">
<div class="alignleft actions">
<?php
+6
View File
@@ -401,6 +401,12 @@ function wp_read_image_metadata( $file ) {
}
}
foreach ( $meta as &$value ) {
if ( is_string( $value ) ) {
$value = wp_kses_post( $value );
}
}
/**
* Filter the array of meta data read from an image's exif data.
*
+8 -3
View File
@@ -235,10 +235,15 @@ function install_plugins_favorites_form() {
function display_plugins_table() {
global $wp_list_table;
if ( current_filter() == 'install_plugins_favorites' && empty( $_GET['user'] ) && ! get_user_option( 'wporg_favorites' ) )
return;
if ( current_filter() == 'install_plugins_favorites' && empty( $_GET['user'] ) && ! get_user_option( 'wporg_favorites' ) ) {
return;
}
$wp_list_table->display();
?>
<form id="plugin-filter" action="" method="post">
<?php $wp_list_table->display(); ?>
</form>
<?php
}
add_action( 'install_plugins_search', 'display_plugins_table' );
add_action( 'install_plugins_popular', 'display_plugins_table' );
+11 -5
View File
@@ -1205,12 +1205,18 @@ function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
$return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button button-small" target="_blank">' . __('Change Permalinks') . "</a></span>\n";
}
} else {
if ( function_exists( 'mb_strlen' ) && mb_strlen( $post_name ) > 30 ) {
$post_name_abridged = mb_substr( $post_name, 0, 14 ) . '&hellip;' . mb_substr( $post_name, -14 );
} elseif ( strlen( $post_name ) > 30 ) {
$post_name_abridged = substr( $post_name, 0, 14 ) . '&hellip;' . substr( $post_name, -14 );
if ( function_exists( 'mb_strlen' ) ) {
if ( mb_strlen( $post_name ) > 30 ) {
$post_name_abridged = mb_substr( $post_name, 0, 14 ) . '&hellip;' . mb_substr( $post_name, -14 );
} else {
$post_name_abridged = $post_name;
}
} else {
$post_name_abridged = $post_name;
if ( strlen( $post_name ) > 30 ) {
$post_name_abridged = substr( $post_name, 0, 14 ) . '&hellip;' . substr( $post_name, -14 );
} else {
$post_name_abridged = $post_name;
}
}
$post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>';
+20 -1
View File
@@ -2,7 +2,7 @@
window.wp = window.wp || {};
jQuery( document ).ready( function($) {
jQuery( document ).ready( function( $ ) {
var $window = $( window ),
$document = $( document ),
$adminBar = $( '#wpadminbar' ),
@@ -148,6 +148,11 @@ jQuery( document ).ready( function($) {
// We need to wait for TinyMCE to initialize.
$document.on( 'tinymce-editor-init.editor-expand', function( event, editor ) {
var hideFloatPanels = _.debounce( function() {
! $( '.mce-floatpanel:hover' ).length && tinymce.ui.FloatPanel.hideAll();
$( '.mce-tooltip' ).hide();
}, 1000, true );
// Make sure it's the main editor.
if ( editor.id !== 'content' ) {
return;
@@ -224,6 +229,8 @@ jQuery( document ).ready( function($) {
// Adjust when switching editor modes.
function mceShow() {
$window.on( 'scroll.mce-float-panels', hideFloatPanels );
setTimeout( function() {
editor.execCommand( 'wpAutoResize' );
adjust();
@@ -231,6 +238,8 @@ jQuery( document ).ready( function($) {
}
function mceHide() {
$window.off( 'scroll.mce-float-panels' );
setTimeout( function() {
var top = $contentWrap.offset().top;
@@ -251,6 +260,8 @@ jQuery( document ).ready( function($) {
editor.on( 'hide', mceHide );
// Adjust when the editor resizes.
editor.on( 'setcontent wp-autoresize wp-toolbar-toggle', adjust );
$window.off( 'scroll.mce-float-panels' ).on( 'scroll.mce-float-panels', hideFloatPanels );
};
mceUnbind = function() {
@@ -258,6 +269,8 @@ jQuery( document ).ready( function($) {
editor.off( 'show', mceShow );
editor.off( 'hide', mceHide );
editor.off( 'setcontent wp-autoresize wp-toolbar-toggle', adjust );
$window.off( 'scroll.mce-float-panels' );
};
if ( $wrap.hasClass( 'wp-editor-expand' ) ) {
@@ -590,6 +603,12 @@ jQuery( document ).ready( function($) {
}
adjust();
}).on( 'wp-window-resized.editor-expand', function() {
if ( mceEditor && ! mceEditor.isHidden() ) {
mceEditor.execCommand( 'wpAutoResize' );
} else {
textEditorResize();
}
});
$textEditor.on( 'focus.editor-expand input.editor-expand propertychange.editor-expand', textEditorResize );
+1 -1
View File
@@ -1 +1 @@
window.wp=window.wp||{},jQuery(document).ready(function(a){function b(){var a=m.width();R={windowHeight:m.height(),windowWidth:a,adminBarHeight:a>600?o.outerHeight():0,toolsHeight:s.outerHeight()||0,menuBarHeight:z.outerHeight()||0,visualTopHeight:t.outerHeight()||0,textTopHeight:v.outerHeight()||0,bottomHeight:y.outerHeight()||0,statusBarHeight:A.outerHeight()||0,sideSortablesHeight:B.height()||0},R.menuBarHeight<3&&(R.menuBarHeight=0)}function c(a){var b,c,d,e,f,g=jQuery.ui.keyCode,h=a.keyCode,i=document.createRange(),j=w[0].selectionStart,k=w[0].selectionEnd,l=x[0].firstChild,m=10;if(!j||!k||j===k){try{i.setStart(l,j),i.setEnd(l,k+1)}catch(n){}b=i.getBoundingClientRect(),b.height&&(c=b.top-m,d=c+b.height+m,e=R.adminBarHeight+R.toolsHeight+R.textTopHeight,f=R.windowHeight-R.bottomHeight,e>c&&(h===g.UP||h===g.LEFT||h===g.BACKSPACE)?window.scrollTo(window.pageXOffset,c+window.pageYOffset-e):d>f&&window.scrollTo(window.pageXOffset,d+window.pageYOffset-f))}}function d(){if(!(k&&!k.isHidden()||!k&&"tinymce"===Q)){var a,b=w.height();x.width(w.width()-22),x.text(w.val()+"&nbsp;"),a=x.height(),P>a&&(a=P),a!==b&&(w.height(a),e())}}function e(a){if(!E||!E.settings.visible){var c,e,f,g,h,i,j,l,o,q=m.scrollTop(),F="scroll"!==a,G=k&&!k.isHidden(),M=P,Q=D.offset().top,S=1,T=r.width();(F||!R.windowHeight)&&b(),G||"resize"!==a||d(),G?(c=t,e=u,j=R.visualTopHeight):(c=v,e=w,j=R.textTopHeight),i=c.parent().offset().top,l=e.offset().top,o=e.outerHeight(),h=G?P+j:P+20,h=o>h+5,h?((!H||F)&&q>=i-R.toolsHeight-R.adminBarHeight&&q<=i-R.toolsHeight-R.adminBarHeight+o-M?(H=!0,s.css({position:"fixed",top:R.adminBarHeight,width:T}),G&&z.length&&z.css({position:"fixed",top:R.adminBarHeight+R.toolsHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())}),c.css({position:"fixed",top:R.adminBarHeight+R.toolsHeight+R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())})):(H||F)&&(q<=i-R.toolsHeight-R.adminBarHeight?(H=!1,s.css({position:"absolute",top:0,width:T}),G&&z.length&&z.css({position:"absolute",top:0,width:T-2*S}),c.css({position:"absolute",top:R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())})):q>=i-R.toolsHeight-R.adminBarHeight+o-M&&(H=!1,s.css({position:"absolute",top:o-M,width:T}),G&&z.length&&z.css({position:"absolute",top:o-M,width:T-2*S}),c.css({position:"absolute",top:o-M+R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())}))),(!I||F)&&q+R.windowHeight<=l+o+R.bottomHeight+R.statusBarHeight+S?(I=!0,A.css({position:"fixed",bottom:R.bottomHeight,width:T-2*S}),y.css({position:"fixed",bottom:0,width:T})):(I||F)&&q+R.windowHeight>l+o+R.bottomHeight+R.statusBarHeight-S&&(I=!1,A.add(y).attr("style",""))):F&&(s.css({position:"absolute",top:0,width:T}),G&&z.length&&z.css({position:"absolute",top:0,width:T-2*S}),c.css({position:"absolute",top:R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())}),A.add(y).attr("style","")),C.width()<300&&R.windowWidth>600&&n.height()>B.height()+Q+120&&R.windowHeight<o?(R.sideSortablesHeight+N+O>R.windowHeight||J||K?Q>=q+N?(B.attr("style",""),J=K=!1):q>L?J?(J=!1,f=B.offset().top-R.adminBarHeight,g=p.offset().top,g<f+R.sideSortablesHeight+O&&(f=g-R.sideSortablesHeight-12),B.css({position:"absolute",top:f,bottom:""})):!K&&R.sideSortablesHeight+B.offset().top+O<q+R.windowHeight&&(K=!0,B.css({position:"fixed",top:"auto",bottom:O})):L>q&&(K?(K=!1,f=B.offset().top-O,g=p.offset().top,g<f+R.sideSortablesHeight+O&&(f=g-R.sideSortablesHeight-12),B.css({position:"absolute",top:f,bottom:""})):!J&&B.offset().top>=q+N&&(J=!0,B.css({position:"fixed",top:N,bottom:""}))):(q>=Q-N?B.css({position:"fixed",top:N}):B.attr("style",""),J=K=!1),L=q):(B.attr("style",""),J=K=!1),F&&(r.css({paddingTop:R.toolsHeight}),G?u.css({paddingTop:R.visualTopHeight+R.menuBarHeight}):(w.css({marginTop:R.textTopHeight}),x.width(T-20-2*S)))}}function f(){d(),e()}function g(a){for(var b=1;6>b;b++)setTimeout(a,500*b)}function h(){clearTimeout(l),l=setTimeout(e,100)}function i(){window.pageYOffset&&window.pageYOffset>M&&window.scrollTo(window.pageXOffset,0),q.addClass("wp-editor-expand"),m.on("scroll.editor-expand resize.editor-expand",function(a){e(a.type),h()}),n.on("wp-collapse-menu.editor-expand postboxes-columnchange.editor-expand editor-classchange.editor-expand",e).on("postbox-toggled.editor-expand",function(){!J&&!K&&window.pageYOffset>N&&(K=!0,window.scrollBy(0,-1),e(),window.scrollBy(0,1)),e()}),w.on("focus.editor-expand input.editor-expand propertychange.editor-expand",d),w.on("keyup.editor-expand",c),F(),E&&E.pubsub.subscribe("hidden",f),k&&(k.settings.wp_autoresize_on=!0,k.execCommand("wpAutoResizeOn"),k.isHidden()||k.execCommand("wpAutoResize")),(!k||k.isHidden())&&d(),e()}function j(){var b=window.getUserSetting("ed_size");window.pageYOffset&&window.pageYOffset>M&&window.scrollTo(window.pageXOffset,0),q.removeClass("wp-editor-expand"),m.off(".editor-expand"),n.off(".editor-expand"),w.off(".editor-expand"),G(),E&&E.pubsub.unsubscribe("hidden",f),a.each([t,v,s,z,y,A,r,u,w,B],function(a,b){b&&b.attr("style","")Line truncated
window.wp=window.wp||{},jQuery(document).ready(function(a){function b(){var a=m.width();R={windowHeight:m.height(),windowWidth:a,adminBarHeight:a>600?o.outerHeight():0,toolsHeight:s.outerHeight()||0,menuBarHeight:z.outerHeight()||0,visualTopHeight:t.outerHeight()||0,textTopHeight:v.outerHeight()||0,bottomHeight:y.outerHeight()||0,statusBarHeight:A.outerHeight()||0,sideSortablesHeight:B.height()||0},R.menuBarHeight<3&&(R.menuBarHeight=0)}function c(a){var b,c,d,e,f,g=jQuery.ui.keyCode,h=a.keyCode,i=document.createRange(),j=w[0].selectionStart,k=w[0].selectionEnd,l=x[0].firstChild,m=10;if(!j||!k||j===k){try{i.setStart(l,j),i.setEnd(l,k+1)}catch(n){}b=i.getBoundingClientRect(),b.height&&(c=b.top-m,d=c+b.height+m,e=R.adminBarHeight+R.toolsHeight+R.textTopHeight,f=R.windowHeight-R.bottomHeight,e>c&&(h===g.UP||h===g.LEFT||h===g.BACKSPACE)?window.scrollTo(window.pageXOffset,c+window.pageYOffset-e):d>f&&window.scrollTo(window.pageXOffset,d+window.pageYOffset-f))}}function d(){if(!(k&&!k.isHidden()||!k&&"tinymce"===Q)){var a,b=w.height();x.width(w.width()-22),x.text(w.val()+"&nbsp;"),a=x.height(),P>a&&(a=P),a!==b&&(w.height(a),e())}}function e(a){if(!E||!E.settings.visible){var c,e,f,g,h,i,j,l,o,q=m.scrollTop(),F="scroll"!==a,G=k&&!k.isHidden(),M=P,Q=D.offset().top,S=1,T=r.width();(F||!R.windowHeight)&&b(),G||"resize"!==a||d(),G?(c=t,e=u,j=R.visualTopHeight):(c=v,e=w,j=R.textTopHeight),i=c.parent().offset().top,l=e.offset().top,o=e.outerHeight(),h=G?P+j:P+20,h=o>h+5,h?((!H||F)&&q>=i-R.toolsHeight-R.adminBarHeight&&q<=i-R.toolsHeight-R.adminBarHeight+o-M?(H=!0,s.css({position:"fixed",top:R.adminBarHeight,width:T}),G&&z.length&&z.css({position:"fixed",top:R.adminBarHeight+R.toolsHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())}),c.css({position:"fixed",top:R.adminBarHeight+R.toolsHeight+R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())})):(H||F)&&(q<=i-R.toolsHeight-R.adminBarHeight?(H=!1,s.css({position:"absolute",top:0,width:T}),G&&z.length&&z.css({position:"absolute",top:0,width:T-2*S}),c.css({position:"absolute",top:R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())})):q>=i-R.toolsHeight-R.adminBarHeight+o-M&&(H=!1,s.css({position:"absolute",top:o-M,width:T}),G&&z.length&&z.css({position:"absolute",top:o-M,width:T-2*S}),c.css({position:"absolute",top:o-M+R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())}))),(!I||F)&&q+R.windowHeight<=l+o+R.bottomHeight+R.statusBarHeight+S?(I=!0,A.css({position:"fixed",bottom:R.bottomHeight,width:T-2*S}),y.css({position:"fixed",bottom:0,width:T})):(I||F)&&q+R.windowHeight>l+o+R.bottomHeight+R.statusBarHeight-S&&(I=!1,A.add(y).attr("style",""))):F&&(s.css({position:"absolute",top:0,width:T}),G&&z.length&&z.css({position:"absolute",top:0,width:T-2*S}),c.css({position:"absolute",top:R.menuBarHeight,width:T-2*S-(G?0:c.outerWidth()-c.width())}),A.add(y).attr("style","")),C.width()<300&&R.windowWidth>600&&n.height()>B.height()+Q+120&&R.windowHeight<o?(R.sideSortablesHeight+N+O>R.windowHeight||J||K?Q>=q+N?(B.attr("style",""),J=K=!1):q>L?J?(J=!1,f=B.offset().top-R.adminBarHeight,g=p.offset().top,g<f+R.sideSortablesHeight+O&&(f=g-R.sideSortablesHeight-12),B.css({position:"absolute",top:f,bottom:""})):!K&&R.sideSortablesHeight+B.offset().top+O<q+R.windowHeight&&(K=!0,B.css({position:"fixed",top:"auto",bottom:O})):L>q&&(K?(K=!1,f=B.offset().top-O,g=p.offset().top,g<f+R.sideSortablesHeight+O&&(f=g-R.sideSortablesHeight-12),B.css({position:"absolute",top:f,bottom:""})):!J&&B.offset().top>=q+N&&(J=!0,B.css({position:"fixed",top:N,bottom:""}))):(q>=Q-N?B.css({position:"fixed",top:N}):B.attr("style",""),J=K=!1),L=q):(B.attr("style",""),J=K=!1),F&&(r.css({paddingTop:R.toolsHeight}),G?u.css({paddingTop:R.visualTopHeight+R.menuBarHeight}):(w.css({marginTop:R.textTopHeight}),x.width(T-20-2*S)))}}function f(){d(),e()}function g(a){for(var b=1;6>b;b++)setTimeout(a,500*b)}function h(){clearTimeout(l),l=setTimeout(e,100)}function i(){window.pageYOffset&&window.pageYOffset>M&&window.scrollTo(window.pageXOffset,0),q.addClass("wp-editor-expand"),m.on("scroll.editor-expand resize.editor-expand",function(a){e(a.type),h()}),n.on("wp-collapse-menu.editor-expand postboxes-columnchange.editor-expand editor-classchange.editor-expand",e).on("postbox-toggled.editor-expand",function(){!J&&!K&&window.pageYOffset>N&&(K=!0,window.scrollBy(0,-1),e(),window.scrollBy(0,1)),e()}).on("wp-window-resized.editor-expand",function(){k&&!k.isHidden()?k.execCommand("wpAutoResize"):d()}),w.on("focus.editor-expand input.editor-expand propertychange.editor-expand",d),w.on("keyup.editor-expand",c),F(),E&&E.pubsub.subscribe("hidden",f),k&&(k.settings.wp_autoresize_on=!0,k.execCommand("wpAutoResizeOn"),k.isHidden()||k.execCommand("wpAutoResize")),(!k||k.isHidden())&&d(),e()}function j(){var b=window.getUserSetting("ed_size");window.pageYOffset&&window.pageYOffset>M&&window.scrollTo(window.pageXOffset,0),q.removeClass("wp-editor-expand"),m.off(".editor-expand"),n.off(".editor-expand"),w.off(".editor-expand"),G()Line truncated
+8 -4
View File
@@ -72,11 +72,15 @@ var findPosts;
};
$( document ).ready( function() {
var $mediaGridWrap = $( '#wp-media-grid' );
// Open up a manage media frame into the grid.
wp.media && wp.media({
frame: 'manage',
container: $('#wpbody-content > .wrap')
}).open();
if ( $mediaGridWrap.length && window.wp && window.wp.media ) {
window.wp.media({
frame: 'manage',
container: $mediaGridWrap
}).open();
}
$( '#find-posts-submit' ).click( function( event ) {
if ( ! $( '#find-posts-response input[type="radio"]:checked' ).length )
+1 -1
View File
@@ -1 +1 @@
var findPosts;!function(a){findPosts={open:function(b,c){var d=a(".ui-find-overlay");return 0===d.length&&(a("body").append('<div class="ui-find-overlay"></div>'),findPosts.overlay()),d.show(),b&&c&&a("#affected").attr("name",b).val(c),a("#find-posts").show(),a("#find-posts-input").focus().keyup(function(a){27==a.which&&findPosts.close()}),findPosts.send(),!1},close:function(){a("#find-posts-response").html(""),a("#find-posts").hide(),a(".ui-find-overlay").hide()},overlay:function(){a(".ui-find-overlay").on("click",function(){findPosts.close()})},send:function(){var b={ps:a("#find-posts-input").val(),action:"find_posts",_ajax_nonce:a("#_ajax_nonce").val()},c=a(".find-box-search .spinner");c.show(),a.ajax(ajaxurl,{type:"POST",data:b,dataType:"json"}).always(function(){c.hide()}).done(function(b){b.success||a("#find-posts-response").text(attachMediaBoxL10n.error),a("#find-posts-response").html(b.data)}).fail(function(){a("#find-posts-response").text(attachMediaBoxL10n.error)})}},a(document).ready(function(){wp.media&&wp.media({frame:"manage",container:a("#wpbody-content > .wrap")}).open(),a("#find-posts-submit").click(function(b){a('#find-posts-response input[type="radio"]:checked').length||b.preventDefault()}),a("#find-posts .find-box-search :input").keypress(function(a){return 13==a.which?(findPosts.send(),!1):void 0}),a("#find-posts-search").click(findPosts.send),a("#find-posts-close").click(findPosts.close),a("#doaction, #doaction2").click(function(b){a('select[name^="action"]').each(function(){"attach"===a(this).val()&&(b.preventDefault(),findPosts.open())})}),a(".find-box-inside").on("click","tr",function(){a(this).find(".found-radio input").prop("checked",!0)})})}(jQuery);
var findPosts;!function(a){findPosts={open:function(b,c){var d=a(".ui-find-overlay");return 0===d.length&&(a("body").append('<div class="ui-find-overlay"></div>'),findPosts.overlay()),d.show(),b&&c&&a("#affected").attr("name",b).val(c),a("#find-posts").show(),a("#find-posts-input").focus().keyup(function(a){27==a.which&&findPosts.close()}),findPosts.send(),!1},close:function(){a("#find-posts-response").html(""),a("#find-posts").hide(),a(".ui-find-overlay").hide()},overlay:function(){a(".ui-find-overlay").on("click",function(){findPosts.close()})},send:function(){var b={ps:a("#find-posts-input").val(),action:"find_posts",_ajax_nonce:a("#_ajax_nonce").val()},c=a(".find-box-search .spinner");c.show(),a.ajax(ajaxurl,{type:"POST",data:b,dataType:"json"}).always(function(){c.hide()}).done(function(b){b.success||a("#find-posts-response").text(attachMediaBoxL10n.error),a("#find-posts-response").html(b.data)}).fail(function(){a("#find-posts-response").text(attachMediaBoxL10n.error)})}},a(document).ready(function(){var b=a("#wp-media-grid");b.length&&window.wp&&window.wp.media&&window.wp.media({frame:"manage",container:b}).open(),a("#find-posts-submit").click(function(b){a('#find-posts-response input[type="radio"]:checked').length||b.preventDefault()}),a("#find-posts .find-box-search :input").keypress(function(a){return 13==a.which?(findPosts.send(),!1):void 0}),a("#find-posts-search").click(findPosts.send),a("#find-posts-close").click(findPosts.close),a("#doaction, #doaction2").click(function(b){a('select[name^="action"]').each(function(){"attach"===a(this).val()&&(b.preventDefault(),findPosts.open())})}),a(".find-box-inside").on("click","tr",function(){a(this).find(".found-radio input").prop("checked",!0)})})}(jQuery);
+19
View File
@@ -24,8 +24,27 @@ if ( is_multisite() && ! is_network_admin() ) {
$wp_list_table = _get_list_table('WP_Plugin_Install_List_Table');
$pagenum = $wp_list_table->get_pagenum();
if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) {
$location = remove_query_arg( '_wp_http_referer', wp_unslash( $_SERVER['REQUEST_URI'] ) );
if ( ! empty( $_REQUEST['paged'] ) ) {
$location = add_query_arg( 'paged', (int) $_REQUEST['paged'], $location );
}
wp_redirect( $location );
exit;
}
$wp_list_table->prepare_items();
$total_pages = $wp_list_table->get_pagination_arg( 'total_pages' );
if ( $pagenum > $total_pages && $total_pages > 0 ) {
wp_redirect( add_query_arg( 'paged', $total_pages ) );
exit;
}
$title = __( 'Add Plugins' );
$parent_file = 'plugins.php';
+1 -1
View File
@@ -63,7 +63,7 @@ function press_it() {
// Error handling for media_sideload.
if ( is_wp_error($upload) ) {
wp_delete_post($post_ID);
wp_die($upload);
wp_die( esc_html( $upload->get_error_message() ) );
} else {
// Post formats.
if ( isset( $_POST['post_format'] ) ) {
+1 -1
View File
@@ -57,7 +57,7 @@ if ( 'grid' === $mode ) {
require_once( ABSPATH . 'wp-admin/admin-header.php' );
?>
<div class="wrap">
<div class="wrap" id="wp-media-grid">
<h2>
<?php
echo esc_html( $title );
+2 -2
View File
@@ -6,7 +6,7 @@
Plugin Name: Akismet
Plugin URI: http://akismet.com/
Description: Used by millions, Akismet is quite possibly the best way in the world to <strong>protect your blog from comment and trackback spam</strong>. It keeps your site protected from spam even while you sleep. To get started: 1) Click the "Activate" link to the left of this description, 2) <a href="http://akismet.com/get/">Sign up for an Akismet API key</a>, and 3) Go to your Akismet configuration page, and save your API key.
Version: 3.0.2
Version: 3.0.3
Author: Automattic
Author URI: http://automattic.com/wordpress-plugins/
License: GPLv2 or later
@@ -35,7 +35,7 @@ if ( !function_exists( 'add_action' ) ) {
exit;
}
define( 'AKISMET_VERSION', '3.0.2' );
define( 'AKISMET_VERSION', '3.0.3' );
define( 'AKISMET__MINIMUM_WP_VERSION', '3.1' );
define( 'AKISMET__PLUGIN_URL', plugin_dir_url( __FILE__ ) );
define( 'AKISMET__PLUGIN_DIR', plugin_dir_path( __FILE__ ) );
@@ -327,6 +327,10 @@ class Akismet_Admin {
if ( 'approved' == $comment_status )
return;
if ( 'spam' == $comment_status ) {
return;
}
if ( function_exists('plugins_url') )
$link = add_query_arg( array( 'action' => 'akismet_recheck_queue' ), admin_url( 'admin.php' ) );
else
+30 -4
View File
@@ -256,13 +256,31 @@ class Akismet {
public static function delete_old_comments() {
global $wpdb;
while( $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_id FROM {$wpdb->comments} WHERE DATE_SUB(NOW(), INTERVAL 15 DAY) > comment_date_gmt AND comment_approved = 'spam' LIMIT %d", defined( 'AKISMET_DELETE_LIMIT' ) ? AKISMET_DELETE_LIMIT : 10000 ) ) ) {
/**
* Determines how many comments will be deleted in each batch.
*
* @param int The default, as defined by AKISMET_DELETE_LIMIT.
*/
$delete_limit = apply_filters( 'akismet_delete_comment_limit', defined( 'AKISMET_DELETE_LIMIT' ) ? AKISMET_DELETE_LIMIT : 10000 );
$delete_limit = max( 1, intval( $delete_limit ) );
/**
* Determines how many days a comment will be left in the Spam queue before being deleted.
*
* @param int The default number of days.
*/
$delete_interval = apply_filters( 'akismet_delete_comment_interval', 15 );
$delete_interval = max( 1, intval( $delete_interval ) );
while ( $comment_ids = $wpdb->get_col( $wpdb->prepare( "SELECT comment_id FROM {$wpdb->comments} WHERE DATE_SUB(NOW(), INTERVAL %d DAY) > comment_date_gmt AND comment_approved = 'spam' LIMIT %d", $delete_interval, $delete_limit ) ) ) {
if ( empty( $comment_ids ) )
return;
$wpdb->queries = array();
do_action( 'delete_comment', $comment_ids );
foreach ( $comment_ids as $comment_id ) {
do_action( 'delete_comment', $comment_id );
}
$comma_comment_ids = implode( ', ', array_map('intval', $comment_ids) );
@@ -926,8 +944,16 @@ p {
return _http_build_query( $args, '', '&' );
}
/**
* Log debugging info to the error log.
*
* Enabled when WP_DEBUG_LOG is enabled, but can be disabled via the akismet_debug_log filter.
*
* @param mixed $akismet_debug The data to log.
*/
public static function log( $akismet_debug ) {
if ( defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG )
error_log( print_r( compact( 'akismet_debug' ), 1 ) ); //send message to debug.log when in debug mode
if ( apply_filters( 'akismet_debug_log', defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) ) {
error_log( print_r( compact( 'akismet_debug' ), true ) );
}
}
}
+44 -2
View File
@@ -2,8 +2,8 @@
Contributors: matt, ryan, andy, mdawaffe, tellyworth, josephscott, lessbloat, eoigal, cfinke, automattic
Tags: akismet, comments, spam
Requires at least: 3.1
Tested up to: 3.9.2
Stable tag: 3.0.2
Tested up to: 4.0
Stable tag: 3.0.3
License: GPLv2 or later
Akismet checks your comments against the Akismet Web service to see if they look like spam or not.
@@ -30,11 +30,24 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
== Changelog ==
= 3.0.3 =
*Release Date - 3rd November, 2014*
* Fix for sending the wrong data to delete_comment action that could have prevented old spam comments from being deleted.
* Added a filter to disable logging of Akismet debugging information.
* Added a filter for the maximum comment age when deleting old spam comments.
* Added a filter for the number per batch when deleting old spam comments.
* Removed the "Check for Spam" button from the Spam folder.
= 3.0.2 =
*Release Date - 18th August, 2014*
* Performance improvements.
* Fixed a bug that could truncate the comment data being sent to Akismet for checking.
= 3.0.1 =
*Release Date - 9th July, 2014*
* Removed dependency on PHP's fsockopen function
* Fix spam/ham reports to work when reported outside of the WP dashboard, e.g., from Notifications or the WP app
* Remove jQuery dependency for comment form JavaScript
@@ -42,6 +55,8 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Suspended keys will now result in all comments being put in moderation, not spam.
= 3.0.0 =
*Release Date - 15th April, 2014*
* Move Akismet to Settings menu
* Drop Akismet Stats menu
* Add stats snapshot to Akismet settings
@@ -55,6 +70,8 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Replace the old discard setting with a new "discard pervasive spam" feature.
= 2.6.0 =
*Release Date - 18th March, 2014*
* Add ajax paging to the check for spam button to handle large volumes of comments
* Optimize javascript and add localization support
* Fix bug in link to spam comments from right now dashboard widget
@@ -63,16 +80,22 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Add pre-check for pingbacks, to stop spam before an outbound verification request is made
= 2.5.9 =
*Release Date - 1st August, 2013*
* Update 'Already have a key' link to redirect page rather than depend on javascript
* Fix some non-translatable strings to be translatable
* Update Activation banner in plugins page to redirect user to Akismet config page
= 2.5.8 =
*Release Date - 20th January, 2013*
* Simplify the activation process for new users
* Remove the reporter_ip parameter
* Minor preventative security improvements
= 2.5.7 =
*Release Date - 13th December, 2012*
* FireFox Stats iframe preview bug
* Fix mshots preview when using https
* Add .htaccess to block direct access to files
@@ -82,6 +105,8 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Fix prepare() warnings in WP 3.5
= 2.5.6 =
*Release Date - 26th April, 2012*
* Prevent retry scheduling problems on sites where wp_cron is misbehaving
* Preload mshot previews
* Modernize the widget code
@@ -93,10 +118,14 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Improve error messages when verifying an API key
= 2.5.5 =
*Release Date - 11th January, 2012*
* Add nonce check for comment author URL remove action
* Fix the settings link
= 2.5.4 =
*Release Date - 5th January, 2012*
* Limit Akismet CSS and Javascript loading in wp-admin to just the pages that need it
* Added author URL quick removal functionality
* Added mShot preview on Author URL hover
@@ -105,11 +134,14 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Purge old Akismet comment meta data, default of 15 days
= 2.5.3 =
*Release Date - 8th Febuary, 2011*
* Specify the license is GPL v2 or later
* Fix a bug that could result in orphaned commentmeta entries
* Include hotfix for WordPress 3.0.5 filter issue
= 2.5.2 =
*Release Date - 14th January, 2011*
* Properly format the comment count for author counts
* Look for super admins on multisite installs when looking up user roles
@@ -119,6 +151,7 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Set Akismet stats iframe height to fixed 2500px. Better to have one tall scroll bar than two side by side.
= 2.5.1 =
*Release Date - 17th December, 2010*
* Fix a bug that caused the "Auto delete" option to fail to discard comments correctly
* Remove the comment nonce form field from the 'Akismet Configuration' page in favor of using a filter, akismet_comment_nonce
@@ -137,6 +170,7 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Hid "flagged by..." notification while on dashboard
= 2.5.0 =
*Release Date - 7th December, 2010*
* Track comment actions under 'Akismet Status' on the edit comment screen
* Fix a few remaining deprecated function calls ( props Mike Glendinning )
@@ -152,6 +186,7 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* New option, "Use a nonce on the comment form."
= 2.4.0 =
*Release Date - 23rd August, 2010*
* Spell out that the license is GPLv2
* Fix PHP warnings
@@ -161,6 +196,7 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* General code clean up
= 2.3.0 =
*Release Date - 5th June, 2010*
* Fix "Are you sure" nonce message on config screen in WPMU
* Fix XHTML compliance issue in sidebar widget
@@ -168,10 +204,12 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Localize the widget title (core ticket #13879)
= 2.2.9 =
*Release Date - 2nd June, 2010*
* Eliminate a potential conflict with some plugins that may cause spurious reports
= 2.2.8 =
*Release Date - 27th May, 2010*
* Fix bug in initial comment check for ipv6 addresses
* Report comments as ham when they are moved from spam to moderation
@@ -181,12 +219,14 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Better handling of comments by logged-in users
= 2.2.7 =
*Release Date - 17th December, 2009*
* Add a new AKISMET_VERSION constant
* Reduce the possibility of over-counting spam when another spam filter plugin is in use
* Disable the connectivity check when the API key is hard-coded for WPMU
= 2.2.6 =
*Release Date - 20th July, 2009*
* Fix a global warning introduced in 2.2.5
* Add changelog and additional readme.txt tags
@@ -194,10 +234,12 @@ Upload the Akismet plugin to your blog, Activate it, then enter your [Akismet.co
* Support a new WPCOM_API_KEY constant for easier use with WordPress MU
= 2.2.5 =
*Release Date - 13th July, 2009*
* Include a new Server Connectivity diagnostic check, to detect problems caused by firewalls
= 2.2.4 =
*Release Date - 3rd June, 2009*
* Fixed a key problem affecting the stats feature in WordPress MU
* Provide additional blog information in Akismet API calls
+3 -3
View File
@@ -40,12 +40,12 @@
<?php elseif ( $type == 'missing-functions' ) :?>
<div class="wrap alert critical">
<h3 class="key-status failed"><?php esc_html_e('Network functions are disabled.', 'akismet'); ?></h3>
<p class="description"><?php printf( __('Your web host or server administrator has disabled PHP&#8217;s <code>gethostbynamel</code> functions. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet&#8217;s system requirements</a>.', 'akismet'), 'https://blog.akismet.com/akismet-hosting-faq/'); ?></p>
<p class="description"><?php printf( __('Your web host or server administrator has disabled PHP&#8217;s <code>gethostbynamel</code> functions. <strong>Akismet cannot work correctly until this is fixed.</strong> Please contact your web host or firewall administrator and give them <a href="%s" target="_blank">this information about Akismet&#8217;s system requirements</a>.', 'akismet'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>
</div>
<?php elseif ( $type == 'servers-be-down' ) :?>
<div class="wrap alert critical">
<h3 class="key-status failed"><?php esc_html_e("We can&#8217;t connect to your site.", 'akismet'); ?></h3>
<p class="description"><?php printf( __('Your firewall may be blocking us. Please contact your host and refer to <a href="%s" target="_blank">our guide about firewalls</a>.', 'akismet'), 'https://blog.akismet.com/akismet-hosting-faq/'); ?></p>
<p class="description"><?php printf( __('Your firewall may be blocking us. Please contact your host and refer to <a href="%s" target="_blank">our guide about firewalls</a>.', 'akismet'), 'http://blog.akismet.com/akismet-hosting-faq/'); ?></p>
</div>
<?php elseif ( $type == 'active-dunning' ) :?>
<div class="wrap alert critical">
@@ -99,4 +99,4 @@
<p class="description"><?php printf( __('To continue your service, <a href="%s" target="_blank">upgrade to an Enterprise subscription</a>, which covers an unlimited number of sites. Please <a href="%s" target="_blank">contact our support team</a> with any questions.', 'akismet'), 'https://akismet.com/account/upgrade/', 'https://akismet.com/contact/'); ?></p>
<?php endif; ?>
</div>
<?php endif;?>
<?php endif;?>
File diff suppressed because it is too large. Load diff
@@ -1,134 +1,156 @@
<?php
if (DISQUS_DEBUG) {
echo "<p><strong>Disqus Debug</strong> thread_id: ".get_post_meta($post->ID, 'dsq_thread_id', true)."</p>";
}
?>
<div id="disqus_thread">
<?php if (!get_option('disqus_disable_ssr') && have_comments()): ?>
<?php
// if (is_file(TEMPLATEPATH . '/comments.php')) {
// include(TEMPLATEPATH . '/comments.php');
// }
?>
<div id="dsq-content">
<?php if (get_comment_pages_count() > 1 && get_option('page_comments')): // Are there comments to navigate through? ?>
<div class="navigation">
<div class="nav-previous"><?php previous_comments_link(dsq_i( '<span class="meta-nav">&larr;</span> Older Comments')); ?></div>
<div class="nav-next"><?php next_comments_link(dsq_i('Newer Comments <span class="meta-nav">&rarr;</span>')); ?></div>
</div> <!-- .navigation -->
<?php endif; // check for comment navigation ?>
<ul id="dsq-comments">
<?php
/* Loop through and list the comments. Tell wp_list_comments()
* to use dsq_comment() to format the comments.
*/
wp_list_comments(array('callback' => 'dsq_comment'));
?>
</ul>
<?php if (get_comment_pages_count() > 1 && get_option('page_comments')): // Are there comments to navigate through? ?>
<div class="navigation">
<div class="nav-previous"><?php previous_comments_link(dsq_i( '<span class="meta-nav">&larr;</span> Older Comments')); ?></div>
<div class="nav-next"><?php next_comments_link(dsq_i( 'Newer Comments <span class="meta-nav">&rarr;</span>')); ?></div>
</div><!-- .navigation -->
<?php endif; // check for comment navigation ?>
</div>
<?php endif; ?>
</div>
<script type="text/javascript">
/* <![CDATA[ */
var disqus_url = '<?php echo get_permalink(); ?>';
var disqus_identifier = '<?php echo dsq_identifier_for_post($post); ?>';
var disqus_container_id = 'disqus_thread';
var disqus_domain = '<?php echo DISQUS_DOMAIN; ?>';
var disqus_shortname = '<?php echo strtolower(get_option('disqus_forum_url')); ?>';
var disqus_title = <?php echo cf_json_encode(dsq_title_for_post($post)); ?>;
var disqus_config = function () {
var config = this; // Access to the config object
config.language = '<?php echo esc_js(apply_filters('disqus_language_filter', '')) ?>';
/* Add the ability to add javascript callbacks */
<?php do_action( 'disqus_config' ); ?>
/*
All currently supported events:
* preData — fires just before we request for initial data
* preInit - fires after we get initial data but before we load any dependencies
* onInit - fires when all dependencies are resolved but before dtpl template is rendered
* afterRender - fires when template is rendered but before we show it
* onReady - everything is done
*/
config.callbacks.preData.push(function() {
// clear out the container (its filled for SEO/legacy purposes)
document.getElementById(disqus_container_id).innerHTML = '';
});
<?php if (!get_option('disqus_manual_sync')): ?>
config.callbacks.onReady.push(function() {
// sync comments in the background so we don't block the page
var script = document.createElement('script');
script.async = true;
script.src = '?cf_action=sync_comments&post_id=<?php echo $post->ID; ?>';
var firstScript = document.getElementsByTagName( "script" )[0];
firstScript.parentNode.insertBefore(script, firstScript);
});
<?php endif; ?>
<?php
$sso = dsq_sso();
if ($sso) {
foreach ($sso as $k=>$v) {
echo "this.page.{$k} = '{$v}';\n";
}
echo dsq_sso_login();
}
?>
};
/* ]]> */
</script>
<script type="text/javascript">
/* <![CDATA[ */
var DsqLocal = {
'trackbacks': [
<?php
$count = 0;
foreach ((array)$comments as $comment) {
$comment_type = get_comment_type();
if ( $comment_type != 'comment' ) {
if( $count ) { echo ','; }
?>
{
'author_name': <?php echo cf_json_encode(get_comment_author()); ?>,
'author_url': <?php echo cf_json_encode(get_comment_author_url()); ?>,
'date': <?php echo cf_json_encode(get_comment_date('m/d/Y h:i A')); ?>,
'excerpt': <?php echo cf_json_encode(str_replace(array("\r\n", "\n", "\r"), '<br />', get_comment_excerpt())); ?>,
'type': <?php echo cf_json_encode($comment_type); ?>
}
<?php
$count++;
}
}
?>
],
'trackback_url': <?php echo cf_json_encode(get_trackback_url()); ?>
};
/* ]]> */
</script>
<script type="text/javascript">
/* <![CDATA[ */
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript';
dsq.async = true;
dsq.src = '//' + disqus_shortname + '.' + '<?php echo DISQUS_DOMAIN; ?>' + '/' + 'embed' + '.js' + '?pname=wordpress&pver=<?php echo DISQUS_VERSION; ?>';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
/* ]]> */
</script>
<?php
if (DISQUS_DEBUG) {
echo "<p><strong>Disqus Debug</strong> thread_id: ".get_post_meta($post->ID, 'dsq_thread_id', true)."</p>";
}
?>
<div id="disqus_thread">
<?php if (!get_option('disqus_disable_ssr') && have_comments()): ?>
<div id="dsq-content">
<?php if (get_comment_pages_count() > 1 && get_option('page_comments')): // Are there comments to navigate through? ?>
<div class="navigation">
<div class="nav-previous">
<span class="meta-nav">&larr;</span>&nbsp;
<?php previous_comments_link( dsq_i('Older Comments')); ?>
</div>
<div class="nav-next">
<?php next_comments_link(dsq_i('Newer Comments')); ?>
&nbsp;<span class="meta-nav">&rarr;</span>
</div>
</div> <!-- .navigation -->
<?php endif; // check for comment navigation ?>
<ul id="dsq-comments">
<?php
/* Loop through and list the comments. Tell wp_list_comments()
* to use dsq_comment() to format the comments.
*/
wp_list_comments(array('callback' => 'dsq_comment'));
?>
</ul>
<?php if (get_comment_pages_count() > 1 && get_option('page_comments')): // Are there comments to navigate through? ?>
<div class="navigation">
<div class="nav-previous">
<span class="meta-nav">&larr;</span>
&nbsp;<?php previous_comments_link( dsq_i('Older Comments') ); ?>
</div>
<div class="nav-next">
<?php next_comments_link( dsq_i('Newer Comments') ); ?>
&nbsp;<span class="meta-nav">&rarr;</span>
</div>
</div><!-- .navigation -->
<?php endif; // check for comment navigation ?>
</div>
<?php endif; ?>
</div>
<?php
global $wp_version;
$embed_vars = array(
'disqusConfig' => array(
'platform' => 'wordpress@'.$wp_version,
'language' => apply_filters( 'disqus_language_filter', '' ),
),
'disqusIdentifier' => dsq_identifier_for_post( $post ),
'disqusShortname' => strtolower( get_option( 'disqus_forum_url' ) ),
'disqusTitle' => dsq_title_for_post( $post ),
'disqusUrl' => get_permalink(),
'options' => array(
'manualSync' => get_option('disqus_manual_sync'),
),
'postId' => $post->ID,
);
// Add SSO vars if enabled
$sso = dsq_sso();
if ($sso) {
global $current_site;
foreach ($sso as $k=>$v) {
$embed_vars['disqusConfig'][$k] = $v;
}
$siteurl = site_url();
$sitename = get_bloginfo('name');
$embed_vars['disqusConfig']['sso'] = array(
'name' => wp_specialchars_decode($sitename, ENT_QUOTES),
'button' => get_option('disqus_sso_button'),
'url' => $siteurl.'/wp-login.php',
'logout' => $siteurl.'/wp-login.php?action=logout',
'width' => '800',
'height' => '700',
);
}
if ( get_option('dsq_external_js') == '1' ) {
wp_register_script( 'dsq_embed_script', plugins_url( '/media/js/disqus.js', __FILE__ ) );
wp_localize_script( 'dsq_embed_script', 'embedVars', $embed_vars );
wp_enqueue_script( 'dsq_embed_script', plugins_url( '/media/js/disqus.js', __FILE__ ) );
}
else {
?>
<script type="text/javascript">
var disqus_url = '<?php echo get_permalink(); ?>';
var disqus_identifier = '<?php echo dsq_identifier_for_post($post); ?>';
var disqus_container_id = 'disqus_thread';
var disqus_shortname = '<?php echo strtolower(get_option('disqus_forum_url')); ?>';
var disqus_title = <?php echo cf_json_encode( dsq_title_for_post($post) ); ?>;
var disqus_config_custom = window.disqus_config;
var disqus_config = function () {
/*
All currently supported events:
onReady: fires when everything is ready,
onNewComment: fires when a new comment is posted,
onIdentify: fires when user is authenticated
*/
<?php
$sso = dsq_sso();
if ($sso) {
foreach ($sso as $k=>$v) {
echo 'this.page.' . esc_js($k) . ' = \'' . esc_js($v) . '\';';
echo "\n";
}
echo dsq_sso_login();
}
?>
this.language = '<?php echo esc_js( apply_filters('disqus_language_filter', '') ) ?>';
<?php if (!get_option('disqus_manual_sync')): ?>
this.callbacks.onReady.push(function () {
// sync comments in the background so we don't block the page
var script = document.createElement('script');
script.async = true;
script.src = '?cf_action=sync_comments&post_id=<?php echo esc_attr( $post->ID ); ?>';
var firstScript = document.getElementsByTagName('script')[0];
firstScript.parentNode.insertBefore(script, firstScript);
});
<?php endif; ?>
if (disqus_config_custom) {
disqus_config_custom.call(this);
}
};
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript';
dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<?php
}
?>
File diff suppressed because it is too large. Load diff
@@ -1,195 +1,195 @@
<?php
/**
* Adapted from WordPress 2.8
*/
@set_time_limit(0);
@ini_set('memory_limit', '256M');
define('WXR_VERSION', '1.0');
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param unknown_type $categories
*/
function dsq_export_wxr_missing_parents($categories) {
if ( !is_array($categories) || empty($categories) )
return array();
foreach ( $categories as $category )
$parents[$category->term_id] = $category->parent;
$parents = array_unique(array_diff($parents, array_keys($parents)));
if ( $zero = array_search('0', $parents) )
unset($parents[$zero]);
return $parents;
}
/**
* Place string in CDATA tag.
*
* @since unknown
*
* @param string $str String to place in XML CDATA tag.
*/
function dsq_export_wxr_cdata($str) {
if ( seems_utf8($str) == false )
$str = utf8_encode($str);
// $str = ent2ncr(esc_html($str));
$str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';
return $str;
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @return string Site URL.
*/
function dsq_export_wxr_site_url() {
global $current_site;
// mu: the base url
if ( isset($current_site->domain) ) {
return 'http://'.$current_site->domain.$current_site->path;
}
// wp: the blog url
else {
return get_bloginfo_rss('url');
}
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $c Category Object
*/
function dsq_export_wxr_cat_name($c) {
if ( empty($c->name) )
return;
echo '<wp:cat_name>' . dsq_export_wxr_cdata($c->name) . '</wp:cat_name>';
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $c Category Object
*/
function dsq_export_wxr_category_description($c) {
if ( empty($c->description) )
return;
echo '<wp:category_description>' . dsq_export_wxr_cdata($c->description) . '</wp:category_description>';
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $t Tag Object
*/
function dsq_export_wxr_tag_name($t) {
if ( empty($t->name) )
return;
echo '<wp:tag_name>' . dsq_export_wxr_cdata($t->name) . '</wp:tag_name>';
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $t Tag Object
*/
function dsq_export_wxr_tag_description($t) {
if ( empty($t->description) )
return;
echo '<wp:tag_description>' . dsq_export_wxr_cdata($t->description) . '</wp:tag_description>';
}
// receives an array of posts to export
function dsq_export_wp($post, $comments=null) {
global $wpdb;
if (!$comments) {
$comments = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%'", $post->ID) );
}
// start catching output
ob_start();
echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . '"?' . ">\n";
?>
<?php the_generator('export');?>
<rss version="2.0"
xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dsq="http://www.disqus.com/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/"
>
<channel>
<title><?php bloginfo_rss('name'); ?></title>
<link><?php bloginfo_rss('url') ?></link>
<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></pubDate>
<generator>WordPress <?php bloginfo_rss('version'); ?>; Disqus <?php echo DISQUS_VERSION; ?></generator>
<?php
global $wp_query, $post;
$wp_query->in_the_loop = true; // Fake being in the loop.
setup_postdata($post); ?>
<item>
<title><?php echo apply_filters('the_title_rss', $post->post_title); ?></title>
<link><?php the_permalink_rss() ?></link>
<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
<dc:creator><?php echo dsq_export_wxr_cdata(get_the_author()); ?></dc:creator>
<guid isPermaLink="false"><?php the_guid(); ?></guid>
<content:encoded><?php echo dsq_export_wxr_cdata( apply_filters('the_content_export', $post->post_content) ); ?></content:encoded>
<dsq:thread_identifier><?php echo dsq_identifier_for_post($post); ?></dsq:thread_identifier>
<wp:post_id><?php echo $post->ID; ?></wp:post_id>
<wp:post_date_gmt><?php echo $post->post_date_gmt; ?></wp:post_date_gmt>
<wp:comment_status><?php echo $post->comment_status; ?></wp:comment_status>
<?php
if ( $comments ) { foreach ( $comments as $c ) { ?>
<wp:comment>
<wp:comment_id><?php echo $c->comment_ID; ?></wp:comment_id>
<wp:comment_author><?php echo dsq_export_wxr_cdata($c->comment_author); ?></wp:comment_author>
<wp:comment_author_email><?php echo $c->comment_author_email; ?></wp:comment_author_email>
<wp:comment_author_url><?php echo $c->comment_author_url; ?></wp:comment_author_url>
<wp:comment_author_IP><?php echo $c->comment_author_IP; ?></wp:comment_author_IP>
<wp:comment_date><?php echo $c->comment_date; ?></wp:comment_date>
<wp:comment_date_gmt><?php echo $c->comment_date_gmt; ?></wp:comment_date_gmt>
<wp:comment_content><?php echo dsq_export_wxr_cdata($c->comment_content) ?></wp:comment_content>
<wp:comment_approved><?php echo $c->comment_approved; ?></wp:comment_approved>
<wp:comment_type><?php echo $c->comment_type; ?></wp:comment_type>
<wp:comment_parent><?php echo $c->comment_parent; ?></wp:comment_parent>
</wp:comment>
<?php } } // comments ?>
</item>
</channel>
</rss>
<?php
// end of WXR output
$output = ob_get_clean();
return $output;
}
?>
<?php
/**
* Adapted from WordPress 2.8
*/
@set_time_limit(0);
@ini_set('memory_limit', '256M');
define('WXR_VERSION', '1.0');
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param unknown_type $categories
*/
function dsq_export_wxr_missing_parents($categories) {
if ( !is_array($categories) || empty($categories) )
return array();
foreach ( $categories as $category )
$parents[$category->term_id] = $category->parent;
$parents = array_unique(array_diff($parents, array_keys($parents)));
if ( $zero = array_search('0', $parents) )
unset($parents[$zero]);
return $parents;
}
/**
* Place string in CDATA tag.
*
* @since unknown
*
* @param string $str String to place in XML CDATA tag.
*/
function dsq_export_wxr_cdata($str) {
if ( seems_utf8($str) == false )
$str = utf8_encode($str);
// $str = ent2ncr(esc_html($str));
$str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';
return $str;
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @return string Site URL.
*/
function dsq_export_wxr_site_url() {
global $current_site;
// mu: the base url
if ( isset($current_site->domain) ) {
return 'http://'.$current_site->domain.$current_site->path;
}
// wp: the blog url
else {
return get_bloginfo_rss('url');
}
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $c Category Object
*/
function dsq_export_wxr_cat_name($c) {
if ( empty($c->name) )
return;
echo '<wp:cat_name>' . dsq_export_wxr_cdata($c->name) . '</wp:cat_name>';
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $c Category Object
*/
function dsq_export_wxr_category_description($c) {
if ( empty($c->description) )
return;
echo '<wp:category_description>' . dsq_export_wxr_cdata($c->description) . '</wp:category_description>';
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $t Tag Object
*/
function dsq_export_wxr_tag_name($t) {
if ( empty($t->name) )
return;
echo '<wp:tag_name>' . dsq_export_wxr_cdata($t->name) . '</wp:tag_name>';
}
/**
* {@internal Missing Short Description}}
*
* @since unknown
*
* @param object $t Tag Object
*/
function dsq_export_wxr_tag_description($t) {
if ( empty($t->description) )
return;
echo '<wp:tag_description>' . dsq_export_wxr_cdata($t->description) . '</wp:tag_description>';
}
// receives an array of posts to export
function dsq_export_wp($post, $comments=null) {
global $wpdb;
if (!$comments) {
$comments = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%'", $post->ID) );
}
// start catching output
ob_start();
echo '<?xml version="1.0" encoding="' . get_bloginfo('charset') . '"?' . ">\n";
?>
<?php the_generator('export');?>
<rss version="2.0"
xmlns:excerpt="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/excerpt/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:dsq="http://www.disqus.com/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:wp="http://wordpress.org/export/<?php echo WXR_VERSION; ?>/"
>
<channel>
<title><?php bloginfo_rss('name'); ?></title>
<link><?php bloginfo_rss('url') ?></link>
<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_lastpostmodified('GMT'), false); ?></pubDate>
<generator>WordPress <?php bloginfo_rss('version'); ?>; Disqus <?php echo DISQUS_VERSION; ?></generator>
<?php
global $wp_query, $post;
$wp_query->in_the_loop = true; // Fake being in the loop.
setup_postdata($post); ?>
<item>
<title><?php echo apply_filters('the_title_rss', $post->post_title); ?></title>
<link><?php the_permalink_rss() ?></link>
<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_time('Y-m-d H:i:s', true), false); ?></pubDate>
<dc:creator><?php echo dsq_export_wxr_cdata(get_the_author()); ?></dc:creator>
<guid isPermaLink="false"><?php the_guid(); ?></guid>
<content:encoded><?php echo dsq_export_wxr_cdata( apply_filters('the_content_export', $post->post_content) ); ?></content:encoded>
<dsq:thread_identifier><?php echo dsq_identifier_for_post($post); ?></dsq:thread_identifier>
<wp:post_id><?php echo $post->ID; ?></wp:post_id>
<wp:post_date_gmt><?php echo $post->post_date_gmt; ?></wp:post_date_gmt>
<wp:comment_status><?php echo $post->comment_status; ?></wp:comment_status>
<?php
if ( $comments ) { foreach ( $comments as $c ) { ?>
<wp:comment>
<wp:comment_id><?php echo $c->comment_ID; ?></wp:comment_id>
<wp:comment_author><?php echo dsq_export_wxr_cdata($c->comment_author); ?></wp:comment_author>
<wp:comment_author_email><?php echo $c->comment_author_email; ?></wp:comment_author_email>
<wp:comment_author_url><?php echo $c->comment_author_url; ?></wp:comment_author_url>
<wp:comment_author_IP><?php echo $c->comment_author_IP; ?></wp:comment_author_IP>
<wp:comment_date><?php echo $c->comment_date; ?></wp:comment_date>
<wp:comment_date_gmt><?php echo $c->comment_date_gmt; ?></wp:comment_date_gmt>
<wp:comment_content><?php echo dsq_export_wxr_cdata($c->comment_content) ?></wp:comment_content>
<wp:comment_approved><?php echo $c->comment_approved; ?></wp:comment_approved>
<wp:comment_type><?php echo $c->comment_type; ?></wp:comment_type>
<wp:comment_parent><?php echo $c->comment_parent; ?></wp:comment_parent>
</wp:comment>
<?php } } // comments ?>
</item>
</channel>
</rss>
<?php
// end of WXR output
$output = ob_get_clean();
return $output;
}
?>
@@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2010 DISQUS
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
@@ -1,18 +0,0 @@
Disqus API 1.1
Please see http://groups.google.com/group/disqus-dev/web/api-1-1 for more information.
Sample usage::
require('disqus/disqus.php');
$dsq = new DisqusAPI($user_api_key, $forum_api_key);
if (($username = $dsq->get_user_name()) === false)
{
throw new Exception($dsq->get_last_error());
}
To run the included unit tests you will need to install PHPUnit::
php disqus/tests.php <your user_api_key>
@@ -1,461 +1,461 @@
<?php
/**
* Implementation of the Disqus v1.1 API.
*
* http://groups.google.com/group/disqus-dev/web/api-1-1
*
* @author Disqus <team@disqus.com>
* @copyright 2007-2010 Big Head Labs
* @link http://disqus.com/
* @package Disqus
* @version 1.1
*/
require_once(dirname(__FILE__) . '/url.php');
/** @#+
* Constants
*/
/**
* Base URL for Disqus.
*/
define('DISQUS_TYPE_SPAM', 'spam');
define('DISQUS_TYPE_DELETED', 'killed');
define('DISQUS_TYPE_KILLED', DISQUS_TYPE_DELETED);
define('DISQUS_TYPE_NEW', 'new');
define('DISQUS_STATE_APPROVED', 'approved');
define('DISQUS_STATE_UNAPPROVED', 'unapproved');
define('DISQUS_STATE_SPAM', 'spam');
define('DISQUS_STATE_DELETED', 'killed');
define('DISQUS_STATE_KILLED', DISQUS_STATE_DELETED);
define('DISQUS_ACTION_SPAM', 'spam');
define('DISQUS_ACTION_APPROVE', 'approve');
define('DISQUS_ACTION_DELETE', 'delete');
define('DISQUS_ACTION_KILL', 'kill');
if (!extension_loaded('json')) {
require_once(dirname(__FILE__) . '/json.php');
function dsq_json_decode($data) {
$json = new JSON;
return $json->unserialize($data);
}
} else {
function dsq_json_decode($data) {
return json_decode($data);
}
}
/**
* Helper methods for all of the Disqus 1.1 API methods.
*
* @package Disqus
* @author DISQUS.com <team@disqus.com>
* @copyright 2007-2010 Big Head Labs
* @version 1.1
*/
class DisqusAPI {
var $user_api_key;
var $forum_api_key;
var $api_url = 'https://www.disqus.com/api/';
var $api_version = '1.1';
/**
* Creates a new interface to the Disqus API.
*
* @param $user_api_key
* (optional) The User API key to use.
* @param $forum_api_key
* (optional) The Forum API key to use.
* @param $api_url
* (optional) The prefix URL to use when calling the Disqus API.
*/
function DisqusAPI($user_api_key, $forum_api_key, $api_url='https://www.disqus.com/api/') {
$this->user_api_key = $user_api_key;
$this->forum_api_key = $forum_api_key;
$this->api_url = $api_url;
$this->last_error = null;
}
/**
* Makes a call to a Disqus API method.
*
* @return
* The Disqus object.
* @param $method
* The Disqus API method to call.
* @param $args
* An associative array of arguments to be passed.
* @param $post
* TRUE or FALSE, depending on whether we're making a POST call.
*/
function call($method, $args=array(), $post=false) {
$url = $this->api_url . $method . '/';
if (!isset($args['user_api_key'])) {
$args['user_api_key'] = $this->user_api_key;
}
if (!isset($args['forum_api_key'])) {
$args['forum_api_key'] = $this->forum_api_key;
}
if (!isset($args['api_version'])) {
$args['api_version'] = $this->api_version;
}
foreach ($args as $key=>$value) {
// XXX: Disqus is lacking some exception handling and we sometimes
// end up with 500s when passing invalid values
if (empty($value)) unset($args[$key]);
}
if (!$post) {
$url .= '?' . dsq_get_query_string($args);
$args = null;
}
if (!($response = dsq_urlopen($url, $args)) || !$response['code']) {
$this->last_error = 'Unable to connect to the Disqus API servers';
return false;
}
if ($response['code'] != 200) {
if ($response['code'] == 500) {
// Try to grab the exception ID for better reporting
if (!empty($response['headers']['X-Sentry-ID'])) {
$this->last_error = 'DISQUS returned a bad response (HTTP '.$response['code'].', ReferenceID: '.$response['headers']['X-Sentry-ID'].')';
return false;
}
} elseif ($response['code'] == 400) {
$data = dsq_json_decode($response['data']);
if ($data && $data->message) {
$this->last_error = $data->message;
} else {
$this->last_error = "DISQUS returned a bad response (HTTP ".$response['code'].")";
}
return false;
}
$this->last_error = "DISQUS returned a bad response (HTTP ".$response['code'].")";
return false;
}
$data = dsq_json_decode($response['data']);
if (!$data) {
$this->last_error = 'No valid JSON content returned from Disqus';
return false;
}
if (!$data->succeeded) {
if (!$data->message) {
$this->last_error = '(No error message was received)';
} else {
$this->last_error = $data->message;
}
return false;
}
$this->last_error = null;
return $data->message;
}
/**
* Retrieve the last error message recorded.
*
* @return
* The last recorded error from the API
*/
function get_last_error() {
if (empty($this->last_error)) return;
if (!is_string($this->last_error)) {
return var_export($this->last_error);
}
return $this->last_error;
}
/**
* Validate API key and get username.
*
* @return
* Username matching the API key
*/
function get_user_name() {
return $this->call('get_user_name', array(), true);
}
/**
* Returns an array of hashes representing all forums the user owns.
*
* @return
* An array of hashes representing all forums the user owns.
*/
function get_forum_list() {
return $this->call('get_forum_list');
}
/**
* Get a forum API key for a specific forum.
*
* @param $forum_id
* the unique id of the forum
* @return
* A string which is the Forum Key for the given forum.
*/
function get_forum_api_key($forum_id) {
$params = array(
'forum_id' => $forum_id,
);
return $this->call('get_forum_api_key', $params);
}
/**
* Get a list of comments on a website.
*
* Both filter and exclude are multivalue arguments with comma as a divider.
* That makes is possible to use combined requests. For example, if you want
* to get all deleted spam messages, your filter argument should contain
* 'spam,killed' string.
*
* @param $forum_id
* The forum ID.
* @param $params
* - limit: Number of entries that should be included in the response. Default is 25.
* - start: Starting point for the query. Default is 0.
* - filter: Type of entries that should be returned.
* - exclude: Type of entries that should be excluded from the response.
* @return
* Returns posts from a forum specified by id.
*/
function get_forum_posts($forum_id, $params=array()) {
$params['forum_id'] = $forum_id;
return $this->call('get_forum_posts', $params);
}
/**
* Count a number of comments in articles.
*
* @param $thread_ids
* an array of thread IDs belonging to the given forum.
* @return
* A hash having thread_ids as keys and 2-element arrays as values.
*/
function get_num_posts($thread_ids) {
$params = array(
'thread_ids' => is_array($thread_ids) ? implode(',', $thread_ids) : $thread_ids,
);
return $this->call('get_num_posts', $params);
}
/**
* Returns a list of categories that were created for a website (forum) provided.
*
* @param $forum_id
* the unique of the forum
* @return
* A hash containing category_id, title, forum_id, and is_default.
*/
function get_categories_list($forum_id) {
$params = array(
'forum_id' => $forum_id,
);
return $this->call('get_categories_list', $params);
}
/**
* Get a list of threads on a website.
*
* @param $forum_id
* the unique id of the forum.
* @param $params
* - limit: Number of entries that should be included in the response. Default is 25.
* - start: Starting point for the query. Default is 0.
* - category_id: Filter entries by category
* @return
* An array of hashes representing all threads belonging to the given forum.
*/
function get_thread_list($forum_id, $params=array()) {
$params['forum_id'] = $forum_id;
return $this->call('get_thread_list', $params);
}
/**
* Get a list of threads with new comments.
*
* @param $forum_id
* The Forum ID.
* @param $since
* Start date for new posts. Format: 2009-03-30T15:41, Timezone: UTC.
* @return
* An array of hashes representing all threads with new comments since offset.
*/
function get_updated_threads($forum_id, $since) {
$params = array(
'forum_id' => $forum_id,
'since' => is_string($since) ? $string : strftime('%Y-%m-%dT%H:%M', $since),
);
return $this->call('get_updated_threads', $params);
}
/**
* Get a list of comments in a thread.
*
* Both filter and exclude are multivalue arguments with comma as a divider.
* That makes is possible to use combined requests. For example, if you want
* to get all deleted spam messages, your filter argument should contain
* 'spam,killed' string. Note that values are joined by AND statement so
* 'spam,new' will return all messages that are new and marked as spam. It
* will not return messages that are new and not spam or that are spam but
* not new (i.e. has already been moderated).
*
* @param $thread_id
* The ID of a thread belonging to the given forum
* @param $params
* - limit: Number of entries that should be included in the response. Default is 25.
* - start: Starting point for the query. Default is 0.
* - filter: Type of entries that should be returned (new, spam or killed).
* - exclude: Type of entries that should be excluded from the response (new, spam or killed).
* @return
* An array of hashes representing representing all posts belonging to the
* given forum.
*/
function get_thread_posts($thread_id, $params=array()) {
$params['thread_id'] = $thread_id;
return $this->call('get_thread_posts', $params);
}
/**
* Get or create thread by identifier.
*
* This method tries to find a thread by its identifier and title. If there is
* no such thread, the method creates it. In either case, the output value is
* a thread object.
*
* @param $identifier
* Unique value (per forum) for a thread that is used to keep be able to get
* data even if permalink is changed.
* @param $title
* The title of the thread to possibly be created.
* @param $params
* - category_id: Filter entries by category
* - create_on_fail: if thread does not exist, the method will create it
* @return
* Returns a hash with two keys:
* - thread: a hash representing the thread corresponding to the identifier.
* - created: indicates whether the thread was created as a result of this
* method call. If created, it will have the specified title.
*/
function thread_by_identifier($identifier, $title, $params=array()) {
$params['identifier'] = $identifier;
$params['title'] = $title;
return $this->call('thread_by_identifier', $params, true);
}
/**
* Get thread by URL.
*
* Finds a thread by its URL. Output value is a thread object.
*
* @param $url
* the URL to check for an associated thread
* @param $partner_api_key
* (optional) The Partner API key.
* @return
* A thread object, otherwise NULL.
*/
function get_thread_by_url($url, $partner_api_key=null) {
$params = array(
'url' => $url,
'partner_api_key' => $partner_api_key,
);
return $this->call('get_thread_by_url', $params);
}
/**
* Updates thread.
*
* Updates thread, specified by id and forum API key, with values described in
* the optional arguments.
*
* @param $thread_id
* the ID of a thread belonging to the given forum
* @param $params
* - title: the title of the thread
* - slug: the per-forum-unique string used for identifying this thread in
* disqus.com URL’s relating to this thread. Composed of
* underscore-separated alphanumeric strings.
* - url: the URL this thread is on, if known.
* - allow_comments: whether this thread is open to new comments
* @return
* Returns an empty success message.
*/
function update_thread($thread_id, $params=array()) {
$params['thread_id'] = $thread_id;
return $this->call('update_thread', $params, true);
}
/**
* Creates a new post.
*
* Creates a comment to the thread specified by id.
*
* @param $thread_id
* the thread to post to
* @param $message
* the content of the post
* @param $author_name
* the post creator’s name
* @param $author_email
* the post creator’s email address
* @param $params
* - partner_api_key
* - created_at: Format: 2009-03-30T15:41, Timezone: UTC
* - ip_address: the author’s IP address
* - author_url: the author's homepage
* - parent_post: the id of the parent post
* - state: Comment's state, must be one of the following: approved,
* unapproved, spam, killed
* @return
* Returns modified version.
*/
function create_post($thread_id, $message, $author_name, $author_email, $params=array()) {
$params['thread_id'] = $thread_id;
$params['message'] = $message;
$params['author_name'] = $author_name;
$params['author_email'] = $author_email;
return $this->call('create_post', $params, true);
}
/**
* Delete a comment or mark it as spam (or not spam).
*
* @param $post_id
* The Post ID.
* @param $action
* Name of action to be performed. Value can be 'spam', 'approve' or 'kill'.
* @return
* Returns modified version.
*/
function moderate_post($post_id, $action) {
$params = array(
'post_id' => $post_id,
'action' => $action,
);
return $this->call('moderate_post', $params, true);
}
}
?>
<?php
/**
* Implementation of the Disqus v1.1 API.
*
* http://groups.google.com/group/disqus-dev/web/api-1-1
*
* @author Disqus <team@disqus.com>
* @copyright 2007-2010 Big Head Labs
* @link http://disqus.com/
* @package Disqus
* @version 1.1
*/
require_once(dirname(__FILE__) . '/url.php');
/** @#+
* Constants
*/
/**
* Base URL for Disqus.
*/
define('DISQUS_TYPE_SPAM', 'spam');
define('DISQUS_TYPE_DELETED', 'killed');
define('DISQUS_TYPE_KILLED', DISQUS_TYPE_DELETED);
define('DISQUS_TYPE_NEW', 'new');
define('DISQUS_STATE_APPROVED', 'approved');
define('DISQUS_STATE_UNAPPROVED', 'unapproved');
define('DISQUS_STATE_SPAM', 'spam');
define('DISQUS_STATE_DELETED', 'killed');
define('DISQUS_STATE_KILLED', DISQUS_STATE_DELETED);
define('DISQUS_ACTION_SPAM', 'spam');
define('DISQUS_ACTION_APPROVE', 'approve');
define('DISQUS_ACTION_DELETE', 'delete');
define('DISQUS_ACTION_KILL', 'kill');
if (!extension_loaded('json')) {
require_once(dirname(__FILE__) . '/json.php');
function dsq_json_decode($data) {
$json = new JSON;
return $json->unserialize($data);
}
} else {
function dsq_json_decode($data) {
return json_decode($data);
}
}
/**
* Helper methods for all of the Disqus 1.1 API methods.
*
* @package Disqus
* @author DISQUS.com <team@disqus.com>
* @copyright 2007-2010 Big Head Labs
* @version 1.1
*/
class DisqusAPI {
var $user_api_key;
var $forum_api_key;
var $api_url = 'https://www.disqus.com/api/';
var $api_version = '1.1';
/**
* Creates a new interface to the Disqus API.
*
* @param $user_api_key
* (optional) The User API key to use.
* @param $forum_api_key
* (optional) The Forum API key to use.
* @param $api_url
* (optional) The prefix URL to use when calling the Disqus API.
*/
function DisqusAPI($user_api_key, $forum_api_key, $api_url='https://www.disqus.com/api/') {
$this->user_api_key = $user_api_key;
$this->forum_api_key = $forum_api_key;
$this->api_url = $api_url;
$this->last_error = null;
}
/**
* Makes a call to a Disqus API method.
*
* @return
* The Disqus object.
* @param $method
* The Disqus API method to call.
* @param $args
* An associative array of arguments to be passed.
* @param $post
* TRUE or FALSE, depending on whether we're making a POST call.
*/
function call($method, $args=array(), $post=false) {
$url = $this->api_url . $method . '/';
if (!isset($args['user_api_key'])) {
$args['user_api_key'] = $this->user_api_key;
}
if (!isset($args['forum_api_key'])) {
$args['forum_api_key'] = $this->forum_api_key;
}
if (!isset($args['api_version'])) {
$args['api_version'] = $this->api_version;
}
foreach ($args as $key=>$value) {
// XXX: Disqus is lacking some exception handling and we sometimes
// end up with 500s when passing invalid values
if (empty($value)) unset($args[$key]);
}
if (!$post) {
$url .= '?' . dsq_get_query_string($args);
$args = null;
}
if (!($response = dsq_urlopen($url, $args)) || !$response['code']) {
$this->last_error = 'Unable to connect to the Disqus API servers';
return false;
}
if ($response['code'] != 200) {
if ($response['code'] == 500) {
// Try to grab the exception ID for better reporting
if (!empty($response['headers']['X-Sentry-ID'])) {
$this->last_error = 'DISQUS returned a bad response (HTTP '.$response['code'].', ReferenceID: '.$response['headers']['X-Sentry-ID'].')';
return false;
}
} elseif ($response['code'] == 400) {
$data = dsq_json_decode($response['data']);
if ($data && $data->message) {
$this->last_error = $data->message;
} else {
$this->last_error = "DISQUS returned a bad response (HTTP ".$response['code'].")";
}
return false;
}
$this->last_error = "DISQUS returned a bad response (HTTP ".$response['code'].")";
return false;
}
$data = dsq_json_decode($response['data']);
if (!$data) {
$this->last_error = 'No valid JSON content returned from Disqus';
return false;
}
if (!$data->succeeded) {
if (!$data->message) {
$this->last_error = '(No error message was received)';
} else {
$this->last_error = $data->message;
}
return false;
}
$this->last_error = null;
return $data->message;
}
/**
* Retrieve the last error message recorded.
*
* @return
* The last recorded error from the API
*/
function get_last_error() {
if (empty($this->last_error)) return;
if (!is_string($this->last_error)) {
return var_export($this->last_error);
}
return $this->last_error;
}
/**
* Validate API key and get username.
*
* @return
* Username matching the API key
*/
function get_user_name() {
return $this->call('get_user_name', array(), true);
}
/**
* Returns an array of hashes representing all forums the user owns.
*
* @return
* An array of hashes representing all forums the user owns.
*/
function get_forum_list() {
return $this->call('get_forum_list');
}
/**
* Get a forum API key for a specific forum.
*
* @param $forum_id
* the unique id of the forum
* @return
* A string which is the Forum Key for the given forum.
*/
function get_forum_api_key($forum_id) {
$params = array(
'forum_id' => $forum_id,
);
return $this->call('get_forum_api_key', $params);
}
/**
* Get a list of comments on a website.
*
* Both filter and exclude are multivalue arguments with comma as a divider.
* That makes is possible to use combined requests. For example, if you want
* to get all deleted spam messages, your filter argument should contain
* 'spam,killed' string.
*
* @param $forum_id
* The forum ID.
* @param $params
* - limit: Number of entries that should be included in the response. Default is 25.
* - start: Starting point for the query. Default is 0.
* - filter: Type of entries that should be returned.
* - exclude: Type of entries that should be excluded from the response.
* @return
* Returns posts from a forum specified by id.
*/
function get_forum_posts($forum_id, $params=array()) {
$params['forum_id'] = $forum_id;
return $this->call('get_forum_posts', $params);
}
/**
* Count a number of comments in articles.
*
* @param $thread_ids
* an array of thread IDs belonging to the given forum.
* @return
* A hash having thread_ids as keys and 2-element arrays as values.
*/
function get_num_posts($thread_ids) {
$params = array(
'thread_ids' => is_array($thread_ids) ? implode(',', $thread_ids) : $thread_ids,
);
return $this->call('get_num_posts', $params);
}
/**
* Returns a list of categories that were created for a website (forum) provided.
*
* @param $forum_id
* the unique of the forum
* @return
* A hash containing category_id, title, forum_id, and is_default.
*/
function get_categories_list($forum_id) {
$params = array(
'forum_id' => $forum_id,
);
return $this->call('get_categories_list', $params);
}
/**
* Get a list of threads on a website.
*
* @param $forum_id
* the unique id of the forum.
* @param $params
* - limit: Number of entries that should be included in the response. Default is 25.
* - start: Starting point for the query. Default is 0.
* - category_id: Filter entries by category
* @return
* An array of hashes representing all threads belonging to the given forum.
*/
function get_thread_list($forum_id, $params=array()) {
$params['forum_id'] = $forum_id;
return $this->call('get_thread_list', $params);
}
/**
* Get a list of threads with new comments.
*
* @param $forum_id
* The Forum ID.
* @param $since
* Start date for new posts. Format: 2009-03-30T15:41, Timezone: UTC.
* @return
* An array of hashes representing all threads with new comments since offset.
*/
function get_updated_threads($forum_id, $since) {
$params = array(
'forum_id' => $forum_id,
'since' => is_string($since) ? $string : strftime('%Y-%m-%dT%H:%M', $since),
);
return $this->call('get_updated_threads', $params);
}
/**
* Get a list of comments in a thread.
*
* Both filter and exclude are multivalue arguments with comma as a divider.
* That makes is possible to use combined requests. For example, if you want
* to get all deleted spam messages, your filter argument should contain
* 'spam,killed' string. Note that values are joined by AND statement so
* 'spam,new' will return all messages that are new and marked as spam. It
* will not return messages that are new and not spam or that are spam but
* not new (i.e. has already been moderated).
*
* @param $thread_id
* The ID of a thread belonging to the given forum
* @param $params
* - limit: Number of entries that should be included in the response. Default is 25.
* - start: Starting point for the query. Default is 0.
* - filter: Type of entries that should be returned (new, spam or killed).
* - exclude: Type of entries that should be excluded from the response (new, spam or killed).
* @return
* An array of hashes representing representing all posts belonging to the
* given forum.
*/
function get_thread_posts($thread_id, $params=array()) {
$params['thread_id'] = $thread_id;
return $this->call('get_thread_posts', $params);
}
/**
* Get or create thread by identifier.
*
* This method tries to find a thread by its identifier and title. If there is
* no such thread, the method creates it. In either case, the output value is
* a thread object.
*
* @param $identifier
* Unique value (per forum) for a thread that is used to keep be able to get
* data even if permalink is changed.
* @param $title
* The title of the thread to possibly be created.
* @param $params
* - category_id: Filter entries by category
* - create_on_fail: if thread does not exist, the method will create it
* @return
* Returns a hash with two keys:
* - thread: a hash representing the thread corresponding to the identifier.
* - created: indicates whether the thread was created as a result of this
* method call. If created, it will have the specified title.
*/
function thread_by_identifier($identifier, $title, $params=array()) {
$params['identifier'] = $identifier;
$params['title'] = $title;
return $this->call('thread_by_identifier', $params, true);
}
/**
* Get thread by URL.
*
* Finds a thread by its URL. Output value is a thread object.
*
* @param $url
* the URL to check for an associated thread
* @param $partner_api_key
* (optional) The Partner API key.
* @return
* A thread object, otherwise NULL.
*/
function get_thread_by_url($url, $partner_api_key=null) {
$params = array(
'url' => $url,
'partner_api_key' => $partner_api_key,
);
return $this->call('get_thread_by_url', $params);
}
/**
* Updates thread.
*
* Updates thread, specified by id and forum API key, with values described in
* the optional arguments.
*
* @param $thread_id
* the ID of a thread belonging to the given forum
* @param $params
* - title: the title of the thread
* - slug: the per-forum-unique string used for identifying this thread in
* disqus.com URL’s relating to this thread. Composed of
* underscore-separated alphanumeric strings.
* - url: the URL this thread is on, if known.
* - allow_comments: whether this thread is open to new comments
* @return
* Returns an empty success message.
*/
function update_thread($thread_id, $params=array()) {
$params['thread_id'] = $thread_id;
return $this->call('update_thread', $params, true);
}
/**
* Creates a new post.
*
* Creates a comment to the thread specified by id.
*
* @param $thread_id
* the thread to post to
* @param $message
* the content of the post
* @param $author_name
* the post creator’s name
* @param $author_email
* the post creator’s email address
* @param $params
* - partner_api_key
* - created_at: Format: 2009-03-30T15:41, Timezone: UTC
* - ip_address: the author’s IP address
* - author_url: the author's homepage
* - parent_post: the id of the parent post
* - state: Comment's state, must be one of the following: approved,
* unapproved, spam, killed
* @return
* Returns modified version.
*/
function create_post($thread_id, $message, $author_name, $author_email, $params=array()) {
$params['thread_id'] = $thread_id;
$params['message'] = $message;
$params['author_name'] = $author_name;
$params['author_email'] = $author_email;
return $this->call('create_post', $params, true);
}
/**
* Delete a comment or mark it as spam (or not spam).
*
* @param $post_id
* The Post ID.
* @param $action
* Name of action to be performed. Value can be 'spam', 'approve' or 'kill'.
* @return
* Returns modified version.
*/
function moderate_post($post_id, $action) {
$params = array(
'post_id' => $post_id,
'action' => $action,
);
return $this->call('moderate_post', $params, true);
}
}
?>
@@ -1,378 +1,378 @@
<?php
/*
***************************************************************************
* Copyright (C) 2007 by Cesar D. Rodas *
* crodas@phpy.org *
* *
* Permission is hereby granted, free of charge, to any person obtaining *
* a copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, sublicense, and/or sell copies of the Software, and to *
* permit persons to whom the Software is furnished to do so, subject to *
* the following conditions: *
* *
* The above copyright notice and this permission notice shall be *
* included in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR *
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
* OTHER DEALINGS IN THE SOFTWARE. *
***************************************************************************
*/
/**
* Serialize and Unserialize PHP Objects and array
* into JSON notation.
*
* @category Javascript
* @package JSON
* @author Cesar D. Rodas <crodas@phpy.org>
* @copyright 2007 Cesar D. Rodas
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version 1.0
* @link http://cesars.users.phpclasses.org/json
*/
define('IN_NOWHERE',0);
define('IN_STRING',1);
define('IN_OBJECT',2);
define('IN_ATOMIC',3);
define('IN_ASSIGN',4);
define('IN_ENDSTMT',5);
define('IN_ARRAY',6);
/**
* JSON
*
* This class serilize an PHP OBJECT or an ARRAY into JSON
* notation. Also convert a JSON text into a PHP OBJECT or
* array.
*
* @category Javascript
* @package JSON
* @author Cesar D. Rodas <crodas@phpy.org>
* @copyright 2007 Cesar D. Rodas
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version 1.0
* @link http://cesars.users.phpclasses.org/json
*/
class JSON
{
/**
* Was parsed with an error?
*
* var bool
* @access private
*/
var $error;
function Json() {
$this->error = false;
}
/**
* Serialize
*
* Serialize a PHP OBJECT or an ARRAY into
* JSON notation.
*
* param mixed $obj Object or array to serialize
* return string JSON.
*/
function serialize($obj) {
if ( is_object($obj) ) {
$e = get_object_vars($obj);
/* bug reported by Ben Rowe */
/* Adding default empty array if the */
/* object doesn't have any property */
$properties = array();
foreach ($e as $k => $v) {
$properties[] = $this->_serialize( $k,$v );
}
return "{".implode(",",$properties)."}";
} else if ( is_array($obj) ) {
return $this->_serialize('',$obj);
}
}
/**
* UnSerialize
*
* Transform an JSON text into a PHP object
* and return it.
* @access public
* @param string $text JSON text
* @return mixed PHP Object, array or false.
*/
function unserialize( $text ) {
$this->error = false;
return !$this->error ? $this->_unserialize($text) : false;
}
/**
* UnSerialize
*
* Transform an JSON text into a PHP object
* and return it.
* @access private
* @param string $text JSON text
* @return mixed PHP Object, array or false.
*/
function _unserialize($text) {
$ret = new stdClass;
while ( $f = $this->getNextToken($text,$i,$type) ) {
switch ( $type ) {
case IN_ARRAY:
$tmp = $this->_unserializeArray($text);
$ret = $tmp[0];
break;
case IN_OBJECT:
$g=0;
do {
$varName = $this->getNextToken($f,$g,$xType);
if ( $xType != IN_STRING ) {
return false; /* error parsing */
}
$this->getNextToken($f,$g,$xType);
if ( $xType != IN_ASSIGN) return false;
$value = $this->getNextToken($f,$g,$xType);
if ( $xType == IN_OBJECT) {
$ret->$varName = $this->unserialize( "{".$value."}" );
$g--;
} else if ($xType == IN_ARRAY) {
$ret->$varName = $this->_unserializeArray( $value);
$g--;
} else
$ret->$varName = $value;
$this->getNextToken($f,$g,$xType);
} while ( $xType == IN_ENDSTMT);
break;
default:
$this->error = true;
break 2;
}
}
return $ret;
}
/**
* JSON Array Parser
*
* This method transform an json-array into a PHP
* array
* @access private
* @param string $text String to parse
* @return Array PHP Array
*/
function _unserializeArray($text) {
$r = array();
do {
$f = $this->getNextToken($text,$i,$type);
switch ( $type ) {
case IN_STRING:
case IN_ATOMIC:
$r[] = $f;
break;
case IN_OBJECT:
$r[] = $this->unserialize("{".$f."}");
$i--;
break;
case IN_ARRAY:
$r[] = $this->_unserializeArray($f);
$i--;
break;
}
$this->getNextToken($text,$i,$type);
} while ( $type == IN_ENDSTMT);
return $r;
}
/**
* Tokenizer
*
* Return to the Parser the next valid token and the type
* of the token. If the tokenizer fails it returns false.
*
* @access private
* @param string $e Text to extract token
* @param integer $i Start position to search next token
* @param integer $state Variable to get the token type
* @return string|bool Token in string or false on error.
*/
function getNextToken($e, &$i, &$state) {
$state = IN_NOWHERE;
$end = -1;
$start = -1;
while ( $i < strlen($e) && $end == -1 ) {
switch( $e[$i] ) {
/* objects */
case "{":
case "[":
$_tag = $e[$i];
$_endtag = $_tag == "{" ? "}" : "]";
if ( $state == IN_NOWHERE ) {
$start = $i+1;
switch ($state) {
case IN_NOWHERE:
$aux = 1; /* for loop objects */
$state = $_tag == "{" ? IN_OBJECT : IN_ARRAY;
break;
default:
break 2; /* exit from switch and while */
}
while ( ++$i && $i < strlen($e) && $aux != 0 ) {
switch( $e[$i] ) {
case $_tag:
$aux++;
break;
case $_endtag:
$aux--;
break;
}
}
$end = $i-1;
}
break;
case '"':
case "'":
$state = IN_STRING;
$buf = "";
while ( ++$i && $i < strlen($e) && $e[$i] != '"' ) {
if ( $e[$i] == "\\")
$i++;
$buf .= $e[$i];
}
$i++;
return $buf;
break;
case ":":
$state = IN_ASSIGN;
$end = 1;
break;
case "n":
if ( substr($e,$i,4) == "null" ) {
$i=$i+4;
$state = IN_ATOMIC;
return NULL;
}
else break 2; /* exit from switch and while */
case "t":
if ( substr($e,$i,4) == "true") {
$state = IN_ATOMIC;
$i=$i+4;
return true;
}
else break 2; /* exit from switch and while */
break;
case "f":
if ( substr($e,$i,5) == "false") {
$state = IN_ATOMIC;
$i=$i+5;
return false;
}
else break 2; /* exit from switch and while */
break;
case ",":
$state = IN_ENDSTMT;
$end = 1;
break;
case " ":
case "\t":
case "\r":
case "\n":
break;
case "+":
case "-":
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case '.':
$state = IN_ATOMIC;
$start = (int)$i;
if ( $e[$i] == "-" || $e[$i] == "+")
$i++;
for ( ; $i < strlen($e) && (is_numeric($e[$i]) || $e[$i] == "." || strtolower($e[$i]) == "e") ;$i++){
$n = $i+1 < strlen($e) ? $e[$i+1] : "";
$a = strtolower($e[$i]);
if ( $a == "e" && ($n == "+" || $n == "-"))
$i++;
else if ( $a == "e")
$this->error=true;
}
$end = $i;
break 2; /* break while too */
default:
$this->error = true;
}
$i++;
}
return $start == -1 || $end == -1 ? false : substr($e, $start, $end - $start);
}
/**
* Internal Serializer
*
* @param string $key Variable name
* @param mixed $value Value of the variable
* @access private
* @return string Serialized variable
*/
function _serialize ( $key = '', &$value ) {
$r = '';
if ( $key != '')$r .= "\"${key}\" : ";
if ( is_numeric($value) ) {
$r .= ''.$value.'';
} else if ( is_string($value) ) {
$r .= '"'.$this->toString($value).'"';
} else if ( is_object($value) ) {
$r .= $this->serialize($value);
} else if ( is_null($value) ) {
$r .= "null";
} else if ( is_bool($value) ) {
$r .= $value ? "true":"false";
} else if ( is_array($value) ) {
foreach($value as $k => $v)
$f[] = $this->_serialize('',$v);
$r .= "[".implode(",",$f)."]";
unset($f);
}
return $r;
}
/**
* Convert String variables
*
* @param string $e Variable with an string value
* @access private
* @return string Serialized variable
*/
function toString($e) {
$rep = array("\\","\r","\n","\t","'",'"');
$val = array("\\\\",'\r','\n','\t','\'','\"');
$e = str_replace($rep, $val, $e);
return $e;
}
}
<?php
/*
***************************************************************************
* Copyright (C) 2007 by Cesar D. Rodas *
* crodas@phpy.org *
* *
* Permission is hereby granted, free of charge, to any person obtaining *
* a copy of this software and associated documentation files (the *
* "Software"), to deal in the Software without restriction, including *
* without limitation the rights to use, copy, modify, merge, publish, *
* distribute, sublicense, and/or sell copies of the Software, and to *
* permit persons to whom the Software is furnished to do so, subject to *
* the following conditions: *
* *
* The above copyright notice and this permission notice shall be *
* included in all copies or substantial portions of the Software. *
* *
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, *
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF *
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR *
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, *
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR *
* OTHER DEALINGS IN THE SOFTWARE. *
***************************************************************************
*/
/**
* Serialize and Unserialize PHP Objects and array
* into JSON notation.
*
* @category Javascript
* @package JSON
* @author Cesar D. Rodas <crodas@phpy.org>
* @copyright 2007 Cesar D. Rodas
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version 1.0
* @link http://cesars.users.phpclasses.org/json
*/
define('IN_NOWHERE',0);
define('IN_STRING',1);
define('IN_OBJECT',2);
define('IN_ATOMIC',3);
define('IN_ASSIGN',4);
define('IN_ENDSTMT',5);
define('IN_ARRAY',6);
/**
* JSON
*
* This class serilize an PHP OBJECT or an ARRAY into JSON
* notation. Also convert a JSON text into a PHP OBJECT or
* array.
*
* @category Javascript
* @package JSON
* @author Cesar D. Rodas <crodas@phpy.org>
* @copyright 2007 Cesar D. Rodas
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @version 1.0
* @link http://cesars.users.phpclasses.org/json
*/
class JSON
{
/**
* Was parsed with an error?
*
* var bool
* @access private
*/
var $error;
function Json() {
$this->error = false;
}
/**
* Serialize
*
* Serialize a PHP OBJECT or an ARRAY into
* JSON notation.
*
* param mixed $obj Object or array to serialize
* return string JSON.
*/
function serialize($obj) {
if ( is_object($obj) ) {
$e = get_object_vars($obj);
/* bug reported by Ben Rowe */
/* Adding default empty array if the */
/* object doesn't have any property */
$properties = array();
foreach ($e as $k => $v) {
$properties[] = $this->_serialize( $k,$v );
}
return "{".implode(",",$properties)."}";
} else if ( is_array($obj) ) {
return $this->_serialize('',$obj);
}
}
/**
* UnSerialize
*
* Transform an JSON text into a PHP object
* and return it.
* @access public
* @param string $text JSON text
* @return mixed PHP Object, array or false.
*/
function unserialize( $text ) {
$this->error = false;
return !$this->error ? $this->_unserialize($text) : false;
}
/**
* UnSerialize
*
* Transform an JSON text into a PHP object
* and return it.
* @access private
* @param string $text JSON text
* @return mixed PHP Object, array or false.
*/
function _unserialize($text) {
$ret = new stdClass;
while ( $f = $this->getNextToken($text,$i,$type) ) {
switch ( $type ) {
case IN_ARRAY:
$tmp = $this->_unserializeArray($text);
$ret = $tmp[0];
break;
case IN_OBJECT:
$g=0;
do {
$varName = $this->getNextToken($f,$g,$xType);
if ( $xType != IN_STRING ) {
return false; /* error parsing */
}
$this->getNextToken($f,$g,$xType);
if ( $xType != IN_ASSIGN) return false;
$value = $this->getNextToken($f,$g,$xType);
if ( $xType == IN_OBJECT) {
$ret->$varName = $this->unserialize( "{".$value."}" );
$g--;
} else if ($xType == IN_ARRAY) {
$ret->$varName = $this->_unserializeArray( $value);
$g--;
} else
$ret->$varName = $value;
$this->getNextToken($f,$g,$xType);
} while ( $xType == IN_ENDSTMT);
break;
default:
$this->error = true;
break 2;
}
}
return $ret;
}
/**
* JSON Array Parser
*
* This method transform an json-array into a PHP
* array
* @access private
* @param string $text String to parse
* @return Array PHP Array
*/
function _unserializeArray($text) {
$r = array();
do {
$f = $this->getNextToken($text,$i,$type);
switch ( $type ) {
case IN_STRING:
case IN_ATOMIC:
$r[] = $f;
break;
case IN_OBJECT:
$r[] = $this->unserialize("{".$f."}");
$i--;
break;
case IN_ARRAY:
$r[] = $this->_unserializeArray($f);
$i--;
break;
}
$this->getNextToken($text,$i,$type);
} while ( $type == IN_ENDSTMT);
return $r;
}
/**
* Tokenizer
*
* Return to the Parser the next valid token and the type
* of the token. If the tokenizer fails it returns false.
*
* @access private
* @param string $e Text to extract token
* @param integer $i Start position to search next token
* @param integer $state Variable to get the token type
* @return string|bool Token in string or false on error.
*/
function getNextToken($e, &$i, &$state) {
$state = IN_NOWHERE;
$end = -1;
$start = -1;
while ( $i < strlen($e) && $end == -1 ) {
switch( $e[$i] ) {
/* objects */
case "{":
case "[":
$_tag = $e[$i];
$_endtag = $_tag == "{" ? "}" : "]";
if ( $state == IN_NOWHERE ) {
$start = $i+1;
switch ($state) {
case IN_NOWHERE:
$aux = 1; /* for loop objects */
$state = $_tag == "{" ? IN_OBJECT : IN_ARRAY;
break;
default:
break 2; /* exit from switch and while */
}
while ( ++$i && $i < strlen($e) && $aux != 0 ) {
switch( $e[$i] ) {
case $_tag:
$aux++;
break;
case $_endtag:
$aux--;
break;
}
}
$end = $i-1;
}
break;
case '"':
case "'":
$state = IN_STRING;
$buf = "";
while ( ++$i && $i < strlen($e) && $e[$i] != '"' ) {
if ( $e[$i] == "\\")
$i++;
$buf .= $e[$i];
}
$i++;
return $buf;
break;
case ":":
$state = IN_ASSIGN;
$end = 1;
break;
case "n":
if ( substr($e,$i,4) == "null" ) {
$i=$i+4;
$state = IN_ATOMIC;
return NULL;
}
else break 2; /* exit from switch and while */
case "t":
if ( substr($e,$i,4) == "true") {
$state = IN_ATOMIC;
$i=$i+4;
return true;
}
else break 2; /* exit from switch and while */
break;
case "f":
if ( substr($e,$i,5) == "false") {
$state = IN_ATOMIC;
$i=$i+5;
return false;
}
else break 2; /* exit from switch and while */
break;
case ",":
$state = IN_ENDSTMT;
$end = 1;
break;
case " ":
case "\t":
case "\r":
case "\n":
break;
case "+":
case "-":
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case '.':
$state = IN_ATOMIC;
$start = (int)$i;
if ( $e[$i] == "-" || $e[$i] == "+")
$i++;
for ( ; $i < strlen($e) && (is_numeric($e[$i]) || $e[$i] == "." || strtolower($e[$i]) == "e") ;$i++){
$n = $i+1 < strlen($e) ? $e[$i+1] : "";
$a = strtolower($e[$i]);
if ( $a == "e" && ($n == "+" || $n == "-"))
$i++;
else if ( $a == "e")
$this->error=true;
}
$end = $i;
break 2; /* break while too */
default:
$this->error = true;
}
$i++;
}
return $start == -1 || $end == -1 ? false : substr($e, $start, $end - $start);
}
/**
* Internal Serializer
*
* @param string $key Variable name
* @param mixed $value Value of the variable
* @access private
* @return string Serialized variable
*/
function _serialize ( $key = '', &$value ) {
$r = '';
if ( $key != '')$r .= "\"${key}\" : ";
if ( is_numeric($value) ) {
$r .= ''.$value.'';
} else if ( is_string($value) ) {
$r .= '"'.$this->toString($value).'"';
} else if ( is_object($value) ) {
$r .= $this->serialize($value);
} else if ( is_null($value) ) {
$r .= "null";
} else if ( is_bool($value) ) {
$r .= $value ? "true":"false";
} else if ( is_array($value) ) {
foreach($value as $k => $v)
$f[] = $this->_serialize('',$v);
$r .= "[".implode(",",$f)."]";
unset($f);
}
return $r;
}
/**
* Convert String variables
*
* @param string $e Variable with an string value
* @access private
* @return string Serialized variable
*/
function toString($e) {
$rep = array("\\","\r","\n","\t","'",'"');
$val = array("\\\\",'\r','\n','\t','\'','\"');
$e = str_replace($rep, $val, $e);
return $e;
}
}
?>
@@ -1,295 +1,295 @@
<?php
define('USER_AGENT', 'Disqus-WPPlugin/2.0-dev');
define('SOCKET_TIMEOUT', 10);
function dsq_get_query_string($postdata) {
$postdata_str = '';
if($postdata) {
foreach($postdata as $key=>$value) {
$postdata_str .= urlencode($key) . '=' . urlencode($value) . '&';
}
}
return $postdata_str;
}
function dsq_get_post_content($boundary, $postdata, $file_name, $file_field) {
if(empty($file_name) || empty($file_field)) {
return dsq_get_query_string($postdata);
}
$content = array();
$content[] = '--' . $boundary;
foreach($postdata as $key=>$value) {
$content[] = 'Content-Disposition: form-data; name="' . $key . '"' . "\r\n\r\n" . $value;
$content[] = '--' . $boundary;
}
$content[] = 'Content-Disposition: form-data; name="' . $file_field . '"; filename="' . $file_name . '"';
// HACK: We only need to handle text/plain files right now.
$content[] = "Content-Type: text/plain\r\n";
$content[] = file_get_contents($file_name);
$content[] = '--' . $boundary . '--';
$content = implode("\r\n", $content);
return $content;
}
function dsq_get_http_headers_for_request($boundary, $content, $file_name, $file_field) {
$headers = array();
$headers[] = 'User-Agent: ' . USER_AGENT;
$headers[] = 'Connection: close';
if($content) {
$headers[] = 'Content-Length: ' . strlen($content);
if($file_name && $file_field) {
$headers[] = 'Content-Type: multipart/form-data; boundary=' . $boundary;
} else {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
}
}
return implode("\r\n", $headers);
}
function _dsq_curl_urlopen($url, $postdata, &$response, $file_name, $file_field) {
$c = curl_init($url);
$postdata_str = dsq_get_query_string($postdata);
$c_options = array(
CURLOPT_USERAGENT => USER_AGENT,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => ($postdata_str ? 1 : 0),
CURLOPT_HEADER => true,
CURLOPT_HTTPHEADER => array('Expect:'),
CURLOPT_TIMEOUT => SOCKET_TIMEOUT
);
if($postdata) {
$c_options[CURLOPT_POSTFIELDS] = $postdata_str;
}
if($file_name && $file_field) {
$postdata[$file_field] = '@' . $file_name;
$c_options[CURLOPT_POSTFIELDS] = $postdata;
$c_options[CURLOPT_RETURNTRANSFER] = 1;
}
curl_setopt_array($c, $c_options);
$data = curl_exec($c);
list($headers, $response['data']) = explode("\r\n\r\n", $data, 2);
$response['headers'] = _dsq_get_response_headers($headers, $response);
$response['code'] = curl_getinfo($c, CURLINFO_HTTP_CODE);
}
function _dsq_get_response_headers($headers, &$response) {
$headers = explode("\r\n", $headers);
list($unused, $response['code'], $unused) = explode(' ', $headers[0], 3);
$headers = array_slice($headers, 1);
// Convert headers into associative array.
foreach($headers as $unused=>$header) {
$header = explode(':', $header);
$header[0] = trim($header[0]);
$header[1] = trim($header[1]);
$headers[strtolower($header[0])] = $header[1];
}
return $headers;
}
function _dsq_fsockopen_urlopen($url, $postdata, &$response, $file_name, $file_field) {
$buf = '';
$req = '';
$length = 0;
$boundary = '----------' . md5(time());
$postdata_str = dsq_get_post_content($boundary, $postdata, $file_name, $file_field);
$url_pieces = parse_url($url);
// Set default port for supported schemes if none is provided.
if(!isset($url_pieces['port'])) {
switch($url_pieces['scheme']) {
case 'http':
$url_pieces['port'] = 80;
break;
case 'https':
$url_pieces['port'] = 443;
$url_pieces['host'] = 'ssl://' . $url_pieces['host'];
break;
}
}
// Set default path if trailing slash is not provided.
if(!isset($url_pieces['path'])) { $url_pieces['path'] = '/'; }
// Determine if we need to include the port in the Host header or not.
if(($url_pieces['port'] == 80 && $url_pieces['scheme'] == 'http') ||
($url_pieces['port'] == 443 && $url_pieces['scheme'] == 'https')) {
$host = $url_pieces['host'];
} else {
$host = $url_pieces['host'] . ':' . $url_pieces['port'];
}
$fp = @fsockopen($url_pieces['host'], $url_pieces['port'], $errno, $errstr, SOCKET_TIMEOUT);
if(!$fp) { return false; }
$path = $url_pieces['path'];
if ($url_pieces['query']) $path .= '?'.$url_pieces['query'];
$req .= ($postdata_str ? 'POST' : 'GET') . ' ' . $path . " HTTP/1.1\r\n";
$req .= 'Host: ' . $host . "\r\n";
$req .= dsq_get_http_headers_for_request($boundary, $postdata_str, $file_name, $file_field);
if($postdata_str) {
$req .= "\r\n\r\n" . $postdata_str;
}
$req .= "\r\n\r\n";
fwrite($fp, $req);
while(!feof($fp)) {
$buf .= fgets($fp, 4096);
}
// Parse headers from the response buffers.
list($headers, $response['data']) = explode("\r\n\r\n", $buf, 2);
// Get status code from headers.
$headers = _dsq_get_response_headers($headers, $response);
// If transfer-coding is set to chunked, we need to join the message body
// together.
if(isset($headers['transfer-encoding']) && 'chunked' == strtolower($headers['transfer-encoding'])) {
$chunk_data = $response['data'];
$joined_data = '';
while(true) {
// Strip length from body.
list($chunk_length, $chunk_data) = explode("\r\n", $chunk_data, 2);
$chunk_length = hexdec($chunk_length);
if(!$chunk_length || !strlen($chunk_data)) { break; }
$joined_data .= substr($chunk_data, 0, $chunk_length);
$chunk_data = substr($chunk_data, $chunk_length + 1);
$length += $chunk_length;
}
$response['data'] = $joined_data;
} else {
$length = $headers['content-length'];
}
$response['headers'] = $headers;
}
function _dsq_fopen_urlopen($url, $postdata, &$response, $file_name, $file_field) {
$params = array();
if($file_name && $file_field) {
$boundary = '----------' . md5(time());
$content = dsq_get_post_content($boundary, $postdata, $file_name, $file_field);
$header = dsq_get_http_headers_for_request($boundary, $content, $file_name, $file_field);
$params = array('http' => array(
'method' => 'POST',
'header' => $header,
'content' => $content,
'timeout' => SOCKET_TIMEOUT
));
} else {
if($postdata) {
$params = array('http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => dsq_get_query_string($postdata),
'timeout' => SOCKET_TIMEOUT
));
}
}
ini_set('user_agent', USER_AGENT);
$ctx = stream_context_create($params);
$fp = fopen($url, 'rb', false, $ctx);
if(!$fp) {
return false;
}
// Get status code from headers.
list($unused, $response['code'], $unused) = explode(' ', $http_response_header[0], 3);
$headers = array_slice($http_response_header, 1);
// Convert headers into associative array.
foreach($headers as $unused=>$header) {
$header = explode(':', $header);
$header[0] = trim($header[0]);
$header[1] = trim($header[1]);
$headers[strtolower($header[0])] = strtolower($header[1]);
}
$response['data'] = stream_get_contents($fp);
$response['headers'] = $headers;
}
/**
* Wrapper to provide a single interface for making an HTTP request.
*
* Attempts to use cURL, fopen(), or fsockopen(), whichever is available
* first.
*
* @param string $url URL to make request to.
* @param array $postdata (optional) If postdata is provided, the request
* method is POST with the key/value pairs as
* the data.
* @param array $file (optional) Should provide associative array
* with two keys: name and field. Name should
* be the name of the file and field is the name
* of the field to POST.
*/
function dsq_urlopen($url, $postdata=false, $file=false) {
$response = array(
'data' => '',
'code' => 0
);
if($file) {
extract($file, EXTR_PREFIX_ALL, 'file');
}
if(empty($file_name) || empty($file_field)) {
$file_name = false;
$file_field = false;
}
//
// Try curl, fsockopen, fopen + stream (PHP5 only), exec wget
if(function_exists('curl_init')) {
if (!function_exists('curl_setopt_array')) {
function curl_setopt_array(&$ch, $curl_options)
{
foreach ($curl_options as $option => $value) {
if (!curl_setopt($ch, $option, $value)) {
return false;
}
}
return true;
}
}
_dsq_curl_urlopen($url, $postdata, $response, $file_name, $file_field);
} else if(ini_get('allow_url_fopen') && function_exists('stream_get_contents')) {
_dsq_fopen_urlopen($url, $postdata, $response, $file_name, $file_field);
} else {
// TODO: Find the failure condition for fsockopen() (sockets?)
_dsq_fsockopen_urlopen($url, $postdata, $response, $file_name, $file_field);
}
// returns array with keys data and code (from headers)
return $response;
}
function dsq_url_method() {
if(function_exists('curl_init')) {
return 'curl';
} else if(ini_get('allow_url_fopen') && function_exists('stream_get_contents')) {
return 'fopen';
} else {
return 'fsockopen';
}
}
?>
<?php
define('USER_AGENT', 'Disqus-WPPlugin/2.0-dev');
define('SOCKET_TIMEOUT', 10);
function dsq_get_query_string($postdata) {
$postdata_str = '';
if($postdata) {
foreach($postdata as $key=>$value) {
$postdata_str .= urlencode($key) . '=' . urlencode($value) . '&';
}
}
return $postdata_str;
}
function dsq_get_post_content($boundary, $postdata, $file_name, $file_field) {
if(empty($file_name) || empty($file_field)) {
return dsq_get_query_string($postdata);
}
$content = array();
$content[] = '--' . $boundary;
foreach($postdata as $key=>$value) {
$content[] = 'Content-Disposition: form-data; name="' . $key . '"' . "\r\n\r\n" . $value;
$content[] = '--' . $boundary;
}
$content[] = 'Content-Disposition: form-data; name="' . $file_field . '"; filename="' . $file_name . '"';
// HACK: We only need to handle text/plain files right now.
$content[] = "Content-Type: text/plain\r\n";
$content[] = file_get_contents($file_name);
$content[] = '--' . $boundary . '--';
$content = implode("\r\n", $content);
return $content;
}
function dsq_get_http_headers_for_request($boundary, $content, $file_name, $file_field) {
$headers = array();
$headers[] = 'User-Agent: ' . USER_AGENT;
$headers[] = 'Connection: close';
if($content) {
$headers[] = 'Content-Length: ' . strlen($content);
if($file_name && $file_field) {
$headers[] = 'Content-Type: multipart/form-data; boundary=' . $boundary;
} else {
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
}
}
return implode("\r\n", $headers);
}
function _dsq_curl_urlopen($url, $postdata, &$response, $file_name, $file_field) {
$c = curl_init($url);
$postdata_str = dsq_get_query_string($postdata);
$c_options = array(
CURLOPT_USERAGENT => USER_AGENT,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => ($postdata_str ? 1 : 0),
CURLOPT_HEADER => true,
CURLOPT_HTTPHEADER => array('Expect:'),
CURLOPT_TIMEOUT => SOCKET_TIMEOUT
);
if($postdata) {
$c_options[CURLOPT_POSTFIELDS] = $postdata_str;
}
if($file_name && $file_field) {
$postdata[$file_field] = '@' . $file_name;
$c_options[CURLOPT_POSTFIELDS] = $postdata;
$c_options[CURLOPT_RETURNTRANSFER] = 1;
}
curl_setopt_array($c, $c_options);
$data = curl_exec($c);
list($headers, $response['data']) = explode("\r\n\r\n", $data, 2);
$response['headers'] = _dsq_get_response_headers($headers, $response);
$response['code'] = curl_getinfo($c, CURLINFO_HTTP_CODE);
}
function _dsq_get_response_headers($headers, &$response) {
$headers = explode("\r\n", $headers);
list($unused, $response['code'], $unused) = explode(' ', $headers[0], 3);
$headers = array_slice($headers, 1);
// Convert headers into associative array.
foreach($headers as $unused=>$header) {
$header = explode(':', $header);
$header[0] = trim($header[0]);
$header[1] = trim($header[1]);
$headers[strtolower($header[0])] = $header[1];
}
return $headers;
}
function _dsq_fsockopen_urlopen($url, $postdata, &$response, $file_name, $file_field) {
$buf = '';
$req = '';
$length = 0;
$boundary = '----------' . md5(time());
$postdata_str = dsq_get_post_content($boundary, $postdata, $file_name, $file_field);
$url_pieces = parse_url($url);
// Set default port for supported schemes if none is provided.
if(!isset($url_pieces['port'])) {
switch($url_pieces['scheme']) {
case 'http':
$url_pieces['port'] = 80;
break;
case 'https':
$url_pieces['port'] = 443;
$url_pieces['host'] = 'ssl://' . $url_pieces['host'];
break;
}
}
// Set default path if trailing slash is not provided.
if(!isset($url_pieces['path'])) { $url_pieces['path'] = '/'; }
// Determine if we need to include the port in the Host header or not.
if(($url_pieces['port'] == 80 && $url_pieces['scheme'] == 'http') ||
($url_pieces['port'] == 443 && $url_pieces['scheme'] == 'https')) {
$host = $url_pieces['host'];
} else {
$host = $url_pieces['host'] . ':' . $url_pieces['port'];
}
$fp = @fsockopen($url_pieces['host'], $url_pieces['port'], $errno, $errstr, SOCKET_TIMEOUT);
if(!$fp) { return false; }
$path = $url_pieces['path'];
if ($url_pieces['query']) $path .= '?'.$url_pieces['query'];
$req .= ($postdata_str ? 'POST' : 'GET') . ' ' . $path . " HTTP/1.1\r\n";
$req .= 'Host: ' . $host . "\r\n";
$req .= dsq_get_http_headers_for_request($boundary, $postdata_str, $file_name, $file_field);
if($postdata_str) {
$req .= "\r\n\r\n" . $postdata_str;
}
$req .= "\r\n\r\n";
fwrite($fp, $req);
while(!feof($fp)) {
$buf .= fgets($fp, 4096);
}
// Parse headers from the response buffers.
list($headers, $response['data']) = explode("\r\n\r\n", $buf, 2);
// Get status code from headers.
$headers = _dsq_get_response_headers($headers, $response);
// If transfer-coding is set to chunked, we need to join the message body
// together.
if(isset($headers['transfer-encoding']) && 'chunked' == strtolower($headers['transfer-encoding'])) {
$chunk_data = $response['data'];
$joined_data = '';
while(true) {
// Strip length from body.
list($chunk_length, $chunk_data) = explode("\r\n", $chunk_data, 2);
$chunk_length = hexdec($chunk_length);
if(!$chunk_length || !strlen($chunk_data)) { break; }
$joined_data .= substr($chunk_data, 0, $chunk_length);
$chunk_data = substr($chunk_data, $chunk_length + 1);
$length += $chunk_length;
}
$response['data'] = $joined_data;
} else {
$length = $headers['content-length'];
}
$response['headers'] = $headers;
}
function _dsq_fopen_urlopen($url, $postdata, &$response, $file_name, $file_field) {
$params = array();
if($file_name && $file_field) {
$boundary = '----------' . md5(time());
$content = dsq_get_post_content($boundary, $postdata, $file_name, $file_field);
$header = dsq_get_http_headers_for_request($boundary, $content, $file_name, $file_field);
$params = array('http' => array(
'method' => 'POST',
'header' => $header,
'content' => $content,
'timeout' => SOCKET_TIMEOUT
));
} else {
if($postdata) {
$params = array('http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded',
'content' => dsq_get_query_string($postdata),
'timeout' => SOCKET_TIMEOUT
));
}
}
ini_set('user_agent', USER_AGENT);
$ctx = stream_context_create($params);
$fp = fopen($url, 'rb', false, $ctx);
if(!$fp) {
return false;
}
// Get status code from headers.
list($unused, $response['code'], $unused) = explode(' ', $http_response_header[0], 3);
$headers = array_slice($http_response_header, 1);
// Convert headers into associative array.
foreach($headers as $unused=>$header) {
$header = explode(':', $header);
$header[0] = trim($header[0]);
$header[1] = trim($header[1]);
$headers[strtolower($header[0])] = strtolower($header[1]);
}
$response['data'] = stream_get_contents($fp);
$response['headers'] = $headers;
}
/**
* Wrapper to provide a single interface for making an HTTP request.
*
* Attempts to use cURL, fopen(), or fsockopen(), whichever is available
* first.
*
* @param string $url URL to make request to.
* @param array $postdata (optional) If postdata is provided, the request
* method is POST with the key/value pairs as
* the data.
* @param array $file (optional) Should provide associative array
* with two keys: name and field. Name should
* be the name of the file and field is the name
* of the field to POST.
*/
function dsq_urlopen($url, $postdata=false, $file=false) {
$response = array(
'data' => '',
'code' => 0
);
if($file) {
extract($file, EXTR_PREFIX_ALL, 'file');
}
if(empty($file_name) || empty($file_field)) {
$file_name = false;
$file_field = false;
}
//
// Try curl, fsockopen, fopen + stream (PHP5 only), exec wget
if(function_exists('curl_init')) {
if (!function_exists('curl_setopt_array')) {
function curl_setopt_array(&$ch, $curl_options)
{
foreach ($curl_options as $option => $value) {
if (!curl_setopt($ch, $option, $value)) {
return false;
}
}
return true;
}
}
_dsq_curl_urlopen($url, $postdata, $response, $file_name, $file_field);
} else if(ini_get('allow_url_fopen') && function_exists('stream_get_contents')) {
_dsq_fopen_urlopen($url, $postdata, $response, $file_name, $file_field);
} else {
// TODO: Find the failure condition for fsockopen() (sockets?)
_dsq_fsockopen_urlopen($url, $postdata, $response, $file_name, $file_field);
}
// returns array with keys data and code (from headers)
return $response;
}
function dsq_url_method() {
if(function_exists('curl_init')) {
return 'curl';
} else if(ini_get('allow_url_fopen') && function_exists('stream_get_contents')) {
return 'fopen';
} else {
return 'fsockopen';
}
}
?>
@@ -1,107 +1,107 @@
<?php
/**
* Implementation of the Disqus API designed for WordPress.
*
* @author Disqus <team@disqus.com>
* @copyright 2007-2010 Big Head Labs
* @link http://disqus.com/
* @package Disqus
* @subpackage DisqusWordPressAPI
* @version 2.0
*/
require_once(ABSPATH.WPINC.'/http.php');
require_once(dirname(__FILE__) . '/api/disqus/disqus.php');
/** @#+
* Constants
*/
/**
* Base URL for Disqus.
*/
define('DISQUS_ALLOWED_HTML', '<b><u><i><h1><h2><h3><code><blockquote><br><hr>');
/**
* Helper methods for all of the Disqus v2 API methods.
*
* @package Disqus
* @subpackage DisqusWordPressAPI
* @author DISQUS.com <team@disqus.com>
* @copyright 2007-2008 Big Head Labs
* @version 1.0
*/
class DisqusWordPressAPI {
var $short_name;
var $forum_api_key;
function DisqusWordPressAPI($short_name=null, $forum_api_key=null, $user_api_key=null) {
$this->short_name = $short_name;
$this->forum_api_key = $forum_api_key;
$this->user_api_key = $user_api_key;
$this->api = new DisqusAPI($user_api_key, $forum_api_key, DISQUS_API_URL);
}
function get_last_error() {
return $this->api->get_last_error();
}
function get_user_api_key($username, $password) {
$response = $this->api->call('get_user_api_key', array(
'username' => $username,
'password' => $password,
), true);
return $response;
}
function get_forum_list($user_api_key) {
$this->api->user_api_key = $user_api_key;
return $this->api->get_forum_list();
}
function get_forum_api_key($user_api_key, $id) {
$this->api->user_api_key = $user_api_key;
return $this->api->get_forum_api_key($id);
}
function get_forum_posts($start_id=0) {
$response = $this->api->get_forum_posts(null, array(
'filter' => 'approved',
'start_id' => $start_id,
'limit' => 100,
'order' => 'asc',
'full_info' => 1
));
return $response;
}
function import_wordpress_comments(&$wxr, $timestamp, $eof=true) {
$http = new WP_Http();
$response = $http->request(
DISQUS_IMPORTER_URL . 'api/import-wordpress-comments/',
array(
'method' => 'POST',
'timeout' => 60,
'body' => array(
'forum_url' => $this->short_name,
'forum_api_key' => $this->forum_api_key,
'response_type' => 'php',
'wxr' => $wxr,
'timestamp' => $timestamp,
'eof' => (int)$eof
),
)
);
if ($response->errors) {
// hack
$this->api->last_error = $response->errors;
return -1;
}
$data = unserialize($response['body']);
if (!$data || $data['stat'] == 'fail') {
return -1;
}
return $data;
}
}
?>
<?php
/**
* Implementation of the Disqus API designed for WordPress.
*
* @author Disqus <team@disqus.com>
* @copyright 2007-2010 Big Head Labs
* @link http://disqus.com/
* @package Disqus
* @subpackage DisqusWordPressAPI
* @version 2.0
*/
require_once(ABSPATH.WPINC.'/http.php');
require_once(dirname(__FILE__) . '/api/disqus/disqus.php');
/** @#+
* Constants
*/
/**
* Base URL for Disqus.
*/
define('DISQUS_ALLOWED_HTML', '<b><u><i><h1><h2><h3><code><blockquote><br><hr>');
/**
* Helper methods for all of the Disqus v2 API methods.
*
* @package Disqus
* @subpackage DisqusWordPressAPI
* @author DISQUS.com <team@disqus.com>
* @copyright 2007-2008 Big Head Labs
* @version 1.0
*/
class DisqusWordPressAPI {
var $short_name;
var $forum_api_key;
function DisqusWordPressAPI($short_name=null, $forum_api_key=null, $user_api_key=null) {
$this->short_name = $short_name;
$this->forum_api_key = $forum_api_key;
$this->user_api_key = $user_api_key;
$this->api = new DisqusAPI($user_api_key, $forum_api_key, DISQUS_API_URL);
}
function get_last_error() {
return $this->api->get_last_error();
}
function get_user_api_key($username, $password) {
$response = $this->api->call('get_user_api_key', array(
'username' => $username,
'password' => $password,
), true);
return $response;
}
function get_forum_list($user_api_key) {
$this->api->user_api_key = $user_api_key;
return $this->api->get_forum_list();
}
function get_forum_api_key($user_api_key, $id) {
$this->api->user_api_key = $user_api_key;
return $this->api->get_forum_api_key($id);
}
function get_forum_posts($start_id=0) {
$response = $this->api->get_forum_posts(null, array(
'filter' => 'approved',
'start_id' => $start_id,
'limit' => 100,
'order' => 'asc',
'full_info' => 1
));
return $response;
}
function import_wordpress_comments(&$wxr, $timestamp, $eof=true) {
$http = new WP_Http();
$response = $http->request(
DISQUS_IMPORTER_URL . 'api/import-wordpress-comments/',
array(
'method' => 'POST',
'timeout' => 60,
'body' => array(
'forum_url' => $this->short_name,
'forum_api_key' => $this->forum_api_key,
'response_type' => 'php',
'wxr' => $wxr,
'timestamp' => $timestamp,
'eof' => (int)$eof
),
)
);
if ($response['response']['code'] !== 200) {
// hack
$this->api->last_error = $response->errors;
return -1;
}
$data = unserialize($response['body']);
if (!$data || $data['stat'] == 'fail') {
return -1;
}
return $data;
}
}
?>
@@ -1,88 +1,88 @@
<?php
/**
* Helper script for setting up the WP command line environment
*/
error_reporting(E_ALL | E_STRICT);
if (php_sapi_name() != 'cli' && !empty($_SERVER['REMOTE_ADDR'])) {
// Don't execute for web requests
die("This script must be run from CLI.");
}
if (!isset($argv)) {
$argv = array();
}
function print_line() {
$args = func_get_args();
$result = call_user_func_array('sprintf', $args);
print("{$result}\n");
}
define('DOING_AJAX', true);
define('WP_USE_THEMES', false);
if (isset($_ENV['WORDPRESS_PATH'])) {
define('ABSPATH', $_ENV['WORDPRESS_PATH']);
} else {
if (substr($_SERVER['SCRIPT_FILENAME'], 0, 1) != '/') {
$script_path = $_SERVER['PWD'] . $_SERVER['SCRIPT_FILENAME'];
} else {
$script_path = $_SERVER['SCRIPT_FILENAME'];
}
$tree = '';
$paths = array();
$chunks = explode('/', dirname($script_path));
foreach ($chunks as $chunk) {
if (!$chunk) continue;
$tree = $tree.'/'.$chunk;
array_push($paths, $tree);
}
$paths = array_reverse($paths);
foreach ($paths as $path) {
if (is_file($path.'/wp-config.php')) {
define('ABSPATH', $path . '/');
break;
}
}
}
if (!defined('ABSPATH')) {
print_line("Unable to determine wordpress path. Please set it using WORDPRESS_PATH.");
die();
}
$_SERVER = array(
"HTTP_HOST" => "disqus.com",
"SCRIPT_NAME" => "",
"PHP_SELF" => __FILE__,
"SERVER_NAME" => "localhost",
"REQUEST_URI" => "/",
"REQUEST_METHOD" => "GET"
);
require_once(ABSPATH . 'wp-config.php');
// swap out the object cache due to memory constraints
global $wp_object_cache;
class DummyWP_Object_Cache extends WP_Object_Cache {
function set($id, $data, $group = 'default', $expire = '') {
return;
}
function delete($id, $group = 'default', $force = false) {
return;
}
function add($id, $data, $group = 'default', $expire = '') {
return;
}
}
// HACK: kill all output buffers (some plugins, like Hyper Cache, use theses)
while (@ob_end_flush());
// We cant simply replace the object cache incase set/add do something that
// matters to the webserver
// $wp_object_cache = new DummyWP_Object_Cache();
?>
<?php
/**
* Helper script for setting up the WP command line environment
*/
error_reporting(E_ALL | E_STRICT);
if (php_sapi_name() != 'cli' && !empty($_SERVER['REMOTE_ADDR'])) {
// Don't execute for web requests
die("This script must be run from CLI.");
}
if (!isset($argv)) {
$argv = array();
}
function print_line() {
$args = func_get_args();
$result = call_user_func_array('sprintf', $args);
print("{$result}\n");
}
define('DOING_AJAX', true);
define('WP_USE_THEMES', false);
if (isset($_ENV['WORDPRESS_PATH'])) {
define('ABSPATH', $_ENV['WORDPRESS_PATH']);
} else {
if (substr($_SERVER['SCRIPT_FILENAME'], 0, 1) != '/') {
$script_path = $_SERVER['PWD'] . $_SERVER['SCRIPT_FILENAME'];
} else {
$script_path = $_SERVER['SCRIPT_FILENAME'];
}
$tree = '';
$paths = array();
$chunks = explode('/', dirname($script_path));
foreach ($chunks as $chunk) {
if (!$chunk) continue;
$tree = $tree.'/'.$chunk;
array_push($paths, $tree);
}
$paths = array_reverse($paths);
foreach ($paths as $path) {
if (is_file($path.'/wp-config.php')) {
define('ABSPATH', $path . '/');
break;
}
}
}
if (!defined('ABSPATH')) {
print_line("Unable to determine wordpress path. Please set it using WORDPRESS_PATH.");
die();
}
$_SERVER = array(
"HTTP_HOST" => "disqus.com",
"SCRIPT_NAME" => "",
"PHP_SELF" => __FILE__,
"SERVER_NAME" => "localhost",
"REQUEST_URI" => "/",
"REQUEST_METHOD" => "GET"
);
require_once(ABSPATH . 'wp-config.php');
// swap out the object cache due to memory constraints
global $wp_object_cache;
class DummyWP_Object_Cache extends WP_Object_Cache {
function set($id, $data, $group = 'default', $expire = '') {
return;
}
function delete($id, $group = 'default', $force = false) {
return;
}
function add($id, $data, $group = 'default', $expire = '') {
return;
}
}
// HACK: kill all output buffers (some plugins, like Hyper Cache, use theses)
while (@ob_end_flush());
// We cant simply replace the object cache incase set/add do something that
// matters to the webserver
// $wp_object_cache = new DummyWP_Object_Cache();
?>
@@ -2,418 +2,483 @@ msgid ""
msgstr ""
"Project-Id-Version: disqus-wordpress\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-06-23 16:22-0800\n"
"PO-Revision-Date: 2014-06-23 16:23-0800\n"
"Last-Translator: Ryan Valentin <ryan@disqus.com>\n"
"Language-Team: DISQUS <translation@disqus.com>\n"
"POT-Creation-Date: 2014-11-10 11:06-0800\n"
"PO-Revision-Date: 2014-11-10 11:07-0800\n"
"Last-Translator: Ryan <ryan@disqus.com>\n"
"Language-Team: Disqus <translation@disqus.com>\n"
"Language: en_US\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Poedit-KeywordsList: _;gettext;gettext_noop;dsq_i;__;_e\n"
"X-Poedit-Basepath: ../\n"
"X-Generator: Poedit 1.6.5\n"
"X-Generator: Poedit 1.6.10\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-SearchPath-0: ..\n"
#: ../disqus/comments.php:18 ../disqus/comments.php:34
msgid "<span class=\"meta-nav\">&larr;</span> Older Comments"
#: ../disqus/comments.php:15 ../disqus/comments.php:37
msgid "Older Comments"
msgstr ""
#: ../disqus/comments.php:19 ../disqus/comments.php:35
msgid "Newer Comments <span class=\"meta-nav\">&rarr;</span>"
#: ../disqus/comments.php:18 ../disqus/comments.php:40
msgid "Newer Comments"
msgstr ""
#: ../disqus/disqus.php:442
#: ../disqus/disqus.php:178
msgid "Disqus needs to be configured"
msgstr ""
#: ../disqus/disqus.php:179
msgid "Configure Disqus by clicking Comments to the left."
msgstr ""
#: ../disqus/disqus.php:527
msgid ""
"Your comments have been sent to Disqus and queued for import!<br/><a href=\""
"Unable to export comments. Make sure you are accessing this page from the "
"Wordpress dashboard."
msgstr ""
#: ../disqus/disqus.php:446
#, php-format
msgid "Processed comments on post #%s&hellip;"
#: ../disqus/disqus.php:558 ../disqus/disqus.php:584
msgid "Your comments have been sent to Disqus and queued for import!"
msgstr ""
#: ../disqus/disqus.php:456
#, php-format
#: ../disqus/disqus.php:560 ../disqus/disqus.php:586
msgid "See the status of your import at Disqus"
msgstr ""
#: ../disqus/disqus.php:564
msgid "Processed comments on post"
msgstr ""
#: ../disqus/disqus.php:574
msgid "Sorry, something unexpected happened with the export. Please try again."
msgstr ""
#: ../disqus/disqus.php:576
msgid ""
"Sorry, something unexpected happened with the export. Please <a href=\"#\" "
"id=\"dsq_export_retry\">try again</a></p><p>If your API key has changed, you "
"may need to reinstall Disqus (deactivate the plugin and then reactivate it). "
"If you are still having issues, refer to the <a href=\"%s\" onclick=\"window."
"open(this.href); return false\">WordPress help page</a>."
"If your API key has changed, you may need to reinstall Disqus (deactivate "
"the plugin and then reactivate it)."
msgstr ""
#: ../disqus/disqus.php:461
#: ../disqus/disqus.php:577
#, php-format
msgid ""
"Your comments have been sent to Disqus and queued for import!<br/><a href="
"\"%s\" target=\"_blank\">See the status of your import at Disqus</a>"
msgid "If you are still having issues, refer to the %s WordPress help page"
msgstr ""
#: ../disqus/disqus.php:491
#: ../disqus/disqus.php:608
msgid ""
"Unable to import comments. Make sure you are accessing this page from the "
"Wordpress dashboard."
msgstr ""
#: ../disqus/disqus.php:631
msgid "There was an error downloading your comments from Disqus."
msgstr ""
#: ../disqus/disqus.php:496
#: ../disqus/disqus.php:636
msgid ""
"Your comments have been downloaded from Disqus and saved in your local "
"database."
msgstr ""
#: ../disqus/disqus.php:499
#: ../disqus/disqus.php:639
#, php-format
msgid "Import in progress (last post id: %s) &hellip;"
msgid "Import in progress (last post id: %s)"
msgstr ""
#: ../disqus/disqus.php:833
#: ../disqus/disqus.php:989
msgid "Pingback:"
msgstr ""
#: ../disqus/disqus.php:833
msgid "(Edit)"
#: ../disqus/disqus.php:989
msgid "Edit"
msgstr ""
#: ../disqus/disqus.php:870
#: ../disqus/disqus.php:1026
msgid "Configure"
msgstr ""
#: ../disqus/disqus.php:872 ../disqus/manage.php:360
#: ../disqus/disqus.php:1028 ../disqus/manage.php:394
msgid "Settings"
msgstr ""
#: ../disqus/disqus.php:1577
#: ../disqus/disqus.php:1492
msgid ""
"Sorry, the built-in commenting system is disabled because Disqus is active."
msgstr ""
#: ../disqus/manage.php:61
#: ../disqus/manage.php:62
msgid "Disqus Reset"
msgstr ""
#: ../disqus/manage.php:64
#: ../disqus/manage.php:65
msgid "Disqus has been reset successfully."
msgstr ""
#: ../disqus/manage.php:66
#: ../disqus/manage.php:67
msgid "Local settings for the plugin were removed."
msgstr ""
#: ../disqus/manage.php:67
#: ../disqus/manage.php:68
msgid "Database changes by Disqus were reverted."
msgstr ""
#: ../disqus/manage.php:69
msgid ""
"If you wish to <a href=\"?page=disqus&amp;step=1\">reinstall</a>, you can do "
"that now."
#: ../disqus/manage.php:71
msgid "If you wish to reinstall, you can do that now."
msgstr ""
#: ../disqus/manage.php:182
#: ../disqus/manage.php:72
msgid "Reinstall"
msgstr ""
#: ../disqus/manage.php:189
msgid "Your settings have been changed."
msgstr ""
#: ../disqus/manage.php:206
msgid ""
"There was an error completing the installation of Disqus. If you are still "
"having issues, refer to the <a href=\"https://help.disqus.com/customer/"
"portal/articles/472005-wordpress-troubleshooting\">WordPress help page</a>."
#: ../disqus/manage.php:220
msgid "There was an error completing the installation of Disqus."
msgstr ""
#: ../disqus/manage.php:236
#, php-format
msgid ""
"There aren't any sites associated with this account. Maybe you want to <a "
"href=\"%s\">create a site</a>?"
#: ../disqus/manage.php:222
msgid "If you are still having issues, refer to the help documentation."
msgstr ""
#: ../disqus/manage.php:246
msgid "Moderate"
msgstr ""
#: ../disqus/manage.php:246
msgid "Install"
msgstr ""
#: ../disqus/manage.php:247
msgid "Plugin Settings"
msgstr ""
#: ../disqus/manage.php:256 ../disqus/manage.php:267 ../disqus/manage.php:301
msgid "Install Disqus Comments"
#: ../disqus/manage.php:225
msgid "WordPress Help Page"
msgstr ""
#: ../disqus/manage.php:258
msgid ""
"There aren't any sites associated with this account. Maybe you want to "
"create a site?"
msgstr ""
#: ../disqus/manage.php:261
msgid "Create a site"
msgstr ""
#: ../disqus/manage.php:274
msgid "Moderate"
msgstr ""
#: ../disqus/manage.php:274
msgid "Install"
msgstr ""
#: ../disqus/manage.php:277
msgid "Plugin Settings"
msgstr ""
#: ../disqus/manage.php:287 ../disqus/manage.php:301 ../disqus/manage.php:335
msgid "Install Disqus Comments"
msgstr ""
#: ../disqus/manage.php:289
msgid "Disqus has been installed on your blog."
msgstr ""
#: ../disqus/manage.php:259
msgid ""
"If you have existing comments, you may wish to <a href=\"?page=disqus&amp;"
"t=adv#export\">export them</a> now. Otherwise, you're all set, and the "
"Disqus network is now powering comments on your blog."
#: ../disqus/manage.php:291
msgid "If you have existing comments, you may wish to export them now."
msgstr ""
#: ../disqus/manage.php:260
#: ../disqus/manage.php:292
msgid ""
"Otherwise, you're all set, and the Disqus network is now powering comments "
"on your site."
msgstr ""
#: ../disqus/manage.php:294
msgid "Continue to the moderation dashboard"
msgstr ""
#: ../disqus/manage.php:273
#: ../disqus/manage.php:307
msgid "Select a website"
msgstr ""
#: ../disqus/manage.php:285
#: ../disqus/manage.php:319
msgid "Or register a new one on the Disqus website."
msgstr ""
#: ../disqus/manage.php:307
#: ../disqus/manage.php:341
msgid "Username or email"
msgstr ""
#: ../disqus/manage.php:310
msgid "(don't have a Disqus Profile yet?)"
#: ../disqus/manage.php:344
msgid "don't have a Disqus Profile yet?"
msgstr ""
#: ../disqus/manage.php:314
#: ../disqus/manage.php:348
msgid "Password"
msgstr ""
#: ../disqus/manage.php:317
msgid "(forgot your password?)"
#: ../disqus/manage.php:351
msgid "forgot your password?"
msgstr ""
#: ../disqus/manage.php:361
#: ../disqus/manage.php:371
msgid "Go to Disqus Moderation"
msgstr ""
#: ../disqus/manage.php:395
#, php-format
msgid "Version: %s"
msgstr ""
#: ../disqus/manage.php:365
msgid ""
"<p class=\"status\">Disqus comments are currently <span class=\"dsq-disabled-"
"text\">disabled</span>. (<a href=\"?page=disqus&amp;active=1\">Enable</a>)</"
"p>"
#: ../disqus/manage.php:401
msgid "Disqus comments are currently "
msgstr ""
#: ../disqus/manage.php:367
msgid ""
"<p class=\"status\">Disqus comments are currently <span class=\"dsq-enabled-"
"text\">enabled</span>. (<a href=\"?page=disqus&amp;active=0\">Disable</a>)</"
"p>"
#: ../disqus/manage.php:404
msgid "Disable"
msgstr ""
#: ../disqus/manage.php:375
msgid "<h3>General</h3>"
#: ../disqus/manage.php:404
msgid "Enable"
msgstr ""
#: ../disqus/manage.php:378
#: ../disqus/manage.php:413
msgid "General"
msgstr ""
#: ../disqus/manage.php:416
msgid "Forum Shortname"
msgstr ""
#: ../disqus/manage.php:383
#: ../disqus/manage.php:421
msgid ""
"This is the unique identifier for your website in Disqus, automatically set "
"during installation."
msgstr ""
#: ../disqus/manage.php:388
msgid "<h3>Appearance</h3>"
#: ../disqus/manage.php:426
msgid "Appearance"
msgstr ""
#: ../disqus/manage.php:391
#: ../disqus/manage.php:429
msgid "Use Disqus Comments on"
msgstr ""
#: ../disqus/manage.php:394
#: ../disqus/manage.php:432
msgid "All blog posts."
msgstr ""
#: ../disqus/manage.php:395
#: ../disqus/manage.php:433
msgid "Blog posts with closed comments only."
msgstr ""
#: ../disqus/manage.php:399
#: ../disqus/manage.php:437
msgid ""
"You have selected to only enable Disqus on posts with closed comments. If "
"you aren't seeing Disqus on new posts, change this option to <strong>All "
"blog posts</strong>."
"you aren't seeing Disqus on new posts, change this option to \"All blog posts"
"\"."
msgstr ""
#: ../disqus/manage.php:400
#: ../disqus/manage.php:438
msgid ""
"Shows comments on either all blog posts, or ones with closed comments. "
"Select the <strong>Blog posts with closed comments only</strong> option if "
"you plan on disabling Disqus, but want to keep it on posts which already "
"have comments."
"Select the \"Blog posts with closed comments only\" option if you plan on "
"disabling Disqus, but want to keep it on posts which already have comments."
msgstr ""
#: ../disqus/manage.php:406
msgid "<h3>Sync</h3>"
#: ../disqus/manage.php:444
msgid "Sync"
msgstr ""
#: ../disqus/manage.php:409
#: ../disqus/manage.php:447
msgid "Comment Importing"
msgstr ""
#: ../disqus/manage.php:412
#: ../disqus/manage.php:450
msgid "Disable automated comment importing"
msgstr ""
#: ../disqus/manage.php:413
#: ../disqus/manage.php:451
msgid ""
"If you have problems with WP-Cron taking too long, or have a large number of "
"comments, you may wish to disable automated sync. Comments will only be "
"imported to your local Wordpress database if you do so manually."
msgstr ""
#: ../disqus/manage.php:417
#: ../disqus/manage.php:455
msgid "Server-Side Rendering"
msgstr ""
#: ../disqus/manage.php:420
#: ../disqus/manage.php:458
msgid "Disable server-side rendering of comments"
msgstr ""
#: ../disqus/manage.php:421
#: ../disqus/manage.php:459
msgid "Hides comments from nearly all search engines."
msgstr ""
#: ../disqus/manage.php:426
msgid "<h3>Patches</h3>"
#: ../disqus/manage.php:464
msgid "Patches"
msgstr ""
#: ../disqus/manage.php:430
#: ../disqus/manage.php:468
msgid "External Javascript Files"
msgstr ""
#: ../disqus/manage.php:471
msgid "Render Javascript in external files"
msgstr ""
#: ../disqus/manage.php:472
msgid ""
"This will render the Disqus scripts as external files in the footer as "
"recommended by Wordpress. Disable this if are not seeing Disqus appear on "
"pages that normally have comments. This will fix the issue if your theme "
"does not support the 'wp_enqueue_script' function, are caching your site on "
"a CDN."
msgstr ""
#: ../disqus/manage.php:477
msgid "Template Conflicts"
msgstr ""
#: ../disqus/manage.php:433
#: ../disqus/manage.php:480
msgid "Output JavaScript in footer"
msgstr ""
#: ../disqus/manage.php:434
#, php-format
#: ../disqus/manage.php:481
msgid ""
"Enable this if you have problems with comment counts or other "
"irregularities. For example: missing counts, counts always at 0, Disqus code "
"showing on the page, broken image carousels, or longer-than-usual home page "
"load times (<a href=\"%s\" onclick=\"window.open(this.href); return false"
"\">more info</a>)."
"load times"
msgstr ""
#: ../disqus/manage.php:439
#, php-format
msgid ""
"<h3>Advanced</h3><h4>Single Sign-On</h4><p>Allows users to log in to Disqus "
"via WordPress. (<a href=\"%s\" onclick=\"window.open(this.href); return false"
"\">More info on SSO</a>)</p>"
#: ../disqus/manage.php:487
msgid "Advanced"
msgstr ""
#: ../disqus/manage.php:443
#: ../disqus/manage.php:488
msgid "Single Sign-On"
msgstr ""
#: ../disqus/manage.php:490
msgid "Allows users to log in to Disqus via WordPress."
msgstr ""
#: ../disqus/manage.php:492
msgid "More info on SSO"
msgstr ""
#: ../disqus/manage.php:499
msgid "Disqus Partner Key"
msgstr ""
#: ../disqus/manage.php:450
#: ../disqus/manage.php:506
msgid "API Application Public Key"
msgstr ""
#: ../disqus/manage.php:454 ../disqus/manage.php:462
#, php-format
msgid "Found at <a href=\"%s\">Disqus API Applications</a>."
#: ../disqus/manage.php:510 ../disqus/manage.php:518
msgid "Disqus API Applications"
msgstr ""
#: ../disqus/manage.php:458
#: ../disqus/manage.php:514
msgid "API Application Secret Key"
msgstr ""
#: ../disqus/manage.php:466
#: ../disqus/manage.php:522
msgid "Custom Log-in Button"
msgstr ""
#: ../disqus/manage.php:516
#: ../disqus/manage.php:536
msgid "Change"
msgstr ""
#: ../disqus/manage.php:516
#: ../disqus/manage.php:536
msgid "Choose"
msgstr ""
#: ../disqus/manage.php:516
#: ../disqus/manage.php:536
msgid "button"
msgstr ""
#: ../disqus/manage.php:522
#, php-format
msgid ""
"Adds a button to the Disqus log-in interface. (<a href=\"%s\">Example "
"screenshot</a>.)"
#: ../disqus/manage.php:542
msgid "Adds a button to the Disqus log-in interface."
msgstr ""
#: ../disqus/manage.php:523
#, php-format
msgid ""
"<br />See <a href=\"%s\">our SSO button documentation</a> for a template to "
"create your own button."
#: ../disqus/manage.php:543
msgid "Example screenshot"
msgstr ""
#: ../disqus/manage.php:541
#: ../disqus/manage.php:545
msgid "See our documentation for a template to create your own button."
msgstr ""
#: ../disqus/manage.php:546
msgid "SSO button documentation"
msgstr ""
#: ../disqus/manage.php:564
msgid "Export comments to Disqus"
msgstr ""
#: ../disqus/manage.php:544
#: ../disqus/manage.php:570
msgid "Export Comments"
msgstr ""
#: ../disqus/manage.php:544
#: ../disqus/manage.php:571
msgid "This will export your existing WordPress comments to Disqus"
msgstr ""
#: ../disqus/manage.php:550
#: ../disqus/manage.php:579
msgid "Sync Disqus with WordPress"
msgstr ""
#: ../disqus/manage.php:554
#: ../disqus/manage.php:586
msgid "Sync Comments"
msgstr ""
#: ../disqus/manage.php:554
#: ../disqus/manage.php:587
msgid ""
"This will download your Disqus comments and store them locally in WordPress"
msgstr ""
#: ../disqus/manage.php:555
#: ../disqus/manage.php:591
msgid "Remove all imported Disqus comments before syncing."
msgstr ""
#: ../disqus/manage.php:566
#: ../disqus/manage.php:605
msgid "Reset Disqus"
msgstr ""
#: ../disqus/manage.php:570
#: ../disqus/manage.php:610
msgid "Are you sure you want to reset the Disqus plugin?"
msgstr ""
#: ../disqus/manage.php:570
#: ../disqus/manage.php:611
msgid ""
"This removes all Disqus-specific settings. Comments will remain unaffected."
msgstr ""
#: ../disqus/manage.php:571
#: ../disqus/manage.php:613
msgid ""
"If you have problems with resetting taking too long you may wish to first "
"manually drop the <code>disqus_dupecheck</code> index from your "
"<code>commentmeta</code> table."
"manually drop the 'disqus_dupecheck' index from your 'commentmeta' table."
msgstr ""
#: ../disqus/manage.php:578
#: ../disqus/manage.php:620
msgid "Debug Information"
msgstr ""
#: ../disqus/manage.php:579
#, php-format
#: ../disqus/manage.php:622
msgid ""
"Having problems with the plugin? Check out our <a href=\"%s\" onclick="
"\"window.open(this.href); return false\">WordPress Troubleshooting</a> "
"documentation. You can also <a href=\"%s\">drop us a line</a> including the "
"following details and we'll do what we can."
"Having problems with the plugin? Check out our troubleshooting documentation."
msgstr ""
#: ../disqus/manage.php:623
msgid "WordPress troubleshooting ocumentation"
msgstr ""
#: ../disqus/manage.php:624
msgid "You can also email us and include the debug info below."
msgstr ""
#: ../disqus/manage.php:625
msgid "Contact support"
msgstr ""
#: ../disqus/upgrade.php:12
Whitespace-only changes.
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,120 @@
jQuery(document).ready(function($) {
// Replace comments dashboard link
$('#dashboard_right_now .inside table td.last a, #dashboard_recent_comments .inside .textright a.button').attr('href', 'edit-comments.php?page=disqus');
// Focuses on username text box if present
if ($('#dsq-username').length) {
$('#dsq-username').focus();
}
// Set current Disqus admin state
$('#dsq-tabs li').click(function() {
$('#dsq-tabs li.selected').removeClass('selected');
$(this).addClass('selected');
$('.dsq-main, .dsq-advanced').hide();
$('.' + $(this).attr('rel')).show();
});
if (location.href.indexOf('#adv') != -1) {
$('#dsq-tab-advanced').click();
}
// Bind click events to export/sync buttons
dsq_fire_export();
dsq_fire_import();
});
var dsq_fire_export = function() {
jQuery(function($) {
$('#dsq_export a.button').unbind().click(function() {
$('#dsq_export .status').removeClass('dsq-export-fail').addClass('dsq-exporting').html('Processing...');
dsq_export_comments();
return false;
});
});
};
var dsq_export_comments = function() {
jQuery(function($) {
var status = $('#dsq_export .status');
var nonce = $('#dsq-form_nonce_export').val();
var export_info = (status.attr('rel') || '0|' + (new Date().getTime()/1000)).split('|');
$.get(
adminVars.indexUrl,
{
cf_action: 'export_comments',
post_id: export_info[0],
timestamp: export_info[1],
_dsqexport_wpnonce: nonce
},
function(response) {
switch (response.result) {
case 'success':
status.html(response.msg).attr('rel', response.post_id + '|' + response.timestamp);
switch (response.status) {
case 'partial':
dsq_export_comments();
break;
case 'complete':
status.removeClass('dsq-exporting').addClass('dsq-exported');
break;
}
break;
case 'fail':
status.parent().html(response.msg);
dsq_fire_export();
break;
}
},
'json'
);
});
};
var dsq_fire_import = function() {
jQuery(function($) {
$('#dsq_import a.button, #dsq_import_retry').unbind().click(function() {
var wipe = $('#dsq_import_wipe').is(':checked');
$('#dsq_import .status').removeClass('dsq-import-fail').addClass('dsq-importing').html('Processing...');
dsq_import_comments(wipe);
return false;
});
});
};
var dsq_import_comments = function(wipe) {
jQuery(function($) {
var status = $('#dsq_import .status');
var nonce = $('#dsq-form_nonce_import').val();
var last_comment_id = status.attr('rel') || '0';
$.get(
adminVars.indexUrl,
{
cf_action: 'import_comments',
last_comment_id: last_comment_id,
wipe: (wipe ? 1 : 0),
_dsqimport_wpnonce: nonce
},
function(response) {
switch (response.result) {
case 'success':
status.html(response.msg).attr('rel', response.last_comment_id);
switch (response.status) {
case 'partial':
dsq_import_comments(false);
break;
case 'complete':
status.removeClass('dsq-importing').addClass('dsq-imported');
break;
}
break;
case 'fail':
status.parent().html(response.msg);
dsq_fire_import();
break;
}
},
'json'
);
});
};
@@ -0,0 +1,17 @@
var disqus_shortname = countVars.disqusShortname;
(function () {
var nodes = document.getElementsByTagName('span');
for (var i = 0, url; i < nodes.length; i++) {
if (nodes[i].className.indexOf('dsq-postid') != -1) {
nodes[i].parentNode.setAttribute('data-disqus-identifier', nodes[i].getAttribute('data-dsqidentifier'));
url = nodes[i].parentNode.href.split('#', 1);
if (url.length == 1) { url = url[0]; }
else { url = url[1]; }
nodes[i].parentNode.href = url + '#disqus_thread';
}
}
var s = document.createElement('script'); s.async = true;
s.type = 'text/javascript';
s.src = '//' + disqus_shortname + '.disqus.com/count.js';
(document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
}());
@@ -0,0 +1,15 @@
jQuery(document).ready(function($) {
// fix menu
var mc = $('#menu-comments');
mc.find('a.wp-has-submenu').attr('href', 'edit-comments.php?page=disqus').end().find('.wp-submenu li:has(a[href="edit-comments.php?page=disqus"])').prependTo(mc.find('.wp-submenu ul'));
// fix admin bar
$('#wp-admin-bar-comments').find('a.ab-item').attr('href', 'edit-comments.php?page=disqus');
// Remove trackbacks
$('#dashboard_recent_comments div.trackback').remove();
// Replace comment counts
$('#dashboard_right_now').find('.b-comments a').html(dashboardVars.stats.totalComments).end().find('.b_approved a').html(dashboardVars.stats.approved).end().find('.b-waiting a').html(dashboardVars.stats.moderated).end().find('.b-spam a').html(dashboardVars.stats.spam);
});
@@ -0,0 +1,56 @@
var disqus_url = embedVars.disqusUrl;
var disqus_identifier = embedVars.disqusIdentifier;
var disqus_container_id = 'disqus_thread';
var disqus_shortname = embedVars.disqusShortname;
var disqus_title = embedVars.disqusTitle;
var disqus_config_custom = window.disqus_config;
var disqus_config = function () {
/*
All currently supported events:
onReady: fires when everything is ready,
onNewComment: fires when a new comment is posted,
onIdentify: fires when user is authenticated
*/
if (typeof embedVars.disqusConfig.remote_auth_s3 !== 'undefined') {
this.page.remote_auth_s3 = embedVars.disqusConfig.remote_auth_s3;
}
if (typeof embedVars.disqusConfig.api_key !== 'undefined') {
this.page.api_key = embedVars.disqusConfig.api_key;
}
if (typeof embedVars.disqusConfig.sso !== 'undefined') {
this.sso = {
name: embedVars.disqusConfig.sso.name,
button: embedVars.disqusConfig.sso.button,
url: embedVars.disqusConfig.sso.url,
logout: embedVars.disqusConfig.sso.logout,
width: embedVars.disqusConfig.sso.width,
height: embedVars.disqusConfig.sso.height
};
}
this.language = embedVars.disqusConfig.language;
this.callbacks.onReady.push(function () {
if (!embedVars.options.manualSync) {
// sync comments in the background so we don't block the page
var script = document.createElement('script');
script.async = true;
script.src = '?cf_action=sync_comments&post_id=' + embedVars.postId;
var firstScript = document.getElementsByTagName('script')[0];
firstScript.parentNode.insertBefore(script, firstScript);
}
});
if (disqus_config_custom) {
disqus_config_custom.call(this);
}
};
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript';
dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
@@ -0,0 +1,19 @@
jQuery(document).ready( function($) {
alert('pointer.js loaded');
console.log('pointerContent', pointerContent);
$('#menu-comments').pointer({
content: pointerContent,
position: {
edge: 'left', // arrow direction
align: 'center' // vertical alignment
},
pointerWidth: 350,
close: function() {
$.post(ajaxurl, {
pointer: 'disqus_settings_pointer', // pointer ID
action: 'dismiss-wp-pointer'
});
}
}).pointer('open');
});
@@ -0,0 +1,34 @@
var file_frame;
jQuery(document).ready(function($) {
$('.upload_image_button').on('click', function(event) {
event.preventDefault();
// If the media frame already exists, reopen it.
if ( file_frame ) {
file_frame.open();
return;
}
// Create the media frame.
file_frame = wp.media.frames.file_frame = wp.media({
title: $(this).data('uploader_title'),
button: {
text: $(this).data('uploader_button_text'),
},
multiple: false // Set to true to allow multiple files to be selected
});
// When an image is selected, run a callback.
file_frame.on('select', function() {
// We set multiple to false so only get one image from the uploader
attachment = file_frame.state().get('selection').first().toJSON();
// Do something with attachment.id and/or attachment.url here
$('#disqus_sso_button').val(attachment.url);
});
// Finally, open the modal
file_frame.open();
});
});
@@ -1,67 +1,67 @@
/* Selectors required for pre-WordPress 2.5 */
.form-table {
border-collapse: collapse;
margin-top: 1em;
width: 100%;
color: #333;
}
.form-table tr {
background-color: #eaf3fa;
}
.form-table td {
margin-bottom: 9px;
padding: 10px;
line-height: 20px;
font-size: 11px;
border-bottom-width: 8px;
border-bottom-style: solid;
border-color: #fff;
}
.form-table th {
vertical-align: top;
text-align: left;
padding: 10px;
width: 150px;
border-bottom-width: 8px;
border-bottom-style: solid;
border-color: #fff;
}
.form-table th.th-full {
width: auto;
}
.form-table input, .form-table textarea {
border-width: 1px;
border-style: solid;
}
.form-table div.color-option {
display: block;
clear: both;
}
.form-table input.tog {
margin-top: 2px;
margin-right: 2px;
float: left;
}
.form-table table.color-palette {
vertical-align: bottom;
float: left;
margin: -3px 3px 8px;
}
.form-table .color-palette td {
border-bottom: none;
border: 1px solid #fff;
font-size: 1px;
line-height: 1px;
}
#disqus_warning{ background-color:#ff0000; }
/* Selectors required for pre-WordPress 2.5 */
.form-table {
border-collapse: collapse;
margin-top: 1em;
width: 100%;
color: #333;
}
.form-table tr {
background-color: #eaf3fa;
}
.form-table td {
margin-bottom: 9px;
padding: 10px;
line-height: 20px;
font-size: 11px;
border-bottom-width: 8px;
border-bottom-style: solid;
border-color: #fff;
}
.form-table th {
vertical-align: top;
text-align: left;
padding: 10px;
width: 150px;
border-bottom-width: 8px;
border-bottom-style: solid;
border-color: #fff;
}
.form-table th.th-full {
width: auto;
}
.form-table input, .form-table textarea {
border-width: 1px;
border-style: solid;
}
.form-table div.color-option {
display: block;
clear: both;
}
.form-table input.tog {
margin-top: 2px;
margin-right: 2px;
float: left;
}
.form-table table.color-palette {
vertical-align: bottom;
float: left;
margin: -3px 3px 8px;
}
.form-table .color-palette td {
border-bottom: none;
border: 1px solid #fff;
font-size: 1px;
line-height: 1px;
}
#disqus_warning{ background-color:#ff0000; }
@@ -1,52 +1,52 @@
ul#dsq-tabs li:last-child {
width: 100px;
}
ul#dsq-tabs li.selected {
font-weight: bold;
}
ul#dsq-tabs li {
float: left;
color: #333;
padding: 0.25em;
height: 16px;
cursor: pointer;
margin-right: 8px;
text-align: right;
}
ul#dsq-tabs {
display: block;
height: 20px;
list-style: none;
margin: 15px 0;
padding: 0;
border: 0;
position: absolute;
right: 10px;
}
select.disqus-replace {
border-color: #C6D9E9;
}
.dsq-content h2 {
line-height: 41px;
margin: 15px 0 10px;
}
.dsq-alert {
color: #fff;
background: #e76c35;
border: 1px solid #8f3e1c;
padding: 5px;
}
.dsq-disabled-text {
color: #e76c35;
font-weight: 700;
}
.dsq-enabled-text {
color: #7fbd5a;
font-weight: 700;
ul#dsq-tabs li:last-child {
width: 100px;
}
ul#dsq-tabs li.selected {
font-weight: bold;
}
ul#dsq-tabs li {
float: left;
color: #333;
padding: 0.25em;
height: 16px;
cursor: pointer;
margin-right: 8px;
text-align: right;
}
ul#dsq-tabs {
display: block;
height: 20px;
list-style: none;
margin: 15px 0;
padding: 0;
border: 0;
position: absolute;
right: 10px;
}
select.disqus-replace {
border-color: #C6D9E9;
}
.dsq-content h2 {
line-height: 41px;
margin: 15px 0 10px;
}
.dsq-alert {
color: #fff;
background: #e76c35;
border: 1px solid #8f3e1c;
padding: 5px;
}
.dsq-disabled-text {
color: #e76c35;
font-weight: 700;
}
.dsq-enabled-text {
color: #7fbd5a;
font-weight: 700;
}
@@ -1,293 +1,321 @@
=== Disqus Comment System ===
Contributors: disqus, alexkingorg, crowdfavorite, zeeg, tail, thetylerhayes
Tags: comments, threaded, email, notification, spam, avatars, community, profile, widget, disqus
Requires at least: 2.8
Tested up to: 3.9.1
Stable tag: 2.77
The Disqus comment system replaces your WordPress comment system with your comments hosted and powered by Disqus.
== Description ==
Disqus, pronounced "discuss", is a service and tool for web comments and
discussions. Disqus makes commenting easier and more interactive,
while connecting websites and commenters across a thriving discussion
community.
The Disqus for WordPress plugin seamlessly integrates using the Disqus API and by syncing with WordPress comments.
= Disqus for WordPress =
* Uses the Disqus API
* Comments indexable by search engines (SEO-friendly)
* Support for importing existing comments
* Auto-sync (backup) of comments with Disqus and WordPress database
= Disqus Features =
* Threaded comments and replies
* Notifications and reply by email
* Subscribe and RSS options
* Aggregated comments and social mentions
* Powerful moderation and admin tools
* Full spam filtering, blacklists and whitelists
* Support for Disqus community widgets
* Connected with a large discussion community
* Increased exposure and readership
== Installation ==
**NOTE: It is recommended that you [backup your database](http://codex.wordpress.org/Backing_Up_Your_Database) before installing the plugin.**
1. Unpack archive to this archive to the 'wp-content/plugins/' directory inside
of WordPress
* Maintain the directory structure of the archive (all extracted files
should exist in 'wp-content/plugins/disqus-comment-system/'
2. From your blog administration, click on Comments to change settings
(WordPress 2.0 users can find the settings under Options > Disqus.)
= More documentation =
Go to [http://disqus.com/help/wordpress](http://disqus.com/help/wordpress)
== Screenshots ==
1. Disqus Comments
2. Discovery Box (part of Disqus Comments)
3. Inline Moderation Interface
== Changes ==
2.77
* Fixes login by email issue
* Make sure Disqus is enabled after installation
* Additional security fixes
2.76
* Security fixes (Thanks to Nik Cubrilovic, Alexander Concha and Marc-Alexandre Montpas)
* Bump tested Wordpress version to 3.9.1
* Remove obsolete SSO button uploader
* Enable 'Output javascript in footer' by default during installation
* Fix for 'Reset' function not completely working the first time
2.75
* Bump supported WordPress version to 3.8.
* Properly encode site name for SSO login button.
* Increased timeout for comment exporter to 60 seconds.
* Use https: for admin pages
* Miscellaneous bug fixes and improvements.
2.74
* Updated settings UI
* Add filter hook for setting custom Disqus language
* For WP >= 3.5, use new media uploader
* Disable internal Wordpress commenting if Disqus is enabled (thanks Artem Russakovskii)
* Cleaned up installation and configuration flow
* Added link to WP backup guide in README
* Fix admin bar comments link
* Added a check to avoid a missing key notice when WP_DEBUG=TRUE (thanks Jason Lengstorf)
* Prevent 404 errors for embed.js from being reported by Google Webmaster Tools (missed in 2.73 README)
2.73
* Apply CDATA patch from Wordpress 3.4 to dsq_export_wxr_cdata() (thanks Artem
Russakovskii for the patch).
* Added Single Sign-On log-in button and icon to options (only for sites using SSO)
* Output user website if set in SSO payload
* Added plugin activation statuses to debug info
* Bump supported WordPress version to 3.4.1
* Fixed issue where disqus_dupecheck won't properly uninstall
* Load second count.js (output-in-footer version) reference via SSL too
* Added screenshots
2.72
* Load count.js via SSL when page is accessed via HTTPS
* Fixed styling issue with Disqus admin.
2.71
* Fixed issue where embed wasn't using SSL if page was loaded via HTTPS
* Fixed issue with syncing where to user's without a display_name would
revert back to Anonymous (really this time).
* Fixed issue where Google Webmaster Tools would incorrectly report 404s.
* Fixed issue with Disqus admin display issues.
2.70
* Properly uninstall disqus_dupecheck index when uninstalling plugin.
* Fixed issue with syncing where to user's without a display_name would
revert back to Anonymous.
* Fixed issue where IP addresses weren't being synced properly.
* Allow non-Administrators (e.g., editors) to see Disqus Moderate panel
inline (fixes GH-3)
2.69
* Bumped version number.
2.68
* Removed debugging information from web requests in CLI scripts (thanks
Ryan Dewhurst for the report).
* Reduced sync lock time to 1 hour.
* Fixed an issue which was not allowing pending posts (for sync) to clear.
* Fixed an issue with CLI scripts when used with certain caching plugins.
2.67
* Bumped synchronization timer delays to 5 minutes.
* wp-cli.php now requires php_sapi_name to be set to 'cli' for execution.
* Fixed a bug with imported comments not storing the correct relative date.
* Added a lock for dsq_sync_forum, which can be overriden in the command line script
with the --force tag.
* dsq_sync_forum will now handle all pending post metadata updates (formerly a separate
cron task, dsq_sync_post).
2.66
* Fixed issue with jQuery usage which conflicted with updated jQuery version.
2.65
* Corrected a bug that was causing posts to not appear due to invalid references.
2.64
* Added an option to disable Disqus without deactivating the plugin.
* Added a second check for comment sync to prevent stampede race conditions in WP cron.
2.63
* Added command line script to import comments from DISQUS (scripts/import-comments.php).
* Added command line script to export comments to DISQUS (scripts/export-comments.php).
* The exporter will now only do one post at a time.
* The exporter now only sends required attributes to DISQUS.
* Moved media into its own directory.
2.62
* Changed legacy query to use = operator instead of LIKE so it can be indexed.
2.61
* Fixed an issue which was causing invalid information to be presented in RSS feeds.
2.60
* Added support for new Single Sign-On (API version 3.0).
* Improved support for legacy Single Sign-On.
2.55
* Added support for get_comments_number in templates.
2.54
* Updated URL to forum moderation.
2.53
* Fixed an issue with fsockopen and GET requests (only affects certain users).
2.52
* Fixed issue with Disqus-API package not getting updated (only affecting PHP4).
2.51
* Added CDATA comments for JavaScript.
* Syncing comments will now restore missing thread information from old imports.
* Install and uninstall processes have been improved.
* Fixed an issue in PHP4 with importing comments.
* Fixed an issue that could cause duplicate comments in some places.
* Added an option to remove existing imported comments when importing.
2.50
* Added missing file.
2.49
* Database usage has been optimized for storing comment meta data.
You can perform this migration automatically by visiting Comments -> Disqus, or if
you have a large database, you may do this by hand:
CREATE INDEX disqus_dupecheck ON `wp_commentmeta` (meta_key, meta_value(11));
INSERT INTO `wp_options` (blog_id, option_name, option_value, autoload) VALUES (0, 'disqus_version', '2.49', 'yes') ON DUPLICATE KEY UPDATE option_value = VALUES(option_value);
2.48
* Comment synchronization has been optimized to be a single call per-site.
* disqus.css will now only load when displaying comments
2.47
* Fixed a security hole with comment importing.
* Reverted ability to use default template comments design.
* Comments will now store which version they were imported under.
* Added an option to disable server side rendering.
2.46
* Better debugging information for export errors.
* Added the ability to manual import Disqus comments into Wordpress.
* Added thread_identifier support to exports.
* Cleaned up API error messages.
* Fixed a bug which was causing the import process to not grab only the latest set of comments.
* Added an option to disable automated synchronization with Disqus.
2.45
* Comments should now store thread information as well as certain other meta data.
* Optimize get_thread polling to only pull comments which aren't stored properly.
2.44
* Fixed JavaScript response for comments sync call.
* Comments are now marked as closed while showing the embed (fixes showing default respond form).
2.43
* Fixed a JavaScript syntax error which would cause linting to fail.
* Correct an issue that was causing comments.php to throw a syntax error under some configurations.
2.42
* Correct a bug with saving disqus_user_api_key (non-critical).
* Added settings to Debug Information.
* Adjusting all includes to use absolute paths.
* Adjusted JSON usage to solve a problem for some clients.
2.41
* Correct a bug with double urlencoding titles.
2.40
* Comments are now synced with Disqus as a delayed asynchronous cron event.
* Comment count code has been updated to use the new widget. (Comment counts
must be linked to get tracked within "the loop" now).
* API bindings have been migrated to the generic 1.1 Disqus API.
* Pages will now properly update their permalink with Disqus when it changes. This is
done within the sync event above.
* There is now a Debug Information pane under Advanced to assist with support requests.
* When Disqus is unreachable it will fallback to the theme's built-in comment display.
* Legacy mode is no longer available.
* The plugin management interface can now be localized.
* The plugin is now valid HTML5.
== Support ==
* Visit http://disqus.com/help/wordpress for help documentation.
* Visit http://help.disqus.com for help from our support team.
* Disqus also recommends the [WordPress HelpCenter](http://wphelpcenter.com/) for extended help. Disqus is not associated with the WordPress HelpCenter in any way.
=== Disqus Comment System ===
Contributors: disqus, alexkingorg, crowdfavorite, zeeg, tail, thetylerhayes
Tags: comments, threaded, email, notification, spam, avatars, community, profile, widget, disqus
Requires at least: 2.8
Tested up to: 4.0
Stable tag: 2.83
The Disqus comment system replaces your WordPress comment system with your comments hosted and powered by Disqus.
== Description ==
Disqus, pronounced "discuss", is a service and tool for web comments and
discussions. Disqus makes commenting easier and more interactive,
while connecting websites and commenters across a thriving discussion
community.
The Disqus for WordPress plugin seamlessly integrates using the Disqus API and by syncing with WordPress comments.
= Disqus for WordPress =
* Uses the Disqus API
* Comments indexable by search engines (SEO-friendly)
* Support for importing existing comments
* Auto-sync (backup) of comments with Disqus and WordPress database
= Disqus Features =
* Threaded comments and replies
* Notifications and reply by email
* Subscribe and RSS options
* Aggregated comments and social mentions
* Powerful moderation and admin tools
* Full spam filtering, blacklists and whitelists
* Support for Disqus community widgets
* Connected with a large discussion community
* Increased exposure and readership
== Installation ==
**NOTE: It is recommended that you [backup your database](http://codex.wordpress.org/Backing_Up_Your_Database) before installing the plugin.**
1. Unpack archive to this archive to the 'wp-content/plugins/' directory inside
of WordPress
* Maintain the directory structure of the archive (all extracted files
should exist in 'wp-content/plugins/disqus-comment-system/'
2. From your blog administration, click on Comments to change settings
(WordPress 2.0 users can find the settings under Options > Disqus.)
= More documentation =
Go to [http://disqus.com/help/wordpress](http://disqus.com/help/wordpress)
== Screenshots ==
1. Disqus Comments
2. Discovery Box (part of Disqus Comments)
3. Moderation Interface
== Changelog ==
= 2.83 =
* Fix errors when using SSO and rendering javascript inline
= 2.82 =
* Fix PHP errors when there are no comments to sync
* Adds a new option to render Disqus javascript directly in page markup
= 2.81 =
* Fix for automatic comment syncing
* Make sure all markup validates for HTML5
= 2.80 =
* Move all scripts to separate files instead of rendering them in php
* Added a hook to attach custom functions to disqus_config in javascript
* Fixed exporting bug introduced in 2.78 (Thanks to mkilian)
* Numerous small compatibility and security enhancements
= 2.79 =
* Reinstate changes removed by 2.78
= 2.78 =
* Security fixes
* Compatibility for Wordpress version 4.0
= 2.77 =
* Fixes login by email issue
* Make sure Disqus is enabled after installation
* Additional security fixes
= 2.76 =
* Security fixes (Thanks to Nik Cubrilovic, Alexander Concha and Marc-Alexandre Montpas)
* Bump tested Wordpress version to 3.9.1
* Remove obsolete SSO button uploader
* Enable 'Output javascript in footer' by default during installation
* Fix for 'Reset' function not completely working the first time
= 2.75 =
* Bump supported WordPress version to 3.8.
* Properly encode site name for SSO login button.
* Increased timeout for comment exporter to 60 seconds.
* Use https: for admin pages
* Miscellaneous bug fixes and improvements.
= 2.74 =
* Updated settings UI
* Add filter hook for setting custom Disqus language
* For WP >= 3.5, use new media uploader
* Disable internal Wordpress commenting if Disqus is enabled (thanks Artem Russakovskii)
* Cleaned up installation and configuration flow
* Added link to WP backup guide in README
* Fix admin bar comments link
* Added a check to avoid a missing key notice when WP_DEBUG=TRUE (thanks Jason Lengstorf)
* Prevent 404 errors for embed.js from being reported by Google Webmaster Tools (missed in 2.73 README)
= 2.73 =
* Apply CDATA patch from Wordpress 3.4 to dsq_export_wxr_cdata() (thanks Artem
Russakovskii for the patch).
* Added Single Sign-On log-in button and icon to options (only for sites using SSO)
* Output user website if set in SSO payload
* Added plugin activation statuses to debug info
* Bump supported WordPress version to 3.4.1
* Fixed issue where disqus_dupecheck won't properly uninstall
* Load second count.js (output-in-footer version) reference via SSL too
* Added screenshots
= 2.72 =
* Load count.js via SSL when page is accessed via HTTPS
* Fixed styling issue with Disqus admin.
= 2.71 =
* Fixed issue where embed wasn't using SSL if page was loaded via HTTPS
* Fixed issue with syncing where to user's without a display_name would
revert back to Anonymous (really this time).
* Fixed issue where Google Webmaster Tools would incorrectly report 404s.
* Fixed issue with Disqus admin display issues.
= 2.70 =
* Properly uninstall disqus_dupecheck index when uninstalling plugin.
* Fixed issue with syncing where to user's without a display_name would
revert back to Anonymous.
* Fixed issue where IP addresses weren't being synced properly.
* Allow non-Administrators (e.g., editors) to see Disqus Moderate panel
inline (fixes GH-3)
= 2.69 =
* Bumped version number.
= 2.68 =
* Removed debugging information from web requests in CLI scripts (thanks
Ryan Dewhurst for the report).
* Reduced sync lock time to 1 hour.
* Fixed an issue which was not allowing pending posts (for sync) to clear.
* Fixed an issue with CLI scripts when used with certain caching plugins.
= 2.67 =
* Bumped synchronization timer delays to 5 minutes.
* wp-cli.php now requires php_sapi_name to be set to 'cli' for execution.
* Fixed a bug with imported comments not storing the correct relative date.
* Added a lock for dsq_sync_forum, which can be overriden in the command line script
with the --force tag.
* dsq_sync_forum will now handle all pending post metadata updates (formerly a separate
cron task, dsq_sync_post).
= 2.66 =
* Fixed issue with jQuery usage which conflicted with updated jQuery version.
= 2.65 =
* Corrected a bug that was causing posts to not appear due to invalid references.
= 2.64 =
* Added an option to disable Disqus without deactivating the plugin.
* Added a second check for comment sync to prevent stampede race conditions in WP cron.
= 2.63 =
* Added command line script to import comments from DISQUS (scripts/import-comments.php).
* Added command line script to export comments to DISQUS (scripts/export-comments.php).
* The exporter will now only do one post at a time.
* The exporter now only sends required attributes to DISQUS.
* Moved media into its own directory.
= 2.62 =
* Changed legacy query to use = operator instead of LIKE so it can be indexed.
= 2.61 =
* Fixed an issue which was causing invalid information to be presented in RSS feeds.
= 2.60 =
* Added support for new Single Sign-On (API version 3.0).
* Improved support for legacy Single Sign-On.
= 2.55 =
* Added support for get_comments_number in templates.
= 2.54 =
* Updated URL to forum moderation.
= 2.53 =
* Fixed an issue with fsockopen and GET requests (only affects certain users).
= 2.52 =
* Fixed issue with Disqus-API package not getting updated (only affecting PHP4).
= 2.51 =
* Added CDATA comments for JavaScript.
* Syncing comments will now restore missing thread information from old imports.
* Install and uninstall processes have been improved.
* Fixed an issue in PHP4 with importing comments.
* Fixed an issue that could cause duplicate comments in some places.
* Added an option to remove existing imported comments when importing.
= 2.50 =
* Added missing file.
= 2.49 =
* Database usage has been optimized for storing comment meta data.
You can perform this migration automatically by visiting Comments -> Disqus, or if
you have a large database, you may do this by hand:
CREATE INDEX disqus_dupecheck ON `wp_commentmeta` (meta_key, meta_value(11));
INSERT INTO `wp_options` (blog_id, option_name, option_value, autoload) VALUES (0, 'disqus_version', '2.49', 'yes') ON DUPLICATE KEY UPDATE option_value = VALUES(option_value);
= 2.48 =
* Comment synchronization has been optimized to be a single call per-site.
* disqus.css will now only load when displaying comments
= 2.47 =
* Fixed a security hole with comment importing.
* Reverted ability to use default template comments design.
* Comments will now store which version they were imported under.
* Added an option to disable server side rendering.
= 2.46 =
* Better debugging information for export errors.
* Added the ability to manual import Disqus comments into Wordpress.
* Added thread_identifier support to exports.
* Cleaned up API error messages.
* Fixed a bug which was causing the import process to not grab only the latest set of comments.
* Added an option to disable automated synchronization with Disqus.
= 2.45 =
* Comments should now store thread information as well as certain other meta data.
* Optimize get_thread polling to only pull comments which aren't stored properly.
= 2.44 =
* Fixed JavaScript response for comments sync call.
* Comments are now marked as closed while showing the embed (fixes showing default respond form).
= 2.43 =
* Fixed a JavaScript syntax error which would cause linting to fail.
* Correct an issue that was causing comments.php to throw a syntax error under some configurations.
= 2.42 =
* Correct a bug with saving disqus_user_api_key (non-critical).
* Added settings to Debug Information.
* Adjusting all includes to use absolute paths.
* Adjusted JSON usage to solve a problem for some clients.
= 2.41 =
* Correct a bug with double urlencoding titles.
= 2.40 =
* Comments are now synced with Disqus as a delayed asynchronous cron event.
* Comment count code has been updated to use the new widget. (Comment counts
must be linked to get tracked within "the loop" now).
* API bindings have been migrated to the generic 1.1 Disqus API.
* Pages will now properly update their permalink with Disqus when it changes. This is
done within the sync event above.
* There is now a Debug Information pane under Advanced to assist with support requests.
* When Disqus is unreachable it will fallback to the theme's built-in comment display.
* Legacy mode is no longer available.
* The plugin management interface can now be localized.
* The plugin is now valid HTML5.
== Support ==
* Visit http://disqus.com/help/wordpress for help documentation.
* Visit http://help.disqus.com for help from our support team.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

@@ -1,106 +1,106 @@
#!/usr/bin/php
<?php
/**
* Incrementally (in chunks of EXPORT_CHUNK_SIZE) exports all comments to DISQUS.
*
* ``php export-comments.php``
*/
require_once(dirname(__FILE__) . '/../lib/wp-cli.php');
require_once(dirname(__FILE__) . '/../disqus.php');
require_once(dirname(__FILE__) . '/../export.php');
define('EXPORT_CHUNK_SIZE', 100);
$forum_url = get_option('disqus_forum_url');
if (empty($forum_url)) {
print_line("Disqus has not been configured on this installation!");
die();
}
print_line('---------------------------------------------------------');
print_line('Discovered DISQUS forum shortname as %s', $forum_url);
print_line('---------------------------------------------------------');
global $wpdb, $dsq_api;
$timestamp = 0;
$post_id = 0;
$total = 0;
$eof = 0;
$total_exported = 0;
$global_start = microtime();
$max_post_id = $wpdb->get_var($wpdb->prepare("
SELECT MAX(ID)
FROM $wpdb->posts
WHERE post_type != 'revision'
AND post_status = 'publish'
AND comment_count > 0
AND ID > %d
", $post_id));
print_line('Max post id is %d', $max_post_id);
while ($post_id < $max_post_id) {
$start = microtime();
$post = $wpdb->get_results($wpdb->prepare("
SELECT *
FROM $wpdb->posts
WHERE post_type != 'revision'
AND post_status = 'publish'
AND comment_count > 0
AND ID > %d
ORDER BY ID ASC
LIMIT 1
", $post_id));
$post = $post[0];
$post_id = $post->ID;
print_line(' Exporting comments for post id %d', $post_id);
$response = null;
$query = $wpdb->get_results( $wpdb->prepare("SELECT COUNT(*) as total FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%' LIMIT ".EXPORT_CHUNK_SIZE, $post_id) );
$total_comments = $query[0]->total;
$comments = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%' LIMIT ".EXPORT_CHUNK_SIZE, $post_id) );
$group_id = null;
$at = 0;
// we need to send empty files to ensure EOF happens
while (($at === 0 && $post_id == $max_post_id) || $at < $total_comments) {
if ($post_id == $max_post_id && ($at + EXPORT_CHUNK_SIZE) >= $total_comments) {
$eof = 1;
}
$wxr = dsq_export_wp($post, $comments);
$response = $dsq_api->import_wordpress_comments($wxr, $timestamp, $eof);
if (!($response['group_id'] > 0)) {
print_line('---------------------------------------------------------');
print_line('There was an error communicating with DISQUS!');
print_line($dsq_api->get_last_error());
print_line('---------------------------------------------------------');
}
$group_id = $response['group_id'];
print_line(' %d comments exported', count($comments), $time);
$total_exported += count($comments);
$at += EXPORT_CHUNK_SIZE;
$comments = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%' LIMIT ".EXPORT_CHUNK_SIZE." OFFSET {$at}", $post->ID) );
// assuming the cache is the internal, reset it's value to empty to avoid
// large memory consumption
$wp_object_cache->cache = array();
}
$time = abs(microtime() - $start);
print_line(' Done! (took %.2fs)', $time);
}
$total_time = abs(microtime() - $global_start);
print_line('---------------------------------------------------------');
print_line('Done (processing took %.2fs)! %d comments were sent to DISQUS', $total_time, $total_exported);
if ($group_id) {
print_line('');
print_line('Status available at http://import.disqus.com/group/%d/', $group_id);
}
print_line('---------------------------------------------------------');
#!/usr/bin/php
<?php
/**
* Incrementally (in chunks of EXPORT_CHUNK_SIZE) exports all comments to DISQUS.
*
* ``php export-comments.php``
*/
require_once(dirname(__FILE__) . '/../lib/wp-cli.php');
require_once(dirname(__FILE__) . '/../disqus.php');
require_once(dirname(__FILE__) . '/../export.php');
define('EXPORT_CHUNK_SIZE', 100);
$forum_url = get_option('disqus_forum_url');
if (empty($forum_url)) {
print_line("Disqus has not been configured on this installation!");
die();
}
print_line('---------------------------------------------------------');
print_line('Discovered DISQUS forum shortname as %s', $forum_url);
print_line('---------------------------------------------------------');
global $wpdb, $dsq_api;
$timestamp = 0;
$post_id = 0;
$total = 0;
$eof = 0;
$total_exported = 0;
$global_start = microtime();
$max_post_id = $wpdb->get_var($wpdb->prepare("
SELECT MAX(ID)
FROM $wpdb->posts
WHERE post_type != 'revision'
AND post_status = 'publish'
AND comment_count > 0
AND ID > %d
", $post_id));
print_line('Max post id is %d', $max_post_id);
while ($post_id < $max_post_id) {
$start = microtime();
$post = $wpdb->get_results($wpdb->prepare("
SELECT *
FROM $wpdb->posts
WHERE post_type != 'revision'
AND post_status = 'publish'
AND comment_count > 0
AND ID > %d
ORDER BY ID ASC
LIMIT 1
", $post_id));
$post = $post[0];
$post_id = $post->ID;
print_line(' Exporting comments for post id %d', $post_id);
$response = null;
$query = $wpdb->get_results( $wpdb->prepare("SELECT COUNT(*) as total FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%' LIMIT ".EXPORT_CHUNK_SIZE, $post_id) );
$total_comments = $query[0]->total;
$comments = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%' LIMIT ".EXPORT_CHUNK_SIZE, $post_id) );
$group_id = null;
$at = 0;
// we need to send empty files to ensure EOF happens
while (($at === 0 && $post_id == $max_post_id) || $at < $total_comments) {
if ($post_id == $max_post_id && ($at + EXPORT_CHUNK_SIZE) >= $total_comments) {
$eof = 1;
}
$wxr = dsq_export_wp($post, $comments);
$response = $dsq_api->import_wordpress_comments($wxr, $timestamp, $eof);
if (!($response['group_id'] > 0)) {
print_line('---------------------------------------------------------');
print_line('There was an error communicating with DISQUS!');
print_line($dsq_api->get_last_error());
print_line('---------------------------------------------------------');
}
$group_id = $response['group_id'];
print_line(' %d comments exported', count($comments), $time);
$total_exported += count($comments);
$at += EXPORT_CHUNK_SIZE;
$comments = $wpdb->get_results( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_agent NOT LIKE 'Disqus/%%' LIMIT ".EXPORT_CHUNK_SIZE." OFFSET {$at}", $post->ID) );
// assuming the cache is the internal, reset it's value to empty to avoid
// large memory consumption
$wp_object_cache->cache = array();
}
$time = abs(microtime() - $start);
print_line(' Done! (took %.2fs)', $time);
}
$total_time = abs(microtime() - $global_start);
print_line('---------------------------------------------------------');
print_line('Done (processing took %.2fs)! %d comments were sent to DISQUS', $total_time, $total_exported);
if ($group_id) {
print_line('');
print_line('Status available at http://import.disqus.com/group/%d/', $group_id);
}
print_line('---------------------------------------------------------');
?>
@@ -1,63 +1,63 @@
#!/usr/bin/php
<?php
/**
* Incrementally downloads all comments from DISQUS.
*
* ``php import-comments.php``
*/
require_once(dirname(__FILE__) . '/../lib/wp-cli.php');
require_once(dirname(__FILE__) . '/../disqus.php');
$forum_url = get_option('disqus_forum_url');
if (empty($forum_url)) {
print_line("Disqus has not been configured on this installation!");
die();
}
print_line('---------------------------------------------------------');
print_line('Discovered DISQUS forum shortname as %s', $forum_url);
print_line('---------------------------------------------------------');
$imported = true;
if (in_array('--reset', $argv)) {
$last_comment_id = 0;
} else {
$last_comment_id = get_option('disqus_last_comment_id');
}
$force = (in_array('--force', $argv));
$total = 0;
$global_start = microtime();
$memory_usage = memory_get_peak_usage();
while ($imported) {
print_line(' Importing chunk starting at comment id %d', $last_comment_id);
$start = microtime();
$result = dsq_sync_forum($last_comment_id, $force);
if ($result === false) {
print_line('---------------------------------------------------------');
print_line('There was an error communicating with DISQUS!');
print_line($dsq_api->get_last_error());
print_line('---------------------------------------------------------');
die();
break;
} else {
list($imported, $last_comment_id) = $result;
}
$total += $imported;
$time = abs(microtime() - $start);
// assuming the cache is the internal, reset it's value to empty to avoid
// large memory consump
$wp_object_cache->cache = array();
$new_memory_usage = memory_get_peak_usage();
print_line(' %d comments imported (took %.2fs, memory increased by %db)', $imported, $time, ($new_memory_usage - $memory_usage));
$memory_usage = $new_memory_usage;
}
$total_time = abs(microtime() - $global_start);
print_line('---------------------------------------------------------');
print_line('Done (took %.2fs)! %d comments imported from DISQUS', $total_time, $total);
print_line('---------------------------------------------------------');
#!/usr/bin/php
<?php
/**
* Incrementally downloads all comments from DISQUS.
*
* ``php import-comments.php``
*/
require_once(dirname(__FILE__) . '/../lib/wp-cli.php');
require_once(dirname(__FILE__) . '/../disqus.php');
$forum_url = get_option('disqus_forum_url');
if (empty($forum_url)) {
print_line("Disqus has not been configured on this installation!");
die();
}
print_line('---------------------------------------------------------');
print_line('Discovered DISQUS forum shortname as %s', $forum_url);
print_line('---------------------------------------------------------');
$imported = true;
if (in_array('--reset', $argv)) {
$last_comment_id = 0;
} else {
$last_comment_id = get_option('disqus_last_comment_id');
}
$force = (in_array('--force', $argv));
$total = 0;
$global_start = microtime();
$memory_usage = memory_get_peak_usage();
while ($imported) {
print_line(' Importing chunk starting at comment id %d', $last_comment_id);
$start = microtime();
$result = dsq_sync_forum($last_comment_id, $force);
if ($result === false) {
print_line('---------------------------------------------------------');
print_line('There was an error communicating with DISQUS!');
print_line($dsq_api->get_last_error());
print_line('---------------------------------------------------------');
die();
break;
} else {
list($imported, $last_comment_id) = $result;
}
$total += $imported;
$time = abs(microtime() - $start);
// assuming the cache is the internal, reset it's value to empty to avoid
// large memory consump
$wp_object_cache->cache = array();
$new_memory_usage = memory_get_peak_usage();
print_line(' %d comments imported (took %.2fs, memory increased by %db)', $imported, $time, ($new_memory_usage - $memory_usage));
$memory_usage = $new_memory_usage;
}
$total_time = abs(microtime() - $global_start);
print_line('---------------------------------------------------------');
print_line('Done (took %.2fs)! %d comments imported from DISQUS', $total_time, $total);
print_line('---------------------------------------------------------');
?>
@@ -1,21 +1,21 @@
<?php
require(ABSPATH . 'wp-includes/version.php');
if ( !current_user_can('manage_options') ) {
die();
}
$step = (isset($_GET['step']) ? $_GET['step'] : null);
?>
<div class="wrap">
<h2><?php echo dsq_i('Upgrade Disqus Comments'); ?></h2>
<form method="POST" action="?page=disqus&amp;step=<?php echo esc_attr($step); ?>">
<?php wp_nonce_field('dsq-wpnonce_upgrade', 'dsq-form_nonce_upgrade'); ?>
<p><?php echo dsq_i('You need to upgrade your database to continue.'); ?></p>
<p class="submit" style="text-align: left">
<input type="submit" name="upgrade" value="Upgrade &raquo;" />
</p>
</form>
<?php
require(ABSPATH . 'wp-includes/version.php');
if ( !current_user_can('manage_options') ) {
die();
}
$step = (isset($_GET['step']) ? $_GET['step'] : null);
?>
<div class="wrap">
<h2><?php echo dsq_i('Upgrade Disqus Comments'); ?></h2>
<form method="POST" action="?page=disqus&amp;step=<?php echo esc_attr($step); ?>">
<?php wp_nonce_field('dsq-wpnonce_upgrade', 'dsq-form_nonce_upgrade'); ?>
<p><?php echo dsq_i('You need to upgrade your database to continue.'); ?></p>
<p class="submit" style="text-align: left">
<input type="submit" name="upgrade" class="button-primary button" value="Upgrade &raquo;" />
</p>
</form>
</div>
@@ -1 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <body> <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/XdCommReceiver.js" type="text/javascript"></script> </body> </html>
@@ -1,339 +1,339 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
@@ -1,284 +1,322 @@
=== Google Calendar Events ===
Contributors: pderksen, nickyoung87, rosshanney
Tags: google calendar, google, calendar, events, gcal
Requires at least: 3.7.4
Tested up to: 4.0
Stable tag: trunk
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget.
== Description ==
Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget.
= Features =
* Parses Google Calendar feeds to extract events.
* Displays events as a list or within a calendar grid.
* Events from multiple Google Calendar feeds can be shown in a single list / grid.
* Lists and grids can be displayed in posts, pages or within a widget.
* Options to change the number of events retrieved, date / time format, cache duration, etc.
* Complete customisation of the event information displayed.
* Calendar grids can have the ability to change the month displayed.
[Plugin Documentation & Getting Started](http://wpdocs.philderksen.com/google-calendar-events/?utm_source=wordpress_org&utm_medium=link&utm_campaign=gce_lite)
###Feature Requests and Updates###
* [Public roadmap/feature requests](https://trello.com/b/ZQSzsarY)
* [Get notified when new features are released](http://eepurl.com/0_VsT)
* [Follow this project on Github](https://github.com/pderksen/WP-Google-Calendar-Events)
This plugin was originally created by [Ross Hanney](http://www.rhanney.co.uk), a web developer based in the UK specialising in WordPress and PHP.
## Available Translations ##
* Spanish - Provided by Eduardo Larequi of [educacion.navarra.es/web/pnte/](http://www.educacion.navarra.es/web/pnte/).
* Italian - Provided by Francesco Paccagnella of [pacca.it](http://www.pacca.it/).
* French - Provided by Vincent Bray.
* German - Provided by Stefanie Drucker of [kreativhuhn.at](http://www.kreativhuhn.at/).
* Norwegian - Provided by Tore Hjartland of [aliom.no](http://www.aliom.no/).
== Installation ==
There are three ways to install this plugin.
= 1. Admin Search =
1. In your Admin, go to menu Plugins > Add.
1. Search for `Google Calendar`.
1. Find the plugin that's labeled `Google Calendar Events`.
1. Look for the author name `Phil Derksen` on the plugin.
1. Click to install.
1. Activate the plugin.
1. A new menu item `GCal Events` will appear in the main menu.
= 2. Download & Upload =
1. Download the plugin (a zip file) on the right column of this page.
1. In your Admin, go to menu Plugins > Add.
1. Select the tab "Upload".
1. Upload the .zip file you just downloaded.
1. Activate the plugin.
1. A new menu item `GCal Events` will appear in the main menu.
= 3. FTP Upload =
1. Download the plugin (.zip file) on the right column of this page.
1. Unzip the zip file contents.
1. Upload the `google-calendar-events` folder to the `/wp-content/plugins/` directory of your site.
1. Activate the plugin through the 'Plugins' menu in WordPress.
1. A new menu item `GCal Events` will appear in the main menu.
== Frequently Asked Questions ==
[Plugin Documentation & Getting Started](http://wpdocs.philderksen.com/google-calendar-events/?utm_source=wordpress_org&utm_medium=link&utm_campaign=gce_lite)
== Screenshots ==
1. Grid display in full page with tooltip
1. Grid display in widget
1. List display in widget
1. Simple display options
1. Calendar feed settings
1. Calendar widget settings
1. Event display builder editor
== Changelog ==
= 2.0.6 =
* Added minimum and maximum feed date options to fix event display issues and boost performance.
* Fixed a caching issue to increase performance.
* Fixed bug where backslashes kept getting added to event titles that already contained single quotes when navigating through pages in widget.
= 2.0.5.1 =
* Fix timezone issue.
= 2.0.5 =
* Fixed display bug with event date and grouped lists.
* Fixed broken paging links when feed IDs contain spaces between them.
* Fixed bug with start offset and grouped lists not working properly.
* Fixed bug where clear cache link was showing on any type of CPT.
* Added German translation - Provided by Stefanie Drucker of [kreativhuhn.at](http://www.kreativhuhn.at/).
* Added Norwegian translation - Provided by Tore Hjartland of [aliom.no](http://www.aliom.no/).
= 2.0.4 =
* Added option to show/hide paging.
* Added option to limit display to any number of days or events per page.
* Added option to set the start date offset any number of days back or ahead (list view).
* Removed retrieve events from/until options now that display limit options will be used.
* Removed max number of events to retrieve option.
* Added shortcode attribute 'paging'.
* Added shortcode attribute 'interval'.
* Added shortcode attribute 'interval_count'.
* Added shortcode attribute 'offset_interval_count'.
* Added shortcode attribute 'offset_direction'.
* Updated shortcode 'display' attribute to allow a value of 'grouped-list'.
* Date no longer shows up for the title (list view).
* HTML restructured to use div tags instead of an unordered list (list view).
* Nav bar HTML (Back/Next links and month title) restructured to use div tags instead of span and percentages.
* Moved clear cache button and changed style.
* Added Italian translation - Provided by Francesco Paccagnella of [pacca.it](http://www.pacca.it/).
* Added French translation - Provided by Vincent Bray.
* Fixed PHP error during upgrade.
* Fixed cross-site scripting (XSS) vulnerability.
* JavaScript restructured to fit more in line with best practices.
* Remove unused admin script file.
= 2.0.3.1 =
* Fixed bug where retrieve from/until dates were accidentally removed.
= 2.0.3 =
* Fixed bug where calendar feed caches weren't getting cleared properly.
* Fixed feed settings metabox content wrapping issue.
= 2.0.2 =
* Added Spanish translation - Provided by Eduardo Larequi of [educacion.navarra.es/web/pnte/](http://www.educacion.navarra.es/web/pnte/).
* Fixed timezone issues by forcing calendar feeds to use the timezone selected in the site's General Settings. Feed-specific timezone setting removed.
* Fixed a bug with recurring events display.
* Fixed an upgrade bug with multiple day events.
= 2.0.1 =
* Fixed display errors with certain event builder shortcodes.
* Added language folder.
= 2.0.0 =
* Plugin rewritten from scratch.
* Now using custom post types for storing and customizing Google calendar feeds.
* Introduced the shortcode `[gcal]` (old shortcode still supported).
= 0.7.3.1 =
* Include missing file: upgrade-notice.php.
= 0.7.3 =
* Added warning about upcoming version 2.0 release.
* Added option to save settings upon uninstall.
* Tested with WordPress 4.0.
= 0.7.2 =
* Fixed a bug causing the "More details" Google Calendar information to be displayed in the wrong timezone
* Fixed a bug that prevented setting the cache duration to 0 from working correctly
* Fixed an issue that prevented Ajax from working with FORCE_SSL_ADMIN enabled
* Now uses [wp_enqueue_scripts](http://wpdevel.wordpress.com/2011/12/12/use-wp_enqueue_scripts-not-wp_print_styles-to-enqueue-scripts-and-styles-for-the-frontend/)
= 0.7.1 =
* Fixed bug causing AJAX enabled calendar grids to not function correctly
* Fixed bug causing all-day events from outside required date range to be displayed
* Fixed bug causing tooltip date title heading setting to be ignored
* Added further data sanitisation on output
* Feeds with no events will now be cached to prevent HTTP requests on every page load
= 0.7 =
* Fixed bug causing event dates / times to be displayed in the wrong timezone
* Changed the [link-path] Event Display Builder shortcode to [url]
* Fixed an Opera specific CSS issue causing page lists to be hidden
* Lists can now be displayed in descending or ascending order
* Added [event-id] and [cal-id] Event Display Builder shortcodes
* Added an offset parameter for date / time based Event Display Builder shortcodes
* Added an autolink parameter for enabling / disabling automatic linking of URLs
* Added gce-day-past or gce-day-future classes to calendar grid cells
* Cleaned up CSS
= 0.6 =
* Drastically reduced memory usage
* Improved feed data caching system
* Improved error reporting
* General performance and efficiency improvements
* Added a few more shortcodes to the event display builder
* Other [miscellaneous changes / additions and bug fixes](http://www.rhanney.co.uk/2011/04/29/google-calendar-events-0-6)
= 0.5 =
* Added [event display builder](http://www.rhanney.co.uk/plugins/google-calendar-events/event-display-builder) feature, which vastly improves the customization possibilities of the plugin. This feature encompasses many of the most requested features, such as:
- All-day events can be handled differently than 'normal' events
- Start and end times / dates can be displayed on the same line (as can any other event information)
- HTML (and Markdown) entered in Google Calendar fields can be properly parsed
* Start and end times for retrieval of events are now much more flexible
* A custom error message for non-admin users can now be specified
* No longer loads SimplePie when it is not required
= 0.4.1 =
* Fix / workaround for the long-running timezone bug. Please take a look at [this](http://www.rhanney.co.uk/2011/01/16/google-calendar-events-0-4-1) for more information.
* Added additional 'Maximum no. events to display' option to widget / shortcode (mainly to address a further issue caused by the above fix)
* i18n related bug fix
* Added support for widget_title filter (courtesy of [James](http://lunasea-studios.com))
* Added Hungarian (hu_HU) translation ([danieltakacs](http://ek.klog.hu))
* Now using minified version of jQuery qTip script
= 0.4 =
* More control over how start and end dates / times are displayed
* Events can now be limited to a specified timeframe (number of days)
* Events on the same day in lists can now be shown under a single date title
* JavaScript can now be added to the footer rather than the header, via an option
* The 'Loading...' text can now be customized
* Description text can now be limited to a specified number of words
* Multi-day events can be shown on each day that they span ([sort of](http://www.rhanney.co.uk/2010/08/19/google-calendar-events-0-4#multiday))
* Bug fixes
* i18n / l10n fixes
= 0.3.1 =
* l10n / i18n fixes. Dates should now be localized correctly and should maintain localization after an AJAX request
* MU / Multi-site issues. Issues preventing adding of feeds have been addressed
= 0.3 =
* Now allows events from multiple Google Calendar feeds to be displayed on a single calendar grid / list
* Internationalization support added
= 0.2.1 =
* Added option to allow 'More details' links to open in new window / tab.
* Added option to choose a specific timezone for each feed
* Line breaks in an event description will now be preserved
* Fixed a bug casing the title to not be displayed on lists
* Other minor bug fixes
= 0.2 =
* Added customization options for how information is displayed.
* Can now display: start time, end time and date, location, description and event link.
* Tooltips now using qTip jQuery plugin.
= 0.1.4 =
* More bug fixes.
= 0.1.3 =
* Several bug fixes, including fixing JavaScript problems that prevented tooltips appearing.
= 0.1.2 =
* Bug fixes.
= 0.1.1 =
* Fix to prevent conflicts with other plugins.
* Changes to readme.txt.
= 0.1 =
* Initial release.
== Upgrade Notice ==
= 2.0.0 =
This is a major upgrade to a new code base and structure. PLEASE make sure you backup your site before upgrading.
=== Google Calendar Events ===
Contributors: pderksen, nickyoung87, rosshanney
Tags: google calendar, google, calendar, events, gcal
Requires at least: 3.7.4
Tested up to: 4.0
Stable tag: trunk
License: GPLv2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget.
== Description ==
Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget.
= Features =
* Parses Google Calendar feeds to extract events.
* Displays events as a list or within a calendar grid.
* Events from multiple Google Calendar feeds can be shown in a single list / grid.
* Lists and grids can be displayed in posts, pages or within a widget.
* Options to change the number of events retrieved, date / time format, cache duration, etc.
* Complete customisation of the event information displayed.
* Calendar grids can have the ability to change the month displayed.
[Plugin Documentation & Getting Started](http://wpdocs.philderksen.com/google-calendar-events/?utm_source=wordpress_org&utm_medium=link&utm_campaign=gce_lite)
###Feature Requests and Updates###
* [Public roadmap/feature requests](https://trello.com/b/ZQSzsarY)
* [Get notified when new features are released](http://eepurl.com/0_VsT)
* [Follow this project on Github](https://github.com/pderksen/WP-Google-Calendar-Events)
This plugin was originally created by [Ross Hanney](http://www.rhanney.co.uk), a web developer based in the UK specialising in WordPress and PHP.
## Available Translations ##
* Spanish - Provided by Eduardo Larequi of [educacion.navarra.es/web/pnte/](http://www.educacion.navarra.es/web/pnte/).
* Italian - Provided by Francesco Paccagnella of [pacca.it](http://www.pacca.it/).
* French - Provided by Vincent Bray.
* German - Provided by Stefanie Drucker of [kreativhuhn.at](http://www.kreativhuhn.at/).
* Norwegian - Provided by Tore Hjartland of [aliom.no](http://www.aliom.no/).
* Polish - Provided by Michał Pasternak of [iplweb.pl](http://iplweb.pl/).
* Lithuanian - Provided by Andrius Mazeika of [mazeika.info](http://mazeika.info/).
== Installation ==
There are three ways to install this plugin.
= 1. Admin Search =
1. In your Admin, go to menu Plugins > Add.
1. Search for `Google Calendar`.
1. Find the plugin that's labeled `Google Calendar Events`.
1. Look for the author name `Phil Derksen` on the plugin.
1. Click to install.
1. Activate the plugin.
1. A new menu item `GCal Events` will appear in the main menu.
= 2. Download & Upload =
1. Download the plugin (a zip file) on the right column of this page.
1. In your Admin, go to menu Plugins > Add.
1. Select the tab "Upload".
1. Upload the .zip file you just downloaded.
1. Activate the plugin.
1. A new menu item `GCal Events` will appear in the main menu.
= 3. FTP Upload =
1. Download the plugin (.zip file) on the right column of this page.
1. Unzip the zip file contents.
1. Upload the `google-calendar-events` folder to the `/wp-content/plugins/` directory of your site.
1. Activate the plugin through the 'Plugins' menu in WordPress.
1. A new menu item `GCal Events` will appear in the main menu.
== Frequently Asked Questions ==
[Plugin Documentation & Getting Started](http://wpdocs.philderksen.com/google-calendar-events/?utm_source=wordpress_org&utm_medium=link&utm_campaign=gce_lite)
== Screenshots ==
1. Grid display in full page with tooltip
1. Grid display in widget
1. List display in widget
1. Simple display options
1. Calendar feed settings
1. Calendar widget settings
1. Event display builder editor
== Changelog ==
= 2.1.1 =
* Fixed bug with all day events not displaying.
* Added missing timezone parameter to internal query.
= 2.1.0 =
* Updated to use Google Calendar API version 3. Version 2 deprecated on Nov. 17, 2014.
= 2.0.7.1 =
* As of Nov. 17, 2014 the GCal API v2 is deprecated, which breaks all calendar feed displays. This update will temporarily hide the display while we work on a solution that uses GCal API v3.
= 2.0.7 =
* Events will now display if it hasn't ended yet for list views.
* Fixed bug with date() call causing a display error in some cases.
* Fixed bug with with widget tooltip text display.
* Added cache clearing on upgrade.
* Added filters for Previous and Next link text.
* Internationalization and language file updates.
* Simplified text domain function.
* Added Lithuanian translation - Provided by Andrius Mazeika of [mazeika.info](http://mazeika.info/).
= 2.0.6.2 =
* Reverted previous bug fix that introduced new bugs.
= 2.0.6.1 =
* Added Polish translation - Provided by Michał Pasternak of [iplweb.pl](http://iplweb.pl/).
* Updated Italian translation.
* Updated French translation.
* Fixed bug with date() call causing a display error in some cases.
* Minor bug fixes.
= 2.0.6 =
* Added minimum and maximum feed date options to fix event display issues and boost performance.
* Fixed a caching issue to increase performance.
* Fixed bug where backslashes kept getting added to event titles that already contained single quotes when navigating through pages in widget.
= 2.0.5.1 =
* Fix timezone issue.
= 2.0.5 =
* Fixed display bug with event date and grouped lists.
* Fixed broken paging links when feed IDs contain spaces between them.
* Fixed bug with start offset and grouped lists not working properly.
* Fixed bug where clear cache link was showing on any type of CPT.
* Added German translation - Provided by Stefanie Drucker of [kreativhuhn.at](http://www.kreativhuhn.at/).
* Added Norwegian translation - Provided by Tore Hjartland of [aliom.no](http://www.aliom.no/).
= 2.0.4 =
* Added option to show/hide paging.
* Added option to limit display to any number of days or events per page.
* Added option to set the start date offset any number of days back or ahead (list view).
* Removed retrieve events from/until options now that display limit options will be used.
* Removed max number of events to retrieve option.
* Added shortcode attribute 'paging'.
* Added shortcode attribute 'interval'.
* Added shortcode attribute 'interval_count'.
* Added shortcode attribute 'offset_interval_count'.
* Added shortcode attribute 'offset_direction'.
* Updated shortcode 'display' attribute to allow a value of 'grouped-list'.
* Date no longer shows up for the title (list view).
* HTML restructured to use div tags instead of an unordered list (list view).
* Nav bar HTML (Back/Next links and month title) restructured to use div tags instead of span and percentages.
* Moved clear cache button and changed style.
* Added Italian translation - Provided by Francesco Paccagnella of [pacca.it](http://www.pacca.it/).
* Added French translation - Provided by Vincent Bray.
* Fixed PHP error during upgrade.
* Fixed cross-site scripting (XSS) vulnerability.
* JavaScript restructured to fit more in line with best practices.
* Remove unused admin script file.
= 2.0.3.1 =
* Fixed bug where retrieve from/until dates were accidentally removed.
= 2.0.3 =
* Fixed bug where calendar feed caches weren't getting cleared properly.
* Fixed feed settings metabox content wrapping issue.
= 2.0.2 =
* Added Spanish translation - Provided by Eduardo Larequi of [educacion.navarra.es/web/pnte/](http://www.educacion.navarra.es/web/pnte/).
* Fixed timezone issues by forcing calendar feeds to use the timezone selected in the site's General Settings. Feed-specific timezone setting removed.
* Fixed a bug with recurring events display.
* Fixed an upgrade bug with multiple day events.
= 2.0.1 =
* Fixed display errors with certain event builder shortcodes.
* Added language folder.
= 2.0.0 =
* Plugin rewritten from scratch.
* Now using custom post types for storing and customizing Google calendar feeds.
* Introduced the shortcode `[gcal]` (old shortcode still supported).
= 0.7.3.1 =
* Include missing file: upgrade-notice.php.
= 0.7.3 =
* Added warning about upcoming version 2.0 release.
* Added option to save settings upon uninstall.
* Tested with WordPress 4.0.
= 0.7.2 =
* Fixed a bug causing the "More details" Google Calendar information to be displayed in the wrong timezone
* Fixed a bug that prevented setting the cache duration to 0 from working correctly
* Fixed an issue that prevented Ajax from working with FORCE_SSL_ADMIN enabled
* Now uses [wp_enqueue_scripts](http://wpdevel.wordpress.com/2011/12/12/use-wp_enqueue_scripts-not-wp_print_styles-to-enqueue-scripts-and-styles-for-the-frontend/)
= 0.7.1 =
* Fixed bug causing AJAX enabled calendar grids to not function correctly
* Fixed bug causing all-day events from outside required date range to be displayed
* Fixed bug causing tooltip date title heading setting to be ignored
* Added further data sanitisation on output
* Feeds with no events will now be cached to prevent HTTP requests on every page load
= 0.7 =
* Fixed bug causing event dates / times to be displayed in the wrong timezone
* Changed the [link-path] Event Display Builder shortcode to [url]
* Fixed an Opera specific CSS issue causing page lists to be hidden
* Lists can now be displayed in descending or ascending order
* Added [event-id] and [cal-id] Event Display Builder shortcodes
* Added an offset parameter for date / time based Event Display Builder shortcodes
* Added an autolink parameter for enabling / disabling automatic linking of URLs
* Added gce-day-past or gce-day-future classes to calendar grid cells
* Cleaned up CSS
= 0.6 =
* Drastically reduced memory usage
* Improved feed data caching system
* Improved error reporting
* General performance and efficiency improvements
* Added a few more shortcodes to the event display builder
* Other [miscellaneous changes / additions and bug fixes](http://www.rhanney.co.uk/2011/04/29/google-calendar-events-0-6)
= 0.5 =
* Added [event display builder](http://www.rhanney.co.uk/plugins/google-calendar-events/event-display-builder) feature, which vastly improves the customization possibilities of the plugin. This feature encompasses many of the most requested features, such as:
- All-day events can be handled differently than 'normal' events
- Start and end times / dates can be displayed on the same line (as can any other event information)
- HTML (and Markdown) entered in Google Calendar fields can be properly parsed
* Start and end times for retrieval of events are now much more flexible
* A custom error message for non-admin users can now be specified
* No longer loads SimplePie when it is not required
= 0.4.1 =
* Fix / workaround for the long-running timezone bug. Please take a look at [this](http://www.rhanney.co.uk/2011/01/16/google-calendar-events-0-4-1) for more information.
* Added additional 'Maximum no. events to display' option to widget / shortcode (mainly to address a further issue caused by the above fix)
* i18n related bug fix
* Added support for widget_title filter (courtesy of [James](http://lunasea-studios.com))
* Added Hungarian (hu_HU) translation ([danieltakacs](http://ek.klog.hu))
* Now using minified version of jQuery qTip script
= 0.4 =
* More control over how start and end dates / times are displayed
* Events can now be limited to a specified timeframe (number of days)
* Events on the same day in lists can now be shown under a single date title
* JavaScript can now be added to the footer rather than the header, via an option
* The 'Loading...' text can now be customized
* Description text can now be limited to a specified number of words
* Multi-day events can be shown on each day that they span ([sort of](http://www.rhanney.co.uk/2010/08/19/google-calendar-events-0-4#multiday))
* Bug fixes
* i18n / l10n fixes
= 0.3.1 =
* l10n / i18n fixes. Dates should now be localized correctly and should maintain localization after an AJAX request
* MU / Multi-site issues. Issues preventing adding of feeds have been addressed
= 0.3 =
* Now allows events from multiple Google Calendar feeds to be displayed on a single calendar grid / list
* Internationalization support added
= 0.2.1 =
* Added option to allow 'More details' links to open in new window / tab.
* Added option to choose a specific timezone for each feed
* Line breaks in an event description will now be preserved
* Fixed a bug casing the title to not be displayed on lists
* Other minor bug fixes
= 0.2 =
* Added customization options for how information is displayed.
* Can now display: start time, end time and date, location, description and event link.
* Tooltips now using qTip jQuery plugin.
= 0.1.4 =
* More bug fixes.
= 0.1.3 =
* Several bug fixes, including fixing JavaScript problems that prevented tooltips appearing.
= 0.1.2 =
* Bug fixes.
= 0.1.1 =
* Fix to prevent conflicts with other plugins.
* Changes to readme.txt.
= 0.1 =
* Initial release.
== Upgrade Notice ==
= 2.1.0 =
Updated to use Google Calendar API version 3. Version 2 deprecated on Nov. 17, 2014.
@@ -55,6 +55,70 @@ class Google_Calendar_Events_Admin {
// Add the options page and menu item.
add_action( 'admin_menu', array( $this, 'add_plugin_admin_menu' ), 2 );
// Add admin notice for users upgrading from before 2.1.0.
if( version_compare( $this->version, '2.1.0', '<' ) ) {
add_action( 'admin_notices', array( $this, 'show_admin_notice' ) );
}
// Add admin notice after plugin activation. Also check if should be hidden.
add_action( 'admin_notices', array( $this, 'admin_api_settings_notice' ) );
}
/**
* Show notice after plugin install/activate
* Also check if user chooses to hide it.
*
* @since 2.1.0
*/
public function admin_api_settings_notice() {
// Exit all of this is stored value is false/0 or not set.
if ( false == get_option( 'gce_show_admin_install_notice' ) ) {
return;
}
$screen = get_current_screen();
// Delete stored value if "hide" button click detected (custom querystring value set to 1).
if ( ! empty( $_REQUEST['gce-dismiss-install-nag'] ) || in_array( $screen->id, $this->plugin_screen_hook_suffix ) ) {
delete_option( 'gce_show_admin_install_notice' );
return;
}
// At this point show install notice. Show it only on the plugin screen.
if( get_current_screen()->id == 'plugins' || $this->viewing_this_plugin() ) {
include_once( 'views/admin/api-settings-notice.php' );
}
}
/**
* Check if viewing one of this plugin's admin pages.
*
* @since 2.1.0
*
* @return bool
*/
private function viewing_this_plugin() {
if ( ! isset( $this->plugin_screen_hook_suffix ) ) {
return false;
}
$screen = get_current_screen();
if ( $screen->id == 'edit-gce_feed' || $screen->id == 'gce_feed' ) {
return true;
} else {
return false;
}
}
/**
* Fired when the plugin is activated.
*
* @since 2.1.0
*/
public static function activate() {
update_option( 'gce_show_admin_install_notice', 1 );
}
public function add_plugin_admin_menu() {
@@ -131,11 +195,27 @@ class Google_Calendar_Events_Admin {
return array_merge(
array(
'settings' => '<a href="' . admin_url( 'edit.php?post_type=gce_feed&page=google-calendar-events_general_settings' ) . '">' . __( 'General Settings', 'gce' ) . '</a>',
'feeds' => '<a href="' . admin_url( 'edit.php?post_type=gce_feed' ) . '">' . __( 'Feeds', 'gce' ) . '</a>'
//'settings' => '<a href="' . admin_url( 'edit.php?post_type=gce_feed&page=google-calendar-events_general_settings' ) . '">' . __( 'Settings', 'gce' ) . '</a>',
),
$links
);
}
/**
* Use to show an important admin notice.
*
* @since 2.0.7.1
*/
/**
* Example use in constructor:
if( version_compare( $this->version, '2.1.0', '<' ) ) {
add_action( 'admin_notices', array( $this, 'show_admin_notice' ) );
}
*/
function show_admin_notice() {
include_once( 'includes/admin/admin-notice.php' );
}
}
@@ -18,7 +18,7 @@ class Google_Calendar_Events {
*
* @var string
*/
protected $version = '2.0.6';
protected $version = '2.1.1';
/**
* Unique identifier for the plugin.
@@ -137,8 +137,9 @@ class Google_Calendar_Events {
wp_localize_script( $this->plugin_slug . '-public', 'gce',
array(
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'ajaxnonce' => wp_create_nonce( 'gce_ajax_nonce' )
'ajaxurl' => admin_url( 'admin-ajax.php' ),
'ajaxnonce' => wp_create_nonce( 'gce_ajax_nonce' ),
'loadingText' => __( 'Loading...', 'gce' )
) );
}
@@ -196,26 +197,10 @@ class Google_Calendar_Events {
* @since 2.0.0
*/
public function plugin_textdomain() {
// Set filter for plugin's languages directory
$gce_lang_dir = dirname( plugin_basename( GCE_MAIN_FILE ) ) . '/languages/';
$gce_lang_dir = apply_filters( 'gce_languages_directory', $gce_lang_dir );
// Traditional WordPress plugin locale filter
$locale = apply_filters( 'plugin_locale', get_locale(), 'gce' );
$mofile = sprintf( '%1$s-%2$s.mo', 'gce', $locale );
// Setup paths to current locale file
$mofile_local = $gce_lang_dir . $mofile;
$mofile_global = WP_LANG_DIR . '/gce/' . $mofile;
if ( file_exists( $mofile_global ) ) {
load_textdomain( 'gce', $mofile_global );
} elseif ( file_exists( $mofile_local ) ) {
load_textdomain( 'gce', $mofile_local );
} else {
// Load the default language files
load_plugin_textdomain( 'gce', false, $gce_lang_dir );
}
load_plugin_textdomain(
'gce',
false,
dirname( plugin_basename( GCE_MAIN_FILE ) ) . '/languages/'
);
}
}
@@ -1,219 +1,219 @@
/**
* Public facing CSS file
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @copyright 2014 Phil Derksen
*/
/* Base line-height for all views & tooltip */
.gce-page-grid,
.gce-page-list,
.gce-widget-grid,
.gce-widget-list,
.gce-event-info {
line-height: 1.5;
}
/* Month & list titles for all views */
.gce-month-title,
.gce-list-title {
font-weight: bold;
padding-bottom: 5px;
}
/* Event titles with shaded background for all views */
.gce-list-event,
.gce-tooltip-event {
background-color: #ddd;
padding: 0 5px;
}
/* PAGE GRID */
.gce-page-grid .gce-calendar .gce-caption{ /* Caption at top of calendar */
color:#333333;
text-align:center;
}
.gce-page-grid .gce-calendar{ /* Main calendar table */
width:100%;
border-collapse:collapse;
border:1px solid #CCCCCC;
color:#CCCCCC;
}
.gce-page-grid .gce-calendar th{ /* Day headings (S, M etc.) */
border:1px solid #CCCCCC;
text-align:center;
width:14.29%;
padding:0;
}
.gce-page-grid .gce-calendar td{ /* Day table cells */
border:1px solid #CCCCCC;
text-align:center;
height:80px;
vertical-align:middle;
padding:0;
}
.gce-page-grid .gce-calendar .gce-has-events{ /* Table cells with events */
color:#333333;
cursor:pointer;
}
.gce-page-grid .gce-calendar .gce-event-info{ /* Event information */
display:none; /* Important! */
}
.gce-page-grid .gce-calendar .gce-day-number{ /* Day number span */
font-size:2em;
}
.gce-page-grid .gce-calendar .gce-today{ /* Table cell that represents today */
background-color:#DDDDDD;
}
.gce-page-grid .gce-calendar th abbr{ /* Day letter abbreviation */
border-bottom:none;
}
/* PAGE LIST */
.gce-page-list .gce-feed {
padding-bottom: 10px;
}
.gce-page-list .gce-list p{ /* Each piece of information in the list */
margin:0;
}
.gce-page-list .gce-list p span,
.gce-page-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */
color:#999999;
}
/* WIDGET GRID */
.gce-widget-grid .gce-calendar .gce-caption{
text-align:center;
}
.gce-widget-grid .gce-calendar{ /* Main calendar table */
width:100%;
border:1px solid #CCCCCC;
border-collapse:collapse;
}
.gce-widget-grid .gce-calendar th{ /* Day headings (S, M etc.) */
width:14.29%;
border:1px solid #CCCCCC;
text-align:center;
}
.gce-widget-grid .gce-calendar td{ /* Day table cells */
color:#CCCCCC;
width:14.29%;
border:1px solid #CCCCCC;
text-align:center;
}
.gce-widget-grid .gce-calendar .gce-has-events{ /* Table cells with events */
cursor:pointer;
color:#666666;
}
.gce-widget-grid .gce-calendar .gce-today{ /* Table cell that represents today */
background-color:#DDDDDD;
}
.gce-widget-grid .gce-calendar .gce-event-info{ /* Event information */
display:none; /* Important! */
}
.gce-widget-grid .gce-calendar th abbr{ /* Day name abbreviations */
border-bottom:none;
}
/* WIDGET LIST */
.gce-widget-list .gce-list p{ /* Each piece of information in the list */
margin:0;
}
.gce-widget-list .gce-list p span,
.gce-widget-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */
color:#999999;
}
/* TOOLTIP */
.gce-event-info{ /* Tooltip container */
background-color:#FFFFFF;
border:1px solid #333333;
max-width:300px;
}
.gce-event-info .gce-tooltip-title{ /* 'Events on...' text */
margin:5px;
font-weight:bold;
font-size:1.2em;
}
.gce-event-info ul{ /* Events list */
padding:0;
margin:5px;
list-style-type:none;
}
.gce-event-info ul li{ /* Event list item */
margin:10px 0 0 0;
}
.gce-event-info ul li p{ /* Each piece of information */
margin:0;
}
.gce-event-info ul li p span,
.gce-event-info ul li div span{ /* The text displayed before each piece of info, 'Starts:' for example */
color:#999999;
}
/** Calendar navigation bar, Prev/Next links & month title. **/
.gce-navbar {
width: 100%;
text-align: center;
clear: both;
overflow: hidden;
}
.gce-next,
.gce-prev {
white-space: nowrap;
}
.gce-prev {
float: left;
}
.gce-next {
float: right;
}
.gce-month-title {
display: inline-block;
margin: 0 auto;
white-space: nowrap;
}
/* Grouped List */
.gce-list-grouped .gce-feed {
margin-left: 5%;
}
/**
* Public facing CSS file
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @copyright 2014 Phil Derksen
*/
/* Base line-height for all views & tooltip */
.gce-page-grid,
.gce-page-list,
.gce-widget-grid,
.gce-widget-list,
.gce-event-info {
line-height: 1.5;
}
/* Month & list titles for all views */
.gce-month-title,
.gce-list-title {
font-weight: bold;
padding-bottom: 5px;
}
/* Event titles with shaded background for all views */
.gce-list-event,
.gce-tooltip-event {
background-color: #ddd;
padding: 0 5px;
}
/* PAGE GRID */
.gce-page-grid .gce-calendar .gce-caption{ /* Caption at top of calendar */
color:#333333;
text-align:center;
}
.gce-page-grid .gce-calendar{ /* Main calendar table */
width:100%;
border-collapse:collapse;
border:1px solid #CCCCCC;
color:#CCCCCC;
}
.gce-page-grid .gce-calendar th{ /* Day headings (S, M etc.) */
border:1px solid #CCCCCC;
text-align:center;
width:14.29%;
padding:0;
}
.gce-page-grid .gce-calendar td{ /* Day table cells */
border:1px solid #CCCCCC;
text-align:center;
height:80px;
vertical-align:middle;
padding:0;
}
.gce-page-grid .gce-calendar .gce-has-events{ /* Table cells with events */
color:#333333;
cursor:pointer;
}
.gce-page-grid .gce-calendar .gce-event-info{ /* Event information */
display:none; /* Important! */
}
.gce-page-grid .gce-calendar .gce-day-number{ /* Day number span */
font-size:2em;
}
.gce-page-grid .gce-calendar .gce-today{ /* Table cell that represents today */
background-color:#DDDDDD;
}
.gce-page-grid .gce-calendar th abbr{ /* Day letter abbreviation */
border-bottom:none;
}
/* PAGE LIST */
.gce-page-list .gce-feed {
padding-bottom: 10px;
}
.gce-page-list .gce-list p{ /* Each piece of information in the list */
margin:0;
}
.gce-page-list .gce-list p span,
.gce-page-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */
color:#999999;
}
/* WIDGET GRID */
.gce-widget-grid .gce-calendar .gce-caption{
text-align:center;
}
.gce-widget-grid .gce-calendar{ /* Main calendar table */
width:100%;
border:1px solid #CCCCCC;
border-collapse:collapse;
}
.gce-widget-grid .gce-calendar th{ /* Day headings (S, M etc.) */
width:14.29%;
border:1px solid #CCCCCC;
text-align:center;
}
.gce-widget-grid .gce-calendar td{ /* Day table cells */
color:#CCCCCC;
width:14.29%;
border:1px solid #CCCCCC;
text-align:center;
}
.gce-widget-grid .gce-calendar .gce-has-events{ /* Table cells with events */
cursor:pointer;
color:#666666;
}
.gce-widget-grid .gce-calendar .gce-today{ /* Table cell that represents today */
background-color:#DDDDDD;
}
.gce-widget-grid .gce-calendar .gce-event-info{ /* Event information */
display:none; /* Important! */
}
.gce-widget-grid .gce-calendar th abbr{ /* Day name abbreviations */
border-bottom:none;
}
/* WIDGET LIST */
.gce-widget-list .gce-list p{ /* Each piece of information in the list */
margin:0;
}
.gce-widget-list .gce-list p span,
.gce-widget-list .gce-list div span{ /* The text displayed before each piece of info, 'Starts:' for example */
color:#999999;
}
/* TOOLTIP */
.gce-event-info{ /* Tooltip container */
background-color:#FFFFFF;
border:1px solid #333333;
max-width:300px;
}
.gce-event-info .gce-tooltip-title{ /* 'Events on...' text */
margin:5px;
font-weight:bold;
font-size:1.2em;
}
.gce-event-info ul{ /* Events list */
padding:0;
margin:5px;
list-style-type:none;
}
.gce-event-info ul li{ /* Event list item */
margin:10px 0 0 0;
}
.gce-event-info ul li p{ /* Each piece of information */
margin:0;
}
.gce-event-info ul li p span,
.gce-event-info ul li div span{ /* The text displayed before each piece of info, 'Starts:' for example */
color:#999999;
}
/** Calendar navigation bar, Prev/Next links & month title. **/
.gce-navbar {
width: 100%;
text-align: center;
clear: both;
overflow: hidden;
}
.gce-next,
.gce-prev {
white-space: nowrap;
}
.gce-prev {
float: left;
}
.gce-next {
float: right;
}
.gce-month-title {
display: inline-block;
margin: 0 auto;
white-space: nowrap;
}
/* Grouped List */
.gce-list-grouped .gce-feed {
margin-left: 5%;
}
@@ -1,60 +1,67 @@
<?php
/**
* Google Calendar Events
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @link http://philderksen.com
* @copyright 2014 Phil Derksen
*
* @wordpress-plugin
* Plugin Name: Google Calendar Events
* Plugin URI: https://github.com/pderksen/WP-Google-Calendar-Events
* Description: Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget.
* Version: 2.0.6
* Author: Phil Derksen
* Author URI: http://philderksen.com
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: gce
* Domain Path: /languages
*/
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
/*
* Include the main plugin file
*
* @since 2.0.0
*/
require_once( 'class-google-calendar-events.php' );
/**
* Define constant pointing to this file
*
* @since 2.0.0
*/
if( ! defined( 'GCE_MAIN_FILE' ) ) {
define( 'GCE_MAIN_FILE', __FILE__ );
}
/*
* Get instance of our plugin
*
* @since 2.0.0
*/
add_action( 'plugins_loaded', array( 'Google_Calendar_Events', 'get_instance' ) );
/*
* If we are in admin then load the Admin class
*
* @since 2.0.0
*/
if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
require_once( 'class-google-calendar-events-admin.php' );
add_action( 'plugins_loaded', array( 'Google_Calendar_Events_Admin', 'get_instance' ) );
}
<?php
/**
* Google Calendar Events
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @link http://philderksen.com
* @copyright 2014 Phil Derksen
*
* @wordpress-plugin
* Plugin Name: Google Calendar Events
* Plugin URI: https://github.com/pderksen/WP-Google-Calendar-Events
* Description: Parses Google Calendar feeds and displays the events as a calendar grid or list on a page, post or widget.
* Version: 2.1.1
* Author: Phil Derksen
* Author URI: http://philderksen.com
* License: GPL-2.0+
* License URI: http://www.gnu.org/licenses/gpl-2.0.txt
* Text Domain: gce
* Domain Path: /languages
*/
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
/*
* Include the main plugin file
*
* @since 2.0.0
*/
require_once( 'class-google-calendar-events.php' );
/**
* Define constant pointing to this file
*
* @since 2.0.0
*/
if( ! defined( 'GCE_MAIN_FILE' ) ) {
define( 'GCE_MAIN_FILE', __FILE__ );
}
/*
* Get instance of our plugin
*
* @since 2.0.0
*/
add_action( 'plugins_loaded', array( 'Google_Calendar_Events', 'get_instance' ) );
/*
* If we are in admin then load the Admin class
*
* @since 2.0.0
*/
if ( is_admin() && ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) ) {
require_once( 'class-google-calendar-events-admin.php' );
// Register hooks that are fired when the plugin is activated, deactivated, and uninstalled, respectively.
register_activation_hook( __FILE__, array( 'Google_Calendar_Events_Admin', 'activate' ) );
// Get plugin admin class instance
add_action( 'plugins_loaded', array( 'Google_Calendar_Events_Admin', 'get_instance' ) );
}
@@ -32,11 +32,11 @@ function gce_default_editor_content( $content, $post ) {
if( $post->post_type == 'gce_feed' ) {
$content = '<div class="gce-list-event gce-tooltip-event">[event-title]</div>' . "\n";
$content .= '<div><span>Starts:</span> [start-time]</div>' . "\n";
$content .= '<div><span>Ends:</span> [end-date] - [end-time]</div>' . "\n";
$content .= '[if-location]<div><span>Location:</span> [location]</div>[/if-location]' . "\n";
$content .= '[if-description]<div><span>Description:</span> [description]</div>[/if-description]' . "\n";
$content .= '<div>[link newwindow="true"]More details...[/link]</div>' . "\n";
$content .= '<div><span>' . __( 'Starts:', 'gce' ) . '</span> [start-time]</div>' . "\n";
$content .= '<div><span>' . __( 'Ends:', 'gce' ) . '</span> [end-date] - [end-time]</div>' . "\n";
$content .= '[if-location]<div><span>' . __( 'Location:', 'gce' ) . '</span> [location]</div>[/if-location]' . "\n";
$content .= '[if-description]<div><span>' . __( 'Description:', 'gce' ) . '</span> [description]</div>[/if-description]' . "\n";
$content .= '<div>[link newwindow="true"]' . __( 'More details...', 'gce' ) . '[/link]</div>' . "\n";
// Default Post Meta Options
add_post_meta( $post->ID, 'gce_expand_recurring', 1 );
@@ -54,14 +54,14 @@ function gce_default_editor_content( $content, $post ) {
// Default Simple Display Options
add_post_meta( $post->ID, 'gce_display_start', 'time' );
add_post_meta( $post->ID, 'gce_display_start_text', 'Starts:' );
add_post_meta( $post->ID, 'gce_display_start_text', __( 'Starts:', 'gce' ) );
add_post_meta( $post->ID, 'gce_display_end', 'time-date' );
add_post_meta( $post->ID, 'gce_display_end_text', 'Ends:' );
add_post_meta( $post->ID, 'gce_display_end_text', __( 'Ends:', 'gce' ) );
add_post_meta( $post->ID, 'gce_display_separator', ', ' );
add_post_meta( $post->ID, 'gce_display_location_text', 'Location:' );
add_post_meta( $post->ID, 'gce_display_description_text', 'Description:' );
add_post_meta( $post->ID, 'gce_display_location_text', __( 'Location:', 'gce' ) );
add_post_meta( $post->ID, 'gce_display_description_text', __( 'Description:', 'gce' ) );
add_post_meta( $post->ID, 'gce_display_link', 1 );
add_post_meta( $post->ID, 'gce_display_link_text', 'More Details' );
add_post_meta( $post->ID, 'gce_display_link_text', __( 'More Details', 'gce' ) );
}
@@ -0,0 +1,26 @@
<?php
/**
* Show important upgrade notice.
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @copyright 2014 Phil Derksen
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<!-- class="updated" or class="error" -->
<div id="gce-admin-notice" class="error">
<p>
<strong>GCal Events Important Update Nov. 17, 2014:</strong><br/>
Google took version 2 of the GCal API offline, which breaks all calendar feed displays.<br/>
<strong><a href="https://wordpress.org/support/topic/nov-17-temporary-easy-embed-display-fix" target="_blank">Here's a temporary fix for your calendar display</a></strong>
while we move the plugin to using the new GCal API this week. Thanks for your patience.
</p>
</div>
@@ -22,6 +22,10 @@ function gce_upgrade() {
$version = get_option( 'gce_version' );
if( ! empty( $version ) ) {
// Clear out cache when upgrading no matter the version
gce_upgrade_clear_cache();
// Check if under version 2 and run the v2 upgrade if we are
if( version_compare( $version, '2.0.0-beta1', '<' ) && false === get_option( 'gce_upgrade_has_run' ) ) {
gce_v2_upgrade();
@@ -36,6 +40,10 @@ function gce_upgrade() {
if( version_compare( $version, '2.0.6', '<' ) ) {
gce_v206_upgrade();
}
if( version_compare( $version, '2.1.0', '<' ) ) {
gce_v210_upgrade();
}
}
$new_version = Google_Calendar_Events::get_instance()->get_plugin_version();
@@ -44,6 +52,30 @@ function gce_upgrade() {
add_option( 'gce_upgrade_has_run', 1 );
}
/*
* Run the upgrade to version 2.1.0
*/
function gce_v210_upgrade() {
$q = new WP_Query( 'post_type=gce_feed' );
if( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
$url = get_post_meta( get_the_ID(), 'gce_feed_url', true );
// https://www.google.com/calendar/feeds/umsb0ekhivs1a2ubtq6vlqvcjk%40group.calendar.google.com/public/basic
$url = str_replace( 'https://www.google.com/calendar/feeds/', '', $url );
$url = str_replace( '/public/basic', '', $url );
$url = str_replace( '%40', '@', $url );
update_post_meta( get_the_ID(), 'gce_feed_url', $url );
}
}
}
/*
* Run the upgrade to version 2.0.6
*
@@ -336,4 +368,23 @@ function update_widget_feed_ids() {
update_option( 'widget_gce_widget', $widget );
}
}
/**
* Update widget IDs
*
* @since 2.0.6.3
*/
function gce_upgrade_clear_cache() {
// Update feeds
$q = new WP_Query( 'post_type=gce_feed' );
if( $q->have_posts() ) {
while( $q->have_posts() ) {
$q->the_post();
delete_transient( 'gce_feed_' . get_the_ID() );
}
}
}
@@ -56,20 +56,12 @@ class GCE_Display {
*/
private function get_event_days() {
$event_days = array();
//Total number of events retrieved
$count = count( $this->merged_feeds );
//Loop through entire array of events, or until maximum number of events to be displayed has been reached
for ( $i = 0; $i < $count; $i++ ) {
$event = $this->merged_feeds[$i];
//Check that event ends, or starts (or both) within the required date range. This prevents all-day events from before / after date range from showing up.
//if ( $event->end_time > $event->start_time && $event->start_time < $event->end_time ) {
foreach ( $event->get_days() as $day ) {
$event_days[$day][] = $event;
}
foreach ( $this->merged_feeds as $event ) {
foreach ( $event->get_days() as $day ) {
$event_days[$day][] = $event;
}
}
return $event_days;
}
@@ -112,8 +104,7 @@ class GCE_Display {
//Array of previous and next link stuff for use in gce_generate_calendar (below)
foreach( $event_days as $key => $event_day ) {
if( $paging == null && $paging != 0 ) {
if( $paging === null ) {
$paging = get_post_meta( $event_day[0]->feed->id, 'gce_paging', true );
}
}
@@ -223,25 +214,26 @@ class GCE_Display {
// Get all the event days
$event_days = $this->get_event_days();
foreach( $event_days as $key => $event_day ) {
if( $paging_interval == null ) {
$max_num = get_post_meta( $event_day[0]->feed->id, 'gce_list_max_num', true );
if( $paging_type == null ) {
$max_length = get_post_meta( $event_day[0]->feed->id, 'gce_list_max_length', true );
$paging_type = $max_length;
}
}
if( $paging == null && $paging != 0 ) {
$paging = get_post_meta( $event_day[0]->feed->id, 'gce_paging', true );
}
$an_event_feed_id = current( $event_days );
$an_event_feed_id = $an_event_feed_id[0]->feed->id;
if( $paging_interval == null ) {
$max_num = get_post_meta( $an_event_feed_id, 'gce_list_max_num', true );
if( $start_offset == null && $start_offset != 0 ) {
$start_offset_num = get_post_meta( $event_day[0]->feed->id, 'gce_list_start_offset_num', true );
$start_offset_direction = get_post_meta( $event_day[0]->feed->id, 'gce_list_start_offset_direction', true );
if( $paging_type == null ) {
$max_length = get_post_meta( $an_event_feed_id, 'gce_list_max_length', true );
$paging_type = $max_length;
}
}
if( $paging === null ) {
$paging = get_post_meta( $an_event_feed_id, 'gce_paging', true );
}
if( $start_offset === null ) {
$start_offset_num = get_post_meta( $an_event_feed_id, 'gce_list_start_offset_num', true );
$start_offset_direction = get_post_meta( $an_event_feed_id, 'gce_list_start_offset_direction', true );
}
if( empty( $max_num ) || $max_num == 0 ) {
$max_num = 7;
@@ -251,7 +243,7 @@ class GCE_Display {
$paging_interval = $max_num * 86400;
}
if( $start_offset == null && $start_offset != 0 ) {
if( $start_offset === null ) {
if( $start_offset_direction == 'back' ) {
$start_offset_direction = -1;
} else {
@@ -274,8 +266,15 @@ class GCE_Display {
$markup = '<div class="gce-list" data-gce-start-offset="' . $start_offset . '" data-gce-start="' . ( $start + $paging_interval ) . '" data-gce-paging-interval="' . $paging_interval . '" data-gce-paging="' . $paging . '" data-gce-feeds="' . $feeds . '" data-gce-title="' . stripslashes( $this->title ) . '" data-gce-grouped="' . $grouped . '" data-gce-sort="' . $this->sort . '">' . "\n";
if( ( $paging != 0 ) && $max_length != 'events' ) {
$p = '<div class="gce-prev"><a href="#" class="gce-change-month-list" title="' . esc_attr__( 'Previous month', 'gce' ) . '" data-gce-paging-direction="back" data-gce-paging-type="' . $paging_type . '">'. __( 'Back', 'gce' ) . '</a></div>';
$n = '<div class="gce-next"><a href="#" class="gce-change-month-list" title="' . esc_attr__( 'Next month', 'gce' ) . '" data-gce-paging-direction="forward" data-gce-paging-type="' . $paging_type . '">' . __( 'Next', 'gce' ) . '</a></div>';
$prev_text = __( 'Back', 'gce' );
$next_text = __( 'Next', 'gce' );
$prev_text = apply_filters( 'gce_prev_text', $prev_text );
$next_text = apply_filters( 'gce_next_text', $next_text );
$p = '<div class="gce-prev"><a href="#" class="gce-change-month-list" title="' . esc_attr__( 'Previous month', 'gce' ) . '" data-gce-paging-direction="back" data-gce-paging-type="' . $paging_type . '">'. $prev_text . '</a></div>';
$n = '<div class="gce-next"><a href="#" class="gce-change-month-list" title="' . esc_attr__( 'Next month', 'gce' ) . '" data-gce-paging-direction="forward" data-gce-paging-type="' . $paging_type . '">' . $next_text . '</a></div>';
$markup .= '<caption class="gce-caption">' .
'<div class="gce-navbar">' .
@@ -287,6 +286,7 @@ class GCE_Display {
}
$max_count = 1;
$has_events = false;
$event_counter = 0;
if( $max_length == 'events' ) {
if( $start_offset === null ) {
@@ -299,7 +299,6 @@ class GCE_Display {
}
$event_counter = 0;
if( $max_events == null ) {
$max_events = $max_num;
@@ -308,56 +307,51 @@ class GCE_Display {
if ( $grouped ) {
$markup .=
'<div class="gce-list-grouped" ' . ( ( $key == $start ) ? ' class="gce-today"' : '' ) . '>' ;
'<div class="gce-list-grouped">' ;
}
if( $max_length != 'events' ) {
$max_events = INF;
}
else {
$end_time = INF;
}
foreach ( $event_days as $key => $event_day ) {
if( $max_length != 'events' ) {
if( $grouped && $key >= $start && $key < $end_time ) {
$markup .= '<div class="gce-list-title">' . stripslashes( $this->title ) . ' ' . date_i18n( $event_day[0]->feed->date_format, $key ) . '</div>';
}
foreach ( $event_day as $num_in_day => $event ) {
//Create the markup for this event
if( ( $event->start_time >= $start && $event->end_time <= $end_time ) || ( $event->day_type == 'MWD' && $event->start_time > $start && $event->start_time < $end_time ) ) {
// If this is a grouped list, generate a per-date group title with date.
if( $grouped && $key >= $start && $key < $end_time && $event_counter < $max_events ) {
$markup .= '<div class="gce-list-title">' . stripslashes( $this->title ) . ' ' . date_i18n( $event_day[0]->feed->date_format, $key ) . '</div>';
}
$markup .=
'<div class="gce-feed gce-feed-' . $event->feed->id . '">' .
//If this isn't a grouped list and a date title should be displayed, add the date title
( ( ! $grouped && isset( $event->title ) ) ? '<div class="gce-list-title">' . stripslashes( $this->title ) . '</div>' : '' ) .
//Add the event markup
$event->get_event_markup( 'list', $num_in_day, $i ) .
'</div>';
foreach ( $event_day as $num_in_day => $event ) {
//Create the markup for this event
if( ( $max_length != 'events' && (( $event->start_time >= $start && // Condition for limited by days
$event->end_time <= $end_time ) ||
( $event->day_type == 'MWD' &&
$event->start_time > $start &&
$event->start_time < $end_time )
)
) ||
( $max_length == 'events' && ( $event->end_time >= $time_now && // Condition for limited by events
$event_counter < $max_events )
)
) {
$markup .=
'<div class="gce-feed gce-feed-' . $event->feed->id . '">' .
//If this isn't a grouped list, generate a per-event title with date.
( ( ! $grouped ) ? ( ( isset( $this->title ) && $this->title !== '' ) )
? '<div class="gce-list-title">' . stripslashes( $this->title ) . ' ' . date_i18n( $event->feed->date_format, $event->start_time ) . '</div>'
: '' : '' ) .
//Add the event markup
$event->get_event_markup( 'list', $num_in_day, $i ) .
'</div>';
$has_events = true;
$i++;
}
}
} else {
if( $grouped && $key >= $start && $event_counter < $max_events ) {
$markup .= '<div class="gce-list-title">' . stripslashes( $this->title ) . ' ' . date_i18n( $event_day[0]->feed->date_format, $key ) . '</div>';
}
foreach ( $event_day as $num_in_day => $event ) {
//Create the markup for this event
if( ( $event->start_time >= $time_now ) && ( $event_counter < $max_events ) ) {
$markup .=
'<div class="gce-feed gce-feed-' . $event->feed->id . '">' .
'<div class="gce-list-title">' . stripslashes( $this->title ) . '</div>' .
//Add the event markup
$event->get_event_markup( 'list', $num_in_day, $i ) .
'</div>';
$has_events = true;
$i++;
$event_counter++;
}
$has_events = true;
$i++;
$event_counter++;
}
}
@@ -50,32 +50,37 @@ class GCE_Event {
*
* @since 2.0.0
*/
function get_days() {
//Round start date to nearest day
$start_time = mktime( 0, 0, 0, date( 'm', $this->start_time ), date( 'd', $this->start_time ) , date( 'Y', $this->start_time ) );
function get_days() {
if( $this->start_time !== null ) {
//Round start date to nearest day
$start_time = mktime( 0, 0, 0, date( 'm', $this->start_time ), date( 'd', $this->start_time ) , date( 'Y', $this->start_time ) );
$days = array();
$days = array();
//If multiple day events should be handled, and this event is a multi-day event, add multiple day event to required days
if ( $this->feed->multiple_day_events && ( 'MPD' == $this->day_type || 'MWD' == $this->day_type ) ) {
$on_next_day = true;
$next_day = $start_time;
//If multiple day events should be handled, and this event is a multi-day event, add multiple day event to required days
if ( $this->feed->multiple_day_events && ( 'MPD' == $this->day_type || 'MWD' == $this->day_type ) ) {
$on_next_day = true;
$next_day = $start_time;
while ( $on_next_day ) {
//If the end time of the event is after 00:00 on the next day (therefore, not doesn't end on this day)
if ( $this->end_time > $next_day ) {
$days[] = $next_day;
} else {
$on_next_day = false;
while ( $on_next_day ) {
//If the end time of the event is after 00:00 on the next day (therefore, not doesn't end on this day)
if ( $this->end_time > $next_day ) {
$days[] = $next_day;
} else {
$on_next_day = false;
}
$next_day += 86400;
}
$next_day += 86400;
} else {
//Add event into array of events for that day
$days[] = $start_time;
}
} else {
//Add event into array of events for that day
$days[] = $start_time;
}
return $days;
return $days;
} else {
return array();
}
}
/**
@@ -84,10 +89,6 @@ class GCE_Event {
* @since 2.0.0
*/
function get_event_markup( $display_type, $num_in_day, $num ) {
//Set the display type (either tooltip or list)
$this->type = $display_type;
@@ -12,6 +12,7 @@
class GCE_Feed {
public $id,
$calendar_id,
$feed_url,
$date_format,
$time_format,
@@ -24,6 +25,9 @@ class GCE_Feed {
public $events = array();
// Google API Key
private $api_key = 'AIzaSyAssdKVved1mPVY0UJCrx96OUOF9u17AuY';
/**
* Class constructor
*
@@ -33,12 +37,13 @@ class GCE_Feed {
// Set the ID
$this->id = $id;
$this->calendar_id = get_post_meta( $this->id, 'gce_feed_url', true );
// Set up all other data based on the ID
$this->setup_attributes();
// Now create the Feed
$this->create_feed();
}
/**
@@ -77,6 +82,8 @@ class GCE_Feed {
private function create_feed() {
//Break the feed URL up into its parts (scheme, host, path, query)
global $gce_options;
if( empty( $this->feed_url ) ) {
if( current_user_can( 'manage_options' ) ) {
echo '<p>' . __( 'The feed URL has not been set. Please make sure to set it correctly in the Feed settings.', 'gce' ) . '</p>';
@@ -85,51 +92,42 @@ class GCE_Feed {
return;
}
$url_parts = parse_url( $this->feed_url );
$args = array();
$scheme = ( is_ssl() ? 'https://' : 'http://' );
$scheme_and_host = $scheme . $url_parts['host'];
//Remove the exisitng projection from the path, and replace it with '/full-noattendees'
$path = substr( $url_parts['path'], 0, strrpos( $url_parts['path'], '/' ) ) . '/full-noattendees';
//Add the default parameters to the querystring (retrieving JSON, not XML)
$query = '?alt=json&sortorder=ascending&orderby=starttime';
if( ! empty( $gce_options['api_key'] ) ) {
$api_key = $gce_options['api_key'];
} else {
$api_key = $this->api_key;
}
$start = $this->get_feed_start();
$query = 'https://www.googleapis.com/calendar/v3/calendars/' . $this->calendar_id . '/events';
$end = $this->get_feed_end();
// Set API key
$query .= '?key=' . $api_key;
$gmt_offset = abs( get_option( 'gmt_offset' ) * 3600 );
$args['orderBy'] = 'startTime';
$query .= '&start-min=' . date( 'Y-m-d\TH:i:s', $start - $gmt_offset );
$args['timeMin'] = urlencode( $this->get_feed_start() );
$query .= '&start-max=' . date( 'Y-m-d\TH:i:s', $end - $gmt_offset );
$args['timeMax'] = urlencode( $this->get_feed_end() );
// Max results limit for performance.
$query .= '&max-results=10000';
$args['maxResults'] = 10000;
$ctz = get_option( 'timezone_string' );
if( ! empty( $ctz ) ) {
$query .= '&ctz=' . $ctz;
$args['timeZone'] = $ctz;
}
if ( ! empty( $this->search_query ) ) {
$query .= '&q=' . rawurlencode( $this->search_query );
$args['q'] = rawurlencode( $this->search_query );
}
if ( $this->expand_recurring ) {
$query .= '&singleevents=true';
}
//Put the URL back together
$this->display_url = $scheme_and_host . $path . $query;
$args['singleEvents'] = 'true';
// Get all the feed data
$this->get_feed_data( $this->display_url );
$query = add_query_arg( $args, $query );
$this->get_feed_data( $query );
}
/**
@@ -138,62 +136,56 @@ class GCE_Feed {
* @since 2.0.0
*/
private function get_feed_data( $url ) {
// First check for transient data to use
if( false !== get_transient( 'gce_feed_' . $this->id ) ) {
$this->events = get_transient( 'gce_feed_' . $this->id );
} else {
// Moved the remote get here to be more efficient
// Pointed out to us by John McManigle ( github.com/mcmanigle )
$raw_data = wp_remote_get( $url, array(
'sslverify' => false, //sslverify is set to false to ensure https URLs work reliably. Data source is Google's servers, so is trustworthy
'timeout' => 10 //Increase timeout from the default 5 seconds to ensure even large feeds are retrieved successfully
) );
'sslverify' => false, //sslverify is set to false to ensure https URLs work reliably. Data source is Google's servers, so is trustworthy
'timeout' => 10 //Increase timeout from the default 5 seconds to ensure even large feeds are retrieved successfully
) );
//If $raw_data is a WP_Error, something went wrong
if ( ! is_wp_error( $raw_data ) ) {
//If response code isn't 200, something went wrong
if ( 200 == $raw_data['response']['code'] ) {
//Attempt to convert the returned JSON into an array
$raw_data = json_decode( $raw_data['body'], true );
//If decoding was successful
if ( ! empty( $raw_data ) ) {
//If there are some entries (events) to process
if ( isset( $raw_data['feed']['entry'] ) ) {
//if ( isset( $raw_data['feed']['entry'] ) ) {
//Loop through each event, extracting the relevant information
foreach ( $raw_data['feed']['entry'] as $event ) {
$id = ( isset( $event['gCal$uid']['value'] ) ? esc_html( substr( $event['gCal$uid']['value'], 0, strpos( $event['gCal$uid']['value'], '@' ) ) ) : '' );
$title = ( isset( $event['title']['$t'] ) ? esc_html( $event['title']['$t'] ) : '' );
$description = ( isset( $event['content']['$t'] ) ? esc_html( $event['content']['$t'] ) : '' );
$link = ( isset( $event['link'][0]['href'] ) ? esc_url( $event['link'][0]['href'] ) : '' );
$location = ( isset( $event['gd$where'][0]['valueString'] ) ? esc_html( $event['gd$where'][0]['valueString'] ) : '' );
$start_time = ( isset( $event['gd$when'][0]['startTime'] ) ? $this->iso_to_ts( $event['gd$when'][0]['startTime'] ) : '' );
$end_time = ( isset( $event['gd$when'][0]['endTime'] ) ? $this->iso_to_ts( $event['gd$when'][0]['endTime'] ) : '' );
foreach ( $raw_data['items'] as $event ) {
$id = ( isset( $event['id'] ) ? esc_html( $event['id'] ) : '' );
$title = ( isset( $event['summary'] ) ? esc_html( $event['summary'] ) : '' );
$description = ( isset( $event['description'] ) ? esc_html( $event['description'] ) : '' );
$link = ( isset( $event['htmlLink'] ) ? esc_url( $event['htmlLink'] ) : '' );
$location = ( isset( $event['location'] ) ? esc_html( $event['location'] ) : '' );
if( isset( $event['start']['dateTime'] ) ) {
$start_time = $this->iso_to_ts( $event['start']['dateTime'] );
} else if( isset( $event['start']['date'] ) ) {
$start_time = $this->iso_to_ts( $event['start']['date'] );
} else {
$start_time = null;
}
if( isset( $event['end']['dateTime'] ) ) {
$end_time = $this->iso_to_ts( $event['end']['dateTime'] );
} else if( isset( $event['end']['date'] ) ) {
$end_time = $this->iso_to_ts( $event['end']['date'] );
} else {
$end_time = null;
}
//Create a GCE_Event using the above data. Add it to the array of events
$this->events[] = new GCE_Event( $this, $id, $title, $description, $location, $start_time, $end_time, $link );
}
}
} else {
//json_decode failed
$this->error = __( 'Some data was retrieved, but could not be parsed successfully. Please ensure your feed URL is correct.', 'gce' );
$this->error = __( 'Some data was retrieved, but could not be parsed successfully. Please ensure your feed settings are correct.', 'gce' );
}
} else {
//The response code wasn't 200, so generate a helpful(ish) error message depending on error code
switch ( $raw_data['response']['code'] ) {
case 404:
$this->error = __( 'The feed could not be found (404). Please ensure your feed URL is correct.', 'gce' );
break;
case 403:
$this->error = __( 'Access to this feed was denied (403). Please ensure you have public sharing enabled for your calendar.', 'gce' );
break;
default:
$this->error = sprintf( __( 'The feed data could not be retrieved. Error code: %s. Please ensure your feed URL is correct.', 'gce' ), $raw_data['response']['code'] );
}
}
}else{
} else{
//Generate an error message from the returned WP_Error
$this->error = $raw_data->get_error_message() . __( ' Please ensure your feed URL is correct.', 'gce' );
}
@@ -228,15 +220,15 @@ class GCE_Feed {
switch( $interval ) {
case 'days':
return time() - ( $start * 86400 );
return date( 'c', time() - ( $start * 86400 ) );
case 'months':
return time() - ( $start * 2629743 );
return date( 'c', time() - ( $start * 2629743 ) );
case 'years':
return time() - ( $start * 31556926 );
return date( 'c', time() - ( $start * 31556926 ) );
}
// fall back just in case. Falls back to 1 year ago
return time() - 31556926;
return date( 'c', time() - 31556926 );
}
private function get_feed_end() {
@@ -246,15 +238,15 @@ class GCE_Feed {
switch( $interval ) {
case 'days':
return time() + ( $end * 86400 );
return date( 'c', time() + ( $end * 86400 ) );
case 'months':
return time() + ( $end * 2629743 );
return date( 'c', time() + ( $end * 2629743 ) );
case 'years':
return time() + ( $end * 31556926 );
return date( 'c', time() + ( $end * 31556926 ) );
}
// Falls back to 1 year ahead just in case
return time() + 31556926;
return date( 'c', time() + 31556926 );
}
function get_builder() {
@@ -67,9 +67,9 @@ function gce_feed_messages( $messages ) {
global $post, $post_ID;
$url1 = '<a href="' . get_permalink( $post_ID ) . '">';
$url2 = 'feed';
$url2 = __( 'feed', 'gce' );
$url3 = '</a>';
$s1 = 'Feed';
$s1 = __( 'Feed', 'gce' );
$messages['gce_feed'] = array(
1 => sprintf( __( '%4$s updated. %1$sView %2$s%3$s', 'gce' ), $url1, $url2, $url3, $s1 ),
@@ -94,7 +94,7 @@ function gce_cpt_meta() {
add_meta_box( 'gce_feed_meta', 'Feed Settings', 'gce_display_meta', 'gce_feed', 'advanced', 'core' );
// Sidebar meta box below publish section.
add_meta_box( 'gce_feed_sidebar_help', 'Helpful Links', 'gce_feed_sidebar_help', 'gce_feed', 'side', 'core' );
add_meta_box( 'gce_feed_sidebar_help', __( 'Helpful Links', 'gce' ), 'gce_feed_sidebar_help', 'gce_feed', 'side', 'core' );
add_meta_box( 'gce_display_options_meta', 'Display Options', 'gce_display_options_meta', 'gce_feed', 'side', 'core' );
}
@@ -182,7 +182,15 @@ function gce_save_meta( $post_id ) {
foreach ( $post_meta_fields as $pmf ) {
if ( isset( $_POST[$pmf] ) && ! empty( $_POST[$pmf] ) ) {
if( $pmf == 'gce_feed_url' ) {
update_post_meta( $post_id, $pmf, esc_url( $_POST[$pmf] ) );
$str = $_POST[$pmf];
// convert from URL if user enters a URL link (like the old versions required)
$id = str_replace( 'https://www.google.com/calendar/feeds/', '', $str );
$id = str_replace( '/public/basic', '', $id );
$id = str_replace( '%40', '@', $id );
update_post_meta( $post_id, $pmf, $id );
} else {
update_post_meta( $post_id, $pmf, stripslashes( $_POST[$pmf] ) );
}
@@ -6,8 +6,8 @@
* @since 2.0.0
*/
function gce_print_calendar( $feed_ids, $display = 'grid', $args = array(), $widget = false ) {
$defaults = array(
$defaults = array(
'title_text' => '',
'sort' => 'asc',
'grouped' => 0,
@@ -47,7 +47,7 @@ function gce_print_calendar( $feed_ids, $display = 'grid', $args = array(), $wid
// If paging is not set then we need to set it now
foreach( $ids as $id ) {
if( $paging == null && $paging != 0 ) {
if( $paging === null ) {
$paging = get_post_meta( $id, 'gce_paging', true );
}
}
@@ -94,7 +94,7 @@ function gce_print_calendar( $feed_ids, $display = 'grid', $args = array(), $wid
$i++;
}
}
return $markup;
}
@@ -237,3 +237,4 @@ function gce_ga_campaign_url( $base_url, $source, $medium, $campaign ) {
return $url;
}
@@ -45,6 +45,12 @@ function gce_generate_calendar( $year, $month, $days = array(), $day_name_length
list( $p, $pl ) = each( $pn );
list( $n, $nl ) = each( $pn ); #previous and next links, if applicable
// Previous filter
$p = apply_filters( 'gce_prev_text', $p );
// Next filter
$n = apply_filters( 'gce_next_text', $n );
if( $widget ) {
$p = '<div class="gce-prev">' . ( ( $pl ) ? ( '<a href="#" class="gce-change-month" title="' . esc_attr__( 'Previous month', 'gce' ) . '" name="' . $pl . '" data-gce-grid-paging="' . $paging . '">' . $p . '</a>' ) : $p ) . '</div>';
} else {
@@ -24,6 +24,16 @@ function gce_register_settings() {
/* General Settings */
'general' => array(
'api_key' => array(
'id' => 'api_key',
'name' => __( 'Google API Key', 'gce' ),
'desc' => __( 'If left blank all displayed Google calendars will use a public Google API key shared across all plugin users.', 'gce' ) . ' ' .
__( 'Currently the shared key is limited to 500,000 requests per day and 5 requests per second.', 'gce' ) . '<br/>' .
sprintf( __( 'To avoid these limits <a href="%s" target="_blank">click here for instructions on how to generate and use your own Google API key.</a>', 'gce' ),
gce_ga_campaign_url( 'http://wpdocs.philderksen.com/google-calendar-events/getting-started/api-key-settings/', 'gce_lite', 'settings_link', 'docs' ) ),
'size' => 'regular-text',
'type' => 'text'
),
'save_settings' => array(
'id' => 'save_settings',
'name' => __( 'Save Settings', 'gce' ),
@@ -111,6 +121,33 @@ function gce_checkbox_callback( $args ) {
echo $html;
}
/**
* Textbox callback function
* Valid built-in size CSS class values:
* small-text, regular-text, large-text
*
* @since 2.1.0
*
*/
function gce_text_callback( $args ) {
global $gce_options;
if ( isset( $gce_options[ $args['id'] ] ) )
$value = $gce_options[ $args['id'] ];
else
$value = isset( $args['std'] ) ? $args['std'] : '';
$size = ( isset( $args['size'] ) && ! is_null( $args['size'] ) ) ? $args['size'] : '';
$html = "\n" . '<input type="text" class="' . $size . '" id="gce_settings_' . $args['section'] . '[' . $args['id'] . ']" name="gce_settings_' . $args['section'] . '[' . $args['id'] . ']" value="' . esc_attr( $value ) . '"/>' . "\n";
// Render and style description text underneath if it exists.
if ( ! empty( $args['desc'] ) ) {
$html .= '<p class="description">' . $args['desc'] . '</p>' . "\n";
}
echo $html;
}
/*
* Function we can use to sanitize the input data and return it when saving options
*
@@ -154,4 +191,4 @@ function gce_get_settings() {
$general_settings = is_array( get_option( 'gce_settings_general' ) ) ? get_option( 'gce_settings_general' ) : array();
return $general_settings;
}
}
@@ -1,106 +1,106 @@
/**
* Public JS functions
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @copyright 2014 Phil Derksen
*/
(function($) {
'use strict';
$(function() {
gce_tooltips('.gce-has-events');
if( typeof gce_grid != 'undefined' ) {
$('body').on( 'click', '.gce-change-month', function(e) {
var id = $(this).closest('.gce-calendar').parent().attr('id');
e.preventDefault();
//Extract month and year
var month_year = $(this).attr('name').split('-', 2);
var paging = $(this).attr('data-gce-grid-paging');
//Add loading text to table caption
$('#' + gce_grid[id].target_element + ' caption').html('Loading...');
//Send AJAX request
$.post(gce.ajaxurl,{
action:'gce_ajax',
gce_type: gce_grid[id].type,
gce_feed_ids: gce_grid[id].feed_ids,
gce_title_text: gce_grid[id].title_text,
gce_widget_id: gce_grid[id].target_element,
gce_month: month_year[0],
gce_year: month_year[1],
gce_paging: paging,
gce_nonce: gce.ajaxnonce
}, function(data){
//Replace existing data with returned AJAX data
if(gce_grid[id].type == 'widget'){
$('#' + gce_grid[id].target_element).html(data);
}else{
$('#' + gce_grid[id].target_element).replaceWith(data);
}
gce_tooltips('#' + gce_grid[id].target_element + ' .gce-has-events');
});
});
}
$('body').on( 'click', '.gce-change-month-list', function(e) {
e.preventDefault();
var element = $(this);
var start = $(this).parent().parent().parent().data('gce-start');
var grouped = $(this).parent().parent().parent().data('gce-grouped');
var title_text = $(this).parent().parent().parent().data('gce-title');
var feed_ids = $(this).parent().parent().parent().data( 'gce-feeds');
var sort = $(this).parent().parent().parent().data('gce-sort');
var paging = $(this).parent().parent().parent().data('gce-paging');
var paging_interval = $(this).parent().parent().parent().data('gce-paging-interval');
var paging_direction = $(this).data('gce-paging-direction');
var start_offset = $(this).parent().parent().parent().data('gce-start-offset');
var paging_type = $(this).data('gce-paging-type');
//Add loading text to table caption
$(this).parent().parent().parent().find('.gce-month-title').html('Loading...');
//Send AJAX request
jQuery.post(gce.ajaxurl,{
action:'gce_ajax_list',
gce_feed_ids:feed_ids,
gce_title_text:title_text,
gce_start: start,
gce_grouped: grouped,
gce_sort: sort,
gce_paging: paging,
gce_paging_interval: paging_interval,
gce_paging_direction: paging_direction,
gce_start_offset: start_offset,
gce_paging_type: paging_type,
gce_nonce: gce.ajaxnonce
}, function(data){
element.parent().parent().parent().html(data);
});
});
function gce_tooltips(target_items) {
$(target_items).each(function(){
//Add qtip to all target items
$(this).qtip({
content: $(this).children('.gce-event-info'),
position: { corner: { target: 'center', tooltip: 'bottomLeft' }, adjust: { screen: true } },
hide: { fixed: true, delay: 100, effect: { length: 0 } },
show: { solo: true, delay: 0, effect: { length: 0 } },
style: { padding: "0", classes: { tooltip: 'gce-qtip', tip: 'gce-qtip-tip', title: 'gce-qtip-title', content: 'gce-qtip-content', active: 'gce-qtip-active' }, border: { width: 0 } }
});
});
}
});
/**
* Public JS functions
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @copyright 2014 Phil Derksen
*/
(function($) {
'use strict';
$(function() {
gce_tooltips('.gce-has-events');
if( typeof gce_grid != 'undefined' ) {
$('body').on( 'click', '.gce-change-month', function(e) {
var id = $(this).closest('.gce-calendar').parent().attr('id');
e.preventDefault();
//Extract month and year
var month_year = $(this).attr('name').split('-', 2);
var paging = $(this).attr('data-gce-grid-paging');
//Add loading text to table caption
$('#' + gce_grid[id].target_element + ' caption').html(gce.loadingText);
//Send AJAX request
$.post(gce.ajaxurl,{
action:'gce_ajax',
gce_type: gce_grid[id].type,
gce_feed_ids: gce_grid[id].feed_ids,
gce_title_text: gce_grid[id].title_text,
gce_widget_id: gce_grid[id].target_element,
gce_month: month_year[0],
gce_year: month_year[1],
gce_paging: paging,
gce_nonce: gce.ajaxnonce
}, function(data){
//Replace existing data with returned AJAX data
if(gce_grid[id].type == 'widget'){
$('#' + gce_grid[id].target_element).html(data);
}else{
$('#' + gce_grid[id].target_element).replaceWith(data);
}
gce_tooltips('#' + gce_grid[id].target_element + ' .gce-has-events');
});
});
}
$('body').on( 'click', '.gce-change-month-list', function(e) {
e.preventDefault();
var element = $(this);
var start = $(this).parent().parent().parent().data('gce-start');
var grouped = $(this).parent().parent().parent().data('gce-grouped');
var title_text = $(this).parent().parent().parent().data('gce-title');
var feed_ids = $(this).parent().parent().parent().data( 'gce-feeds');
var sort = $(this).parent().parent().parent().data('gce-sort');
var paging = $(this).parent().parent().parent().data('gce-paging');
var paging_interval = $(this).parent().parent().parent().data('gce-paging-interval');
var paging_direction = $(this).data('gce-paging-direction');
var start_offset = $(this).parent().parent().parent().data('gce-start-offset');
var paging_type = $(this).data('gce-paging-type');
//Add loading text to table caption
$(this).parent().parent().parent().find('.gce-month-title').html(gce.loadingText);
//Send AJAX request
jQuery.post(gce.ajaxurl,{
action:'gce_ajax_list',
gce_feed_ids:feed_ids,
gce_title_text:title_text,
gce_start: start,
gce_grouped: grouped,
gce_sort: sort,
gce_paging: paging,
gce_paging_interval: paging_interval,
gce_paging_direction: paging_direction,
gce_start_offset: start_offset,
gce_paging_type: paging_type,
gce_nonce: gce.ajaxnonce
}, function(data){
element.parent().parent().parent().html(data);
});
});
function gce_tooltips(target_items) {
$(target_items).each(function(){
//Add qtip to all target items
$(this).qtip({
content: $(this).children('.gce-event-info'),
position: { corner: { target: 'center', tooltip: 'bottomLeft' }, adjust: { screen: true } },
hide: { fixed: true, delay: 100, effect: { length: 0 } },
show: { solo: true, delay: 0, effect: { length: 0 } },
style: { padding: "0", classes: { tooltip: 'gce-qtip', tip: 'gce-qtip-tip', title: 'gce-qtip-title', content: 'gce-qtip-content', active: 'gce-qtip-active' }, border: { width: 0 } }
});
});
}
});
}(jQuery))
+14 -14
View File
@@ -1,15 +1,15 @@
/*!
* jquery.qtip. The jQuery tooltip plugin
*
* Copyright (c) 2009 Craig Thompson
* http://craigsworks.com
*
* Licensed under MIT
* http://www.opensource.org/licenses/mit-license.php
*
* Launch : February 2009
* Version : 1.0.0-rc3
* Released: Tuesday 12th May, 2009 - 00:00
* Debug: jquery.qtip.debug.js
*/
/*!
* jquery.qtip. The jQuery tooltip plugin
*
* Copyright (c) 2009 Craig Thompson
* http://craigsworks.com
*
* Licensed under MIT
* http://www.opensource.org/licenses/mit-license.php
*
* Launch : February 2009
* Version : 1.0.0-rc3
* Released: Tuesday 12th May, 2009 - 00:00
* Debug: jquery.qtip.debug.js
*/
(function(f){f.fn.qtip=function(B,u){var y,t,A,s,x,w,v,z;if(typeof B=="string"){if(typeof f(this).data("qtip")!=="object"){f.fn.qtip.log.error.call(self,1,f.fn.qtip.constants.NO_TOOLTIP_PRESENT,false)}if(B=="api"){return f(this).data("qtip").interfaces[f(this).data("qtip").current]}else{if(B=="interfaces"){return f(this).data("qtip").interfaces}}}else{if(!B){B={}}if(typeof B.content!=="object"||(B.content.jquery&&B.content.length>0)){B.content={text:B.content}}if(typeof B.content.title!=="object"){B.content.title={text:B.content.title}}if(typeof B.position!=="object"){B.position={corner:B.position}}if(typeof B.position.corner!=="object"){B.position.corner={target:B.position.corner,tooltip:B.position.corner}}if(typeof B.show!=="object"){B.show={when:B.show}}if(typeof B.show.when!=="object"){B.show.when={event:B.show.when}}if(typeof B.show.effect!=="object"){B.show.effect={type:B.show.effect}}if(typeof B.hide!=="object"){B.hide={when:B.hide}}if(typeof B.hide.when!=="object"){B.hide.when={event:B.hide.when}}if(typeof B.hide.effect!=="object"){B.hide.effect={type:B.hide.effect}}if(typeof B.style!=="object"){B.style={name:B.style}}B.style=c(B.style);s=f.extend(true,{},f.fn.qtip.defaults,B);s.style=a.call({options:s},s.style);s.user=f.extend(true,{},B)}return f(this).each(function(){if(typeof B=="string"){w=B.toLowerCase();A=f(this).qtip("interfaces");if(typeof A=="object"){if(u===true&&w=="destroy"){while(A.length>0){A[A.length-1].destroy()}}else{if(u!==true){A=[f(this).qtip("api")]}for(y=0;y<A.length;y++){if(w=="destroy"){A[y].destroy()}else{if(A[y].status.rendered===true){if(w=="show"){A[y].show()}else{if(w=="hide"){A[y].hide()}else{if(w=="focus"){A[y].focus()}else{if(w=="disable"){A[y].disable(true)}else{if(w=="enable"){A[y].disable(false)}}}}}}}}}}}else{v=f.extend(true,{},s);v.hide.effect.length=s.hide.effect.length;v.show.effect.length=s.show.effect.length;if(v.position.container===false){v.position.container=f(document.body)}if(v.position.target===false){v.position.target=f(this)}if(v.show.when.target===false){v.show.when.target=f(this)}if(v.hide.when.target===false){v.hide.when.target=f(this)}t=f.fn.qtip.interfaces.length;for(y=0;y<t;y++){if(typeof f.fn.qtip.interfaces[y]=="undefined"){t=y;break}}x=new d(f(this),v,t);f.fn.qtip.interfaces[t]=x;if(typeof f(this).data("qtip")==="object"&&f(this).data("qtip")){if(typeof f(this).attr("qtip")==="undefined"){f(this).data("qtip").current=f(this).data("qtip").interfaces.length}f(this).data("qtip").interfaces.push(x)}else{f(this).data("qtip",{current:0,interfaces:[x]})}if(v.content.prerender===false&&v.show.when.event!==false&&v.show.ready!==true){v.show.when.target.bind(v.show.when.event+".qtip-"+t+"-create",{qtip:t},function(C){z=f.fn.qtip.interfaces[C.data.qtip];z.options.show.when.target.unbind(z.options.show.when.event+".qtip-"+C.data.qtip+"-create");z.cache.mouse={x:C.pageX,y:C.pageY};p.call(z);z.options.show.when.target.trigger(z.options.show.when.event)})}else{x.cache.mouse={x:v.show.when.target.offset().left,y:v.show.when.target.offset().top};p.call(x)}}})};function d(u,t,v){var s=this;s.id=v;s.options=t;s.status={animated:false,rendered:false,disabled:false,focused:false};s.elements={target:u.addClass(s.options.style.classes.target),tooltip:null,wrapper:null,content:null,contentWrapper:null,title:null,button:null,tip:null,bgiframe:null};s.cache={mouse:{},position:{},toggle:0};s.timers={};f.extend(s,s.options.api,{show:function(y){var x,z;if(!s.status.rendered){return f.fn.qtip.log.error.call(s,2,f.fn.qtip.constants.TOOLTIP_NOT_RENDERED,"show")}if(s.elements.tooltip.css("display")!=="none"){return s}s.elements.tooltip.stop(true,false);x=s.beforeShow.call(s,y);if(x===false){return s}function w(){if(s.options.position.type!=="static"){s.focus()}s.onShow.call(s,y);if(f.browser.msie){s.elements.tooltip.get(0).style.removeAttribute("filter")}}s.cache.toggle=1;if(s.options.position.type!=="static"){s.updatePosition(y,(s.options.show.effect.length>0))}if(typeof s.options.show.solo=="object"){z=f(s.options.show.solo)}else{if(s.options.show.solo===true){z=f("div.qtip").not(s.elements.tooltip)}}if(z){z.each(function(){if(f(this).qtip("api").status.rendered===true){f(this).qtip("api").hide()}})}if(typeof s.options.show.effect.type=="function"){s.options.show.effect.type.call(s.elements.tooltip,s.options.show.effect.length);s.elements.tooltip.queue(function(){w();f(this).dequeue()})}else{switch(s.options.show.effect.type.toLowerCase()){case"fade":s.elements.tooltip.fadeIn(s.options.show.effect.length,w);break;case"slide":s.elements.tooltip.slideDown(s.options.show.effect.length,function(){w();if(s.options.position.type!=="static"){s.updatePosition(y,true)}});break;case"grow":s.elements.tooltip.show(s.options.show.effect.length,w);break;default:s.elements.tooltip.show(null,w);break}s.elements.tooltip.addClass(s.options.style.classes.active)}return f.fn.qtip.log.error.call(s,1,f.fn.qtip.constants.EVENT_SHOWN,"show")},hide:function(y){var x;if(!s.status.rendered){returnLine truncated
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,767 @@
msgid ""
msgstr ""
"Project-Id-Version: Google Calendar Events\n"
"POT-Creation-Date: 2014-10-22 20:41-0700\n"
"PO-Revision-Date: 2014-10-23 12:22+0200\n"
"Last-Translator: Andrius Mazeika <andrius@mazeika.info>\n"
"Language-Team: \n"
"Language: lt\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n"
"%100<10 || n%100>=20) ? 1 : 2);\n"
"X-Poedit-KeywordsList: __;_e\n"
"X-Poedit-SearchPath-0: google-calendar-events\n"
#: google-calendar-events/class-google-calendar-events-admin.php:64
#: google-calendar-events/class-google-calendar-events-admin.php:65
#: google-calendar-events/includes/register-settings.php:44
msgid "General Settings"
msgstr "Bendrieji nustatymai"
#: google-calendar-events/class-google-calendar-events-admin.php:122
#: google-calendar-events/views/widgets.php:27
msgid "Google Calendar Events"
msgstr "Google kalendoriaus įvykiai"
#: google-calendar-events/class-google-calendar-events-admin.php:134
msgid "Feeds"
msgstr "Srautai"
#: google-calendar-events/class-google-calendar-events.php:142
msgid "Loading..."
msgstr "Kraunama..."
#: google-calendar-events/includes/admin/admin-functions.php:20
msgid "Cache has been cleared for this feed."
msgstr "Srauto laikinoji talpyklė išvalyta."
#: google-calendar-events/includes/admin/admin-functions.php:35
#: google-calendar-events/includes/admin/admin-functions.php:57
msgid "Starts:"
msgstr "Prasideda:"
#: google-calendar-events/includes/admin/admin-functions.php:36
#: google-calendar-events/includes/admin/admin-functions.php:59
msgid "Ends:"
msgstr "Baigiasi:"
#: google-calendar-events/includes/admin/admin-functions.php:37
#: google-calendar-events/includes/admin/admin-functions.php:61
msgid "Location:"
msgstr "Vieta:"
#: google-calendar-events/includes/admin/admin-functions.php:38
#: google-calendar-events/includes/admin/admin-functions.php:62
msgid "Description:"
msgstr "Aprašymas:"
#: google-calendar-events/includes/admin/admin-functions.php:39
msgid "More details..."
msgstr "Plačiau..."
#: google-calendar-events/includes/admin/admin-functions.php:64
msgid "More Details"
msgstr "Plačiau..."
#: google-calendar-events/includes/admin/admin-functions.php:78
#: google-calendar-events/includes/gce-feed-cpt.php:256
msgid "Clear Cache"
msgstr "Išvalyti laikinąją talpyklę."
#: google-calendar-events/includes/class-gce-display.php:188
#: google-calendar-events/includes/class-gce-display.php:277
#: google-calendar-events/views/admin/gce-feed-meta-display.php:185
#: google-calendar-events/views/widgets.php:252
msgid "Back"
msgstr "Atgal"
#: google-calendar-events/includes/class-gce-display.php:192
#: google-calendar-events/includes/class-gce-display.php:278
msgid "Next"
msgstr "Pirmyn"
#: google-calendar-events/includes/class-gce-display.php:372
msgid "No events to display."
msgstr "Įvykių nėra."
#: google-calendar-events/includes/class-gce-event.php:503
#, php-format
msgid "%s year"
msgstr "%s metai"
#: google-calendar-events/includes/class-gce-event.php:503
#, php-format
msgid "%s years"
msgstr "%s metai"
#: google-calendar-events/includes/class-gce-event.php:504
#, php-format
msgid "%s month"
msgstr "%s mėnuo"
#: google-calendar-events/includes/class-gce-event.php:504
#, php-format
msgid "%s months"
msgstr "%s mėnesiai"
#: google-calendar-events/includes/class-gce-event.php:505
#, php-format
msgid "%s week"
msgstr "%s savaitė"
#: google-calendar-events/includes/class-gce-event.php:505
#, php-format
msgid "%s weeks"
msgstr "%s savaitės"
#: google-calendar-events/includes/class-gce-event.php:506
#, php-format
msgid "%s day"
msgstr "%s diena"
#: google-calendar-events/includes/class-gce-event.php:506
#, php-format
msgid "%s days"
msgstr "%s dienos"
#: google-calendar-events/includes/class-gce-event.php:507
#, php-format
msgid "%s hour"
msgstr "%s valanda"
#: google-calendar-events/includes/class-gce-event.php:507
#, php-format
msgid "%s hours"
msgstr "%s valandos"
#: google-calendar-events/includes/class-gce-event.php:508
#, php-format
msgid "%s min"
msgstr "%s minutė"
#: google-calendar-events/includes/class-gce-event.php:508
#, php-format
msgid "%s mins"
msgstr "%s minutės"
#: google-calendar-events/includes/class-gce-feed.php:82
msgid ""
"The feed URL has not been set. Please make sure to set it correctly in the "
"Feed settings."
msgstr ""
"Srauto adresas (URL) nenurodytas. Įrašykite tikslų srauto adresą į 'Srauto "
"nustatymus'."
#: google-calendar-events/includes/class-gce-feed.php:181
msgid ""
"Some data was retrieved, but could not be parsed successfully. Please ensure "
"your feed URL is correct."
msgstr ""
"Dalis duomenų gauta, bet nepavyko jų apdoroti. Patikrinkite, ar įvestas "
"srauto adresas (URL) yra teisingas."
#: google-calendar-events/includes/class-gce-feed.php:187
msgid ""
"The feed could not be found (404). Please ensure your feed URL is correct."
msgstr ""
"Nepavyko rasti nurodyto srauto (404). Patikrinkite, ar įvestas srauto "
"adresas (URL) yra teisingas."
#: google-calendar-events/includes/class-gce-feed.php:190
msgid ""
"Access to this feed was denied (403). Please ensure you have public sharing "
"enabled for your calendar."
msgstr ""
"Prieiga prie šio srauto uždrausta (403). Patikrinkite, ar jūsų kalendoriuje "
"yra įjungtas viešasis dalinimasis. "
#: google-calendar-events/includes/class-gce-feed.php:193
#, php-format
msgid ""
"The feed data could not be retrieved. Error code: %s. Please ensure your "
"feed URL is correct."
msgstr ""
"Nepavyko gauti srauto duomenų. Klaidos kodas %s. Patikrinkite, ar įvestas "
"srauto adresas (URL) yra teisingas."
#: google-calendar-events/includes/class-gce-feed.php:198
msgid " Please ensure your feed URL is correct."
msgstr "Patikrinkite, ar įvestas srauto adresas (URL) yra teisingas."
#: google-calendar-events/includes/gce-feed-cpt.php:21
msgid "Google Calendar Feeds"
msgstr "Google kalendoriaus srautai"
#: google-calendar-events/includes/gce-feed-cpt.php:22
#: google-calendar-events/includes/gce-feed-cpt.php:24
#: google-calendar-events/includes/gce-feed-cpt.php:72
msgid "Feed"
msgstr "Srautas"
#: google-calendar-events/includes/gce-feed-cpt.php:23
msgid "GCal Events"
msgstr "GCal įvykiai"
#: google-calendar-events/includes/gce-feed-cpt.php:25
msgid "Add New"
msgstr "Įtraukti naują"
#: google-calendar-events/includes/gce-feed-cpt.php:26
msgid "Add New Feed"
msgstr "Įtraukti naują srautą"
#: google-calendar-events/includes/gce-feed-cpt.php:27
msgid "New Feed"
msgstr "Naujas srautas"
#: google-calendar-events/includes/gce-feed-cpt.php:28
msgid "Edit Feed"
msgstr "Redaguoti srautą"
#: google-calendar-events/includes/gce-feed-cpt.php:29
msgid "View Feed"
msgstr "Peržiūrėti srautą"
#: google-calendar-events/includes/gce-feed-cpt.php:30
msgid "All GCal Feeds"
msgstr "Visi GCal srautai"
#: google-calendar-events/includes/gce-feed-cpt.php:31
msgid "Search GCal Feeds"
msgstr "Paieška GCal srautuose"
#: google-calendar-events/includes/gce-feed-cpt.php:32
msgid "No feeds found."
msgstr "Srautų nerasta."
#: google-calendar-events/includes/gce-feed-cpt.php:33
msgid "No feeds found in Trash."
msgstr "Šiukšlinėje srautų nerasta."
#: google-calendar-events/includes/gce-feed-cpt.php:70
msgid "feed"
msgstr "srautas"
#: google-calendar-events/includes/gce-feed-cpt.php:75
#: google-calendar-events/includes/gce-feed-cpt.php:76
#, php-format
msgid "%4$s updated. %1$sView %2$s%3$s"
msgstr "%4$s atnaujinta. %1$sPeržiūrėti %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:77
#, php-format
msgid "%4$s published. %1$sView %2$s%3$s"
msgstr "%4$s publikuota. %1$sPeržiūrėti %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:78
#, php-format
msgid "%4$s saved. %1$sView %2$s%3$s"
msgstr "%4$s įrašyta. %1$sPeržiūrėti %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:79
#, php-format
msgid "%4$s submitted. %1$sView %2$s%3$s"
msgstr "%4$s pateikta. %1$sPeržiūrėti %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:80
#, php-format
msgid "%4$s draft updated. %1$sView %2$s%3$s"
msgstr "%4$s juodraštis atnaujintas. %1$sPeržiūrėti %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:97
msgid "Helpful Links"
msgstr "Naudingos nuorodos"
#: google-calendar-events/includes/gce-feed-cpt.php:209
msgid "Feed ID"
msgstr "Srauto ID"
#: google-calendar-events/includes/gce-feed-cpt.php:210
#: google-calendar-events/views/admin/gce-feed-meta-display.php:73
msgid "Feed Shortcode"
msgstr "Srauto trumpasis kodas"
#: google-calendar-events/includes/gce-feed-cpt.php:211
msgid "Display Type"
msgstr "Rodymo būdas"
#: google-calendar-events/includes/gce-feed-cpt.php:238
#: google-calendar-events/views/admin/gce-feed-meta-display.php:152
#: google-calendar-events/views/widgets.php:218
msgid "Grid"
msgstr "Tinklelis"
#: google-calendar-events/includes/gce-feed-cpt.php:240
#: google-calendar-events/views/admin/gce-feed-meta-display.php:153
#: google-calendar-events/views/widgets.php:219
msgid "List"
msgstr "Sąrašas"
#: google-calendar-events/includes/gce-feed-cpt.php:242
#: google-calendar-events/views/admin/gce-feed-meta-display.php:154
#: google-calendar-events/views/widgets.php:220
msgid "Grouped List"
msgstr "Sugrupuotas sąrašas"
#: google-calendar-events/includes/register-settings.php:29
msgid "Save Settings"
msgstr "Įšsaugoti nustatymus"
#: google-calendar-events/includes/register-settings.php:30
msgid ""
"Save your settings when uninstalling this plugin. Useful when upgrading or "
"re-installing."
msgstr ""
"Išsaugokite nustatymus prieš pašalindami šį įskiepį. Naudinga atliekant "
"atnaujinimą ar diegiant iš naujo."
#: google-calendar-events/includes/register-settings.php:132
#, php-format
msgid ""
"The callback function used for the <strong>%s</strong> setting is missing."
msgstr ""
"Nerasta atsakymo (callback) funkcija, naudojama <strong>%s</strong> "
"nustatyme."
#: google-calendar-events/views/admin/display-options-meta.php:39
msgid ""
"Check this box to use the simple display options below instead of the Event "
"Builder code on the left."
msgstr ""
"Pažymėkite, jeigu norite naudoti paprastąsias atvaizdavimo parinktis vietoje "
"'Event Builder' kodo rodomo kairėje."
#: google-calendar-events/views/admin/display-options-meta.php:44
msgid "Start date / time display"
msgstr "Pradžios datos / laiko rodymas"
#: google-calendar-events/views/admin/display-options-meta.php:45
msgid "Select how to display the start date / time."
msgstr "Pasirinkite, kaip rodyti pradžios datą / laiką"
#: google-calendar-events/views/admin/display-options-meta.php:47
#: google-calendar-events/views/admin/display-options-meta.php:61
msgid "None"
msgstr "Nieko"
#: google-calendar-events/views/admin/display-options-meta.php:48
msgid "Start time"
msgstr "Pradžios laikas"
#: google-calendar-events/views/admin/display-options-meta.php:49
msgid "Start date"
msgstr "Pradžios data"
#: google-calendar-events/views/admin/display-options-meta.php:50
msgid "Start time and date"
msgstr "Pradžios laikas ir data"
#: google-calendar-events/views/admin/display-options-meta.php:51
msgid "Start date and time"
msgstr "Pradžios data ir laikas"
#: google-calendar-events/views/admin/display-options-meta.php:53
msgid "Text to display before the start time."
msgstr "Rodyti šį tekstą prieš pradžios laiką"
#: google-calendar-events/views/admin/display-options-meta.php:58
msgid "End time/date display"
msgstr "Pabaigos laiko / datos rodymas"
#: google-calendar-events/views/admin/display-options-meta.php:59
msgid "Select how to display the end date / time."
msgstr "Pasirinkite, kaip rodyti pabaigos datą / laiką."
#: google-calendar-events/views/admin/display-options-meta.php:62
msgid "End time"
msgstr "Pabaigos laikas"
#: google-calendar-events/views/admin/display-options-meta.php:63
msgid "End date"
msgstr "Pabaigos data"
#: google-calendar-events/views/admin/display-options-meta.php:64
msgid "End time and date"
msgstr "Pabaigos laikas ir data"
#: google-calendar-events/views/admin/display-options-meta.php:65
msgid "End date and time"
msgstr "Pabaigos data ir laikas"
#: google-calendar-events/views/admin/display-options-meta.php:67
msgid "Text to display before the end time."
msgstr "Rodyti šį tekstą prieš pabaigos laiką."
#: google-calendar-events/views/admin/display-options-meta.php:72
msgid "Separator"
msgstr "Skirtukas"
#: google-calendar-events/views/admin/display-options-meta.php:74
msgid ""
"If you have chosen to display both the time and date above, enter the text / "
"characters to display between the time and date here (including any spaces)."
msgstr ""
"Jeigu pasirinkote rodyti ir laiką ir datą, įveskite tekstą / simbolius, "
"kuriais norite atskirti datą nuo laiko (įskaitant ir tarpus)."
#: google-calendar-events/views/admin/display-options-meta.php:80
msgid "Location"
msgstr "Vieta"
#: google-calendar-events/views/admin/display-options-meta.php:82
msgid "Show the location of events?"
msgstr "Ar rodyti įvykių vietą?"
#: google-calendar-events/views/admin/display-options-meta.php:83
msgid "Text to display before the location."
msgstr "Rodyti šį tekstą prieš įvykio vietą"
#: google-calendar-events/views/admin/display-options-meta.php:88
msgid "Description"
msgstr "Aprašymas"
#: google-calendar-events/views/admin/display-options-meta.php:91
msgid ""
"Show the description of events? (URLs in the description will be made into "
"links)."
msgstr ""
"Ar rodyti įvykių aprašymus? (URL adresai aprašymuose bus konvertuoti į "
"nuorodas)."
#: google-calendar-events/views/admin/display-options-meta.php:93
msgid "Text to display before the description."
msgstr "Rodyti šį tekstą prieš įvykio aprašymą."
#: google-calendar-events/views/admin/display-options-meta.php:95
msgid ""
"Maximum number of words to show from description. Leave blank for no limit."
msgstr ""
"Maksimalus žodžių skaičius, kurį norite rodyti įvykio aprašyme. Palikite "
"tuščią, jeigu apriboti nenorite."
#: google-calendar-events/views/admin/display-options-meta.php:100
msgid "Event Link"
msgstr "Įvykio nuoroda"
#: google-calendar-events/views/admin/display-options-meta.php:103
msgid "Show a link to the Google Calendar page for an event?"
msgstr "Ar rodyti nuorodą į įvykio puslapį Google kalendoriuje?"
#: google-calendar-events/views/admin/display-options-meta.php:107
msgid "Links open in a new window / tab?"
msgstr "Ar atversti nuorodas naujame lange / kortelėje?"
#: google-calendar-events/views/admin/display-options-meta.php:109
msgid "The link text to be displayed."
msgstr "Nuorodos tekstas."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:54
msgid ""
"We're <strong>smack dab</strong> in the middle of building additional "
"features for this plugin. Have ideas?"
msgstr ""
"Mes dar tik <strong>pusiaukelėje</strong> šio įskiepio kūrime. Turite idėjų?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:57
msgid "Visit our roadmap and tell us what you're looking for"
msgstr "Peržvelkite tolimesnius mūsų planus ir parašykite mums savo poreikius"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:63
msgid "Want to be in the know?"
msgstr "Norite sekti įskiepio naujienas?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:66
msgid "Get notified when new features are released"
msgstr "Gaukite pranešimus apie naujas įskiepio galimybes"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:77
msgid ""
"Copy and paste this shortcode to display this Google Calendar feed on any "
"post or page."
msgstr ""
"Nukopijuokite ir įklijuokite šį trumpąjį kodą norėdami atvaizduoti šį Google "
"kalendoriaus srautą bet kuriame įraše ar puslapyje."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:78
msgid ""
"To avoid display issues, make sure to paste the shortcode in the Text tab of "
"the post editor."
msgstr ""
"Tam, kad išvengtumėte nesklandumų, įklijuokite šį trumpąjį kodą naudodami "
"tekstinį įrašo redaktorių."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:83
msgid "GCal Feed URL"
msgstr "GCal srauto adresas (URL)"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:87
msgid "The Google Calendar feed URL."
msgstr "Google kalendoriaus srauto adresas (URL)."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:87
msgid "Example"
msgstr "Pavyzdys"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:89
msgid "How to find your GCal feed URL"
msgstr "Kaip rasti GCal srauto adresą (URL)?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:95
msgid "Search Query"
msgstr "Paieškos užklausa"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:98
msgid "Find and show events based on a search query."
msgstr "Surasti ir rodyti įvykius pagal įvestą paieškos užklausą."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:103
msgid "Expand Recurring Events?"
msgstr "Ar išskleisti pasikartojančius įvykius?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:105
msgid "Yes"
msgstr "Taip"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:106
msgid ""
"This will show recurring events each time they occur, otherwise it will only "
"show the event the first time it occurs."
msgstr ""
"Pažymėkite, jeigu norite rodyti pasikartojančius įvykius kiekvieną kartą. "
"Nepasirinkus šio nustatymo bus rodomas tik pirmasis įvykis."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:111
msgid "Date Format"
msgstr "Datos formatas"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:115
#: google-calendar-events/views/admin/gce-feed-meta-display.php:126
#, php-format
msgid "Use %sPHP date formatting%s."
msgstr "Naudoti %sPHP datos formatą%s."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:116
#: google-calendar-events/views/admin/gce-feed-meta-display.php:127
msgid "Leave blank to use the default."
msgstr "Palikite tuščią, jei norite naudoti numatytąją reikšmę."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:122
msgid "Time Format"
msgstr "Laiko formatas"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:133
msgid "Cache Duration"
msgstr "Laikinosios atminties saugojimo trukmė"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:136
msgid ""
"The length of time, in seconds, to cache the feed (43200 = 12 hours). If "
"this feed changes regularly, you may want to reduce the cache duration."
msgstr ""
"Kiek laiko (sekundėmis) laikyti srauto duomenis laikinojoje atmintyje (43200 "
"= 12 valandų). Jei šio srauto duomenys keičiasi dažnai, sumažinkite "
"laikinosios atminties trukmę."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:141
msgid "Multiple Day Events"
msgstr "Kelias dienas trunkantys įvykiai"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:143
msgid "Show on each day"
msgstr "Rodyti kiekvieną dieną"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:144
msgid ""
"Show events that span multiple days on each day that they span, rather than "
"just the first day."
msgstr ""
"Rodyti kelių dienų trukmės įvykius kiekvieną įvykio dieną, o ne tik pirmąją."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:149
msgid "Display Mode"
msgstr "Rodymo būdas"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:156
msgid "Choose how you want your calendar to be displayed."
msgstr "Pasirinkite kalendoriaus atvaizdavimo būdą."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:161
msgid "Show Paging Links"
msgstr "Rodyti puslapių numeracijos nuorodas"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:163
#: google-calendar-events/views/widgets.php:227
msgid "Check this option to display Next and Back navigation links."
msgstr ""
"Pažymėkite, jeigu norite rodyti 'Pirmyn' ir 'Atgal' navigacijos nuorodas."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:168
msgid "Number of Events per Page"
msgstr "Viename puslapyje rodomų įvykių skaičius"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:172
#: google-calendar-events/views/admin/gce-feed-meta-display.php:183
#: google-calendar-events/views/admin/gce-feed-meta-display.php:197
#: google-calendar-events/views/admin/gce-feed-meta-display.php:211
#: google-calendar-events/views/widgets.php:242
#: google-calendar-events/views/widgets.php:250
msgid "Days"
msgstr "Dienos"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:173
#: google-calendar-events/views/widgets.php:243
msgid "Events"
msgstr "Įvykiai"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:175
msgid "How many events to display per page (List View only)."
msgstr "Kiek įvykių rodyti viename puslapyje (galioja tik sąrašo rodiniui)?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:180
msgid "Display Start Date Offset"
msgstr "Rodyti pradžios datos poslinkį [offset]"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:186
#: google-calendar-events/views/widgets.php:253
msgid "Ahead"
msgstr "Priekyje"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:188
msgid ""
"Change if you need to initially display events on a date other than today "
"(List View only)."
msgstr ""
"Pakeiskite, jeigu reikia rodyti ne šiandienos įvykius (galioja tik sąrašo "
"rodiniui)."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:193
msgid "Minimum Feed Start Date"
msgstr "Minimali srauto pradžios data"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:198
#: google-calendar-events/views/admin/gce-feed-meta-display.php:212
msgid "Months"
msgstr "Mėnesiai"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:199
#: google-calendar-events/views/admin/gce-feed-meta-display.php:213
msgid "Years"
msgstr "Metai"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:201
msgid "back"
msgstr "atgal"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:202
msgid ""
"Set how far back to retrieve events regardless of month or page being "
"displayed."
msgstr ""
"Pasirinkite, kiek istorinių įvykių rodyti nepaisant rodomo mėnesio ar "
"puslapio."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:207
msgid "Maximum Feed End Date"
msgstr "Maksimali srauto pabaigos data"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:215
msgid "forward"
msgstr "pirmyn"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:216
msgid ""
"Set how far in the future to retrieve events regardless of month or page "
"being displayed."
msgstr ""
"Pasirinkite, kiek ateities įvykių rodyti nepaisant rodomo mėnesio ar "
"puslapio."
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:6
msgid "Documentation & getting started"
msgstr "Dokumentacija ir pradžios pagalba"
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:12
msgid "Community support forums"
msgstr "Bendruomenės palaikymo forumai"
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:18
msgid "Get notified of new features"
msgstr "Gaukite pranešimus apie naujas įskiepio galimybes"
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:24
msgid "Rate this plugin"
msgstr "Įvertinkite šį įskiepį"
#: google-calendar-events/views/widgets.php:28
msgid ""
"Display a list or calendar grid of events from one or more Google Calendar "
"feeds you have added"
msgstr ""
"Rodyti įvykių sąrašą arba kalendoriaus tinklelį iš vieno ar daugiau Google "
"kalendoriaus srautų."
#: google-calendar-events/views/widgets.php:111
msgid ""
"No valid Feed IDs have been entered for this widget. Please check that you "
"have entered the IDs correctly in the widget settings (Appearance > "
"Widgets), and that the Feeds have not been deleted."
msgstr ""
"Neįvestas nei vienas veikiantis srauto ID. Patikrinkite, ar teisingai "
"įvedėte srauto ID numerius į valdiklio nustatymus (Išvaizda > Valdikliai) ir "
"ar srautai nebuvo ištrinti."
#: google-calendar-events/views/widgets.php:144
msgid "You have not added any feeds yet."
msgstr "Kol kas neįtraukėte nei vieno srauto."
#: google-calendar-events/views/widgets.php:186
msgid "There are no feeds created yet."
msgstr "Kol kas nėra jokių srautų."
#: google-calendar-events/views/widgets.php:187
msgid "Add your first feed!"
msgstr "Įtraukite pirmąjį srautą."
#: google-calendar-events/views/widgets.php:211
msgid "Feeds to Display (comma separated list - i.e. 101,102,103):"
msgstr "Rodyti šiuos srautus (atskirti kableliais - pav. 101,102,103):"
#: google-calendar-events/views/widgets.php:216
msgid "Display Events as:"
msgstr "Rodyti įvykius kaip:"
#: google-calendar-events/views/widgets.php:225
msgid "Show Paging Links:"
msgstr "Rodyti puslapių keitimo nuorodas:"
#: google-calendar-events/views/widgets.php:231
msgid "Sort Order (List View only):"
msgstr "Rikiavimas (galioja tik sąrašo rodiniui)"
#: google-calendar-events/views/widgets.php:233
msgid "Ascending"
msgstr "Didėjimo tvarka"
#: google-calendar-events/views/widgets.php:234
msgid "Descending"
msgstr "Mažėjimo tvarka"
#: google-calendar-events/views/widgets.php:239
msgid "Number of Events per Page (List View only):"
msgstr "Įvykių skaičius viename puslapyje (galioja tik sąrašo rodiniui):"
#: google-calendar-events/views/widgets.php:248
msgid "Display Start Date Offset (List View only):"
msgstr "Rodyti pradžios datos poslinkį [offset] (galioja tik sąrašo rodiniui):"
#: google-calendar-events/views/widgets.php:258
msgid ""
"Display Title on Tooltip/List Item (e.g. 'Events on 7th March'). Grouped "
"lists always have a title displayed."
msgstr ""
"Rodyti įvykio pavadinimą ant mygtuko etiketės [tooltip] (pav. 'Įvykiai kovo "
"7-ąją'). Įvykio pavadinimas visuomet rodomas sugrupuoto sąrašo rodinyje."
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,778 @@
msgid ""
msgstr ""
"Project-Id-Version: Google Calendar Events\n"
"POT-Creation-Date: 2014-10-28 10:39-0700\n"
"PO-Revision-Date: 2014-10-31 19:32+0100\n"
"Last-Translator: Michał Pasternak <michal.dtz@gmail.com>\n"
"Language-Team: \n"
"Language: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-Basepath: .\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Poedit-KeywordsList: __;_e\n"
"X-Poedit-SearchPath-0: google-calendar-events\n"
#: google-calendar-events/class-google-calendar-events-admin.php:64
#: google-calendar-events/class-google-calendar-events-admin.php:65
#: google-calendar-events/includes/register-settings.php:44
msgid "General Settings"
msgstr "Ustawienia ogólne"
#: google-calendar-events/class-google-calendar-events-admin.php:122
#: google-calendar-events/views/widgets.php:27
msgid "Google Calendar Events"
msgstr "Wydarzenia w kalendarzu Google"
#: google-calendar-events/class-google-calendar-events-admin.php:134
msgid "Feeds"
msgstr "Kalendarze"
#: google-calendar-events/class-google-calendar-events.php:142
msgid "Loading..."
msgstr "Wczytuję..."
#: google-calendar-events/includes/admin/admin-functions.php:20
msgid "Cache has been cleared for this feed."
msgstr "Pamięć podręczna została wyczyszczona dla tego kalendarza."
#: google-calendar-events/includes/admin/admin-functions.php:35
#: google-calendar-events/includes/admin/admin-functions.php:57
msgid "Starts:"
msgstr "Początek: "
#: google-calendar-events/includes/admin/admin-functions.php:36
#: google-calendar-events/includes/admin/admin-functions.php:59
msgid "Ends:"
msgstr "Koniec: "
#: google-calendar-events/includes/admin/admin-functions.php:37
#: google-calendar-events/includes/admin/admin-functions.php:61
msgid "Location:"
msgstr "Miejsce: "
#: google-calendar-events/includes/admin/admin-functions.php:38
#: google-calendar-events/includes/admin/admin-functions.php:62
msgid "Description:"
msgstr "Opis:"
#: google-calendar-events/includes/admin/admin-functions.php:39
msgid "More details..."
msgstr "Więcej szczegółów..."
#: google-calendar-events/includes/admin/admin-functions.php:64
msgid "More Details"
msgstr "Więcej szczegółów"
#: google-calendar-events/includes/admin/admin-functions.php:78
#: google-calendar-events/includes/gce-feed-cpt.php:256
msgid "Clear Cache"
msgstr "Wyczyść pamięć podręczną"
#: google-calendar-events/includes/class-gce-display.php:179
#: google-calendar-events/includes/class-gce-display.php:270
#: google-calendar-events/views/admin/gce-feed-meta-display.php:185
#: google-calendar-events/views/widgets.php:252
msgid "Back"
msgstr "Wstecz"
#: google-calendar-events/includes/class-gce-display.php:183
#: google-calendar-events/includes/class-gce-display.php:271
msgid "Next"
msgstr "Następny"
#: google-calendar-events/includes/class-gce-display.php:366
msgid "No events to display."
msgstr "Brak zdarzeń do wyświetlenia."
#: google-calendar-events/includes/class-gce-event.php:504
#, php-format
msgid "%s year"
msgstr "%s rok"
#: google-calendar-events/includes/class-gce-event.php:504
#, php-format
msgid "%s years"
msgstr "%s lat"
#: google-calendar-events/includes/class-gce-event.php:505
#, php-format
msgid "%s month"
msgstr "%s miesiąc"
#: google-calendar-events/includes/class-gce-event.php:505
#, php-format
msgid "%s months"
msgstr "%s miesiące"
#: google-calendar-events/includes/class-gce-event.php:506
#, php-format
msgid "%s week"
msgstr "%s tydzień"
#: google-calendar-events/includes/class-gce-event.php:506
#, php-format
msgid "%s weeks"
msgstr "%s tygodnie"
#: google-calendar-events/includes/class-gce-event.php:507
#, php-format
msgid "%s day"
msgstr "%s dzień"
#: google-calendar-events/includes/class-gce-event.php:507
#, php-format
msgid "%s days"
msgstr "%s dni"
#: google-calendar-events/includes/class-gce-event.php:508
#, php-format
msgid "%s hour"
msgstr "%s godzina"
#: google-calendar-events/includes/class-gce-event.php:508
#, php-format
msgid "%s hours"
msgstr "%s godziny"
#: google-calendar-events/includes/class-gce-event.php:509
#, php-format
msgid "%s min"
msgstr "%s minuta"
#: google-calendar-events/includes/class-gce-event.php:509
#, php-format
msgid "%s mins"
msgstr "%s minuty"
#: google-calendar-events/includes/class-gce-feed.php:81
msgid ""
"The feed URL has not been set. Please make sure to set it correctly in the "
"Feed settings."
msgstr ""
"Adres URL kalendarza nie został ustawiony. Upewnij się, że wpisałeś/aś go "
"poprawnie w Ustawieniach kalendarza."
#: google-calendar-events/includes/class-gce-feed.php:177
msgid ""
"Some data was retrieved, but could not be parsed successfully. Please ensure "
"your feed URL is correct."
msgstr ""
"Otrzymano część danych, ale nie mogły być one zanalizowane prawidłowo. "
"Upewnij się, że adres URL kalendarza jest poprawny."
#: google-calendar-events/includes/class-gce-feed.php:183
msgid ""
"The feed could not be found (404). Please ensure your feed URL is correct."
msgstr ""
"Nie znaleziono kalendarza (błąd 404 Not found). Upewnij się, że adres URL "
"jest prawidłowy."
#: google-calendar-events/includes/class-gce-feed.php:186
msgid ""
"Access to this feed was denied (403). Please ensure you have public sharing "
"enabled for your calendar."
msgstr ""
"Brak dostępu (błąd 403 Forbidden). Upewnij się, że ten kalendarz jest "
"publicznie dostępny."
#: google-calendar-events/includes/class-gce-feed.php:189
#, php-format
msgid ""
"The feed data could not be retrieved. Error code: %s. Please ensure your "
"feed URL is correct."
msgstr ""
"Nie otrzymano danych kalendarza. Kod błędu: %s. Upewnij się, że adres URL "
"kalendarza jest poprawny."
#: google-calendar-events/includes/class-gce-feed.php:194
msgid " Please ensure your feed URL is correct."
msgstr "Upewnij się, że adres URL kalendarza jest poprawny."
#: google-calendar-events/includes/gce-feed-cpt.php:21
msgid "Google Calendar Feeds"
msgstr "Kalendarze Google"
#: google-calendar-events/includes/gce-feed-cpt.php:22
#: google-calendar-events/includes/gce-feed-cpt.php:24
#: google-calendar-events/includes/gce-feed-cpt.php:72
msgid "Feed"
msgstr "Kalendarz"
#: google-calendar-events/includes/gce-feed-cpt.php:23
msgid "GCal Events"
msgstr "Wydarzenia GCal"
#: google-calendar-events/includes/gce-feed-cpt.php:25
msgid "Add New"
msgstr "Dodaj nowy"
#: google-calendar-events/includes/gce-feed-cpt.php:26
msgid "Add New Feed"
msgstr "Dodaj nowy kalendarz"
#: google-calendar-events/includes/gce-feed-cpt.php:27
msgid "New Feed"
msgstr "Nowy kalendarz"
#: google-calendar-events/includes/gce-feed-cpt.php:28
msgid "Edit Feed"
msgstr "Edytuj kalendarz"
#: google-calendar-events/includes/gce-feed-cpt.php:29
msgid "View Feed"
msgstr "Pokaż kalendarz"
#: google-calendar-events/includes/gce-feed-cpt.php:30
msgid "All GCal Feeds"
msgstr "Wszystkie kalendarze"
#: google-calendar-events/includes/gce-feed-cpt.php:31
msgid "Search GCal Feeds"
msgstr "Przeszukaj kalendarze"
#: google-calendar-events/includes/gce-feed-cpt.php:32
msgid "No feeds found."
msgstr "Nie znaleziono kalendarzy."
#: google-calendar-events/includes/gce-feed-cpt.php:33
msgid "No feeds found in Trash."
msgstr "Nie znaleziono kalendarzy w Śmietniku."
#: google-calendar-events/includes/gce-feed-cpt.php:70
#, fuzzy
msgid "feed"
msgstr "Kalendarz"
#: google-calendar-events/includes/gce-feed-cpt.php:75
#: google-calendar-events/includes/gce-feed-cpt.php:76
#, php-format
msgid "%4$s updated. %1$sView %2$s%3$s"
msgstr "%4$s zaktualizowano. %1$sObejrzyj %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:77
#, php-format
msgid "%4$s published. %1$sView %2$s%3$s"
msgstr "%4$s opublikowano. %1$sObejrzyj %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:78
#, php-format
msgid "%4$s saved. %1$sView %2$s%3$s"
msgstr "%4$s zapisano. %1$sObejrzyj %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:79
#, php-format
msgid "%4$s submitted. %1$sView %2$s%3$s"
msgstr "%4$s wysłano. %1$sObejrzyj %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:80
#, php-format
msgid "%4$s draft updated. %1$sView %2$s%3$s"
msgstr "%4$s szkiców zaktualizowano. %1$sObejrzyj %2$s%3$s"
#: google-calendar-events/includes/gce-feed-cpt.php:97
msgid "Helpful Links"
msgstr "Pomocne adresy"
#: google-calendar-events/includes/gce-feed-cpt.php:209
msgid "Feed ID"
msgstr "ID kalendarza"
#: google-calendar-events/includes/gce-feed-cpt.php:210
#: google-calendar-events/views/admin/gce-feed-meta-display.php:73
msgid "Feed Shortcode"
msgstr "Krótki kod kalednarza"
#: google-calendar-events/includes/gce-feed-cpt.php:211
msgid "Display Type"
msgstr "Rodzaj widoku"
#: google-calendar-events/includes/gce-feed-cpt.php:238
#: google-calendar-events/views/admin/gce-feed-meta-display.php:152
#: google-calendar-events/views/widgets.php:218
msgid "Grid"
msgstr "Siatka"
#: google-calendar-events/includes/gce-feed-cpt.php:240
#: google-calendar-events/views/admin/gce-feed-meta-display.php:153
#: google-calendar-events/views/widgets.php:219
msgid "List"
msgstr "Lista"
#: google-calendar-events/includes/gce-feed-cpt.php:242
#: google-calendar-events/views/admin/gce-feed-meta-display.php:154
#: google-calendar-events/views/widgets.php:220
msgid "Grouped List"
msgstr "Zgrupowana lista"
#: google-calendar-events/includes/register-settings.php:29
msgid "Save Settings"
msgstr "Zapisz ustawienia"
#: google-calendar-events/includes/register-settings.php:30
msgid ""
"Save your settings when uninstalling this plugin. Useful when upgrading or "
"re-installing."
msgstr ""
"Zapisz swoje ustawienia gdy odinstalowujesz tą wtyczkę. Użyteczne gdy "
"aktualizujesz lub re-instalujesz."
#: google-calendar-events/includes/register-settings.php:132
#, php-format
msgid ""
"The callback function used for the <strong>%s</strong> setting is missing."
msgstr "Brakuje funkcji callback używanej dla ustawienia <strong>%s</strong>. "
#: google-calendar-events/views/admin/display-options-meta.php:39
msgid ""
"Check this box to use the simple display options below instead of the Event "
"Builder code on the left."
msgstr ""
"Zaznacz tą opcję, aby użyć opcji prostego wyświetlania dostępnych poniżej, "
"zamiast kodu Budowniczego Wydarzeń dostępnego po lewej. "
#: google-calendar-events/views/admin/display-options-meta.php:44
msgid "Start date / time display"
msgstr "Wyświetlaj początkową datę / czas"
#: google-calendar-events/views/admin/display-options-meta.php:45
msgid "Select how to display the start date / time."
msgstr "Określ, jak wyświetlać początkową datę / czas"
#: google-calendar-events/views/admin/display-options-meta.php:47
#: google-calendar-events/views/admin/display-options-meta.php:61
msgid "None"
msgstr "Nie wyświetlaj"
#: google-calendar-events/views/admin/display-options-meta.php:48
msgid "Start time"
msgstr "Początkowy czas"
#: google-calendar-events/views/admin/display-options-meta.php:49
msgid "Start date"
msgstr "Początkowa data"
#: google-calendar-events/views/admin/display-options-meta.php:50
msgid "Start time and date"
msgstr "Początkowy czas i data"
#: google-calendar-events/views/admin/display-options-meta.php:51
msgid "Start date and time"
msgstr "Początkowa data i czas"
#: google-calendar-events/views/admin/display-options-meta.php:53
msgid "Text to display before the start time."
msgstr "Tekst do wyświetlenia przed czasem rozpoczęcia."
#: google-calendar-events/views/admin/display-options-meta.php:58
msgid "End time/date display"
msgstr "Wyświetlaj końcowy czas/datę"
#: google-calendar-events/views/admin/display-options-meta.php:59
msgid "Select how to display the end date / time."
msgstr "Określ, jak wyświetlać końcową datę i czas."
#: google-calendar-events/views/admin/display-options-meta.php:62
msgid "End time"
msgstr "Końcowy czas"
#: google-calendar-events/views/admin/display-options-meta.php:63
msgid "End date"
msgstr "Końcowa data"
#: google-calendar-events/views/admin/display-options-meta.php:64
msgid "End time and date"
msgstr "Końcowy czas i data"
#: google-calendar-events/views/admin/display-options-meta.php:65
msgid "End date and time"
msgstr "Końcowa data i czas"
#: google-calendar-events/views/admin/display-options-meta.php:67
msgid "Text to display before the end time."
msgstr "Tekst do wyświetlenia przed czasem zakończenia."
#: google-calendar-events/views/admin/display-options-meta.php:72
msgid "Separator"
msgstr "Separator"
#: google-calendar-events/views/admin/display-options-meta.php:74
msgid ""
"If you have chosen to display both the time and date above, enter the text / "
"characters to display between the time and date here (including any spaces)."
msgstr ""
"Jeżeli wybrałeś/aś aby wyświetlać zarówno czas i datę powyżej, wpisz tekst / "
"znaki do wyświetlenia pomiędzy czasem i datą (ze spacjami włącznie)."
#: google-calendar-events/views/admin/display-options-meta.php:80
msgid "Location"
msgstr "Miejsce"
#: google-calendar-events/views/admin/display-options-meta.php:82
msgid "Show the location of events?"
msgstr "Wyświetlać miejsce zdarzenia?"
#: google-calendar-events/views/admin/display-options-meta.php:83
msgid "Text to display before the location."
msgstr "Tekst do wyświetlenia przed miejscem."
#: google-calendar-events/views/admin/display-options-meta.php:88
msgid "Description"
msgstr "Opis"
#: google-calendar-events/views/admin/display-options-meta.php:91
msgid ""
"Show the description of events? (URLs in the description will be made into "
"links)."
msgstr ""
"Czy pokazywać opis wydarzeń? (adresy URL w opisie zostaną zamienione na "
"odnośniki)."
#: google-calendar-events/views/admin/display-options-meta.php:93
msgid "Text to display before the description."
msgstr "Tekst do wyświetlenia przed opisem."
#: google-calendar-events/views/admin/display-options-meta.php:95
msgid ""
"Maximum number of words to show from description. Leave blank for no limit."
msgstr ""
"Maksymalna liczba słów opisu do wyświetlenia. Pozostaw puste aby nie "
"ograniczać."
#: google-calendar-events/views/admin/display-options-meta.php:100
msgid "Event Link"
msgstr "Odnośnik do wydarzenia"
#: google-calendar-events/views/admin/display-options-meta.php:103
msgid "Show a link to the Google Calendar page for an event?"
msgstr "Czy pokazywać odnośnik do kalendarza Google dla zdarzenia?"
#: google-calendar-events/views/admin/display-options-meta.php:107
msgid "Links open in a new window / tab?"
msgstr "Odnośniki otwierają się w nowym oknie / zakładce?"
#: google-calendar-events/views/admin/display-options-meta.php:109
msgid "The link text to be displayed."
msgstr "Tekst odnośnika do wyświetlenia."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:54
msgid ""
"We're <strong>smack dab</strong> in the middle of building additional "
"features for this plugin. Have ideas?"
msgstr "Obecnie rozbudowujemy tą wtyczkę. Masz jakieś pomysły?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:57
msgid "Visit our roadmap and tell us what you're looking for"
msgstr "Obejrzyj nasz plan pracy i powiedz nam, czego poszukujesz"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:63
msgid "Want to be in the know?"
msgstr "Chcesz być poinformowany?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:66
msgid "Get notified when new features are released"
msgstr "Bądź poinformowany, gdy nowe funkcje będą dostępne"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:77
#, fuzzy
msgid ""
"Copy and paste this shortcode to display this Google Calendar feed on any "
"post or page."
msgstr ""
"Skopiuj i wklej ten krótki kod, aby wyświetlić ten kalendarz Google na "
"dowolnej stronie lub wpisie."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:78
msgid ""
"To avoid display issues, make sure to paste the shortcode in the Text tab of "
"the post editor."
msgstr ""
"Aby uniknąć problemów z wyświetlaniem, upewnij się, że wklejasz ten krótki "
"kod do zakładki \"Tekst\" edytora wpisów."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:83
msgid "GCal Feed URL"
msgstr "Adres kalendarza"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:87
msgid "The Google Calendar feed URL."
msgstr "Adres kalendarza w Google Calendar"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:87
msgid "Example"
msgstr "Przykład"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:89
msgid "How to find your GCal feed URL"
msgstr "Jak odnaleźć adres kalendarza Google?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:95
msgid "Search Query"
msgstr "Zapytanie"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:98
msgid "Find and show events based on a search query."
msgstr "Znajdź i wyświetl wydarzenia, bazując na wyszukiwaniu"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:103
msgid "Expand Recurring Events?"
msgstr "Wyświetlać wszystkie powtórzenia dla powtarzającego się wydarzenia?"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:105
msgid "Yes"
msgstr "Tak"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:106
msgid ""
"This will show recurring events each time they occur, otherwise it will only "
"show the event the first time it occurs."
msgstr ""
"Ta opcja pokaże wydarzenia powtarzające się za każdym razem, gdy występują, "
"w przeciwnym wypadku pokaże tylko pierwsze wystąpienie danego wydarzenia."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:111
msgid "Date Format"
msgstr "Format daty"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:115
#: google-calendar-events/views/admin/gce-feed-meta-display.php:126
#, php-format
msgid "Use %sPHP date formatting%s."
msgstr "Użyj %sPHP date formatting%s."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:116
#: google-calendar-events/views/admin/gce-feed-meta-display.php:127
msgid "Leave blank to use the default."
msgstr "Pozostaw puste, aby użyć wartości domyślnej."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:122
msgid "Time Format"
msgstr "Format czasu"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:133
msgid "Cache Duration"
msgstr "Okres pamięci podręcznej"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:136
msgid ""
"The length of time, in seconds, to cache the feed (43200 = 12 hours). If "
"this feed changes regularly, you may want to reduce the cache duration."
msgstr ""
"Okres czasu, w sekundach, przez który kalendarz będzie przetrzymywany w "
"pamięci podręcznej. Jeżeli ten kalendarz zmienia się często, możesz "
"zmniejszyć tą wartość. 43200 = 12 godzin. "
#: google-calendar-events/views/admin/gce-feed-meta-display.php:141
msgid "Multiple Day Events"
msgstr "Wydarzenia kilkudniowe"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:143
msgid "Show on each day"
msgstr "Pokazuj każdego dnia"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:144
msgid ""
"Show events that span multiple days on each day that they span, rather than "
"just the first day."
msgstr ""
"Pokazuj wydarzenia, które rozciągają się na klika dni, przez wszystkie dni, "
"zamiast tylko pierwszego dnia."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:149
msgid "Display Mode"
msgstr "Tryb wyświetlania"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:156
msgid "Choose how you want your calendar to be displayed."
msgstr "Wybierz, jak chcesz wyświetlać swój kalendarz."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:161
msgid "Show Paging Links"
msgstr "Pokaż przewijanie"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:163
#: google-calendar-events/views/widgets.php:227
msgid "Check this option to display Next and Back navigation links."
msgstr ""
"Zaznacz tą opcję, aby pokazywać nawigację (\"poprzedni\", \"następny\")"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:168
msgid "Number of Events per Page"
msgstr "Ilość wydarzeń na stronę"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:172
#: google-calendar-events/views/admin/gce-feed-meta-display.php:183
#: google-calendar-events/views/admin/gce-feed-meta-display.php:197
#: google-calendar-events/views/admin/gce-feed-meta-display.php:211
#: google-calendar-events/views/widgets.php:242
#: google-calendar-events/views/widgets.php:250
msgid "Days"
msgstr "Dni"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:173
#: google-calendar-events/views/widgets.php:243
msgid "Events"
msgstr "Wydarzenia"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:175
msgid "How many events to display per page (List View only)."
msgstr "Jak dużo wydarzeń wyświetlać na stronie (tylko widok listy). "
#: google-calendar-events/views/admin/gce-feed-meta-display.php:180
#, fuzzy
msgid "Display Start Date Offset"
msgstr "Przesunięcie daty początkowej"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:186
#: google-calendar-events/views/widgets.php:253
msgid "Ahead"
msgstr "W przód"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:188
#, fuzzy
msgid ""
"Change if you need to initially display events on a date other than today "
"(List View only)."
msgstr ""
"Jeżeli potrzebujesz pokazać zdarzenia zaczynające się innego dnia, niż "
"dzisiaj (tylko widok listy)."
#: google-calendar-events/views/admin/gce-feed-meta-display.php:193
msgid "Minimum Feed Start Date"
msgstr "Minimalna początkowa data"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:198
#: google-calendar-events/views/admin/gce-feed-meta-display.php:212
#, fuzzy
msgid "Months"
msgstr "%s miesiące"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:199
#: google-calendar-events/views/admin/gce-feed-meta-display.php:213
#, fuzzy
msgid "Years"
msgstr "%s lat"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:201
msgid "back"
msgstr "wstecz"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:202
msgid ""
"Set how far back to retrieve events regardless of month or page being "
"displayed."
msgstr ""
"Ustal, jak dawne wydarzenia pobierać, niezależnie od wyświetlanego miesiąca "
"lub strony. "
#: google-calendar-events/views/admin/gce-feed-meta-display.php:207
#, fuzzy
msgid "Maximum Feed End Date"
msgstr "Końcowa data"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:215
msgid "forward"
msgstr "naprzód"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:216
msgid ""
"Set how far in the future to retrieve events regardless of month or page "
"being displayed."
msgstr ""
"Ustaw, jak daleko w przyszłość wybiegać pobierając wydarzenia, niezależnie "
"od wyświetlanego miesiąca lub strony."
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:6
msgid "Documentation & getting started"
msgstr "Dokumentacja & konfiguracja wstępna"
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:12
msgid "Community support forums"
msgstr "Forum wsparcia"
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:18
msgid "Get notified of new features"
msgstr "Bądź informowany o nowych możliwościach"
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:24
msgid "Rate this plugin"
msgstr "Oceń tą wtyczkę"
#: google-calendar-events/views/widgets.php:28
msgid ""
"Display a list or calendar grid of events from one or more Google Calendar "
"feeds you have added"
msgstr ""
"Wyświetla listę lub siatkę wydarzeń z jednego lub więcej kalendarzy Google"
#: google-calendar-events/views/widgets.php:111
msgid ""
"No valid Feed IDs have been entered for this widget. Please check that you "
"have entered the IDs correctly in the widget settings (Appearance > "
"Widgets), and that the Feeds have not been deleted."
msgstr ""
"Nie wpisano prawidłowych ID kalendarzy. Proszę upewnij się, że wpisano "
"prawidłowe ID kalendarzy w ustawieniach kontrolki (Wygląd -> Widżety) oraz, "
"że kalendarz nie został usunięty."
#: google-calendar-events/views/widgets.php:144
msgid "You have not added any feeds yet."
msgstr "Nie dodano żadnych kalendarzy"
#: google-calendar-events/views/widgets.php:186
msgid "There are no feeds created yet."
msgstr "Nie utworzono żadnych kalendarzy"
#: google-calendar-events/views/widgets.php:187
msgid "Add your first feed!"
msgstr "Dodaj swój pierwszy kalendarz!"
#: google-calendar-events/views/widgets.php:211
msgid "Feeds to Display (comma separated list - i.e. 101,102,103):"
msgstr ""
"Kalendarze do wyświetlenia (w formacie listy oddzielanej przecinkami, czyli "
"101,102,103):"
#: google-calendar-events/views/widgets.php:216
#, fuzzy
msgid "Display Events as:"
msgstr "Wyświetlaj wydarzenia jako:"
#: google-calendar-events/views/widgets.php:225
msgid "Show Paging Links:"
msgstr "Pokaż przewijanie"
#: google-calendar-events/views/widgets.php:231
msgid "Sort Order (List View only):"
msgstr "Porządek wyświetlania (tylko widok listy):"
#: google-calendar-events/views/widgets.php:233
msgid "Ascending"
msgstr "Rosnąco"
#: google-calendar-events/views/widgets.php:234
msgid "Descending"
msgstr "Malejąco"
#: google-calendar-events/views/widgets.php:239
#, fuzzy
msgid "Number of Events per Page (List View only):"
msgstr "Ilość zdarzeń na stronę (tylko widok listy):"
#: google-calendar-events/views/widgets.php:248
#, fuzzy
msgid "Display Start Date Offset (List View only):"
msgstr "Przesunięcie daty początkowej (tylko widok listy):"
#: google-calendar-events/views/widgets.php:258
msgid ""
"Display Title on Tooltip/List Item (e.g. 'Events on 7th March'). Grouped "
"lists always have a title displayed."
msgstr ""
"Wyświetlaj tytuł na etykiecie narzędzia/elemencie listy (np. 'Wydarzenia 7. "
"marca'). Etykieta narzędziowa zawsze wyświetlana jest dla list zgrupowanych."
#~ msgid "Show paging links:"
#~ msgstr "Pokazuj przyciski przewijania stron:"
@@ -1,8 +1,8 @@
msgid ""
msgstr ""
"Project-Id-Version: Google Calendar Events\n"
"POT-Creation-Date: 2014-10-09 13:21-0700\n"
"PO-Revision-Date: 2014-10-09 13:21-0700\n"
"POT-Creation-Date: 2014-11-19 00:09-0700\n"
"PO-Revision-Date: 2014-11-19 00:10-0700\n"
"Last-Translator: \n"
"Language-Team: \n"
"Language: en\n"
@@ -15,137 +15,152 @@ msgstr ""
"X-Poedit-KeywordsList: __;_e\n"
"X-Poedit-SearchPath-0: google-calendar-events\n"
#: google-calendar-events/class-google-calendar-events-admin.php:64
#: google-calendar-events/class-google-calendar-events-admin.php:65
#: google-calendar-events/includes/register-settings.php:44
#: google-calendar-events/class-google-calendar-events-admin.php:128
#: google-calendar-events/class-google-calendar-events-admin.php:129
#: google-calendar-events/class-google-calendar-events-admin.php:198
#: google-calendar-events/includes/register-settings.php:54
msgid "General Settings"
msgstr ""
#: google-calendar-events/class-google-calendar-events-admin.php:122
#: google-calendar-events/class-google-calendar-events-admin.php:186
#: google-calendar-events/views/widgets.php:27
msgid "Google Calendar Events"
msgstr ""
#: google-calendar-events/class-google-calendar-events-admin.php:134
#: google-calendar-events/class-google-calendar-events-admin.php:199
msgid "Feeds"
msgstr ""
#: google-calendar-events/class-google-calendar-events.php:142
msgid "Loading..."
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:20
msgid "Cache has been cleared for this feed."
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:74
#: google-calendar-events/includes/gce-feed-cpt.php:252
#: google-calendar-events/includes/admin/admin-functions.php:35
#: google-calendar-events/includes/admin/admin-functions.php:57
msgid "Starts:"
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:36
#: google-calendar-events/includes/admin/admin-functions.php:59
msgid "Ends:"
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:37
#: google-calendar-events/includes/admin/admin-functions.php:61
msgid "Location:"
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:38
#: google-calendar-events/includes/admin/admin-functions.php:62
msgid "Description:"
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:39
msgid "More details..."
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:64
msgid "More Details"
msgstr ""
#: google-calendar-events/includes/admin/admin-functions.php:78
#: google-calendar-events/includes/gce-feed-cpt.php:264
msgid "Clear Cache"
msgstr ""
#: google-calendar-events/includes/class-gce-display.php:188
#: google-calendar-events/includes/class-gce-display.php:277
#: google-calendar-events/views/admin/gce-feed-meta-display.php:170
#: google-calendar-events/includes/class-gce-display.php:179
#: google-calendar-events/includes/class-gce-display.php:270
#: google-calendar-events/views/admin/gce-feed-meta-display.php:185
#: google-calendar-events/views/widgets.php:252
msgid "Back"
msgstr ""
#: google-calendar-events/includes/class-gce-display.php:192
#: google-calendar-events/includes/class-gce-display.php:278
#: google-calendar-events/includes/class-gce-display.php:183
#: google-calendar-events/includes/class-gce-display.php:271
msgid "Next"
msgstr ""
#: google-calendar-events/includes/class-gce-display.php:372
#: google-calendar-events/includes/class-gce-display.php:366
msgid "No events to display."
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:496
#: google-calendar-events/includes/class-gce-event.php:504
#, php-format
msgid "%s year"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:496
#: google-calendar-events/includes/class-gce-event.php:504
#, php-format
msgid "%s years"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:497
#: google-calendar-events/includes/class-gce-event.php:505
#, php-format
msgid "%s month"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:497
#: google-calendar-events/includes/class-gce-event.php:505
#, php-format
msgid "%s months"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:498
#: google-calendar-events/includes/class-gce-event.php:506
#, php-format
msgid "%s week"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:498
#: google-calendar-events/includes/class-gce-event.php:506
#, php-format
msgid "%s weeks"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:499
#: google-calendar-events/includes/class-gce-event.php:507
#, php-format
msgid "%s day"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:499
#: google-calendar-events/includes/class-gce-event.php:507
#, php-format
msgid "%s days"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:500
#: google-calendar-events/includes/class-gce-event.php:508
#, php-format
msgid "%s hour"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:500
#: google-calendar-events/includes/class-gce-event.php:508
#, php-format
msgid "%s hours"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:501
#: google-calendar-events/includes/class-gce-event.php:509
#, php-format
msgid "%s min"
msgstr ""
#: google-calendar-events/includes/class-gce-event.php:501
#: google-calendar-events/includes/class-gce-event.php:509
#, php-format
msgid "%s mins"
msgstr ""
#: google-calendar-events/includes/class-gce-feed.php:82
#: google-calendar-events/includes/class-gce-feed.php:89
msgid ""
"The feed URL has not been set. Please make sure to set it correctly in the "
"Feed settings."
msgstr ""
#: google-calendar-events/includes/class-gce-feed.php:162
#: google-calendar-events/includes/class-gce-feed.php:165
msgid ""
"Some data was retrieved, but could not be parsed successfully. Please ensure "
"your feed URL is correct."
"your feed settings are correct."
msgstr ""
#: google-calendar-events/includes/class-gce-feed.php:168
msgid ""
"The feed could not be found (404). Please ensure your feed URL is correct."
msgstr ""
#: google-calendar-events/includes/class-gce-feed.php:171
msgid ""
"Access to this feed was denied (403). Please ensure you have public sharing "
"enabled for your calendar."
msgstr ""
#: google-calendar-events/includes/class-gce-feed.php:174
#, php-format
msgid ""
"The feed data could not be retrieved. Error code: %s. Please ensure your "
"feed URL is correct."
msgstr ""
#: google-calendar-events/includes/class-gce-feed.php:179
#: google-calendar-events/includes/class-gce-feed.php:169
msgid " Please ensure your feed URL is correct."
msgstr ""
@@ -155,6 +170,7 @@ msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:22
#: google-calendar-events/includes/gce-feed-cpt.php:24
#: google-calendar-events/includes/gce-feed-cpt.php:72
msgid "Feed"
msgstr ""
@@ -198,6 +214,10 @@ msgstr ""
msgid "No feeds found in Trash."
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:70
msgid "feed"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:75
#: google-calendar-events/includes/gce-feed-cpt.php:76
#, php-format
@@ -224,53 +244,108 @@ msgstr ""
msgid "%4$s draft updated. %1$sView %2$s%3$s"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:205
#: google-calendar-events/includes/gce-feed-cpt.php:97
msgid "Helpful Links"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:217
msgid "Feed ID"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:206
#: google-calendar-events/views/admin/gce-feed-meta-display.php:61
#: google-calendar-events/includes/gce-feed-cpt.php:218
#: google-calendar-events/views/admin/gce-feed-meta-display.php:73
msgid "Feed Shortcode"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:207
#: google-calendar-events/includes/gce-feed-cpt.php:219
msgid "Display Type"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:234
#: google-calendar-events/views/admin/gce-feed-meta-display.php:137
#: google-calendar-events/includes/gce-feed-cpt.php:246
#: google-calendar-events/views/admin/gce-feed-meta-display.php:152
#: google-calendar-events/views/widgets.php:218
msgid "Grid"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:236
#: google-calendar-events/views/admin/gce-feed-meta-display.php:138
#: google-calendar-events/includes/gce-feed-cpt.php:248
#: google-calendar-events/views/admin/gce-feed-meta-display.php:153
#: google-calendar-events/views/widgets.php:219
msgid "List"
msgstr ""
#: google-calendar-events/includes/gce-feed-cpt.php:238
#: google-calendar-events/views/admin/gce-feed-meta-display.php:139
#: google-calendar-events/includes/gce-feed-cpt.php:250
#: google-calendar-events/views/admin/gce-feed-meta-display.php:154
#: google-calendar-events/views/widgets.php:220
msgid "Grouped List"
msgstr ""
#: google-calendar-events/includes/register-settings.php:29
msgid "Save Settings"
msgid "Google API Key"
msgstr ""
#: google-calendar-events/includes/register-settings.php:30
msgid ""
"If left blank all displayed Google calendars will use a public Google API "
"key shared across all plugin users."
msgstr ""
#: google-calendar-events/includes/register-settings.php:31
msgid ""
"Currently the shared key is limited to 500,000 requests per day and 5 "
"requests per second."
msgstr ""
#: google-calendar-events/includes/register-settings.php:32
#, php-format
msgid ""
"To avoid these limits <a href=\"%s\" target=\"_blank\">click here for "
"instructions on how to generate and use your own Google API key.</a>"
msgstr ""
#: google-calendar-events/includes/register-settings.php:39
msgid "Save Settings"
msgstr ""
#: google-calendar-events/includes/register-settings.php:40
msgid ""
"Save your settings when uninstalling this plugin. Useful when upgrading or "
"re-installing."
msgstr ""
#: google-calendar-events/includes/register-settings.php:132
#: google-calendar-events/includes/register-settings.php:169
#, php-format
msgid ""
"The callback function used for the <strong>%s</strong> setting is missing."
msgstr ""
#: google-calendar-events/views/admin/api-settings-notice.php:27
msgid "GCal Events Important Update (Nov. 19, 2014):"
msgstr ""
#: google-calendar-events/views/admin/api-settings-notice.php:28
msgid ""
"GCal Events now uses the Google API version 3, which requires use of a "
"public key."
msgstr ""
#: google-calendar-events/views/admin/api-settings-notice.php:29
msgid ""
"By default a shared key is used across all plugin users, which is limited to "
"500,000 requests per day and 5 requests per second."
msgstr ""
#: google-calendar-events/views/admin/api-settings-notice.php:30
msgid "To avoid these limits you can use your own Google API key."
msgstr ""
#: google-calendar-events/views/admin/api-settings-notice.php:33
msgid "Update your API settings now"
msgstr ""
#: google-calendar-events/views/admin/api-settings-notice.php:34
msgid "Hide this"
msgstr ""
#: google-calendar-events/views/admin/display-options-meta.php:39
msgid ""
"Check this box to use the simple display options below instead of the Event "
@@ -348,6 +423,18 @@ msgid ""
"characters to display between the time and date here (including any spaces)."
msgstr ""
#: google-calendar-events/views/admin/display-options-meta.php:80
msgid "Location"
msgstr ""
#: google-calendar-events/views/admin/display-options-meta.php:82
msgid "Show the location of events?"
msgstr ""
#: google-calendar-events/views/admin/display-options-meta.php:83
msgid "Text to display before the location."
msgstr ""
#: google-calendar-events/views/admin/display-options-meta.php:88
msgid "Description"
msgstr ""
@@ -383,156 +470,207 @@ msgstr ""
msgid "The link text to be displayed."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:42
#: google-calendar-events/views/admin/gce-feed-meta-display.php:54
msgid ""
"We're <strong>smack dab</strong> in the middle of building additional "
"features for this plugin. Have ideas?"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:45
#: google-calendar-events/views/admin/gce-feed-meta-display.php:57
msgid "Visit our roadmap and tell us what you're looking for"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:51
#: google-calendar-events/views/admin/gce-feed-meta-display.php:63
msgid "Want to be in the know?"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:54
#: google-calendar-events/views/admin/gce-feed-meta-display.php:66
msgid "Get notified when new features are released"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:64
#: google-calendar-events/views/admin/gce-feed-meta-display.php:77
msgid ""
"Copy and paste this shortcode to display this Google Calendar feed in any "
"Copy and paste this shortcode to display this Google Calendar feed on any "
"post or page."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:68
msgid "GCal Feed URL"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:72
msgid "The Google Calendar feed URL."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:73
msgid "Example"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:74
msgid "How to find your GCal feed URL"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:80
msgid "Search Query"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:78
msgid ""
"To avoid display issues, make sure to paste the shortcode in the Text tab of "
"the post editor."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:83
msgid "Google Calendar ID"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:87
msgid "The Google Calendar ID."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:87
msgid "Example"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:89
msgid "How to find your GCal calendar ID"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:95
msgid "Search Query"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:98
msgid "Find and show events based on a search query."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:88
#: google-calendar-events/views/admin/gce-feed-meta-display.php:103
msgid "Expand Recurring Events?"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:90
#: google-calendar-events/views/admin/gce-feed-meta-display.php:105
msgid "Yes"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:91
#: google-calendar-events/views/admin/gce-feed-meta-display.php:106
msgid ""
"This will show recurring events each time they occur, otherwise it will only "
"show the event the first time it occurs."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:96
#: google-calendar-events/views/admin/gce-feed-meta-display.php:111
msgid "Date Format"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:100
#: google-calendar-events/views/admin/gce-feed-meta-display.php:111
#: google-calendar-events/views/admin/gce-feed-meta-display.php:115
#: google-calendar-events/views/admin/gce-feed-meta-display.php:126
#, php-format
msgid "Use %sPHP date formatting%s."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:107
#: google-calendar-events/views/admin/gce-feed-meta-display.php:116
#: google-calendar-events/views/admin/gce-feed-meta-display.php:127
msgid "Leave blank to use the default."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:122
msgid "Time Format"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:118
#: google-calendar-events/views/admin/gce-feed-meta-display.php:133
msgid "Cache Duration"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:121
#: google-calendar-events/views/admin/gce-feed-meta-display.php:136
msgid ""
"The length of time, in seconds, to cache the feed (43200 = 12 hours). If "
"this feed changes regularly, you may want to reduce the cache duration."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:126
#: google-calendar-events/views/admin/gce-feed-meta-display.php:141
msgid "Multiple Day Events"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:128
#: google-calendar-events/views/admin/gce-feed-meta-display.php:143
msgid "Show on each day"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:129
#: google-calendar-events/views/admin/gce-feed-meta-display.php:144
msgid ""
"Show events that span multiple days on each day that they span, rather than "
"just the first day."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:134
#: google-calendar-events/views/admin/gce-feed-meta-display.php:149
msgid "Display Mode"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:141
#: google-calendar-events/views/admin/gce-feed-meta-display.php:156
msgid "Choose how you want your calendar to be displayed."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:146
#: google-calendar-events/views/admin/gce-feed-meta-display.php:161
msgid "Show Paging Links"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:148
#: google-calendar-events/views/admin/gce-feed-meta-display.php:163
#: google-calendar-events/views/widgets.php:227
msgid "Check this option to display Next and Back navigation links."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:153
#: google-calendar-events/views/admin/gce-feed-meta-display.php:168
msgid "Number of Events per Page"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:157
#: google-calendar-events/views/admin/gce-feed-meta-display.php:168
#: google-calendar-events/views/admin/gce-feed-meta-display.php:172
#: google-calendar-events/views/admin/gce-feed-meta-display.php:183
#: google-calendar-events/views/admin/gce-feed-meta-display.php:197
#: google-calendar-events/views/admin/gce-feed-meta-display.php:211
#: google-calendar-events/views/widgets.php:242
#: google-calendar-events/views/widgets.php:250
msgid "Days"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:158
#: google-calendar-events/views/admin/gce-feed-meta-display.php:173
#: google-calendar-events/views/widgets.php:243
msgid "Events"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:160
#: google-calendar-events/views/admin/gce-feed-meta-display.php:175
msgid "How many events to display per page (List View only)."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:165
msgid "Start Date Offset"
#: google-calendar-events/views/admin/gce-feed-meta-display.php:180
msgid "Display Start Date Offset"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:171
#: google-calendar-events/views/admin/gce-feed-meta-display.php:186
#: google-calendar-events/views/widgets.php:253
msgid "Ahead"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:173
#: google-calendar-events/views/admin/gce-feed-meta-display.php:188
msgid ""
"If you need to show events starting on a day other than today. (List View "
"only)."
"Change if you need to initially display events on a date other than today "
"(List View only)."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:193
msgid "Minimum Feed Start Date"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:198
#: google-calendar-events/views/admin/gce-feed-meta-display.php:212
msgid "Months"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:199
#: google-calendar-events/views/admin/gce-feed-meta-display.php:213
msgid "Years"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:201
msgid "back"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:202
msgid ""
"Set how far back to retrieve events regardless of month or page being "
"displayed."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:207
msgid "Maximum Feed End Date"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:215
msgid "forward"
msgstr ""
#: google-calendar-events/views/admin/gce-feed-meta-display.php:216
msgid ""
"Set how far in the future to retrieve events regardless of month or page "
"being displayed."
msgstr ""
#: google-calendar-events/views/admin/gce-feed-sidebar-help.php:6
@@ -577,19 +715,19 @@ msgid "Add your first feed!"
msgstr ""
#: google-calendar-events/views/widgets.php:211
msgid "Feeds to display, as a comma separated list (e.g. 101,102,103):"
msgid "Feeds to Display (comma separated list - i.e. 101,102,103):"
msgstr ""
#: google-calendar-events/views/widgets.php:216
msgid "Display events as:"
msgid "Display Events as:"
msgstr ""
#: google-calendar-events/views/widgets.php:225
msgid "Show paging links:"
msgid "Show Paging Links:"
msgstr ""
#: google-calendar-events/views/widgets.php:231
msgid "Sort order (List View only):"
msgid "Sort Order (List View only):"
msgstr ""
#: google-calendar-events/views/widgets.php:233
@@ -601,15 +739,15 @@ msgid "Descending"
msgstr ""
#: google-calendar-events/views/widgets.php:239
msgid "Number of events per page (List View only):"
msgid "Number of Events per Page (List View only):"
msgstr ""
#: google-calendar-events/views/widgets.php:248
msgid "Start date offset (List View only):"
msgid "Display Start Date Offset (List View only):"
msgstr ""
#: google-calendar-events/views/widgets.php:258
msgid ""
"Display title on tooltip/list item (e.g. 'Events on 7th March'). Grouped "
"Display Title on Tooltip/List Item (e.g. 'Events on 7th March'). Grouped "
"lists always have a title displayed."
msgstr ""
@@ -1,75 +1,75 @@
<?php
/**
* Fired when the plugin is uninstalled.
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @copyright 2014 Phil Derksen
*/
// If uninstall not called from WordPress, then exit
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
exit;
}
$general = get_option( 'gce_settings_general' );
// If this is empty then it means it is unchecked and we should delete everything
if ( empty( $general['save_settings'] ) ) {
/*** VERSION 2.0.0 GCE OPTIONS ***/
// Remove CPTs and transients
$feeds = get_posts( array(
'post_type' => 'gce_feed',
'post_status' => array(
'any',
'trash',
'auto-draft'
)
));
foreach( $feeds as $f ) {
// delete the transient while we have the post ID available
delete_transient( 'gce_feed_' . $f->ID );
// Now delete the post
wp_delete_post( $f->ID, true );
}
// Remove all post meta
delete_post_meta_by_key( 'gce_feed_url' );
delete_post_meta_by_key( 'gce_retrieve_from' );
delete_post_meta_by_key( 'gce_retrieve_until' );
delete_post_meta_by_key( 'gce_retrieve_max' );
delete_post_meta_by_key( 'gce_date_format' );
delete_post_meta_by_key( 'gce_time_format' );
delete_post_meta_by_key( 'gce_cache' );
delete_post_meta_by_key( 'gce_multi_day_events' );
delete_post_meta_by_key( 'gce_display_mode' );
delete_post_meta_by_key( 'gce_custom_from' );
delete_post_meta_by_key( 'gce_custom_until' );
delete_post_meta_by_key( 'gce_paging' );
delete_post_meta_by_key( 'gce_list_max_num' );
delete_post_meta_by_key( 'gce_list_max_length' );
delete_post_meta_by_key( 'gce_list_start_offset_num' );
delete_post_meta_by_key( 'gce_list_start_offset_direction' );
// Remove options
delete_option( 'gce_upgrade_has_run' );
delete_option( 'gce_version' );
delete_option( 'gce_settings_general' );
delete_option( 'gce_cpt_setup' );
// Remove widgets
delete_option( 'widget_gce_widget' );
/*** OLD GCE VERSION OPTIONS ***/
delete_option( 'gce_options' );
delete_option( 'gce_general' );
delete_option( 'gce_clear_old_transients' );
delete_option( 'gce_show_upgrade_notice' );
}
<?php
/**
* Fired when the plugin is uninstalled.
*
* @package GCE
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
* @license GPL-2.0+
* @copyright 2014 Phil Derksen
*/
// If uninstall not called from WordPress, then exit
if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) ) {
exit;
}
$general = get_option( 'gce_settings_general' );
// If this is empty then it means it is unchecked and we should delete everything
if ( empty( $general['save_settings'] ) ) {
/*** VERSION 2.0.0 GCE OPTIONS ***/
// Remove CPTs and transients
$feeds = get_posts( array(
'post_type' => 'gce_feed',
'post_status' => array(
'any',
'trash',
'auto-draft'
)
));
foreach( $feeds as $f ) {
// delete the transient while we have the post ID available
delete_transient( 'gce_feed_' . $f->ID );
// Now delete the post
wp_delete_post( $f->ID, true );
}
// Remove all post meta
delete_post_meta_by_key( 'gce_feed_url' );
delete_post_meta_by_key( 'gce_retrieve_from' );
delete_post_meta_by_key( 'gce_retrieve_until' );
delete_post_meta_by_key( 'gce_retrieve_max' );
delete_post_meta_by_key( 'gce_date_format' );
delete_post_meta_by_key( 'gce_time_format' );
delete_post_meta_by_key( 'gce_cache' );
delete_post_meta_by_key( 'gce_multi_day_events' );
delete_post_meta_by_key( 'gce_display_mode' );
delete_post_meta_by_key( 'gce_custom_from' );
delete_post_meta_by_key( 'gce_custom_until' );
delete_post_meta_by_key( 'gce_paging' );
delete_post_meta_by_key( 'gce_list_max_num' );
delete_post_meta_by_key( 'gce_list_max_length' );
delete_post_meta_by_key( 'gce_list_start_offset_num' );
delete_post_meta_by_key( 'gce_list_start_offset_direction' );
// Remove options
delete_option( 'gce_upgrade_has_run' );
delete_option( 'gce_version' );
delete_option( 'gce_settings_general' );
delete_option( 'gce_cpt_setup' );
// Remove widgets
delete_option( 'widget_gce_widget' );
/*** OLD GCE VERSION OPTIONS ***/
delete_option( 'gce_options' );
delete_option( 'gce_general' );
delete_option( 'gce_clear_old_transients' );
delete_option( 'gce_show_upgrade_notice' );
}
@@ -0,0 +1,36 @@
<?php
/**
* Show notice for API Settings
*
* @package GCE
* @subpackage admin/views
* @author Phil Derksen <pderksen@gmail.com>, Nick Young <mycorpweb@gmail.com>
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
?>
<style>
/* #gce-install-notice .button-primary, */
#gce-install-notice .button-secondary {
margin-left: 15px;
}
</style>
<div id="gce-install-notice" class="updated">
<p>
<strong><?php echo __( 'GCal Events Important Update (Nov. 19, 2014):', 'gce' ); ?></strong><br/>
<?php echo __( 'GCal Events now uses the Google API version 3, which requires use of a public key.', 'gce' ); ?>
<?php echo __( 'By default a shared key is used across all plugin users, which is limited to 500,000 requests per day and 5 requests per second.', 'gce' ); ?>
<?php echo __( 'To avoid these limits you can use your own Google API key.', 'gce' ); ?>
</p>
<p>
<a href="<?php echo admin_url( 'edit.php?post_type=gce_feed&page=google-calendar-events_general_settings' ); ?>" class="button-primary"><?php _e( 'Update your API settings now', 'gce' ); ?></a>
<a href="<?php echo add_query_arg( 'gce-dismiss-install-nag', 1 ); ?>" class="button-secondary"><?php _e( 'Hide this', 'gce' ); ?></a>
</p>
</div>
@@ -77,10 +77,10 @@
</div>
<div class="gce-meta-control">
<strong>Location</strong>
<strong><?php _e( 'Location', 'gce' ); ?></strong>
<p><input type="checkbox" name="gce_display_location" id="gce_display_location" value="1" <?php checked( $gce_display_location, '1' ); ?> />
<label for="gce_display_location">Show the location of events?</label></p>
<label class="description" for="gce_display_location_text">Text to display before the location.</label>
<label for="gce_display_location"><?php _e( 'Show the location of events?', 'gce' ); ?></label></p>
<label class="description" for="gce_display_location_text"><?php _e( 'Text to display before the location.', 'gce' ); ?></label>
<input type="text" name="gce_display_location_text" id="gce_display_location_text" value="<?php echo $gce_display_location_text; ?>" />
</div>
@@ -80,13 +80,13 @@
</td>
</tr>
<tr>
<th scope="row"><label for="gce_feed_url"><?php _e( 'GCal Feed URL', 'gce' ); ?></label></th>
<th scope="row"><label for="gce_feed_url"><?php _e( 'Google Calendar ID', 'gce' ); ?></label></th>
<td>
<input type="text" class="large-text" name="gce_feed_url" id="gce_feed_url" value="<?php echo $gce_feed_url; ?>" />
<input type="text" class="regular-text" style="width: 30em;" name="gce_feed_url" id="gce_feed_url" value="<?php echo $gce_feed_url; ?>" />
<p class="description">
<?php _e( 'The Google Calendar feed URL.', 'gce' ); ?> <?php _e( 'Example', 'gce' ); ?>:<br/>
<code>https://www.google.com/calendar/feeds/em3luo1919fjcjum4j874j5ejg%40group.calendar.google.com/public/basic</code><br/>
<a href="http://wpdocs.philderksen.com/google-calendar-events/getting-started/find-feed-url/" target="_blank"><?php _e( 'How to find your GCal feed URL', 'gce' ); ?></a>
<?php _e( 'The Google Calendar ID.', 'gce' ); ?> <?php _e( 'Example', 'gce' ); ?>:<br/>
<code>umsb0ekhivs1a2ubtq6vlqvcjk@group.calendar.google.com</code><br/>
<a href="<?php echo gce_ga_campaign_url( 'http://wpdocs.philderksen.com/google-calendar-events/getting-started/find-calendar-id/', 'gce_lite', 'settings_link', 'docs' ); ?>" target="_blank"><?php _e( 'How to find your GCal calendar ID', 'gce' ); ?></a>
</p>
</td>
</tr>
@@ -113,7 +113,7 @@
<input type="text" class="" name="gce_date_format" id="gce_date_format" value="<?php echo $gce_date_format; ?>" />
<p class="description">
<?php printf( __( 'Use %sPHP date formatting%s.', 'gce' ), '<a href="http://php.net/manual/en/function.date.php" target="_blank">', '</a>' ); ?>
<?php echo _x( 'Leave blank to use the default.', 'References the Date Format option', 'gce' ); ?>
<?php _e( 'Leave blank to use the default.', 'gce' ); ?>
</p>
</td>
</tr>
@@ -124,7 +124,7 @@
<input type="text" class="" name="gce_time_format" id="gce_time_format" value="<?php echo $gce_time_format; ?>" />
<p class="description">
<?php printf( __( 'Use %sPHP date formatting%s.', 'gce' ), '<a href="http://php.net/manual/en/function.date.php" target="_blank">', '</a>' ); ?>
<?php echo _x( 'Leave blank to use the default.', 'References the Time Format option', 'gce' ); ?>
<?php _e( 'Leave blank to use the default.', 'gce' ); ?>
</p>
</td>
</tr>
@@ -8,7 +8,7 @@
<li>
<div class="dashicons dashicons-arrow-right-alt2"></div>
<a href="http://wordpress.org/support/plugin/google-calendar-events" target="_blank">
<a href="https://wordpress.org/support/plugin/google-calendar-events" target="_blank">
<?php _e( 'Community support forums', 'gce' ); ?></a>
</li>
@@ -20,7 +20,7 @@
<li>
<div class="dashicons dashicons-arrow-right-alt2"></div>
<a href="http://wordpress.org/support/view/plugin-reviews/google-calendar-events" target="_blank">
<a href="https://wordpress.org/support/view/plugin-reviews/google-calendar-events" target="_blank">
<?php _e( 'Rate this plugin', 'gce' ); ?></a>
</li>
</ul>
@@ -1334,7 +1334,7 @@ class Ure_Lib extends Garvs_WP_Lib {
// end of switch
if (!empty($url)) {
$link = '<a href="' . $url . '" title="read about ' . $capability . ' user capability" target="new"><img src="' .
URE_PLUGIN_URL . '/images/help.png" alt="' . esc_html__('Help', 'ure') . '" /></a>';
URE_PLUGIN_URL . 'images/help.png" alt="' . esc_html__('Help', 'ure') . '" /></a>';
} else {
$link = '';
}
@@ -36,9 +36,12 @@ class URE_Screen_Help {
protected function get_additional_modules_tab() {
$text = '<h2>User Role Editor Options page help</h2>
<p>
<ul>
<li><strong>' . esc_html__('Count users without role', 'ure').'</strong> - ' .
esc_html__('select roles below','ure') . '</li>';
<ul>';
if (!is_multisite()) {
$text .= '<li><strong>' . esc_html__('Count users without role', 'ure').'</strong> - ' .
esc_html__('Show at the "Users" page a quant of users without role. Module allows to assign all of them '.
'an empty role "No rights", in order to look on the users list with role "No rights" at the separate tab then.','ure') . '</li>';
}
$text = apply_filters('ure_get_settings_additional_modules_tab_help', $text);
$text .='
</ul>
@@ -547,7 +547,7 @@ class User_Role_Editor {
'title' => esc_html__('General'),
'content' => $screen_help->get_settings_help('general')
));
if ($this->lib->pro || !$this->lib->multisite) {
if ($this->lib->is_pro() || !$this->lib->multisite) {
$screen->add_help_tab( array(
'id' => 'additional_modules',
'title' => esc_html__('Additional Modules'),
@@ -559,11 +559,13 @@ class User_Role_Editor {
'title' => esc_html__('Default Roles'),
'content' => $screen_help->get_settings_help('default_roles')
));
$screen->add_help_tab( array(
'id' => 'multisite',
'title' => esc_html__('Multisite'),
'content' => $screen_help->get_settings_help('multisite')
));
if ($this->lib->multisite) {
$screen->add_help_tab( array(
'id' => 'multisite',
'title' => esc_html__('Multisite'),
'content' => $screen_help->get_settings_help('multisite')
));
}
}
// end of settings_screen_configure()
Binary file not shown.
File diff suppressed because it is too large. Load diff
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: User Role Editor 2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-01 12:45+0700\n"
"POT-Creation-Date: 2014-10-21 10:21+0700\n"
"PO-Revision-Date: \n"
"Last-Translator: Vladimir Garagulya <vladimir@shinephp.com>\n"
"Last-Translator: Vladimir Garagulya <support@role-editor.com>\n"
"Language-Team: ShinePHP.com <vladimir@shinephp.com>\n"
"Language: es_ES\n"
"MIME-Version: 1.0\n"
@@ -38,7 +38,7 @@ msgid "Default Roles"
msgstr "Rol Predeterminado"
#: ../includes/settings-template.php:34
#: ../includes/class-user-role-editor.php:564
#: ../includes/class-user-role-editor.php:565
msgid "Multisite"
msgstr ""
@@ -68,7 +68,7 @@ msgid "Save"
msgstr "Guardar"
#: ../includes/settings-template.php:102
#: ../includes/class-ure-screen-help.php:40
#: ../includes/class-ure-screen-help.php:41
msgid "Count users without role"
msgstr ""
@@ -118,73 +118,73 @@ msgid "Settings"
msgstr "Configuración"
#: ../includes/class-user-role-editor.php:525
#: ../includes/class-ure-lib.php:2292
#: ../includes/class-ure-lib.php:2295
msgid "Changelog"
msgstr "Registro de cambios"
#: ../includes/class-user-role-editor.php:573
#: ../includes/class-user-role-editor.php:601
#: ../includes/class-user-role-editor.php:946
#: ../includes/class-ure-lib.php:248
#: ../includes/class-user-role-editor.php:575
#: ../includes/class-user-role-editor.php:603
#: ../includes/class-user-role-editor.php:948
#: ../includes/class-ure-lib.php:251
msgid "User Role Editor"
msgstr "Editor de Roles"
#: ../includes/class-user-role-editor.php:658
#: ../includes/class-user-role-editor.php:676
#: ../includes/class-user-role-editor.php:720
#: ../includes/class-user-role-editor.php:660
#: ../includes/class-user-role-editor.php:678
#: ../includes/class-user-role-editor.php:722
msgid "User Role Editor options are updated"
msgstr "Opciones actualizadas"
#: ../includes/class-user-role-editor.php:704
#: ../includes/class-user-role-editor.php:706
#, fuzzy
msgid "Default Roles are updated"
msgstr "Rol Predeterminado"
#: ../includes/class-user-role-editor.php:728
#: ../includes/class-user-role-editor.php:730
msgid ""
"You do not have sufficient permissions to manage options for User Role "
"Editor."
msgstr "Permisos insuficientes para trabajar"
#: ../includes/class-user-role-editor.php:807
#: ../includes/class-user-role-editor.php:809
msgid "Insufficient permissions to work with User Role Editor"
msgstr "Permisos insuficientes para trabajar con el Editor de Roles"
#: ../includes/class-user-role-editor.php:888
#: ../includes/class-user-role-editor.php:890
msgid "Select All"
msgstr "Seleccionar todo"
#: ../includes/class-user-role-editor.php:889
#: ../includes/class-user-role-editor.php:891
msgid "Unselect All"
msgstr "Deseleccionar todo"
#: ../includes/class-user-role-editor.php:890
#: ../includes/class-user-role-editor.php:892
msgid "Reverse"
msgstr "Revertir"
#: ../includes/class-user-role-editor.php:891
#: ../includes/class-user-role-editor.php:893
msgid "Update"
msgstr "Actualizar"
#: ../includes/class-user-role-editor.php:892
#: ../includes/class-user-role-editor.php:894
msgid "Please confirm permissions update"
msgstr "Por favor confirma las actualizaciones de permisos"
#: ../includes/class-user-role-editor.php:893
#: ../includes/class-user-role-editor.php:895
msgid "Add New Role"
msgstr "Agregar nuevo Rol"
#: ../includes/class-user-role-editor.php:894
#: ../includes/class-user-role-editor.php:899
#: ../includes/class-user-role-editor.php:896
#: ../includes/class-user-role-editor.php:901
#, fuzzy
msgid "Rename Role"
msgstr "Eliminar Rol"
#: ../includes/class-user-role-editor.php:895
#: ../includes/class-user-role-editor.php:897
msgid " Role name (ID) can not be empty!"
msgstr "¡El nombre del Rol (ID) no puede estar vacío!"
#: ../includes/class-user-role-editor.php:896
#: ../includes/class-user-role-editor.php:898
msgid ""
" Role name (ID) must contain latin characters, digits, hyphens or underscore "
"only!"
@@ -192,66 +192,66 @@ msgstr ""
"¡El nombre del Rol (ID) sólo debe contener caracteres alfanuméricos, guiones "
"altos o bajos!"
#: ../includes/class-user-role-editor.php:897
#: ../includes/class-user-role-editor.php:899
msgid ""
" WordPress does not support numeric Role name (ID). Add latin characters to "
"it."
msgstr ""
#: ../includes/class-user-role-editor.php:898
#: ../includes/class-user-role-editor.php:900
msgid "Add Role"
msgstr "Agregar Rol"
#: ../includes/class-user-role-editor.php:900
#: ../includes/class-user-role-editor.php:902
msgid "Delete Role"
msgstr "Eliminar Rol"
#: ../includes/class-user-role-editor.php:901
#: ../includes/class-user-role-editor.php:903
msgid "Cancel"
msgstr "Cancelar"
#: ../includes/class-user-role-editor.php:902
#: ../includes/class-user-role-editor.php:904
msgid "Add Capability"
msgstr "Agregar Capacidad"
#: ../includes/class-user-role-editor.php:903
#: ../includes/class-user-role-editor.php:912
#: ../includes/class-user-role-editor.php:905
#: ../includes/class-user-role-editor.php:914
msgid "Delete Capability"
msgstr "Eliminar Capacidades"
#: ../includes/class-user-role-editor.php:904
#: ../includes/class-user-role-editor.php:906
msgid "Reset"
msgstr "Reiniciar"
#: ../includes/class-user-role-editor.php:905
#: ../includes/class-user-role-editor.php:907
msgid "DANGER! Resetting will restore default settings from WordPress Core."
msgstr ""
#: ../includes/class-user-role-editor.php:906
#: ../includes/class-user-role-editor.php:908
msgid ""
"If any plugins have changed capabilities in any way upon installation (such "
"as S2Member, WooCommerce, and many more), those capabilities will be DELETED!"
msgstr ""
#: ../includes/class-user-role-editor.php:907
#: ../includes/class-user-role-editor.php:909
msgid ""
"For more information on how to undo changes and restore plugin capabilities "
"go to"
msgstr ""
#: ../includes/class-user-role-editor.php:909
#: ../includes/class-user-role-editor.php:911
msgid "Continue?"
msgstr ""
#: ../includes/class-user-role-editor.php:910
#: ../includes/class-user-role-editor.php:912
msgid "Default Role"
msgstr "Rol Predeterminado"
#: ../includes/class-user-role-editor.php:911
#: ../includes/class-user-role-editor.php:913
msgid "Set New Default Role"
msgstr "Establecer nuevo Rol"
#: ../includes/class-user-role-editor.php:913
#: ../includes/class-user-role-editor.php:915
msgid ""
"Warning! Be careful - removing critical capability could crash some plugin "
"or other custom code"
@@ -259,11 +259,11 @@ msgstr ""
"¡Atención! Ten cuidado - Eliminar Capacidadess esenciales podría inhabilitar "
"algún plugin o código personalizado"
#: ../includes/class-user-role-editor.php:914
#: ../includes/class-user-role-editor.php:916
msgid " Capability name (ID) can not be empty!"
msgstr "¡El nombre de la Capacidad (ID) no puede estar vacío!"
#: ../includes/class-user-role-editor.php:915
#: ../includes/class-user-role-editor.php:917
msgid ""
" Capability name (ID) must contain latin characters, digits, hyphens or "
"underscore only!"
@@ -271,12 +271,12 @@ msgstr ""
"¡El nombre de la Capacidad (ID) sólo debe contener caracteres alfanuméricos, "
"guiones altos o bajos!"
#: ../includes/class-user-role-editor.php:949
#: ../includes/class-user-role-editor.php:978
#: ../includes/class-user-role-editor.php:951
#: ../includes/class-user-role-editor.php:980
msgid "Other Roles"
msgstr "Otros Roles"
#: ../includes/class-user-role-editor.php:960
#: ../includes/class-user-role-editor.php:962
msgid "Edit"
msgstr "Editar"
@@ -310,80 +310,80 @@ msgstr "Filtro rápido:"
msgid "Custom capabilities:"
msgstr "Capacidades personalizadas:"
#: ../includes/class-ure-lib.php:156
#: ../includes/class-ure-lib.php:159
msgid "Error: wrong request"
msgstr "Error: Petición inválida"
#: ../includes/class-ure-lib.php:189 ../includes/class-ure-lib.php:200
#: ../includes/class-ure-lib.php:192 ../includes/class-ure-lib.php:203
msgid "Role name (ID): "
msgstr "Nombre del Rol (ID):"
#: ../includes/class-ure-lib.php:191 ../includes/class-ure-lib.php:202
#: ../includes/class-ure-lib.php:194 ../includes/class-ure-lib.php:205
msgid "Display Role Name: "
msgstr "Mostrar nombre del Rol:"
#: ../includes/class-ure-lib.php:193
#: ../includes/class-ure-lib.php:196
msgid "Make copy of: "
msgstr "Hacer copia de:"
#: ../includes/class-ure-lib.php:209
#: ../includes/class-ure-lib.php:212
msgid "Select Role:"
msgstr "Seleccionar Rol:"
#: ../includes/class-ure-lib.php:224
#: ../includes/class-ure-lib.php:227
msgid "Delete:"
msgstr "Eliminar:"
#: ../includes/class-ure-lib.php:231
#: ../includes/class-ure-lib.php:234
msgid "Capability name (ID): "
msgstr "Nombre de la Capacidad (ID):"
#: ../includes/class-ure-lib.php:345
#: ../includes/class-ure-lib.php:348
msgid "Error: "
msgstr "Error:"
#: ../includes/class-ure-lib.php:345
#: ../includes/class-ure-lib.php:348
msgid "Role"
msgstr "Rol"
#: ../includes/class-ure-lib.php:346
#: ../includes/class-ure-lib.php:349
msgid "does not exist"
msgstr "no existe"
#: ../includes/class-ure-lib.php:389
#: ../includes/class-ure-lib.php:392
msgid "Role is updated successfully"
msgstr "El Rol fue exitosamente actualizado"
#: ../includes/class-ure-lib.php:391
#: ../includes/class-ure-lib.php:394
msgid "Roles are updated for all network"
msgstr "Roles actualizados en toda la Red"
#: ../includes/class-ure-lib.php:397
#: ../includes/class-ure-lib.php:400
msgid "Error occured during role(s) update"
msgstr "Ocurrió un error durante la actualización del Rol"
#: ../includes/class-ure-lib.php:404
#: ../includes/class-ure-lib.php:407
msgid "User capabilities are updated successfully"
msgstr "Las Capacidades de Usuario fueron actualizadas exitosamente"
#: ../includes/class-ure-lib.php:409
#: ../includes/class-ure-lib.php:412
msgid "Error occured during user update"
msgstr "Ocurrió un error durante la actualización del Usuario"
#: ../includes/class-ure-lib.php:467
#: ../includes/class-ure-lib.php:470
msgid "User Roles are restored to WordPress default values. "
msgstr ""
"Los Roles de Usuario fueron restaurados a los predeterminados de WordPress"
#: ../includes/class-ure-lib.php:1334
#: ../includes/class-ure-lib.php:1337
msgid "Help"
msgstr "Ayuda"
#: ../includes/class-ure-lib.php:1692
#: ../includes/class-ure-lib.php:1695
msgid "Error is occur. Please check the log file."
msgstr "Un error ha ocurrido. Por favor revisa el archivo de registro."
#: ../includes/class-ure-lib.php:1735 ../includes/class-ure-lib.php:1802
#: ../includes/class-ure-lib.php:1738 ../includes/class-ure-lib.php:1805
msgid ""
"Error: Role ID must contain latin characters, digits, hyphens or underscore "
"only!"
@@ -391,386 +391,386 @@ msgstr ""
"Error: ¡La ID del Rol sólo debe contener caracteres alfanuméricos, guiones "
"altos o bajos!"
#: ../includes/class-ure-lib.php:1739 ../includes/class-ure-lib.php:1806
#: ../includes/class-ure-lib.php:1742 ../includes/class-ure-lib.php:1809
msgid ""
"Error: WordPress does not support numeric Role name (ID). Add latin "
"characters to it."
msgstr ""
#: ../includes/class-ure-lib.php:1754
#: ../includes/class-ure-lib.php:1757
#, php-format
msgid "Role %s exists already"
msgstr "El Rol %s ya existe"
#: ../includes/class-ure-lib.php:1769
#: ../includes/class-ure-lib.php:1772
msgid "Error is encountered during new role create operation"
msgstr "Un error fue encontrado durante la creación del nuevo Rol"
#: ../includes/class-ure-lib.php:1771
#: ../includes/class-ure-lib.php:1774
#, php-format
msgid "Role %s is created successfully"
msgstr "El Rol %s fue creado exitosamente"
#: ../includes/class-ure-lib.php:1795
#: ../includes/class-ure-lib.php:1798
msgid "Error: Role ID is empty!"
msgstr ""
#: ../includes/class-ure-lib.php:1813
#: ../includes/class-ure-lib.php:1816
msgid "Error: Empty role display name is not allowed."
msgstr ""
#: ../includes/class-ure-lib.php:1820
#: ../includes/class-ure-lib.php:1823
#, fuzzy, php-format
msgid "Role %s does not exists"
msgstr "no existe"
#: ../includes/class-ure-lib.php:1828
#: ../includes/class-ure-lib.php:1831
#, fuzzy, php-format
msgid "Role %s is renamed to %s successfully"
msgstr "El Rol %s fue creado exitosamente"
#: ../includes/class-ure-lib.php:1895
#: ../includes/class-ure-lib.php:1898
msgid "Error encountered during role delete operation"
msgstr "Un error fue encontrado durante la eliminación del Rol"
#: ../includes/class-ure-lib.php:1897
#: ../includes/class-ure-lib.php:1900
msgid "Unused roles are deleted successfully"
msgstr ""
#: ../includes/class-ure-lib.php:1899
#: ../includes/class-ure-lib.php:1902
#, php-format
msgid "Role %s is deleted successfully"
msgstr "El Rol %s fue eliminado exitosamente"
#: ../includes/class-ure-lib.php:1924
#: ../includes/class-ure-lib.php:1927
msgid "Error encountered during default role change operation"
msgstr "Un error fue encontrado durante el cambio del Rol predeterminado"
#: ../includes/class-ure-lib.php:1930
#: ../includes/class-ure-lib.php:1933
#, php-format
msgid "Default role for new users is set to %s successfully"
msgstr "El Rol predeterminado para nuevos usuarios ha sido establecido a %s"
#: ../includes/class-ure-lib.php:1949
#: ../includes/class-ure-lib.php:1952
msgid "Editor"
msgstr "Editor"
#: ../includes/class-ure-lib.php:1950
#: ../includes/class-ure-lib.php:1953
msgid "Author"
msgstr "Autor"
#: ../includes/class-ure-lib.php:1951
#: ../includes/class-ure-lib.php:1954
msgid "Contributor"
msgstr "Contribuyente"
#: ../includes/class-ure-lib.php:1952
#: ../includes/class-ure-lib.php:1955
msgid "Subscriber"
msgstr "Suscriptor"
#: ../includes/class-ure-lib.php:1954
#: ../includes/class-ure-lib.php:1957
msgid "Switch themes"
msgstr "Cambiar temas (plantillas)"
#: ../includes/class-ure-lib.php:1955
#: ../includes/class-ure-lib.php:1958
msgid "Edit themes"
msgstr "Editar temas (plantillas)"
#: ../includes/class-ure-lib.php:1956
#: ../includes/class-ure-lib.php:1959
msgid "Activate plugins"
msgstr "Activar plugins"
#: ../includes/class-ure-lib.php:1957
#: ../includes/class-ure-lib.php:1960
msgid "Edit plugins"
msgstr "Editar plugins"
#: ../includes/class-ure-lib.php:1958
#: ../includes/class-ure-lib.php:1961
msgid "Edit users"
msgstr "Editar usuarios"
#: ../includes/class-ure-lib.php:1959
#: ../includes/class-ure-lib.php:1962
msgid "Edit files"
msgstr "Editar archivos"
#: ../includes/class-ure-lib.php:1960
#: ../includes/class-ure-lib.php:1963
msgid "Manage options"
msgstr "Administrar opciones"
#: ../includes/class-ure-lib.php:1961
#: ../includes/class-ure-lib.php:1964
msgid "Moderate comments"
msgstr "Moderar comentarios"
#: ../includes/class-ure-lib.php:1962
#: ../includes/class-ure-lib.php:1965
msgid "Manage categories"
msgstr "Administrar categorías"
#: ../includes/class-ure-lib.php:1963
#: ../includes/class-ure-lib.php:1966
msgid "Manage links"
msgstr "Administrar enlaces"
#: ../includes/class-ure-lib.php:1964
#: ../includes/class-ure-lib.php:1967
msgid "Upload files"
msgstr "Subir archivos"
#: ../includes/class-ure-lib.php:1965
#: ../includes/class-ure-lib.php:1968
msgid "Import"
msgstr "Importar"
#: ../includes/class-ure-lib.php:1966
#: ../includes/class-ure-lib.php:1969
msgid "Unfiltered html"
msgstr "HTML sin filtrar"
#: ../includes/class-ure-lib.php:1967
#: ../includes/class-ure-lib.php:1970
msgid "Edit posts"
msgstr "Editar entradas"
#: ../includes/class-ure-lib.php:1968
#: ../includes/class-ure-lib.php:1971
msgid "Edit others posts"
msgstr "Editar entradas ajenas"
#: ../includes/class-ure-lib.php:1969
#: ../includes/class-ure-lib.php:1972
msgid "Edit published posts"
msgstr "Editar entradas publicadas"
#: ../includes/class-ure-lib.php:1970
#: ../includes/class-ure-lib.php:1973
msgid "Publish posts"
msgstr "Publicar entradas"
#: ../includes/class-ure-lib.php:1971
#: ../includes/class-ure-lib.php:1974
msgid "Edit pages"
msgstr "Editar páginas"
#: ../includes/class-ure-lib.php:1972
#: ../includes/class-ure-lib.php:1975
msgid "Read"
msgstr "Leer"
#: ../includes/class-ure-lib.php:1973
#: ../includes/class-ure-lib.php:1976
msgid "Level 10"
msgstr "Nivel 10"
#: ../includes/class-ure-lib.php:1974
#: ../includes/class-ure-lib.php:1977
msgid "Level 9"
msgstr "Nivel 9"
#: ../includes/class-ure-lib.php:1975
#: ../includes/class-ure-lib.php:1978
msgid "Level 8"
msgstr "Nivel 8"
#: ../includes/class-ure-lib.php:1976
#: ../includes/class-ure-lib.php:1979
msgid "Level 7"
msgstr "Nivel 7"
#: ../includes/class-ure-lib.php:1977
#: ../includes/class-ure-lib.php:1980
msgid "Level 6"
msgstr "Nivel 6"
#: ../includes/class-ure-lib.php:1978
#: ../includes/class-ure-lib.php:1981
msgid "Level 5"
msgstr "Nivel 5"
#: ../includes/class-ure-lib.php:1979
#: ../includes/class-ure-lib.php:1982
msgid "Level 4"
msgstr "Nivel 4"
#: ../includes/class-ure-lib.php:1980
#: ../includes/class-ure-lib.php:1983
msgid "Level 3"
msgstr "Nivel 3"
#: ../includes/class-ure-lib.php:1981
#: ../includes/class-ure-lib.php:1984
msgid "Level 2"
msgstr "Nivel 2"
#: ../includes/class-ure-lib.php:1982
#: ../includes/class-ure-lib.php:1985
msgid "Level 1"
msgstr "Nivel 1"
#: ../includes/class-ure-lib.php:1983
#: ../includes/class-ure-lib.php:1986
msgid "Level 0"
msgstr "Nivel 0"
#: ../includes/class-ure-lib.php:1984
#: ../includes/class-ure-lib.php:1987
msgid "Edit others pages"
msgstr "Editar páginas ajenas"
#: ../includes/class-ure-lib.php:1985
#: ../includes/class-ure-lib.php:1988
msgid "Edit published pages"
msgstr "Editar páginas publicadas"
#: ../includes/class-ure-lib.php:1986
#: ../includes/class-ure-lib.php:1989
msgid "Publish pages"
msgstr "Publicar páginas"
#: ../includes/class-ure-lib.php:1987
#: ../includes/class-ure-lib.php:1990
msgid "Delete pages"
msgstr "Eliminar páginas"
#: ../includes/class-ure-lib.php:1988
#: ../includes/class-ure-lib.php:1991
msgid "Delete others pages"
msgstr "Eliminar páginas ajenas"
#: ../includes/class-ure-lib.php:1989
#: ../includes/class-ure-lib.php:1992
msgid "Delete published pages"
msgstr "Eliminar páginas publicadas"
#: ../includes/class-ure-lib.php:1990
#: ../includes/class-ure-lib.php:1993
msgid "Delete posts"
msgstr "Eliminar entradas"
#: ../includes/class-ure-lib.php:1991
#: ../includes/class-ure-lib.php:1994
msgid "Delete others posts"
msgstr "Eliminar entradas ajenas"
#: ../includes/class-ure-lib.php:1992
#: ../includes/class-ure-lib.php:1995
msgid "Delete published posts"
msgstr "Eliminar entradas publicadas"
#: ../includes/class-ure-lib.php:1993
#: ../includes/class-ure-lib.php:1996
msgid "Delete private posts"
msgstr "Eliminar entradas privadas"
#: ../includes/class-ure-lib.php:1994
#: ../includes/class-ure-lib.php:1997
msgid "Edit private posts"
msgstr "Editar entradas privadas"
#: ../includes/class-ure-lib.php:1995
#: ../includes/class-ure-lib.php:1998
msgid "Read private posts"
msgstr "Leer entradas privadas"
#: ../includes/class-ure-lib.php:1996
#: ../includes/class-ure-lib.php:1999
msgid "Delete private pages"
msgstr "Eliminar páginas privadas"
#: ../includes/class-ure-lib.php:1997
#: ../includes/class-ure-lib.php:2000
msgid "Edit private pages"
msgstr "Editar páginas privadas"
#: ../includes/class-ure-lib.php:1998
#: ../includes/class-ure-lib.php:2001
msgid "Read private pages"
msgstr "Leer páginas privadas"
#: ../includes/class-ure-lib.php:1999
#: ../includes/class-ure-lib.php:2002
msgid "Delete users"
msgstr "Eliminar usuarios"
#: ../includes/class-ure-lib.php:2000
#: ../includes/class-ure-lib.php:2003
msgid "Create users"
msgstr "Crear usuarios"
#: ../includes/class-ure-lib.php:2001
#: ../includes/class-ure-lib.php:2004
msgid "Unfiltered upload"
msgstr "Subir sin filtrado"
#: ../includes/class-ure-lib.php:2002
#: ../includes/class-ure-lib.php:2005
msgid "Edit dashboard"
msgstr "Editar escritorio"
#: ../includes/class-ure-lib.php:2003
#: ../includes/class-ure-lib.php:2006
msgid "Update plugins"
msgstr "Actualizar plugins"
#: ../includes/class-ure-lib.php:2004
#: ../includes/class-ure-lib.php:2007
msgid "Delete plugins"
msgstr "Eliminar plugins"
#: ../includes/class-ure-lib.php:2005
#: ../includes/class-ure-lib.php:2008
msgid "Install plugins"
msgstr "Instalar plugins"
#: ../includes/class-ure-lib.php:2006
#: ../includes/class-ure-lib.php:2009
msgid "Update themes"
msgstr "Actualizar temas (plantillas)"
#: ../includes/class-ure-lib.php:2007
#: ../includes/class-ure-lib.php:2010
msgid "Install themes"
msgstr "Instalar temas (plantillas)"
#: ../includes/class-ure-lib.php:2008
#: ../includes/class-ure-lib.php:2011
msgid "Update core"
msgstr "Actualizar núcleo"
#: ../includes/class-ure-lib.php:2009
#: ../includes/class-ure-lib.php:2012
msgid "List users"
msgstr "Listar usuarios"
#: ../includes/class-ure-lib.php:2010
#: ../includes/class-ure-lib.php:2013
msgid "Remove users"
msgstr "Eliminar usuarios"
#: ../includes/class-ure-lib.php:2011
#: ../includes/class-ure-lib.php:2014
msgid "Add users"
msgstr "Agregar usuarios"
#: ../includes/class-ure-lib.php:2012
#: ../includes/class-ure-lib.php:2015
msgid "Promote users"
msgstr "Promover usuarios"
#: ../includes/class-ure-lib.php:2013
#: ../includes/class-ure-lib.php:2016
msgid "Edit theme options"
msgstr "Editar opciones del tema (plantilla)"
#: ../includes/class-ure-lib.php:2014
#: ../includes/class-ure-lib.php:2017
msgid "Delete themes"
msgstr "Eliminar temas (plantillas)"
#: ../includes/class-ure-lib.php:2015
#: ../includes/class-ure-lib.php:2018
msgid "Export"
msgstr "Exportar"
#: ../includes/class-ure-lib.php:2125
#: ../includes/class-ure-lib.php:2128
msgid "Error: Capability name must contain latin characters and digits only!"
msgstr ""
"Error: El nombre de la Capacidad sólo debe contener caracteres alfanuméricos!"
#: ../includes/class-ure-lib.php:2138
#: ../includes/class-ure-lib.php:2141
#, php-format
msgid "Capability %s is added successfully"
msgstr "La Capacidad %s fue agregada exitosamente"
#: ../includes/class-ure-lib.php:2140
#: ../includes/class-ure-lib.php:2143
#, php-format
msgid "Capability %s exists already"
msgstr "La Capacidad %s ya existe"
#: ../includes/class-ure-lib.php:2165
#: ../includes/class-ure-lib.php:2168
#, php-format
msgid "Error! You do not have permission to delete this capability: %s!"
msgstr ""
"¡Error! No cuentas con suficientes permisos para eliminar esta Capacidad: %s!"
#: ../includes/class-ure-lib.php:2184
#: ../includes/class-ure-lib.php:2187
#, php-format
msgid "Capability %s is removed successfully"
msgstr "La Capacidad %s fue eliminada exitosamente"
#: ../includes/class-ure-lib.php:2288
#: ../includes/class-ure-lib.php:2291
msgid "Version:"
msgstr ""
#: ../includes/class-ure-lib.php:2289
#: ../includes/class-ure-lib.php:2292
msgid "Author's website"
msgstr "Sitio web del Autor"
#: ../includes/class-ure-lib.php:2290
#: ../includes/class-ure-lib.php:2293
msgid "Plugin webpage"
msgstr "Página web del Plugin"
#: ../includes/class-ure-lib.php:2291
#: ../includes/class-ure-lib.php:2294
#, fuzzy
msgid "Plugin download"
msgstr "Página web del Plugin"
#: ../includes/class-ure-lib.php:2293
#: ../includes/class-ure-lib.php:2296
msgid "FAQ"
msgstr "FAQ"
#: ../includes/class-ure-lib.php:2341
#: ../includes/class-ure-lib.php:2344
msgid "None"
msgstr "Ninguno"
#: ../includes/class-ure-lib.php:2368
#: ../includes/class-ure-lib.php:2371
msgid "Delete All Unused Roles"
msgstr ""
#: ../includes/class-ure-lib.php:2392
#: ../includes/class-ure-lib.php:2395
msgid "&mdash; No role for this site &mdash;"
msgstr ""
@@ -816,16 +816,18 @@ msgid ""
"deprecated capabilities."
msgstr ""
#: ../includes/class-ure-screen-help.php:41
#, fuzzy
msgid "select roles below"
msgstr "Deseleccionar todo"
#: ../includes/class-ure-screen-help.php:42
msgid ""
"Show at the \"Users\" page a quant of users without role. Module allows to "
"assign all of them an empty role \"No rights\", in order to look on the "
"users list with role \"No rights\" at the separate tab then."
msgstr ""
#: ../includes/class-ure-screen-help.php:56
#: ../includes/class-ure-screen-help.php:59
msgid "Other default roles for new registered user"
msgstr ""
#: ../includes/class-ure-screen-help.php:57
#: ../includes/class-ure-screen-help.php:60
msgid ""
"select roles below to assign them to the new user automatically as an "
"addition to the primary role. Note for multisite environment: take into "
@@ -833,17 +835,21 @@ msgid ""
"assigned to the new registered users."
msgstr ""
#: ../includes/class-ure-screen-help.php:75
#: ../includes/class-ure-screen-help.php:78
msgid "Allow non super-admininstrators to create, edit and delete users"
msgstr ""
#: ../includes/class-ure-screen-help.php:76
#: ../includes/class-ure-screen-help.php:79
msgid ""
"Super administrator only may create, edit and delete users under WordPress "
"multi-site by default. Turn this option on in order to remove this "
"limitation."
msgstr ""
#, fuzzy
#~ msgid "select roles below"
#~ msgstr "Deseleccionar todo"
#~ msgid "About this Plugin:"
#~ msgstr "Acerca de este Plugin:"
@@ -2,9 +2,9 @@ msgid ""
msgstr ""
"Project-Id-Version: User Role Editor 2.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-01 12:45+0700\n"
"POT-Creation-Date: 2014-10-21 10:21+0700\n"
"PO-Revision-Date: \n"
"Last-Translator: Vladimir Garagulya <vladimir@shinephp.com>\n"
"Last-Translator: Vladimir Garagulya <support@role-editor.com>\n"
"Language-Team: Morteza Gholami <Morteza.Gholami@Yahoo.Com>\n"
"Language: en_RU\n"
"MIME-Version: 1.0\n"
@@ -37,7 +37,7 @@ msgid "Default Roles"
msgstr "نقش‌های پیش‌فرض"
#: ../includes/settings-template.php:34
#: ../includes/class-user-role-editor.php:564
#: ../includes/class-user-role-editor.php:565
msgid "Multisite"
msgstr "چندسایتی"
@@ -66,7 +66,7 @@ msgid "Save"
msgstr "ذخیره"
#: ../includes/settings-template.php:102
#: ../includes/class-ure-screen-help.php:40
#: ../includes/class-ure-screen-help.php:41
msgid "Count users without role"
msgstr "شمارش کاربران بدون نقش"
@@ -117,115 +117,115 @@ msgid "Settings"
msgstr "تنظیمات"
#: ../includes/class-user-role-editor.php:525
#: ../includes/class-ure-lib.php:2292
#: ../includes/class-ure-lib.php:2295
msgid "Changelog"
msgstr "گزارش تغییرات"
#: ../includes/class-user-role-editor.php:573
#: ../includes/class-user-role-editor.php:601
#: ../includes/class-user-role-editor.php:946
#: ../includes/class-ure-lib.php:248
#: ../includes/class-user-role-editor.php:575
#: ../includes/class-user-role-editor.php:603
#: ../includes/class-user-role-editor.php:948
#: ../includes/class-ure-lib.php:251
msgid "User Role Editor"
msgstr "ویرایش‌گر نقش کاربر"
#: ../includes/class-user-role-editor.php:658
#: ../includes/class-user-role-editor.php:676
#: ../includes/class-user-role-editor.php:720
#: ../includes/class-user-role-editor.php:660
#: ../includes/class-user-role-editor.php:678
#: ../includes/class-user-role-editor.php:722
msgid "User Role Editor options are updated"
msgstr "تنظیمات ویرایش‌گر نقش کاربر بروز شد"
#: ../includes/class-user-role-editor.php:704
#: ../includes/class-user-role-editor.php:706
msgid "Default Roles are updated"
msgstr "نقش‌های پیش فرض بروز شدند"
#: ../includes/class-user-role-editor.php:728
#: ../includes/class-user-role-editor.php:730
msgid ""
"You do not have sufficient permissions to manage options for User Role "
"Editor."
msgstr "شما مجوز کافی برای مدیریت تنظیمات ویرایش‌گر نقش کاربر را ندارید."
#: ../includes/class-user-role-editor.php:807
#: ../includes/class-user-role-editor.php:809
msgid "Insufficient permissions to work with User Role Editor"
msgstr "مجوز ناکافی برای کار با ویرایش‌گر نقش کاربر"
#: ../includes/class-user-role-editor.php:888
#: ../includes/class-user-role-editor.php:890
msgid "Select All"
msgstr "انتخاب همه"
#: ../includes/class-user-role-editor.php:889
#: ../includes/class-user-role-editor.php:891
msgid "Unselect All"
msgstr "عدم‌انتخاب همه"
#: ../includes/class-user-role-editor.php:890
#: ../includes/class-user-role-editor.php:892
msgid "Reverse"
msgstr "وارونه"
#: ../includes/class-user-role-editor.php:891
#: ../includes/class-user-role-editor.php:893
msgid "Update"
msgstr "بروزرسانی"
#: ../includes/class-user-role-editor.php:892
#: ../includes/class-user-role-editor.php:894
msgid "Please confirm permissions update"
msgstr "لطفا مجوز بروزرسانی را تایید کنید"
#: ../includes/class-user-role-editor.php:893
#: ../includes/class-user-role-editor.php:895
msgid "Add New Role"
msgstr "افزودن نقش جدید"
#: ../includes/class-user-role-editor.php:894
#: ../includes/class-user-role-editor.php:899
#: ../includes/class-user-role-editor.php:896
#: ../includes/class-user-role-editor.php:901
#, fuzzy
msgid "Rename Role"
msgstr "حذف نقش"
#: ../includes/class-user-role-editor.php:895
#: ../includes/class-user-role-editor.php:897
msgid " Role name (ID) can not be empty!"
msgstr " نام نقش (شناسه) نمی تواند خالی باشد!"
#: ../includes/class-user-role-editor.php:896
#: ../includes/class-user-role-editor.php:898
msgid ""
" Role name (ID) must contain latin characters, digits, hyphens or underscore "
"only!"
msgstr ""
" نام نقش (شناسه) باید فقط شامل حروف لاتین، اعداد، خط فاصله یا زیرخط باشد!"
#: ../includes/class-user-role-editor.php:897
#: ../includes/class-user-role-editor.php:899
msgid ""
" WordPress does not support numeric Role name (ID). Add latin characters to "
"it."
msgstr ""
" وردپرس از نام نقش (شناسه) عددی پشتیبانی نمی‌کند. حروف لاتین به آن اضافه کنید."
#: ../includes/class-user-role-editor.php:898
#: ../includes/class-user-role-editor.php:900
msgid "Add Role"
msgstr "افزودن نقش"
#: ../includes/class-user-role-editor.php:900
#: ../includes/class-user-role-editor.php:902
msgid "Delete Role"
msgstr "حذف نقش"
#: ../includes/class-user-role-editor.php:901
#: ../includes/class-user-role-editor.php:903
msgid "Cancel"
msgstr "لغو"
#: ../includes/class-user-role-editor.php:902
#: ../includes/class-user-role-editor.php:904
msgid "Add Capability"
msgstr "افزودن قابلیت"
#: ../includes/class-user-role-editor.php:903
#: ../includes/class-user-role-editor.php:912
#: ../includes/class-user-role-editor.php:905
#: ../includes/class-user-role-editor.php:914
msgid "Delete Capability"
msgstr "حذف قابلیت"
#: ../includes/class-user-role-editor.php:904
#: ../includes/class-user-role-editor.php:906
msgid "Reset"
msgstr "بازنشانی"
#: ../includes/class-user-role-editor.php:905
#: ../includes/class-user-role-editor.php:907
msgid "DANGER! Resetting will restore default settings from WordPress Core."
msgstr "خطر! بازنشانی، تنظیمات پیش‌فرض را از هسته‌ی وردپرس بازمی‌گرداند."
#: ../includes/class-user-role-editor.php:906
#: ../includes/class-user-role-editor.php:908
msgid ""
"If any plugins have changed capabilities in any way upon installation (such "
"as S2Member, WooCommerce, and many more), those capabilities will be DELETED!"
@@ -233,7 +233,7 @@ msgstr ""
"اگر هریک از افزونه‌ها پس از نصب به هر نحو قابلیت‌ها را تغییر دهند (مانند "
"S2Member ، WooCommerce و بسیاری دیگر) آن قابلیت‌ها حذف خواهند شد!"
#: ../includes/class-user-role-editor.php:907
#: ../includes/class-user-role-editor.php:909
msgid ""
"For more information on how to undo changes and restore plugin capabilities "
"go to"
@@ -241,19 +241,19 @@ msgstr ""
"برای کسب اطلاعات بیشتر درباره چگونگی خنثی‌سازی تغییرات و ترمیم‌کردن قابلیت ها "
"مراجعه کنید به"
#: ../includes/class-user-role-editor.php:909
#: ../includes/class-user-role-editor.php:911
msgid "Continue?"
msgstr "ادامه؟"
#: ../includes/class-user-role-editor.php:910
#: ../includes/class-user-role-editor.php:912
msgid "Default Role"
msgstr "نقش پیش‌فرض"
#: ../includes/class-user-role-editor.php:911
#: ../includes/class-user-role-editor.php:913
msgid "Set New Default Role"
msgstr "نشاندن نقش پیش‌فرض جدید"
#: ../includes/class-user-role-editor.php:913
#: ../includes/class-user-role-editor.php:915
msgid ""
"Warning! Be careful - removing critical capability could crash some plugin "
"or other custom code"
@@ -261,23 +261,23 @@ msgstr ""
"اخطار! مراقب باشید - حذف قابلیت مهم می‌تواند برخی از افزونه‌ها یا دیگر کدهای "
"سفارشی را دچار سانحه کند"
#: ../includes/class-user-role-editor.php:914
#: ../includes/class-user-role-editor.php:916
msgid " Capability name (ID) can not be empty!"
msgstr " نام قابلیت (شناسه) نمی تواند خالی باشد!"
#: ../includes/class-user-role-editor.php:915
#: ../includes/class-user-role-editor.php:917
msgid ""
" Capability name (ID) must contain latin characters, digits, hyphens or "
"underscore only!"
msgstr ""
" نام قابلیت (شناسه) باید فقط شامل حروف لاتین، اعداد، خط فاصله یا زیرخط باشد!"
#: ../includes/class-user-role-editor.php:949
#: ../includes/class-user-role-editor.php:978
#: ../includes/class-user-role-editor.php:951
#: ../includes/class-user-role-editor.php:980
msgid "Other Roles"
msgstr "دیگر نقش‌ها"
#: ../includes/class-user-role-editor.php:960
#: ../includes/class-user-role-editor.php:962
msgid "Edit"
msgstr "ویرایش"
@@ -309,86 +309,86 @@ msgstr "فیلتر سریع:"
msgid "Custom capabilities:"
msgstr "قابلیت‌های سفارشی:"
#: ../includes/class-ure-lib.php:156
#: ../includes/class-ure-lib.php:159
msgid "Error: wrong request"
msgstr "خطا: درخواست اشتباه"
#: ../includes/class-ure-lib.php:189 ../includes/class-ure-lib.php:200
#: ../includes/class-ure-lib.php:192 ../includes/class-ure-lib.php:203
msgid "Role name (ID): "
msgstr "نام نقش (شناسه): "
#: ../includes/class-ure-lib.php:191 ../includes/class-ure-lib.php:202
#: ../includes/class-ure-lib.php:194 ../includes/class-ure-lib.php:205
msgid "Display Role Name: "
msgstr "نمایش نام نقش: "
#: ../includes/class-ure-lib.php:193
#: ../includes/class-ure-lib.php:196
msgid "Make copy of: "
msgstr "ایجاد رونوشت از: "
#: ../includes/class-ure-lib.php:209
#: ../includes/class-ure-lib.php:212
msgid "Select Role:"
msgstr "انتخاب نقش:"
#: ../includes/class-ure-lib.php:224
#: ../includes/class-ure-lib.php:227
msgid "Delete:"
msgstr "حذف:"
#: ../includes/class-ure-lib.php:231
#: ../includes/class-ure-lib.php:234
msgid "Capability name (ID): "
msgstr "نام قابلیت (شناسه): "
#: ../includes/class-ure-lib.php:345
#: ../includes/class-ure-lib.php:348
msgid "Error: "
msgstr "خطا: "
#: ../includes/class-ure-lib.php:345
#: ../includes/class-ure-lib.php:348
msgid "Role"
msgstr "نقش"
#: ../includes/class-ure-lib.php:346
#: ../includes/class-ure-lib.php:349
msgid "does not exist"
msgstr "موجود نمی‌باشد"
#: ../includes/class-ure-lib.php:389
#: ../includes/class-ure-lib.php:392
msgid "Role is updated successfully"
msgstr "نقش با موفقیت بروز شد"
#: ../includes/class-ure-lib.php:391
#: ../includes/class-ure-lib.php:394
msgid "Roles are updated for all network"
msgstr "نقش‌ها برای تمامی شبکه بروز شد"
#: ../includes/class-ure-lib.php:397
#: ../includes/class-ure-lib.php:400
msgid "Error occured during role(s) update"
msgstr "خطایی در هنگام بروزسانی نقش(ها) رخ داد"
#: ../includes/class-ure-lib.php:404
#: ../includes/class-ure-lib.php:407
msgid "User capabilities are updated successfully"
msgstr "قابلیت‌های کاربر با موفقیت بروز شدند"
#: ../includes/class-ure-lib.php:409
#: ../includes/class-ure-lib.php:412
msgid "Error occured during user update"
msgstr "خطایی در هنگام بروزرسانی کاربر رخ داد"
#: ../includes/class-ure-lib.php:467
#: ../includes/class-ure-lib.php:470
msgid "User Roles are restored to WordPress default values. "
msgstr "نقش‌های کاربر به مقدار پیش‌فرض وردپرس ترمیم شد."
#: ../includes/class-ure-lib.php:1334
#: ../includes/class-ure-lib.php:1337
msgid "Help"
msgstr "راهنما"
#: ../includes/class-ure-lib.php:1692
#: ../includes/class-ure-lib.php:1695
msgid "Error is occur. Please check the log file."
msgstr "خطایی رخ داده است. لطفا فایل گزارش را چک کنید."
#: ../includes/class-ure-lib.php:1735 ../includes/class-ure-lib.php:1802
#: ../includes/class-ure-lib.php:1738 ../includes/class-ure-lib.php:1805
msgid ""
"Error: Role ID must contain latin characters, digits, hyphens or underscore "
"only!"
msgstr ""
"خطا: شناسه‌ی نقش باید فقط شامل حروف لاتین، اعداد، خط فاصله یا زیرخط باشد!"
#: ../includes/class-ure-lib.php:1739 ../includes/class-ure-lib.php:1806
#: ../includes/class-ure-lib.php:1742 ../includes/class-ure-lib.php:1809
msgid ""
"Error: WordPress does not support numeric Role name (ID). Add latin "
"characters to it."
@@ -396,377 +396,377 @@ msgstr ""
"خطا: وردپرس از نام نقش (شناسه) عددی پشتیبانی نمی‌کند. حروف لاتین به آن اضافه "
"کنید."
#: ../includes/class-ure-lib.php:1754
#: ../includes/class-ure-lib.php:1757
#, php-format
msgid "Role %s exists already"
msgstr "نقش %s از پیش موجود است"
#: ../includes/class-ure-lib.php:1769
#: ../includes/class-ure-lib.php:1772
msgid "Error is encountered during new role create operation"
msgstr "با خطایی در هنگام عملیات ساخت نقش جدید روبرو شدیم"
#: ../includes/class-ure-lib.php:1771
#: ../includes/class-ure-lib.php:1774
#, php-format
msgid "Role %s is created successfully"
msgstr "نقش %s با موفقیت ایجاد شد"
#: ../includes/class-ure-lib.php:1795
#: ../includes/class-ure-lib.php:1798
msgid "Error: Role ID is empty!"
msgstr ""
#: ../includes/class-ure-lib.php:1813
#: ../includes/class-ure-lib.php:1816
msgid "Error: Empty role display name is not allowed."
msgstr ""
#: ../includes/class-ure-lib.php:1820
#: ../includes/class-ure-lib.php:1823
#, fuzzy, php-format
msgid "Role %s does not exists"
msgstr "موجود نمی‌باشد"
#: ../includes/class-ure-lib.php:1828
#: ../includes/class-ure-lib.php:1831
#, fuzzy, php-format
msgid "Role %s is renamed to %s successfully"
msgstr "نقش %s با موفقیت ایجاد شد"
#: ../includes/class-ure-lib.php:1895
#: ../includes/class-ure-lib.php:1898
msgid "Error encountered during role delete operation"
msgstr "با خطایی در هنگام عملیات حذف نقش روبرو شدیم"
#: ../includes/class-ure-lib.php:1897
#: ../includes/class-ure-lib.php:1900
msgid "Unused roles are deleted successfully"
msgstr "نقش‌های استفاده نشده با موفقیت حذف شدند"
#: ../includes/class-ure-lib.php:1899
#: ../includes/class-ure-lib.php:1902
#, php-format
msgid "Role %s is deleted successfully"
msgstr "نقش %s با موفقیت حذف شد"
#: ../includes/class-ure-lib.php:1924
#: ../includes/class-ure-lib.php:1927
msgid "Error encountered during default role change operation"
msgstr "با خطایی در هنگام عملیات تغییر نقش پیش‌فرض روبرو شدیم"
#: ../includes/class-ure-lib.php:1930
#: ../includes/class-ure-lib.php:1933
#, php-format
msgid "Default role for new users is set to %s successfully"
msgstr "نقش پیش‌فرض برای کاربران جدید با موفقیت روی %s نشانده شد"
#: ../includes/class-ure-lib.php:1949
#: ../includes/class-ure-lib.php:1952
msgid "Editor"
msgstr "ویرایش‌گر"
#: ../includes/class-ure-lib.php:1950
#: ../includes/class-ure-lib.php:1953
msgid "Author"
msgstr "نویسنده"
#: ../includes/class-ure-lib.php:1951
#: ../includes/class-ure-lib.php:1954
msgid "Contributor"
msgstr "مشارکت‌کننده"
#: ../includes/class-ure-lib.php:1952
#: ../includes/class-ure-lib.php:1955
msgid "Subscriber"
msgstr "مشترک"
#: ../includes/class-ure-lib.php:1954
#: ../includes/class-ure-lib.php:1957
msgid "Switch themes"
msgstr "تغییر پوسته‌ها"
#: ../includes/class-ure-lib.php:1955
#: ../includes/class-ure-lib.php:1958
msgid "Edit themes"
msgstr "ویرایش پوسته‌ها"
#: ../includes/class-ure-lib.php:1956
#: ../includes/class-ure-lib.php:1959
msgid "Activate plugins"
msgstr "فعال‌سازی افزونه‌ها"
#: ../includes/class-ure-lib.php:1957
#: ../includes/class-ure-lib.php:1960
msgid "Edit plugins"
msgstr "ویرایش افزونه‌ها"
#: ../includes/class-ure-lib.php:1958
#: ../includes/class-ure-lib.php:1961
msgid "Edit users"
msgstr "ویرایش کاربران"
#: ../includes/class-ure-lib.php:1959
#: ../includes/class-ure-lib.php:1962
msgid "Edit files"
msgstr "ویرایش فایل‌ها"
#: ../includes/class-ure-lib.php:1960
#: ../includes/class-ure-lib.php:1963
msgid "Manage options"
msgstr "مدیریت تنظیمات"
#: ../includes/class-ure-lib.php:1961
#: ../includes/class-ure-lib.php:1964
msgid "Moderate comments"
msgstr "مدیریت دیدگاه‌ها"
#: ../includes/class-ure-lib.php:1962
#: ../includes/class-ure-lib.php:1965
msgid "Manage categories"
msgstr "مدیریت دسته‌ها"
#: ../includes/class-ure-lib.php:1963
#: ../includes/class-ure-lib.php:1966
msgid "Manage links"
msgstr "مدیریت پیوندها"
#: ../includes/class-ure-lib.php:1964
#: ../includes/class-ure-lib.php:1967
msgid "Upload files"
msgstr "بارگذاری فایل‌ها"
#: ../includes/class-ure-lib.php:1965
#: ../includes/class-ure-lib.php:1968
msgid "Import"
msgstr "درون‌ریزی"
#: ../includes/class-ure-lib.php:1966
#: ../includes/class-ure-lib.php:1969
msgid "Unfiltered html"
msgstr "اچ‌تی‌ام‌ال فیلتر‌نشده"
#: ../includes/class-ure-lib.php:1967
#: ../includes/class-ure-lib.php:1970
msgid "Edit posts"
msgstr "ویرایش نوشته‌ها"
#: ../includes/class-ure-lib.php:1968
#: ../includes/class-ure-lib.php:1971
msgid "Edit others posts"
msgstr "ویرایش نوشته‌ی دیگران"
#: ../includes/class-ure-lib.php:1969
#: ../includes/class-ure-lib.php:1972
msgid "Edit published posts"
msgstr "ویرایش نوشته‌های منتشر‌شده"
#: ../includes/class-ure-lib.php:1970
#: ../includes/class-ure-lib.php:1973
msgid "Publish posts"
msgstr "انتشار نوشته‌ها"
#: ../includes/class-ure-lib.php:1971
#: ../includes/class-ure-lib.php:1974
msgid "Edit pages"
msgstr "ویرایش صفحات"
#: ../includes/class-ure-lib.php:1972
#: ../includes/class-ure-lib.php:1975
msgid "Read"
msgstr "خواندن"
#: ../includes/class-ure-lib.php:1973
#: ../includes/class-ure-lib.php:1976
msgid "Level 10"
msgstr "سطح ۱۰"
#: ../includes/class-ure-lib.php:1974
#: ../includes/class-ure-lib.php:1977
msgid "Level 9"
msgstr "سطح ۹"
#: ../includes/class-ure-lib.php:1975
#: ../includes/class-ure-lib.php:1978
msgid "Level 8"
msgstr "سطح ۸"
#: ../includes/class-ure-lib.php:1976
#: ../includes/class-ure-lib.php:1979
msgid "Level 7"
msgstr "سطح ۷"
#: ../includes/class-ure-lib.php:1977
#: ../includes/class-ure-lib.php:1980
msgid "Level 6"
msgstr "سطح ۶"
#: ../includes/class-ure-lib.php:1978
#: ../includes/class-ure-lib.php:1981
msgid "Level 5"
msgstr "سطح ۵"
#: ../includes/class-ure-lib.php:1979
#: ../includes/class-ure-lib.php:1982
msgid "Level 4"
msgstr "سطح ۴"
#: ../includes/class-ure-lib.php:1980
#: ../includes/class-ure-lib.php:1983
msgid "Level 3"
msgstr "سطح ۳"
#: ../includes/class-ure-lib.php:1981
#: ../includes/class-ure-lib.php:1984
msgid "Level 2"
msgstr "سطح ۲"
#: ../includes/class-ure-lib.php:1982
#: ../includes/class-ure-lib.php:1985
msgid "Level 1"
msgstr "سطح ۱"
#: ../includes/class-ure-lib.php:1983
#: ../includes/class-ure-lib.php:1986
msgid "Level 0"
msgstr "سطح ۰"
#: ../includes/class-ure-lib.php:1984
#: ../includes/class-ure-lib.php:1987
msgid "Edit others pages"
msgstr "ویرایش صفحات دیگران"
#: ../includes/class-ure-lib.php:1985
#: ../includes/class-ure-lib.php:1988
msgid "Edit published pages"
msgstr "ویرایش صفحات منتشر‌شده"
#: ../includes/class-ure-lib.php:1986
#: ../includes/class-ure-lib.php:1989
msgid "Publish pages"
msgstr "انتشار صفحات"
#: ../includes/class-ure-lib.php:1987
#: ../includes/class-ure-lib.php:1990
msgid "Delete pages"
msgstr "حذف صفحات"
#: ../includes/class-ure-lib.php:1988
#: ../includes/class-ure-lib.php:1991
msgid "Delete others pages"
msgstr "حذف صفحات دیگران"
#: ../includes/class-ure-lib.php:1989
#: ../includes/class-ure-lib.php:1992
msgid "Delete published pages"
msgstr "حذف صفحات منتشر‌شده"
#: ../includes/class-ure-lib.php:1990
#: ../includes/class-ure-lib.php:1993
msgid "Delete posts"
msgstr "حذف صفحات"
#: ../includes/class-ure-lib.php:1991
#: ../includes/class-ure-lib.php:1994
msgid "Delete others posts"
msgstr "حذف نوشته‌های دیگران"
#: ../includes/class-ure-lib.php:1992
#: ../includes/class-ure-lib.php:1995
msgid "Delete published posts"
msgstr "حذف نوشته‌های منتشر‌شده"
#: ../includes/class-ure-lib.php:1993
#: ../includes/class-ure-lib.php:1996
msgid "Delete private posts"
msgstr "حذف نوشته‌های خصوصی"
#: ../includes/class-ure-lib.php:1994
#: ../includes/class-ure-lib.php:1997
msgid "Edit private posts"
msgstr "ویرایش نوشته‌های خصوصی"
#: ../includes/class-ure-lib.php:1995
#: ../includes/class-ure-lib.php:1998
msgid "Read private posts"
msgstr "خواندن نوشته‌های خصوصی"
#: ../includes/class-ure-lib.php:1996
#: ../includes/class-ure-lib.php:1999
msgid "Delete private pages"
msgstr "حذف صفحات خصوصی"
#: ../includes/class-ure-lib.php:1997
#: ../includes/class-ure-lib.php:2000
msgid "Edit private pages"
msgstr "ویرایش صفحات خصوصی"
#: ../includes/class-ure-lib.php:1998
#: ../includes/class-ure-lib.php:2001
msgid "Read private pages"
msgstr "خواندن صفحات خصوصی"
#: ../includes/class-ure-lib.php:1999
#: ../includes/class-ure-lib.php:2002
msgid "Delete users"
msgstr "حذف کاربران"
#: ../includes/class-ure-lib.php:2000
#: ../includes/class-ure-lib.php:2003
msgid "Create users"
msgstr "ایجاد کاربران"
#: ../includes/class-ure-lib.php:2001
#: ../includes/class-ure-lib.php:2004
msgid "Unfiltered upload"
msgstr "بارگذاری فیلتر‌شده"
#: ../includes/class-ure-lib.php:2002
#: ../includes/class-ure-lib.php:2005
msgid "Edit dashboard"
msgstr "ویرایش پیشخوان"
#: ../includes/class-ure-lib.php:2003
#: ../includes/class-ure-lib.php:2006
msgid "Update plugins"
msgstr "بروزرسانی افزونه‌ها"
#: ../includes/class-ure-lib.php:2004
#: ../includes/class-ure-lib.php:2007
msgid "Delete plugins"
msgstr "حذف افزونه‌ها"
#: ../includes/class-ure-lib.php:2005
#: ../includes/class-ure-lib.php:2008
msgid "Install plugins"
msgstr "نصب افزونه‌ها"
#: ../includes/class-ure-lib.php:2006
#: ../includes/class-ure-lib.php:2009
msgid "Update themes"
msgstr "بروزرسانی پوسته‌ها"
#: ../includes/class-ure-lib.php:2007
#: ../includes/class-ure-lib.php:2010
msgid "Install themes"
msgstr "نصب پوسته‌ها"
#: ../includes/class-ure-lib.php:2008
#: ../includes/class-ure-lib.php:2011
msgid "Update core"
msgstr "بروزرسانی هسته"
#: ../includes/class-ure-lib.php:2009
#: ../includes/class-ure-lib.php:2012
msgid "List users"
msgstr "فهرست کاربران"
#: ../includes/class-ure-lib.php:2010
#: ../includes/class-ure-lib.php:2013
msgid "Remove users"
msgstr "حذف کابران"
#: ../includes/class-ure-lib.php:2011
#: ../includes/class-ure-lib.php:2014
msgid "Add users"
msgstr "افزودن کاربران"
#: ../includes/class-ure-lib.php:2012
#: ../includes/class-ure-lib.php:2015
msgid "Promote users"
msgstr "ارتقاء کاربران"
#: ../includes/class-ure-lib.php:2013
#: ../includes/class-ure-lib.php:2016
msgid "Edit theme options"
msgstr "ویرایش تنظیمات پوسته"
#: ../includes/class-ure-lib.php:2014
#: ../includes/class-ure-lib.php:2017
msgid "Delete themes"
msgstr "حذف پوسته‌ها"
#: ../includes/class-ure-lib.php:2015
#: ../includes/class-ure-lib.php:2018
msgid "Export"
msgstr "برون‌ریزی"
#: ../includes/class-ure-lib.php:2125
#: ../includes/class-ure-lib.php:2128
msgid "Error: Capability name must contain latin characters and digits only!"
msgstr "خطا: نام قابلیت باید فقط شامل حروف لاتین و اعداد باشد!"
#: ../includes/class-ure-lib.php:2138
#: ../includes/class-ure-lib.php:2141
#, php-format
msgid "Capability %s is added successfully"
msgstr "قابلیت %s با موفقیت افزوده شد"
#: ../includes/class-ure-lib.php:2140
#: ../includes/class-ure-lib.php:2143
#, php-format
msgid "Capability %s exists already"
msgstr "قابلیت %s از پیش موجود است"
#: ../includes/class-ure-lib.php:2165
#: ../includes/class-ure-lib.php:2168
#, php-format
msgid "Error! You do not have permission to delete this capability: %s!"
msgstr "خطا! شما اجازه‌ی حذف این قابلیت را ندارید: %s!"
#: ../includes/class-ure-lib.php:2184
#: ../includes/class-ure-lib.php:2187
#, php-format
msgid "Capability %s is removed successfully"
msgstr "قابلیت %s با موفقیت حذف شد"
#: ../includes/class-ure-lib.php:2288
#: ../includes/class-ure-lib.php:2291
msgid "Version:"
msgstr ""
#: ../includes/class-ure-lib.php:2289
#: ../includes/class-ure-lib.php:2292
msgid "Author's website"
msgstr "وبگاه نویسنده"
#: ../includes/class-ure-lib.php:2290
#: ../includes/class-ure-lib.php:2293
msgid "Plugin webpage"
msgstr "صفحه افزونه"
#: ../includes/class-ure-lib.php:2291
#: ../includes/class-ure-lib.php:2294
msgid "Plugin download"
msgstr "بارگیری افزونه"
#: ../includes/class-ure-lib.php:2293
#: ../includes/class-ure-lib.php:2296
msgid "FAQ"
msgstr "سوالات مکرر"
#: ../includes/class-ure-lib.php:2341
#: ../includes/class-ure-lib.php:2344
msgid "None"
msgstr "هیچ‌کدام"
#: ../includes/class-ure-lib.php:2368
#: ../includes/class-ure-lib.php:2371
msgid "Delete All Unused Roles"
msgstr "حذف همه‌ی نقش‌های استفاده‌نشده"
#: ../includes/class-ure-lib.php:2392
#: ../includes/class-ure-lib.php:2395
msgid "&mdash; No role for this site &mdash;"
msgstr "&mdash; هیچ نقشی برای این سایت &mdash;"
@@ -822,17 +822,19 @@ msgstr ""
"کد افزونه‌ها باقی گذاشته شده‌اند. روشن کردن این گزینه، آن قابلیت‌های بد دانسته "
"شده را نمایش می‌دهد."
#: ../includes/class-ure-screen-help.php:41
#, fuzzy
msgid "select roles below"
msgstr "عدم‌انتخاب همه"
#: ../includes/class-ure-screen-help.php:42
msgid ""
"Show at the \"Users\" page a quant of users without role. Module allows to "
"assign all of them an empty role \"No rights\", in order to look on the "
"users list with role \"No rights\" at the separate tab then."
msgstr ""
#: ../includes/class-ure-screen-help.php:56
#: ../includes/class-ure-screen-help.php:59
#, fuzzy
msgid "Other default roles for new registered user"
msgstr "دیگر نقش‌های پیش‌فرض برای کاربران تازه ثبت‌نام شده: "
#: ../includes/class-ure-screen-help.php:57
#: ../includes/class-ure-screen-help.php:60
#, fuzzy
msgid ""
"select roles below to assign them to the new user automatically as an "
@@ -843,12 +845,12 @@ msgstr ""
"قابل توجه محیط چند سایتی: رفتن به حسابی که در سایت نقش‌های پیش فرض دیگری "
"موجود است، به منظور اختصاص دادن به کاربران تازه ثبت‌نام شده."
#: ../includes/class-ure-screen-help.php:75
#: ../includes/class-ure-screen-help.php:78
#, fuzzy
msgid "Allow non super-admininstrators to create, edit and delete users"
msgstr "اجازه به غیر مدیران اصلی برای ایجاد، ویرایش و حذف کاربران"
#: ../includes/class-ure-screen-help.php:76
#: ../includes/class-ure-screen-help.php:79
#, fuzzy
msgid ""
"Super administrator only may create, edit and delete users under WordPress "
@@ -858,6 +860,10 @@ msgstr ""
"در وردپرس چند سایتی تنها مدیران اصلی اجازه‌ی ایجاد، ویرایش و حذف کاربران را "
"دارند. این "
#, fuzzy
#~ msgid "select roles below"
#~ msgstr "عدم‌انتخاب همه"
#~ msgid "Overview"
#~ msgstr "مرور کلی"
@@ -0,0 +1,890 @@
#
# Translators:
# FxB <fxb@wp-translations.org>, 2014
# Sébastien Grillot <sebastien@insidedaweb.fr>, 2014
msgid ""
msgstr ""
"Project-Id-Version: User Role Editor\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2014-10-21 10:23+0700\n"
"PO-Revision-Date: 2014-10-21 10:24+0700\n"
"Last-Translator: Vladimir Garagulya <support@role-editor.com>\n"
"Language-Team: French (France) (http://www.transifex.com/projects/p/user-"
"role-editor/language/fr_FR/)\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"X-Generator: Poedit 1.5.4\n"
"X-Poedit-Basepath: .\n"
"X-Poedit-KeywordsList: __;_e;esc_html__;esc_html_e\n"
"X-Poedit-SourceCharset: UTF-8\n"
"X-Poedit-SearchPath-0: ..\n"
#: ../includes/settings-template.php:17
msgid "User Role Editor - Options"
msgstr "User Role Editor - Options"
#: ../includes/settings-template.php:21
#: ../includes/class-user-role-editor.php:547
msgid "General"
msgstr "Général"
#: ../includes/settings-template.php:26
#: ../includes/class-user-role-editor.php:553
msgid "Additional Modules"
msgstr "Modules complémentaires"
#: ../includes/settings-template.php:30
#: ../includes/class-user-role-editor.php:559
msgid "Default Roles"
msgstr " Rôles par défaut"
#: ../includes/settings-template.php:34
#: ../includes/class-user-role-editor.php:565
msgid "Multisite"
msgstr "Multisite"
#: ../includes/settings-template.php:39
msgid "About"
msgstr "À propos"
#: ../includes/settings-template.php:53
#: ../includes/class-ure-screen-help.php:15
msgid "Show Administrator role at User Role Editor"
msgstr "Montrer le rôle Administrateur dans User Role Editor"
#: ../includes/settings-template.php:61
#: ../includes/class-ure-screen-help.php:18
msgid "Show capabilities in the human readable form"
msgstr "Montrer les capacités dans une forme lisible par l'homme"
#: ../includes/settings-template.php:69 ../includes/ure-role-edit.php:40
#: ../includes/ure-user-edit.php:63 ../includes/class-ure-screen-help.php:21
msgid "Show deprecated capabilities"
msgstr "Voir les capacités obsolètes"
#: ../includes/settings-template.php:81 ../includes/settings-template.php:117
#: ../includes/settings-template.php:149 ../includes/settings-template.php:181
msgid "Save"
msgstr "Sauvegarder"
#: ../includes/settings-template.php:102
#: ../includes/class-ure-screen-help.php:41
msgid "Count users without role"
msgstr "Compter les utilisateurs sans rôle"
#: ../includes/settings-template.php:129
msgid "Primary default role: "
msgstr "Rôle primaire par défaut : "
#: ../includes/settings-template.php:136
msgid "Other default roles for new registered user: "
msgstr "Autres rôles par défaut pour les nouveaux utilisateurs enregistrés : "
#: ../includes/settings-template.php:142
msgid ""
"Note for multisite environment: take into account that other default roles "
"should exist at the site, in order to be assigned to the new registered "
"users."
msgstr ""
"Note pour les environnements multisite : Prenez en considération que "
"d'autres rôles par défauts doivent exister sur le site, afin qu'ils soient "
"assignés aux nouveaux utilisateurs enregistrés."
#: ../includes/settings-template.php:168
msgid "Allow non super administrators to create, edit, and delete users"
msgstr ""
"Autoriser les utilisateurs qui ne sont pas super-administrateurs à créer, "
"modifier ou supprimer des utilisateurs"
#: ../includes/class-user-role-editor.php:195
msgid "Change role for users without role"
msgstr "Changer le rôle pour les utilisateurs sans rôle"
#: ../includes/class-user-role-editor.php:196
msgid "No rights"
msgstr "Aucun droit"
#: ../includes/class-user-role-editor.php:197
msgid "Provide new role"
msgstr "Fournir un nouveau rôle"
#: ../includes/class-user-role-editor.php:281
#: ../includes/class-user-role-editor.php:283
msgid "You do not have permission to edit this user."
msgstr ""
"Vous n&rsquo;avez pas l&rsquo;autorisation de modifier cet utilisateur."
#: ../includes/class-user-role-editor.php:422
msgid "Capabilities"
msgstr "Capacités"
#: ../includes/class-user-role-editor.php:514
msgid "Settings"
msgstr "Paramètres"
#: ../includes/class-user-role-editor.php:525
#: ../includes/class-ure-lib.php:2295
msgid "Changelog"
msgstr "Journal des modifications"
#: ../includes/class-user-role-editor.php:575
#: ../includes/class-user-role-editor.php:603
#: ../includes/class-user-role-editor.php:948
#: ../includes/class-ure-lib.php:251
msgid "User Role Editor"
msgstr "User Role Editor"
#: ../includes/class-user-role-editor.php:660
#: ../includes/class-user-role-editor.php:678
#: ../includes/class-user-role-editor.php:722
msgid "User Role Editor options are updated"
msgstr "Les options de User Role Editor ont été mises à jour"
#: ../includes/class-user-role-editor.php:706
msgid "Default Roles are updated"
msgstr "Les rôles par défauts ont été mis à jour"
#: ../includes/class-user-role-editor.php:730
msgid ""
"You do not have sufficient permissions to manage options for User Role "
"Editor."
msgstr ""
"Vous n'avez pas les permissions suffisantes pour gérer les options de User "
"Role Editor."
#: ../includes/class-user-role-editor.php:809
msgid "Insufficient permissions to work with User Role Editor"
msgstr "Permissions insuffisantes pour travailler avec User Role Editor"
#: ../includes/class-user-role-editor.php:890
msgid "Select All"
msgstr "Tout sélectionner"
#: ../includes/class-user-role-editor.php:891
msgid "Unselect All"
msgstr "Tout déselectionner"
#: ../includes/class-user-role-editor.php:892
msgid "Reverse"
msgstr "Inverser"
#: ../includes/class-user-role-editor.php:893
msgid "Update"
msgstr "Mettre à jour"
#: ../includes/class-user-role-editor.php:894
msgid "Please confirm permissions update"
msgstr "Merci de confirmer la mise à jour des permissions"
#: ../includes/class-user-role-editor.php:895
msgid "Add New Role"
msgstr "Ajouter un nouveau rôle"
#: ../includes/class-user-role-editor.php:896
#: ../includes/class-user-role-editor.php:901
msgid "Rename Role"
msgstr "Renommer le Rôle"
#: ../includes/class-user-role-editor.php:897
msgid " Role name (ID) can not be empty!"
msgstr "Le nom du rôle (ID) ne peut pas être vide !"
#: ../includes/class-user-role-editor.php:898
msgid ""
" Role name (ID) must contain latin characters, digits, hyphens or underscore "
"only!"
msgstr ""
"Le nom du rôle (ID) peut contenir seulement des caractères latin, des "
"chiffres, des traits d'union ou des caractères de soulignement !"
#: ../includes/class-user-role-editor.php:899
msgid ""
" WordPress does not support numeric Role name (ID). Add latin characters to "
"it."
msgstr ""
"WordPress ne supporte pas les noms de rôle (ID) alphanumériques. Ajouter des "
"caractères latin à celui-ci."
#: ../includes/class-user-role-editor.php:900
msgid "Add Role"
msgstr "Ajouter un rôle"
#: ../includes/class-user-role-editor.php:902
msgid "Delete Role"
msgstr "Supprimer un rôle"
#: ../includes/class-user-role-editor.php:903
msgid "Cancel"
msgstr "Annuler"
#: ../includes/class-user-role-editor.php:904
msgid "Add Capability"
msgstr "Ajouter la capacité"
#: ../includes/class-user-role-editor.php:905
#: ../includes/class-user-role-editor.php:914
msgid "Delete Capability"
msgstr "Supprimer la capacité"
#: ../includes/class-user-role-editor.php:906
msgid "Reset"
msgstr "Réinitialiser"
#: ../includes/class-user-role-editor.php:907
msgid "DANGER! Resetting will restore default settings from WordPress Core."
msgstr ""
"DANGER ! La réinitialisation va restaurer les paramètres par défaut du cœur "
"de WordPress."
#: ../includes/class-user-role-editor.php:908
msgid ""
"If any plugins have changed capabilities in any way upon installation (such "
"as S2Member, WooCommerce, and many more), those capabilities will be DELETED!"
msgstr ""
"Si aucune extension n'a modifié les capacités (comme S2Member ou WooCommerce "
"et bien d'autres), ces capacités seront SUPPRIMÉES ! "
#: ../includes/class-user-role-editor.php:909
msgid ""
"For more information on how to undo changes and restore plugin capabilities "
"go to"
msgstr ""
"Pour de plus amples informations sur la façon d'annuler les modifications et "
"rétablir les fonctions de l'extension, aller sur "
#: ../includes/class-user-role-editor.php:911
msgid "Continue?"
msgstr "Continuer ?"
#: ../includes/class-user-role-editor.php:912
msgid "Default Role"
msgstr " Rôle par défaut"
#: ../includes/class-user-role-editor.php:913
msgid "Set New Default Role"
msgstr "Régler le nouveau rôle par défaut"
#: ../includes/class-user-role-editor.php:915
msgid ""
"Warning! Be careful - removing critical capability could crash some plugin "
"or other custom code"
msgstr ""
"Attention ! Enlever des capacités critiques pourrait faire planter certaines "
"extension ou autres codes personnalisés"
#: ../includes/class-user-role-editor.php:916
msgid " Capability name (ID) can not be empty!"
msgstr "Le nom de la capacité (ID) ne peut pas être vide !"
#: ../includes/class-user-role-editor.php:917
msgid ""
" Capability name (ID) must contain latin characters, digits, hyphens or "
"underscore only!"
msgstr ""
"Le nom de la capacité (ID) doit contenir seulement des caractères latins, "
"des chiffres, des traits d'union ou des caractères de soulignement !"
#: ../includes/class-user-role-editor.php:951
#: ../includes/class-user-role-editor.php:980
msgid "Other Roles"
msgstr "Autres rôles"
#: ../includes/class-user-role-editor.php:962
msgid "Edit"
msgstr "Modifier"
#: ../includes/ure-role-edit.php:17
msgid "Select Role and change its capabilities:"
msgstr "Sélectionner un rôle et changer ses capacités : "
#: ../includes/ure-role-edit.php:30 ../includes/ure-user-edit.php:53
msgid "Show capabilities in human readable form"
msgstr "Montrer les capacités dans une forme lisible par l'homme"
#: ../includes/ure-role-edit.php:44
msgid "If checked, then apply action to ALL sites of this Network"
msgstr ""
"Si coché, alors appliquer toutes les actions à tous les sites du réseau"
#: ../includes/ure-role-edit.php:56
msgid "Apply to All Sites"
msgstr "Appliquer à tous les sites"
#: ../includes/ure-role-edit.php:63 ../includes/ure-user-edit.php:109
msgid "Core capabilities:"
msgstr "Capacités du core :"
#: ../includes/ure-role-edit.php:65 ../includes/ure-user-edit.php:111
msgid "Quick filter:"
msgstr "Filtre rapide : "
#: ../includes/ure-role-edit.php:83 ../includes/ure-user-edit.php:130
msgid "Custom capabilities:"
msgstr "Capacités personnalisées :"
#: ../includes/class-ure-lib.php:159
msgid "Error: wrong request"
msgstr "Erreur : mauvaise requête"
#: ../includes/class-ure-lib.php:192 ../includes/class-ure-lib.php:203
msgid "Role name (ID): "
msgstr "Nom du rôle (ID) :"
#: ../includes/class-ure-lib.php:194 ../includes/class-ure-lib.php:205
msgid "Display Role Name: "
msgstr "Afficher le nom du rôle : "
#: ../includes/class-ure-lib.php:196
msgid "Make copy of: "
msgstr "Faire une copie de : "
#: ../includes/class-ure-lib.php:212
msgid "Select Role:"
msgstr "Sélectionner le rôle :"
#: ../includes/class-ure-lib.php:227
msgid "Delete:"
msgstr "Supprimer :"
#: ../includes/class-ure-lib.php:234
msgid "Capability name (ID): "
msgstr "Nom de la capacité (ID) : "
#: ../includes/class-ure-lib.php:348
msgid "Error: "
msgstr "Erreur : "
#: ../includes/class-ure-lib.php:348
msgid "Role"
msgstr "Rôle"
#: ../includes/class-ure-lib.php:349
msgid "does not exist"
msgstr "N'existe pas"
#: ../includes/class-ure-lib.php:392
msgid "Role is updated successfully"
msgstr "Le rôle à été bien été mis à jour"
#: ../includes/class-ure-lib.php:394
msgid "Roles are updated for all network"
msgstr "Les rôles ont été mis à jour sur tous les réseaux"
#: ../includes/class-ure-lib.php:400
msgid "Error occured during role(s) update"
msgstr "Une erreur est survenue pendant la mise à jour du (des) rôle(s)"
#: ../includes/class-ure-lib.php:407
msgid "User capabilities are updated successfully"
msgstr "Les capacités de l'utilisateur ont bien été mises à jour"
#: ../includes/class-ure-lib.php:412
msgid "Error occured during user update"
msgstr "Une erreur est survenue pendant le mise à jour de l'utilisateur"
#: ../includes/class-ure-lib.php:470
msgid "User Roles are restored to WordPress default values. "
msgstr ""
"Les rôles utilisateurs ont été restaurées selon les valeurs par défauts de "
"WordPress."
#: ../includes/class-ure-lib.php:1337
msgid "Help"
msgstr "Aide"
#: ../includes/class-ure-lib.php:1695
msgid "Error is occur. Please check the log file."
msgstr "Une erreur s'est produite. Merci de vérifier les journaux."
#: ../includes/class-ure-lib.php:1738 ../includes/class-ure-lib.php:1805
msgid ""
"Error: Role ID must contain latin characters, digits, hyphens or underscore "
"only!"
msgstr ""
"Erreur : L'ID du rôle doit contenir des caractères latins, des chiffres, des "
"traits d'union ou des caractères de soulignement seulement !"
#: ../includes/class-ure-lib.php:1742 ../includes/class-ure-lib.php:1809
msgid ""
"Error: WordPress does not support numeric Role name (ID). Add latin "
"characters to it."
msgstr ""
"Erreur : WordPress ne supporte pas les noms de rôles (ID) numérique. Ajouter "
"des caractères latins à celui-ci."
#: ../includes/class-ure-lib.php:1757
#, php-format
msgid "Role %s exists already"
msgstr "Le rôle %s existe déjà"
#: ../includes/class-ure-lib.php:1772
msgid "Error is encountered during new role create operation"
msgstr ""
"Une erreur est survenue pendant l'opération de création du nouveau rôle"
#: ../includes/class-ure-lib.php:1774
#, php-format
msgid "Role %s is created successfully"
msgstr "Le rôle %s à bien été créé "
#: ../includes/class-ure-lib.php:1798
msgid "Error: Role ID is empty!"
msgstr "Erreur : L'ID du rôle est vide !"
#: ../includes/class-ure-lib.php:1816
msgid "Error: Empty role display name is not allowed."
msgstr "Erreur : Un nom d'affichage de rôle vide n'est pas autorisé."
#: ../includes/class-ure-lib.php:1823
#, php-format
msgid "Role %s does not exists"
msgstr "Le rôle %s n&rsquo;existe pas."
#: ../includes/class-ure-lib.php:1831
#, php-format
msgid "Role %s is renamed to %s successfully"
msgstr "Le rôle %s à bien été renommé en %s. "
#: ../includes/class-ure-lib.php:1898
msgid "Error encountered during role delete operation"
msgstr "Une erreur est survenue pendant l'opération de suppression du rôle"
#: ../includes/class-ure-lib.php:1900
msgid "Unused roles are deleted successfully"
msgstr "Les rôles inutilisés ont bien été supprimés"
#: ../includes/class-ure-lib.php:1902
#, php-format
msgid "Role %s is deleted successfully"
msgstr "Le rôle %s à bien été supprimé"
#: ../includes/class-ure-lib.php:1927
msgid "Error encountered during default role change operation"
msgstr ""
"Une erreur est survenue pendant l'opération de changement du rôle par défaut"
#: ../includes/class-ure-lib.php:1933
#, php-format
msgid "Default role for new users is set to %s successfully"
msgstr "Le rôle par défaut pour les nouveaux utilisateur à bien été mis à %s"
#: ../includes/class-ure-lib.php:1952
msgid "Editor"
msgstr "Éditeur"
#: ../includes/class-ure-lib.php:1953
msgid "Author"
msgstr "Auteur"
#: ../includes/class-ure-lib.php:1954
msgid "Contributor"
msgstr "Contributeur"
#: ../includes/class-ure-lib.php:1955
msgid "Subscriber"
msgstr "Abonné"
#: ../includes/class-ure-lib.php:1957
msgid "Switch themes"
msgstr "Changer de thèmes"
#: ../includes/class-ure-lib.php:1958
msgid "Edit themes"
msgstr "Modifier les thèmes"
#: ../includes/class-ure-lib.php:1959
msgid "Activate plugins"
msgstr "Activer les extensions"
#: ../includes/class-ure-lib.php:1960
msgid "Edit plugins"
msgstr "Modifier les extensions"
#: ../includes/class-ure-lib.php:1961
msgid "Edit users"
msgstr "Modifier les utilisateurs"
#: ../includes/class-ure-lib.php:1962
msgid "Edit files"
msgstr "Modifier les fichiers"
#: ../includes/class-ure-lib.php:1963
msgid "Manage options"
msgstr "Gérer les options"
#: ../includes/class-ure-lib.php:1964
msgid "Moderate comments"
msgstr "Modérer les commentaires"
#: ../includes/class-ure-lib.php:1965
msgid "Manage categories"
msgstr "Gérer les catégories"
#: ../includes/class-ure-lib.php:1966
msgid "Manage links"
msgstr "Gérer les liens"
#: ../includes/class-ure-lib.php:1967
msgid "Upload files"
msgstr "Mettre en ligne des fichiers"
#: ../includes/class-ure-lib.php:1968
msgid "Import"
msgstr "Importer"
#: ../includes/class-ure-lib.php:1969
msgid "Unfiltered html"
msgstr "HTML non filtré"
#: ../includes/class-ure-lib.php:1970
msgid "Edit posts"
msgstr "Modifier les articles"
#: ../includes/class-ure-lib.php:1971
msgid "Edit others posts"
msgstr "Modifier les autres billets"
#: ../includes/class-ure-lib.php:1972
msgid "Edit published posts"
msgstr "Modifier les billets publiés "
#: ../includes/class-ure-lib.php:1973
msgid "Publish posts"
msgstr "Publier des articles"
#: ../includes/class-ure-lib.php:1974
msgid "Edit pages"
msgstr "Modifier des pages"
#: ../includes/class-ure-lib.php:1975
msgid "Read"
msgstr "Lire"
#: ../includes/class-ure-lib.php:1976
msgid "Level 10"
msgstr "Niveau 10"
#: ../includes/class-ure-lib.php:1977
msgid "Level 9"
msgstr "Niveau 9"
#: ../includes/class-ure-lib.php:1978
msgid "Level 8"
msgstr "Niveau 8"
#: ../includes/class-ure-lib.php:1979
msgid "Level 7"
msgstr "Niveau 7"
#: ../includes/class-ure-lib.php:1980
msgid "Level 6"
msgstr "Niveau 6"
#: ../includes/class-ure-lib.php:1981
msgid "Level 5"
msgstr "Niveau 5"
#: ../includes/class-ure-lib.php:1982
msgid "Level 4"
msgstr "Niveau 4"
#: ../includes/class-ure-lib.php:1983
msgid "Level 3"
msgstr "Niveau 3"
#: ../includes/class-ure-lib.php:1984
msgid "Level 2"
msgstr "Niveau 2"
#: ../includes/class-ure-lib.php:1985
msgid "Level 1"
msgstr "Niveau 1"
#: ../includes/class-ure-lib.php:1986
msgid "Level 0"
msgstr "Niveau 0"
#: ../includes/class-ure-lib.php:1987
msgid "Edit others pages"
msgstr "Modifier les autres pages"
#: ../includes/class-ure-lib.php:1988
msgid "Edit published pages"
msgstr "Modifier les pages publiées "
#: ../includes/class-ure-lib.php:1989
msgid "Publish pages"
msgstr "Publier les pages"
#: ../includes/class-ure-lib.php:1990
msgid "Delete pages"
msgstr "Supprimer les pages"
#: ../includes/class-ure-lib.php:1991
msgid "Delete others pages"
msgstr "Supprimer les autres pages"
#: ../includes/class-ure-lib.php:1992
msgid "Delete published pages"
msgstr "Supprimer les pages publiées"
#: ../includes/class-ure-lib.php:1993
msgid "Delete posts"
msgstr "Supprimer les articles"
#: ../includes/class-ure-lib.php:1994
msgid "Delete others posts"
msgstr "Supprimer les autres billets"
#: ../includes/class-ure-lib.php:1995
msgid "Delete published posts"
msgstr "Supprimer les billets publiés"
#: ../includes/class-ure-lib.php:1996
msgid "Delete private posts"
msgstr "Supprimer les billets privés"
#: ../includes/class-ure-lib.php:1997
msgid "Edit private posts"
msgstr "Modifier les billets privés"
#: ../includes/class-ure-lib.php:1998
msgid "Read private posts"
msgstr "Lire les billets privés"
#: ../includes/class-ure-lib.php:1999
msgid "Delete private pages"
msgstr "Supprimer les pages privées "
#: ../includes/class-ure-lib.php:2000
msgid "Edit private pages"
msgstr "Modifier les pages privées"
#: ../includes/class-ure-lib.php:2001
msgid "Read private pages"
msgstr "Lire les pages privées"
#: ../includes/class-ure-lib.php:2002
msgid "Delete users"
msgstr "Supprimer les utilisateurs"
#: ../includes/class-ure-lib.php:2003
msgid "Create users"
msgstr "Créer des utilisateurs"
#: ../includes/class-ure-lib.php:2004
msgid "Unfiltered upload"
msgstr "Téléchargement non filtré"
#: ../includes/class-ure-lib.php:2005
msgid "Edit dashboard"
msgstr "Modifier le tableau de bord"
#: ../includes/class-ure-lib.php:2006
msgid "Update plugins"
msgstr "Mettre à jour les extensions"
#: ../includes/class-ure-lib.php:2007
msgid "Delete plugins"
msgstr "Supprimer les extensions"
#: ../includes/class-ure-lib.php:2008
msgid "Install plugins"
msgstr "Installer les extensions"
#: ../includes/class-ure-lib.php:2009
msgid "Update themes"
msgstr "Mettre à jour les thèmes"
#: ../includes/class-ure-lib.php:2010
msgid "Install themes"
msgstr "Installer des thèmes"
#: ../includes/class-ure-lib.php:2011
msgid "Update core"
msgstr "Mettre à jour le cœur"
#: ../includes/class-ure-lib.php:2012
msgid "List users"
msgstr "Lister les utilisateurs"
#: ../includes/class-ure-lib.php:2013
msgid "Remove users"
msgstr "Supprimer des utilisateurs"
#: ../includes/class-ure-lib.php:2014
msgid "Add users"
msgstr "Ajouter les utilisateurs"
#: ../includes/class-ure-lib.php:2015
msgid "Promote users"
msgstr "Promouvoir des utilisateurs"
#: ../includes/class-ure-lib.php:2016
msgid "Edit theme options"
msgstr "Modifier les options du thème"
#: ../includes/class-ure-lib.php:2017
msgid "Delete themes"
msgstr "Supprimer des thèmes"
#: ../includes/class-ure-lib.php:2018
msgid "Export"
msgstr "Exporter"
#: ../includes/class-ure-lib.php:2128
msgid "Error: Capability name must contain latin characters and digits only!"
msgstr ""
"Erreur : Le nom de la capacité doit seulement contenir des caractères latins "
"et des chiffres !"
#: ../includes/class-ure-lib.php:2141
#, php-format
msgid "Capability %s is added successfully"
msgstr "La capacité %s à bien été ajoutée "
#: ../includes/class-ure-lib.php:2143
#, php-format
msgid "Capability %s exists already"
msgstr "La capacité %s existe déjà"
#: ../includes/class-ure-lib.php:2168
#, php-format
msgid "Error! You do not have permission to delete this capability: %s!"
msgstr ""
"Erreur ! Vous n'avez pas la permission de supprimer cette capacité. %s !"
#: ../includes/class-ure-lib.php:2187
#, php-format
msgid "Capability %s is removed successfully"
msgstr "La capacité %s à bien été supprimée "
#: ../includes/class-ure-lib.php:2291
msgid "Version:"
msgstr "Version :"
#: ../includes/class-ure-lib.php:2292
msgid "Author's website"
msgstr "Site internet de l'auteur"
#: ../includes/class-ure-lib.php:2293
msgid "Plugin webpage"
msgstr "Page web de l'extension"
#: ../includes/class-ure-lib.php:2294
msgid "Plugin download"
msgstr "Téléchargement de l'extension"
#: ../includes/class-ure-lib.php:2296
msgid "FAQ"
msgstr "FAQ"
#: ../includes/class-ure-lib.php:2344
msgid "None"
msgstr "Aucun"
#: ../includes/class-ure-lib.php:2371
msgid "Delete All Unused Roles"
msgstr "Supprimer tous les rôles inutilisés "
#: ../includes/class-ure-lib.php:2395
msgid "&mdash; No role for this site &mdash;"
msgstr "&mdash; Pas de rôle sur ce site &mdash;"
#: ../includes/ure-user-edit.php:31
msgid "Network Super Admin"
msgstr "Super Administrateur du réseau"
#: ../includes/ure-user-edit.php:34
msgid "Change capabilities for user"
msgstr "Changer les capacité pour l'utilisateur"
#: ../includes/ure-user-edit.php:71
msgid "Primary Role:"
msgstr "Rôle primaire : "
#: ../includes/ure-user-edit.php:81
msgid "bbPress Role:"
msgstr "Rôle bbPress : "
#: ../includes/ure-user-edit.php:91
msgid "Other Roles:"
msgstr "Autres rôles :"
#: ../includes/class-ure-screen-help.php:16
msgid ""
"turn this option on in order to make the \"Administrator\" role available at "
"the User Role Editor roles selection drop-down list. It is hidden by default "
"for security reasons."
msgstr ""
"activer cette option pour rendre le rôle \"Administrateur\" disponible dans "
"la liste de sélection de User Role Editor. Cela est caché par défaut pour "
"des raisons de sécurité."
#: ../includes/class-ure-screen-help.php:19
msgid ""
"automatically converts capability names from the technical form for internal "
"use like \"edit_others_posts\" to more user friendly form, e.g. \"Edit "
"others posts\"."
msgstr ""
"converti automatiquement les noms techniques des capacités comme "
"\"modifier_autres_articles\" en une version plus lisible, p. ex. \"Modifier "
"autres articles\"."
#: ../includes/class-ure-screen-help.php:22
msgid ""
"Capabilities like \"level_0\", \"level_1\" are deprecated and are not used "
"by WordPress. They are left at the user roles for the compatibility purpose "
"with the old themes and plugins code. Turning on this option will show those "
"deprecated capabilities."
msgstr ""
"Les capacités de \"level_0\", \"level_1\" sont dépréciées et ne sont plus "
"utilisées par WordPress. Elles sont réglées au niveau utilisateur pour des "
"raisons de compatibilité avec les anciens thèmes et extensions. Activer "
"cette option affichera ces capacités dépréciées."
#: ../includes/class-ure-screen-help.php:42
msgid ""
"Show at the \"Users\" page a quant of users without role. Module allows to "
"assign all of them an empty role \"No rights\", in order to look on the "
"users list with role \"No rights\" at the separate tab then."
msgstr ""
#: ../includes/class-ure-screen-help.php:59
msgid "Other default roles for new registered user"
msgstr "Autres rôles par défaut pour les nouveaux utilisateurs enregistrés"
#: ../includes/class-ure-screen-help.php:60
msgid ""
"select roles below to assign them to the new user automatically as an "
"addition to the primary role. Note for multisite environment: take into "
"account that other default roles should exist at the site, in order to be "
"assigned to the new registered users."
msgstr ""
"sélectionner les rôles ci-dessous a assigner automatiquement aux nouveaux "
"utilisateurs en plus de leur rôle premier. Remarque pour les environnements "
"multisite : Prenez en considération que d'autres rôles par défauts doivent "
"exister sur le site, afin qu'ils soient assignés aux nouveaux utilisateurs "
"enregistrés."
#: ../includes/class-ure-screen-help.php:78
msgid "Allow non super-admininstrators to create, edit and delete users"
msgstr ""
"Autoriser les utilisateurs qui ne sont pas super-administrateurs à créer, "
"modifier ou supprimer des utilisateurs"
#: ../includes/class-ure-screen-help.php:79
msgid ""
"Super administrator only may create, edit and delete users under WordPress "
"multi-site by default. Turn this option on in order to remove this "
"limitation."
msgstr ""
"Seul le Super Administrateur peut créer, modifier ou supprimer des "
"utilisateurs sur des installations WordPress multisite par défaut. Activer "
"cette option pour supprimer cette limitation."
#~ msgid "select roles below"
#~ msgstr "sélectionner le rôle ci-dessous"
File diff suppressed because it is too large. Load diff
Loaded 100 of 146 files, more files were not shown because too many files have changed in this diff. Show more