+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 5249ea96..b2427661 100644
--- a/README.md
+++ b/README.md
@@ -22,6 +22,11 @@ If you're a developer looking to leverage this for a church, you're welcome to b
[Small Groups Example.](https://www.tenth.org/smallgroups)
[Classes Example.](https://www.tenth.org/abs)
+### Event Calendar
+Automatically sync meetings from TouchPoint to your WordPress site, with details and images imported from their
+involvements.
+[Example.](https://www.tenth.org/events)
+
### Crazy-Simple RSVP interface
Let folks RSVP for an event for each member in their family in just a few clicks.
No login required, just an email address and zip code.
@@ -30,18 +35,23 @@ No login required, just an email address and zip code.
Show your Staff members, Elders, or other collections of people, automatically kept in sync with TouchPoint.
[Example.](https://www.tenth.org/about/staff) (This example and others like is are 100% updated from TouchPoint, including the titles and social links.)
+### Embedded Reports
+Any SQL or Python report generated in TouchPoint can be embedded into your website and automatically updated. For example,
+we have a financial update chart that is automatically updated to reflect giving.
+[Example (the bar graph on this page).](https://www.tenth.org/give)
+
### Outreach Partners
Automatically import partner bios and info from TouchPoint for display on your public website, with
appropriate care for their security.
[Example.](https://www.tenth.org/outreach/partners)
-### Events
-Improve display of events in the TouchPoint Custom Mobile App by providing content from [The Events Calendar Plugin by
-ModernTribe](https://theeventscalendar.com/). This is compatible with both the free and "Pro" versions.
-
### Authentication (Beta)
Authenticate TouchPoint users to WordPress, so you can know your website users.
+### Old App Calendar (Deprecated)
+Improve display of events in the TouchPoint Custom Mobile App by providing content from [The Events Calendar Plugin by
+Modern Tribe](https://theeventscalendar.com/). This is compatible with both the free and "Pro" versions.
+
## Costs & Considerations
**This plugin is FREE!** We developed this plugin for us, but want to share it with any other churches that would
@@ -61,12 +71,16 @@ If you're not sure whether WordPress is the right tool for you, feel free to get
relationships with several firms who could help with the setup and technical maintenance if you're interested. But,
it's probably not the right tool for every church.
+We do collect some basic usage data when you use this plugin, including the admin email address configured in WordPress,
+the site address, and the name of the site. We use this data to understand how the plugin is being used and to improve
+it. You can choose in the plugin settings whether to allow us to list your site publicly as a reference, including some
+basic anonymous statistics such as the number of involvements you have synced or the number of people who have RSVPed to
+meetings through the plugin.
+
## Future Features
- Authenticate
- Track viewership of webpages and web resources non-anonymously. (Know who attended your virtual worship service.)
- Sync WordPress Permissions with TouchPoint involvements or roles.
-- Events
- - Sync TouchPoint Meetings with events on your public web calendar.
- Small Groups
- Suggest demographically-targeted small groups.
- Integrated Directory
diff --git a/assets/branding/icon-curcolor.svg b/assets/branding/icon-curcolor.svg
new file mode 100644
index 00000000..92713b4b
--- /dev/null
+++ b/assets/branding/icon-curcolor.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/assets/js/base-defer.js b/assets/js/base-defer.js
index f33625f2..36b3d814 100644
--- a/assets/js/base-defer.js
+++ b/assets/js/base-defer.js
@@ -69,7 +69,11 @@ function utilInit() {
}
tpvm._utils.clearHash = function() {
- window.location.hash = "";
+ if (!!window.history) {
+ window.history.pushState("", "", `${window.location.pathname}${window.location.search}`)
+ } else {
+ window.location.hash = "";
+ }
}
/**
@@ -354,7 +358,11 @@ class TP_MapMarker
}
get inBounds() {
- return this.gMkr.getMap().getBounds().contains(this.gMkr.getPosition());
+ let map = this.gMkr.getMap();
+ if (!map) { // if map failed to render for some reason, this prevents entries from being hidden.
+ return true;
+ }
+ return map.getBounds().contains(this.gMkr.getPosition());
}
get useIcon() {
@@ -513,7 +521,13 @@ class TP_Mappable {
this.connectedElements[ei].addEventListener('mouseenter', function(e){e.stopPropagation(); mappable.toggleHighlighted(true);});
this.connectedElements[ei].addEventListener('mouseleave', function(e){e.stopPropagation(); mappable.toggleHighlighted(false);});
- let actionBtns = this.connectedElements[ei].querySelectorAll('[data-tp-action]')
+ let ce = this.connectedElements[ei],
+ actionBtns = Array.from(ce.querySelectorAll('[data-tp-action]'));
+ if (ce.hasAttribute('data-tp-action')) {
+ // if there's a sole button, it should be added to the list so it works, too.
+ actionBtns.push(ce);
+ }
+
for (const ai in actionBtns) {
if (!actionBtns.hasOwnProperty(ai)) continue;
const action = actionBtns[ai].getAttribute('data-tp-action');
diff --git a/assets/js/meeting-defer.js b/assets/js/meeting-defer.js
index 69b5ba6a..4e7246f3 100644
--- a/assets/js/meeting-defer.js
+++ b/assets/js/meeting-defer.js
@@ -54,7 +54,6 @@ class TP_Meeting {
e.stopPropagation();
mtg[action + "Action"]();
});
- tpvm._utils.handleHash(action);
}
}
diff --git a/assets/template/actions-style.css b/assets/template/actions-style.css
index 460e2d28..c01e516c 100644
--- a/assets/template/actions-style.css
+++ b/assets/template/actions-style.css
@@ -27,4 +27,9 @@ div.swal2-content table.tp-radio-list {
button[data-tp-action]:not([disabled]) {
cursor: pointer;
+}
+
+.tp-TouchPoint-logo svg {
+ height: 1.2em;
+ margin-bottom: -0.2em;
}
\ No newline at end of file
diff --git a/assets/template/calendar-grid-style.css b/assets/template/calendar-grid-style.css
new file mode 100644
index 00000000..d84a14bc
--- /dev/null
+++ b/assets/template/calendar-grid-style.css
@@ -0,0 +1,95 @@
+
+div.calGrid {
+ display: grid;
+ grid-template-columns: repeat(7, 1fr);
+}
+
+div.calGrid,
+div.calGrid > div.calWeekdayHead,
+div.calGrid > div.calDay {
+ border: 1px solid black;
+}
+
+div.calGrid > div.calDay {
+ min-height: 5em;
+}
+
+div.calGrid div.calDay > h3.calDayHead {
+ display: none;
+}
+
+div.calGrid div.calDay > * {
+ display: block;
+}
+
+div.calGrid div.calDay > a.event.feat {
+ font-weight: bold;
+ font-size: 1.2em;
+ padding-bottom: .5em;
+}
+
+div.calGrid div.calDay > a.event.cancelled {
+ color: #f446;
+ text-decoration: line-through;
+}
+
+div.calGrid div.calDay > a,
+div.calGrid div.calWeekdayHead,
+div.calGrid div.calDay > h3.calDayHead,
+div.calGrid div.calDay > span.calDayNum {
+ padding: .2em 5px;
+}
+
+div.calGrid div.calDay.before,
+div.calGrid div.calDay.after {
+ opacity: .8;
+ background: #0001;
+}
+
+div.calGridNav.bottom {
+ display: none;
+}
+
+@media screen and (max-width: 1000px) {
+ div.calGrid {
+ display: grid;
+ grid-template-columns: unset;
+ }
+
+ div.calGrid,
+ div.calGrid > div.calDay {
+ border: unset;
+ min-height: unset;
+ margin-bottom: 1em;
+ }
+
+ div.calGrid div.calDay > a.event.notFirstDay,
+ div.calGrid div.calDay.noFirstDays {
+ display: none;
+ }
+
+ div.calGrid div.calWeekdayHead,
+ div.calGrid div.calDay.before,
+ div.calGrid div.calDay.empty,
+ div.calGrid div.calDay.after {
+ display: none;
+ }
+
+ div.calGrid div.calDay > span.calDayNum {
+ display: none;
+ }
+
+ div.calGrid div.calDay > h3.calDayHead {
+ display:block;
+ }
+
+ div.calGridNav.bottom {
+ display: flex;
+ }
+}
+
+div.calGridNav {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
\ No newline at end of file
diff --git a/assets/template/partials-template-style.css b/assets/template/partials-template-style.css
index 220c3d9e..b24cd20d 100644
--- a/assets/template/partials-template-style.css
+++ b/assets/template/partials-template-style.css
@@ -84,13 +84,20 @@ article.inv-list-item h2 a {
text-align: right;
}
+.partner-actions button,
+.partner-actions a.button,
+.involvement-actions button,
+.involvement-actions a.button {
+ display: inline-block;
+}
+
.partner-list-item .partner-actions button,
.partner-list-item .partner-actions a.button,
.inv-list-item .involvement-actions button,
.inv-list-item .involvement-actions a.button,
.inv-list-item .child-involvements a {
- position:relative;
- z-index:10;
+ position: relative;
+ z-index: 10;
}
.partner-list-item div.post-meta-single,
@@ -187,7 +194,49 @@ article .TouchPointWP-detail-cell.TouchPointWP-map-container {
padding-bottom: 30%;
}
+main.TouchPointWP-main {
+ max-width: 1200px;
+ margin: auto;
+ padding: 0 1em;
+}
+
article .TouchPointWP-detail-cell .TouchPointWP-detail-cell-section {
text-align:center;
margin-bottom: 2em;
+}
+
+header div.header-image-container {
+ max-width: 1200px;
+ width: 100%;
+ margin-left: auto;
+ margin-right: auto;
+}
+
+header div.header-image-container div.header-image {
+ width: 100%;
+ padding-bottom: 50%;
+ background-size: cover;
+ background-position: center;
+}
+
+header div.header-image-container div.header-image.partner-header-image {
+ background-size: contain;
+ background-repeat: no-repeat;
+}
+
+header img.tpwp-accessibility-header-image {
+ /* visible to screen readers only */
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ border: 0;
+}
+header .tpwp-alert-block {
+ margin: 2em 20%;
+ background: #f003;
+ padding: 1em;
}
\ No newline at end of file
diff --git a/composer.json b/composer.json
index ceca4e2a..cc55b172 100644
--- a/composer.json
+++ b/composer.json
@@ -3,7 +3,7 @@
"description": "A WordPress Plugin for integrating with TouchPoint Church Management Software.",
"license": "AGPL-3.0-or-later",
"type": "wordpress-plugin",
- "version": "0.0.37",
+ "version": "0.0.95",
"keywords": [
"wordpress",
"wp",
@@ -27,12 +27,15 @@
}
},
"require": {
- "php": ">=7.4.0",
+ "php": ">=8.0",
"composer/installers": "~1.0",
"ext-json": "*",
- "ext-zip": "*"
+ "ext-zip": "*",
+ "ext-dom": "*"
},
"require-dev": {
+ "pronamic/wp-documentor": "^1.3",
+ "skayo/phpdoc-md": "^0.2.0"
},
"config": {
"allow-plugins": {
diff --git a/docs b/docs
index 1543ab4b..01f959fa 160000
--- a/docs
+++ b/docs
@@ -1 +1 @@
-Subproject commit 1543ab4b99a528bf289e0759978f0db70054b70b
+Subproject commit 01f959faa7b2ef2c2307d6aef36454a2be2466b1
diff --git a/generateDocs.php b/generateDocs.php
new file mode 100644
index 00000000..2fe553a9
--- /dev/null
+++ b/generateDocs.php
@@ -0,0 +1,74 @@
+ 86400)) {
+ echo "Downloading updated PHPDoc PHAR...";
+ file_put_contents(PHPDOC_PHAR_FILENAME, fopen(PHPDOC_PHAR_URL, 'r'));
+ echo " Complete.\n\n";
+}
+
+
+echo "Removing previous WP docs...";
+array_map('unlink', glob('docs/wp-*.md'));
+echo " Complete.\n\n";
+
+
+echo "Indexing WordPress Hooks...";
+exec("php ./vendor/bin/wp-documentor parse --output=docs/wp-Api.md --prefix=tp_ --format=markdown ./src/TouchPoint-WP/");
+echo " Complete\n\n";
+
+
+echo "Correcting links in WordPress Hooks...";
+$doc = file_get_contents("docs/wp-Api.md");
+$pattern = '/\[(\.[\S-]+)]\(([\S]+)\), \[line (\d+)\]\(([\S-]+)/';
+$replace = "[src/TouchPoint-WP/$2](https://github.com/TenthPres/TouchPoint-WP/blob/master/src/TouchPoint-WP/$2), [line $3](https://github.com/TenthPres/TouchPoint-WP/blob/master/src/TouchPoint-WP/$4\n\n";
+$doc = preg_replace($pattern, $replace, $doc);
+file_put_contents("docs/wp-Api.md", $doc);
+echo " Complete\n\n";
+
+echo "Removing previous documentation files...";
+array_map('unlink', glob('docs/tp-*.md'));
+echo " Complete.\n\n";
+
+
+echo "Running PHPDoc Analysis...";
+exec("php " . PHPDOC_PHAR_FILENAME . " -d src -t docs --template=\"xml\"");
+echo " Complete\n\n";
+
+echo "Creating Markdown files...";
+$argv[1] = "docs/structure.xml";
+$argv[2] = "docs/";
+$argv[3] = "--lt";
+$argv[4] = "%c";
+$argv[5] = "--index";
+$argv[6] = "_Sidebar.md";
+include "vendor/skayo/phpdoc-md/bin/phpdocmd";
+echo " Complete.\n\n";
+
+
+echo "Removing xml files...";
+array_map('unlink', glob('docs/*.xml'));
+echo " Complete.\n\n";
+
+
+echo "Merging sidebar files...";
+$sidebar = file_get_contents("docs/.Sidebar.md");
+$automaticSidebar = file_get_contents("docs/_Sidebar.md");
+$automaticSidebar = str_replace("API Index", "PHP API Index",$automaticSidebar);
+
+$sidebar .= $automaticSidebar;
+
+file_put_contents("docs/_Sidebar.md", $sidebar);
+echo " Complete.\n\n";
+
+
+echo "Generating Footer...";
+$footer = "Documentation generated " . date("F j, Y g:ia.");
+file_put_contents("docs/_Footer.md", $footer);
+echo " Complete.\n\n";
+
+echo "Committing and pushing to Repository...";
+echo exec("cd " . __DIR__ . "/docs && git add *.md && git commit -m \"Auto-Updated Documentation\" && git push");
+echo " Complete.\n\n";
\ No newline at end of file
diff --git a/generateDocs.ps1 b/generateDocs.ps1
deleted file mode 100644
index fec7fa92..00000000
--- a/generateDocs.ps1
+++ /dev/null
@@ -1,10 +0,0 @@
-$pharFile = "phpDocumentor.phar"
-$compareDt = (Get-Date).AddDays(-1)
-
-if (!(test-path $pharFile -newerThan $compareDt))
-{
- Write-Output "Downloading phpDocumentor as it was not found or is more than a day old..."
- Invoke-WebRequest https://www.phpdoc.org/phpDocumentor.phar -OutFile $pharFile
-}
-
-php phpDocumentor.phar
\ No newline at end of file
diff --git a/generateI18n_1forTranslation.ps1 b/generateI18n_1forTranslation.ps1
index ea187ba5..36a96c2f 100644
--- a/generateI18n_1forTranslation.ps1
+++ b/generateI18n_1forTranslation.ps1
@@ -7,5 +7,5 @@ if (!(test-path $pharFile -newerThan $compareDt))
Invoke-WebRequest https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar -OutFile $pharFile
}
-php .\wp-cli.phar i18n make-pot . --exclude="build" i18n/TouchPoint-WP.pot
+php .\wp-cli.phar i18n make-pot . i18n/TouchPoint-WP.pot --exclude="build"
php .\wp-cli.phar i18n update-po i18n/TouchPoint-WP.pot
\ No newline at end of file
diff --git a/generateI18n_2forPublish.ps1 b/generateI18n_2forPublish.ps1
index 8939a2e2..a466eb47 100644
--- a/generateI18n_2forPublish.ps1
+++ b/generateI18n_2forPublish.ps1
@@ -11,4 +11,5 @@ Remove-Item "i18n/*.json"
Remove-Item "i18n/*.mo"
php .\wp-cli.phar i18n make-json i18n --no-purge
-php .\wp-cli.phar i18n make-mo i18n
\ No newline at end of file
+php .\wp-cli.phar i18n make-mo i18n
+php .\wp-cli.phar i18n make-php i18n
\ No newline at end of file
diff --git a/i18n/TouchPoint-WP-es_ES.po b/i18n/TouchPoint-WP-es_ES.po
index 05653e47..9a201c6e 100644
--- a/i18n/TouchPoint-WP-es_ES.po
+++ b/i18n/TouchPoint-WP-es_ES.po
@@ -12,162 +12,169 @@ msgstr ""
"Language: \n"
#. Plugin Name of the plugin
+#: touchpoint-wp.php
msgid "TouchPoint WP"
msgstr "TouchPoint WP"
#. Plugin URI of the plugin
+#: touchpoint-wp.php
msgid "https://github.com/tenthpres/touchpoint-wp"
msgstr "https://github.com/tenthpres/touchpoint-wp"
#. Description of the plugin
+#: touchpoint-wp.php
msgid "A WordPress Plugin for integrating with TouchPoint Church Management Software."
msgstr "Un complemento de WordPress para integrarse con TouchPoint, el software de administración de iglesias."
#. Author of the plugin
+#: touchpoint-wp.php
msgid "James K"
msgstr "James K"
#. Author URI of the plugin
+#: touchpoint-wp.php
msgid "https://github.com/jkrrv"
msgstr "https://github.com/jkrrv"
-#: src/templates/admin/invKoForm.php:17
+#: src/templates/admin/invKoForm.php:18
#: src/templates/admin/locationsKoForm.php:13
-#: src/templates/admin/locationsKoForm.php:50
+#: src/templates/admin/locationsKoForm.php:58
msgid "Delete"
msgstr "Borrar"
-#: src/templates/admin/invKoForm.php:23
+#: src/templates/admin/invKoForm.php:24
msgid "Singular Name"
msgstr "Nombre singular"
-#: src/templates/admin/invKoForm.php:31
+#: src/templates/admin/invKoForm.php:32
msgid "Plural Name"
msgstr "Nombre Plural"
-#: src/templates/admin/invKoForm.php:39
+#: src/templates/admin/invKoForm.php:40
msgid "Slug"
msgstr "Slug"
-#: src/templates/admin/invKoForm.php:47
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:765
+#: src/templates/admin/invKoForm.php:48
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:977
msgid "Divisions to Import"
msgstr "Divisiones a Importar"
-#: src/templates/admin/invKoForm.php:60
+#: src/templates/admin/invKoForm.php:84
msgid "Import Hierarchically (Parent-Child Relationships)"
msgstr "Importar jerárquicamente (relaciones padre-hijo)"
-#: src/templates/admin/invKoForm.php:77
+#: src/templates/admin/invKoForm.php:110
msgid "Use Geographic Location"
msgstr "Usar ubicación geográfica"
-#: src/templates/admin/invKoForm.php:83
+#: src/templates/admin/invKoForm.php:116
msgid "Exclude Involvements if"
msgstr "Excluir participaciones si"
-#: src/templates/admin/invKoForm.php:87
+#: src/templates/admin/invKoForm.php:120
msgid "Involvement is Closed"
msgstr "La participación está cerrada"
-#: src/templates/admin/invKoForm.php:91
+#: src/templates/admin/invKoForm.php:124
msgid "Involvement is a Child Involvement"
msgstr "La participación es una participación infantil"
-#: src/templates/admin/invKoForm.php:113
+#: src/templates/admin/invKoForm.php:146
msgid "Leader Member Types"
msgstr "Tipos de miembros de líder"
-#: src/templates/admin/invKoForm.php:116
-#: src/templates/admin/invKoForm.php:132
-#: src/templates/admin/invKoForm.php:258
+#: src/templates/admin/invKoForm.php:63
+#: src/templates/admin/invKoForm.php:149
+#: src/templates/admin/invKoForm.php:165
+#: src/templates/admin/invKoForm.php:318
#: src/templates/parts/involvement-nearby-list.php:2
-#: src/TouchPoint-WP/Rsvp.php:77
-#: assets/js/base-defer.js:188
-#: assets/js/base-defer.js:1119
+#: src/TouchPoint-WP/Meeting.php:746
+#: src/TouchPoint-WP/Rsvp.php:75
+#: assets/js/base-defer.js:192
+#: assets/js/base-defer.js:1133
msgid "Loading..."
msgstr "Cargando..."
-#: src/templates/admin/invKoForm.php:128
+#: src/templates/admin/invKoForm.php:161
msgid "Host Member Types"
msgstr "Tipos de miembros anfitriones"
-#: src/templates/admin/invKoForm.php:144
+#: src/templates/admin/invKoForm.php:177
msgid "Default Grouping"
msgstr "Agrupación Predeterminada"
-#: src/templates/admin/invKoForm.php:148
+#: src/templates/admin/invKoForm.php:181
msgid "No Grouping"
msgstr "Sin agrupar"
-#: src/templates/admin/invKoForm.php:149
+#: src/templates/admin/invKoForm.php:182
msgid "Upcoming / Current"
msgstr "Próximo / Actual"
-#: src/templates/admin/invKoForm.php:150
+#: src/templates/admin/invKoForm.php:183
msgid "Current / Upcoming"
msgstr "Actual / Próximo"
-#: src/templates/admin/invKoForm.php:156
+#: src/templates/admin/invKoForm.php:191
msgid "Default Filters"
msgstr "Filtros predeterminados"
-#: src/templates/admin/invKoForm.php:165
+#: src/templates/admin/invKoForm.php:223
msgid "Gender"
msgstr "Género"
-#: src/templates/admin/invKoForm.php:179
-#: src/TouchPoint-WP/Involvement.php:1445
-#: src/TouchPoint-WP/TouchPointWP.php:1445
+#: src/templates/admin/invKoForm.php:237
+#: src/TouchPoint-WP/Involvement.php:1853
+#: src/TouchPoint-WP/Taxonomies.php:750
msgid "Weekday"
msgstr "Día laborable"
-#: src/templates/admin/invKoForm.php:183
-#: src/TouchPoint-WP/Involvement.php:1471
-#: src/TouchPoint-WP/TouchPointWP.php:1527
+#: src/templates/admin/invKoForm.php:241
+#: src/TouchPoint-WP/Involvement.php:1879
+#: src/TouchPoint-WP/Taxonomies.php:808
msgid "Time of Day"
msgstr "Hora del día"
-#: src/templates/admin/invKoForm.php:187
+#: src/templates/admin/invKoForm.php:245
msgid "Prevailing Marital Status"
msgstr "Estado civil prevaleciente"
-#: src/templates/admin/invKoForm.php:191
-#: src/TouchPoint-WP/TouchPointWP.php:1581
+#: src/templates/admin/invKoForm.php:249
+#: src/TouchPoint-WP/Taxonomies.php:837
msgid "Age Group"
msgstr "Grupo de edad"
-#: src/templates/admin/invKoForm.php:196
+#: src/templates/admin/invKoForm.php:254
msgid "Task Owner"
msgstr "Propietario de la tarea"
-#: src/templates/admin/invKoForm.php:203
+#: src/templates/admin/invKoForm.php:261
msgid "Contact Leader Task Keywords"
msgstr "Palabras clave de la tarea del líder de contacto"
-#: src/templates/admin/invKoForm.php:214
+#: src/templates/admin/invKoForm.php:272
msgid "Join Task Keywords"
msgstr "Unirse a las palabras clave de la tarea"
-#: src/templates/admin/invKoForm.php:230
+#: src/templates/admin/invKoForm.php:288
msgid "Add Involvement Post Type"
msgstr "Agregar tipo de publicación de participación"
-#: src/templates/admin/invKoForm.php:237
+#: src/templates/admin/invKoForm.php:295
msgid "Small Group"
msgstr "Grupo Pequeño"
-#: src/templates/admin/invKoForm.php:238
+#: src/templates/admin/invKoForm.php:296
msgid "Small Groups"
msgstr "Grupos Pequeños"
-#: src/templates/admin/invKoForm.php:368
+#: src/templates/admin/invKoForm.php:442
msgid "Select..."
msgstr "Seleccione..."
#. translators: %s will be the plural post type (e.g. Small Groups)
#: src/templates/parts/involvement-list-none.php:16
-#: src/TouchPoint-WP/Involvement.php:1682
+#: src/TouchPoint-WP/Involvement.php:2099
msgid "No %s Found."
msgstr "No se encontraron %s"
@@ -177,759 +184,751 @@ msgid "%s will be imported overnight for the first time."
msgstr "%s se importarán durante la noche por primera vez."
#. translators: %s is "what you call TouchPoint at your church", which is a setting
-#: src/TouchPoint-WP/Auth.php:140
+#: src/TouchPoint-WP/Auth.php:142
msgid "Sign in with your %s account"
msgstr "Inicie sesión con su cuenta de %s"
-#: src/TouchPoint-WP/Auth.php:402
+#: src/TouchPoint-WP/Auth.php:410
msgid "Your login token expired."
msgstr "Su token de inicio de sesión caducó."
-#: src/TouchPoint-WP/Auth.php:417
+#: src/TouchPoint-WP/Auth.php:425
msgid "Your login token is invalid."
msgstr "Su token de inicio de sesión no es válido."
-#: src/TouchPoint-WP/Auth.php:429
+#: src/TouchPoint-WP/Auth.php:437
msgid "Session could not be validated."
msgstr "No se pudo validar la sesión."
-#: src/TouchPoint-WP/EventsCalendar.php:59
+#: src/TouchPoint-WP/EventsCalendar.php:77
msgid "Recurring"
msgstr "Periódico"
-#: src/TouchPoint-WP/EventsCalendar.php:62
+#: src/TouchPoint-WP/EventsCalendar.php:80
+#: src/TouchPoint-WP/EventsCalendar.php:297
msgid "Multi-Day"
msgstr "varios días"
-#: src/TouchPoint-WP/Involvement.php:441
+#: src/TouchPoint-WP/Involvement.php:495
msgid "Currently Full"
msgstr "Actualmente lleno"
-#: src/TouchPoint-WP/Involvement.php:445
+#: src/TouchPoint-WP/Involvement.php:500
msgid "Currently Closed"
msgstr "Actualmente cerrado"
-#: src/TouchPoint-WP/Involvement.php:451
+#: src/TouchPoint-WP/Involvement.php:507
msgid "Registration Not Open Yet"
msgstr "Registro aún no abierto"
-#: src/TouchPoint-WP/Involvement.php:456
+#: src/TouchPoint-WP/Involvement.php:513
msgid "Registration Closed"
msgstr "Registro cerrado"
-#: src/TouchPoint-WP/Involvement.php:1318
-#: src/TouchPoint-WP/Partner.php:749
+#: src/TouchPoint-WP/Involvement.php:1728
+#: src/TouchPoint-WP/Partner.php:814
msgid "Any"
msgstr "Cualquier"
#. translators: %s is for the user-provided term for the items on the map (e.g. Small Group or Partner)
-#: src/TouchPoint-WP/Involvement.php:1528
-#: src/TouchPoint-WP/Partner.php:771
+#: src/TouchPoint-WP/Involvement.php:1936
+#: src/TouchPoint-WP/Partner.php:838
msgid "The %s listed are only those shown on the map."
msgstr "Los %s enumerados son solo los que se muestran en el mapa."
-#: src/TouchPoint-WP/Involvement.php:2776
+#: src/TouchPoint-WP/Involvement.php:3556
msgid "Men Only"
msgstr "Solo hombres"
-#: src/TouchPoint-WP/Involvement.php:2779
+#: src/TouchPoint-WP/Involvement.php:3559
msgid "Women Only"
msgstr "Solo mujeres"
-#: src/TouchPoint-WP/Involvement.php:2842
+#: src/TouchPoint-WP/Involvement.php:3636
msgid "Contact Leaders"
msgstr "Contacta con las líderes"
-#: src/TouchPoint-WP/Involvement.php:2850
+#: src/TouchPoint-WP/Involvement.php:3706
+#: src/TouchPoint-WP/Involvement.php:3765
msgid "Register"
msgstr "Regístrate ahora"
-#: src/TouchPoint-WP/Involvement.php:2855
+#: src/TouchPoint-WP/Involvement.php:3712
msgid "Create Account"
msgstr "Crear cuenta"
-#: src/TouchPoint-WP/Involvement.php:2859
+#: src/TouchPoint-WP/Involvement.php:3716
msgid "Schedule"
msgstr "Programe"
-#: src/TouchPoint-WP/Involvement.php:2864
+#: src/TouchPoint-WP/Involvement.php:3721
msgid "Give"
msgstr "Dar"
-#: src/TouchPoint-WP/Involvement.php:2867
+#: src/TouchPoint-WP/Involvement.php:3724
msgid "Manage Subscriptions"
msgstr "Administrar suscripciones"
-#: src/TouchPoint-WP/Involvement.php:2870
+#: src/TouchPoint-WP/Involvement.php:3727
msgid "Record Attendance"
msgstr "Registre su asistencia"
-#: src/TouchPoint-WP/Involvement.php:2873
+#: src/TouchPoint-WP/Involvement.php:3730
msgid "Get Tickets"
msgstr "Obtener boletos"
-#: src/TouchPoint-WP/Involvement.php:2880
-#: assets/js/base-defer.js:987
+#: src/TouchPoint-WP/Involvement.php:3756
+#: assets/js/base-defer.js:1001
msgid "Join"
msgstr "Únete"
-#: src/TouchPoint-WP/Involvement.php:2889
-#: src/TouchPoint-WP/Partner.php:1227
+#: src/TouchPoint-WP/Involvement.php:3653
+#: src/TouchPoint-WP/Partner.php:1318
msgid "Show on Map"
msgstr "Muestra en el mapa"
#. translators: %s is for the user-provided "Global Partner" and "Secure Partner" terms.
-#: src/TouchPoint-WP/Partner.php:778
+#: src/TouchPoint-WP/Partner.php:845
msgid "The %1$s listed are only those shown on the map, as well as all %2$s."
msgstr "Los %1$s enumerados son solo los que se muestran en el mapa, así como todos los %2$s."
-#: src/TouchPoint-WP/Partner.php:1184
+#: src/TouchPoint-WP/Partner.php:1259
msgid "Not Shown on Map"
msgstr "No se muestra en el mapa"
-#: src/TouchPoint-WP/Person.php:149
+#: src/TouchPoint-WP/Person.php:150
msgid "No WordPress User ID provided for initializing a person object."
msgstr "No se proporcionó una identificación de usuario de WordPress para inicializar un objeto de persona."
-#: src/TouchPoint-WP/Person.php:641
+#: src/TouchPoint-WP/Person.php:642
msgid "TouchPoint People ID"
msgstr "ID de Personas de TouchPoint"
-#: src/TouchPoint-WP/Person.php:1187
+#: src/TouchPoint-WP/Person.php:1192
msgid "Contact"
msgstr "Contacta"
-#: src/TouchPoint-WP/Rsvp.php:82
+#: src/TouchPoint-WP/Meeting.php:745
+#: src/TouchPoint-WP/Meeting.php:766
+#: src/TouchPoint-WP/Rsvp.php:80
msgid "RSVP"
msgstr "RSVP"
-#: src/TouchPoint-WP/TouchPointWP.php:2431
+#: src/TouchPoint-WP/TouchPointWP.php:2031
msgid "Unknown Type"
msgstr "Tipo desconocido"
-#: src/TouchPoint-WP/TouchPointWP.php:2488
+#: src/TouchPoint-WP/TouchPointWP.php:2088
msgid "Your Searches"
msgstr "Tus búsquedas"
-#: src/TouchPoint-WP/TouchPointWP.php:2491
+#: src/TouchPoint-WP/TouchPointWP.php:2091
msgid "Public Searches"
msgstr "Búsquedas públicas"
-#: src/TouchPoint-WP/TouchPointWP.php:2494
+#: src/TouchPoint-WP/TouchPointWP.php:2094
msgid "Status Flags"
msgstr "Indicadores de Estado"
-#: src/TouchPoint-WP/TouchPointWP.php:2499
-#: src/TouchPoint-WP/TouchPointWP.php:2500
+#: src/TouchPoint-WP/TouchPointWP.php:2099
+#: src/TouchPoint-WP/TouchPointWP.php:2100
msgid "Current Value"
msgstr "Valor actual"
-#: src/TouchPoint-WP/TouchPointWP.php:2628
-#: src/TouchPoint-WP/TouchPointWP.php:2668
+#: src/TouchPoint-WP/TouchPointWP.php:2217
+#: src/TouchPoint-WP/TouchPointWP.php:2253
msgid "Invalid or incomplete API Settings."
msgstr "Configuración de API no válida o incompleta."
-#: src/TouchPoint-WP/TouchPointWP.php:2636
-#: src/TouchPoint-WP/TouchPointWP.php:2675
+#: src/TouchPoint-WP/TouchPointWP.php:2267
+#: src/TouchPoint-WP/TouchPointWP.php:2311
msgid "Host appears to be missing from TouchPoint-WP configuration."
msgstr "Parece que falta el host en la configuración de TouchPoint-WP."
-#: src/TouchPoint-WP/TouchPointWP.php:2795
+#: src/TouchPoint-WP/TouchPointWP.php:2443
msgid "People Query Failed"
msgstr "Consulta de registros de personas fallida"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:205
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:257
msgid "Basic Settings"
msgstr "Ajustes básicos"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:206
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:258
msgid "Connect to TouchPoint and choose which features you wish to use."
msgstr "Conéctese a TouchPoint y elija qué funciones desea usar."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:210
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:262
msgid "Enable Authentication"
msgstr "Habilitar autenticación"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:211
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:263
msgid "Allow TouchPoint users to sign into this website with TouchPoint."
msgstr "Permita que los usuarios de TouchPoint inicien sesión en este sitio web con TouchPoint."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:221
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:274
msgid "Enable RSVP Tool"
msgstr "Habilitar la herramienta RSVP"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:222
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:275
msgid "Add a crazy-simple RSVP button to WordPress event pages."
msgstr "Agregue un botón RSVP muy simple a las páginas de eventos de WordPress."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:228
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:282
msgid "Enable Involvements"
msgstr "Habilitar Participaciones"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:229
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:283
msgid "Load Involvements from TouchPoint for involvement listings and entries native in your website."
msgstr "Cargue participaciones desde TouchPoint para obtener listas de participación y entradas nativas en su sitio web."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:238
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:304
msgid "Enable Public People Lists"
msgstr "Habilitar listas de personas públicas"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:239
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:305
msgid "Import public people listings from TouchPoint (e.g. staff or elders)"
msgstr "Importe listados públicos de personas desde TouchPoint (por ejemplo, personal o ancianos)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:248
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:315
msgid "Enable Global Partner Listings"
msgstr "Habilitar listados de Socios Globales"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:249
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:316
msgid "Import ministry partners from TouchPoint to list publicly."
msgstr "Importe socios ministeriales de TouchPoint para incluirlos en una lista pública."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:268
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:337
msgid "Display Name"
msgstr "Nombre para mostrar"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:269
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:338
msgid "What your church calls your TouchPoint database."
msgstr "Lo que su iglesia llama su base de datos TouchPoint."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:279
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:348
msgid "TouchPoint Host Name"
msgstr "Nombre de host del TouchPoint"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:280
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:349
msgid "The domain for your TouchPoint database, without the https or any slashes."
msgstr "El dominio de su base de datos TouchPoint, sin https ni barras."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:291
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:361
msgid "Custom Mobile App Deeplink Host Name"
msgstr "Nombre de host de enlace profundo de aplicación móvil personalizada"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:303
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:373
msgid "TouchPoint API Username"
msgstr "Nombre de usuario de la API de TouchPoint"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:314
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:385
msgid "TouchPoint API User Password"
msgstr "Contraseña de usuario de la API de TouchPoint"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:315
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:386
msgid "The password of a user account in TouchPoint with API permissions."
msgstr "La contraseña de una cuenta de usuario en TouchPoint con permisos de API."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:326
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:398
msgid "TouchPoint API Script Name"
msgstr "Nombre de la secuencia de comandos de la API de TouchPoint"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:327
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:399
msgid "The name of the Python script loaded into TouchPoint. Don't change this unless you know what you're doing."
msgstr "El nombre de la secuencia de comandos de Python cargada en TouchPoint. No cambies esto a menos que sepas lo que estás haciendo."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:337
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:410
msgid "Google Maps Javascript API Key"
msgstr "Clave de la API de Javascript de Google Maps"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:338
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:411
msgid "Required for embedding maps."
msgstr "Necesario para incrustar mapas."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:348
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:422
msgid "Google Maps Geocoding API Key"
msgstr "Clave API de codificación geográfica de Google Maps"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:349
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:423
msgid "Optional. Allows for reverse geocoding of user locations."
msgstr "Opcional. Permite la geocodificación inversa de las ubicaciones de los usuarios."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:366
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:371
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:463
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:468
msgid "Generate Scripts"
msgstr "Generar secuencias de comandos"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:370
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:467
msgid "Upload the package to {tpName} here"
msgstr "Sube el paquete a {tpName} aquí"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:387
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:484
msgid "People"
msgstr "Gente"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:388
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:485
msgid "Manage how people are synchronized between TouchPoint and WordPress."
msgstr "Administre cómo se sincronizan las personas entre TouchPoint y WordPress."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:392
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:489
msgid "Contact Keywords"
msgstr "Palabras clave de contacto"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:393
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:490
msgid "These keywords will be used when someone clicks the \"Contact\" button on a Person's listing or profile."
msgstr "Estas palabras clave se utilizarán cuando alguien haga clic en el botón \"Contactar\" en la lista o el perfil de una Persona."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:404
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:501
msgid "Extra Value for WordPress User ID"
msgstr "Valor Adicional para la ID de usuario de WordPress"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:405
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:502
msgid "The name of the extra value to use for the WordPress User ID. If you are using multiple WordPress instances with one TouchPoint database, you will need these values to be unique between WordPress instances. In most cases, the default is fine."
msgstr "El nombre del valor adicional que se usará para el ID de usuario de WordPress. Si está utilizando varias instancias de WordPress con una base de datos de TouchPoint, necesitará que estos valores sean únicos entre las instancias de WordPress. En la mayoría de los casos, el valor predeterminado está bien."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:415
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:512
msgid "Extra Value: Biography"
msgstr "Valor Adicional: Biografía"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:416
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:513
msgid "Import a Bio from a Person Extra Value field. Can be an HTML or Text Extra Value. This will overwrite any values set by WordPress. Leave blank to not import."
msgstr "Importe una biografía desde un campo de Valor Adicional de Persona. Puede ser un Valor Adicional HTML o de texto. Esto sobrescribirá cualquier valor establecido por WordPress. Dejar en blanco para no importar."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:426
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:662
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:523
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:761
msgid "Extra Values to Import"
msgstr "Valor Adicional para importar"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:427
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:524
msgid "Import People Extra Value fields as User Meta data."
msgstr "Importe campos de valor extra de personas como metadatos de usuario."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:443
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:540
msgid "Authentication"
msgstr "Autenticación"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:444
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:541
msgid "Allow users to log into WordPress using TouchPoint."
msgstr "Permita que los usuarios inicien sesión en WordPress usando TouchPoint."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:448
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:545
msgid "Make TouchPoint the default authentication method."
msgstr "Haga que TouchPoint sea el método de autenticación predeterminado."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:458
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:555
msgid "Enable Auto-Provisioning"
msgstr "Habilitar el aprovisionamiento automático"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:459
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:556
msgid "Automatically create WordPress users, if needed, to match authenticated TouchPoint users."
msgstr "Cree automáticamente usuarios de WordPress, si es necesario, para que coincidan con los usuarios autenticados de TouchPoint."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:468
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:565
msgid "Change 'Edit Profile' links"
msgstr "Cambiar los enlaces 'Editar perfil'"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:469
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:566
msgid "\"Edit Profile\" links will take the user to their TouchPoint profile, instead of their WordPress profile."
msgstr "Los enlaces \"Editar perfil\" llevarán al usuario a su perfil de TouchPoint, en lugar de a su perfil de WordPress."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:478
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:575
msgid "Enable full logout"
msgstr "Habilitar cierre de sesión completo"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:479
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:576
msgid "Logout of TouchPoint when logging out of WordPress."
msgstr "Cierre sesión en TouchPoint al cerrar sesión en WordPress."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:485
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:582
msgid "Prevent Subscriber Admin Bar"
msgstr "Prevenir la barra de administración de suscriptores"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:486
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:583
msgid "By enabling this option, users who can't edit anything won't see the Admin bar."
msgstr "Al habilitar esta opción, los usuarios que no pueden editar nada no verán la barra de administración."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:500
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:597
msgid "Involvements"
msgstr "Involucramientos"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:501
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:598
msgid "Import Involvements from TouchPoint to list them on your website, for Small Groups, Classes, and more. Select the division(s) that immediately correspond to the type of Involvement you want to list. For example, if you want a Small Group list and have a Small Group Division, only select the Small Group Division. If you want Involvements to be filterable by additional Divisions, select those Divisions on the Divisions tab, not here."
msgstr "Importe participaciones desde TouchPoint para enumerarlas en su sitio web, para grupos pequeños, clases y más. Seleccione la(s) división(es) que corresponda(n) inmediatamente al tipo de participación que desea enumerar. Por ejemplo, si desea una lista de grupos pequeños y tiene una división de grupos pequeños, solo seleccione la división de grupos pequeños. Si desea que las participaciones se puedan filtrar por divisiones adicionales, seleccione esas divisiones en la pestaña Divisiones, no aquí."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:506
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:603
msgid "Involvement Post Types"
msgstr "Tipos de publicaciones de Involucramientos"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:535
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:633
msgid "Global Partners"
msgstr "Misioneros"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:536
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:634
msgid "Manage how global partners are imported from TouchPoint for listing on WordPress. Partners are grouped by family, and content is provided through Family Extra Values. This works for both People and Business records."
msgstr "Administre cómo se importan los socios globales desde TouchPoint para incluirlos en WordPress. Los socios se agrupan por familia y el contenido se proporciona a través de Valor Extra Familiar. Esto funciona tanto para registros de personas como de empresas."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:540
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:638
msgid "Global Partner Name (Plural)"
msgstr "Nombre de los misioneros (plural)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:541
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:639
msgid "What you call Global Partners at your church"
msgstr "Lo que llamas los Misioneros en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:551
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:649
msgid "Global Partner Name (Singular)"
msgstr "Nombre de un misionero (singular)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:552
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:650
msgid "What you call a Global Partner at your church"
msgstr "Lo que llamas un Misionero en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:562
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:660
msgid "Global Partner Name for Secure Places (Plural)"
msgstr "Nombre de los misioneros para lugares seguros (plural)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:563
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:661
msgid "What you call Secure Global Partners at your church"
msgstr "Lo que llamas un Misionero seguro en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:573
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:671
msgid "Global Partner Name for Secure Places (Singular)"
msgstr "Nombre de un misionero para lugares seguros (singular)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:574
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:672
msgid "What you call a Secure Global Partner at your church"
msgstr "Lo que llamas los Misioneros seguros en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:584
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:682
msgid "Global Partner Slug"
msgstr "Slug de Socio Global"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:585
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:683
msgid "The root path for Global Partner posts"
msgstr "La ruta raíz para las publicaciones de Socios Globales"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:596
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:695
msgid "Saved Search"
msgstr "Búsqueda Guardada"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:597
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:696
msgid "Anyone who is included in this saved search will be included in the listing."
msgstr "Cualquiera que esté incluido en esta búsqueda guardada se incluirá en la lista."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:607
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:706
msgid "Extra Value: Description"
msgstr "Valor Adicional: Descripción"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:608
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:707
msgid "Import a description from a Family Extra Value field. Can be an HTML or Text Extra Value. This becomes the body of the Global Partner post."
msgstr "Importe una descripción de un campo de Valor Extra Familiar. Puede ser un valor adicional HTML o de texto. Esto se convierte en el cuerpo de la publicación del socio global."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:618
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:717
msgid "Extra Value: Summary"
msgstr "Valor Adicional: Resumen"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:619
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:718
msgid "Optional. Import a short description from a Family Extra Value field. Can be an HTML or Text Extra Value. If not provided, the full bio will be truncated."
msgstr "Opcional. Importe una breve descripción de un campo de Valor Extra Familiar. Puede ser un Valor Adicional HTML o de texto. Si no se proporciona, la biografía completa se truncará."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:629
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:728
msgid "Latitude Override"
msgstr "Anulación de latitud"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:630
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:729
msgid "Designate a text Family Extra Value that will contain a latitude that overrides any locations on the partner's profile for the partner map. Both latitude and longitude must be provided for an override to take place."
msgstr "Designe un Valor Familiar Adicional de texto que contenga una latitud que anule cualquier ubicación en el perfil del socio para el mapa de socios. Tanto la latitud como la longitud deben proporcionarse para que se produzca una anulación."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:640
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:739
msgid "Longitude Override"
msgstr "Anulación de longitud"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:641
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:740
msgid "Designate a text Family Extra Value that will contain a longitude that overrides any locations on the partner's profile for the partner map. Both latitude and longitude must be provided for an override to take place."
msgstr "Designe un Valor Familiar Adicional de texto que contenga una longitud que anule cualquier ubicación en el perfil del socio para el mapa de socios. Tanto la latitud como la longitud deben proporcionarse para que se produzca una anulación."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:651
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:750
msgid "Public Location"
msgstr "Ubicación Pública"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:652
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:751
msgid "Designate a text Family Extra Value that will contain the partner's location, as you want listed publicly. For partners who have DecoupleLocation enabled, this field will be associated with the map point, not the list entry."
msgstr "Designe un Valor Adicional Familiar de texto que contendrá la ubicación del socio, como desea que se enumere públicamente. Para los socios que tienen DecoupleLocation habilitado, este campo se asociará con el punto del mapa, no con la entrada de la lista."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:663
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:762
msgid "Import Family Extra Value fields as Meta data on the partner's post"
msgstr "Importe campos de Valor Adicional Familiar como Metadatos en la publicación del socio"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:674
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:773
msgid "Primary Taxonomy"
msgstr "Taxonomía Primaria"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:675
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:774
msgid "Import a Family Extra Value as the primary means by which partners are organized."
msgstr "Importe un Valor Adicional Familiar como el medio principal por el cual se organizan los socios."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:690
-msgid "Events Calendar"
-msgstr "Calendario de eventos"
-
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:691
-msgid "Integrate with The Events Calendar from ModernTribe."
-msgstr "Integre con el calendario de eventos de ModernTribe."
-
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:695
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:817
msgid "Events for Custom Mobile App"
msgstr "Eventos para la aplicación móvil personalizada"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:698
-msgid "To use your Events Calendar events in the Custom mobile app, set the Provider to Wordpress Plugin - Modern Tribe and use this url:"
-msgstr "Para usar los eventos de su calendario de eventos en la aplicación móvil personalizada, configure el proveedor en Wordpress Plugin - Modern Tribe y use esta URL:"
-
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:700
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:822
msgid "Preview"
msgstr "Preestrena"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:715
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:837
msgid "Use Standardizing Stylesheet"
msgstr "Usar hoja de estilo de estandarización"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:716
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:838
msgid "Inserts some basic CSS into the events feed to clean up display"
msgstr "Inserta algo de CSS básico en el feed de eventos para limpiar la pantalla"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:726
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:935
msgid "Divisions"
msgstr "Divisiones"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:727
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:936
msgid "Import Divisions from TouchPoint to your website as a taxonomy. These are used to classify users and involvements."
msgstr "Importe Divisiones desde TouchPoint a su sitio web como una taxonomía. Estos se utilizan para clasificar a los usuarios y las participaciones."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:731
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:940
msgid "Division Name (Plural)"
msgstr "Nombre de la División (plural)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:732
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:941
msgid "What you call Divisions at your church"
msgstr "Lo que llamas Divisiones en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:742
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:952
msgid "Division Name (Singular)"
msgstr "Nombre de la División (Singular)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:743
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:953
msgid "What you call a Division at your church"
msgstr "Lo que llamas una división en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:753
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:964
msgid "Division Slug"
msgstr "Slug de División"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:754
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:965
msgid "The root path for the Division Taxonomy"
msgstr "La ruta raíz para la Taxonomía de División"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:766
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:978
msgid "These Divisions will be imported for the taxonomy"
msgstr "Estas Divisiones se importarán para la taxonomía"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:804
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1029
msgid "Campuses"
msgstr "Campus"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:805
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1030
msgid "Import Campuses from TouchPoint to your website as a taxonomy. These are used to classify users and involvements."
msgstr "Importe Campus desde TouchPoint a su sitio web como una taxonomía. Estos se utilizan para clasificar a los usuarios y las participaciones."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:812
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1037
msgid "Campus Name (Plural)"
msgstr "Nombre del Campus (Plural)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:813
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1038
msgid "What you call Campuses at your church"
msgstr "Lo que llamas Campus en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:823
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1049
msgid "Campus Name (Singular)"
msgstr "Nombre del Campus (Singular)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:824
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1050
msgid "What you call a Campus at your church"
msgstr "Lo que llamas un Campus en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:834
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1061
msgid "Campus Slug"
msgstr "Slug de Campus"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:835
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1062
msgid "The root path for the Campus Taxonomy"
-msgstr "El camino raíz para la Taxonomía del Campus"
+msgstr "La ruta raíz para la Taxonomía del Campus"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:849
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1078
msgid "Resident Codes"
msgstr "Códigos de Residentes"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:850
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1079
msgid "Import Resident Codes from TouchPoint to your website as a taxonomy. These are used to classify users and involvements that have locations."
msgstr "Importe Códigos de Residentes desde TouchPoint a su sitio web como una taxonomía. Estos se utilizan para clasificar los usuarios y las participaciones que tienen ubicaciones."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:854
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1083
msgid "Resident Code Name (Plural)"
msgstr "Nombre de Código de Tesidente (Plural)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:855
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1084
msgid "What you call Resident Codes at your church"
msgstr "Lo que llamas Códigos de Residente en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:865
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1095
msgid "Resident Code Name (Singular)"
msgstr "Nombre de Código de Residente (singular)"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:866
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1096
msgid "What you call a Resident Code at your church"
msgstr "Lo que llamas un Código de Residencia en tu iglesia"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:876
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1107
msgid "Resident Code Slug"
msgstr "Slug de Código Residente"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:877
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1108
msgid "The root path for the Resident Code Taxonomy"
msgstr "La ruta raíz para la Taxonomía del Código de Residente"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1034
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1284
msgid "password saved"
msgstr "contraseña guardada"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1090
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1091
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1338
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1339
msgid "TouchPoint-WP"
msgstr "TouchPoint-WP"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1122
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1387
msgid "Settings"
msgstr "Ajustes"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1351
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1627
msgid "Script Update Failed"
msgstr "Actualización de secuencia de comandos fallida"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1470
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1749
msgid "TouchPoint-WP Settings"
msgstr "Configuración de TouchPoint-WP"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1521
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1800
msgid "Save Settings"
msgstr "Guardar ajustes"
-#: src/TouchPoint-WP/Person.php:1398
-#: src/TouchPoint-WP/Utilities.php:205
+#: src/TouchPoint-WP/Person.php:1451
+#: src/TouchPoint-WP/Utilities.php:286
#: assets/js/base-defer.js:18
msgid "and"
msgstr "y"
-#: assets/js/base-defer.js:208
-#: assets/js/base-defer.js:1154
+#: assets/js/base-defer.js:212
+#: assets/js/base-defer.js:1168
msgid "Your Location"
msgstr "Tu ubicación"
-#: assets/js/base-defer.js:229
+#: assets/js/base-defer.js:233
msgid "User denied the request for Geolocation."
msgstr "El usuario denegó la solicitud de geolocalización."
-#: assets/js/base-defer.js:233
+#: assets/js/base-defer.js:237
msgid "Location information is unavailable."
msgstr "La información de ubicación no está disponible."
-#: assets/js/base-defer.js:237
+#: assets/js/base-defer.js:241
msgid "The request to get user location timed out."
msgstr "Se agotó el tiempo de espera de la solicitud para obtener la ubicación del usuario."
-#: assets/js/base-defer.js:241
+#: assets/js/base-defer.js:245
msgid "An unknown error occurred."
msgstr "Un error desconocido ocurrió."
-#: assets/js/base-defer.js:277
-#: assets/js/base-defer.js:287
+#: assets/js/base-defer.js:281
+#: assets/js/base-defer.js:291
msgid "No geolocation option available."
msgstr "No hay opción de geolocalización disponible."
-#: assets/js/base-defer.js:917
-#: assets/js/base-defer.js:954
-#: assets/js/base-defer.js:1411
-#: assets/js/meeting-defer.js:183
+#: assets/js/base-defer.js:931
+#: assets/js/base-defer.js:968
+#: assets/js/base-defer.js:1425
+#: assets/js/meeting-defer.js:182
msgid "Something strange happened."
msgstr "Algo extraño sucedió."
-#: assets/js/base-defer.js:943
-#: assets/js/base-defer.js:1400
+#: assets/js/base-defer.js:957
+#: assets/js/base-defer.js:1414
msgid "Your message has been sent."
msgstr "Tu mensaje ha sido enviado."
-#: assets/js/base-defer.js:983
+#: assets/js/base-defer.js:997
msgid "Who is joining the group?"
msgstr "¿Quién se une al grupo?"
-#: assets/js/base-defer.js:988
-#: assets/js/base-defer.js:1046
-#: assets/js/base-defer.js:1362
-#: assets/js/base-defer.js:1455
-#: assets/js/meeting-defer.js:225
+#: assets/js/base-defer.js:1002
+#: assets/js/base-defer.js:1060
+#: assets/js/base-defer.js:1376
+#: assets/js/base-defer.js:1469
+#: assets/js/meeting-defer.js:224
msgid "Cancel"
msgstr "Cancelar"
-#: assets/js/base-defer.js:1001
+#: assets/js/base-defer.js:1015
msgid "Select who should be added to the group."
msgstr "Seleccione quién debe agregarse al grupo."
-#: assets/js/base-defer.js:1039
-#: assets/js/base-defer.js:1355
+#: assets/js/base-defer.js:1053
+#: assets/js/base-defer.js:1369
msgid "From"
msgstr "De"
-#: assets/js/base-defer.js:1040
-#: assets/js/base-defer.js:1356
+#: assets/js/base-defer.js:1054
+#: assets/js/base-defer.js:1370
msgid "Message"
msgstr "Mensaje"
-#: assets/js/base-defer.js:1055
-#: assets/js/base-defer.js:1371
+#: assets/js/base-defer.js:1069
+#: assets/js/base-defer.js:1385
msgid "Please provide a message."
msgstr "Proporcione un mensaje."
-#: assets/js/base-defer.js:1140
-#: assets/js/base-defer.js:1142
+#: assets/js/base-defer.js:1154
+#: assets/js/base-defer.js:1156
msgid "We don't know where you are."
msgstr "No sabemos dónde estás."
-#: assets/js/base-defer.js:1140
-#: assets/js/base-defer.js:1150
+#: assets/js/base-defer.js:1154
+#: assets/js/base-defer.js:1164
msgid "Click here to use your actual location."
msgstr "Haga clic aquí para usar su ubicación real."
-#: assets/js/base-defer.js:1301
-#: assets/js/base-defer.js:1318
+#: assets/js/base-defer.js:1315
+#: assets/js/base-defer.js:1332
msgid "clear"
msgstr "borrar"
-#: assets/js/base-defer.js:1307
+#: assets/js/base-defer.js:1321
msgid "Other Relatives..."
msgstr "Otros familiares..."
-#: assets/js/base-defer.js:1445
+#: assets/js/base-defer.js:1459
msgid "Tell us about yourself."
msgstr "Dinos sobre ti."
-#: assets/js/base-defer.js:1447
-#: assets/js/base-defer.js:1502
+#: assets/js/base-defer.js:1461
+#: assets/js/base-defer.js:1516
msgid "Email Address"
msgstr "Correo electrónico"
-#: assets/js/base-defer.js:1448
-#: assets/js/base-defer.js:1503
+#: assets/js/base-defer.js:1462
+#: assets/js/base-defer.js:1517
msgid "Zip Code"
msgstr "Condigo postal"
-#: assets/js/base-defer.js:1500
+#: assets/js/base-defer.js:1514
msgid "Our system doesn't recognize you, so we need a little more info."
msgstr "Nuestro sistema no te reconoce. Necesitamos un poco más de información."
-#: assets/js/base-defer.js:1504
+#: assets/js/base-defer.js:1518
msgid "First Name"
msgstr "Primer nombre"
-#: assets/js/base-defer.js:1505
+#: assets/js/base-defer.js:1519
msgid "Last Name"
msgstr "Apellido"
-#: assets/js/base-defer.js:1507
+#: assets/js/base-defer.js:1521
msgid "Phone"
msgstr "Teléfono"
@@ -937,189 +936,189 @@ msgstr "Teléfono"
msgid "Event Past"
msgstr "Evento pasado"
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "Who is coming?"
msgstr "¿Quien viene?"
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "Indicate who is or is not coming. This will overwrite any existing RSVP."
msgstr "Indica quien viene. Esto va a duplicar a una persona que ya está escrita."
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "To avoid overwriting an existing RSVP, leave that person blank."
msgstr "Para evadir duplicar una persona que ya está escrita, de ja el espacio de la persona vacío."
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "To protect privacy, we won't show existing RSVPs here."
msgstr "Para proteger tu privacidad, nosotros no mostraremos las personas que están registradas aquí."
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "Yes"
msgstr "Sí"
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "No"
msgstr "No"
-#: assets/js/meeting-defer.js:223
+#: assets/js/meeting-defer.js:222
msgid "Add Someone Else"
msgstr "Agregar a alguien más"
-#: assets/js/meeting-defer.js:224
+#: assets/js/meeting-defer.js:223
msgid "Submit"
msgstr "Enviar"
-#: assets/js/meeting-defer.js:243
+#: assets/js/meeting-defer.js:242
msgid "Nothing to submit."
msgstr "Nada que enviar."
-#: src/TouchPoint-WP/TouchPointWP.php:2736
+#: src/TouchPoint-WP/TouchPointWP.php:2384
msgid "The scripts on TouchPoint that interact with this plugin are out-of-date, and an automatic update failed."
msgstr "Los scripts en TouchPoint que interactúan con este complemento están desactualizados y falló una actualización automática."
#. translators: "RSVP for {Event Name}" This is the heading on the RSVP modal. The event name isn't translated because it comes from TouchPoint.
-#: assets/js/meeting-defer.js:205
+#: assets/js/meeting-defer.js:204
msgid "RSVP for %s"
msgstr "RSVP para %s"
-#: assets/js/meeting-defer.js:172
+#: assets/js/meeting-defer.js:171
msgid "Response Recorded"
msgid_plural "Responses Recorded"
msgstr[0] "Respuesta registrada"
msgstr[1] "Respuestas registrada"
#. translators: %s is the name of an involvement, like a particular small group
-#: assets/js/base-defer.js:906
+#: assets/js/base-defer.js:920
msgid "Added to %s"
msgstr "Añadido a %s"
#. translators: %s is the name of an Involvement
-#: assets/js/base-defer.js:967
+#: assets/js/base-defer.js:981
msgid "Join %s"
msgstr "Únete %s"
#. translators: %s is a person's name. This is a heading for a contact modal.
-#: assets/js/base-defer.js:1338
+#: assets/js/base-defer.js:1352
msgid "Contact %s"
msgstr "Contactar a %s"
#. translators: %s is the name of an involvement. This is a heading for a modal.
-#: assets/js/base-defer.js:1022
+#: assets/js/base-defer.js:1036
msgid "Contact the Leaders of %s"
msgstr "Contacta a los líderes de %s"
-#: assets/js/base-defer.js:1045
-#: assets/js/base-defer.js:1361
+#: assets/js/base-defer.js:1059
+#: assets/js/base-defer.js:1375
msgid "Send"
msgstr "Envía"
-#: assets/js/base-defer.js:909
-#: assets/js/base-defer.js:920
-#: assets/js/base-defer.js:946
-#: assets/js/base-defer.js:957
-#: assets/js/base-defer.js:1403
-#: assets/js/base-defer.js:1414
-#: assets/js/meeting-defer.js:175
-#: assets/js/meeting-defer.js:186
+#: assets/js/base-defer.js:923
+#: assets/js/base-defer.js:934
+#: assets/js/base-defer.js:960
+#: assets/js/base-defer.js:971
+#: assets/js/base-defer.js:1417
+#: assets/js/base-defer.js:1428
+#: assets/js/meeting-defer.js:174
+#: assets/js/meeting-defer.js:185
msgid "OK"
msgstr "OK"
-#: assets/js/base-defer.js:1454
+#: assets/js/base-defer.js:1468
msgid "Next"
msgstr "Siguiente"
-#: src/TouchPoint-WP/Involvement.php:1493
-#: src/TouchPoint-WP/TouchPointWP.php:1620
+#: src/TouchPoint-WP/Involvement.php:1901
+#: src/TouchPoint-WP/Taxonomies.php:869
msgid "Marital Status"
msgstr "Estado civil"
-#: src/TouchPoint-WP/Involvement.php:1506
+#: src/TouchPoint-WP/Involvement.php:1914
msgid "Age"
msgstr "Años"
-#: src/TouchPoint-WP/Involvement.php:1377
+#: src/TouchPoint-WP/Involvement.php:1785
msgid "Genders"
msgstr "Géneros"
-#: src/TouchPoint-WP/Utilities.php:69
+#: src/TouchPoint-WP/Utilities.php:136
msgctxt "e.g. event happens weekly on..."
msgid "Sundays"
msgstr "los domingos"
-#: src/TouchPoint-WP/Utilities.php:70
+#: src/TouchPoint-WP/Utilities.php:137
msgctxt "e.g. event happens weekly on..."
msgid "Mondays"
msgstr "los lunes"
-#: src/TouchPoint-WP/Utilities.php:71
+#: src/TouchPoint-WP/Utilities.php:138
msgctxt "e.g. event happens weekly on..."
msgid "Tuesdays"
msgstr "los martes"
-#: src/TouchPoint-WP/Utilities.php:72
+#: src/TouchPoint-WP/Utilities.php:139
msgctxt "e.g. event happens weekly on..."
msgid "Wednesdays"
msgstr "los miércoles"
-#: src/TouchPoint-WP/Utilities.php:73
+#: src/TouchPoint-WP/Utilities.php:140
msgctxt "e.g. event happens weekly on..."
msgid "Thursdays"
msgstr "los jueves"
-#: src/TouchPoint-WP/Utilities.php:74
+#: src/TouchPoint-WP/Utilities.php:141
msgctxt "e.g. event happens weekly on..."
msgid "Fridays"
msgstr "los viernes"
-#: src/TouchPoint-WP/Utilities.php:75
+#: src/TouchPoint-WP/Utilities.php:142
msgctxt "e.g. event happens weekly on..."
msgid "Saturdays"
msgstr "los sábados"
-#: src/TouchPoint-WP/Utilities.php:111
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:188
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Sun"
msgstr "Dom"
-#: src/TouchPoint-WP/Utilities.php:112
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:189
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Mon"
msgstr "Lun"
-#: src/TouchPoint-WP/Utilities.php:113
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:190
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Tue"
msgstr "Mar"
-#: src/TouchPoint-WP/Utilities.php:114
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:191
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Wed"
msgstr "Mié"
-#: src/TouchPoint-WP/Utilities.php:115
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:192
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Thu"
msgstr "Jue"
-#: src/TouchPoint-WP/Utilities.php:116
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:193
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Fri"
msgstr "Vie"
-#: src/TouchPoint-WP/Utilities.php:117
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:194
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Sat"
msgstr "Sáb"
-#: src/templates/admin/invKoForm.php:95
+#: src/templates/admin/invKoForm.php:128
msgid "Based on Involvement setting in TouchPoint"
msgstr "Basado en la configuración de participación en TouchPoint"
-#: src/templates/admin/invKoForm.php:95
+#: src/templates/admin/invKoForm.php:128
msgid "Involvement does not meet weekly"
msgstr "La participación no se reúne semanalmente"
-#: src/templates/admin/invKoForm.php:99
+#: src/templates/admin/invKoForm.php:132
msgid "Involvement does not have a Schedule"
msgstr "La participación no tiene horario"
@@ -1135,342 +1134,740 @@ msgstr "Latitud"
msgid "Longitude"
msgstr "Longitud"
-#: src/templates/admin/locationsKoForm.php:43
+#: src/templates/admin/locationsKoForm.php:51
msgid "Static IP Addresses"
msgstr "Direcciones IP estáticas"
-#: src/templates/admin/locationsKoForm.php:46
+#: src/templates/admin/locationsKoForm.php:54
msgid "If this Location has an internet connection with Static IP Addresses, you can put those addresses here so users are automatically identified with this location."
msgstr "Si esta ubicación tiene una conexión a Internet con direcciones IP estáticas, puede colocar esas direcciones aquí para que los usuarios se identifiquen automáticamente con esta ubicación."
-#: src/templates/admin/locationsKoForm.php:54
+#: src/templates/admin/locationsKoForm.php:62
msgid "Add IP Address"
msgstr "Agregar dirección IP"
-#: src/templates/admin/locationsKoForm.php:64
+#: src/templates/admin/locationsKoForm.php:72
msgid "Add Location"
msgstr "Añade una ubicación"
-#: src/templates/admin/locationsKoForm.php:71
+#: src/templates/admin/locationsKoForm.php:79
msgid "The Campus"
msgstr "El campus"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:779
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:785
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1004
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1010
msgid "Locations"
msgstr "Ubicaciones"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:780
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1005
msgid "Locations are physical places, probably campuses. None are required, but they can help present geographic information clearly."
msgstr "Las ubicaciones son lugares físicos, probablemente campus. No se requiere ninguno, pero pueden ayudar a presentar la información geográfica con claridad."
-#: src/TouchPoint-WP/Utilities.php:161
+#: src/TouchPoint-WP/Utilities.php:236
msgctxt "Time of Day"
msgid "Late Night"
msgstr "Tarde en la noche"
-#: src/TouchPoint-WP/Utilities.php:163
+#: src/TouchPoint-WP/Utilities.php:238
msgctxt "Time of Day"
msgid "Early Morning"
msgstr "Madrugada"
-#: src/TouchPoint-WP/Utilities.php:165
+#: src/TouchPoint-WP/Utilities.php:240
msgctxt "Time of Day"
msgid "Morning"
msgstr "Mañana"
-#: src/TouchPoint-WP/Utilities.php:167
+#: src/TouchPoint-WP/Utilities.php:242
msgctxt "Time of Day"
msgid "Midday"
msgstr "Mediodía"
-#: src/TouchPoint-WP/Utilities.php:169
+#: src/TouchPoint-WP/Utilities.php:244
msgctxt "Time of Day"
msgid "Afternoon"
msgstr "Tarde"
-#: src/TouchPoint-WP/Utilities.php:171
+#: src/TouchPoint-WP/Utilities.php:246
msgctxt "Time of Day"
msgid "Evening"
msgstr "Tardecita"
-#: src/TouchPoint-WP/Utilities.php:173
+#: src/TouchPoint-WP/Utilities.php:248
msgctxt "Time of Day"
msgid "Night"
msgstr "Noche"
-#: src/TouchPoint-WP/Involvement.php:1494
+#: src/TouchPoint-WP/Involvement.php:1902
msgctxt "Marital status for a group of people"
msgid "Mostly Single"
msgstr "Mayoría solteras"
-#: src/TouchPoint-WP/Involvement.php:1495
+#: src/TouchPoint-WP/Involvement.php:1903
msgctxt "Marital status for a group of people"
msgid "Mostly Married"
msgstr "Mayoría casadas"
#. translators: %s is the link to "reset the map"
-#: src/TouchPoint-WP/Involvement.php:1536
-#: src/TouchPoint-WP/Partner.php:787
+#: src/TouchPoint-WP/Involvement.php:1944
+#: src/TouchPoint-WP/Partner.php:854
msgid "Zoom out or %s to see more."
msgstr "Alejar o %s para ver más."
-#: src/TouchPoint-WP/Involvement.php:1539
-#: src/TouchPoint-WP/Partner.php:790
+#: src/TouchPoint-WP/Involvement.php:1947
+#: src/TouchPoint-WP/Partner.php:857
msgctxt "Zoom out or reset the map to see more."
msgid "reset the map"
msgstr "restablecer el mapa"
-#. translators: "Mon at 7pm" or "Sundays at 9am & 11am"
-#: src/TouchPoint-WP/Involvement.php:712
-#: src/TouchPoint-WP/Involvement.php:732
+#. translators: %1$s is the date(s), %2$s is the time(s).
+#: src/TouchPoint-WP/Involvement.php:995
+#: src/TouchPoint-WP/Involvement.php:1027
+#: src/TouchPoint-WP/Involvement.php:1120
+#: src/TouchPoint-WP/Involvement.php:1144
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:71
+#: src/TouchPoint-WP/Utilities/DateFormats.php:288
+#: src/TouchPoint-WP/Utilities/DateFormats.php:352
msgid "%1$s at %2$s"
msgstr "%1$s a las %2$s"
#. translators: {start date} through {end date} e.g. February 14 through August 12
-#: src/TouchPoint-WP/Involvement.php:741
+#: src/TouchPoint-WP/Involvement.php:1036
msgid "%1$s through %2$s"
msgstr "%1$s al %2$s"
#. translators: {schedule}, {start date} through {end date} e.g. Sundays at 11am, February 14 through August 12
-#: src/TouchPoint-WP/Involvement.php:748
+#: src/TouchPoint-WP/Involvement.php:1045
msgid "%1$s, %2$s through %3$s"
msgstr "%1$s, %2$s al %3$s"
#. translators: Starts {start date} e.g. Starts September 15
-#: src/TouchPoint-WP/Involvement.php:758
+#: src/TouchPoint-WP/Involvement.php:1054
msgid "Starts %1$s"
msgstr "Comienza el %1$s"
#. translators: {schedule}, starting {start date} e.g. Sundays at 11am, starting February 14
-#: src/TouchPoint-WP/Involvement.php:764
+#: src/TouchPoint-WP/Involvement.php:1062
msgid "%1$s, starting %2$s"
msgstr "%1$s, comienza el %2$s"
#. translators: Through {end date} e.g. Through September 15
-#: src/TouchPoint-WP/Involvement.php:773
+#: src/TouchPoint-WP/Involvement.php:1070
msgid "Through %1$s"
msgstr "Hasta el %1$s"
#. translators: {schedule}, through {end date} e.g. Sundays at 11am, through February 14
-#: src/TouchPoint-WP/Involvement.php:779
+#: src/TouchPoint-WP/Involvement.php:1078
msgid "%1$s, through %2$s"
msgstr "%1$s, hasta el %2$s"
#. translators: number of miles
#: src/templates/parts/involvement-nearby-list.php:10
-#: src/TouchPoint-WP/Involvement.php:2803
+#: src/TouchPoint-WP/Involvement.php:3577
msgctxt "miles. Unit is appended to a number. %2.1f is the number, so %2.1fmi looks like '12.3mi'"
msgid "%2.1fmi"
msgstr "%2.1fmi"
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:304
-msgid "The username of a user account in TouchPoint with API permissions."
-msgstr "El nombre de usuario de una cuenta de usuario en TouchPoint con permisos de API."
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:374
+msgid "The username of a user account in TouchPoint with API permissions. It is strongly recommended that you create a separate person/user for this purpose, rather than using a staff member's account."
+msgstr "El nombre de usuario de una cuenta de usuario en TouchPoint con permisos API. Se recomienda encarecidamente que cree una persona/usuario independiente para este fin, en lugar de utilizar la cuenta de un miembro del personal."
-#: src/templates/admin/invKoForm.php:103
+#: src/templates/admin/invKoForm.php:136
msgid "Involvement has a registration type of \"No Online Registration\""
msgstr "La participación tiene un tipo de registro de \"No Online Registration\""
-#: src/templates/admin/invKoForm.php:107
+#: src/templates/admin/invKoForm.php:140
msgid "Involvement registration has ended (end date is past)"
msgstr "El registro de participación ha finalizado (la fecha de finalización ya pasó)"
-#: src/TouchPoint-WP/Involvement.php:1628
+#: src/TouchPoint-WP/Involvement.php:2040
msgid "This involvement type doesn't exist."
msgstr "Este tipo de participación no existe."
-#: src/TouchPoint-WP/Involvement.php:1638
+#: src/TouchPoint-WP/Involvement.php:2050
msgid "This involvement type doesn't have geographic locations enabled."
msgstr "Este tipo de participación no tiene habilitadas las ubicaciones geográficas."
-#: src/TouchPoint-WP/Involvement.php:1657
+#: src/TouchPoint-WP/Involvement.php:2069
msgid "Could not locate."
msgstr "No se pudo localizar."
-#: src/TouchPoint-WP/Meeting.php:91
-#: src/TouchPoint-WP/TouchPointWP.php:940
+#: src/TouchPoint-WP/Meeting.php:672
+#: src/TouchPoint-WP/TouchPointWP.php:1033
msgid "Only GET requests are allowed."
msgstr "Solo se permiten solicitudes GET."
-#: src/TouchPoint-WP/Meeting.php:119
-#: src/TouchPoint-WP/TouchPointWP.php:369
+#: src/TouchPoint-WP/Meeting.php:700
+#: src/TouchPoint-WP/TouchPointWP.php:362
msgid "Only POST requests are allowed."
msgstr "Solo se permiten solicitudes POST."
-#: src/TouchPoint-WP/Meeting.php:129
-#: src/TouchPoint-WP/TouchPointWP.php:378
+#: src/TouchPoint-WP/Meeting.php:710
+#: src/TouchPoint-WP/TouchPointWP.php:371
msgid "Invalid data provided."
msgstr "Datos proporcionados no válidos."
-#: src/TouchPoint-WP/Involvement.php:2941
-#: src/TouchPoint-WP/Involvement.php:3018
+#: src/TouchPoint-WP/Involvement.php:3861
+#: src/TouchPoint-WP/Involvement.php:3964
msgid "Invalid Post Type."
msgstr "Tipo de publicación no válida."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:258
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:326
msgid "Enable Campuses"
msgstr "Habilitar Campus"
-#: src/TouchPoint-WP/TouchPointWP.php:1252
+#: src/TouchPoint-WP/Taxonomies.php:658
msgid "Classify posts by their general locations."
msgstr "clasificar las publicaciones por sus ubicaciones generales."
-#: src/TouchPoint-WP/TouchPointWP.php:1305
+#: src/TouchPoint-WP/Taxonomies.php:687
msgid "Classify posts by their church campus."
msgstr "Clasifique las publicaciones por el campus."
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1357
+#: src/TouchPoint-WP/Taxonomies.php:718
msgid "Classify things by %s."
msgstr "Clasifica las cosas por %s."
-#: src/TouchPoint-WP/TouchPointWP.php:1444
+#: src/TouchPoint-WP/Taxonomies.php:749
msgid "Classify involvements by the day on which they meet."
msgstr "Clasificar las participaciones por el día en que se reúnen."
-#: src/TouchPoint-WP/TouchPointWP.php:1445
+#: src/TouchPoint-WP/Taxonomies.php:750
msgid "Weekdays"
msgstr "Días de semana"
-#: src/TouchPoint-WP/TouchPointWP.php:1482
+#: src/TouchPoint-WP/Taxonomies.php:776
msgid "Classify involvements by tense (present, future, past)"
msgstr "Clasificar las implicaciones por tiempo (presente, futuro, pasado)"
-#: src/TouchPoint-WP/TouchPointWP.php:1483
+#: src/TouchPoint-WP/Taxonomies.php:780
msgid "Tense"
msgstr "Tiempo"
-#: src/TouchPoint-WP/TouchPointWP.php:1483
+#: src/TouchPoint-WP/Taxonomies.php:780
msgid "Tenses"
msgstr "Tiempos"
-#: src/TouchPoint-WP/TouchPointWP.php:1526
+#: src/TouchPoint-WP/Taxonomies.php:803
msgid "Classify involvements by the portion of the day in which they meet."
msgstr "Clasifique las participaciones por la parte del día en que se reúnen."
-#: src/TouchPoint-WP/TouchPointWP.php:1527
+#: src/TouchPoint-WP/Taxonomies.php:809
msgid "Times of Day"
msgstr "Tiempos del Día"
-#: src/TouchPoint-WP/TouchPointWP.php:1580
+#: src/TouchPoint-WP/Taxonomies.php:835
msgid "Classify involvements and users by their age groups."
msgstr "Clasifica las implicaciones y los usuarios por sus grupos de edad."
-#: src/TouchPoint-WP/TouchPointWP.php:1581
+#: src/TouchPoint-WP/Taxonomies.php:838
msgid "Age Groups"
msgstr "Grupos de Edad"
-#: src/TouchPoint-WP/TouchPointWP.php:1619
+#: src/TouchPoint-WP/Taxonomies.php:864
msgid "Classify involvements by whether participants are mostly single or married."
msgstr "Clasifique las participaciones según si los participantes son en su mayoría solteros o casados."
-#: src/TouchPoint-WP/TouchPointWP.php:1620
+#: src/TouchPoint-WP/Taxonomies.php:870
msgid "Marital Statuses"
msgstr "Estados Civiles"
-#: src/TouchPoint-WP/TouchPointWP.php:1664
+#: src/TouchPoint-WP/Taxonomies.php:903
msgid "Classify Partners by category chosen in settings."
msgstr "Clasifique a los ministeriales por categoría elegida en la configuración."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:259
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:327
msgid "Import campuses as a taxonomy. (You probably want to do this if you're multi-campus.)"
msgstr "Importar campus como taxonomía. (Probablemente quieras hacer esto si tienes varios campus)."
#. translators: %s: taxonomy name, plural
-#: src/TouchPoint-WP/TouchPointWP.php:1225
+#: src/TouchPoint-WP/Taxonomies.php:51
msgid "Search %s"
msgstr "Buscar %s"
#. translators: %s: taxonomy name, plural
-#: src/TouchPoint-WP/TouchPointWP.php:1227
+#: src/TouchPoint-WP/Taxonomies.php:53
msgid "All %s"
msgstr "Todos los %s"
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1229
+#: src/TouchPoint-WP/Taxonomies.php:55
msgid "Edit %s"
msgstr "Editar %s"
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1231
+#: src/TouchPoint-WP/Taxonomies.php:57
msgid "Update %s"
msgstr "Actualizar %s"
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1233
+#: src/TouchPoint-WP/Taxonomies.php:59
msgid "Add New %s"
msgstr "Agregar Nuevo %s"
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1235
+#: src/TouchPoint-WP/Taxonomies.php:61
msgid "New %s"
msgstr "Nuevo %s"
-#: src/TouchPoint-WP/Report.php:170
+#: src/TouchPoint-WP/Report.php:177
msgid "TouchPoint Reports"
msgstr "Informes de TouchPoint"
-#: src/TouchPoint-WP/Report.php:171
+#: src/TouchPoint-WP/Report.php:178
msgid "TouchPoint Report"
msgstr "Informe de TouchPoint"
#. translators: Last updated date/time for a report. %1$s is the date. %2$s is the time.
-#: src/TouchPoint-WP/Report.php:301
+#: src/TouchPoint-WP/Report.php:417
msgid "Updated on %1$s at %2$s"
msgstr "Actualizada %1$s %2$s"
-#: src/TouchPoint-WP/TouchPointWP.php:274
+#: src/TouchPoint-WP/TouchPointWP.php:266
msgid "Every 15 minutes"
msgstr "Cada 15 minutos"
-#: src/TouchPoint-WP/Involvement.php:1420
+#: src/TouchPoint-WP/Involvement.php:1828
msgid "Language"
msgstr "Idioma"
-#: src/templates/admin/invKoForm.php:67
+#: src/templates/admin/invKoForm.php:91
msgid "Import Images from TouchPoint"
msgstr "Importar imágenes desde TouchPoint"
-#: src/templates/admin/invKoForm.php:71
+#: src/templates/admin/invKoForm.php:95
msgid "Importing images sometimes conflicts with other plugins. Disabling image imports can help."
msgstr "La importación de imágenes a veces entra en conflicto con otros complementos. Deshabilitar las importaciones de imágenes puede ayudar."
-#: src/TouchPoint-WP/Person.php:1404
+#: src/TouchPoint-WP/Person.php:1458
msgctxt "list of people, and *others*"
msgid "others"
msgstr "otros"
-#: src/TouchPoint-WP/Involvement.php:3005
-#: src/TouchPoint-WP/Person.php:1720
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:850
+msgid "Meeting Calendars"
+msgstr "Calendarios de Reuniones"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:851
+msgid "Import Meetings from TouchPoint to a calendar on your website."
+msgstr "Importe reuniones desde TouchPoint a un calendario en su sitio web."
+
+#: src/templates/admin/invKoForm.php:102
+msgid "Import All Meetings to Calendar"
+msgstr "Importe reuniones a los calendarios"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:879
+msgid "Meetings Slug"
+msgstr "Slug de reuniones"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:880
+msgid "The root path for Meetings"
+msgstr "La ruta raíz para las reuniones"
+
+#: src/TouchPoint-WP/Involvement.php:3951
+#: src/TouchPoint-WP/Person.php:1833
msgid "Contact Prohibited."
msgstr "Contacto prohibido."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:449
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:546
msgid "By checking this box, the TouchPoint login page will become the default. To prevent the redirect and reach the standard WordPress login page, add 'tp_no_redirect' as a URL parameter."
msgstr "Al marcar esta casilla, la página de inicio de sesión de TouchPoint se convertirá en la predeterminada. Para evitar la redirección y llegar a la página de inicio de sesión estándar de WordPress, agregue 'tp_no_redirect' como parámetro de URL."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:292
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:362
msgid "The domain for your mobile app deeplinks, without the https or any slashes. If you aren't using the custom mobile app, leave this blank."
msgstr "El dominio de los enlaces profundos de su aplicación móvil, sin https ni barras diagonales. Si no está utilizando la aplicación móvil personalizada, déjelo en blanco."
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:369
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:466
msgid "Once your settings on this page are set and saved, use this tool to generate the scripts needed for TouchPoint in a convenient installation package."
msgstr "Una vez que haya configurado y guardado la configuración en esta página, utilice esta herramienta para generar los scripts necesarios para TouchPoint en un paquete de instalación conveniente."
-#: assets/js/base-defer.js:1488
+#: assets/js/base-defer.js:1502
msgid "Something went wrong."
msgstr "Algo salió mal."
-#: src/TouchPoint-WP/Person.php:1609
+#: src/TouchPoint-WP/Person.php:1688
msgid "You may need to sign in."
msgstr "Es posible que tengas que iniciar sesión."
-#: src/TouchPoint-WP/Involvement.php:2995
-#: src/TouchPoint-WP/Person.php:1737
+#: src/TouchPoint-WP/Involvement.php:3941
+#: src/TouchPoint-WP/Person.php:1850
msgid "Contact Blocked for Spam."
msgstr "Contacto bloqueado por spam."
-#: src/TouchPoint-WP/Person.php:1541
+#: src/TouchPoint-WP/Person.php:1597
msgid "Registration Blocked for Spam."
msgstr "Registro bloqueado por spam."
+
+#: src/templates/meeting-archive.php:27
+#: src/TouchPoint-WP/Meeting.php:269
+msgctxt "What Meetings should be called, plural."
+msgid "Events"
+msgstr "Eventos"
+
+#: src/TouchPoint-WP/Meeting.php:270
+msgctxt "What Meetings should be called, singular."
+msgid "Event"
+msgstr "Evento"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:293
+msgid "Enable Meeting Calendar"
+msgstr "Habilitar calendario de reuniones"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:294
+msgid "Load Meetings from TouchPoint for a calendar, native in your website."
+msgstr "Cargue reuniones desde TouchPoint para un calendario nativo en su sitio web."
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:892
+msgid "Days of Future"
+msgstr "Días del futuro"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:893
+msgid "Meetings more than this many days in the future will not be imported."
+msgstr "No se importarán reuniones que superen estos días en el futuro."
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:905
+msgid "Archive After Days"
+msgstr "Archivo después de días"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:918
+msgid "Days of History"
+msgstr "Días de la Historia"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:989
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1120
+msgid "Post Types"
+msgstr "Tipos de publicaciones"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:990
+msgid "Select post types which should have Divisions available as a native taxonomy."
+msgstr "Seleccione los tipos de publicaciones que deberían tener Divisiones disponibles como taxonomía nativa."
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1121
+msgid "Select post types which should have Resident Codes available as a native taxonomy."
+msgstr "Seleccione los tipos de publicaciones que deberían tener códigos de residente disponibles como taxonomía nativa."
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:119
+#: src/TouchPoint-WP/Utilities/DateFormats.php:194
+msgid "Tonight"
+msgstr "este noche"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:121
+#: src/TouchPoint-WP/Utilities/DateFormats.php:196
+msgid "Today"
+msgstr "hoy"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:128
+#: src/TouchPoint-WP/Utilities/DateFormats.php:203
+msgid "Tomorrow"
+msgstr "mañana"
+
+#: src/templates/admin/invKoForm.php:405
+msgid "(named person)"
+msgstr "(persona nombrada)"
+
+#: src/TouchPoint-WP/Utilities.php:497
+msgid "Expand"
+msgstr "Ampliar"
+
+#: src/TouchPoint-WP/Meeting.php:549
+msgid "Cancelled"
+msgstr "Cancelado"
+
+#: src/TouchPoint-WP/Meeting.php:550
+msgid "Scheduled"
+msgstr "Programado"
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:147
+msgctxt "Date format string"
+msgid "Last %1$s, %2$s"
+msgstr "el pasado %1$s %2$s"
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:153
+msgctxt "Date format string"
+msgid "This %1$s, %2$s"
+msgstr "este %1$s %2$s"
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:159
+msgctxt "Date format string"
+msgid "Next %1$s, %2$s"
+msgstr "el proximo %1$s %2$s"
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:164
+msgctxt "Date format string"
+msgid "%1$s, %2$s"
+msgstr "%1$s %2$s"
+
+#. Translators: %s is the singular name of the of a Meeting, such as "Event".
+#: src/TouchPoint-WP/CalendarGrid.php:189
+msgid "%s is cancelled."
+msgstr "%s esta cancelado."
+
+#. Translators: %s is the system name. "TouchPoint" by default.
+#: src/TouchPoint-WP/Involvement.php:3665
+msgid "Involvement in %s"
+msgstr "Participaciones en %s"
+
+#: src/TouchPoint-WP/Meeting.php:422
+msgid "In the Past"
+msgstr "en el pasado"
+
+#. Translators: %s is the system name. "TouchPoint" by default.
+#: src/TouchPoint-WP/Meeting.php:494
+msgid "Meeting in %s"
+msgstr "Reunión en %s"
+
+#. Translators: %s is the system name. "TouchPoint" by default.
+#: src/TouchPoint-WP/Person.php:1200
+msgid "Person in %s"
+msgstr "Persona en %s"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:855
+msgid "Meeting Name (Plural)"
+msgstr "Nombre de las reuniones (singular)"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:856
+msgid "What you call Meetings at your church"
+msgstr "Lo que llamas Reuniones en tu iglesia"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:861
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:863
+msgid "Meetings"
+msgstr "Reuniones"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:861
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:863
+msgid "Events"
+msgstr "Eventos"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:867
+msgid "Meeting Name (Singular)"
+msgstr "Nombre de la reunión (singular)"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:868
+msgid "What you call a Meeting at your church"
+msgstr "Cómo se llama una Reunión en tu iglesia"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:873
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:875
+msgid "Meeting"
+msgstr "Reunión"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:873
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:875
+msgid "Event"
+msgstr "Evento"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:137
+msgctxt "Date string for day of the week, when the year is current."
+msgid "l"
+msgstr "l"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:138
+msgctxt "Date string when the year is current."
+msgid "F j"
+msgstr "j F"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:140
+msgctxt "Date string for day of the week, when the year is not current."
+msgid "l"
+msgstr "l"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:141
+msgctxt "Date string when the year is not current."
+msgid "F j, Y"
+msgstr "j F Y"
+
+#: src/TouchPoint-WP/Meeting.php:551
+msgctxt "Event Status is not a recognized value."
+msgid "Unknown"
+msgstr "desconocido"
+
+#: src/TouchPoint-WP/Involvement.php:136
+msgid "Creating an Involvement object from an object without a post_id is not yet supported."
+msgstr "Aún no se admite la creación de un objeto de participación a partir de un objeto sin post_id."
+
+#. translators: "Mon All Day" or "Sundays All Day"
+#: src/TouchPoint-WP/Involvement.php:998
+#: src/TouchPoint-WP/Involvement.php:1021
+msgid "%1$s All Day"
+msgstr "todo el dia los %1$s"
+
+#: src/TouchPoint-WP/Meeting.php:94
+msgid "Creating a Meeting object from an object without a post_id is not yet supported."
+msgstr "Aún no se admite la creación de un objeto de reunión a partir de un objeto sin post_id."
+
+#. translators: %1$s is the start date/time, %2$s is the end date/time.
+#: src/TouchPoint-WP/Utilities/DateFormats.php:89
+#: src/TouchPoint-WP/Utilities/DateFormats.php:331
+msgid "%1$s – %2$s"
+msgstr "%1$s – %2$s"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:211
+msgctxt "Short date string for day of the week, when the year is current."
+msgid "D"
+msgstr "D"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:212
+msgctxt "Short date string when the year is current."
+msgid "M j"
+msgstr "j M"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:214
+msgctxt "Short date string for day of the week, when the year is not current."
+msgid "D"
+msgstr "D"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:215
+msgctxt "Short date string when the year is not current."
+msgid "M j, Y"
+msgstr "j M Y"
+
+#. translators: %1$s is the start date, %2$s start time, %3$s is the end date, and %4$s end time.
+#: src/TouchPoint-WP/Utilities/DateFormats.php:364
+msgid "%1$s at %2$s – %3$s at %4$s"
+msgstr "%1$s a %2$s – %3$s a %4$s"
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:221
+msgctxt "Short date format string"
+msgid "Last %1$s, %2$s"
+msgstr "el pasado %1$s %2$s"
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:227
+msgctxt "Short date format string"
+msgid "This %1$s, %2$s"
+msgstr "este %1$s %2$s"
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:233
+msgctxt "Short date format string"
+msgid "Next %1$s, %2$s"
+msgstr "proximo %1$s %2$s"
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:238
+msgctxt "Short date format string"
+msgid "%1$s, %2$s"
+msgstr "%1$s %2$s"
+
+#. Translators: %s is the plural name of the of the Meetings, such as "Events".
+#: src/TouchPoint-WP/CalendarGrid.php:269
+msgid "There are no %s published for this month."
+msgstr "No hay %s publicados para este mes."
+
+#: src/templates/admin/locationsKoForm.php:43
+msgid "Radius (miles)"
+msgstr "Radio (millas)"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:791
+msgid "Events Calendar plugin by Modern Tribe"
+msgstr "Complemento de calendario de eventos de Modern Tribe"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:795
+msgid "TouchPoint Meetings"
+msgstr "reuniones de TouchPoint"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:801
+msgid "App 2.0 Calendar"
+msgstr "Calendario de la app 2.0"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:806
+msgid "Events Provider"
+msgstr "Proveedor de eventos"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:807
+msgid "The source of events for version 2.0 of the Custom Mobile App."
+msgstr "El origen de los eventos para la versión 2.0 de la aplicación móvil personalizada."
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:820
+msgid "To use your Events Calendar events in the Custom mobile app, set the Provider to Wordpress Plugin - Modern Tribe (regardless of which provider you're using above) and use this url:"
+msgstr "Para usar sus eventos del Calendario de eventos en la aplicación móvil personalizada, configure el Proveedor en Wordpress Plugin - Modern Tribe (independientemente del proveedor que esté utilizando anteriormente) y use esta URL:"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:802
+msgid "Integrate Custom Mobile app version 2.0 with The Events Calendar from Modern Tribe."
+msgstr "Integre la versión 2.0 de la aplicación móvil personalizada con el calendario de eventos de Modern Tribe."
+
+#. Translators: %s is the singular name of the of a Meeting, such as "Event".
+#: src/templates/involvement-single.php:49
+msgid "This %s has been Cancelled."
+msgstr "Este %s ha sido Cancelado."
+
+#: src/templates/admin/invKoForm.php:197
+msgid "Division"
+msgstr "Division"
+
+#: src/templates/admin/invKoForm.php:204
+msgid "Resident Code"
+msgstr "Código de Residente"
+
+#: src/templates/admin/invKoForm.php:211
+msgid "Campus"
+msgstr "Campus"
+
+#: src/TouchPoint-WP/Involvement.php:1022
+msgid "All Day"
+msgstr "todo el dia"
+
+#: src/TouchPoint-WP/Utilities.php:291
+msgctxt "list of items, and *others*"
+msgid "others"
+msgstr "otros"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:433
+msgid "ipapi.co API Key"
+msgstr "Clave API de ipapi.co"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:434
+msgid "Optional. Allows for geolocation of user IP addresses. This generally will work without a key, but may be rate limited."
+msgstr "Opcional. Permite la geolocalización de las direcciones IP de los usuarios. Por lo general, esto funcionará sin una clave, pero puede tener una frecuencia limitada."
+
+#: src/templates/admin/invKoForm.php:60
+msgid "Import Campuses"
+msgstr "Importar Campus"
+
+#: src/templates/admin/invKoForm.php:67
+msgid "All Campuses"
+msgstr "Todos los campus"
+
+#: src/templates/admin/invKoForm.php:71
+msgid "(No Campus)"
+msgstr "(Sin campus)"
+
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:39
+msgid "TouchPoint-WP Status"
+msgstr "Estado de TouchPoint-WP"
+
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:96
+msgid "Imported"
+msgstr "Importadas"
+
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:97
+msgid "Last Updated"
+msgstr "Actualizada"
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:130
+#: src/TouchPoint-WP/Utilities/DateFormats.php:205
+msgid "Yesterday"
+msgstr "Ayer"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:906
+msgid "Meetings more than this many days in the past will no longer update from TouchPoint, allowing you to keep some historical event information on the calendar for reference, even if you reuse and update the information in the Involvement."
+msgstr "Las reuniones con más de esta cantidad de días en el pasado ya no se actualizarán desde TouchPoint, lo que le permitirá conservar información histórica de eventos en el calendario para referencia, incluso si reutiliza y actualiza la información en Participación."
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:919
+msgid "Meetings will be kept on the calendar until the event is this many days in the past. Once an event is older than this, it'll be deleted."
+msgstr "Las reuniones se mantendrán en el calendario hasta que el evento tenga esta cantidad de días en el pasado. Una vez que un evento tenga más de esta cantidad de días, se eliminará."
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:444
+msgid "List Site in Directory"
+msgstr "Listar sitio en directorio"
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:445
+msgid "Allow the TouchPoint-WP developers to publicly list your site/church as using TouchPoint-WP. Helps other prospective churches see what can be done by combining WordPress with the best ChMS on the planet. Only applies if this site is accessible on the public internet."
+msgstr "Permita que los desarrolladores de TouchPoint-WP incluyan públicamente su sitio o iglesia como sitios que usan TouchPoint-WP. Esto ayuda a otras iglesias potenciales a ver lo que se puede hacer al combinar WordPress con el mejor ChMS del planeta. Solo se aplica si este sitio es accesible en Internet público."
diff --git a/i18n/TouchPoint-WP.pot b/i18n/TouchPoint-WP.pot
index a748c21d..92ee09b7 100644
--- a/i18n/TouchPoint-WP.pot
+++ b/i18n/TouchPoint-WP.pot
@@ -2,197 +2,236 @@
# This file is distributed under the AGPLv3+.
msgid ""
msgstr ""
-"Project-Id-Version: TouchPoint WP 0.0.37\n"
+"Project-Id-Version: TouchPoint WP 0.0.95\n"
"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/TouchPoint-WP\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"POT-Creation-Date: 2024-02-07T14:00:10+00:00\n"
+"POT-Creation-Date: 2024-11-28T19:12:52+00:00\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"X-Generator: WP-CLI 2.8.1\n"
+"X-Generator: WP-CLI 2.11.0\n"
"X-Domain: TouchPoint-WP\n"
#. Plugin Name of the plugin
+#: touchpoint-wp.php
msgid "TouchPoint WP"
msgstr ""
#. Plugin URI of the plugin
+#: touchpoint-wp.php
msgid "https://github.com/tenthpres/touchpoint-wp"
msgstr ""
#. Description of the plugin
+#: touchpoint-wp.php
msgid "A WordPress Plugin for integrating with TouchPoint Church Management Software."
msgstr ""
#. Author of the plugin
+#: touchpoint-wp.php
msgid "James K"
msgstr ""
#. Author URI of the plugin
+#: touchpoint-wp.php
msgid "https://github.com/jkrrv"
msgstr ""
-#: src/templates/admin/invKoForm.php:17
+#: src/templates/admin/invKoForm.php:18
#: src/templates/admin/locationsKoForm.php:13
-#: src/templates/admin/locationsKoForm.php:50
+#: src/templates/admin/locationsKoForm.php:58
msgid "Delete"
msgstr ""
-#: src/templates/admin/invKoForm.php:23
+#: src/templates/admin/invKoForm.php:24
msgid "Singular Name"
msgstr ""
-#: src/templates/admin/invKoForm.php:31
+#: src/templates/admin/invKoForm.php:32
msgid "Plural Name"
msgstr ""
-#: src/templates/admin/invKoForm.php:39
+#: src/templates/admin/invKoForm.php:40
msgid "Slug"
msgstr ""
-#: src/templates/admin/invKoForm.php:47
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:765
+#: src/templates/admin/invKoForm.php:48
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:977
msgid "Divisions to Import"
msgstr ""
#: src/templates/admin/invKoForm.php:60
-msgid "Import Hierarchically (Parent-Child Relationships)"
+msgid "Import Campuses"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:63
+#: src/templates/admin/invKoForm.php:149
+#: src/templates/admin/invKoForm.php:165
+#: src/templates/admin/invKoForm.php:318
+#: src/templates/parts/involvement-nearby-list.php:2
+#: src/TouchPoint-WP/Meeting.php:746
+#: src/TouchPoint-WP/Rsvp.php:75
+#: assets/js/base-defer.js:192
+#: assets/js/base-defer.js:1133
+msgid "Loading..."
msgstr ""
#: src/templates/admin/invKoForm.php:67
-msgid "Import Images from TouchPoint"
+msgid "All Campuses"
msgstr ""
#: src/templates/admin/invKoForm.php:71
+msgid "(No Campus)"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:84
+msgid "Import Hierarchically (Parent-Child Relationships)"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:91
+msgid "Import Images from TouchPoint"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:95
msgid "Importing images sometimes conflicts with other plugins. Disabling image imports can help."
msgstr ""
-#: src/templates/admin/invKoForm.php:77
+#: src/templates/admin/invKoForm.php:102
+msgid "Import All Meetings to Calendar"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:110
msgid "Use Geographic Location"
msgstr ""
-#: src/templates/admin/invKoForm.php:83
+#: src/templates/admin/invKoForm.php:116
msgid "Exclude Involvements if"
msgstr ""
-#: src/templates/admin/invKoForm.php:87
+#: src/templates/admin/invKoForm.php:120
msgid "Involvement is Closed"
msgstr ""
-#: src/templates/admin/invKoForm.php:91
+#: src/templates/admin/invKoForm.php:124
msgid "Involvement is a Child Involvement"
msgstr ""
-#: src/templates/admin/invKoForm.php:95
+#: src/templates/admin/invKoForm.php:128
msgid "Based on Involvement setting in TouchPoint"
msgstr ""
-#: src/templates/admin/invKoForm.php:95
+#: src/templates/admin/invKoForm.php:128
msgid "Involvement does not meet weekly"
msgstr ""
-#: src/templates/admin/invKoForm.php:99
+#: src/templates/admin/invKoForm.php:132
msgid "Involvement does not have a Schedule"
msgstr ""
-#: src/templates/admin/invKoForm.php:103
+#: src/templates/admin/invKoForm.php:136
msgid "Involvement has a registration type of \"No Online Registration\""
msgstr ""
-#: src/templates/admin/invKoForm.php:107
+#: src/templates/admin/invKoForm.php:140
msgid "Involvement registration has ended (end date is past)"
msgstr ""
-#: src/templates/admin/invKoForm.php:113
+#: src/templates/admin/invKoForm.php:146
msgid "Leader Member Types"
msgstr ""
-#: src/templates/admin/invKoForm.php:116
-#: src/templates/admin/invKoForm.php:132
-#: src/templates/admin/invKoForm.php:258
-#: src/templates/parts/involvement-nearby-list.php:2
-#: src/TouchPoint-WP/Rsvp.php:77
-#: assets/js/base-defer.js:188
-#: assets/js/base-defer.js:1119
-msgid "Loading..."
-msgstr ""
-
-#: src/templates/admin/invKoForm.php:128
+#: src/templates/admin/invKoForm.php:161
msgid "Host Member Types"
msgstr ""
-#: src/templates/admin/invKoForm.php:144
+#: src/templates/admin/invKoForm.php:177
msgid "Default Grouping"
msgstr ""
-#: src/templates/admin/invKoForm.php:148
+#: src/templates/admin/invKoForm.php:181
msgid "No Grouping"
msgstr ""
-#: src/templates/admin/invKoForm.php:149
+#: src/templates/admin/invKoForm.php:182
msgid "Upcoming / Current"
msgstr ""
-#: src/templates/admin/invKoForm.php:150
+#: src/templates/admin/invKoForm.php:183
msgid "Current / Upcoming"
msgstr ""
-#: src/templates/admin/invKoForm.php:156
+#: src/templates/admin/invKoForm.php:191
msgid "Default Filters"
msgstr ""
-#: src/templates/admin/invKoForm.php:165
+#: src/templates/admin/invKoForm.php:197
+msgid "Division"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:204
+msgid "Resident Code"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:211
+msgid "Campus"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:223
msgid "Gender"
msgstr ""
-#: src/templates/admin/invKoForm.php:179
-#: src/TouchPoint-WP/Involvement.php:1445
-#: src/TouchPoint-WP/TouchPointWP.php:1445
+#: src/templates/admin/invKoForm.php:237
+#: src/TouchPoint-WP/Involvement.php:1853
+#: src/TouchPoint-WP/Taxonomies.php:750
msgid "Weekday"
msgstr ""
-#: src/templates/admin/invKoForm.php:183
-#: src/TouchPoint-WP/Involvement.php:1471
-#: src/TouchPoint-WP/TouchPointWP.php:1527
+#: src/templates/admin/invKoForm.php:241
+#: src/TouchPoint-WP/Involvement.php:1879
+#: src/TouchPoint-WP/Taxonomies.php:808
msgid "Time of Day"
msgstr ""
-#: src/templates/admin/invKoForm.php:187
+#: src/templates/admin/invKoForm.php:245
msgid "Prevailing Marital Status"
msgstr ""
-#: src/templates/admin/invKoForm.php:191
-#: src/TouchPoint-WP/TouchPointWP.php:1581
+#: src/templates/admin/invKoForm.php:249
+#: src/TouchPoint-WP/Taxonomies.php:837
msgid "Age Group"
msgstr ""
-#: src/templates/admin/invKoForm.php:196
+#: src/templates/admin/invKoForm.php:254
msgid "Task Owner"
msgstr ""
-#: src/templates/admin/invKoForm.php:203
+#: src/templates/admin/invKoForm.php:261
msgid "Contact Leader Task Keywords"
msgstr ""
-#: src/templates/admin/invKoForm.php:214
+#: src/templates/admin/invKoForm.php:272
msgid "Join Task Keywords"
msgstr ""
-#: src/templates/admin/invKoForm.php:230
+#: src/templates/admin/invKoForm.php:288
msgid "Add Involvement Post Type"
msgstr ""
-#: src/templates/admin/invKoForm.php:237
+#: src/templates/admin/invKoForm.php:295
msgid "Small Group"
msgstr ""
-#: src/templates/admin/invKoForm.php:238
+#: src/templates/admin/invKoForm.php:296
msgid "Small Groups"
msgstr ""
-#: src/templates/admin/invKoForm.php:368
+#: src/templates/admin/invKoForm.php:405
+msgid "(named person)"
+msgstr ""
+
+#: src/templates/admin/invKoForm.php:442
msgid "Select..."
msgstr ""
@@ -209,28 +248,43 @@ msgid "Longitude"
msgstr ""
#: src/templates/admin/locationsKoForm.php:43
+msgid "Radius (miles)"
+msgstr ""
+
+#: src/templates/admin/locationsKoForm.php:51
msgid "Static IP Addresses"
msgstr ""
-#: src/templates/admin/locationsKoForm.php:46
+#: src/templates/admin/locationsKoForm.php:54
msgid "If this Location has an internet connection with Static IP Addresses, you can put those addresses here so users are automatically identified with this location."
msgstr ""
-#: src/templates/admin/locationsKoForm.php:54
+#: src/templates/admin/locationsKoForm.php:62
msgid "Add IP Address"
msgstr ""
-#: src/templates/admin/locationsKoForm.php:64
+#: src/templates/admin/locationsKoForm.php:72
msgid "Add Location"
msgstr ""
-#: src/templates/admin/locationsKoForm.php:71
+#: src/templates/admin/locationsKoForm.php:79
msgid "The Campus"
msgstr ""
+#. Translators: %s is the singular name of the of a Meeting, such as "Event".
+#: src/templates/involvement-single.php:49
+msgid "This %s has been Cancelled."
+msgstr ""
+
+#: src/templates/meeting-archive.php:27
+#: src/TouchPoint-WP/Meeting.php:269
+msgctxt "What Meetings should be called, plural."
+msgid "Events"
+msgstr ""
+
#. translators: %s will be the plural post type (e.g. Small Groups)
#: src/templates/parts/involvement-list-none.php:16
-#: src/TouchPoint-WP/Involvement.php:1682
+#: src/TouchPoint-WP/Involvement.php:2099
msgid "No %s Found."
msgstr ""
@@ -241,1189 +295,1532 @@ msgstr ""
#. translators: number of miles
#: src/templates/parts/involvement-nearby-list.php:10
-#: src/TouchPoint-WP/Involvement.php:2803
+#: src/TouchPoint-WP/Involvement.php:3577
msgctxt "miles. Unit is appended to a number. %2.1f is the number, so %2.1fmi looks like '12.3mi'"
msgid "%2.1fmi"
msgstr ""
#. translators: %s is "what you call TouchPoint at your church", which is a setting
-#: src/TouchPoint-WP/Auth.php:140
+#: src/TouchPoint-WP/Auth.php:142
msgid "Sign in with your %s account"
msgstr ""
-#: src/TouchPoint-WP/Auth.php:402
+#: src/TouchPoint-WP/Auth.php:410
msgid "Your login token expired."
msgstr ""
-#: src/TouchPoint-WP/Auth.php:417
+#: src/TouchPoint-WP/Auth.php:425
msgid "Your login token is invalid."
msgstr ""
-#: src/TouchPoint-WP/Auth.php:429
+#: src/TouchPoint-WP/Auth.php:437
msgid "Session could not be validated."
msgstr ""
-#: src/TouchPoint-WP/EventsCalendar.php:59
+#. Translators: %s is the singular name of the of a Meeting, such as "Event".
+#: src/TouchPoint-WP/CalendarGrid.php:189
+msgid "%s is cancelled."
+msgstr ""
+
+#. Translators: %s is the plural name of the of the Meetings, such as "Events".
+#: src/TouchPoint-WP/CalendarGrid.php:269
+msgid "There are no %s published for this month."
+msgstr ""
+
+#: src/TouchPoint-WP/EventsCalendar.php:77
msgid "Recurring"
msgstr ""
-#: src/TouchPoint-WP/EventsCalendar.php:62
+#: src/TouchPoint-WP/EventsCalendar.php:80
+#: src/TouchPoint-WP/EventsCalendar.php:297
msgid "Multi-Day"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:441
+#: src/TouchPoint-WP/Involvement.php:136
+msgid "Creating an Involvement object from an object without a post_id is not yet supported."
+msgstr ""
+
+#: src/TouchPoint-WP/Involvement.php:495
msgid "Currently Full"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:445
+#: src/TouchPoint-WP/Involvement.php:500
msgid "Currently Closed"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:451
+#: src/TouchPoint-WP/Involvement.php:507
msgid "Registration Not Open Yet"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:456
+#: src/TouchPoint-WP/Involvement.php:513
msgid "Registration Closed"
msgstr ""
-#. translators: "Mon at 7pm" or "Sundays at 9am & 11am"
-#: src/TouchPoint-WP/Involvement.php:712
-#: src/TouchPoint-WP/Involvement.php:732
+#. translators: %1$s is the date(s), %2$s is the time(s).
+#: src/TouchPoint-WP/Involvement.php:995
+#: src/TouchPoint-WP/Involvement.php:1027
+#: src/TouchPoint-WP/Involvement.php:1120
+#: src/TouchPoint-WP/Involvement.php:1144
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:71
+#: src/TouchPoint-WP/Utilities/DateFormats.php:288
+#: src/TouchPoint-WP/Utilities/DateFormats.php:352
msgid "%1$s at %2$s"
msgstr ""
+#. translators: "Mon All Day" or "Sundays All Day"
+#: src/TouchPoint-WP/Involvement.php:998
+#: src/TouchPoint-WP/Involvement.php:1021
+msgid "%1$s All Day"
+msgstr ""
+
+#: src/TouchPoint-WP/Involvement.php:1022
+msgid "All Day"
+msgstr ""
+
#. translators: {start date} through {end date} e.g. February 14 through August 12
-#: src/TouchPoint-WP/Involvement.php:741
+#: src/TouchPoint-WP/Involvement.php:1036
msgid "%1$s through %2$s"
msgstr ""
#. translators: {schedule}, {start date} through {end date} e.g. Sundays at 11am, February 14 through August 12
-#: src/TouchPoint-WP/Involvement.php:748
+#: src/TouchPoint-WP/Involvement.php:1045
msgid "%1$s, %2$s through %3$s"
msgstr ""
#. translators: Starts {start date} e.g. Starts September 15
-#: src/TouchPoint-WP/Involvement.php:758
+#: src/TouchPoint-WP/Involvement.php:1054
msgid "Starts %1$s"
msgstr ""
#. translators: {schedule}, starting {start date} e.g. Sundays at 11am, starting February 14
-#: src/TouchPoint-WP/Involvement.php:764
+#: src/TouchPoint-WP/Involvement.php:1062
msgid "%1$s, starting %2$s"
msgstr ""
#. translators: Through {end date} e.g. Through September 15
-#: src/TouchPoint-WP/Involvement.php:773
+#: src/TouchPoint-WP/Involvement.php:1070
msgid "Through %1$s"
msgstr ""
#. translators: {schedule}, through {end date} e.g. Sundays at 11am, through February 14
-#: src/TouchPoint-WP/Involvement.php:779
+#: src/TouchPoint-WP/Involvement.php:1078
msgid "%1$s, through %2$s"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1318
-#: src/TouchPoint-WP/Partner.php:749
+#: src/TouchPoint-WP/Involvement.php:1728
+#: src/TouchPoint-WP/Partner.php:814
msgid "Any"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1377
+#: src/TouchPoint-WP/Involvement.php:1785
msgid "Genders"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1420
+#: src/TouchPoint-WP/Involvement.php:1828
msgid "Language"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1493
-#: src/TouchPoint-WP/TouchPointWP.php:1620
+#: src/TouchPoint-WP/Involvement.php:1901
+#: src/TouchPoint-WP/Taxonomies.php:869
msgid "Marital Status"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1494
+#: src/TouchPoint-WP/Involvement.php:1902
msgctxt "Marital status for a group of people"
msgid "Mostly Single"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1495
+#: src/TouchPoint-WP/Involvement.php:1903
msgctxt "Marital status for a group of people"
msgid "Mostly Married"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1506
+#: src/TouchPoint-WP/Involvement.php:1914
msgid "Age"
msgstr ""
#. translators: %s is for the user-provided term for the items on the map (e.g. Small Group or Partner)
-#: src/TouchPoint-WP/Involvement.php:1528
-#: src/TouchPoint-WP/Partner.php:771
+#: src/TouchPoint-WP/Involvement.php:1936
+#: src/TouchPoint-WP/Partner.php:838
msgid "The %s listed are only those shown on the map."
msgstr ""
#. translators: %s is the link to "reset the map"
-#: src/TouchPoint-WP/Involvement.php:1536
-#: src/TouchPoint-WP/Partner.php:787
+#: src/TouchPoint-WP/Involvement.php:1944
+#: src/TouchPoint-WP/Partner.php:854
msgid "Zoom out or %s to see more."
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1539
-#: src/TouchPoint-WP/Partner.php:790
+#: src/TouchPoint-WP/Involvement.php:1947
+#: src/TouchPoint-WP/Partner.php:857
msgctxt "Zoom out or reset the map to see more."
msgid "reset the map"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1628
+#: src/TouchPoint-WP/Involvement.php:2040
msgid "This involvement type doesn't exist."
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1638
+#: src/TouchPoint-WP/Involvement.php:2050
msgid "This involvement type doesn't have geographic locations enabled."
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:1657
+#: src/TouchPoint-WP/Involvement.php:2069
msgid "Could not locate."
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2776
+#: src/TouchPoint-WP/Involvement.php:3556
msgid "Men Only"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2779
+#: src/TouchPoint-WP/Involvement.php:3559
msgid "Women Only"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2842
+#: src/TouchPoint-WP/Involvement.php:3636
msgid "Contact Leaders"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2850
+#: src/TouchPoint-WP/Involvement.php:3653
+#: src/TouchPoint-WP/Partner.php:1318
+msgid "Show on Map"
+msgstr ""
+
+#. Translators: %s is the system name. "TouchPoint" by default.
+#: src/TouchPoint-WP/Involvement.php:3665
+msgid "Involvement in %s"
+msgstr ""
+
+#: src/TouchPoint-WP/Involvement.php:3706
+#: src/TouchPoint-WP/Involvement.php:3765
msgid "Register"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2855
+#: src/TouchPoint-WP/Involvement.php:3712
msgid "Create Account"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2859
+#: src/TouchPoint-WP/Involvement.php:3716
msgid "Schedule"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2864
+#: src/TouchPoint-WP/Involvement.php:3721
msgid "Give"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2867
+#: src/TouchPoint-WP/Involvement.php:3724
msgid "Manage Subscriptions"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2870
+#: src/TouchPoint-WP/Involvement.php:3727
msgid "Record Attendance"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2873
+#: src/TouchPoint-WP/Involvement.php:3730
msgid "Get Tickets"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2880
-#: assets/js/base-defer.js:987
+#: src/TouchPoint-WP/Involvement.php:3756
+#: assets/js/base-defer.js:1001
msgid "Join"
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2889
-#: src/TouchPoint-WP/Partner.php:1227
-msgid "Show on Map"
-msgstr ""
-
-#: src/TouchPoint-WP/Involvement.php:2941
-#: src/TouchPoint-WP/Involvement.php:3018
+#: src/TouchPoint-WP/Involvement.php:3861
+#: src/TouchPoint-WP/Involvement.php:3964
msgid "Invalid Post Type."
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:2995
-#: src/TouchPoint-WP/Person.php:1737
+#: src/TouchPoint-WP/Involvement.php:3941
+#: src/TouchPoint-WP/Person.php:1850
msgid "Contact Blocked for Spam."
msgstr ""
-#: src/TouchPoint-WP/Involvement.php:3005
-#: src/TouchPoint-WP/Person.php:1720
+#: src/TouchPoint-WP/Involvement.php:3951
+#: src/TouchPoint-WP/Person.php:1833
msgid "Contact Prohibited."
msgstr ""
-#: src/TouchPoint-WP/Meeting.php:91
-#: src/TouchPoint-WP/TouchPointWP.php:940
+#: src/TouchPoint-WP/Meeting.php:94
+msgid "Creating a Meeting object from an object without a post_id is not yet supported."
+msgstr ""
+
+#: src/TouchPoint-WP/Meeting.php:270
+msgctxt "What Meetings should be called, singular."
+msgid "Event"
+msgstr ""
+
+#: src/TouchPoint-WP/Meeting.php:422
+msgid "In the Past"
+msgstr ""
+
+#. Translators: %s is the system name. "TouchPoint" by default.
+#: src/TouchPoint-WP/Meeting.php:494
+msgid "Meeting in %s"
+msgstr ""
+
+#: src/TouchPoint-WP/Meeting.php:549
+msgid "Cancelled"
+msgstr ""
+
+#: src/TouchPoint-WP/Meeting.php:550
+msgid "Scheduled"
+msgstr ""
+
+#: src/TouchPoint-WP/Meeting.php:551
+msgctxt "Event Status is not a recognized value."
+msgid "Unknown"
+msgstr ""
+
+#: src/TouchPoint-WP/Meeting.php:672
+#: src/TouchPoint-WP/TouchPointWP.php:1033
msgid "Only GET requests are allowed."
msgstr ""
-#: src/TouchPoint-WP/Meeting.php:119
-#: src/TouchPoint-WP/TouchPointWP.php:369
+#: src/TouchPoint-WP/Meeting.php:700
+#: src/TouchPoint-WP/TouchPointWP.php:362
msgid "Only POST requests are allowed."
msgstr ""
-#: src/TouchPoint-WP/Meeting.php:129
-#: src/TouchPoint-WP/TouchPointWP.php:378
+#: src/TouchPoint-WP/Meeting.php:710
+#: src/TouchPoint-WP/TouchPointWP.php:371
msgid "Invalid data provided."
msgstr ""
+#: src/TouchPoint-WP/Meeting.php:745
+#: src/TouchPoint-WP/Meeting.php:766
+#: src/TouchPoint-WP/Rsvp.php:80
+msgid "RSVP"
+msgstr ""
+
#. translators: %s is for the user-provided "Global Partner" and "Secure Partner" terms.
-#: src/TouchPoint-WP/Partner.php:778
+#: src/TouchPoint-WP/Partner.php:845
msgid "The %1$s listed are only those shown on the map, as well as all %2$s."
msgstr ""
-#: src/TouchPoint-WP/Partner.php:1184
+#: src/TouchPoint-WP/Partner.php:1259
msgid "Not Shown on Map"
msgstr ""
-#: src/TouchPoint-WP/Person.php:149
+#: src/TouchPoint-WP/Person.php:150
msgid "No WordPress User ID provided for initializing a person object."
msgstr ""
-#: src/TouchPoint-WP/Person.php:641
+#: src/TouchPoint-WP/Person.php:642
msgid "TouchPoint People ID"
msgstr ""
-#: src/TouchPoint-WP/Person.php:1187
+#: src/TouchPoint-WP/Person.php:1192
msgid "Contact"
msgstr ""
-#: src/TouchPoint-WP/Person.php:1398
-#: src/TouchPoint-WP/Utilities.php:205
+#. Translators: %s is the system name. "TouchPoint" by default.
+#: src/TouchPoint-WP/Person.php:1200
+msgid "Person in %s"
+msgstr ""
+
+#: src/TouchPoint-WP/Person.php:1451
+#: src/TouchPoint-WP/Utilities.php:286
#: assets/js/base-defer.js:18
msgid "and"
msgstr ""
-#: src/TouchPoint-WP/Person.php:1404
+#: src/TouchPoint-WP/Person.php:1458
msgctxt "list of people, and *others*"
msgid "others"
msgstr ""
-#: src/TouchPoint-WP/Person.php:1541
+#: src/TouchPoint-WP/Person.php:1597
msgid "Registration Blocked for Spam."
msgstr ""
-#: src/TouchPoint-WP/Person.php:1609
+#: src/TouchPoint-WP/Person.php:1688
msgid "You may need to sign in."
msgstr ""
-#: src/TouchPoint-WP/Report.php:170
+#: src/TouchPoint-WP/Report.php:177
msgid "TouchPoint Reports"
msgstr ""
-#: src/TouchPoint-WP/Report.php:171
+#: src/TouchPoint-WP/Report.php:178
msgid "TouchPoint Report"
msgstr ""
#. translators: Last updated date/time for a report. %1$s is the date. %2$s is the time.
-#: src/TouchPoint-WP/Report.php:301
+#: src/TouchPoint-WP/Report.php:417
msgid "Updated on %1$s at %2$s"
msgstr ""
-#: src/TouchPoint-WP/Rsvp.php:82
-msgid "RSVP"
-msgstr ""
-
-#: src/TouchPoint-WP/TouchPointWP.php:274
-msgid "Every 15 minutes"
-msgstr ""
-
#. translators: %s: taxonomy name, plural
-#: src/TouchPoint-WP/TouchPointWP.php:1225
+#: src/TouchPoint-WP/Taxonomies.php:51
msgid "Search %s"
msgstr ""
#. translators: %s: taxonomy name, plural
-#: src/TouchPoint-WP/TouchPointWP.php:1227
+#: src/TouchPoint-WP/Taxonomies.php:53
msgid "All %s"
msgstr ""
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1229
+#: src/TouchPoint-WP/Taxonomies.php:55
msgid "Edit %s"
msgstr ""
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1231
+#: src/TouchPoint-WP/Taxonomies.php:57
msgid "Update %s"
msgstr ""
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1233
+#: src/TouchPoint-WP/Taxonomies.php:59
msgid "Add New %s"
msgstr ""
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1235
+#: src/TouchPoint-WP/Taxonomies.php:61
msgid "New %s"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1252
+#: src/TouchPoint-WP/Taxonomies.php:658
msgid "Classify posts by their general locations."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1305
+#: src/TouchPoint-WP/Taxonomies.php:687
msgid "Classify posts by their church campus."
msgstr ""
#. translators: %s: taxonomy name, singular
-#: src/TouchPoint-WP/TouchPointWP.php:1357
+#: src/TouchPoint-WP/Taxonomies.php:718
msgid "Classify things by %s."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1444
+#: src/TouchPoint-WP/Taxonomies.php:749
msgid "Classify involvements by the day on which they meet."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1445
+#: src/TouchPoint-WP/Taxonomies.php:750
msgid "Weekdays"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1482
+#: src/TouchPoint-WP/Taxonomies.php:776
msgid "Classify involvements by tense (present, future, past)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1483
+#: src/TouchPoint-WP/Taxonomies.php:780
msgid "Tense"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1483
+#: src/TouchPoint-WP/Taxonomies.php:780
msgid "Tenses"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1526
+#: src/TouchPoint-WP/Taxonomies.php:803
msgid "Classify involvements by the portion of the day in which they meet."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1527
+#: src/TouchPoint-WP/Taxonomies.php:809
msgid "Times of Day"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1580
+#: src/TouchPoint-WP/Taxonomies.php:835
msgid "Classify involvements and users by their age groups."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1581
+#: src/TouchPoint-WP/Taxonomies.php:838
msgid "Age Groups"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1619
+#: src/TouchPoint-WP/Taxonomies.php:864
msgid "Classify involvements by whether participants are mostly single or married."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1620
+#: src/TouchPoint-WP/Taxonomies.php:870
msgid "Marital Statuses"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:1664
+#: src/TouchPoint-WP/Taxonomies.php:903
msgid "Classify Partners by category chosen in settings."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2431
+#: src/TouchPoint-WP/TouchPointWP.php:266
+msgid "Every 15 minutes"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP.php:2031
msgid "Unknown Type"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2488
+#: src/TouchPoint-WP/TouchPointWP.php:2088
msgid "Your Searches"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2491
+#: src/TouchPoint-WP/TouchPointWP.php:2091
msgid "Public Searches"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2494
+#: src/TouchPoint-WP/TouchPointWP.php:2094
msgid "Status Flags"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2499
-#: src/TouchPoint-WP/TouchPointWP.php:2500
+#: src/TouchPoint-WP/TouchPointWP.php:2099
+#: src/TouchPoint-WP/TouchPointWP.php:2100
msgid "Current Value"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2628
-#: src/TouchPoint-WP/TouchPointWP.php:2668
+#: src/TouchPoint-WP/TouchPointWP.php:2217
+#: src/TouchPoint-WP/TouchPointWP.php:2253
msgid "Invalid or incomplete API Settings."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2636
-#: src/TouchPoint-WP/TouchPointWP.php:2675
+#: src/TouchPoint-WP/TouchPointWP.php:2267
+#: src/TouchPoint-WP/TouchPointWP.php:2311
msgid "Host appears to be missing from TouchPoint-WP configuration."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2736
+#: src/TouchPoint-WP/TouchPointWP.php:2384
msgid "The scripts on TouchPoint that interact with this plugin are out-of-date, and an automatic update failed."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP.php:2795
+#: src/TouchPoint-WP/TouchPointWP.php:2443
msgid "People Query Failed"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:205
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:257
msgid "Basic Settings"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:206
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:258
msgid "Connect to TouchPoint and choose which features you wish to use."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:210
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:262
msgid "Enable Authentication"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:211
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:263
msgid "Allow TouchPoint users to sign into this website with TouchPoint."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:221
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:274
msgid "Enable RSVP Tool"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:222
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:275
msgid "Add a crazy-simple RSVP button to WordPress event pages."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:228
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:282
msgid "Enable Involvements"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:229
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:283
msgid "Load Involvements from TouchPoint for involvement listings and entries native in your website."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:238
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:293
+msgid "Enable Meeting Calendar"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:294
+msgid "Load Meetings from TouchPoint for a calendar, native in your website."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:304
msgid "Enable Public People Lists"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:239
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:305
msgid "Import public people listings from TouchPoint (e.g. staff or elders)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:248
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:315
msgid "Enable Global Partner Listings"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:249
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:316
msgid "Import ministry partners from TouchPoint to list publicly."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:258
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:326
msgid "Enable Campuses"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:259
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:327
msgid "Import campuses as a taxonomy. (You probably want to do this if you're multi-campus.)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:268
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:337
msgid "Display Name"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:269
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:338
msgid "What your church calls your TouchPoint database."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:279
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:348
msgid "TouchPoint Host Name"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:280
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:349
msgid "The domain for your TouchPoint database, without the https or any slashes."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:291
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:361
msgid "Custom Mobile App Deeplink Host Name"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:292
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:362
msgid "The domain for your mobile app deeplinks, without the https or any slashes. If you aren't using the custom mobile app, leave this blank."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:303
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:373
msgid "TouchPoint API Username"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:304
-msgid "The username of a user account in TouchPoint with API permissions."
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:374
+msgid "The username of a user account in TouchPoint with API permissions. It is strongly recommended that you create a separate person/user for this purpose, rather than using a staff member's account."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:314
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:385
msgid "TouchPoint API User Password"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:315
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:386
msgid "The password of a user account in TouchPoint with API permissions."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:326
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:398
msgid "TouchPoint API Script Name"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:327
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:399
msgid "The name of the Python script loaded into TouchPoint. Don't change this unless you know what you're doing."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:337
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:410
msgid "Google Maps Javascript API Key"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:338
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:411
msgid "Required for embedding maps."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:348
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:422
msgid "Google Maps Geocoding API Key"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:349
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:423
msgid "Optional. Allows for reverse geocoding of user locations."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:366
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:371
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:433
+msgid "ipapi.co API Key"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:434
+msgid "Optional. Allows for geolocation of user IP addresses. This generally will work without a key, but may be rate limited."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:444
+msgid "List Site in Directory"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:445
+msgid "Allow the TouchPoint-WP developers to publicly list your site/church as using TouchPoint-WP. Helps other prospective churches see what can be done by combining WordPress with the best ChMS on the planet. Only applies if this site is accessible on the public internet."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:463
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:468
msgid "Generate Scripts"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:369
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:466
msgid "Once your settings on this page are set and saved, use this tool to generate the scripts needed for TouchPoint in a convenient installation package."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:370
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:467
msgid "Upload the package to {tpName} here"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:387
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:484
msgid "People"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:388
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:485
msgid "Manage how people are synchronized between TouchPoint and WordPress."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:392
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:489
msgid "Contact Keywords"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:393
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:490
msgid "These keywords will be used when someone clicks the \"Contact\" button on a Person's listing or profile."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:404
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:501
msgid "Extra Value for WordPress User ID"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:405
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:502
msgid "The name of the extra value to use for the WordPress User ID. If you are using multiple WordPress instances with one TouchPoint database, you will need these values to be unique between WordPress instances. In most cases, the default is fine."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:415
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:512
msgid "Extra Value: Biography"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:416
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:513
msgid "Import a Bio from a Person Extra Value field. Can be an HTML or Text Extra Value. This will overwrite any values set by WordPress. Leave blank to not import."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:426
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:662
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:523
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:761
msgid "Extra Values to Import"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:427
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:524
msgid "Import People Extra Value fields as User Meta data."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:443
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:540
msgid "Authentication"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:444
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:541
msgid "Allow users to log into WordPress using TouchPoint."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:448
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:545
msgid "Make TouchPoint the default authentication method."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:449
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:546
msgid "By checking this box, the TouchPoint login page will become the default. To prevent the redirect and reach the standard WordPress login page, add 'tp_no_redirect' as a URL parameter."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:458
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:555
msgid "Enable Auto-Provisioning"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:459
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:556
msgid "Automatically create WordPress users, if needed, to match authenticated TouchPoint users."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:468
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:565
msgid "Change 'Edit Profile' links"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:469
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:566
msgid "\"Edit Profile\" links will take the user to their TouchPoint profile, instead of their WordPress profile."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:478
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:575
msgid "Enable full logout"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:479
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:576
msgid "Logout of TouchPoint when logging out of WordPress."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:485
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:582
msgid "Prevent Subscriber Admin Bar"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:486
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:583
msgid "By enabling this option, users who can't edit anything won't see the Admin bar."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:500
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:597
msgid "Involvements"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:501
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:598
msgid "Import Involvements from TouchPoint to list them on your website, for Small Groups, Classes, and more. Select the division(s) that immediately correspond to the type of Involvement you want to list. For example, if you want a Small Group list and have a Small Group Division, only select the Small Group Division. If you want Involvements to be filterable by additional Divisions, select those Divisions on the Divisions tab, not here."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:506
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:603
msgid "Involvement Post Types"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:535
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:633
msgid "Global Partners"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:536
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:634
msgid "Manage how global partners are imported from TouchPoint for listing on WordPress. Partners are grouped by family, and content is provided through Family Extra Values. This works for both People and Business records."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:540
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:638
msgid "Global Partner Name (Plural)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:541
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:639
msgid "What you call Global Partners at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:551
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:649
msgid "Global Partner Name (Singular)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:552
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:650
msgid "What you call a Global Partner at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:562
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:660
msgid "Global Partner Name for Secure Places (Plural)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:563
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:661
msgid "What you call Secure Global Partners at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:573
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:671
msgid "Global Partner Name for Secure Places (Singular)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:574
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:672
msgid "What you call a Secure Global Partner at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:584
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:682
msgid "Global Partner Slug"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:585
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:683
msgid "The root path for Global Partner posts"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:596
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:695
msgid "Saved Search"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:597
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:696
msgid "Anyone who is included in this saved search will be included in the listing."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:607
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:706
msgid "Extra Value: Description"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:608
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:707
msgid "Import a description from a Family Extra Value field. Can be an HTML or Text Extra Value. This becomes the body of the Global Partner post."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:618
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:717
msgid "Extra Value: Summary"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:619
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:718
msgid "Optional. Import a short description from a Family Extra Value field. Can be an HTML or Text Extra Value. If not provided, the full bio will be truncated."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:629
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:728
msgid "Latitude Override"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:630
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:729
msgid "Designate a text Family Extra Value that will contain a latitude that overrides any locations on the partner's profile for the partner map. Both latitude and longitude must be provided for an override to take place."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:640
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:739
msgid "Longitude Override"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:641
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:740
msgid "Designate a text Family Extra Value that will contain a longitude that overrides any locations on the partner's profile for the partner map. Both latitude and longitude must be provided for an override to take place."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:651
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:750
msgid "Public Location"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:652
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:751
msgid "Designate a text Family Extra Value that will contain the partner's location, as you want listed publicly. For partners who have DecoupleLocation enabled, this field will be associated with the map point, not the list entry."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:663
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:762
msgid "Import Family Extra Value fields as Meta data on the partner's post"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:674
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:773
msgid "Primary Taxonomy"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:675
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:774
msgid "Import a Family Extra Value as the primary means by which partners are organized."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:690
-msgid "Events Calendar"
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:791
+msgid "Events Calendar plugin by Modern Tribe"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:691
-msgid "Integrate with The Events Calendar from ModernTribe."
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:795
+msgid "TouchPoint Meetings"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:695
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:801
+msgid "App 2.0 Calendar"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:802
+msgid "Integrate Custom Mobile app version 2.0 with The Events Calendar from Modern Tribe."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:806
+msgid "Events Provider"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:807
+msgid "The source of events for version 2.0 of the Custom Mobile App."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:817
msgid "Events for Custom Mobile App"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:698
-msgid "To use your Events Calendar events in the Custom mobile app, set the Provider to Wordpress Plugin - Modern Tribe and use this url:"
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:820
+msgid "To use your Events Calendar events in the Custom mobile app, set the Provider to Wordpress Plugin - Modern Tribe (regardless of which provider you're using above) and use this url:"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:700
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:822
msgid "Preview"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:715
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:837
msgid "Use Standardizing Stylesheet"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:716
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:838
msgid "Inserts some basic CSS into the events feed to clean up display"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:726
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:850
+msgid "Meeting Calendars"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:851
+msgid "Import Meetings from TouchPoint to a calendar on your website."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:855
+msgid "Meeting Name (Plural)"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:856
+msgid "What you call Meetings at your church"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:861
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:863
+msgid "Meetings"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:861
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:863
+msgid "Events"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:867
+msgid "Meeting Name (Singular)"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:868
+msgid "What you call a Meeting at your church"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:873
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:875
+msgid "Meeting"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:873
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:875
+msgid "Event"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:879
+msgid "Meetings Slug"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:880
+msgid "The root path for Meetings"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:892
+msgid "Days of Future"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:893
+msgid "Meetings more than this many days in the future will not be imported."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:905
+msgid "Archive After Days"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:906
+msgid "Meetings more than this many days in the past will no longer update from TouchPoint, allowing you to keep some historical event information on the calendar for reference, even if you reuse and update the information in the Involvement."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:918
+msgid "Days of History"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:919
+msgid "Meetings will be kept on the calendar until the event is this many days in the past. Once an event is older than this, it'll be deleted."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:935
msgid "Divisions"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:727
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:936
msgid "Import Divisions from TouchPoint to your website as a taxonomy. These are used to classify users and involvements."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:731
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:940
msgid "Division Name (Plural)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:732
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:941
msgid "What you call Divisions at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:742
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:952
msgid "Division Name (Singular)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:743
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:953
msgid "What you call a Division at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:753
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:964
msgid "Division Slug"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:754
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:965
msgid "The root path for the Division Taxonomy"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:766
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:978
msgid "These Divisions will be imported for the taxonomy"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:779
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:785
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:989
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1120
+msgid "Post Types"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:990
+msgid "Select post types which should have Divisions available as a native taxonomy."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1004
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1010
msgid "Locations"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:780
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1005
msgid "Locations are physical places, probably campuses. None are required, but they can help present geographic information clearly."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:804
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1029
msgid "Campuses"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:805
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1030
msgid "Import Campuses from TouchPoint to your website as a taxonomy. These are used to classify users and involvements."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:812
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1037
msgid "Campus Name (Plural)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:813
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1038
msgid "What you call Campuses at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:823
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1049
msgid "Campus Name (Singular)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:824
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1050
msgid "What you call a Campus at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:834
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1061
msgid "Campus Slug"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:835
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1062
msgid "The root path for the Campus Taxonomy"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:849
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1078
msgid "Resident Codes"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:850
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1079
msgid "Import Resident Codes from TouchPoint to your website as a taxonomy. These are used to classify users and involvements that have locations."
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:854
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1083
msgid "Resident Code Name (Plural)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:855
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1084
msgid "What you call Resident Codes at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:865
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1095
msgid "Resident Code Name (Singular)"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:866
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1096
msgid "What you call a Resident Code at your church"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:876
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1107
msgid "Resident Code Slug"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:877
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1108
msgid "The root path for the Resident Code Taxonomy"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1034
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1121
+msgid "Select post types which should have Resident Codes available as a native taxonomy."
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1284
msgid "password saved"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1090
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1091
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1338
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1339
msgid "TouchPoint-WP"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1122
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1387
msgid "Settings"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1351
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1627
msgid "Script Update Failed"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1470
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1749
msgid "TouchPoint-WP Settings"
msgstr ""
-#: src/TouchPoint-WP/TouchPointWP_Settings.php:1521
+#: src/TouchPoint-WP/TouchPointWP_Settings.php:1800
msgid "Save Settings"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:69
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:39
+msgid "TouchPoint-WP Status"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:96
+msgid "Imported"
+msgstr ""
+
+#: src/TouchPoint-WP/TouchPointWP_Widget.php:97
+msgid "Last Updated"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities.php:136
msgctxt "e.g. event happens weekly on..."
msgid "Sundays"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:70
+#: src/TouchPoint-WP/Utilities.php:137
msgctxt "e.g. event happens weekly on..."
msgid "Mondays"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:71
+#: src/TouchPoint-WP/Utilities.php:138
msgctxt "e.g. event happens weekly on..."
msgid "Tuesdays"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:72
+#: src/TouchPoint-WP/Utilities.php:139
msgctxt "e.g. event happens weekly on..."
msgid "Wednesdays"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:73
+#: src/TouchPoint-WP/Utilities.php:140
msgctxt "e.g. event happens weekly on..."
msgid "Thursdays"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:74
+#: src/TouchPoint-WP/Utilities.php:141
msgctxt "e.g. event happens weekly on..."
msgid "Fridays"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:75
+#: src/TouchPoint-WP/Utilities.php:142
msgctxt "e.g. event happens weekly on..."
msgid "Saturdays"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:111
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:188
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Sun"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:112
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:189
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Mon"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:113
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:190
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Tue"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:114
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:191
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Wed"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:115
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:192
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Thu"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:116
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:193
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Fri"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:117
-msgctxt "e.g. event happens weekly on..."
+#: src/TouchPoint-WP/Utilities.php:194
+msgctxt "e.g. \"Event happens weekly on...\" or \"This ...\""
msgid "Sat"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:161
+#: src/TouchPoint-WP/Utilities.php:236
msgctxt "Time of Day"
msgid "Late Night"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:163
+#: src/TouchPoint-WP/Utilities.php:238
msgctxt "Time of Day"
msgid "Early Morning"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:165
+#: src/TouchPoint-WP/Utilities.php:240
msgctxt "Time of Day"
msgid "Morning"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:167
+#: src/TouchPoint-WP/Utilities.php:242
msgctxt "Time of Day"
msgid "Midday"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:169
+#: src/TouchPoint-WP/Utilities.php:244
msgctxt "Time of Day"
msgid "Afternoon"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:171
+#: src/TouchPoint-WP/Utilities.php:246
msgctxt "Time of Day"
msgid "Evening"
msgstr ""
-#: src/TouchPoint-WP/Utilities.php:173
+#: src/TouchPoint-WP/Utilities.php:248
msgctxt "Time of Day"
msgid "Night"
msgstr ""
-#: assets/js/base-defer.js:208
-#: assets/js/base-defer.js:1154
+#: src/TouchPoint-WP/Utilities.php:291
+msgctxt "list of items, and *others*"
+msgid "others"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities.php:497
+msgid "Expand"
+msgstr ""
+
+#. translators: %1$s is the start date/time, %2$s is the end date/time.
+#: src/TouchPoint-WP/Utilities/DateFormats.php:89
+#: src/TouchPoint-WP/Utilities/DateFormats.php:331
+msgid "%1$s – %2$s"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:119
+#: src/TouchPoint-WP/Utilities/DateFormats.php:194
+msgid "Tonight"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:121
+#: src/TouchPoint-WP/Utilities/DateFormats.php:196
+msgid "Today"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:128
+#: src/TouchPoint-WP/Utilities/DateFormats.php:203
+msgid "Tomorrow"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:130
+#: src/TouchPoint-WP/Utilities/DateFormats.php:205
+msgid "Yesterday"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:137
+msgctxt "Date string for day of the week, when the year is current."
+msgid "l"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:138
+msgctxt "Date string when the year is current."
+msgid "F j"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:140
+msgctxt "Date string for day of the week, when the year is not current."
+msgid "l"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:141
+msgctxt "Date string when the year is not current."
+msgid "F j, Y"
+msgstr ""
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:147
+msgctxt "Date format string"
+msgid "Last %1$s, %2$s"
+msgstr ""
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:153
+msgctxt "Date format string"
+msgid "This %1$s, %2$s"
+msgstr ""
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:159
+msgctxt "Date format string"
+msgid "Next %1$s, %2$s"
+msgstr ""
+
+#. translators: %1$s is "Monday". %2$s is "January 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:164
+msgctxt "Date format string"
+msgid "%1$s, %2$s"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:211
+msgctxt "Short date string for day of the week, when the year is current."
+msgid "D"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:212
+msgctxt "Short date string when the year is current."
+msgid "M j"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:214
+msgctxt "Short date string for day of the week, when the year is not current."
+msgid "D"
+msgstr ""
+
+#: src/TouchPoint-WP/Utilities/DateFormats.php:215
+msgctxt "Short date string when the year is not current."
+msgid "M j, Y"
+msgstr ""
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:221
+msgctxt "Short date format string"
+msgid "Last %1$s, %2$s"
+msgstr ""
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:227
+msgctxt "Short date format string"
+msgid "This %1$s, %2$s"
+msgstr ""
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:233
+msgctxt "Short date format string"
+msgid "Next %1$s, %2$s"
+msgstr ""
+
+#. translators: %1$s is "Mon". %2$s is "Jan 1".
+#: src/TouchPoint-WP/Utilities/DateFormats.php:238
+msgctxt "Short date format string"
+msgid "%1$s, %2$s"
+msgstr ""
+
+#. translators: %1$s is the start date, %2$s start time, %3$s is the end date, and %4$s end time.
+#: src/TouchPoint-WP/Utilities/DateFormats.php:364
+msgid "%1$s at %2$s – %3$s at %4$s"
+msgstr ""
+
+#: assets/js/base-defer.js:212
+#: assets/js/base-defer.js:1168
msgid "Your Location"
msgstr ""
-#: assets/js/base-defer.js:229
+#: assets/js/base-defer.js:233
msgid "User denied the request for Geolocation."
msgstr ""
-#: assets/js/base-defer.js:233
+#: assets/js/base-defer.js:237
msgid "Location information is unavailable."
msgstr ""
-#: assets/js/base-defer.js:237
+#: assets/js/base-defer.js:241
msgid "The request to get user location timed out."
msgstr ""
-#: assets/js/base-defer.js:241
+#: assets/js/base-defer.js:245
msgid "An unknown error occurred."
msgstr ""
-#: assets/js/base-defer.js:277
-#: assets/js/base-defer.js:287
+#: assets/js/base-defer.js:281
+#: assets/js/base-defer.js:291
msgid "No geolocation option available."
msgstr ""
#. translators: %s is the name of an involvement, like a particular small group
-#: assets/js/base-defer.js:906
+#: assets/js/base-defer.js:920
msgid "Added to %s"
msgstr ""
-#: assets/js/base-defer.js:909
-#: assets/js/base-defer.js:920
-#: assets/js/base-defer.js:946
-#: assets/js/base-defer.js:957
-#: assets/js/base-defer.js:1403
-#: assets/js/base-defer.js:1414
-#: assets/js/meeting-defer.js:175
-#: assets/js/meeting-defer.js:186
+#: assets/js/base-defer.js:923
+#: assets/js/base-defer.js:934
+#: assets/js/base-defer.js:960
+#: assets/js/base-defer.js:971
+#: assets/js/base-defer.js:1417
+#: assets/js/base-defer.js:1428
+#: assets/js/meeting-defer.js:174
+#: assets/js/meeting-defer.js:185
msgid "OK"
msgstr ""
-#: assets/js/base-defer.js:917
-#: assets/js/base-defer.js:954
-#: assets/js/base-defer.js:1411
-#: assets/js/meeting-defer.js:183
+#: assets/js/base-defer.js:931
+#: assets/js/base-defer.js:968
+#: assets/js/base-defer.js:1425
+#: assets/js/meeting-defer.js:182
msgid "Something strange happened."
msgstr ""
-#: assets/js/base-defer.js:943
-#: assets/js/base-defer.js:1400
+#: assets/js/base-defer.js:957
+#: assets/js/base-defer.js:1414
msgid "Your message has been sent."
msgstr ""
#. translators: %s is the name of an Involvement
-#: assets/js/base-defer.js:967
+#: assets/js/base-defer.js:981
msgid "Join %s"
msgstr ""
-#: assets/js/base-defer.js:983
+#: assets/js/base-defer.js:997
msgid "Who is joining the group?"
msgstr ""
-#: assets/js/base-defer.js:988
-#: assets/js/base-defer.js:1046
-#: assets/js/base-defer.js:1362
-#: assets/js/base-defer.js:1455
-#: assets/js/meeting-defer.js:225
+#: assets/js/base-defer.js:1002
+#: assets/js/base-defer.js:1060
+#: assets/js/base-defer.js:1376
+#: assets/js/base-defer.js:1469
+#: assets/js/meeting-defer.js:224
msgid "Cancel"
msgstr ""
-#: assets/js/base-defer.js:1001
+#: assets/js/base-defer.js:1015
msgid "Select who should be added to the group."
msgstr ""
#. translators: %s is the name of an involvement. This is a heading for a modal.
-#: assets/js/base-defer.js:1022
+#: assets/js/base-defer.js:1036
msgid "Contact the Leaders of %s"
msgstr ""
-#: assets/js/base-defer.js:1039
-#: assets/js/base-defer.js:1355
+#: assets/js/base-defer.js:1053
+#: assets/js/base-defer.js:1369
msgid "From"
msgstr ""
-#: assets/js/base-defer.js:1040
-#: assets/js/base-defer.js:1356
+#: assets/js/base-defer.js:1054
+#: assets/js/base-defer.js:1370
msgid "Message"
msgstr ""
-#: assets/js/base-defer.js:1045
-#: assets/js/base-defer.js:1361
+#: assets/js/base-defer.js:1059
+#: assets/js/base-defer.js:1375
msgid "Send"
msgstr ""
-#: assets/js/base-defer.js:1055
-#: assets/js/base-defer.js:1371
+#: assets/js/base-defer.js:1069
+#: assets/js/base-defer.js:1385
msgid "Please provide a message."
msgstr ""
-#: assets/js/base-defer.js:1140
-#: assets/js/base-defer.js:1142
+#: assets/js/base-defer.js:1154
+#: assets/js/base-defer.js:1156
msgid "We don't know where you are."
msgstr ""
-#: assets/js/base-defer.js:1140
-#: assets/js/base-defer.js:1150
+#: assets/js/base-defer.js:1154
+#: assets/js/base-defer.js:1164
msgid "Click here to use your actual location."
msgstr ""
-#: assets/js/base-defer.js:1301
-#: assets/js/base-defer.js:1318
+#: assets/js/base-defer.js:1315
+#: assets/js/base-defer.js:1332
msgid "clear"
msgstr ""
-#: assets/js/base-defer.js:1307
+#: assets/js/base-defer.js:1321
msgid "Other Relatives..."
msgstr ""
#. translators: %s is a person's name. This is a heading for a contact modal.
-#: assets/js/base-defer.js:1338
+#: assets/js/base-defer.js:1352
msgid "Contact %s"
msgstr ""
-#: assets/js/base-defer.js:1445
+#: assets/js/base-defer.js:1459
msgid "Tell us about yourself."
msgstr ""
-#: assets/js/base-defer.js:1447
-#: assets/js/base-defer.js:1502
+#: assets/js/base-defer.js:1461
+#: assets/js/base-defer.js:1516
msgid "Email Address"
msgstr ""
-#: assets/js/base-defer.js:1448
-#: assets/js/base-defer.js:1503
+#: assets/js/base-defer.js:1462
+#: assets/js/base-defer.js:1517
msgid "Zip Code"
msgstr ""
-#: assets/js/base-defer.js:1454
+#: assets/js/base-defer.js:1468
msgid "Next"
msgstr ""
-#: assets/js/base-defer.js:1488
+#: assets/js/base-defer.js:1502
msgid "Something went wrong."
msgstr ""
-#: assets/js/base-defer.js:1500
+#: assets/js/base-defer.js:1514
msgid "Our system doesn't recognize you, so we need a little more info."
msgstr ""
-#: assets/js/base-defer.js:1504
+#: assets/js/base-defer.js:1518
msgid "First Name"
msgstr ""
-#: assets/js/base-defer.js:1505
+#: assets/js/base-defer.js:1519
msgid "Last Name"
msgstr ""
-#: assets/js/base-defer.js:1507
+#: assets/js/base-defer.js:1521
msgid "Phone"
msgstr ""
@@ -1431,49 +1828,49 @@ msgstr ""
msgid "Event Past"
msgstr ""
-#: assets/js/meeting-defer.js:172
+#: assets/js/meeting-defer.js:171
msgid "Response Recorded"
msgid_plural "Responses Recorded"
msgstr[0] ""
msgstr[1] ""
#. translators: "RSVP for {Event Name}" This is the heading on the RSVP modal. The event name isn't translated because it comes from TouchPoint.
-#: assets/js/meeting-defer.js:205
+#: assets/js/meeting-defer.js:204
msgid "RSVP for %s"
msgstr ""
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "Who is coming?"
msgstr ""
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "Indicate who is or is not coming. This will overwrite any existing RSVP."
msgstr ""
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "To avoid overwriting an existing RSVP, leave that person blank."
msgstr ""
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "To protect privacy, we won't show existing RSVPs here."
msgstr ""
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "Yes"
msgstr ""
-#: assets/js/meeting-defer.js:217
+#: assets/js/meeting-defer.js:216
msgid "No"
msgstr ""
-#: assets/js/meeting-defer.js:223
+#: assets/js/meeting-defer.js:222
msgid "Add Someone Else"
msgstr ""
-#: assets/js/meeting-defer.js:224
+#: assets/js/meeting-defer.js:223
msgid "Submit"
msgstr ""
-#: assets/js/meeting-defer.js:243
+#: assets/js/meeting-defer.js:242
msgid "Nothing to submit."
msgstr ""
diff --git a/package.json b/package.json
index c4f224cc..fef681e5 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "touchpoint-wp",
- "version": "0.0.37",
+ "version": "0.0.95",
"description": "A WordPress Plugin for integrating with TouchPoint Church Management Software.",
"directories": {
"doc": "docs"
diff --git a/phpdoc.xml b/phpdoc.dist.xml
similarity index 70%
rename from phpdoc.xml
rename to phpdoc.dist.xml
index 28923d91..97af9e7d 100644
--- a/phpdoc.xml
+++ b/phpdoc.dist.xml
@@ -1,14 +1,14 @@
+ TouchPoint WP.phpdoc/cache
-
+ src/TouchPoint-WP
@@ -17,10 +17,12 @@
phppublic
- false
+ trueTODO
+
+
\ No newline at end of file
diff --git a/src/TouchPoint-WP/Auth.php b/src/TouchPoint-WP/Auth.php
index a3feca0c..5c9c11b5 100644
--- a/src/TouchPoint-WP/Auth.php
+++ b/src/TouchPoint-WP/Auth.php
@@ -5,6 +5,7 @@
namespace tp\TouchPointWP;
+use Exception;
use tp\TouchPointWP\Utilities\Http;
use tp\TouchPointWP\Utilities\PersonQuery;
use tp\TouchPointWP\Utilities\Session;
@@ -16,7 +17,7 @@
}
/**
- * Allows users to login to WordPress with their TouchPoint credentials, and provides other user management
+ * Allows users to log in to WordPress with their TouchPoint credentials, and provides other user management
* functionality.
*/
abstract class Auth implements api, module
@@ -84,7 +85,7 @@ public static function load(): bool
if (is_admin()) {
try {
self::createApiKeyIfNeeded();
- } catch (TouchPointWP_Exception $e) {
+ } catch (TouchPointWP_Exception) {
}
}
@@ -132,18 +133,17 @@ public static function footer()
*/
public static function printLoginLink()
{
- $html = '
";
+
+ // Increment days
+ $mo1 = $d->format('n');
+ $oldDd = $d->format('d');
+ $d->add($aDay);
+ $d->setTimezone($tz);
+
+ // handle fall DST transitions.
+ while ($d->format('d') == $oldDd) {
+ $d->add($aDay);
+ $d->setTimezone($tz);
+ }
+
+ try {
+ $d = new DateTime($d->format('Y-m-d 00:00:00'), $tz);
+ $d2359 = new DateTime($d->format('Y-m-d 23:59:59'), $tz);
+ } catch (Exception) {
+ // unlikely to ever run, since the format is provided.
+ $d2359->add($aDay);
+ $d2359->setTimezone($tz);
+ }
+ $mo2 = $d->format('n');
+
+ if ($mo1 !== $mo2) {
+ if ($isMonthBefore) {
+ $isMonthBefore = false;
+ } else {
+ $isMonthAfter = true;
+ $lastDayOfMonth = $d;
+ }
+ }
+ } while (!$isMonthAfter || $d->format('w') !== '0');
+ $r .= '
';
+
+ if ($this->eventCount > 0) {
+ $this->html = $r;
+ } else {
+ // Translators: %s is the plural name of the of the Meetings, such as "Events".
+ $message = wp_sprintf(__("There are no %s published for this month.", "TouchPoint-WP"), TouchPointWP::instance()->settings->mc_name_plural);
+ $this->html = "
$message
";
+ }
+
+ $this->next = DateTimeImmutable::createFromMutable($lastDayOfMonth);
+ try {
+ $this->prev = $firstDayOfMonth->sub($aDay)->setTimezone($tz);
+ } catch (Exception) {
+ $this->prev = null;
+ }
+ }
+
+ /**
+ * Render the grid as HTML.
+ *
+ * @return string
+ */
+ public function __toString(): string
+ {
+ self::enqueueCalendarStyle();
+ return $this->html;
+ }
+
+ /**
+ * This function enqueues the stylesheet for the calendar grid.
+ */
+ public static function enqueueCalendarStyle(): void
+ {
+ wp_enqueue_style(
+ TouchPointWP::SHORTCODE_PREFIX . 'calendar-grid-style',
+ TouchPointWP::instance()->assets_url . 'template/calendar-grid-style.css',
+ [],
+ TouchPointWP::VERSION
+ );
+ }
+
+ /**
+ * This method returns a navigation bar for the calendar grid with simply next/prev month links.
+ *
+ * @param bool $withMonthName
+ * @param string $class
+ *
+ * @return string
+ */
+ public function navBar(bool $withMonthName = false, string $class=""): string
+ {
+ $r = "
";
+ $r .= "
";
+ $r .= $this->getPrevLink();
+ $r .= "
";
+
+ if ($withMonthName) {
+ $r .= "
";
+ $r .= "
$this->monthName
";
+ $r .= "
";
+ }
+
+ $r .= "
";
+ $r .= $this->getNextLink();
+ $r .= "
";
+ $r .= "
";
+
+ return $r;
+ }
+
+ /**
+ * Adjust a WP_Query object to filter only to events that overlap with the given day.
+ *
+ * @param WP_Query $q The original query object.
+ * @param DateTimeInterface $d1 The first day of the range.
+ * @param DateTimeInterface $d2 The last day of the range.
+ * @param DateTimeZone $tz The timezone to use.
+ *
+ * @return WP_Query
+ * @throws Exception
+ */
+ private static function adjustQueryForRange(WP_Query $q, DateTimeInterface $d1, DateTimeInterface $d2, DateTimeZone $tz): WP_Query
+ {
+ $q = clone $q;
+
+ $dStart = new DateTime($d1->format('Y-m-d 00:00:00'), $tz);
+ $dEnd = new DateTime($d2->format('Y-m-d 23:59:59'), $tz);
+
+ $existingMq = $q->get('meta_query');
+
+ $mq = [
+ [
+ 'key' => Meeting::MEETING_START_META_KEY,
+ 'value' => $dEnd->format('U'),
+ 'compare' => "<="
+ ],
+ [
+ [
+ 'key' => Meeting::MEETING_END_META_KEY,
+ 'value' => $dStart->format('U'),
+ 'compare' => ">="
+ ],
+ [ // This condition is to allow for the possibility of events without end times.
+ [
+ 'key' => Meeting::MEETING_END_META_KEY,
+ 'compare' => '=',
+ 'value' => 0
+ ],
+ [
+ 'key' => Meeting::MEETING_START_META_KEY,
+ 'value' => $dStart->format('U'),
+ 'compare' => ">"
+ ],
+ 'relation' => 'AND'
+ ],
+ 'relation' => 'OR'
+ ],
+ [
+ 'key' => Meeting::MEETING_META_KEY,
+ 'value' => 0,
+ 'compare' => ">"
+ ],
+ 'relation' => 'AND'
+ ];
+
+ if (!empty($existingMq)) {
+ $mq = [
+ 'relation' => 'AND',
+ $existingMq,
+ $mq,
+ ];
+ }
+
+ $q->set('meta_query', $mq);
+
+ $q->set('meta_key', Meeting::MEETING_START_META_KEY);
+ $q->set('orderby', 'meta_value');
+ $q->set('order', 'ASC');
+
+ $q->set('posts_per_page', 100000);
+ $q->set('posts_per_archive_page', 100000);
+
+ $q->set('post_type', Involvement_PostTypeSettings::getPostTypes());
+
+ return $q;
+ }
+
+
+ /**
+ * Get HTML for a link to the next month.
+ *
+ * @return string
+ */
+ public function getNextLink(): string
+ {
+ return self::getLinkForDate($this->next);
+ }
+
+ /**
+ * Get HTML for a link to the previous month.
+ *
+ * @return string
+ */
+ public function getPrevLink(): string
+ {
+ return self::getLinkForDate($this->prev);
+ }
+
+ /**
+ * Get an HTML link for the period that includes the given date. This ONLY provides the URL Parameter portion, and
+ * is only meant to facilitate the next/prev links.
+ *
+ * @param DateTimeInterface $date
+ *
+ * @return string
+ */
+ protected static function getLinkForDate(DateTimeInterface $date): string
+ {
+ $link = "?page=" . $date->format('m-Y');
+ $label = self::getMonthNameForDate($date);
+ return "$label";
+ }
+
+ /**
+ * Get the name of the month for a given date, with the year if different from current year.
+ *
+ * @param DateTimeInterface $date
+ *
+ * @return string
+ */
+ protected static function getMonthNameForDate(DateTimeInterface $date): string
+ {
+ $ts = DateFormats::timestampWithoutOffset($date);
+ if ($date->format('Y') === Utilities::dateTimeNow()->format('Y')) {
+ $label = wp_date('F', $ts);
+ } else {
+ $label = wp_date('F Y', $ts);
+ }
+ return $label;
+ }
+}
\ No newline at end of file
diff --git a/src/TouchPoint-WP/EventsCalendar.php b/src/TouchPoint-WP/EventsCalendar.php
index 037a1302..5f9e59a3 100644
--- a/src/TouchPoint-WP/EventsCalendar.php
+++ b/src/TouchPoint-WP/EventsCalendar.php
@@ -10,19 +10,40 @@
}
use WP_Post;
+use WP_Query;
if ( ! TOUCHPOINT_COMPOSER_ENABLED) {
require_once 'api.php';
}
/**
- * Provides an interface to bridge the gap between The Events Calendar plugin (by ModernTribe) and the TouchPoint
+ * Provides an interface to bridge the gap between The Events Calendar plugin (by Modern Tribe) and the TouchPoint
* mobile app.
+ *
+ * @since 0.0.90 Deprecated. Will be removed once v2.0 apps are no longer in use, as this won't be necessary for 3.0+.
+ * @deprecated since 0.0.90 Will not be necessary once mobile 3.0 exists.
*/
abstract class EventsCalendar implements api, module
{
+ /**
+ * @param array $params
+ *
+ * @return array
+ *
+ * @since 0.0.2 Added
+ * @since 0.0.90 Deprecated. Will be removed once v2.0 apps are no longer in use, as this won't be necessary for 3.0+.
+ * @deprecated since 0.0.90 Will not be necessary once mobile 3.0 exists.
+ */
protected static function generateEventsList(array $params = []): array
{
+ if (TouchPointWP::instance()->settings->ec_app_cal_provider === 'meetings') {
+ return self::generateEventsListFromMeetings($params);
+ }
+
+ if (!function_exists('tribe_get_events')) {
+ return [];
+ }
+
$eventsList = [];
$params = array_merge(
@@ -39,9 +60,6 @@ protected static function generateEventsList(array $params = []): array
$usePro = TouchPointWP::useTribeCalendarPro();
- $tpDomain = TouchPointWP::instance()->settings->host;
- $dlDomain = TouchPointWP::instance()->settings->host_deeplink;
-
foreach ($eventsQ as $eQ) {
/** @var WP_Post $eQ */
global $post;
@@ -64,61 +82,235 @@ protected static function generateEventsList(array $params = []): array
$locationContent = implode(" • ", $locationContent);
$content = trim(get_the_content(null, true, $eQ->ID));
- $content = apply_filters('the_content', $content);
- $content = apply_filters(TouchPointWP::HOOK_PREFIX . 'app_events_content', $content);
-
- $content = html_entity_decode($content);
-
- // Add Header and footer Scripts, etc.
- if ($content !== '') {
- ob_start();
- do_action('wp_print_styles');
- do_action('wp_print_head_scripts');
- $content = ob_get_clean() . $content;
-
- ob_start();
- do_action('wp_print_footer_scripts');
- do_action('wp_print_scripts');
- $content .= ob_get_clean();
- }
+ $content = self::formatContent($content);
+
+ // Not needed for apps, but helpful for diagnostics
+ $eO['ID'] = $eQ->ID;
- // Add domain to relative links
+ // Android (apparently not used on iOS?)
+ $eO['all_day'] = tribe_event_is_all_day($eQ->ID);
+
+ // Android
+ $eO['image'] = get_the_post_thumbnail_url($eQ->ID, 'large');
+ // iOS
+ $eO['RelatedImageFileKey'] = $eO['image'];
+
+ // iOS
+ $eO['Description'] = str_replace("{{MOBILE_OS}}", "iOS", $content);
+ // Android
+ $eO['content'] = str_replace("{{MOBILE_OS}}", "android", $content);
+
+ // iOS
+ $eO['Subject'] = $eQ->post_title;
+ // Android
+ $eO['title'] = $eQ->post_title;
+
+ // iOS
+ $eO['StartDateTime'] = tribe_get_start_date($eQ->ID, true, 'c');
+ // Android
+ $eO['start_date'] = $eO['StartDateTime'];
+
+ // iOS
+ $eO['Location'] = $locationContent;
+ // Android
+ $eO['room'] = $locationContent;
+
+ $eventsList[] = $eO;
+ }
+
+ return $eventsList;
+ }
+
+ private static function formatContent(?string $content): string
+ {
+ $tpDomain = TouchPointWP::instance()->settings->host;
+ $dlDomain = TouchPointWP::instance()->settings->host_deeplink;
+
+ $content = apply_filters('the_content', $content);
+
+ /**
+ * Allows for manipulation of the html returned to the calendar feature of 2.0 Mobile apps.
+ *
+ * @since 0.0.2 Added
+ * @since 0.0.90 Deprecated
+ * @deprecated 0.0.90 Will be going away with Mobile App version 2.0
+ *
+ * @param string $content The html thus far.
+ */
+ $content = apply_filters('tp_app_events_content', $content);
+ $content = html_entity_decode($content);
+
+ // Add Header and footer Scripts, etc.
+ if ($content !== '') {
+ ob_start();
+ do_action('wp_print_styles');
+ do_action('wp_print_head_scripts');
+ $content = ob_get_clean() . $content;
+
+ ob_start();
+ do_action('wp_print_footer_scripts');
+ do_action('wp_print_scripts');
+ $content .= ob_get_clean();
+ }
+
+ // Add domain to relative links
+ $content = preg_replace(
+ "/['\"]\/([^\/\"']*)[\"']/i",
+ '"' . get_home_url() . '/$1"',
+ $content
+ );
+
+ // Replace TouchPoint links with deeplinks where applicable
+ // Registration Links
+ if ($tpDomain !== '' && $dlDomain !== '') {
$content = preg_replace(
- "/['\"]\/([^\/\"']*)[\"']/i",
- '"' . get_home_url() . '/$1"',
+ "/:\/\/$tpDomain\/OnlineReg\/([\d]+)/i",
+ "://" . $dlDomain . '/registrations/register/${1}?from={{MOBILE_OS}}',
$content
);
+ }
- // Replace TouchPoint links with deeplinks where applicable
- // Registration Links
- if ($tpDomain !== '' && $dlDomain !== '') {
- $content = preg_replace(
- "/:\/\/$tpDomain\/OnlineReg\/([\d]+)/i",
- "://" . $dlDomain . '/registrations/register/${1}?from={{MOBILE_OS}}',
- $content
- );
+ if ($content !== '') {
+ $cssUrl = null;
+ if (TouchPointWP::instance()->settings->ec_use_standardizing_style === 'on') {
+ $cssUrl = TouchPointWP::instance(
+ )->assets_url . 'template/ec-standardizing-style.css?v=' . TouchPointWP::VERSION;
}
- if ($content !== '') {
- $cssUrl = null;
- if (TouchPointWP::instance()->settings->ec_use_standardizing_style === 'on') {
- $cssUrl = TouchPointWP::instance(
- )->assets_url . 'template/ec-standardizing-style.css?v=' . TouchPointWP::VERSION;
- }
- $cssUrl = apply_filters(TouchPointWP::HOOK_PREFIX . 'app_events_css_url', $cssUrl);
- if (is_string($cssUrl)) {
- $content = "" . $content;
- }
+ /**
+ * Insert a CSS file into all event content for mobile 2.0 app.
+ *
+ * @since 0.0.3 Added
+ * @since 0.0.90 Deprecated
+ * @deprecated 0.0.90 Will be going away with Mobile App version 2.0
+ *
+ * @param string $cssUrl The url for a CSS file. By default, one provided with the plugin is used.
+ */
+ $cssUrl = apply_filters('tp_app_events_css_url', $cssUrl);
+ if (is_string($cssUrl)) {
+ $content = "" . $content;
}
+ }
+
+ return $content;
+ }
+
+ /**
+ * @param array $params
+ *
+ * @return array
+ *
+ * @since 0.0.90 Added and Deprecated. Will be removed once v2.0 apps are no longer in use, as this won't be necessary for 3.0+.
+ * @depreacted
+ */
+ protected static function generateEventsListFromMeetings(array $params = []): array
+ {
+ $eventsList = [];
+
+ $q = new WP_Query();
+
+ $existingMq = $q->get('meta_query');
+
+ $now = Utilities::dateTimeNow();
+
+ $mq = [
+ [
+ [
+ 'key' => Meeting::MEETING_END_META_KEY,
+ 'value' => $now->format('U'),
+ 'compare' => ">="
+ ],
+ [ // This condition is to allow for the possibility of events without end times.
+ [
+ 'key' => Meeting::MEETING_END_META_KEY,
+ 'compare' => '=',
+ 'value' => 0
+ ],
+ [
+ 'key' => Meeting::MEETING_START_META_KEY,
+ 'value' => $now->format('U'),
+ 'compare' => ">"
+ ],
+ 'relation' => 'AND'
+ ],
+ 'relation' => 'OR'
+ ],
+ [
+ 'key' => Meeting::MEETING_META_KEY,
+ 'value' => 0,
+ 'compare' => ">"
+ ],
+ 'relation' => 'AND'
+ ];
+
+ if (!empty($existingMq)) {
+ $mq = [
+ 'relation' => 'AND',
+ $existingMq,
+ $mq,
+ ];
+ }
+
+ $q->set('meta_query', $mq);
+
+ $q->set('meta_key', Meeting::MEETING_START_META_KEY);
+ $q->set('orderby', 'meta_value');
+ $q->set('order', 'ASC');
+ $q->set('posts_per_page', 200);
+
+ $q->set('post_type', Involvement_PostTypeSettings::getPostTypes());
+
+ $iids = [];
+ $count = 0;
+
+ foreach ($q->get_posts() as $eQ) {
+ /** @var WP_Post $eQ */
+ global $post;
+ $post = $eQ;
+
+ try {
+ $e = Meeting::fromPost($eQ);
+ } catch (TouchPointWP_Exception) {
+ continue;
+ }
+
+ $iid = $e->involvementId();
+ if (in_array($iid, $iids)) {
+ continue;
+ }
+ $iids[] = $iid;
+
+ $eO = [];
+
+ $locationContent = [];
+ $separator = " • ";
+
+ $location = $e->locationName();
+ if ($location !== '' && $location !== null) {
+ $locationContent[] = $location;
+ }
+// $sstring = $e->scheduleString($separator);
+// if ($sstring) {
+// $locationContent[] = html_entity_decode($sstring);
+// }
+ if ($e->isMultiDay()) {
+ $locationContent[] = __("Multi-Day", "TouchPoint-WP");
+ }
+ $locationContent = implode($separator, $locationContent);
+
+ $content = trim(get_the_content(null, true, $eQ->ID));
+ $content .= "
";
+ $content = self::formatContent($content);
// Not needed for apps, but helpful for diagnostics
$eO['ID'] = $eQ->ID;
+ $eO['IID'] = $iid;
// Android (apparently not used on iOS?)
- $eO['all_day'] = tribe_event_is_all_day($eQ->ID);
+ $eO['all_day'] = $e->isAllDay();
// Android
- $eO['image'] = get_the_post_thumbnail_url($eQ->ID, 'large');
+ $eO['image'] = get_the_post_thumbnail_url($eQ, 'large');
// iOS
$eO['RelatedImageFileKey'] = $eO['image'];
@@ -133,7 +325,7 @@ protected static function generateEventsList(array $params = []): array
$eO['title'] = $eQ->post_title;
// iOS
- $eO['StartDateTime'] = tribe_get_start_date($eQ->ID, true, 'c');
+ $eO['StartDateTime'] = $e->startDt->format('c');
// Android
$eO['start_date'] = $eO['StartDateTime'];
@@ -152,6 +344,10 @@ protected static function generateEventsList(array $params = []): array
* Print json for Events Calendar for Mobile app.
*
* @param array $params Parameters from the request to use for filtering or such.
+ *
+ * @since 0.0.2 Added
+ * @since 0.0.90 Deprecated. Will be removed once v2.0 apps are no longer in use, as this won't be necessary for 3.0+.
+ * @deprecated since 0.0.90 Will not be necessary once mobile 3.0 exists.
*/
protected static function echoAppList(array $params = []): void
{
@@ -166,6 +362,11 @@ protected static function echoAppList(array $params = []): void
* Generate previews of the HTML generated for the App Events Calendar
*
* This is wildly inefficient since each iframe will calculate the full list.
+ *
+ * @param array $params Parameters from the request to use for filtering or such.
+ * @since 0.0.90 Added
+ * @since 0.0.90 Deprecated. Will be removed once v2.0 apps are no longer in use, as this won't be necessary for 3.0+.
+ * @deprecated since 0.0.90 Will not be necessary once mobile 3.0 exists.
*/
protected static function previewAppList(array $params = []): void
{
@@ -174,12 +375,24 @@ protected static function previewAppList(array $params = []): void
foreach ($eventsList as $i => $eo) {
echo "
{$eo['title']}
";
$url = get_site_url() . "/" .
- TouchPointWP::API_ENDPOINT . "/" .
- TouchPointWP::API_ENDPOINT_APP_EVENTS . "/" . $i;
+ TouchPointWP::API_ENDPOINT . "/" .
+ TouchPointWP::API_ENDPOINT_APP_EVENTS . "/" . $i;
echo "";
}
}
+ /**
+ * Generate previews of the HTML generated for one item on the 2.0 app events calendar.
+ *
+ * This is wildly inefficient since each iframe will calculate the full list.
+ *
+ * @param array $params Parameters from the request to use for filtering or such.
+ * @param int $item The item to preview
+ *
+ * @since 0.0.90 Added
+ * @since 0.0.90 Deprecated. Will be removed once v2.0 apps are no longer in use, as this won't be necessary for 3.0+.
+ * @deprecated since 0.0.90 Will not be necessary once mobile 3.0 exists.
+ */
protected static function previewAppListItem(array $params = [], int $item = 0): void
{
$eventsList = self::generateEventsList($params);
@@ -187,6 +400,17 @@ protected static function previewAppListItem(array $params = [], int $item = 0):
echo $eventsList[$item]['content'];
}
+ /**
+ * Handle API requests
+ *
+ * @param array $uri The request URI already parsed by parse_url()
+ *
+ * @return bool False if endpoint is not found. Should print the result.
+ *
+ * @since 0.0.2 Added
+ * @since 0.0.90 Deprecated. Will be removed once v2.0 apps are no longer in use, as this won't be necessary for 3.0+.
+ * @deprecated since 0.0.90 Will not be necessary once mobile 3.0 exists.
+ */
public static function api(array $uri): bool
{
if (count($uri['path']) === 2) {
@@ -197,8 +421,8 @@ public static function api(array $uri): bool
// Preview list
if (count($uri['path']) === 3 &&
- strtolower($uri['path'][2]) === 'preview' &&
- TouchPointWP::currentUserIsAdmin()
+ strtolower($uri['path'][2]) === 'preview' &&
+ TouchPointWP::currentUserIsAdmin()
) {
EventsCalendar::previewAppList($uri['query']);
exit;
@@ -206,8 +430,8 @@ public static function api(array $uri): bool
// Preview items
if (count($uri['path']) === 3 &&
- is_numeric($uri['path'][2]) &&
- TouchPointWP::currentUserIsAdmin()
+ is_numeric($uri['path'][2]) &&
+ TouchPointWP::currentUserIsAdmin()
) {
EventsCalendar::previewAppListItem($uri['query'], intval($uri['path'][2]));
exit;
diff --git a/src/TouchPoint-WP/Utilities/Geo.php b/src/TouchPoint-WP/Geo.php
similarity index 50%
rename from src/TouchPoint-WP/Utilities/Geo.php
rename to src/TouchPoint-WP/Geo.php
index 618b210c..b9c7b32f 100644
--- a/src/TouchPoint-WP/Utilities/Geo.php
+++ b/src/TouchPoint-WP/Geo.php
@@ -3,14 +3,32 @@
* @package TouchPointWP
*/
-namespace tp\TouchPointWP\Utilities;
+namespace tp\TouchPointWP;
+
+use stdClass;
+
+if ( ! defined('ABSPATH')) {
+ exit(1);
+}
+
/**
- * Utility class for geographical attributes and calculations. Not to be confused with the geo interface.
- * @see \tp\TouchPointWP\geo
+ * A standardized set of fields for geographical information.
*/
-abstract class Geo
+class Geo extends stdClass
{
+ public ?float $lat = null;
+ public ?float $lng = null;
+ public ?string $human = null;
+ public ?string $type = null;
+
+ public function __construct(?float $lat = null, ?float $lng = null, ?string $human = null, ?string $type = null) {
+ $this->lat = $lat;
+ $this->lng = $lng;
+ $this->human = $human;
+ $this->type = $type;
+ }
+
/**
* Get distance between two geographic points by lat/lng pairs. Returns a number in miles.
*
@@ -28,8 +46,11 @@ public static function distance(float $latA, float $lngA, float $latB, float $ln
$latB_r = deg2rad($latB);
$lngB_r = deg2rad($lngB);
- return round(3959 * acos(
+ return round(
+ 3959 * acos(
cos($latA_r) * cos($latB_r) * cos($lngB_r - $lngA_r) + sin($latA_r) * sin($latB_r)
- ), 1);
+ ),
+ 1
+ );
}
}
\ No newline at end of file
diff --git a/src/TouchPoint-WP/Involvement.php b/src/TouchPoint-WP/Involvement.php
index 6b1233a0..3ab60c86 100644
--- a/src/TouchPoint-WP/Involvement.php
+++ b/src/TouchPoint-WP/Involvement.php
@@ -13,19 +13,27 @@
require_once "api.php";
require_once "jsInstantiation.php";
require_once "jsonLd.php";
+ require_once "hierarchical.php";
+ require_once "scheduled.php";
require_once "updatesViaCron.php";
require_once "Utilities.php";
- require_once "Utilities/Geo.php";
require_once "Involvement_PostTypeSettings.php";
}
use DateInterval;
use DateTimeImmutable;
+use DateTimeZone;
use Exception;
+use JsonSerializable;
use stdClass;
+use tp\TouchPointWP\Utilities\DateFormats;
+use tp\TouchPointWP\Utilities\DateTimeExtended;
use tp\TouchPointWP\Utilities\Http;
use tp\TouchPointWP\Utilities\PersonArray;
use tp\TouchPointWP\Utilities\PersonQuery;
+use tp\TouchPointWP\Utilities\StringableArray;
+use tp\TouchPointWP\Utilities\Translation;
+use TypeError;
use WP_Error;
use WP_Post;
use WP_Query;
@@ -34,7 +42,7 @@
/**
* Fundamental object meant to correspond to an Involvement in TouchPoint
*/
-class Involvement implements api, updatesViaCron, geo, module
+class Involvement extends PostTypeCapable implements api, updatesViaCron, hasGeo, module, hierarchical, JsonSerializable, scheduled
{
use jsInstantiation;
use jsonLd;
@@ -44,12 +52,18 @@ class Involvement implements api, updatesViaCron, geo, module
public const SHORTCODE_LIST = TouchPointWP::SHORTCODE_PREFIX . "Inv-List";
public const SHORTCODE_NEARBY = TouchPointWP::SHORTCODE_PREFIX . "Inv-Nearby";
public const SHORTCODE_ACTIONS = TouchPointWP::SHORTCODE_PREFIX . "Inv-Actions";
+
+ protected const SCHEDULE_STRING_CACHE_EXPIRATION = 3600 * 8; // 8 hours. Automatically deleted during sync.
+ protected const SCHEDULE_STRING_CACHE_GROUP = TouchPointWP::HOOK_PREFIX . "inv_schedule_string";
+ protected const ENABLE_SCHEDULE_STRING_CACHE = true;
+
+ protected const MEETING_STRATEGY_NONE = 0;
+ protected const MEETING_STRATEGY_SINGLE = 1;
+ protected const MEETING_STRATEGY_MULTIPLE = 2;
+
public const CRON_HOOK = TouchPointWP::HOOK_PREFIX . "inv_cron_hook";
public const CRON_OFFSET = 86400 + 3600;
- public const SCHEDULE_STRING_CACHE_EXPIRATION = 3600 * 8; // 8 hours. Automatically deleted during sync.
- public const SCHEDULE_STRING_CACHE_GROUP = TouchPointWP::HOOK_PREFIX . "inv_schedule_string";
-
protected static bool $_hasUsedMap = false;
protected static bool $_hasArchiveMap = false;
private static array $_instances = [];
@@ -59,14 +73,14 @@ class Involvement implements api, updatesViaCron, geo, module
public static string $itemClass = 'inv-list-item';
private static bool $filterJsAdded = false;
- public ?object $geo = null;
+ protected ?object $geo = null;
static protected object $compareGeo;
protected ?string $locationName = null;
- protected ?DateTimeImmutable $_nextMeeting;
- protected ?DateTimeImmutable $firstMeeting = null;
- protected ?DateTimeImmutable $lastMeeting = null;
- protected ?string $_scheduleString;
+ protected ?DateTimeExtended $_nextMeeting;
+ protected ?DateTimeExtended $firstMeeting = null;
+ protected ?DateTimeExtended $lastMeeting = null;
+ protected ?array $_scheduleStrings = null;
protected ?array $_meetings = null;
protected ?array $_schedules = null;
protected PersonArray $_leaders;
@@ -83,11 +97,8 @@ class Involvement implements api, updatesViaCron, geo, module
*/
public string $invType;
- public int $post_id;
public string $post_excerpt;
- protected WP_Post $post;
-
- public const INVOLVEMENT_META_KEY = TouchPointWP::SETTINGS_PREFIX . "invId";
+ protected ?WP_Post $post = null;
public object $attributes;
protected array $divisions;
@@ -95,7 +106,7 @@ class Involvement implements api, updatesViaCron, geo, module
/**
* Involvement constructor.
*
- * @param $object WP_Post|object an object representing the involvement's post.
+ * @param object $object WP_Post|object an object representing the involvement's post.
* Must have post_id AND inv id attributes.
*
* @throws TouchPointWP_Exception
@@ -108,12 +119,12 @@ protected function __construct(object $object)
// WP_Post Object
$this->post = $object;
$this->name = $object->post_title;
- $this->invId = intval($object->{self::INVOLVEMENT_META_KEY});
+ $this->invId = intval($object->{TouchPointWP::INVOLVEMENT_META_KEY});
$this->post_id = $object->ID;
$this->invType = get_post_type($this->post_id);
if ($this->invId === 0) {
- throw new TouchPointWP_Exception("No Involvement ID provided in the post.");
+ throw new TouchPointWP_Exception("No Involvement ID provided in the post.", 171002);
}
} elseif (gettype($object) === "object") {
// Sql Object, probably.
@@ -122,7 +133,7 @@ protected function __construct(object $object)
_doing_it_wrong(
__FUNCTION__,
esc_html(
- __('Creating an Involvement object from an object without a post_id is not yet supported.')
+ __('Creating an Involvement object from an object without a post_id is not yet supported.', 'TouchPoint-WP')
),
esc_attr(TouchPointWP::VERSION)
);
@@ -143,21 +154,21 @@ protected function __construct(object $object)
}
// clean up involvement type to not have hook prefix, if it does.
- if (strpos($this->invType, TouchPointWP::HOOK_PREFIX) === 0) {
+ if (str_starts_with($this->invType, TouchPointWP::HOOK_PREFIX)) {
$this->invType = substr($this->invType, strlen(TouchPointWP::HOOK_PREFIX));
}
$postTerms = [
- TouchPointWP::TAX_RESCODE,
- TouchPointWP::TAX_AGEGROUP,
- TouchPointWP::TAX_WEEKDAY,
- TouchPointWP::TAX_TENSE,
- TouchPointWP::TAX_DAYTIME,
- TouchPointWP::TAX_INV_MARITAL,
- TouchPointWP::TAX_DIV
+ Taxonomies::TAX_RESCODE,
+ Taxonomies::TAX_AGEGROUP,
+ Taxonomies::TAX_WEEKDAY,
+ Taxonomies::TAX_TENSE,
+ Taxonomies::TAX_DAYTIME,
+ Taxonomies::TAX_INV_MARITAL,
+ Taxonomies::TAX_DIV
];
if (TouchPointWP::instance()->settings->enable_campuses === "on") {
- $postTerms[] = TouchPointWP::TAX_CAMPUS;
+ $postTerms[] = Taxonomies::TAX_CAMPUS;
}
$terms = wp_get_post_terms(
@@ -174,7 +185,7 @@ protected function __construct(object $object)
'slug' => $t->slug
];
$ta = $t->taxonomy;
- if (strpos($ta, TouchPointWP::HOOK_PREFIX) === 0) {
+ if (str_starts_with($ta, TouchPointWP::HOOK_PREFIX)) {
$ta = substr_replace($ta, "", 0, $hookLength);
}
if ( ! isset($this->attributes->$ta)) {
@@ -200,7 +211,11 @@ protected function __construct(object $object)
continue;
}
if (property_exists(self::class, $k)) { // properties
- $this->$k = maybe_unserialize($v[0]);
+ try {
+ $this->$k = maybe_unserialize($v[0]);
+ } catch (TypeError $e) {
+ new TouchPointWP_Exception($e);
+ }
}
}
@@ -255,8 +270,6 @@ final protected static function &allTypeSettings(): array
public static function init(): void
{
foreach (self::allTypeSettings() as $type) {
- /** @var $type Involvement_PostTypeSettings */
-
register_post_type(
$type->postType,
[
@@ -265,7 +278,8 @@ public static function init(): void
'singular_name' => $type->nameSingular
],
'public' => true,
- 'hierarchical' => $type->hierarchical,
+ 'hierarchical' => $type->hierarchical || $type->importMeetings ||
+ TouchPointWP::instance()->settings->enable_meeting_cal === 'on',
'show_ui' => false,
'show_in_nav_menus' => true,
'show_in_rest' => true,
@@ -289,15 +303,15 @@ public static function init(): void
}
// Register default templates for Involvements
- add_filter('template_include', [self::class, 'templateFilter']);
+ add_filter('template_include', [self::class, 'templateFilter'], 10, 1);
// Register function to return schedule instead of publishing date
add_filter('get_the_date', [self::class, 'filterPublishDate'], 10, 3);
add_filter('get_the_time', [self::class, 'filterPublishDate'], 10, 3);
// Register function to return leaders instead of authors
- add_filter('the_author', [self::class, 'filterAuthor'], 10, 3);
- add_filter('get_the_author_display_name', [self::class, 'filterAuthor'], 10, 3);
+ add_filter('the_author', [self::class, 'filterAuthor'], 10, 1);
+ add_filter('get_the_author_display_name', [self::class, 'filterAuthor'], 10, 1);
}
public static function checkUpdates(): void
@@ -333,20 +347,34 @@ public static function checkUpdates(): void
*
* @param bool $verbose Whether to print debugging info.
*
- * @return false|int False on failure, or the number of groups that were updated or deleted.
+ * @return int False on failure, or the number of groups that were updated or deleted.
*/
- public static function updateFromTouchPoint(bool $verbose = false)
+ public final static function updateFromTouchPoint(bool $verbose = false): int
{
$count = 0;
$success = true;
+ $startTime = microtime(true);
+
// Prevent other threads from attempting for an hour.
TouchPointWP::instance()->settings->set('inv_cron_last_run', time() - self::CRON_OFFSET + 3600);
$verbose &= TouchPointWP::currentUserIsAdmin();
+ ini_set('max_execution_time', 300);
+ ini_set('memory_limit', '512M');
+ if (!defined('WP_MAX_MEMORY_LIMIT')) {
+ define('WP_MAX_MEMORY_LIMIT', '512M');
+ }
+
+
foreach (self::allTypeSettings() as $type) {
- if (count($type->importDivs) < 1) {
+
+ if ($verbose) {
+ echo "
$type->namePlural
";
+ }
+
+ if (count($type->importDivs) < 1 && $type->postType !== Meeting::POST_TYPE) {
// Don't update if there aren't any divisions selected yet.
if ($verbose) {
print "Skipping $type->namePlural because no divisions are selected.";
@@ -355,14 +383,17 @@ public static function updateFromTouchPoint(bool $verbose = false)
}
// Divisions
- $divs = Utilities::idArrayToIntArray($type->importDivs, false);
+ $update = false;
try {
- $update = self::updateInvolvementPostsForType($type, $divs, $verbose);
+ TouchPointWP::instance()->setTpWpUserAsCurrent();
+ $update = self::updateInvolvementPostsForType($type, $verbose);
} catch (Exception $e) {
if ($verbose) {
echo "An exception occurred while syncing $type->namePlural: " . $e->getMessage();
}
continue;
+ } finally {
+ TouchPointWP::instance()->unsetTpWpUserAsCurrent();
}
if ($update === false) {
@@ -370,6 +401,11 @@ public static function updateFromTouchPoint(bool $verbose = false)
} else {
$count += $update;
}
+
+ if ($verbose) {
+ $time = microtime(true) - $startTime;
+ echo "
$time seconds have elapsed.
";
+ }
}
unset($type);
@@ -400,28 +436,48 @@ public static function updateFromTouchPoint(bool $verbose = false)
*/
public static function templateFilter(string $template): string
{
- if (apply_filters(TouchPointWP::HOOK_PREFIX . 'use_default_templates', true, self::class)) {
+ $className = self::class;
+ $useTemplates = true;
+
+ /**
+ * Determines whether the plugin's default templates should be used. Theme developers can return false in this
+ * filter to prevent the default templates from applying, especially if they conflict with the theme.
+ *
+ * Default is true.
+ *
+ * @since 0.0.6 Added
+ *
+ * @param bool $value The value to return. True will allow the default templates to be applied.
+ * @param string $className The name of the class calling for the template.
+ */
+ if (!!apply_filters('tp_use_default_templates', $useTemplates, $className)) {
$postTypesToFilter = Involvement_PostTypeSettings::getPostTypes();
- $templateFilesToOverwrite = TouchPointWP::TEMPLATES_TO_OVERWRITE;
+ $templateFilesToOverwrite = self::TEMPLATES_TO_OVERWRITE;
if (count($postTypesToFilter) == 0) {
return $template;
}
- if ( ! in_array(ltrim(strrchr($template, '/'), '/'), $templateFilesToOverwrite)) {
+ if (!in_array(ltrim(strrchr($template, '/'), '/'), $templateFilesToOverwrite)) {
return $template;
}
+ if (is_post_type_archive(Meeting::POST_TYPE) && file_exists(
+ TouchPointWP::$dir . '/src/templates/meeting-archive.php'
+ )) {
+ return TouchPointWP::$dir . '/src/templates/meeting-archive.php';
+ }
+
if (is_post_type_archive($postTypesToFilter) && file_exists(
TouchPointWP::$dir . '/src/templates/involvement-archive.php'
)) {
- $template = TouchPointWP::$dir . '/src/templates/involvement-archive.php';
+ return TouchPointWP::$dir . '/src/templates/involvement-archive.php';
}
if (is_singular($postTypesToFilter) && file_exists(
TouchPointWP::$dir . '/src/templates/involvement-single.php'
)) {
- $template = TouchPointWP::$dir . '/src/templates/involvement-single.php';
+ return TouchPointWP::$dir . '/src/templates/involvement-single.php';
}
}
@@ -435,50 +491,163 @@ public static function templateFilter(string $template): string
* @return bool|string True if involvement can be joined. False if no registration exists. Or, a string with why
* it can't be joined otherwise.
*/
- public function acceptingNewMembers()
+ public function acceptingNewMembers(): bool|string
{
- if (get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "groupFull", true) === '1') {
- return __("Currently Full", 'TouchPoint-WP');
- }
+ if (!isset($this->_acceptingNewMembers)) {
+ if (get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "groupFull", true) === '1') {
+ $this->_acceptingNewMembers = __("Currently Full", 'TouchPoint-WP');
+ return $this->_acceptingNewMembers;
+ }
- if (get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "groupClosed", true) === '1') {
- return __("Currently Closed", 'TouchPoint-WP');
- }
+ if (get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "groupClosed", true) === '1') {
+ $this->_acceptingNewMembers = __("Currently Closed", 'TouchPoint-WP');
+ return $this->_acceptingNewMembers;
+ }
- $now = current_datetime();
- $regStart = get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regStart", true);
- if ($regStart !== false && $regStart !== '' && $regStart > $now) {
- return __("Registration Not Open Yet", 'TouchPoint-WP');
- }
+ $now = Utilities::dateTimeNow();
+ $regStart = get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regStart", true);
+ if ($regStart !== false && $regStart !== '' && $regStart > $now) {
+ $this->_acceptingNewMembers = __("Registration Not Open Yet", 'TouchPoint-WP');
+ return $this->_acceptingNewMembers;
+ }
+
+ $regEnd = get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regEnd", true);
+ if ($regEnd !== false && $regEnd !== '' && $regEnd < $now) {
+ $this->_acceptingNewMembers = __("Registration Closed", 'TouchPoint-WP');
+ return $this->_acceptingNewMembers;
+ }
+
+ if (intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regTypeId", true)) === 0) {
+ $this->_acceptingNewMembers = false; // no online registration available
+ return $this->_acceptingNewMembers;
+ }
- $regEnd = get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regEnd", true);
- if ($regEnd !== false && $regEnd !== '' && $regEnd < $now) {
- return __("Registration Closed", 'TouchPoint-WP');
+ $this->_acceptingNewMembers = true;
}
- if (intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regTypeId", true)) === 0) {
- return false; // no online registration available
+ return $this->_acceptingNewMembers;
+ }
+ private mixed $_acceptingNewMembers;
+
+
+ /**
+ * Gets a URL for registration. A registration url will be provided unless there is no viable registration url to
+ * send users to, in which case null will be returned.
+ *
+ * @return ?string
+ */
+ public function getRegistrationUrl(): ?string
+ {
+ if ($this->_registrationUrl === "") {
+ $regUrl = get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regUrl", true);
+ $regType = intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regTypeId", true));
+ $hasRegQuestions = intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "hasRegQuestions", true));
+ if ($hasRegQuestions && ($regUrl === "" || $regUrl === null)) {
+ $this->_registrationUrl = TouchPointWP::instance()->host() . "/OnlineReg/" . $this->invId;
+ } elseif ($regType === 0 || $regUrl === "" || $regUrl === null) {
+ $this->_registrationUrl = null;
+ } elseif (stristr($regUrl, "http") === false) {
+ $this->_registrationUrl = TouchPointWP::instance()->host() . $regUrl;
+ } else {
+ $this->_registrationUrl = $regUrl;
+ }
}
+ return $this->_registrationUrl;
+ }
+ private ?string $_registrationUrl = "";
- return true;
+
+ /**
+ * Get the registration type for the involvement.
+ *
+ * @return int enum of RegistrationType
+ */
+ public function getRegistrationType(): int
+ {
+ if (!isset($this->_registrationType)) {
+ if ($this->acceptingNewMembers() !== true) {
+ $this->_registrationType = RegistrationType::CLOSED;
+ return $this->_registrationType;
+ }
+
+ // Determine intended indication based on site setting.
+ $siteRegType = intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "siteRegTypeId", true));
+ $regUrl = $this->getRegistrationUrl();
+ switch ($siteRegType) {
+ case 1:
+ $this->_registrationType = RegistrationType::FORM;
+ return $this->_registrationType;
+
+ case 3:
+ $this->_registrationType = RegistrationType::RSVP;
+ return $this->_registrationType;
+
+ case 5:
+ if ($regUrl !== null) {
+ $this->_registrationType = RegistrationType::EXTERNAL;
+ return $this->_registrationType;
+ }
+ break; // Registration isn't possible at a link, therefore, assume there was a mistake and continue.
+
+
+ case 7:
+ $this->_registrationType = RegistrationType::CLOSED;
+ return $this->_registrationType;
+ }
+
+ // If the involvement has a redirection link, assume it's an external form
+ if ($regUrl !== null) {
+ $this->_registrationType = RegistrationType::EXTERNAL;
+ return $this->_registrationType;
+ }
+
+
+ // If the involvement has registration questions, assume it's a form.
+ if (
+ // Has registration questions
+ intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "hasRegQuestions", true)) === 1 ||
+
+ // Has registration type not equal to Join
+ intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regTypeId", true)) !== 1
+ ) {
+ $this->_registrationType = RegistrationType::FORM;
+ return $this->_registrationType;
+ }
+
+ $this->_registrationType = RegistrationType::JOIN;
+ }
+ return $this->_registrationType;
}
+ private int $_registrationType;
+
/**
* Whether the involvement should link to a registration form, rather than directly joining the org.
*
+ * @since 0.0.90 Deprecated
+ * @deprecated 0.0.90 Does not take into account all the possible registration types; will be removed in a future
+ * version.
+ *
+ * @noinspection PHPUnused
* @return bool
*/
public function useRegistrationForm(): bool
{
if (!isset($this->_useRegistrationForm)) {
$this->_useRegistrationForm = (get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "hasRegQuestions", true) === '1' ||
- intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regTypeId", true)) !== 1);
+ intval(get_post_meta($this->post_id, TouchPointWP::SETTINGS_PREFIX . "regTypeId", true)) !== 1);
}
return $this->_useRegistrationForm;
}
private bool $_useRegistrationForm;
+
/**
+ * Get an array of objects that correspond to key details of meetings. Does NOT return the actual Meeting objects.
+ * Since this is used for involvements regardless of whether their meetings are imported, this pulls from the object
+ * array that's imported directly from the API. It does not take into account Meeting objects, or meetings that
+ * belong to child involvements.
+ *
* @return stdClass[]
*/
protected function meetings(): array
@@ -488,6 +657,10 @@ protected function meetings(): array
if ($m === "") {
$m = [];
}
+
+ // Make sure items are unique. #204
+ $m = array_unique($m, SORT_REGULAR);
+
$this->_meetings = $m;
}
@@ -511,49 +684,93 @@ protected function schedules(): array
}
/**
- * Get a description of the meeting schedule in a human-friendly phrase, e.g. Sundays at 11:00am, starting January
- * 14.
+ * Get the parent of this object **which may be an object of a different class**.
+ *
+ * Returns null if there is no parent.
*
- * This is separated out to a static method to prevent involvement from being instantiated (with those database hits)
- * when the content is cached. (10x faster or more)
+ * @return Involvement|null
+ */
+ public function getParent(): ?Involvement
+ {
+ if ($this->parentPostId === null) {
+ $this->parentPostId = $this->post->post_parent;
+ if ($this->parentPostId > 0) {
+ $parent = get_post($this->parentPostId);
+ if ($parent !== null) {
+ try {
+ $this->parentObject = self::fromPost($parent);
+ } catch (TouchPointWP_Exception) {
+ $this->parentObject = null;
+ }
+ }
+ }
+ }
+ return $this->parentObject;
+ }
+ protected ?int $parentPostId = null;
+ protected ?self $parentObject = null;
+
+ /**
+ * Get the several different strings that can be used to describe the start/end/etc of this involvement.
*
* @param int $invId
* @param ?Involvement $inv
*
- * @return string
+ * @return ?string[]
*/
- public static function scheduleString(int $invId, $inv = null): ?string
+ protected static function scheduleStrings(int $invId, $inv = null): ?array
{
- $cacheKey = $invId . "_" . get_locale();
+ if (isset($inv->_scheduleStrings)) {
+ return $inv->_scheduleStrings;
+ }
+
+ $cacheKey = $invId . "_" . get_locale() . "_v2";
$schStr = wp_cache_get($cacheKey, self::SCHEDULE_STRING_CACHE_GROUP);
- if (!! $schStr) {
+ if (!! $schStr && self::ENABLE_SCHEDULE_STRING_CACHE) {
return $schStr;
}
if (! $inv) {
try {
$inv = self::fromInvId($invId);
- } catch (TouchPointWP_Exception $e) {
+ } catch (TouchPointWP_Exception) {
return null;
}
}
- if (! isset($inv->_scheduleString)) {
- $inv->_scheduleString = $inv->scheduleString_calc();
- wp_cache_set(
- $cacheKey,
- $inv->_scheduleString,
- self::SCHEDULE_STRING_CACHE_GROUP,
- self::SCHEDULE_STRING_CACHE_EXPIRATION
- );
- }
- return $inv->_scheduleString;
+ $inv->_scheduleStrings = $inv->scheduleStrings_calc();
+ wp_cache_set(
+ $cacheKey,
+ $inv->_scheduleStrings,
+ self::SCHEDULE_STRING_CACHE_GROUP,
+ self::SCHEDULE_STRING_CACHE_EXPIRATION
+ );
+ return $inv->_scheduleStrings;
+ }
+
+
+ /**
+ * Get a description of the meeting schedule in a human-friendly phrase, e.g. Sundays at 11:00am, starting January
+ * 14.
+ *
+ * This is separated out to a static method to prevent involvement from being instantiated (with those database
+ * hits) when the content is cached. (10x faster or more)
+ *
+ * @param int $objId Involvement Id.
+ * @param ?Involvement $obj
+ *
+ * @return ?string
+ */
+ public static function scheduleString(int $objId, $obj = null): ?string
+ {
+ $s = self::scheduleStrings($objId, $obj);
+ return $s['combined'];
}
/**
* Get the next meeting date/time from either the meetings or schedules.
*
- * @return DateTimeImmutable|null
+ * @return DateTimeExtended|null
*/
- public function nextMeeting(): ?DateTimeImmutable
+ public function nextMeeting(): ?DateTimeExtended
{
$now = new DateTimeImmutable();
$this->_nextMeeting = null;
@@ -561,7 +778,7 @@ public function nextMeeting(): ?DateTimeImmutable
if ($this->_nextMeeting === null) {
// meetings
foreach ($this->meetings() as $m) {
- $mdt = $m->dt;
+ $mdt = $m->mtgStartDt;
if ($mdt > $now) {
if ($this->_nextMeeting === null || $mdt < $this->_nextMeeting) {
$this->_nextMeeting = $mdt;
@@ -571,23 +788,15 @@ public function nextMeeting(): ?DateTimeImmutable
// schedules
foreach ($this->schedules() as $s) {
- $mdt = $s->next;
- if ($mdt > $now) {
- if ($this->_nextMeeting === null || $mdt < $this->_nextMeeting) {
- $this->_nextMeeting = $mdt;
- }
+ $mdt = $s->nextStartDt;
+ if ($mdt === null) {
+ continue;
}
- }
- }
-
- // schedules + 1 week (assumes schedules are recurring weekly)
- if ($this->_nextMeeting === null) { // really only needed if we don't have a date yet.
- foreach ($this->schedules() as $s) {
- $mdt = $s->next->modify("+1 week");
- if ($mdt > $now) {
- if ($this->_nextMeeting === null || $mdt < $this->_nextMeeting) {
- $this->_nextMeeting = $mdt;
- }
+ if ($mdt <= $now) { // If "next meeting" is past, add a week and re-check.
+ $mdt = $mdt->modify("+1 week");
+ }
+ if ($this->_nextMeeting === null || $mdt < $this->_nextMeeting) {
+ $this->_nextMeeting = $mdt;
}
}
}
@@ -596,17 +805,45 @@ public function nextMeeting(): ?DateTimeImmutable
}
/**
+ * @param $apiMeeting
+ *
+ * @return bool
+ *
+ * TODO update with #184
+ */
+ protected static function apiMeetingIsAllDay($apiMeeting): bool
+ {
+ return $apiMeeting->mtgStartDt->format("His") === "000000";
+ }
+
+
+ /**
+ * @param $apiSchedule
+ *
+ * @return bool
+ *
+ * TODO remove or change with #184
+ */
+ protected static function apiScheduleIsAllDay($apiSchedule): bool
+ {
+ return $apiSchedule->nextStartDt->format("His") === "000000";
+ }
+
+ /**
+ * Group meetings and schedules together such that typical recurrences can be stated. Only returns patterns that
+ * have at least N occurrences.
+ *
* @param array $meetings
* @param array $schedules
+ * @param int $minNumber (N) The minimum required number of recurrences.
*
* @return ?array[]
*/
- private static function computeCommonOccurrences(array $meetings = [], array $schedules = []): ?array
+ protected static function computeCommonOccurrences(array $meetings = [], array $schedules = [], int $minNumber = 3): ?array
{
try {
- $siteTz = wp_timezone();
- $now = new DateTimeImmutable("now", $siteTz);
- } catch (Exception $e) {
+ $now = Utilities::dateTimeNow();
+ } catch (Exception) {
return null;
}
@@ -618,15 +855,23 @@ private static function computeCommonOccurrences(array $meetings = [], array $sc
continue;
}
- $dt = $s->next;
-
- $coInx = $dt->format('w-Hi');
+ /** @var DateTimeExtended $start */
+ $start = $s->nextStartDt;
+ if ($start === null) {
+ continue;
+ }
+ if ($start->isAllDay) {
+ $coInx = $start->format('w-9999');
+ } else {
+ $coInx = $start->format('w-Hi');
+ }
$commonOccurrences[$coInx] = [
- 'count' => 20,
- 'example' => $dt
+ 'count' => 20,
+ 'example' => $start,
+ 'exampleEnd' => null
];
}
- unset($dt, $coInx, $s);
+ unset($start, $coInx, $s);
// If there isn't a schedule, but there are common meeting dates/times, use those.
foreach ($meetings as $m) {
@@ -634,84 +879,130 @@ private static function computeCommonOccurrences(array $meetings = [], array $sc
continue;
}
- $dt = $m->dt;
+ /** @var DateTimeExtended $start */
+ $start = $m->mtgStartDt;
- if ($dt < $now) {
+ /** @var ?DateTimeExtended $end */
+ $end = $m->mtgEndDt;
+
+ if ($start < $now) {
continue;
}
- $coInx = $dt->format('w-Hi');
+ if ($start->isAllDay) {
+ $coInx = $start->format('w-9999');
+ } else {
+ $coInx = $start->format('w-Hi');
+ }
if (isset($commonOccurrences[$coInx])) {
$commonOccurrences[$coInx]['count']++;
} else {
$commonOccurrences[$coInx] = [
- 'count' => 1,
- 'example' => $dt
+ 'count' => 1,
+ 'example' => $start,
+ 'exampleEnd' => $end
];
}
}
- unset($dt, $coInx, $m);
+ unset($start, $coInx, $m);
- return array_filter($commonOccurrences, fn($co) => $co['count'] > 2);
+ return array_filter($commonOccurrences, fn($co) => $co['count'] >= $minNumber);
}
/**
- * Calculate the schedule string.
+ * Calculate the schedule strings.
*
- * @return string
+ * @return string[]
*/
- protected function scheduleString_calc(): ?string
+ protected function scheduleStrings_calc(): array
{
$commonOccurrences = self::computeCommonOccurrences($this->meetings(), $this->schedules());
- $dayStr = null;
- $timeFormat = get_option('time_format');
$dateFormat = get_option('date_format');
- if (count($commonOccurrences) > 0) {
- $uniqueTimeStrings = [];
- $days = [];
- if (count($commonOccurrences) > 1) { // this is only needed if there's multiple schedules
- foreach ($commonOccurrences as $k => $co) {
- $timeStr = substr($k, 2);
- if ( ! in_array($timeStr, $uniqueTimeStrings, true)) {
- $uniqueTimeStrings[] = $timeStr;
-
- $weekday = "d" . $k[0];
- if ( ! isset($days[$weekday])) {
- $days[$weekday] = [];
- }
- $days[$weekday][] = $co['example'];
- }
+ $r = [
+ 'datetime' => null,
+ 'date' => null,
+ 'time' => null,
+ 'firstLast' => null,
+ 'combined' => null
+ ];
+
+ $uniqueTimeStrings = [];
+ $days = [];
+ $common = true;
+ if (count($commonOccurrences) > 1) { // this is only needed if there's multiple schedules
+ foreach ($commonOccurrences as $k => $co) {
+ $timeStr = substr($k, 2);
+ if ( ! in_array($timeStr, $uniqueTimeStrings, true)) {
+ $uniqueTimeStrings[] = $timeStr;
+ }
+
+ $weekday = "d" . $k[0];
+ if ( ! isset($days[$weekday])) {
+ $days[$weekday] = [];
+ }
+
+ if ( ! in_array($co['example'], $days[$weekday], true)) {
+ $days[$weekday][] = $co['example'];
+ }
+ }
+ unset($timeStr, $k, $co, $weekday);
+ } elseif (count($commonOccurrences) > 0) {
+ $cok = array_key_first($commonOccurrences);
+ $days["d" . $cok[0]][] = $commonOccurrences[$cok]['example'];
+ } else {
+ $common = false;
+ $commonOccurrences = self::computeCommonOccurrences($this->meetings(), $this->schedules(), 0);
+
+ foreach ($commonOccurrences as $k => $co) {
+ $timeStr = substr($k, 2);
+ if (!in_array($timeStr, $uniqueTimeStrings, true)) {
+ $uniqueTimeStrings[] = $timeStr;
+ }
+
+ $weekday = "d" . $k[0];
+ if ( ! isset($days[$weekday])) {
+ $days[$weekday] = [];
+ }
+
+ if ( ! in_array($co['example'], $days[$weekday], true)) {
+ $days[$weekday][] = $co['example'];
}
- unset($timeStr, $k, $co, $weekday);
- } else {
- $cok = array_key_first($commonOccurrences);
- $days["d" . $cok[0]][] = $commonOccurrences[$cok]['example'];
}
+ unset($timeStr, $k, $co, $weekday);
+ }
+ if ($common) {
if (count($uniqueTimeStrings) > 1) { // Multiple different times. Sun at 9am & 11am, and Sat at 6pm
// multiple different times of day
$dayStr = [];
foreach ($days as $dk => $dta) {
$timeStr = [];
foreach ($dta as $dt) {
- /** @var $dt DateTimeImmutable */
- $ts = $dt->format($timeFormat);
- $ts = apply_filters(TouchPointWP::HOOK_PREFIX . 'adjust_time_string', $ts, $dt);
- $timeStr[] = $ts;
+ /** @var $dt DateTimeExtended */
+ if ($dt->isAllDay) {
+ continue; // skip all-days
+ }
+ $timeStr[] = DateFormats::TimeStringFormatted($dt);
}
- $timeStr = Utilities::stringArrayToListString($timeStr);
if (count($days) > 1) { // Mon at 7pm & Tue at 8pm
$day = Utilities::getDayOfWeekShortForNumber(intval($dk[1]));
} else {
$day = Utilities::getPluralDayOfWeekNameForNumber(intval($dk[1]));
}
- // translators: "Mon at 7pm" or "Sundays at 9am & 11am"
- $dayStr[] = wp_sprintf(__('%1$s at %2$s', 'TouchPoint-WP'), $day, $timeStr);
+ if (count($timeStr) > 0) {
+ $timeStr = Utilities::stringArrayToListString($timeStr);
+ // translators: %1$s is the date(s), %2$s is the time(s).
+ $dayStr[] = wp_sprintf(__('%1$s at %2$s', 'TouchPoint-WP'), $day, $timeStr);
+ } else {
+ // translators: "Mon All Day" or "Sundays All Day"
+ $dayStr[] = wp_sprintf(__('%1$s All Day', 'TouchPoint-WP'), $day);
+ }
}
$dayStr = Utilities::stringArrayToListString($dayStr);
+ $r['date'] = $dayStr;
} else { // one time of day. Tue & Thu at 7pm
if (count($days) > 1) {
// more than one day per week
@@ -725,73 +1016,151 @@ protected function scheduleString_calc(): ?string
$k = array_key_first($days);
$dayStr = Utilities::getPluralDayOfWeekNameForNumber(intval($k[1]));
}
+ $r['date'] = $dayStr;
$dt = array_values($days)[0][0];
- /** @var $dt DateTimeImmutable */
- $timeStr = $dt->format($timeFormat);
- $timeStr = apply_filters(TouchPointWP::HOOK_PREFIX . 'adjust_time_string', $timeStr, $dt);
- $dayStr = wp_sprintf(__('%1$s at %2$s', 'TouchPoint-WP'), $dayStr, $timeStr);
+ /** @var $dt DateTimeExtended */
+ if ($dt->isAllDay) {
+ // translators: "Mon All Day" or "Sundays All Day"
+ $dayStr = wp_sprintf(__('%1$s All Day', 'TouchPoint-WP'), $dayStr);
+ $r['time'] = __('All Day', 'TouchPoint-WP');
+ } else {
+ $timeStr = DateFormats::TimeStringFormatted($dt);
+
+ // translators: %1$s is the date(s), %2$s is the time(s).
+ $dayStr = wp_sprintf(__('%1$s at %2$s', 'TouchPoint-WP'), $dayStr, $timeStr);
+ $r['time'] = $timeStr;
+ }
}
- }
- // Convert start and end to string.
- if ($this->firstMeeting !== null && $this->lastMeeting !== null) {
- if ($dayStr === null) {
- $dayStr = wp_sprintf(
+ // Convert start and end to string,
+ if ($this->firstMeeting !== null && $this->lastMeeting !== null) {
+ $r['firstLast'] = wp_sprintf(
// translators: {start date} through {end date} e.g. February 14 through August 12
__('%1$s through %2$s', 'TouchPoint-WP'),
$this->firstMeeting->format($dateFormat),
$this->lastMeeting->format($dateFormat)
);
- } else {
- $dayStr = wp_sprintf(
- // translators: {schedule}, {start date} through {end date} e.g. Sundays at 11am, February 14 through August 12
- __('%1$s, %2$s through %3$s', 'TouchPoint-WP'),
- $dayStr,
- $this->firstMeeting->format($dateFormat),
- $this->lastMeeting->format($dateFormat)
- );
- }
- } elseif ($this->firstMeeting !== null) {
- if ($dayStr === null) {
- $dayStr = wp_sprintf(
+ if ($dayStr === null) {
+ $dayStr = $r['firstLast'];
+ } else {
+ $dayStr = wp_sprintf(
+ // translators: {schedule}, {start date} through {end date} e.g. Sundays at 11am, February 14 through August 12
+ __('%1$s, %2$s through %3$s', 'TouchPoint-WP'),
+ $dayStr,
+ $this->firstMeeting->format($dateFormat),
+ $this->lastMeeting->format($dateFormat)
+ );
+ }
+ } elseif ($this->firstMeeting !== null) {
+ $r['firstLast'] = wp_sprintf(
// translators: Starts {start date} e.g. Starts September 15
__('Starts %1$s', 'TouchPoint-WP'),
$this->firstMeeting->format($dateFormat)
);
- } else {
- $dayStr = wp_sprintf(
- // translators: {schedule}, starting {start date} e.g. Sundays at 11am, starting February 14
- __('%1$s, starting %2$s', 'TouchPoint-WP'),
- $dayStr,
- $this->firstMeeting->format($dateFormat)
- );
- }
- } elseif ($this->lastMeeting !== null) {
- if ($dayStr === null) {
- $dayStr = wp_sprintf(
+ if ($dayStr === null) {
+ $dayStr = $r['firstLast'];
+ } else {
+ $dayStr = wp_sprintf(
+ // translators: {schedule}, starting {start date} e.g. Sundays at 11am, starting February 14
+ __('%1$s, starting %2$s', 'TouchPoint-WP'),
+ $dayStr,
+ $this->firstMeeting->format($dateFormat)
+ );
+ }
+ } elseif ($this->lastMeeting !== null) {
+ $r['firstLast'] = wp_sprintf(
// translators: Through {end date} e.g. Through September 15
__('Through %1$s', 'TouchPoint-WP'),
$this->lastMeeting->format($dateFormat)
);
+ if ($dayStr === null) {
+ $dayStr = $r['firstLast'];
+ } else {
+ $dayStr = wp_sprintf(
+ // translators: {schedule}, through {end date} e.g. Sundays at 11am, through February 14
+ __('%1$s, through %2$s', 'TouchPoint-WP'),
+ $dayStr,
+ $this->lastMeeting->format($dateFormat)
+ );
+ }
+ }
+
+ $r['combined'] = $dayStr;
+ } else { // Uncommon schedules
+
+ if (count($commonOccurrences) === 0) {
+ return $r;
+ }
+
+ $forceDateTime = false;
+ $dateTimeArr = new StringableArray();
+ $dateArr = new StringableArray();
+ $timeArr = [];
+ $now = Utilities::dateTimeNow();
+
+ // filter meetings to only those not past
+ $meetings = $this->meetings();
+ $meetings = array_filter($meetings, fn($m) => $m->status == 1);
+ $uncancelledMeetings = $meetings; // includes historical
+// $originalMeetingCount = count($meetings);
+ $meetings = array_filter($meetings, fn($m) => $m->mtgEndDt > $now);
+ if (count($meetings) === 0) { // if no future, revert to historical.
+ $meetings = $uncancelledMeetings;
+ }
+// $andOthers = (count($meetings) !== $originalMeetingCount); This, when fed to the ->toListString methods
+// below can be used to add "and others" to the list of dates/times to indicate that there are historical
+// meetings that are not being shown. However, this currently seems more confusing than helpful.
+
+ foreach ($meetings as $m) {
+ $a = DateFormats::DurationToStringArray($m->mtgStartDt, $m->mtgEndDt, null, $m->mtgStartDt->isAllDay);
+
+ if (isset($a['datetime'])) {
+ $forceDateTime = true;
+ $dateTimeArr[] = $a['datetime'];
+ } else {
+ $dateTimeArr[] = wp_sprintf(
+ // translators: %1$s is the date(s), %2$s is the time(s).
+ __('%1$s at %2$s', 'TouchPoint-WP'), $a['date'], $a['time']
+ );
+ if ( !$dateArr->contains(['date'])) {
+ $dateArr[] = $a['date'];
+ }
+ if (!in_array($a['time'], $timeArr)) {
+ $timeArr[] = $a['time'];
+ }
+ }
+ }
+ if (count($timeArr) > 1) {
+ $forceDateTime = true;
+ }
+
+ if ($forceDateTime) {
+ $r['datetime'] = $dateTimeArr->toListString(2);
+ $r['combined'] = $r['datetime'];
} else {
- $dayStr = wp_sprintf(
- // translators: {schedule}, through {end date} e.g. Sundays at 11am, through February 14
- __('%1$s, through %2$s', 'TouchPoint-WP'),
- $dayStr,
- $this->lastMeeting->format($dateFormat)
+ $dateStr = $dateArr->toListString(2);
+
+ $r['date'] = $dateStr;
+ $r['time'] = $timeArr[0];
+ $r['combined'] = wp_sprintf(
+ // translators: %1$s is the date(s), %2$s is the time(s).
+ __('%1$s at %2$s', 'TouchPoint-WP'),
+ $dateStr,
+ $timeArr[0]
);
}
}
- return $dayStr;
+ return $r;
}
+
/**
- * Returns an array of the Involvement's Divisions, excluding those that cause it to be included.
+ * Gets the division terms for the involvement.
*
- * @return string[]
+ * @return WP_Term[]
*/
- public function getDivisionsStrings(): array
+ protected function getDivisions(): array
{
$exclude = $this->settings()->importDivs;
@@ -810,17 +1179,46 @@ public function getDivisionsStrings(): array
];
}
- $this->divisions = wp_get_post_terms($this->post_id, TouchPointWP::TAX_DIV, ['meta_query' => $mq]);
+ $this->divisions = wp_get_post_terms($this->post_id, Taxonomies::TAX_DIV, ['meta_query' => $mq]);
}
+ return $this->divisions;
+ }
+
+ /**
+ * Returns an array of the Involvement's Divisions, excluding those that cause it to be included.
+ *
+ * @return string[]
+ * @noinspection PhpUnused
+ */
+ public function getDivisionsStrings(): array
+ {
$out = [];
- foreach ($this->divisions as $d) {
+ foreach ($this->getDivisions() as $d) {
$out[] = $d->name;
}
return $out;
}
+
+ /**
+ * Returns an array of links to the Involvement's Divisions, excluding those that cause it to be included.
+ *
+ * @return string[]
+ */
+ public function getDivisionsLinks(): array
+ {
+ $out = [];
+ foreach ($this->getDivisions() as $d) {
+ $name = $d->name;
+ $link = get_term_link($d);
+ $out[] = "$name";
+ }
+
+ return $out;
+ }
+
/**
* Get the setting object for a specific post type or involvement type
*
@@ -895,7 +1293,7 @@ public static function actionsShortcode($params = [], string $content = ""): str
try {
$inv = self::fromPost($post);
$iid = $inv->invId;
- } catch (TouchPointWP_Exception $e) {
+ } catch (TouchPointWP_Exception) {
$iid = null;
}
}
@@ -1060,7 +1458,7 @@ public static function doInvolvementList(WP_Query $q, $params = []): void
}
if (count($divs) > 0) {
$taxQuery[] = [
- 'taxonomy' => TouchPointWP::TAX_DIV,
+ 'taxonomy' => Taxonomies::TAX_DIV,
'field' => 'ID',
'terms' => $divs
];
@@ -1109,7 +1507,10 @@ public static function doInvolvementList(WP_Query $q, $params = []): void
usort($posts, [Involvement::class, 'sortPosts']);
- foreach ($posts as $post) {
+ foreach ($posts as $postI) {
+ global $post;
+ $post = $postI;
+
$loadedPart = get_template_part('list-item', 'involvement-list-item');
if ($loadedPart === false) {
require TouchPointWP::$dir . "/src/templates/parts/involvement-list-item.php";
@@ -1132,28 +1533,29 @@ public static function doInvolvementList(WP_Query $q, $params = []): void
* Get a WP_Post by the Involvement ID if it exists. Return null if it does not.
*
* @param string|string[] $postType
- * @param $involvementId
+ * @param mixed $involvementId
*
* @return int|WP_Post|null
*/
- private static function getWpPostByInvolvementId($postType, $involvementId)
+ private static function getWpPostByInvolvementId($postType, $involvementId): WP_Post|null
{
$involvementId = (string)$involvementId;
$q = new WP_Query([
'post_type' => $postType,
- 'meta_key' => self::INVOLVEMENT_META_KEY,
+ 'meta_key' => TouchPointWP::INVOLVEMENT_META_KEY,
'meta_value' => $involvementId,
'numberposts' => 2
// only need one, but if there's two, there should be an error condition.
]);
+ /** @var $posts WP_Post[] */
$posts = $q->get_posts();
$counts = count($posts);
if ($counts > 1) { // multiple posts match, which isn't great.
new TouchPointWP_Exception("Multiple Posts Exist", 170006);
}
if ($counts > 0) { // post exists already.
- return $posts[0];
+ return reset($posts);
} else {
return null;
}
@@ -1168,6 +1570,7 @@ private static function getWpPostByInvolvementId($postType, $involvementId)
* @return string
*
* @noinspection PhpUnusedParameterInspection
+ * @noinspection PhpMissingParamTypeInspection
*/
public static function listShortcode($params = [], string $content = ""): string
{
@@ -1185,7 +1588,17 @@ public static function listShortcode($params = [], string $content = ""): string
'type' => null,
'div' => null,
'class' => self::$containerClass,
- 'includecss' => apply_filters(TouchPointWP::HOOK_PREFIX . 'use_css', true, self::class),
+
+ /**
+ * Determines whether or not to automatically include the plugin-default CSS. Return false to use your
+ * own CSS instead.
+ *
+ * @since 0.0.15 Added
+ *
+ * @param bool $useCss Whether or not to include the default CSS. True = include
+ * @param string $className The name of the current calling class.
+ */
+ 'includecss' => apply_filters('tp_use_css', true, self::class),
'itemclass' => self::$itemClass,
'usequery' => false
],
@@ -1322,9 +1735,7 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
// Division
if (in_array('div', $filters)) {
$exclude = $settings->importDivs;
- if (count(
- $exclude
- ) == 1) { // Exclude the imported div if there's only one, as all invs would have that div.
+ if (count($exclude) == 1) { // Exclude the imported div if there's only one as all would have it.
$mq = ['relation' => "AND"];
foreach ($exclude as $e) {
$mq[] = [
@@ -1346,7 +1757,7 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
}
$dvName = TouchPointWP::instance()->settings->dv_name_singular;
$dvList = get_terms([
- 'taxonomy' => TouchPointWP::TAX_DIV,
+ 'taxonomy' => Taxonomies::TAX_DIV,
'hide_empty' => true,
'meta_query' => $mq,
TouchPointWP::HOOK_PREFIX . 'post_type' => $postType
@@ -1394,7 +1805,7 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
$rcName = TouchPointWP::instance()->settings->rc_name_singular;
$rcList = get_terms(
[
- 'taxonomy' => TouchPointWP::TAX_RESCODE,
+ 'taxonomy' => Taxonomies::TAX_RESCODE,
'hide_empty' => true,
TouchPointWP::HOOK_PREFIX . 'post_type' => $postType
]
@@ -1416,12 +1827,12 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
// Campuses
if (in_array('campus', $filters) && TouchPointWP::instance()->settings->enable_campuses === "on") {
$cName = TouchPointWP::instance()->settings->camp_name_singular;
- if (strtolower($cName) == "language") {
+ if (Translation::useCampusAsLanguage()) {
$cName = __("Language", 'TouchPoint-WP');
}
$cList = get_terms(
[
- 'taxonomy' => TouchPointWP::TAX_CAMPUS,
+ 'taxonomy' => Taxonomies::TAX_CAMPUS,
'hide_empty' => true,
TouchPointWP::HOOK_PREFIX . 'post_type' => $postType
]
@@ -1445,7 +1856,7 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
$wdName = __("Weekday", 'TouchPoint-WP');
$wdList = get_terms(
[
- 'taxonomy' => TouchPointWP::TAX_WEEKDAY,
+ 'taxonomy' => Taxonomies::TAX_WEEKDAY,
'hide_empty' => true,
'orderby' => 'id',
TouchPointWP::HOOK_PREFIX . 'post_type' => $postType
@@ -1471,7 +1882,7 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
$todName = __("Time of Day", 'TouchPoint-WP');
$todList = get_terms(
[
- 'taxonomy' => TouchPointWP::TAX_DAYTIME,
+ 'taxonomy' => Taxonomies::TAX_DAYTIME,
'hide_empty' => true,
'orderby' => 'id',
TouchPointWP::HOOK_PREFIX . 'post_type' => $postType
@@ -1505,7 +1916,7 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
if (in_array('agegroup', $filters)) {
$agName = __("Age", 'TouchPoint-WP');
$agList = get_terms([
- 'taxonomy' => TouchPointWP::TAX_AGEGROUP,
+ 'taxonomy' => Taxonomies::TAX_AGEGROUP,
'hide_empty' => true,
'orderby' => 't.id',
TouchPointWP::HOOK_PREFIX . 'post_type' => $postType
@@ -1522,19 +1933,19 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
if ($params['includeMapWarnings']) {
$content .= "
";
- $content .= sprintf(
+ $content .= wp_sprintf(
"%s ",
- sprintf(
+ wp_sprintf(
__("The %s listed are only those shown on the map.", 'TouchPoint-WP'),
$settings->namePlural
)
);
- $content .= sprintf(
+ $content .= wp_sprintf(
"%s ",
- sprintf(
+ wp_sprintf(
// translators: %s is the link to "reset the map"
__("Zoom out or %s to see more.", 'TouchPoint-WP'),
- sprintf(
+ wp_sprintf(
"%s",
_x("reset the map", "Zoom out or reset the map to see more.", 'TouchPoint-WP')
)
@@ -1553,13 +1964,17 @@ protected static final function filterDropdownHtml(array $params, Involvement_Po
*
* @param WP_Post $post
*
- * @return Involvement
+ * @return ?Involvement
*
* @throws TouchPointWP_Exception If the involvement can't be created from the post, an exception is thrown.
*/
- public static function fromPost(WP_Post $post): Involvement
+ public static function fromPost(WP_Post $post): ?Involvement
{
- $iid = intval($post->{self::INVOLVEMENT_META_KEY});
+ $iid = intval($post->{TouchPointWP::INVOLVEMENT_META_KEY});
+
+ if ($iid === 0) {
+ throw new TouchPointWP_Exception("Invalid Involvement ID provided.", 171002);
+ }
if ( ! isset(self::$_instances[$iid])) {
self::$_instances[$iid] = new Involvement($post);
@@ -1594,7 +2009,7 @@ public static function api(array $uri): bool
case "nearby":
TouchPointWP::doCacheHeaders(TouchPointWP::CACHE_PRIVATE);
self::ajaxNearby();
- exit;
+// exit; ajaxNearby() is no-return.
case "force-sync":
TouchPointWP::doCacheHeaders(TouchPointWP::CACHE_NONE);
@@ -1616,7 +2031,7 @@ public static function ajaxNearby(): void
$type = $_GET['type'] ?? "";
$lat = $_GET['lat'] ?? null;
$lng = $_GET['lng'] ?? null;
- $limit = $_GET['limit'] ?? null;
+ $limit = $_GET['limit'] ?? 10;
$settings = self::getSettingsForPostType($type);
@@ -1660,6 +2075,10 @@ public static function ajaxNearby(): void
exit;
}
+ if ($geoObj->type == "loc") {
+ $geoObj->type = "ip";
+ }
+
$lat = $geoObj->lat;
$lng = $geoObj->lng;
@@ -1668,6 +2087,7 @@ public static function ajaxNearby(): void
$geoObj = TouchPointWP::instance()->reverseGeocode($lat, $lng);
if ($geoObj !== false) {
+ $geoObj->type = "nav";
$r['geo'] = $geoObj;
}
}
@@ -1678,8 +2098,8 @@ public static function ajaxNearby(): void
http_response_code(Http::NOT_FOUND);
echo json_encode([
"invList" => [],
- "error" => sprintf("No %s Found.", $settings->namePlural),
- "error_i18n" => sprintf(__("No %s Found.", "TouchPoint-WP"), $settings->namePlural)
+ "error" => wp_sprintf("No %s Found.", $settings->namePlural),
+ "error_i18n" => wp_sprintf(__("No %s Found.", "TouchPoint-WP"), $settings->namePlural)
]);
exit;
}
@@ -1714,7 +2134,7 @@ public static function ajaxNearby(): void
* @param int $limit Number of results to return. 0-100 inclusive.
*
* @return object[]|null An array of database query result objects, or null if the location isn't provided or
- * valid.
+ * valid.
*/
private static function getInvsNear(float $lat, float $lng, string $postType, int $limit = 3): ?array
{
@@ -1728,6 +2148,7 @@ private static function getInvsNear(float $lat, float $lng, string $postType, in
global $wpdb;
$settingsPrefix = TouchPointWP::SETTINGS_PREFIX;
+ $metaInvId = TouchPointWP::INVOLVEMENT_META_KEY;
/** @noinspection SqlResolve */
$q = $wpdb->prepare(
"
@@ -1755,7 +2176,7 @@ private static function getInvsNear(float $lat, float $lng, string $postType, in
$wpdb->postmeta as pmClosed ON p.ID = pmClosed.post_id AND pmClosed.meta_key = '{$settingsPrefix}groupClosed'
WHERE p.post_type = %s AND pmClosed.meta_value != 1 AND pmFull.meta_value != 1
) as l
- JOIN $wpdb->postmeta as pmInv ON l.ID = pmInv.post_id AND pmInv.meta_key = '{$settingsPrefix}invId'
+ JOIN $wpdb->postmeta as pmInv ON l.ID = pmInv.post_id AND pmInv.meta_key = '$metaInvId'
ORDER BY distance LIMIT %d
",
$lat,
@@ -1769,25 +2190,6 @@ private static function getInvsNear(float $lat, float $lng, string $postType, in
}
- /**
- * Create a Involvement object from an object from a database query.
- *
- * @param object $obj A database object from which an Involvement object should be created.
- *
- * @return Involvement
- * @throws TouchPointWP_Exception
- */
- private static function fromObj(object $obj): Involvement
- {
- $iid = intval($obj->invId);
-
- if ( ! isset(self::$_instances[$iid])) {
- self::$_instances[$iid] = new Involvement($obj);
- }
-
- return self::$_instances[$iid];
- }
-
/**
* Create an Involvement object from an Involvement ID. Only Involvements that are already imported as Posts are
* currently available.
@@ -1878,7 +2280,7 @@ public static function updateCron(): void
{
try {
self::updateFromTouchPoint();
- } catch (Exception $ex) {
+ } catch (Exception) {
}
}
@@ -1900,7 +2302,7 @@ public function getDistance(bool $useHiForFalse = false)
return $useHiForFalse ? 25000 : false;
}
- return Utilities\Geo::distance(
+ return Geo::distance(
$this->geo->lat,
$this->geo->lng,
self::$compareGeo->lat,
@@ -1961,7 +2363,7 @@ public static function sortPosts(WP_Post $a, WP_Post $b): int
$b = self::fromPost($b);
return self::sort($a, $b);
- } catch (TouchPointWP_Exception $ex) {
+ } catch (TouchPointWP_Exception) {
return $a <=> $b;
}
}
@@ -2017,6 +2419,12 @@ public static function mapShortcode($params = [], string $content = ""): string
if ($params['all']) {
self::requireAllObjectsInJs();
self::$_hasArchiveMap = true;
+ } else {
+ // enqueue this object for js instantiation
+ $post = get_post();
+ if ($post) {
+ self::fromPost($post)?->enqueueForJsInstantiation();
+ }
}
$script = file_get_contents(TouchPointWP::$dir . "/src/js-partials/involvement-map-inline.js");
@@ -2028,7 +2436,6 @@ public static function mapShortcode($params = [], string $content = ""): string
$script
);
- // TODO move the style to a css file... or something.
$content = "
";
} else {
$content = "";
@@ -2037,7 +2444,6 @@ public static function mapShortcode($params = [], string $content = ""): string
return $content;
}
-
/**
* Indicates whether a map of a single Involvement can be displayed.
*
@@ -2052,38 +2458,35 @@ public function hasGeo(): bool
return $this->geo !== null && $this->geo->lat !== null && $this->geo->lng !== null;
}
- public function asGeoIFace(string $type = "unknown"): ?object
+ public function asGeoIFace(string $type = "unknown"): ?Geo
{
if ($this->hasGeo()) {
- return (object)[
- 'lat' => $this->geo->lat,
- 'lng' => $this->geo->lng,
- 'human' => $this->name,
- 'type' => $type
- ];
+ return new Geo(
+ $this->geo->lat,
+ $this->geo->lng,
+ $this->name,
+ $type
+ );
}
return null;
}
-
/**
* Update posts that are based on an involvement.
*
* @param Involvement_PostTypeSettings $typeSets
- * @param string|int $divs
* @param bool $verbose
*
* @return false|int False on failure. Otherwise, the number of updates.
*/
- final protected static function updateInvolvementPostsForType(
- Involvement_PostTypeSettings $typeSets,
- $divs,
- bool $verbose
- ) {
+ final protected static function updateInvolvementPostsForType(Involvement_PostTypeSettings $typeSets, bool $verbose): bool|int
+ {
$siteTz = wp_timezone();
- set_time_limit(180);
+ if (!set_time_limit(180) && $verbose) {
+ echo "
Time limit could not be extended. May not be able to complete all updates.
";
+
+ $meetingsCalled = $tps->mc_name_singular;
+
+ echo wp_sprintf(
+ // Translators: %s is the singular name of the of a Meeting, such as "Event".
+ __('This %s has been Cancelled.', 'TouchPoint-WP'),
+ __($meetingsCalled) // deliberately no domain
+ );
+ echo "
";
+ $heading = sprintf(
+ // translators: %1$s is the singular name of the event type, %2$s is the plural name of the event type
+ _n('Upcoming %1$s', 'Upcoming %2$s', 'TouchPoint-WP'),
+ TouchPointWP::instance()->settings->mc_name_singular,
+ TouchPointWP::instance()->settings->mc_name_plural
+ );
+ echo "