- New Cost_Tracker class: logs every API call (model, tokens, cost), enforces monthly budgets with hard-stop mode, provides aggregated reporting - New llm_costs database table with indexes on created_at, model, operation - Modified LLM class: call_openrouter_with_usage() extracts token usage from OpenRouter responses; budget gate checks before each API call - Admin settings: monthly budget (USD), enforcement mode (disabled/warn/hard-stop), cost log retention period - Admin cost dashboard: budget progress bar, daily cost chart (Chart.js), per-model and per-operation breakdowns, recent API call log - PHPUnit tests: 16 tests covering cost calculation, pricing lookups, budget enforcement logic, and model validation - Updated ARCHITECTURE.md with new table schema, data flow, and key decisions - Updated CONVENTIONS.md with "how to add cost tracking for a new operation" - Version bump to 2.4.0 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
372 lines
7.6 KiB
Plaintext
Executable File
372 lines
7.6 KiB
Plaintext
Executable File
# Peptide News Aggregator POT File
|
|
# Copyright (C) 2026 Peptide News Team
|
|
# This file is distributed under the GPL-2.0+.
|
|
#
|
|
msgid ""
|
|
msgstr ""
|
|
"Project-Id-Version: Peptide News Aggregator 1.0.0\n"
|
|
"Report-Msgid-Bugs-To: https://github.com/peptiderepo/peptide-news-plugin/issues\n"
|
|
"POT-Creation-Date: 2026-04-05 16:03+0000\n"
|
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
|
"Last-Translator: \n"
|
|
"Language-Team: \n"
|
|
"Language: \n"
|
|
"MIME-Version: 1.0\n"
|
|
"Content-Type: text/plain; charset=UTF-8\n"
|
|
"Content-Transfer-Encoding: 8bit\n"
|
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
|
|
#: admin/class-peptide-news-admin.php:149
|
|
msgid "API Key"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:42
|
|
msgid "Active"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:338
|
|
msgid "Add \"Peptide News\" from Appearance > Widgets."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:130
|
|
msgid "Add RSS feed URLs, one per line."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:154
|
|
msgid "Analytics"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:162
|
|
msgid "Analytics Data Retention (days)"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:285
|
|
msgid "Anonymize IP addresses for GDPR compliance"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:163
|
|
msgid "Anonymize IPs"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:89
|
|
msgid "Article"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:161
|
|
msgid "Article Retention (days)"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-admin.php:98
|
|
#: admin/class-peptide-news-admin.php:99
|
|
#: admin/partials/dashboard.php:124
|
|
msgid "Articles"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:55
|
|
msgid "Articles Clicked"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:122
|
|
msgid "Articles to Display"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:59
|
|
msgid "Avg Clicks / Article"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:38
|
|
#: admin/partials/dashboard.php:91
|
|
msgid "Categories"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:66
|
|
msgid "Click Trends"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:92
|
|
msgid "Clicks"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:225
|
|
msgid "Comma-separated keywords for NewsAPI searches."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:156
|
|
msgid "Configure click tracking and data retention."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:116
|
|
msgid "Configure how and when peptide news articles are fetched."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:194
|
|
msgid "Daily"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:73
|
|
msgid "Device Breakdown"
|
|
msgstr ""
|
|
|
|
#: public/class-peptide-news-public.php:260
|
|
msgid "Displays the latest peptide research news."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:148
|
|
msgid "Enable NewsAPI"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:135
|
|
msgid "Enable RSS Feeds"
|
|
msgstr ""
|
|
|
|
#: includes/class-peptide-news-fetcher.php:22
|
|
msgid "Every 15 Minutes"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:188
|
|
msgid "Every 15 minutes"
|
|
msgstr ""
|
|
|
|
#: includes/class-peptide-news-fetcher.php:26
|
|
msgid "Every 30 Minutes"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:189
|
|
msgid "Every 30 minutes"
|
|
msgstr ""
|
|
|
|
#: includes/class-peptide-news-fetcher.php:30
|
|
msgid "Every 4 Hours"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:191
|
|
msgid "Every 4 hours"
|
|
msgstr ""
|
|
|
|
#: includes/class-peptide-news-fetcher.php:34
|
|
msgid "Every 6 Hours"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:192
|
|
msgid "Every 6 hours"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:40
|
|
msgid "Export CSV"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:309
|
|
msgid "Fetch Articles Now"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:121
|
|
msgid "Fetch Interval"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:250
|
|
msgid "Fetch articles from NewsAPI.org"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:233
|
|
msgid "Fetch articles from RSS feeds"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:300
|
|
msgid "Fetch completed!"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:40
|
|
msgid "Fetched"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:39
|
|
msgid "Filter"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:319
|
|
msgid "Found"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:35
|
|
msgid "From:"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:114
|
|
msgid "General Settings"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:190
|
|
msgid "Hourly"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:277
|
|
msgid "How long to keep click analytics data."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:268
|
|
msgid "How long to keep fetched articles before deactivating them."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:207
|
|
msgid "How often to check for new articles. After changing, deactivate and reactivate the plugin."
|
|
msgstr ""
|
|
|
|
#: includes/class-peptide-news-rest-api.php:117
|
|
msgid "Invalid date format for %s. Expected Y-m-d."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:317
|
|
msgid "Last fetch"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:321
|
|
msgid "New stored"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:141
|
|
msgid "NewsAPI.org"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:47
|
|
msgid "No articles found. Run a fetch first."
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:98
|
|
msgid "No click data for this period."
|
|
msgstr ""
|
|
|
|
#: public/class-peptide-news-public.php:84
|
|
msgid "No peptide news articles available yet. Check back soon!"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:129
|
|
msgid "No topic data for this period."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:216
|
|
msgid "Number of articles to display in the shortcode/widget."
|
|
msgstr ""
|
|
|
|
#: public/class-peptide-news-public.php:296
|
|
msgid "Number of articles:"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:143
|
|
msgid "Optional. Get a free API key at newsapi.org."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:76
|
|
#: admin/class-peptide-news-admin.php:77
|
|
#: public/class-peptide-news-public.php:258
|
|
#: ... and 2 more
|
|
msgid "Peptide News"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:30
|
|
msgid "Peptide News Analytics"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:117
|
|
msgid "Popular Topics"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:39
|
|
msgid "Published"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:128
|
|
msgid "RSS Feed Sources"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:136
|
|
msgid "RSS Feed URLs"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:123
|
|
msgid "Search Keywords"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:88
|
|
#: admin/class-peptide-news-admin.php:89
|
|
msgid "Settings"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:335
|
|
msgid "Shortcode:"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:37
|
|
#: admin/partials/dashboard.php:90
|
|
msgid "Source"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:77
|
|
msgid "Source Performance"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:30
|
|
msgid "Stored Articles"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:41
|
|
msgid "Thumb"
|
|
msgstr ""
|
|
|
|
#: admin/partials/articles-list.php:36
|
|
msgid "Title"
|
|
msgstr ""
|
|
|
|
#: public/class-peptide-news-public.php:288
|
|
msgid "Title:"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:37
|
|
msgid "To:"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:84
|
|
msgid "Top Articles"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:122
|
|
msgid "Topic"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:47
|
|
#: admin/partials/dashboard.php:123
|
|
msgid "Total Clicks"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:193
|
|
msgid "Twice daily"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:362
|
|
msgid "Unauthorized."
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:93
|
|
msgid "Unique"
|
|
msgstr ""
|
|
|
|
#: admin/partials/dashboard.php:51
|
|
msgid "Unique Visitors"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:334
|
|
msgid "Usage"
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:337
|
|
msgid "Widget:"
|
|
msgstr ""
|
|
|
|
#: includes/class-peptide-news-rest-api.php:74
|
|
msgid "You do not have permission to access analytics data."
|
|
msgstr ""
|
|
|
|
#: admin/class-peptide-news-admin.php:336
|
|
msgid "or"
|
|
msgstr ""
|
|
|