···13# Database
14*.sqlite3
15db.sqlite3
16+17+# Compiled translation files (generated from .po)
18+*.mo
19+20+# Shapefile components (use fetch_wahlkreis_data to regenerate GeoJSON)
21+*.shp
22+*.shx
23+*.dbf
24+*.prj
25+*.cpg
26+*.sbn
27+*.sbx
28+*.shp.xml
29+*_shp_geo.zip
30+31+# GeoJSON data (generated by fetch_wahlkreis_data)
32+website/letters/data/wahlkreise.geojson
33+34+# Git worktrees
35+.worktrees/
+167-1
CLAUDE.md
···1-- use uv run python for every python command, including manage.py, scripts, temporary fixes, etc.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
···1+You are an experienced, pragmatic software engineer. You don't over-engineer a solution when a simple one is possible.
2+Rule #1: If you want exception to ANY rule, YOU MUST STOP and get explicit permission from Jesse first. BREAKING THE LETTER OR SPIRIT OF THE RULES IS FAILURE.
3+4+## Foundational rules
5+6+- Doing it right is better than doing it fast. You are not in a rush. NEVER skip steps or take shortcuts.
7+- Tedious, systematic work is often the correct solution. Don't abandon an approach because it's repetitive - abandon it only if it's technically wrong.
8+- Honesty is a core value. If you lie, you'll be replaced.
9+- You MUST think of and address your human partner as "Jesse" at all times
10+11+## Our relationship
12+13+- We're colleagues working together as "Jesse" and "Claude" - no formal hierarchy.
14+- Don't glaze me. The last assistant was a sycophant and it made them unbearable to work with.
15+- YOU MUST speak up immediately when you don't know something or we're in over our heads
16+- YOU MUST call out bad ideas, unreasonable expectations, and mistakes - I depend on this
17+- NEVER be agreeable just to be nice - I NEED your HONEST technical judgment
18+- NEVER write the phrase "You're absolutely right!" You are not a sycophant. We're working together because I value your opinion.
19+- YOU MUST ALWAYS STOP and ask for clarification rather than making assumptions.
20+- If you're having trouble, YOU MUST STOP and ask for help, especially for tasks where human input would be valuable.
21+- When you disagree with my approach, YOU MUST push back. Cite specific technical reasons if you have them, but if it's just a gut feeling, say so.
22+- If you're uncomfortable pushing back out loud, just say "Strange things are afoot at the Circle K". I'll know what you mean
23+- You have issues with memory formation both during and between conversations. Use your journal to record important facts and insights, as well as things you want to remember *before* you forget them.
24+- You search your journal when you trying to remember or figure stuff out.
25+- We discuss architectutral decisions (framework changes, major refactoring, system design)
26+ together before implementation. Routine fixes and clear implementations don't need
27+ discussion.
28+29+30+# Proactiveness
31+32+When asked to do something, just do it - including obvious follow-up actions needed to complete the task properly.
33+ Only pause to ask for confirmation when:
34+ - Multiple valid approaches exist and the choice matters
35+ - The action would delete or significantly restructure existing code
36+ - You genuinely don't understand what's being asked
37+ - Your partner specifically asks "how should I approach X?" (answer the question, don't jump to
38+ implementation)
39+40+## Designing software
41+42+- YAGNI. The best code is no code. Don't add features we don't need right now.
43+- When it doesn't conflict with YAGNI, architect for extensibility and flexibility.
44+45+46+## Test Driven Development (TDD)
47+48+- FOR EVERY NEW FEATURE OR BUGFIX, YOU MUST follow Test Driven Development :
49+ 1. Write a failing test that correctly validates the desired functionality
50+ 2. Run the test to confirm it fails as expected
51+ 3. Write ONLY enough code to make the failing test pass
52+ 4. Run the test to confirm success
53+ 5. Refactor if needed while keeping tests green
54+55+## Writing code
56+57+- When submitting work, verify that you have FOLLOWED ALL RULES. (See Rule #1)
58+- YOU MUST make the SMALLEST reasonable changes to achieve the desired outcome.
59+- We STRONGLY prefer simple, clean, maintainable solutions over clever or complex ones. Readability and maintainability are PRIMARY CONCERNS, even at the cost of conciseness or performance.
60+- YOU MUST WORK HARD to reduce code duplication, even if the refactoring takes extra effort.
61+- YOU MUST NEVER throw away or rewrite implementations without EXPLICIT permission. If you're considering this, YOU MUST STOP and ask first.
62+- YOU MUST get Jesse's explicit approval before implementing ANY backward compatibility.
63+- YOU MUST MATCH the style and formatting of surrounding code, even if it differs from standard style guides. Consistency within a file trumps external standards.
64+- YOU MUST NOT manually change whitespace that does not affect execution or output. Otherwise, use a formatting tool.
65+- Fix broken things immediately when you find them. Don't ask permission to fix bugs.
66+67+68+69+## Naming
70+71+ - Names MUST tell what code does, not how it's implemented or its history
72+ - When changing code, never document the old behavior or the behavior change
73+ - NEVER use implementation details in names (e.g., "ZodValidator", "MCPWrapper", "JSONParser")
74+ - NEVER use temporal/historical context in names (e.g., "NewAPI", "LegacyHandler", "UnifiedTool", "ImprovedInterface", "EnhancedParser")
75+ - NEVER use pattern names unless they add clarity (e.g., prefer "Tool" over "ToolFactory")
76+77+ Good names tell a story about the domain:
78+ - `Tool` not `AbstractToolInterface`
79+ - `RemoteTool` not `MCPToolWrapper`
80+ - `Registry` not `ToolRegistryManager`
81+ - `execute()` not `executeToolWithValidation()`
82+83+## Code Comments
84+85+ - NEVER add comments explaining that something is "improved", "better", "new", "enhanced", or referencing what it used to be
86+ - NEVER add instructional comments telling developers what to do ("copy this pattern", "use this instead")
87+ - Comments should explain WHAT the code does or WHY it exists, not how it's better than something else
88+ - If you're refactoring, remove old comments - don't add new ones explaining the refactoring
89+ - YOU MUST NEVER remove code comments unless you can PROVE they are actively false. Comments are important documentation and must be preserved.
90+ - YOU MUST NEVER add comments about what used to be there or how something has changed.
91+ - YOU MUST NEVER refer to temporal context in comments (like "recently refactored" "moved") or code. Comments should be evergreen and describe the code as it is. If you name something "new" or "enhanced" or "improved", you've probably made a mistake and MUST STOP and ask me what to do.
92+ - All code files MUST start with a brief 2-line comment explaining what the file does. Each line MUST start with "ABOUTME: " to make them easily greppable.
93+94+ Examples:
95+ // BAD: This uses Zod for validation instead of manual checking
96+ // BAD: Refactored from the old validation system
97+ // BAD: Wrapper around MCP tool protocol
98+ // GOOD: Executes tools with validated arguments
99+100+ If you catch yourself writing "new", "old", "legacy", "wrapper", "unified", or implementation details in names or comments, STOP and find a better name that describes the thing's
101+ actual purpose.
102+103+## Version Control
104+105+- If the project isn't in a git repo, STOP and ask permission to initialize one.
106+- YOU MUST STOP and ask how to handle uncommitted changes or untracked files when starting work. Suggest committing existing work first.
107+- When starting work without a clear branch for the current task, YOU MUST create a WIP branch.
108+- YOU MUST TRACK All non-trivial changes in git.
109+- YOU MUST commit frequently throughout the development process, even if your high-level tasks are not yet done. Commit your journal entries.
110+- NEVER SKIP, EVADE OR DISABLE A PRE-COMMIT HOOK
111+- NEVER use `git add -A` unless you've just done a `git status` - Don't add random test files to the repo.
112+113+## Testing
114+115+- ALL TEST FAILURES ARE YOUR RESPONSIBILITY, even if they're not your fault. The Broken Windows theory is real.
116+- Never delete a test because it's failing. Instead, raise the issue with Jesse.
117+- Tests MUST comprehensively cover ALL functionality.
118+- YOU MUST NEVER write tests that "test" mocked behavior. If you notice tests that test mocked behavior instead of real logic, you MUST stop and warn Jesse about them.
119+- YOU MUST NEVER implement mocks in end to end tests. We always use real data and real APIs.
120+- YOU MUST NEVER ignore system or test output - logs and messages often contain CRITICAL information.
121+- Test output MUST BE PRISTINE TO PASS. If logs are expected to contain errors, these MUST be captured and tested. If a test is intentionally triggering an error, we *must* capture and validate that the error output is as we expect
122+123+124+## Issue tracking
125+126+- You MUST use your TodoWrite tool to keep track of what you're doing
127+- You MUST NEVER discard tasks from your TodoWrite todo list without Jesse's explicit approval
128+129+## Systematic Debugging Process
130+131+YOU MUST ALWAYS find the root cause of any issue you are debugging
132+YOU MUST NEVER fix a symptom or add a workaround instead of finding a root cause, even if it is faster or I seem like I'm in a hurry.
133+134+YOU MUST follow this debugging framework for ANY technical issue:
135+136+### Phase 1: Root Cause Investigation (BEFORE attempting fixes)
137+- **Read Error Messages Carefully**: Don't skip past errors or warnings - they often contain the exact solution
138+- **Reproduce Consistently**: Ensure you can reliably reproduce the issue before investigating
139+- **Check Recent Changes**: What changed that could have caused this? Git diff, recent commits, etc.
140+141+### Phase 2: Pattern Analysis
142+- **Find Working Examples**: Locate similar working code in the same codebase
143+- **Compare Against References**: If implementing a pattern, read the reference implementation completely
144+- **Identify Differences**: What's different between working and broken code?
145+- **Understand Dependencies**: What other components/settings does this pattern require?
146+147+### Phase 3: Hypothesis and Testing
148+1. **Form Single Hypothesis**: What do you think is the root cause? State it clearly
149+2. **Test Minimally**: Make the smallest possible change to test your hypothesis
150+3. **Verify Before Continuing**: Did your test work? If not, form new hypothesis - don't add more fixes
151+4. **When You Don't Know**: Say "I don't understand X" rather than pretending to know
152+153+### Phase 4: Implementation Rules
154+- ALWAYS have the simplest possible failing test case. If there's no test framework, it's ok to write a one-off test script.
155+- NEVER add multiple fixes at once
156+- NEVER claim to implement a pattern without reading it completely first
157+- ALWAYS test after each change
158+- IF your first fix doesn't work, STOP and re-analyze rather than adding more fixes
159+160+## Learning and Memory Management
161+162+- YOU MUST use the journal tool frequently to capture technical insights, failed approaches, and user preferences
163+- Before starting complex tasks, search the journal for relevant past experiences and lessons learned
164+- Document architectural decisions and their outcomes for future reference
165+- Track patterns in user feedback to improve collaboration over time
166+- When you notice something that should be fixed but is unrelated to your current task, document it in your journal rather than fixing it immediately
167+- Always use uv run python manage.py {shell,runserver,test,etc}
+45-2
README.md
···41. Install dependencies with `uv sync`.
52. Run `uv run python manage.py migrate` from `website/` to bootstrap the database.
63. (Optional) Import representatives via `uv run python manage.py sync_representatives --level all`.
7-4. Launch the dev server with `uv run python manage.py runserver` and visit http://localhost:8000/.
00000000000000000000000000000000000000000089## Architecture
10- **Frameworks**: Django 5.2 / Python 3.13 managed with `uv`. The project root holds dependency metadata; all Django code lives in `website/` (settings in `writethem/`, app logic in `letters/`).
11- **Domain models**: `letters/models.py` defines parliaments, terms, constituencies, representatives, committees, letters, signatures, identity verification, and moderation reports. Relationships reflect multi-level mandates (EU/Federal/State) and committee membership.
12- **Sync pipeline**: `RepresentativeSyncService` (in `letters/services.py`) calls the Abgeordnetenwatch v2 API to create/update parliaments, terms, electoral districts, constituencies, representatives, and committee memberships. Management command `sync_representatives` orchestrates the import.
13-- **Suggestion engine**: `ConstituencySuggestionService` analyses letter titles + postal codes to recommend representatives, tags, and similar letters. The HTMX partial `letters/partials/suggestions.html` renders the live preview used on the letter form.
014- **Identity & signatures**: `IdentityVerificationService` (stub) attaches address information to users; signature counts and verification badges are derived from the associated verification records.
15- **Presentation**: Class-based views in `letters/views.py` back the main pages (letter list/detail, creation, representative detail, user profile). Templates under `letters/templates/` share layout via partials (e.g., `letter_card.html`).
16- **Utilities**: Management commands in `letters/management/commands/` cover representative sync, taxonomy tests, and helper scripts. Tests in `letters/tests.py` exercise model behaviour, letter flows, and the suggestion service.
···41. Install dependencies with `uv sync`.
52. Run `uv run python manage.py migrate` from `website/` to bootstrap the database.
63. (Optional) Import representatives via `uv run python manage.py sync_representatives --level all`.
7+4. Download constituency boundaries: `uv run python manage.py fetch_wahlkreis_data` (required for accurate address-based matching).
8+5. Launch the dev server with `uv run python manage.py runserver` and visit http://localhost:8000/.
9+10+## Internationalization
11+12+WriteThem.eu supports German (default) and English.
13+14+### Using the Site
15+16+- Visit `/de/` for German interface
17+- Visit `/en/` for English interface
18+- Use the language switcher in the header to toggle languages
19+- Language preference is saved in a cookie
20+21+### For Developers
22+23+**Translation workflow:**
24+25+1. Wrap new UI strings with translation functions:
26+ - Templates: `{% trans "Text" %}` or `{% blocktrans %}`
27+ - Python: `gettext()` or `gettext_lazy()`
28+29+2. Extract strings to .po files:
30+ ```bash
31+ cd website
32+ uv run python manage.py makemessages -l de -l en
33+ ```
34+35+3. Translate strings in `.po` files:
36+ - Edit `locale/de/LC_MESSAGES/django.po` (German translations)
37+ - Edit `locale/en/LC_MESSAGES/django.po` (English, mostly identity translations)
38+39+4. Compile translations:
40+ ```bash
41+ uv run python manage.py compilemessages
42+ ```
43+44+5. Check translation completeness:
45+ ```bash
46+ uv run python manage.py check_translations
47+ ```
48+49+**Important:** All code, comments, and translation keys should be in English. Only .po files contain actual translations.
5051## Architecture
52- **Frameworks**: Django 5.2 / Python 3.13 managed with `uv`. The project root holds dependency metadata; all Django code lives in `website/` (settings in `writethem/`, app logic in `letters/`).
53- **Domain models**: `letters/models.py` defines parliaments, terms, constituencies, representatives, committees, letters, signatures, identity verification, and moderation reports. Relationships reflect multi-level mandates (EU/Federal/State) and committee membership.
54- **Sync pipeline**: `RepresentativeSyncService` (in `letters/services.py`) calls the Abgeordnetenwatch v2 API to create/update parliaments, terms, electoral districts, constituencies, representatives, and committee memberships. Management command `sync_representatives` orchestrates the import.
55+- **Constituency matching**: `AddressGeocoder` converts full addresses to coordinates via OSM Nominatim (cached in `GeocodeCache`). `WahlkreisLocator` performs point-in-polygon lookups against official Bundestag GeoJSON boundaries. `ConstituencyLocator` integrates both with PLZ fallback. See `docs/matching-algorithm.md` for details.
56+- **Suggestion engine**: `ConstituencySuggestionService` analyses letter titles + addresses to recommend representatives, tags, and similar letters. The HTMX partial `letters/partials/suggestions.html` renders the live preview used on the letter form.
57- **Identity & signatures**: `IdentityVerificationService` (stub) attaches address information to users; signature counts and verification badges are derived from the associated verification records.
58- **Presentation**: Class-based views in `letters/views.py` back the main pages (letter list/detail, creation, representative detail, user profile). Templates under `letters/templates/` share layout via partials (e.g., `letter_card.html`).
59- **Utilities**: Management commands in `letters/management/commands/` cover representative sync, taxonomy tests, and helper scripts. Tests in `letters/tests.py` exercise model behaviour, letter flows, and the suggestion service.
···1+# Constituency Matching Algorithm
2+3+## Overview
4+5+WriteThem.eu uses a two-stage process to match users to their correct Bundestag constituency:
6+7+1. **Address Geocoding**: Convert user's address to latitude/longitude coordinates
8+2. **Point-in-Polygon Lookup**: Find which constituency polygon contains those coordinates
9+10+## Stage 1: Address Geocoding
11+12+We use OpenStreetMap's Nominatim API to convert addresses to coordinates.
13+14+### Process:
15+1. User provides: Street, Postal Code, City
16+2. System checks cache (GeocodeCache table) for previous results
17+3. If not cached, query Nominatim API with rate limiting (1 req/sec)
18+4. Cache result (success or failure) to minimize API calls
19+5. Return (latitude, longitude) or None
20+21+### Fallback:
22+If geocoding fails or user only provides postal code, fall back to PLZ prefix heuristic (maps first 2 digits to state).
23+24+## Stage 2: Point-in-Polygon Lookup
25+26+We use official Bundestag constituency boundaries (GeoJSON format) with shapely for geometric queries.
27+28+### Process:
29+1. Load GeoJSON with 299 Bundestag constituencies on startup
30+2. Create shapely Point from coordinates
31+3. Check which constituency Polygon contains the point
32+4. Look up Constituency object in database by external_id
33+5. Return Constituency or None
34+35+### Performance:
36+- GeoJSON loaded once at startup (~2MB in memory)
37+- Class-level caching prevents repeated loads
38+- Lookup typically takes 10-50ms
39+- No external API calls required
40+41+## Data Sources
42+43+- **Constituency Boundaries**: [dknx01/wahlkreissuche](https://github.com/dknx01/wahlkreissuche) (Open Data)
44+- **Geocoding**: [OpenStreetMap Nominatim](https://nominatim.openstreetmap.org/) (Open Data)
45+- **Representative Data**: [Abgeordnetenwatch API](https://www.abgeordnetenwatch.de/api)
46+47+## Accuracy
48+49+This approach provides constituency-accurate matching (exact Wahlkreis), significantly more precise than PLZ-based heuristics which only provide state-level accuracy.
50+51+### Known Limitations:
52+- Requires valid German address
53+- Dependent on OSM geocoding quality
54+- Rate limited to 1 request/second (public API)
55+56+## Implementation Details
57+58+### Services
59+60+- **AddressGeocoder** (`letters/services.py`): Handles geocoding with caching
61+- **WahlkreisLocator** (`letters/services.py`): Performs point-in-polygon matching
62+- **ConstituencyLocator** (`letters/services.py`): Integrates both services with PLZ fallback
63+64+### Database Models
65+66+- **GeocodeCache** (`letters/models.py`): Caches geocoding results to minimize API calls
67+- **Constituency** (`letters/models.py`): Stores constituency information with external_id mapping to GeoJSON
68+69+### Management Commands
70+71+- **fetch_wahlkreis_data**: Downloads official Bundestag constituency boundaries
72+- **query_wahlkreis**: Query constituency by address or postal code
73+- **query_topics**: Find matching topics for letter text
74+- **query_representatives**: Find representatives by address and/or topics
75+76+### Testing
77+78+Run the test suite:
79+```bash
80+python manage.py test letters.tests.test_address_matching
81+python manage.py test letters.tests.test_topic_mapping
82+python manage.py test letters.tests.test_constituency_suggestions
83+```
84+85+## Internationalization
86+87+The constituency matching system works identically in both German and English:
88+89+- Addresses can be entered in German format (standard use case)
90+- UI language (German/English) does not affect geocoding or matching logic
91+- Representative names, constituency names, and geographic data remain in original German
92+- All user-facing labels and messages are translated
···1+# Recipient Matching Vision
2+3+## Goal
4+Ensure every letter reaches the most relevant representative by combining precise constituency mapping with topic-awareness and reliable representative metadata.
5+6+## Core Pillars
7+8+1. **Constituency Precision**
9+ - Replace postal-prefix heuristics with official boundary data:
10+ - Bundestag Wahlkreise (Bundeswahlleiter / BKG GeoJSON)
11+ - Landtag electoral districts via state open-data portals or OParl feeds
12+ - EU parliament treated as nationwide constituency
13+ - Normalise mandate modes:
14+ - Direktmandat โ voters in that Wahlkreis
15+ - Landesliste โ voters in the state
16+ - Bundes/EU list โ national constituencies
17+ - Centralise the logic in a โconstituency routerโ so each parliamentโs data source is pluggable.
18+19+2. **Topic Understanding**
20+ - Analyse title + body to classify concerns into a canonical taxonomy (reuse committee topics, extend as needed).
21+ - Infer the responsible level (EU / Bund / Land / Kommune) from topic metadata.
22+ - Keep the topic model extensible (keyword heuristics today, embeddings or classifiers tomorrow).
23+24+3. **Rich Representative Profiles**
25+ - Build a `RepresentativeProfile` table to store per-source enrichments:
26+ - Source (ABGEORDNETENWATCH, BUNDESTAG, LANDTAG_*)
27+ - Normalised fields: focus areas, biography, external links, responsiveness
28+ - Raw metadata + sync timestamps
29+ - Importers:
30+ - Abgeordnetenwatch: `/politicians/{id}` (issues, responsiveness, social links)
31+ - Bundestag: official vita JSON (`mdbId`) for biography + spokesperson roles
32+ - Landtage: state-specific data feeds (OParl, CSV, or one-off scrapers)
33+ - Profiles coexist; the merging service resolves conflicts and picks the best available data.
34+35+## Matching Pipeline
36+1. **Constituency filter**: Use the router and mandate rules to determine eligible reps.
37+2. **Topic filter**: Narrow to the inferred level and portfolio.
38+3. **Scoring**: Blend signalsโconstituency proximity, topic match (committee โ topic), activity (votes, questions), responsiveness stats, optional user preferences.
39+4. **Explanation**: Provide human-readable reasons (โDirect MP for WK 123; sits on Verkehrsausschuss; answered 90% of Abgeordnetenwatch questionsโ).
40+41+## Data Sources Reference
42+43+| Use Case | Federal | State | EU |
44+|-------------------------|-------------------------------------|---------------------------------------------|--------------------------------|
45+| Mandates & committees | Abgeordnetenwatch API | Abgeordnetenwatch, OParl, Landtag portals | EU Parliament REST API |
46+| Constituency boundaries | Bundeswahlleiter GeoJSON, BKG | Landeswahlleitungen, state GIS datasets | Whole-of-Germany (single geom) |
47+| Biography / focus | Bundestag vita JSON, Abgeordnetenwatch issues | Landtag bios (open data) | Europarl member profiles |
48+49+## Implementation Notes
50+- Expose `sync_representative_profiles` commands per source; schedule separately from mandate sync.
51+- Track `source_version`/`hash` to avoid redundant imports.
52+- View layer consumes a `RepresentativeProfileService` that aggregates focus areas, biography, links, responsiveness.
53+- Keep a roadmap for future sources (party press, DIP21 votes, Europarl โfilesโ).
54+55+## Next Steps
56+- Implement `RepresentativeProfile` model + importers for Abgeordnetenwatch and Bundestag.
57+- Integrate boundary datasets and swap the PLZ router.
58+- Wire the matching pipeline into the letter form suggestions and automated routing.
59+- Add logging/monitoring for profile freshness and matching success.
60+
···1+# Identity Verification Vision
2+3+## Objective
4+Guarantee that only real, uniquely verified individuals can sign letters and that their constituency is provenโideally by reusing identities users already hold (e.g., Verimi, BundID, bank login) rather than forcing a new verification flow.
5+6+## Core Requirements
7+- **Proof of personhood:** Ensure each signature is tied to a real individual (no throwaway accounts).
8+- **Proof of constituency:** Capture verified address (street, PLZ, city) and map it to the correct Wahlkreis / Landtag district.
9+- **Reusable identity:** Prefer providers where users can consent to sharing existing verified attributes (lower friction than video calls).
10+- **Evidence retention:** Store cryptographically signed responses or verification references so we can prove the verification later.
11+- **Expiry / refresh:** Verification should have a validity window (e.g., re-check every 6โ12 months or when user updates address).
12+13+## Recommended Providers (Germany)
14+15+### Identity Wallets (best reuse experience)
16+- **Verimi** (OAuth2/OIDC)
17+ - Users already have a Verimi wallet โ grant consent โ we receive name + address.
18+ - Supports multiple underlying methods (eID, VideoIdent, bank sources).
19+- **BundID / BundesIdent** (official government ID)
20+ - OIDC-based access to Personalausweis attributes via government portal.
21+ - Gold standard for address proof; onboarding limited to approved use cases.
22+- **yesยฎ (yes.com)**
23+ - Bank login to participating institutions; returns bank-verified identity/address via OpenID Connect.
24+ - No new verification, just consent.
25+- **Signicat Identity Platform**
26+ - Aggregator: supports Verimi, yesยฎ, BankID, eIDAS. Useful if expansion beyond Germany is planned.
27+- **Nect Ident**
28+ - After an initial automated verification, users can re-share their identity from a wallet.
29+30+### Alternative Methods
31+- **BankIdent / PSD2 providers** (WebID BankIdent, yesยฎ, Deutsche Bank BankIdent)
32+ - Users log into their bank; returns name/address. High trust, no video.
33+- **eID solutions (AUTHADA, D-Trust)**
34+ - NFC-based Personalausweis reading; some provide reusable tokens after first use.
35+- **VideoIdent (IDnow, WebID VideoIdent, POSTIDENT)**
36+ - Higher friction; use as fallback when wallet/bank options fail.
37+38+## Integration Architecture
39+1. **Abstraction layer:** Implement a `VerificationProvider` interface with methods like `start_verification(user)` and `handle_callback(payload)`.
40+2. **Provider adapters:** Build adapters for Verimi, yesยฎ, BundID, etc., each handling OAuth2/OIDC flows, token validation, and attribute extraction.
41+3. **Verification storage:** Extend `IdentityVerification` to store provider name, verification reference, timestamp, address, and provider response hash/signature.
42+4. **Constituency mapping:** After receiving address data, run it through the constituency router (GeoJSON-based once available) to attach the exact direct-mandate seat/state.
43+5. **Expiry handling:** Add `expires_at`โprompt users to re-verify when outdated or on address change.
44+6. **Audit trail:** Log provider responses; maintain a verification history per user.
45+7. **Fallback/manual path:** Offer manual verification (moderator-reviewed documents) only if all automated providers fail, clearly flagging such signatures.
46+47+## User Flow Blueprint
48+1. User chooses โVerify identityโ.
49+2. We present available providers (Verimi, yesยฎ, BundIDโฆ).
50+3. User authenticates/consents with chosen provider.
51+4. Provider redirects back / sends webhook with verification result + attributes.
52+5. We validate response, persist identity data, and map PLZ โ constituency.
53+6. Signatures now display โVerified constituentโ (and reinforce direct mandates with proof).
54+55+## Implementation Priorities
56+- Start with a wallet provider (Verimi or yesยฎ) for minimal friction.
57+- Add BundID for maximum trust where accessible.
58+- Abstract architecture so adding Landtag-specific providers later is straightforward.
59+- Ensure we can reuse the same verification across multiple letters until it expires.
60+61+## Outstanding Questions
62+- Do we need different assurance levels for general signatures vs. direct-mandate proof? (e.g., allow bank login for signing, but require eID for constituency-critical interactions?)
63+- How to handle users without access to any supported provider? (Manual override / postal verification?)
64+- Data protection & consent: store only whatโs necessary (likely name + address); ensure GDPR-compliant retention policies.
65+
···1-# Recipient Matching Vision
2-3-## Goal
4-Ensure every letter reaches the most relevant representative by combining precise constituency mapping with topic-awareness and reliable representative metadata.
5-6-## Core Pillars
7-8-1. **Constituency Precision**
9- - Replace postal-prefix heuristics with official boundary data:
10- - Bundestag Wahlkreise (Bundeswahlleiter / BKG GeoJSON)
11- - Landtag electoral districts via state open-data portals or OParl feeds
12- - EU parliament treated as nationwide constituency
13- - Normalise mandate modes:
14- - Direktmandat โ voters in that Wahlkreis
15- - Landesliste โ voters in the state
16- - Bundes/EU list โ national constituencies
17- - Centralise the logic in a โconstituency routerโ so each parliamentโs data source is pluggable.
18-19-2. **Topic Understanding**
20- - Analyse title + body to classify concerns into a canonical taxonomy (reuse committee topics, extend as needed).
21- - Infer the responsible level (EU / Bund / Land / Kommune) from topic metadata.
22- - Keep the topic model extensible (keyword heuristics today, embeddings or classifiers tomorrow).
23-24-3. **Rich Representative Profiles**
25- - Build a `RepresentativeProfile` table to store per-source enrichments:
26- - Source (ABGEORDNETENWATCH, BUNDESTAG, LANDTAG_*)
27- - Normalised fields: focus areas, biography, external links, responsiveness
28- - Raw metadata + sync timestamps
29- - Importers:
30- - Abgeordnetenwatch: `/politicians/{id}` (issues, responsiveness, social links)
31- - Bundestag: official vita JSON (`mdbId`) for biography + spokesperson roles
32- - Landtage: state-specific data feeds (OParl, CSV, or one-off scrapers)
33- - Profiles coexist; the merging service resolves conflicts and picks the best available data.
34-35-## Matching Pipeline
36-1. **Constituency filter**: Use the router and mandate rules to determine eligible reps.
37-2. **Topic filter**: Narrow to the inferred level and portfolio.
38-3. **Scoring**: Blend signalsโconstituency proximity, topic match (committee โ topic), activity (votes, questions), responsiveness stats, optional user preferences.
39-4. **Explanation**: Provide human-readable reasons (โDirect MP for WK 123; sits on Verkehrsausschuss; answered 90% of Abgeordnetenwatch questionsโ).
40-41-## Data Sources Reference
42-43-| Use Case | Federal | State | EU |
44-|-------------------------|-------------------------------------|---------------------------------------------|--------------------------------|
45-| Mandates & committees | Abgeordnetenwatch API | Abgeordnetenwatch, OParl, Landtag portals | EU Parliament REST API |
46-| Constituency boundaries | Bundeswahlleiter GeoJSON, BKG | Landeswahlleitungen, state GIS datasets | Whole-of-Germany (single geom) |
47-| Biography / focus | Bundestag vita JSON, Abgeordnetenwatch issues | Landtag bios (open data) | Europarl member profiles |
48-49-## Implementation Notes
50-- Expose `sync_representative_profiles` commands per source; schedule separately from mandate sync.
51-- Track `source_version`/`hash` to avoid redundant imports.
52-- View layer consumes a `RepresentativeProfileService` that aggregates focus areas, biography, links, responsiveness.
53-- Keep a roadmap for future sources (party press, DIP21 votes, Europarl โfilesโ).
54-55-## Next Steps
56-- Implement `RepresentativeProfile` model + importers for Abgeordnetenwatch and Bundestag.
57-- Integrate boundary datasets and swap the PLZ router.
58-- Wire the matching pipeline into the letter form suggestions and automated routing.
59-- Add logging/monitoring for profile freshness and matching success.
60-
···1-# Identity Verification Vision
2-3-## Objective
4-Guarantee that only real, uniquely verified individuals can sign letters and that their constituency is provenโideally by reusing identities users already hold (e.g., Verimi, BundID, bank login) rather than forcing a new verification flow.
5-6-## Core Requirements
7-- **Proof of personhood:** Ensure each signature is tied to a real individual (no throwaway accounts).
8-- **Proof of constituency:** Capture verified address (street, PLZ, city) and map it to the correct Wahlkreis / Landtag district.
9-- **Reusable identity:** Prefer providers where users can consent to sharing existing verified attributes (lower friction than video calls).
10-- **Evidence retention:** Store cryptographically signed responses or verification references so we can prove the verification later.
11-- **Expiry / refresh:** Verification should have a validity window (e.g., re-check every 6โ12 months or when user updates address).
12-13-## Recommended Providers (Germany)
14-15-### Identity Wallets (best reuse experience)
16-- **Verimi** (OAuth2/OIDC)
17- - Users already have a Verimi wallet โ grant consent โ we receive name + address.
18- - Supports multiple underlying methods (eID, VideoIdent, bank sources).
19-- **BundID / BundesIdent** (official government ID)
20- - OIDC-based access to Personalausweis attributes via government portal.
21- - Gold standard for address proof; onboarding limited to approved use cases.
22-- **yesยฎ (yes.com)**
23- - Bank login to participating institutions; returns bank-verified identity/address via OpenID Connect.
24- - No new verification, just consent.
25-- **Signicat Identity Platform**
26- - Aggregator: supports Verimi, yesยฎ, BankID, eIDAS. Useful if expansion beyond Germany is planned.
27-- **Nect Ident**
28- - After an initial automated verification, users can re-share their identity from a wallet.
29-30-### Alternative Methods
31-- **BankIdent / PSD2 providers** (WebID BankIdent, yesยฎ, Deutsche Bank BankIdent)
32- - Users log into their bank; returns name/address. High trust, no video.
33-- **eID solutions (AUTHADA, D-Trust)**
34- - NFC-based Personalausweis reading; some provide reusable tokens after first use.
35-- **VideoIdent (IDnow, WebID VideoIdent, POSTIDENT)**
36- - Higher friction; use as fallback when wallet/bank options fail.
37-38-## Integration Architecture
39-1. **Abstraction layer:** Implement a `VerificationProvider` interface with methods like `start_verification(user)` and `handle_callback(payload)`.
40-2. **Provider adapters:** Build adapters for Verimi, yesยฎ, BundID, etc., each handling OAuth2/OIDC flows, token validation, and attribute extraction.
41-3. **Verification storage:** Extend `IdentityVerification` to store provider name, verification reference, timestamp, address, and provider response hash/signature.
42-4. **Constituency mapping:** After receiving address data, run it through the constituency router (GeoJSON-based once available) to attach the exact direct-mandate seat/state.
43-5. **Expiry handling:** Add `expires_at`โprompt users to re-verify when outdated or on address change.
44-6. **Audit trail:** Log provider responses; maintain a verification history per user.
45-7. **Fallback/manual path:** Offer manual verification (moderator-reviewed documents) only if all automated providers fail, clearly flagging such signatures.
46-47-## User Flow Blueprint
48-1. User chooses โVerify identityโ.
49-2. We present available providers (Verimi, yesยฎ, BundIDโฆ).
50-3. User authenticates/consents with chosen provider.
51-4. Provider redirects back / sends webhook with verification result + attributes.
52-5. We validate response, persist identity data, and map PLZ โ constituency.
53-6. Signatures now display โVerified constituentโ (and reinforce direct mandates with proof).
54-55-## Implementation Priorities
56-- Start with a wallet provider (Verimi or yesยฎ) for minimal friction.
57-- Add BundID for maximum trust where accessible.
58-- Abstract architecture so adding Landtag-specific providers later is straightforward.
59-- Ensure we can reuse the same verification across multiple letters until it expires.
60-61-## Outstanding Questions
62-- Do we need different assurance levels for general signatures vs. direct-mandate proof? (e.g., allow bank login for signing, but require eID for constituency-critical interactions?)
63-- How to handle users without access to any supported provider? (Manual override / postal verification?)
64-- Data protection & consent: store only whatโs necessary (likely name + address); ensure GDPR-compliant retention policies.
65-
···1-"""
2-Management command to test topic-to-constituency mapping.
3-4-Provides examples of how the topic suggestion service works.
5-"""
6-7-from django.core.management.base import BaseCommand
8-from letters.services import TopicSuggestionService
9-10-11-class Command(BaseCommand):
12- help = 'Test topic-to-constituency mapping with example concerns'
13-14- def add_arguments(self, parser):
15- parser.add_argument(
16- '--concern',
17- type=str,
18- help='Custom concern text to test',
19- )
20-21- def handle(self, *args, **options):
22- custom_concern = options.get('concern')
23-24- if custom_concern:
25- # Test custom concern
26- self.test_concern(custom_concern)
27- else:
28- # Test predefined examples
29- self.stdout.write(self.style.MIGRATE_HEADING('\nTesting Topic-to-Constituency Mapping\n'))
30-31- test_cases = [
32- "I want to see better train connections between cities",
33- "We need more affordable housing and rent control",
34- "Our school curriculum needs reform",
35- "Climate protection and CO2 emissions must be addressed",
36- "Better bus services in my town",
37- "Deutsche Bahn is always late",
38- "University tuition fees should be abolished",
39- "We need stronger EU trade agreements",
40- "Police funding in our state is too low",
41- "Renewable energy expansion is too slow",
42- ]
43-44- for concern in test_cases:
45- self.test_concern(concern)
46- self.stdout.write('') # Blank line
47-48- def test_concern(self, concern_text: str):
49- """Test a single concern and display results."""
50- self.stdout.write(self.style.SUCCESS(f'Concern: "{concern_text}"'))
51-52- # Get topic suggestions only (lightweight)
53- topics = TopicSuggestionService.get_topic_suggestions(concern_text)
54-55- if topics:
56- self.stdout.write(self.style.WARNING(' Matched Topics:'))
57- for topic in topics[:3]: # Show top 3
58- self.stdout.write(f' โข {topic["name"]} ({topic["level"]}) - Score: {topic["match_score"]}')
59- self.stdout.write(f' {topic["description"]}')
60- else:
61- self.stdout.write(self.style.WARNING(' No specific topics matched'))
62-63- # Get full suggestions with representatives
64- result = TopicSuggestionService.suggest_representatives_for_concern(
65- concern_text,
66- limit=3
67- )
68-69- self.stdout.write(self.style.WARNING(f' Suggested Level: {result["suggested_level"]}'))
70- self.stdout.write(self.style.WARNING(f' Explanation: {result["explanation"]}'))
71-72- if result['suggested_constituencies']:
73- self.stdout.write(self.style.WARNING(' Suggested Constituencies:'))
74- for const in result['suggested_constituencies'][:3]:
75- self.stdout.write(f' โข {const.name} ({const.level})')
76-77- if result['suggested_representatives']:
78- self.stdout.write(self.style.WARNING(' Suggested Representatives:'))
79- for rep in result['suggested_representatives']:
80- party = f' ({rep.party})' if rep.party else ''
81- constituency = rep.primary_constituency
82- constituency_label = constituency.name if constituency else rep.parliament.name
83- self.stdout.write(f' โข {rep.full_name}{party} - {constituency_label}')
84- else:
85- self.stdout.write(self.style.WARNING(' (No representatives found - run sync_representatives first)'))
···38 {% if is_paginated %}
39 <div style="text-align: center; margin: 2rem 0;">
40 {% if page_obj.has_previous %}
41+ <a href="?page={{ page_obj.previous_page_number }}" class="btn btn-secondary">{% trans "Previous" %}</a>
42 {% endif %}
43+ <span style="margin: 0 1rem;">{% blocktrans with page=page_obj.number total=page_obj.paginator.num_pages %}Page {{ page }} of {{ total }}{% endblocktrans %}</span>
44 {% if page_obj.has_next %}
45+ <a href="?page={{ page_obj.next_page_number }}" class="btn btn-secondary">{% trans "Next" %}</a>
46 {% endif %}
47 </div>
48 {% endif %}
49{% else %}
50 <div class="card">
51+ <p>{% trans "No letters found." %} <a href="{% url 'letter_create' %}">{% trans "Be the first to write one!" %}</a></p>
52 </div>
53{% endif %}
54{% endblock %}
+33
website/letters/templates/letters/profile.html
···52 </div>
5354 <div class="mt-4">
00000000000000000000000000000000055 <h3>{% trans "Self-declare your constituency" %}</h3>
56 <p class="text-muted">
57 {% trans "Select the constituencies you live in so we can prioritise the right representatives." %}
···52 </div>
5354 <div class="mt-4">
55+ <h3>{% trans "Ihre Adresse" %}</h3>
56+ <p class="text-muted">
57+ {% trans "Geben Sie Ihre vollstรคndige Adresse ein, um prรคzise Wahlkreis- und Abgeordnetenempfehlungen zu erhalten." %}
58+ </p>
59+ {% if verification and verification.street_address %}
60+ <div class="alert alert-info" role="status">
61+ <strong>{% trans "Gespeicherte Adresse:" %}</strong><br>
62+ {{ verification.street_address }}<br>
63+ {{ verification.postal_code }} {{ verification.city }}
64+ </div>
65+ {% endif %}
66+ <form method="post" class="mt-3">
67+ {% csrf_token %}
68+ {% if address_form.non_field_errors %}
69+ <div class="alert alert-danger">{{ address_form.non_field_errors }}</div>
70+ {% endif %}
71+ {% for field in address_form %}
72+ <div class="form-group mb-3">
73+ <label for="{{ field.id_for_label }}" class="form-label">{{ field.label }}</label>
74+ {{ field }}
75+ {% if field.errors %}
76+ <div class="text-danger small">{{ field.errors|join:', ' }}</div>
77+ {% endif %}
78+ {% if field.help_text %}
79+ <small class="form-text text-muted">{{ field.help_text }}</small>
80+ {% endif %}
81+ </div>
82+ {% endfor %}
83+ <button type="submit" name="address_form_submit" class="btn btn-primary">{% trans "Adresse speichern" %}</button>
84+ </form>
85+ </div>
86+87+ <div class="mt-4">
88 <h3>{% trans "Self-declare your constituency" %}</h3>
89 <p class="text-muted">
90 {% trans "Select the constituencies you live in so we can prioritise the right representatives." %}
+2
website/letters/tests/__init__.py
···00
···1+# ABOUTME: Test package for letters app.
2+# ABOUTME: Contains tests for address matching, topic mapping, and constituency suggestions.
···1+# ABOUTME: Test topic suggestion and matching based on letter content.
2+# ABOUTME: Covers TopicSuggestionService keyword matching and level suggestion logic.
3+4+from django.test import TestCase
5+from letters.services import TopicSuggestionService
6+from letters.models import TopicArea
7+8+9+class TopicMatchingTests(TestCase):
10+ """Test topic keyword matching and scoring."""
11+12+ def setUp(self):
13+ """Check if topic data is available."""
14+ self.has_topics = TopicArea.objects.exists()
15+16+ def test_transport_keywords_match_verkehr_topic(self):
17+ """Test that transport-related keywords match Verkehr topic."""
18+ if not self.has_topics:
19+ self.skipTest("TopicArea data not loaded")
20+21+ concern = "I want to see better train connections between cities"
22+ result = TopicSuggestionService.suggest_representatives_for_concern(concern)
23+24+ # Should find at least one topic
25+ matched_topics = result.get('matched_topics', [])
26+ self.assertGreater(len(matched_topics), 0)
27+28+ def test_housing_keywords_match_wohnen_topic(self):
29+ """Test that housing keywords match Wohnen topic."""
30+ if not self.has_topics:
31+ self.skipTest("TopicArea data not loaded")
32+33+ concern = "We need more affordable housing and rent control"
34+ result = TopicSuggestionService.suggest_representatives_for_concern(concern)
35+36+ matched_topics = result.get('matched_topics', [])
37+ self.assertGreater(len(matched_topics), 0)
38+39+ def test_education_keywords_match_bildung_topic(self):
40+ """Test that education keywords match Bildung topic."""
41+ if not self.has_topics:
42+ self.skipTest("TopicArea data not loaded")
43+44+ concern = "Our school curriculum needs reform"
45+ result = TopicSuggestionService.suggest_representatives_for_concern(concern)
46+47+ matched_topics = result.get('matched_topics', [])
48+ self.assertGreater(len(matched_topics), 0)
49+50+ def test_climate_keywords_match_umwelt_topic(self):
51+ """Test that climate keywords match environment topic."""
52+ if not self.has_topics:
53+ self.skipTest("TopicArea data not loaded")
54+55+ concern = "Climate protection and CO2 emissions must be addressed"
56+ result = TopicSuggestionService.suggest_representatives_for_concern(concern)
57+58+ matched_topics = result.get('matched_topics', [])
59+ self.assertGreater(len(matched_topics), 0)
60+61+ def test_no_match_returns_empty_list(self):
62+ """Test that completely unrelated text returns empty list."""
63+ concern = "xyzabc nonsense gibberish"
64+ result = TopicSuggestionService.suggest_representatives_for_concern(concern)
65+66+ matched_topics = result.get('matched_topics', [])
67+ # Should return empty list for gibberish
68+ self.assertEqual(len(matched_topics), 0)
69+70+71+class LevelSuggestionTests(TestCase):
72+ """Test government level suggestion logic."""
73+74+ def test_federal_transport_suggests_federal_level(self):
75+ """Test that long-distance transport suggests federal level."""
76+ result = TopicSuggestionService.suggest_representatives_for_concern(
77+ "Deutsche Bahn is always late",
78+ limit=5
79+ )
80+81+ self.assertIn('suggested_level', result)
82+ self.assertIn('explanation', result)
83+ # Federal issues should suggest FEDERAL level
84+ suggested_level = result['suggested_level']
85+ self.assertIsNotNone(suggested_level)
86+ self.assertIn('FEDERAL', suggested_level)
87+88+ def test_local_bus_suggests_state_or_local(self):
89+ """Test that local transport suggests state/local level."""
90+ result = TopicSuggestionService.suggest_representatives_for_concern(
91+ "Better bus services in my town",
92+ limit=5
93+ )
94+95+ self.assertIn('suggested_level', result)
96+ self.assertIn('explanation', result)
97+ # Should have an explanation
98+ self.assertIsNotNone(result['explanation'])
99+100+101+# End of file
···29 ReportForm,
30 LetterSearchForm,
31 UserRegisterForm,
32+ SelfDeclaredConstituencyForm,
33+ IdentityVerificationForm
34)
35from .services import IdentityVerificationService, ConstituencySuggestionService
36···315 verification = None
316317 if request.method == 'POST':
318+ # Check which form was submitted
319+ if 'address_form_submit' in request.POST:
320+ address_form = IdentityVerificationForm(request.POST, user=user)
321+ constituency_form = SelfDeclaredConstituencyForm(user=user)
322+323+ if address_form.is_valid():
324+ street_address = address_form.cleaned_data.get('street_address')
325+ postal_code = address_form.cleaned_data.get('postal_code')
326+ city = address_form.cleaned_data.get('city')
327+328+ # Only update if all fields are provided
329+ if street_address and postal_code and city:
330+ # Get or create verification record
331+ verification, created = IdentityVerification.objects.get_or_create(
332+ user=user,
333+ defaults={
334+ 'status': 'SELF_DECLARED',
335+ 'verification_type': 'SELF_DECLARED',
336+ }
337+ )
338+339+ # Update address fields
340+ verification.street_address = street_address
341+ verification.postal_code = postal_code
342+ verification.city = city
343+ verification.save()
344+345+ messages.success(
346+ request,
347+ _('Ihre Adresse wurde gespeichert.')
348+ )
349+ return redirect('profile')
350+ else:
351+ # Constituency form submission
352+ constituency_form = SelfDeclaredConstituencyForm(request.POST, user=user)
353+ address_form = IdentityVerificationForm(user=user)
354+355+ if constituency_form.is_valid():
356+ IdentityVerificationService.self_declare(
357+ user=user,
358+ federal_constituency=constituency_form.cleaned_data['federal_constituency'],
359+ state_constituency=constituency_form.cleaned_data['state_constituency'],
360+ )
361+ messages.success(
362+ request,
363+ _('Your constituency information has been updated.')
364+ )
365+ return redirect('profile')
366 else:
367 constituency_form = SelfDeclaredConstituencyForm(user=user)
368+ address_form = IdentityVerificationForm(user=user)
369370 context = {
371 'user_letters': user_letters,
372 'user_signatures': user_signatures,
373 'verification': verification,
374 'constituency_form': constituency_form,
375+ 'address_form': address_form,
376 }
377378 return render(request, 'letters/profile.html', context)
website/locale/de/LC_MESSAGES/.gitkeep
This is a binary file and will not be displayed.
website/locale/de/LC_MESSAGES/django.mo
This is a binary file and will not be displayed.
+840-409
website/locale/de/LC_MESSAGES/django.po
···6msgstr ""
7"Project-Id-Version: WriteThem.eu\n"
8"Report-Msgid-Bugs-To: \n"
9-"POT-Creation-Date: 2025-10-04 22:57+0200\n"
10"PO-Revision-Date: 2025-01-10 12:00+0100\n"
11"Last-Translator: \n"
12"Language-Team: German\n"
···16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=(n != 1);\n"
1819-# Forms
20-#: letters/forms.py:28
21-msgid "Postal code (PLZ)"
22-msgstr "Postleitzahl (PLZ)"
2324-#: letters/forms.py:29
25-#, fuzzy
26-#| msgid "Use your PLZ to narrow down representatives from your constituency."
27-msgid "Use your PLZ to narrow down representatives from your parliament."
28-msgstr ""
29-"Verwenden Sie Ihre PLZ, um Abgeordnete aus Ihrem Wahlkreis einzugrenzen."
3031-#: letters/forms.py:30
32-msgid "e.g. 10115"
33-msgstr "z.B. 10115"
3435-#: letters/forms.py:35
36-msgid "Comma-separated tags (e.g., \"climate, transport, education\")"
37-msgstr "Komma-getrennte Schlagwรถrter (z.B. \"Klima, Verkehr, Bildung\")"
3839-#: letters/forms.py:36
40-msgid "climate, transport, education"
41-msgstr "Klima, Verkehr, Bildung"
00000000000004243-#: letters/forms.py:43
44msgid "Title"
45msgstr "Titel"
4647-#: letters/forms.py:44
48msgid "Letter Body"
49msgstr "Brieftext"
5051-#: letters/forms.py:45
52-#, fuzzy
53-#| msgid "To Representative:"
54msgid "To Representative"
55-msgstr "An Abgeordnete:"
5657-#: letters/forms.py:48
58msgid "Describe your concern briefly"
59msgstr "Beschreiben Sie Ihr Anliegen kurz"
6061-#: letters/forms.py:49
62-msgid "Write your letter here"
63-msgstr "Schreiben Sie hier Ihren Brief"
00006465-#: letters/forms.py:52
66msgid "Letter title"
67msgstr "Brieftitel"
6869-#: letters/forms.py:56
70msgid "Write your letter here..."
71msgstr "Schreiben Sie hier Ihren Brief..."
7273-#: letters/forms.py:156
74msgid "Comment (optional)"
75msgstr "Kommentar (optional)"
7677-#: letters/forms.py:159
78msgid "Add a personal note to your signature"
79msgstr "Fรผgen Sie Ihrer Unterschrift eine persรถnliche Notiz hinzu"
8081-#: letters/forms.py:165
82msgid "Optional: Add your comment..."
83msgstr "Optional: Fรผgen Sie Ihren Kommentar hinzu..."
8485-#: letters/forms.py:177
86msgid "Reason"
87msgstr "Grund"
8889-#: letters/forms.py:178
90msgid "Description"
91msgstr "Beschreibung"
9293-#: letters/forms.py:181
94msgid "Please provide details about why you are reporting this letter"
95msgstr "Bitte geben Sie Details an, warum Sie diesen Brief melden"
9697-#: letters/forms.py:188
98msgid "Please describe the issue..."
99msgstr "Bitte beschreiben Sie das Problem..."
100101-#: letters/forms.py:198 letters/templates/letters/letter_list.html:19
102msgid "Search"
103msgstr "Suchen"
104105-#: letters/forms.py:201 letters/templates/letters/letter_list.html:18
106msgid "Search letters..."
107msgstr "Briefe suchen..."
108109-#: letters/forms.py:207
110msgid "Tag"
111msgstr "Schlagwort"
112113-#: letters/forms.py:210
114msgid "Filter by tag..."
115msgstr "Nach Schlagwort filtern..."
11600000000000000000000000000000000000000000000000000000000117# Model choices - Constituency
118-#: letters/models.py:13
119msgid "European Union"
120msgstr "Europรคische Union"
121122-#: letters/models.py:14
123msgid "Federal"
124msgstr "Bund"
125126-#: letters/models.py:15
127msgid "State"
128msgstr "Land"
129130-#: letters/models.py:16
131msgid "Local"
132msgstr "Kommune"
133134-#: letters/models.py:19
135msgid "Name of the parliament"
136-msgstr ""
137138-#: letters/models.py:23
139msgid "e.g., 'Bundestag', 'Bayerischer Landtag', 'Gemeinderat Mรผnchen'"
140-msgstr ""
141142-#: letters/models.py:27
143msgid "Geographic identifier (state code, municipality code, etc.)"
144-msgstr ""
145146-#: letters/models.py:35
147msgid "For hierarchical relationships (e.g., local within state)"
148-msgstr ""
00000149150-#: letters/models.py:44
151msgid "Parliament"
152-msgstr ""
153154-#: letters/models.py:45
155msgid "Parliaments"
156-msgstr ""
157-158-#: letters/models.py:80
159-#, fuzzy
160-#| msgid "Federal"
161-msgid "Federal district"
162-msgstr "Bund"
163-164-#: letters/models.py:81
165-msgid "State district"
166-msgstr ""
167-168-#: letters/models.py:82
169-msgid "Regional district"
170-msgstr ""
171172-#: letters/models.py:114
173msgid "Federal electoral district"
174-msgstr ""
175176-#: letters/models.py:115
177msgid "Bundestag state list"
178-msgstr ""
179180-#: letters/models.py:116
181msgid "Bundestag federal list"
182-msgstr ""
183184-#: letters/models.py:117
185msgid "State electoral district"
186-msgstr ""
187188-#: letters/models.py:118
189msgid "State regional list"
190-msgstr ""
191192-#: letters/models.py:119
193msgid "State wide list"
194-msgstr ""
195196-#: letters/models.py:120
197msgid "EU at large"
198-msgstr ""
199200-#: letters/models.py:153
201msgid "Direct mandate"
202-msgstr ""
203204-#: letters/models.py:154
205msgid "State list mandate"
206-msgstr ""
207208-#: letters/models.py:155
209msgid "State regional list mandate"
210-msgstr ""
211212-#: letters/models.py:156
213msgid "Federal list mandate"
214-msgstr ""
215216-#: letters/models.py:157
217msgid "EU list mandate"
218-msgstr ""
219220# Model choices - Letter
221-#: letters/models.py:422
222msgid "Draft"
223msgstr "Entwurf"
224225-#: letters/models.py:423
226msgid "Published"
227msgstr "Verรถffentlicht"
228229-#: letters/models.py:424
230msgid "Flagged for Review"
231msgstr "Zur รberprรผfung markiert"
232233-#: letters/models.py:425
234msgid "Removed"
235msgstr "Entfernt"
236237-#: letters/services.py:1149
0000238#, python-format
239msgid "Detected policy area: %(topic)s."
240-msgstr ""
241242-#: letters/services.py:1154
243-#, fuzzy, python-format
244-#| msgid "Use your PLZ to narrow down representatives from your constituency."
245msgid "Prioritising representatives for %(constituencies)s."
246-msgstr ""
247-"Verwenden Sie Ihre PLZ, um Abgeordnete aus Ihrem Wahlkreis einzugrenzen."
248249-#: letters/services.py:1159
250#, python-format
251msgid "Filtering by state %(state)s."
252-msgstr ""
253254-#: letters/services.py:1163
255#, python-format
256msgid ""
257"Postal code %(plz)s had no direct match; showing broader representatives."
258msgstr ""
0259260-#: letters/services.py:1167
261-#, fuzzy
262-#| msgid "No external resources available for this representative."
263msgid "Showing generally relevant representatives."
264-msgstr "Keine externen Ressourcen fรผr diesen Abgeordneten verfรผgbar."
00000000000000000000000000000000000000000000000000000000000000000000000000000000265266# Navigation
267-#: letters/templates/letters/base.html:124
268msgid "Letters"
269msgstr "Briefe"
270271-#: letters/templates/letters/base.html:126
272-#: letters/templates/letters/representative_detail.html:196
0000273msgid "Write Letter"
274msgstr "Brief schreiben"
275276-#: letters/templates/letters/base.html:127
277#: letters/templates/letters/profile.html:4
278msgid "Profile"
279msgstr "Profil"
280281-#: letters/templates/letters/base.html:128
282msgid "Logout"
283msgstr "Abmelden"
284285-#: letters/templates/letters/base.html:130
286-#: letters/templates/letters/letter_detail.html:46
287-#: letters/templates/letters/letter_detail.html:80
288#: letters/templates/letters/login.html:4
289#: letters/templates/letters/login.html:8
290#: letters/templates/letters/login.html:33
291msgid "Login"
292msgstr "Anmelden"
293294-#: letters/templates/letters/base.html:131
295#: letters/templates/letters/register.html:4
296#: letters/templates/letters/register.html:8
297-#: letters/templates/letters/register.html:65
298msgid "Register"
299msgstr "Registrieren"
300301-#: letters/templates/letters/base.html:134
302msgid "Admin"
303msgstr "Admin"
3040000305# Footer
306-#: letters/templates/letters/base.html:154
307msgid "Empowering citizens to write to their representatives"
308msgstr "Bรผrgern ermรถglichen, an ihre Abgeordneten zu schreiben"
309000000000000000000000000000000000000000310#: letters/templates/letters/letter_detail.html:10
311#: letters/templates/letters/partials/letter_card.html:5
312msgid "By"
313msgstr "Von"
314315-#: letters/templates/letters/letter_detail.html:11
316-#: letters/templates/letters/partials/letter_card.html:6
317-#: letters/templates/letters/profile.html:68
318-msgid "To"
319-msgstr "An"
320-321-#: letters/templates/letters/letter_detail.html:28
322#, python-format
323msgid "Signatures (%(counter)s)"
324msgid_plural "Signatures (%(counter)s)"
325msgstr[0] "Unterschrift (%(counter)s)"
326msgstr[1] "Unterschriften (%(counter)s)"
327328-#: letters/templates/letters/letter_detail.html:30
329-#, fuzzy, python-format
330-#| msgid "<strong>%(counter)s</strong> constituent of %(constituency)s"
331-#| msgid_plural "<strong>%(counter)s</strong> constituents of %(constituency)s"
332msgid "%(counter)s constituent of %(constituency_name)s"
333msgid_plural "%(counter)s constituents of %(constituency_name)s"
334msgstr[0] "%(counter)s Wรคhler aus %(constituency_name)s"
335msgstr[1] "%(counter)s Wรคhler aus %(constituency_name)s"
336337-#: letters/templates/letters/letter_detail.html:31
338-#, fuzzy, python-format
339-#| msgid "%(counter)s verified"
340msgid "%(counter)s other verified"
341msgid_plural "%(counter)s other verified"
342-msgstr[0] "%(counter)s verifiziert"
343-msgstr[1] "%(counter)s verifiziert"
344345-#: letters/templates/letters/letter_detail.html:32
346#, python-format
347msgid "%(counter)s unverified"
348msgid_plural "%(counter)s unverified"
349msgstr[0] "%(counter)s nicht verifiziert"
350msgstr[1] "%(counter)s nicht verifiziert"
351352-#: letters/templates/letters/letter_detail.html:40
353msgid "Sign this letter"
354msgstr "Brief unterzeichnen"
355356-#: letters/templates/letters/letter_detail.html:43
357msgid "You have signed this letter"
358msgstr "Sie haben diesen Brief unterzeichnet"
359360-#: letters/templates/letters/letter_detail.html:46
361-#, fuzzy
362-#| msgid "Login to sign this letter"
363msgid "to sign this letter"
364-msgstr "Anmelden um zu unterzeichnen"
365366-#: letters/templates/letters/letter_detail.html:69
00000000367msgid "No signatures yet. Be the first to sign!"
368msgstr "Noch keine Unterschriften. Seien Sie der Erste!"
369370-#: letters/templates/letters/letter_detail.html:74
371-#: letters/templates/letters/letter_detail.html:78
372msgid "Report this letter"
373msgstr "Brief melden"
374375-#: letters/templates/letters/letter_detail.html:75
376msgid "If you believe this letter violates our guidelines, please report it."
377-msgstr ""
378379-#: letters/templates/letters/letter_detail.html:80
380-#, fuzzy
381-#| msgid "Report this letter"
382msgid "to report this letter"
383-msgstr "Brief melden"
384385-#: letters/templates/letters/letter_detail.html:85
386msgid "Back to all letters"
387msgstr "Zurรผck zu allen Briefen"
388389#: letters/templates/letters/letter_form.html:4
390-#: letters/templates/letters/representative_detail.html:190
391msgid "Write a Letter"
392msgstr "Brief schreiben"
393394# Letter form
395-#: letters/templates/letters/letter_form.html:11
396msgid "Write an Open Letter"
397msgstr "Einen offenen Brief schreiben"
398399-#: letters/templates/letters/letter_form.html:13
400msgid ""
401-"Write an open letter to a German political representative. Your letter will "
402-"be published publicly and others can sign it."
403msgstr ""
404-"Schreiben Sie einen offenen Brief an einen deutschen Abgeordneten. Ihr Brief "
405-"wird รถffentlich verรถffentlicht und andere kรถnnen ihn unterzeichnen."
000000000000406407#: letters/templates/letters/letter_form.html:20
000000000000408msgid "Title:"
409msgstr "Titel:"
410411-#: letters/templates/letters/letter_form.html:26
412msgid ""
413-"Describe your concern. We'll suggest the right representatives based on your "
414-"title."
415-msgstr ""
416-"Beschreiben Sie Ihr Anliegen. Wir schlagen Ihnen passende Abgeordnete "
417-"basierend auf Ihrem Titel vor."
418-419-#: letters/templates/letters/letter_form.html:31
420-msgid "Your postal code (PLZ):"
421-msgstr "Ihre Postleitzahl (PLZ):"
422-423-#: letters/templates/letters/letter_form.html:37
424-msgid "We'll use this PLZ to highlight representatives from your constituency."
425msgstr ""
426-"Wir verwenden diese PLZ, um Abgeordnete aus Ihrem Wahlkreis hervorzuheben."
0427428-#: letters/templates/letters/letter_form.html:45
429msgid "To Representative:"
430msgstr "An Abgeordnete:"
431432-#: letters/templates/letters/letter_form.html:51
433-msgid "Or select from suggestions on the right โ"
434-msgstr "Oder wรคhlen Sie aus den Vorschlรคgen rechts โ"
0000435436-#: letters/templates/letters/letter_form.html:56
437msgid "Letter Body:"
438msgstr "Brieftext:"
439440-#: letters/templates/letters/letter_form.html:64
441-msgid "Tags (optional):"
442-msgstr "Schlagwรถrter (optional):"
443-444-#: letters/templates/letters/letter_form.html:71
445msgid "Publish Letter"
446msgstr "Brief verรถffentlichen"
447448-#: letters/templates/letters/letter_form.html:72
449-msgid "Cancel"
450-msgstr "Abbrechen"
451-452-#: letters/templates/letters/letter_form.html:81
453msgid "Smart Suggestions"
454msgstr "Intelligente Vorschlรคge"
455456-#: letters/templates/letters/letter_form.html:83
457-#, fuzzy
458-#| msgid ""
459-#| "Type your letter title and we'll help you find the right representative "
460-#| "and show similar letters."
461msgid ""
462-"Add a title and your PLZ to see tailored representatives, tags, and similar "
463-"letters."
464msgstr ""
465-"Geben Sie Ihren Brieftitel ein und wir helfen Ihnen, den richtigen "
466-"Abgeordneten zu finden und zeigen รคhnliche Briefe."
467468-#: letters/templates/letters/letter_form.html:98
469msgid "Loading..."
470msgstr "Lรคdt..."
471472-#: letters/templates/letters/letter_form.html:100
473msgid "Analyzing your title..."
474msgstr "Analysiere Ihren Titel..."
475···510msgid "Popular tags:"
511msgstr "Beliebte Schlagwรถrter:"
512000000000000000000000513# Login page
514#: letters/templates/letters/login.html:14
515-#: letters/templates/letters/register.html:14
516msgid "Username:"
517msgstr "Benutzername:"
518519#: letters/templates/letters/login.html:22
520-#: letters/templates/letters/register.html:46
521msgid "Password:"
522msgstr "Passwort:"
523524#: letters/templates/letters/login.html:37
0000525msgid "Don't have an account?"
526msgstr "Noch kein Konto?"
527528-#: letters/templates/letters/login.html:37
529msgid "Register here"
530msgstr "Hier registrieren"
5310000532# Plurals for signatures
533#: letters/templates/letters/partials/letter_card.html:20
534-#: letters/templates/letters/partials/suggestions.html:126
535#, python-format
536msgid "%(counter)s signature"
537msgid_plural "%(counter)s signatures"
···539msgstr[1] "%(counter)s Unterschriften"
540541#: letters/templates/letters/partials/letter_card.html:20
542-#, fuzzy, python-format
543-#| msgid "%(counter)s verified"
544msgid "%(counter)s verified"
545msgid_plural "%(counter)s verified"
546msgstr[0] "%(counter)s verifiziert"
547msgstr[1] "%(counter)s verifiziert"
54800000000000000000000000000000000000000000549# Suggestions partial
550-#: letters/templates/letters/partials/suggestions.html:11
551msgid "Our Interpretation"
552msgstr "Unsere Interpretation"
553554-#: letters/templates/letters/partials/suggestions.html:16
555msgid "Topic:"
556msgstr "Thema:"
557558-#: letters/templates/letters/partials/suggestions.html:23
559msgid "No specific policy area detected. Try adding more keywords."
560msgstr ""
561"Kein spezifischer Politikbereich erkannt. Versuchen Sie, mehr "
562"Schlรผsselwรถrter hinzuzufรผgen."
563564-#: letters/templates/letters/partials/suggestions.html:31
565-msgid "Suggested Representatives"
566-msgstr "Vorgeschlagene Abgeordnete"
00000000567568-#: letters/templates/letters/partials/suggestions.html:37
000000000569#, python-format
570msgid ""
571-"Based on the topic \"%(topic)s\", we suggest contacting representatives from "
572-"the %(level)s:"
573msgstr ""
574-"Basierend auf dem Thema \"%(topic)s\" empfehlen wir, Abgeordnete des "
575-"%(level)s zu kontaktieren:"
576577-#: letters/templates/letters/partials/suggestions.html:51
578-msgid "Constituency:"
579-msgstr "Wahlkreis:"
580-581-#: letters/templates/letters/partials/suggestions.html:57
582msgid "of"
583msgstr "von"
584585-#: letters/templates/letters/partials/suggestions.html:61
586-msgid "View profile"
587-msgstr "Profil ansehen"
588589-#: letters/templates/letters/partials/suggestions.html:66
590-msgid "Select"
591-msgstr "Auswรคhlen"
592-593-#: letters/templates/letters/partials/suggestions.html:73
594msgid ""
595"No representatives found. Representatives may need to be synced for this "
596"governmental level."
···598"Keine Abgeordneten gefunden. Abgeordnete mรผssen mรถglicherweise fรผr diese "
599"Verwaltungsebene synchronisiert werden."
600601-#: letters/templates/letters/partials/suggestions.html:82
602-#, fuzzy
603-#| msgid "Suggested Representatives"
604-msgid "Suggested Tags"
605-msgstr "Vorgeschlagene Abgeordnete"
0000000000000000000000000000606607-#: letters/templates/letters/partials/suggestions.html:85
608-msgid "Click a tag to add it to your letter."
000000000000000000609msgstr ""
00610611-#: letters/templates/letters/partials/suggestions.html:101
612-msgid "Related Keywords"
613-msgstr "Verwandte Schlagwรถrter"
614615-#: letters/templates/letters/partials/suggestions.html:115
616-msgid "Similar Letters"
617-msgstr "รhnliche Briefe"
618619-#: letters/templates/letters/partials/suggestions.html:118
620-msgid "Others have written about similar topics:"
621-msgstr "Andere haben รผber รคhnliche Themen geschrieben:"
622623-#: letters/templates/letters/partials/suggestions.html:129
624-#, fuzzy
625-#| msgid "To"
626-msgid "To:"
627-msgstr "An"
628629-#: letters/templates/letters/partials/suggestions.html:131
630-msgid "by"
00631msgstr ""
00632633-#: letters/templates/letters/partials/suggestions.html:163
634-msgid "Selected:"
635-msgstr "Ausgewรคhlt:"
636637# Profile page
638-#: letters/templates/letters/profile.html:8
639#, python-format
640msgid "%(username)s's Profile"
641msgstr "Profil von %(username)s"
642643-#: letters/templates/letters/profile.html:11
644-msgid "Identity Verification"
645-msgstr "Identitรคtsverifizierung"
646647-#: letters/templates/letters/profile.html:15
648-msgid "Identity Verified"
649-msgstr "Identitรคt verifiziert"
650-651-#: letters/templates/letters/profile.html:17
652-msgid "Your signatures will be marked as verified constituent signatures."
653-msgstr ""
654-"Ihre Unterschriften werden als verifizierte Wรคhlerunterschriften markiert."
655656#: letters/templates/letters/profile.html:21
657-#: letters/templates/letters/representative_detail.html:23
658-msgid "Parliament:"
00000659msgstr ""
00660661-#: letters/templates/letters/profile.html:27
662-msgid "Verification Pending"
663-msgstr "Verifizierung ausstehend"
00000000664665-#: letters/templates/letters/profile.html:29
666msgid "Your verification is being processed."
667msgstr "Ihre Verifizierung wird bearbeitet."
668669-#: letters/templates/letters/profile.html:31
670msgid "Complete Verification (Stub)"
671msgstr "Verifizierung abschlieรen (Stub)"
672673-#: letters/templates/letters/profile.html:35
674-msgid "Verification Failed"
675-msgstr "Verifizierung fehlgeschlagen"
676677-#: letters/templates/letters/profile.html:37
678-msgid "Please try again or contact support."
679-msgstr "Bitte versuchen Sie es erneut oder kontaktieren Sie den Support."
0000680681-#: letters/templates/letters/profile.html:43
00000000682msgid ""
683-"Verify your identity to prove you're a constituent of the representatives "
684-"you write to. Verified signatures carry more weight!"
685msgstr ""
686-"Verifizieren Sie Ihre Identitรคt, um zu beweisen, dass Sie Wรคhler der "
687-"Abgeordneten sind, an die Sie schreiben. Verifizierte Unterschriften haben "
688-"mehr Gewicht!"
689690-#: letters/templates/letters/profile.html:45
691-msgid "Start Verification"
692-msgstr "Verifizierung starten"
0000693694-#: letters/templates/letters/profile.html:51
0000000000000000695msgid "Your Letters"
696msgstr "Ihre Briefe"
697698-#: letters/templates/letters/profile.html:57
699msgid "You haven't written any letters yet."
700msgstr "Sie haben noch keine Briefe geschrieben."
701702-#: letters/templates/letters/profile.html:57
703msgid "Write one now!"
704msgstr "Schreiben Sie jetzt einen!"
705706-#: letters/templates/letters/profile.html:62
707msgid "Letters You've Signed"
708msgstr "Briefe, die Sie unterzeichnet haben"
709710-# Letter detail page
711-#: letters/templates/letters/profile.html:68
712-msgid "Signed on"
713-msgstr "Unterzeichnet am"
714-715-#: letters/templates/letters/profile.html:71
716-msgid "Your comment:"
717-msgstr "Ihr Kommentar:"
718-719-#: letters/templates/letters/profile.html:76
720msgid "You haven't signed any letters yet."
721msgstr "Sie haben noch keine Briefe unterzeichnet."
722723-#: letters/templates/letters/profile.html:76
724msgid "Browse letters"
725msgstr "Briefe durchsuchen"
726727-#: letters/templates/letters/register.html:22
728-#: letters/templates/letters/representative_detail.html:56
0000000000000000000729msgid "Email:"
730msgstr "E-Mail:"
731732# Register page
733-#: letters/templates/letters/register.html:30
734msgid "First Name (optional):"
735msgstr "Vorname (optional):"
736737-#: letters/templates/letters/register.html:38
738msgid "Last Name (optional):"
739msgstr "Nachname (optional):"
740741-#: letters/templates/letters/register.html:54
742msgid "Confirm Password:"
743msgstr "Passwort bestรคtigen:"
744745-#: letters/templates/letters/register.html:69
746msgid "Already have an account?"
747msgstr "Bereits ein Konto?"
748749-#: letters/templates/letters/register.html:69
750msgid "Login here"
751msgstr "Hier anmelden"
752753-# Representative detail
754#: letters/templates/letters/representative_detail.html:19
755-msgid "Party:"
756-msgstr "Partei:"
757-758-#: letters/templates/letters/representative_detail.html:27
759-msgid "Legislative Body:"
760-msgstr "Parlament:"
761-762-#: letters/templates/letters/representative_detail.html:32
763-msgid "Role:"
764-msgstr "Rolle:"
765-766-#: letters/templates/letters/representative_detail.html:38
767-msgid "Term:"
768-msgstr "Amtszeit:"
769-770-#: letters/templates/letters/representative_detail.html:43
771-msgid "Present"
772-msgstr "Heute"
773-774-#: letters/templates/letters/representative_detail.html:47
775-msgid "Status:"
776-msgstr "Status:"
777-778-#: letters/templates/letters/representative_detail.html:49
779-#: letters/templates/letters/representative_detail.html:98
780-msgid "Active"
781-msgstr "Aktiv"
782783-#: letters/templates/letters/representative_detail.html:51
784-msgid "Inactive"
785-msgstr "Inaktiv"
786-787-#: letters/templates/letters/representative_detail.html:62
788-msgid "Website:"
789-msgstr "Webseite:"
790-791-#: letters/templates/letters/representative_detail.html:75
792msgid "Committee Memberships"
793msgstr "Ausschussmitgliedschaften"
794795-#: letters/templates/letters/representative_detail.html:113
796-msgid "Policy Competences"
797-msgstr "Politische Kompetenzen"
798-799-#: letters/templates/letters/representative_detail.html:117
800-msgid ""
801-"Based on committee memberships, this representative works on the following "
802-"policy areas:"
803-msgstr ""
804-"Basierend auf Ausschussmitgliedschaften arbeitet dieser Abgeordnete in "
805-"folgenden Politikbereichen:"
806-807-#: letters/templates/letters/representative_detail.html:134
808msgid "Open Letters"
809msgstr "Offene Briefe"
810811-#: letters/templates/letters/representative_detail.html:142
812msgid "No letters have been written to this representative yet."
813msgstr "An diesen Abgeordneten wurden noch keine Briefe geschrieben."
814815-#: letters/templates/letters/representative_detail.html:144
816msgid "Write the First Letter"
817msgstr "Ersten Brief schreiben"
818819-#: letters/templates/letters/representative_detail.html:156
820msgid "External Resources"
821msgstr "Externe Ressourcen"
822823-#: letters/templates/letters/representative_detail.html:161
824msgid "Abgeordnetenwatch Profile"
825msgstr "Abgeordnetenwatch-Profil"
826827-#: letters/templates/letters/representative_detail.html:163
828msgid ""
829"View voting record, questions, and detailed profile on Abgeordnetenwatch.de"
830msgstr ""
831"Abstimmungsverhalten, Fragen und detailliertes Profil auf Abgeordnetenwatch."
832"de ansehen"
833834-#: letters/templates/letters/representative_detail.html:166
835-msgid "View on Abgeordnetenwatch"
836-msgstr "Auf Abgeordnetenwatch ansehen"
837838-#: letters/templates/letters/representative_detail.html:173
839-msgid "Wikipedia Article (German)"
840-msgstr "Wikipedia-Artikel (Deutsch)"
841-842-#: letters/templates/letters/representative_detail.html:175
843msgid "Read more about this representative on Wikipedia"
844msgstr "Mehr รผber diesen Abgeordneten auf Wikipedia lesen"
845846-#: letters/templates/letters/representative_detail.html:178
847msgid "View on Wikipedia"
848msgstr "Auf Wikipedia ansehen"
849850-#: letters/templates/letters/representative_detail.html:184
851msgid "No external resources available for this representative."
852msgstr "Keine externen Ressourcen fรผr diesen Abgeordneten verfรผgbar."
853854-#: letters/templates/letters/representative_detail.html:192
0000855#, python-format
856msgid "Start a new open letter to %(name)s"
857msgstr "Einen neuen offenen Brief an %(name)s beginnen"
858859-#: letters/templates/letters/representative_detail.html:200
860msgid "Login to Write Letter"
861msgstr "Anmelden um Brief zu schreiben"
8620000863# Flash messages
864-#: letters/views.py:158
865msgid "Your letter has been published and your signature has been added!"
866-msgstr ""
867-"Ihr Brief wurde verรถffentlicht und Ihre Unterschrift wurde hinzugefรผgt!"
868869-#: letters/views.py:171
870msgid "You have already signed this letter."
871msgstr "Sie haben diesen Brief bereits unterzeichnet."
872873-#: letters/views.py:181
874msgid "Your signature has been added!"
875msgstr "Ihre Unterschrift wurde hinzugefรผgt!"
876877-#: letters/views.py:199
878msgid "Thank you for your report. Our team will review it."
879msgstr "Vielen Dank fรผr Ihre Meldung. Unser Team wird sie รผberprรผfen."
880881-#: letters/views.py:226
882-#, python-format
883-msgid "Welcome, %(username)s! Your account has been created."
884-msgstr "Willkommen, %(username)s! Ihr Konto wurde erstellt."
000885886-#~ msgid "Previous"
887-#~ msgstr "Zurรผck"
00000888889-#~ msgid "Next"
890-#~ msgstr "Weiter"
0000000000000000000000000000000000000000000000891892#, python-format
893-#~ msgid "Page %(page)s of %(total)s"
894-#~ msgstr "Seite %(page)s von %(total)s"
000000000000000895896-#~ msgid "No letters found."
897-#~ msgstr "Keine Briefe gefunden."
00000898899-#~ msgid "Be the first to write one!"
900-#~ msgstr "Schreiben Sie den ersten!"
00000000000000000000000000000000000000901902#, python-format
903#~ msgid "<strong>%(counter)s</strong> other verified"
···915916#~ msgid "Committee Memberships:"
917#~ msgstr "Ausschussmitgliedschaften:"
918-919-#~ msgid "Policy Areas:"
920-#~ msgstr "Politikbereiche:"
921922# Services explanations
923#~ msgid "No matching policy areas found. Please try different keywords."
···6msgstr ""
7"Project-Id-Version: WriteThem.eu\n"
8"Report-Msgid-Bugs-To: \n"
9+"POT-Creation-Date: 2025-10-15 00:27+0200\n"
10"PO-Revision-Date: 2025-01-10 12:00+0100\n"
11"Last-Translator: \n"
12"Language-Team: German\n"
···16"Content-Transfer-Encoding: 8bit\n"
17"Plural-Forms: nplurals=2; plural=(n != 1);\n"
1819+#: letters/admin.py:75
20+msgid "Mandate Details"
21+msgstr "Mandatsdetails"
02223+#: letters/admin.py:78
24+msgid "Focus Areas"
25+msgstr "Schwerpunktbereiche"
0002627+#: letters/admin.py:81 letters/admin.py:95
28+msgid "Photo"
29+msgstr "Foto"
3031+#: letters/admin.py:85
32+msgid "Metadata"
33+msgstr "Metadaten"
3435+#: letters/admin.py:94
36+msgid "No photo"
37+msgstr "Kein Foto"
38+39+#: letters/admin.py:167
40+msgid "Topic Areas"
41+msgstr "Themenbereiche"
42+43+#: letters/forms.py:25
44+msgid ""
45+"An account with this email already exists. If you registered before, please "
46+"check your inbox for the activation link or reset your password."
47+msgstr ""
48+"Ein Konto mit dieser E-Mail-Adresse existiert bereits. Falls Sie sich zuvor "
49+"registriert haben, prรผfen Sie Ihren Posteingang auf den Aktivierungslink oder "
50+"setzen Sie Ihr Passwort zurรผck."
5152+#: letters/forms.py:37
53msgid "Title"
54msgstr "Titel"
5556+#: letters/forms.py:38
57msgid "Letter Body"
58msgstr "Brieftext"
5960+#: letters/forms.py:39
0061msgid "To Representative"
62+msgstr "An Abgeordnete"
6364+#: letters/forms.py:42
65msgid "Describe your concern briefly"
66msgstr "Beschreiben Sie Ihr Anliegen kurz"
6768+#: letters/forms.py:43
69+msgid ""
70+"Write your letter here. Markdown formatting (e.g. **bold**, _italic_) is "
71+"supported."
72+msgstr ""
73+"Schreiben Sie hier Ihren Brief. Markdown-Formatierung (z.B. **fett**, _kursiv_) "
74+"wird unterstรผtzt."
7576+#: letters/forms.py:46
77msgid "Letter title"
78msgstr "Brieftitel"
7980+#: letters/forms.py:50
81msgid "Write your letter here..."
82msgstr "Schreiben Sie hier Ihren Brief..."
8384+#: letters/forms.py:110
85msgid "Comment (optional)"
86msgstr "Kommentar (optional)"
8788+#: letters/forms.py:113
89msgid "Add a personal note to your signature"
90msgstr "Fรผgen Sie Ihrer Unterschrift eine persรถnliche Notiz hinzu"
9192+#: letters/forms.py:119
93msgid "Optional: Add your comment..."
94msgstr "Optional: Fรผgen Sie Ihren Kommentar hinzu..."
9596+#: letters/forms.py:131
97msgid "Reason"
98msgstr "Grund"
99100+#: letters/forms.py:132
101msgid "Description"
102msgstr "Beschreibung"
103104+#: letters/forms.py:135
105msgid "Please provide details about why you are reporting this letter"
106msgstr "Bitte geben Sie Details an, warum Sie diesen Brief melden"
107108+#: letters/forms.py:142
109msgid "Please describe the issue..."
110msgstr "Bitte beschreiben Sie das Problem..."
111112+#: letters/forms.py:152 letters/templates/letters/letter_list.html:19
113msgid "Search"
114msgstr "Suchen"
115116+#: letters/forms.py:155 letters/templates/letters/letter_list.html:18
117msgid "Search letters..."
118msgstr "Briefe suchen..."
119120+#: letters/forms.py:161
121msgid "Tag"
122msgstr "Schlagwort"
123124+#: letters/forms.py:164
125msgid "Filter by tag..."
126msgstr "Nach Schlagwort filtern..."
127128+#: letters/forms.py:180
129+msgid "Bundestag constituency"
130+msgstr "Bundestags-Wahlkreis"
131+132+#: letters/forms.py:181
133+msgid "Pick your Bundestag direct mandate constituency (Wahlkreis)."
134+msgstr "Wรคhlen Sie Ihren Bundestags-Direktwahlkreis (Wahlkreis)."
135+136+#: letters/forms.py:182 letters/forms.py:189
137+msgid "Select constituency"
138+msgstr "Wahlkreis auswรคhlen"
139+140+#: letters/forms.py:187
141+msgid "State parliament constituency"
142+msgstr "Landtags-Wahlkreis"
143+144+#: letters/forms.py:188
145+msgid "Optionally pick your Landtag constituency if applicable."
146+msgstr "Wรคhlen Sie optional Ihren Landtags-Wahlkreis, falls zutreffend."
147+148+#: letters/forms.py:240
149+msgid "Please select at least one constituency to save your profile."
150+msgstr "Bitte wรคhlen Sie mindestens einen Wahlkreis aus, um Ihr Profil zu speichern."
151+152+#: letters/forms.py:252
153+msgid "Straรe und Hausnummer"
154+msgstr "Straรe und Hausnummer"
155+156+#: letters/forms.py:255
157+msgid "z.B. Unter den Linden 77"
158+msgstr "z.B. Unter den Linden 77"
159+160+#: letters/forms.py:261
161+msgid "Postleitzahl"
162+msgstr "Postleitzahl"
163+164+#: letters/forms.py:264
165+msgid "z.B. 10117"
166+msgstr "z.B. 10117"
167+168+#: letters/forms.py:270
169+msgid "Stadt"
170+msgstr "Stadt"
171+172+#: letters/forms.py:273
173+msgid "z.B. Berlin"
174+msgstr "z.B. Berlin"
175+176+#: letters/forms.py:304
177+msgid ""
178+"Bitte geben Sie eine vollstรคndige Adresse ein (Straรe, PLZ und Stadt) oder "
179+"lassen Sie alle Felder leer."
180+msgstr ""
181+"Bitte geben Sie eine vollstรคndige Adresse ein (Straรe, PLZ und Stadt) oder "
182+"lassen Sie alle Felder leer."
183+184# Model choices - Constituency
185+#: letters/models.py:15
186msgid "European Union"
187msgstr "Europรคische Union"
188189+#: letters/models.py:16
190msgid "Federal"
191msgstr "Bund"
192193+#: letters/models.py:17
194msgid "State"
195msgstr "Land"
196197+#: letters/models.py:18
198msgid "Local"
199msgstr "Kommune"
200201+#: letters/models.py:21
202msgid "Name of the parliament"
203+msgstr "Name des Parlaments"
204205+#: letters/models.py:25
206msgid "e.g., 'Bundestag', 'Bayerischer Landtag', 'Gemeinderat Mรผnchen'"
207+msgstr "z.B. 'Bundestag', 'Bayerischer Landtag', 'Gemeinderat Mรผnchen'"
208209+#: letters/models.py:29
210msgid "Geographic identifier (state code, municipality code, etc.)"
211+msgstr "Geografische Kennung (Bundeslandkรผrzel, Gemeindeschlรผssel, etc.)"
212213+#: letters/models.py:37
214msgid "For hierarchical relationships (e.g., local within state)"
215+msgstr "Fรผr hierarchische Beziehungen (z.B. Kommune innerhalb eines Bundeslandes)"
216+217+#: letters/models.py:43 letters/models.py:70 letters/models.py:105
218+#: letters/models.py:165 letters/models.py:372 letters/models.py:421
219+msgid "Last time this was synced from external API"
220+msgstr "Zeitpunkt der letzten Synchronisierung von externer API"
221222+#: letters/models.py:47 letters/templates/letters/committee_detail.html:70
223msgid "Parliament"
224+msgstr "Parlament"
225226+#: letters/models.py:48
227msgid "Parliaments"
228+msgstr "Parlamente"
00000000000000229230+#: letters/models.py:84
231msgid "Federal electoral district"
232+msgstr "Bundeswahlkreis"
233234+#: letters/models.py:85
235msgid "Bundestag state list"
236+msgstr "Bundestag-Landesliste"
237238+#: letters/models.py:86
239msgid "Bundestag federal list"
240+msgstr "Bundestag-Bundesliste"
241242+#: letters/models.py:87
243msgid "State electoral district"
244+msgstr "Landeswahlkreis"
245246+#: letters/models.py:88
247msgid "State regional list"
248+msgstr "Regionale Landesliste"
249250+#: letters/models.py:89
251msgid "State wide list"
252+msgstr "Landesweite Liste"
253254+#: letters/models.py:90
255msgid "EU at large"
256+msgstr "EU insgesamt"
257258+#: letters/models.py:119
259msgid "Direct mandate"
260+msgstr "Direktmandat"
261262+#: letters/models.py:120
263msgid "State list mandate"
264+msgstr "Landeslisten-Mandat"
265266+#: letters/models.py:121
267msgid "State regional list mandate"
268+msgstr "Regionales Landeslisten-Mandat"
269270+#: letters/models.py:122
271msgid "Federal list mandate"
272+msgstr "Bundeslisten-Mandat"
273274+#: letters/models.py:123
275msgid "EU list mandate"
276+msgstr "EU-Listen-Mandat"
277278# Model choices - Letter
279+#: letters/models.py:444
280msgid "Draft"
281msgstr "Entwurf"
282283+#: letters/models.py:445
284msgid "Published"
285msgstr "Verรถffentlicht"
286287+#: letters/models.py:446
288msgid "Flagged for Review"
289msgstr "Zur รberprรผfung markiert"
290291+#: letters/models.py:447
292msgid "Removed"
293msgstr "Entfernt"
294295+#: letters/models.py:487
296+msgid "Deleted user"
297+msgstr "Gelรถschter Benutzer"
298+299+#: letters/services.py:2451
300#, python-format
301msgid "Detected policy area: %(topic)s."
302+msgstr "Erkannter Politikbereich: %(topic)s."
303304+#: letters/services.py:2456
305+#, python-format
0306msgid "Prioritising representatives for %(constituencies)s."
307+msgstr "Priorisiere Abgeordnete fรผr %(constituencies)s."
0308309+#: letters/services.py:2461
310#, python-format
311msgid "Filtering by state %(state)s."
312+msgstr "Filtere nach Bundesland %(state)s."
313314+#: letters/services.py:2465
315#, python-format
316msgid ""
317"Postal code %(plz)s had no direct match; showing broader representatives."
318msgstr ""
319+"Postleitzahl %(plz)s hatte keine direkte รbereinstimmung; zeige allgemeinere Abgeordnete."
320321+#: letters/services.py:2469
00322msgid "Showing generally relevant representatives."
323+msgstr "Zeige allgemein relevante Abgeordnete."
324+325+#: letters/templates/letters/account_activation_invalid.html:4
326+#: letters/templates/letters/account_activation_invalid.html:8
327+msgid "Activation link invalid"
328+msgstr "Aktivierungslink ungรผltig"
329+330+#: letters/templates/letters/account_activation_invalid.html:10
331+msgid ""
332+"We could not verify your activation link. It may have already been used or "
333+"expired."
334+msgstr ""
335+"Wir konnten Ihren Aktivierungslink nicht verifizieren. Er wurde mรถglicherweise bereits "
336+"verwendet oder ist abgelaufen."
337+338+#: letters/templates/letters/account_activation_invalid.html:13
339+msgid ""
340+"If you still cannot access your account, try registering again or contact "
341+"support."
342+msgstr ""
343+"Falls Sie weiterhin nicht auf Ihr Konto zugreifen kรถnnen, versuchen Sie sich erneut zu "
344+"registrieren oder kontaktieren Sie den Support."
345+346+#: letters/templates/letters/account_activation_invalid.html:15
347+msgid "Register again"
348+msgstr "Erneut registrieren"
349+350+#: letters/templates/letters/account_activation_sent.html:4
351+msgid "Activate your account"
352+msgstr "Aktivieren Sie Ihr Konto"
353+354+#: letters/templates/letters/account_activation_sent.html:8
355+#: letters/templates/letters/password_reset_done.html:8
356+msgid "Check your inbox"
357+msgstr "Prรผfen Sie Ihren Posteingang"
358+359+#: letters/templates/letters/account_activation_sent.html:10
360+msgid ""
361+"We sent you an email with a confirmation link. Please click it to activate "
362+"your account."
363+msgstr ""
364+"Wir haben Ihnen eine E-Mail mit einem Bestรคtigungslink gesendet. Bitte klicken Sie "
365+"darauf, um Ihr Konto zu aktivieren."
366+367+#: letters/templates/letters/account_activation_sent.html:13
368+msgid ""
369+"If you do not receive the email within a few minutes, check your spam folder "
370+"or try registering again."
371+msgstr ""
372+"Falls Sie die E-Mail nicht innerhalb weniger Minuten erhalten, prรผfen Sie Ihren "
373+"Spam-Ordner oder versuchen Sie sich erneut zu registrieren."
374+375+#: letters/templates/letters/account_activation_sent.html:15
376+msgid "Back to homepage"
377+msgstr "Zurรผck zur Startseite"
378+379+#: letters/templates/letters/account_delete_confirm.html:4
380+#: letters/templates/letters/profile.html:142
381+msgid "Delete account"
382+msgstr "Konto lรถschen"
383+384+#: letters/templates/letters/account_delete_confirm.html:8
385+msgid "Delete your account"
386+msgstr "Lรถschen Sie Ihr Konto"
387+388+#: letters/templates/letters/account_delete_confirm.html:10
389+msgid ""
390+"Deleting your account will remove your personal data and signatures. Letters "
391+"you have published stay online but are shown without your name."
392+msgstr ""
393+"Das Lรถschen Ihres Kontos entfernt Ihre persรถnlichen Daten und Unterschriften. Von Ihnen "
394+"verรถffentlichte Briefe bleiben online, werden aber ohne Ihren Namen angezeigt."
395+396+#: letters/templates/letters/account_delete_confirm.html:14
397+msgid "Yes, delete my account"
398+msgstr "Ja, mein Konto lรถschen"
399+400+#: letters/templates/letters/account_delete_confirm.html:15
401+#: letters/templates/letters/letter_form.html:61
402+msgid "Cancel"
403+msgstr "Abbrechen"
404405# Navigation
406+#: letters/templates/letters/base.html:140
407msgid "Letters"
408msgstr "Briefe"
409410+#: letters/templates/letters/base.html:141
411+msgid "Competencies"
412+msgstr "Kompetenzen"
413+414+#: letters/templates/letters/base.html:143
415+#: letters/templates/letters/representative_detail.html:149
416msgid "Write Letter"
417msgstr "Brief schreiben"
418419+#: letters/templates/letters/base.html:144
420#: letters/templates/letters/profile.html:4
421msgid "Profile"
422msgstr "Profil"
423424+#: letters/templates/letters/base.html:145
425msgid "Logout"
426msgstr "Abmelden"
427428+#: letters/templates/letters/base.html:147
429+#: letters/templates/letters/letter_detail.html:47
430+#: letters/templates/letters/letter_detail.html:81
431#: letters/templates/letters/login.html:4
432#: letters/templates/letters/login.html:8
433#: letters/templates/letters/login.html:33
434msgid "Login"
435msgstr "Anmelden"
436437+#: letters/templates/letters/base.html:148
438#: letters/templates/letters/register.html:4
439#: letters/templates/letters/register.html:8
440+#: letters/templates/letters/register.html:66
441msgid "Register"
442msgstr "Registrieren"
443444+#: letters/templates/letters/base.html:151
445msgid "Admin"
446msgstr "Admin"
447448+#: letters/templates/letters/base.html:157
449+msgid "Select language"
450+msgstr "Sprache auswรคhlen"
451+452# Footer
453+#: letters/templates/letters/base.html:182
454msgid "Empowering citizens to write to their representatives"
455msgstr "Bรผrgern ermรถglichen, an ihre Abgeordneten zu schreiben"
456457+#: letters/templates/letters/committee_detail.html:22
458+msgid "Related Topics"
459+msgstr "Verwandte Themen"
460+461+#: letters/templates/letters/committee_detail.html:36
462+msgid "Members"
463+msgstr "Mitglieder"
464+465+#: letters/templates/letters/committee_detail.html:46
466+msgid "Role"
467+msgstr "Rolle"
468+469+#: letters/templates/letters/committee_detail.html:48
470+#: letters/templates/letters/representative_detail.html:61
471+msgid "Active"
472+msgstr "Aktiv"
473+474+#: letters/templates/letters/committee_detail.html:51
475+#: letters/templates/letters/partials/representative_card.html:29
476+msgid "Since"
477+msgstr "Seit"
478+479+#: letters/templates/letters/committee_detail.html:58
480+msgid "No members recorded for this committee."
481+msgstr "Fรผr diesen Ausschuss sind keine Mitglieder verzeichnet."
482+483+#: letters/templates/letters/committee_detail.html:67
484+msgid "Committee Info"
485+msgstr "Ausschussinformationen"
486+487+#: letters/templates/letters/committee_detail.html:71
488+msgid "Term"
489+msgstr "Amtszeit"
490+491+#: letters/templates/letters/committee_detail.html:74
492+#: letters/templates/letters/representative_detail.html:105
493+msgid "View on Abgeordnetenwatch"
494+msgstr "Auf Abgeordnetenwatch ansehen"
495+496#: letters/templates/letters/letter_detail.html:10
497#: letters/templates/letters/partials/letter_card.html:5
498msgid "By"
499msgstr "Von"
500501+#: letters/templates/letters/letter_detail.html:29
000000502#, python-format
503msgid "Signatures (%(counter)s)"
504msgid_plural "Signatures (%(counter)s)"
505msgstr[0] "Unterschrift (%(counter)s)"
506msgstr[1] "Unterschriften (%(counter)s)"
507508+#: letters/templates/letters/letter_detail.html:31
509+#, python-format
00510msgid "%(counter)s constituent of %(constituency_name)s"
511msgid_plural "%(counter)s constituents of %(constituency_name)s"
512msgstr[0] "%(counter)s Wรคhler aus %(constituency_name)s"
513msgstr[1] "%(counter)s Wรคhler aus %(constituency_name)s"
514515+#: letters/templates/letters/letter_detail.html:32
516+#, python-format
0517msgid "%(counter)s other verified"
518msgid_plural "%(counter)s other verified"
519+msgstr[0] "%(counter)s weitere verifiziert"
520+msgstr[1] "%(counter)s weitere verifiziert"
521522+#: letters/templates/letters/letter_detail.html:33
523#, python-format
524msgid "%(counter)s unverified"
525msgid_plural "%(counter)s unverified"
526msgstr[0] "%(counter)s nicht verifiziert"
527msgstr[1] "%(counter)s nicht verifiziert"
528529+#: letters/templates/letters/letter_detail.html:41
530msgid "Sign this letter"
531msgstr "Brief unterzeichnen"
532533+#: letters/templates/letters/letter_detail.html:44
534msgid "You have signed this letter"
535msgstr "Sie haben diesen Brief unterzeichnet"
536537+#: letters/templates/letters/letter_detail.html:47
00538msgid "to sign this letter"
539+msgstr "um diesen Brief zu unterzeichnen"
540541+#: letters/templates/letters/letter_detail.html:58
542+msgid "โ Verified Constituent"
543+msgstr "โ Verifizierter Wรคhler"
544+545+#: letters/templates/letters/letter_detail.html:60
546+msgid "โ Verified"
547+msgstr "โ Verifiziert"
548+549+#: letters/templates/letters/letter_detail.html:70
550msgid "No signatures yet. Be the first to sign!"
551msgstr "Noch keine Unterschriften. Seien Sie der Erste!"
552553+#: letters/templates/letters/letter_detail.html:75
554+#: letters/templates/letters/letter_detail.html:79
555msgid "Report this letter"
556msgstr "Brief melden"
557558+#: letters/templates/letters/letter_detail.html:76
559msgid "If you believe this letter violates our guidelines, please report it."
560+msgstr "Falls Sie glauben, dass dieser Brief gegen unsere Richtlinien verstรถรt, melden Sie ihn bitte."
561562+#: letters/templates/letters/letter_detail.html:81
00563msgid "to report this letter"
564+msgstr "um diesen Brief zu melden"
565566+#: letters/templates/letters/letter_detail.html:86
567msgid "Back to all letters"
568msgstr "Zurรผck zu allen Briefen"
569570#: letters/templates/letters/letter_form.html:4
571+#: letters/templates/letters/representative_detail.html:143
572msgid "Write a Letter"
573msgstr "Brief schreiben"
574575# Letter form
576+#: letters/templates/letters/letter_form.html:10
577msgid "Write an Open Letter"
578msgstr "Einen offenen Brief schreiben"
579580+#: letters/templates/letters/letter_form.html:12
581msgid ""
582+"Write an open letter to a political representative. Your letter will be "
583+"published publicly so others can read and sign it."
584msgstr ""
585+"Schreiben Sie einen offenen Brief an einen Abgeordneten. Ihr Brief wird "
586+"รถffentlich verรถffentlicht, damit andere ihn lesen und unterzeichnen kรถnnen."
587+588+#: letters/templates/letters/letter_form.html:16
589+msgid "Before you write"
590+msgstr "Bevor Sie schreiben"
591+592+#: letters/templates/letters/letter_form.html:18
593+msgid "Be thoughtful but feel free to be critical."
594+msgstr "Seien Sie nachdenklich, aber scheuen Sie sich nicht, kritisch zu sein."
595+596+#: letters/templates/letters/letter_form.html:19
597+msgid "Representatives are humans tooโstay respectful."
598+msgstr "Abgeordnete sind auch Menschen โ bleiben Sie respektvoll."
599600#: letters/templates/letters/letter_form.html:20
601+msgid "Keep your arguments clear and concise."
602+msgstr "Halten Sie Ihre Argumente klar und prรคgnant."
603+604+#: letters/templates/letters/letter_form.html:21
605+msgid "No insults or hate speech."
606+msgstr "Keine Beleidigungen oder Hassrede."
607+608+#: letters/templates/letters/letter_form.html:22
609+msgid "Stay within the bounds of the Grundgesetz when making demands."
610+msgstr "Bleiben Sie bei Forderungen im Rahmen des Grundgesetzes."
611+612+#: letters/templates/letters/letter_form.html:30
613msgid "Title:"
614msgstr "Titel:"
615616+#: letters/templates/letters/letter_form.html:36
617msgid ""
618+"Describe your concern in a sentence; we'll use it to suggest representatives."
00000000000619msgstr ""
620+"Beschreiben Sie Ihr Anliegen in einem Satz; wir verwenden ihn, um Ihnen Abgeordnete "
621+"vorzuschlagen."
622623+#: letters/templates/letters/letter_form.html:41
624msgid "To Representative:"
625msgstr "An Abgeordnete:"
626627+#: letters/templates/letters/letter_form.html:47
628+msgid ""
629+"Already know who to address? Pick them here. Otherwise, use the suggestions "
630+"below."
631+msgstr ""
632+"Wissen Sie bereits, wen Sie ansprechen mรถchten? Wรคhlen Sie hier aus. Andernfalls nutzen "
633+"Sie die Vorschlรคge unten."
634635+#: letters/templates/letters/letter_form.html:53
636msgid "Letter Body:"
637msgstr "Brieftext:"
638639+#: letters/templates/letters/letter_form.html:60
0000640msgid "Publish Letter"
641msgstr "Brief verรถffentlichen"
642643+#: letters/templates/letters/letter_form.html:67
0000644msgid "Smart Suggestions"
645msgstr "Intelligente Vorschlรคge"
646647+#: letters/templates/letters/letter_form.html:69
0000648msgid ""
649+"Type your title and we'll use your verified profile to suggest "
650+"representatives, topics, and related letters."
651msgstr ""
652+"Geben Sie Ihren Titel ein und wir verwenden Ihr verifiziertes Profil, um Ihnen "
653+"Abgeordnete, Themen und verwandte Briefe vorzuschlagen."
654655+#: letters/templates/letters/letter_form.html:81
656msgid "Loading..."
657msgstr "Lรคdt..."
658659+#: letters/templates/letters/letter_form.html:83
660msgid "Analyzing your title..."
661msgstr "Analysiere Ihren Titel..."
662···697msgid "Popular tags:"
698msgstr "Beliebte Schlagwรถrter:"
699700+#: letters/templates/letters/letter_list.html:41
701+msgid "Previous"
702+msgstr "Zurรผck"
703+704+#: letters/templates/letters/letter_list.html:43
705+#, python-format
706+msgid "Page %(page)s of %(total)s"
707+msgstr "Seite %(page)s von %(total)s"
708+709+#: letters/templates/letters/letter_list.html:45
710+msgid "Next"
711+msgstr "Weiter"
712+713+#: letters/templates/letters/letter_list.html:51
714+msgid "No letters found."
715+msgstr "Keine Briefe gefunden."
716+717+#: letters/templates/letters/letter_list.html:51
718+msgid "Be the first to write one!"
719+msgstr "Schreiben Sie den ersten!"
720+721# Login page
722#: letters/templates/letters/login.html:14
723+#: letters/templates/letters/register.html:15
724msgid "Username:"
725msgstr "Benutzername:"
726727#: letters/templates/letters/login.html:22
728+#: letters/templates/letters/register.html:47
729msgid "Password:"
730msgstr "Passwort:"
731732#: letters/templates/letters/login.html:37
733+msgid "Forgot your password?"
734+msgstr "Passwort vergessen?"
735+736+#: letters/templates/letters/login.html:41
737msgid "Don't have an account?"
738msgstr "Noch kein Konto?"
739740+#: letters/templates/letters/login.html:41
741msgid "Register here"
742msgstr "Hier registrieren"
743744+#: letters/templates/letters/partials/letter_card.html:6
745+msgid "To"
746+msgstr "An"
747+748# Plurals for signatures
749#: letters/templates/letters/partials/letter_card.html:20
0750#, python-format
751msgid "%(counter)s signature"
752msgid_plural "%(counter)s signatures"
···754msgstr[1] "%(counter)s Unterschriften"
755756#: letters/templates/letters/partials/letter_card.html:20
757+#, python-format
0758msgid "%(counter)s verified"
759msgid_plural "%(counter)s verified"
760msgstr[0] "%(counter)s verifiziert"
761msgstr[1] "%(counter)s verifiziert"
762763+#: letters/templates/letters/partials/representative_card.html:21
764+#: letters/templates/letters/partials/representative_card.html:23
765+msgid "Constituency"
766+msgstr "Wahlkreis"
767+768+#: letters/templates/letters/partials/representative_card.html:27
769+msgid "Mandate"
770+msgstr "Mandat"
771+772+#: letters/templates/letters/partials/representative_card.html:34
773+msgid "Focus"
774+msgstr "Schwerpunkt"
775+776+#: letters/templates/letters/partials/representative_card.html:34
777+msgid "self-declared"
778+msgstr "selbst erklรคrt"
779+780+#: letters/templates/letters/partials/representative_card.html:45
781+msgid "Committees"
782+msgstr "Ausschรผsse"
783+784+#: letters/templates/letters/partials/representative_card.html:57
785+msgid "Email"
786+msgstr "E-Mail"
787+788+#: letters/templates/letters/partials/representative_card.html:60
789+msgid "Website"
790+msgstr "Webseite"
791+792+#: letters/templates/letters/partials/representative_card.html:66
793+msgid "View profile"
794+msgstr "Profil ansehen"
795+796+#: letters/templates/letters/partials/suggestions.html:10
797+msgid ""
798+"We couldn't match you to a constituency yet. Update your profile "
799+"verification to see local representatives."
800+msgstr ""
801+"Wir konnten Sie noch keinem Wahlkreis zuordnen. Aktualisieren Sie Ihre Profilverifizierung, "
802+"um lokale Abgeordnete zu sehen."
803+804# Suggestions partial
805+#: letters/templates/letters/partials/suggestions.html:16
806msgid "Our Interpretation"
807msgstr "Unsere Interpretation"
808809+#: letters/templates/letters/partials/suggestions.html:21
810msgid "Topic:"
811msgstr "Thema:"
812813+#: letters/templates/letters/partials/suggestions.html:28
814msgid "No specific policy area detected. Try adding more keywords."
815msgstr ""
816"Kein spezifischer Politikbereich erkannt. Versuchen Sie, mehr "
817"Schlรผsselwรถrter hinzuzufรผgen."
818819+#: letters/templates/letters/partials/suggestions.html:37
820+msgid "Related Keywords"
821+msgstr "Verwandte Schlagwรถrter"
822+823+#: letters/templates/letters/partials/suggestions.html:51
824+msgid "Your Direct Representatives"
825+msgstr "Ihre direkten Abgeordneten"
826+827+#: letters/templates/letters/partials/suggestions.html:56
828+msgid "These representatives directly represent your constituency:"
829+msgstr "Diese Abgeordneten vertreten Ihren Wahlkreis direkt:"
830831+#: letters/templates/letters/partials/suggestions.html:67
832+#: letters/templates/letters/partials/suggestions.html:102
833+msgid "Select"
834+msgstr "Auswรคhlen"
835+836+#: letters/templates/letters/partials/suggestions.html:81
837+msgid "Topic Experts"
838+msgstr "Themenexperten"
839+840+#: letters/templates/letters/partials/suggestions.html:86
841#, python-format
842msgid ""
843+"These representatives are experts on \"%(topic)s\" based on their committee "
844+"memberships:"
845msgstr ""
846+"Diese Abgeordneten sind Experten fรผr \"%(topic)s\" basierend auf ihren "
847+"Ausschussmitgliedschaften:"
848849+#: letters/templates/letters/partials/suggestions.html:95
0000850msgid "of"
851msgstr "von"
852853+#: letters/templates/letters/partials/suggestions.html:116
854+msgid "Suggested Representatives"
855+msgstr "Vorgeschlagene Abgeordnete"
856857+#: letters/templates/letters/partials/suggestions.html:119
0000858msgid ""
859"No representatives found. Representatives may need to be synced for this "
860"governmental level."
···862"Keine Abgeordneten gefunden. Abgeordnete mรผssen mรถglicherweise fรผr diese "
863"Verwaltungsebene synchronisiert werden."
864865+#: letters/templates/letters/partials/suggestions.html:148
866+msgid "Selected:"
867+msgstr "Ausgewรคhlt:"
868+869+#: letters/templates/letters/password_reset_complete.html:4
870+#: letters/templates/letters/password_reset_complete.html:8
871+msgid "Password updated"
872+msgstr "Passwort aktualisiert"
873+874+#: letters/templates/letters/password_reset_complete.html:9
875+msgid "You can now sign in using your new password."
876+msgstr "Sie kรถnnen sich jetzt mit Ihrem neuen Passwort anmelden."
877+878+#: letters/templates/letters/password_reset_complete.html:10
879+msgid "Go to login"
880+msgstr "Zur Anmeldung"
881+882+#: letters/templates/letters/password_reset_confirm.html:4
883+#: letters/templates/letters/password_reset_confirm.html:9
884+msgid "Choose a new password"
885+msgstr "Wรคhlen Sie ein neues Passwort"
886+887+#: letters/templates/letters/password_reset_confirm.html:13
888+msgid "New password"
889+msgstr "Neues Passwort"
890+891+#: letters/templates/letters/password_reset_confirm.html:20
892+msgid "Confirm password"
893+msgstr "Passwort bestรคtigen"
894+895+#: letters/templates/letters/password_reset_confirm.html:26
896+msgid "Update password"
897+msgstr "Passwort aktualisieren"
898899+#: letters/templates/letters/password_reset_confirm.html:29
900+msgid "Reset link invalid"
901+msgstr "Zurรผcksetzungslink ungรผltig"
902+903+#: letters/templates/letters/password_reset_confirm.html:30
904+msgid "This password reset link is no longer valid. Please request a new one."
905+msgstr "Dieser Passwort-Zurรผcksetzungslink ist nicht mehr gรผltig. Bitte fordern Sie einen neuen an."
906+907+#: letters/templates/letters/password_reset_confirm.html:31
908+msgid "Request new link"
909+msgstr "Neuen Link anfordern"
910+911+#: letters/templates/letters/password_reset_done.html:4
912+msgid "Reset email sent"
913+msgstr "Zurรผcksetzungs-E-Mail gesendet"
914+915+#: letters/templates/letters/password_reset_done.html:9
916+msgid ""
917+"If an account exists for that email address, we just sent you instructions "
918+"to choose a new password."
919msgstr ""
920+"Falls ein Konto fรผr diese E-Mail-Adresse existiert, haben wir Ihnen gerade Anweisungen "
921+"zum Festlegen eines neuen Passworts gesendet."
922923+#: letters/templates/letters/password_reset_done.html:10
924+msgid "The link will stay valid for a limited time."
925+msgstr "Der Link bleibt fรผr eine begrenzte Zeit gรผltig."
926927+#: letters/templates/letters/password_reset_done.html:11
928+msgid "Back to login"
929+msgstr "Zurรผck zur Anmeldung"
930931+#: letters/templates/letters/password_reset_form.html:4
932+msgid "Reset password"
933+msgstr "Passwort zurรผcksetzen"
934935+#: letters/templates/letters/password_reset_form.html:8
936+msgid "Reset your password"
937+msgstr "Setzen Sie Ihr Passwort zurรผck"
00938939+#: letters/templates/letters/password_reset_form.html:9
940+msgid ""
941+"Enter the email address you used during registration. We will send you a "
942+"link to create a new password."
943msgstr ""
944+"Geben Sie die E-Mail-Adresse ein, die Sie bei der Registrierung verwendet haben. Wir "
945+"senden Ihnen einen Link zum Erstellen eines neuen Passworts."
946947+#: letters/templates/letters/password_reset_form.html:17
948+msgid "Send reset link"
949+msgstr "Zurรผcksetzungslink senden"
950951# Profile page
952+#: letters/templates/letters/profile.html:13
953#, python-format
954msgid "%(username)s's Profile"
955msgstr "Profil von %(username)s"
956957+#: letters/templates/letters/profile.html:16
958+msgid "Identity & Constituency"
959+msgstr "Identitรคt & Wahlkreis"
960961+#: letters/templates/letters/profile.html:19
962+msgid "Status:"
963+msgstr "Status:"
00000964965#: letters/templates/letters/profile.html:21
966+msgid "Type:"
967+msgstr "Typ:"
968+969+#: letters/templates/letters/profile.html:28
970+msgid ""
971+"You self-declared your constituency. Representatives will see your "
972+"signatures as self-declared constituents."
973msgstr ""
974+"Sie haben Ihren Wahlkreis selbst angegeben. Abgeordnete werden Ihre Unterschriften als "
975+"selbst angegebene Wรคhler sehen."
976977+#: letters/templates/letters/profile.html:30
978+msgid "Start third-party verification"
979+msgstr "Drittanbieter-Verifizierung starten"
980+981+#: letters/templates/letters/profile.html:33
982+msgid ""
983+"Your identity was verified via a third-party provider. Signatures will "
984+"appear as verified constituents."
985+msgstr ""
986+"Ihre Identitรคt wurde รผber einen Drittanbieter verifiziert. Unterschriften werden als "
987+"verifizierte Wรคhler angezeigt."
988989+#: letters/templates/letters/profile.html:38
990msgid "Your verification is being processed."
991msgstr "Ihre Verifizierung wird bearbeitet."
992993+#: letters/templates/letters/profile.html:39
994msgid "Complete Verification (Stub)"
995msgstr "Verifizierung abschlieรen (Stub)"
996997+#: letters/templates/letters/profile.html:43
998+msgid "Verification failed. Please try again or contact support."
999+msgstr "Verifizierung fehlgeschlagen. Bitte versuchen Sie es erneut oder kontaktieren Sie den Support."
10001001+#: letters/templates/letters/profile.html:48
1002+msgid ""
1003+"You can self-declare your constituency below or start a verification with a "
1004+"trusted provider. Verified signatures carry more weight."
1005+msgstr ""
1006+"Sie kรถnnen Ihren Wahlkreis unten selbst angeben oder eine Verifizierung mit einem "
1007+"vertrauenswรผrdigen Anbieter starten. Verifizierte Unterschriften haben mehr Gewicht."
10081009+#: letters/templates/letters/profile.html:50
1010+msgid "Start Third-party Verification"
1011+msgstr "Drittanbieter-Verifizierung starten"
1012+1013+#: letters/templates/letters/profile.html:55
1014+msgid "Ihre Adresse"
1015+msgstr "Ihre Adresse"
1016+1017+#: letters/templates/letters/profile.html:57
1018msgid ""
1019+"Geben Sie Ihre vollstรคndige Adresse ein, um prรคzise Wahlkreis- und "
1020+"Abgeordnetenempfehlungen zu erhalten."
1021msgstr ""
1022+"Geben Sie Ihre vollstรคndige Adresse ein, um prรคzise Wahlkreis- und "
1023+"Abgeordnetenempfehlungen zu erhalten."
010241025+#: letters/templates/letters/profile.html:61
1026+msgid "Gespeicherte Adresse:"
1027+msgstr "Gespeicherte Adresse:"
1028+1029+#: letters/templates/letters/profile.html:83
1030+msgid "Adresse speichern"
1031+msgstr "Adresse speichern"
10321033+#: letters/templates/letters/profile.html:88
1034+msgid "Self-declare your constituency"
1035+msgstr "Geben Sie Ihren Wahlkreis selbst an"
1036+1037+#: letters/templates/letters/profile.html:90
1038+msgid ""
1039+"Select the constituencies you live in so we can prioritise the right "
1040+"representatives."
1041+msgstr ""
1042+"Wรคhlen Sie die Wahlkreise aus, in denen Sie leben, damit wir die richtigen "
1043+"Abgeordneten priorisieren kรถnnen."
1044+1045+#: letters/templates/letters/profile.html:109
1046+msgid "Save constituencies"
1047+msgstr "Wahlkreise speichern"
1048+1049+#: letters/templates/letters/profile.html:114
1050msgid "Your Letters"
1051msgstr "Ihre Briefe"
10521053+#: letters/templates/letters/profile.html:120
1054msgid "You haven't written any letters yet."
1055msgstr "Sie haben noch keine Briefe geschrieben."
10561057+#: letters/templates/letters/profile.html:120
1058msgid "Write one now!"
1059msgstr "Schreiben Sie jetzt einen!"
10601061+#: letters/templates/letters/profile.html:125
1062msgid "Letters You've Signed"
1063msgstr "Briefe, die Sie unterzeichnet haben"
10641065+#: letters/templates/letters/profile.html:133
0000000001066msgid "You haven't signed any letters yet."
1067msgstr "Sie haben noch keine Briefe unterzeichnet."
10681069+#: letters/templates/letters/profile.html:133
1070msgid "Browse letters"
1071msgstr "Briefe durchsuchen"
10721073+#: letters/templates/letters/profile.html:138
1074+msgid "Account"
1075+msgstr "Konto"
1076+1077+#: letters/templates/letters/profile.html:140
1078+msgid ""
1079+"Need a fresh start? You can delete your account at any time. Your letters "
1080+"stay visible but without your name."
1081+msgstr ""
1082+"Brauchen Sie einen Neuanfang? Sie kรถnnen Ihr Konto jederzeit lรถschen. Ihre Briefe "
1083+"bleiben sichtbar, aber ohne Ihren Namen."
1084+1085+#: letters/templates/letters/register.html:9
1086+msgid ""
1087+"After registration we'll send you an email to confirm your address before "
1088+"you can sign in."
1089+msgstr ""
1090+"Nach der Registrierung senden wir Ihnen eine E-Mail, um Ihre Adresse zu bestรคtigen, "
1091+"bevor Sie sich anmelden kรถnnen."
1092+1093+#: letters/templates/letters/register.html:23
1094msgid "Email:"
1095msgstr "E-Mail:"
10961097# Register page
1098+#: letters/templates/letters/register.html:31
1099msgid "First Name (optional):"
1100msgstr "Vorname (optional):"
11011102+#: letters/templates/letters/register.html:39
1103msgid "Last Name (optional):"
1104msgstr "Nachname (optional):"
11051106+#: letters/templates/letters/register.html:55
1107msgid "Confirm Password:"
1108msgstr "Passwort bestรคtigen:"
11091110+#: letters/templates/letters/register.html:70
1111msgid "Already have an account?"
1112msgstr "Bereits ein Konto?"
11131114+#: letters/templates/letters/register.html:70
1115msgid "Login here"
1116msgstr "Hier anmelden"
111701118#: letters/templates/letters/representative_detail.html:19
1119+msgid "รber"
1120+msgstr "รber"
000000000000000000000000011211122+#: letters/templates/letters/representative_detail.html:30
000000001123msgid "Committee Memberships"
1124msgstr "Ausschussmitgliedschaften"
11251126+#: letters/templates/letters/representative_detail.html:75
0000000000001127msgid "Open Letters"
1128msgstr "Offene Briefe"
11291130+#: letters/templates/letters/representative_detail.html:83
1131msgid "No letters have been written to this representative yet."
1132msgstr "An diesen Abgeordneten wurden noch keine Briefe geschrieben."
11331134+#: letters/templates/letters/representative_detail.html:85
1135msgid "Write the First Letter"
1136msgstr "Ersten Brief schreiben"
11371138+#: letters/templates/letters/representative_detail.html:95
1139msgid "External Resources"
1140msgstr "Externe Ressourcen"
11411142+#: letters/templates/letters/representative_detail.html:100
1143msgid "Abgeordnetenwatch Profile"
1144msgstr "Abgeordnetenwatch-Profil"
11451146+#: letters/templates/letters/representative_detail.html:102
1147msgid ""
1148"View voting record, questions, and detailed profile on Abgeordnetenwatch.de"
1149msgstr ""
1150"Abstimmungsverhalten, Fragen und detailliertes Profil auf Abgeordnetenwatch."
1151"de ansehen"
11521153+#: letters/templates/letters/representative_detail.html:112
1154+msgid "Wikipedia Article"
1155+msgstr "Wikipedia-Artikel"
11561157+#: letters/templates/letters/representative_detail.html:114
00001158msgid "Read more about this representative on Wikipedia"
1159msgstr "Mehr รผber diesen Abgeordneten auf Wikipedia lesen"
11601161+#: letters/templates/letters/representative_detail.html:117
1162msgid "View on Wikipedia"
1163msgstr "Auf Wikipedia ansehen"
11641165+#: letters/templates/letters/representative_detail.html:123
1166msgid "No external resources available for this representative."
1167msgstr "Keine externen Ressourcen fรผr diesen Abgeordneten verfรผgbar."
11681169+#: letters/templates/letters/representative_detail.html:130
1170+msgid "Kontakt"
1171+msgstr "Kontakt"
1172+1173+#: letters/templates/letters/representative_detail.html:145
1174#, python-format
1175msgid "Start a new open letter to %(name)s"
1176msgstr "Einen neuen offenen Brief an %(name)s beginnen"
11771178+#: letters/templates/letters/representative_detail.html:153
1179msgid "Login to Write Letter"
1180msgstr "Anmelden um Brief zu schreiben"
11811182+#: letters/views.py:52
1183+msgid "Confirm your WriteThem.eu account"
1184+msgstr "Bestรคtigen Sie Ihr WriteThem.eu-Konto"
1185+1186# Flash messages
1187+#: letters/views.py:184
1188msgid "Your letter has been published and your signature has been added!"
1189+msgstr "Ihr Brief wurde verรถffentlicht und Ihre Unterschrift wurde hinzugefรผgt!"
011901191+#: letters/views.py:197
1192msgid "You have already signed this letter."
1193msgstr "Sie haben diesen Brief bereits unterzeichnet."
11941195+#: letters/views.py:207
1196msgid "Your signature has been added!"
1197msgstr "Ihre Unterschrift wurde hinzugefรผgt!"
11981199+#: letters/views.py:225
1200msgid "Thank you for your report. Our team will review it."
1201msgstr "Vielen Dank fรผr Ihre Meldung. Unser Team wird sie รผberprรผfen."
12021203+#: letters/views.py:259
1204+msgid ""
1205+"Please confirm your email address. We sent you a link to activate your "
1206+"account."
1207+msgstr ""
1208+"Bitte bestรคtigen Sie Ihre E-Mail-Adresse. Wir haben Ihnen einen Link zum Aktivieren "
1209+"Ihres Kontos gesendet."
12101211+#: letters/views.py:289
1212+msgid "Your account has been activated. You can now log in."
1213+msgstr "Ihr Konto wurde aktiviert. Sie kรถnnen sich jetzt anmelden."
1214+1215+#: letters/views.py:292
1216+msgid "Your account is already active."
1217+msgstr "Ihr Konto ist bereits aktiv."
12181219+#: letters/views.py:347
1220+msgid "Ihre Adresse wurde gespeichert."
1221+msgstr "Ihre Adresse wurde gespeichert."
1222+1223+#: letters/views.py:363
1224+msgid "Your constituency information has been updated."
1225+msgstr "Ihre Wahlkreisinformationen wurden aktualisiert."
1226+1227+#: letters/views.py:391
1228+msgid ""
1229+"Your account has been deleted. Your published letters remain available to "
1230+"the public."
1231+msgstr ""
1232+"Ihr Konto wurde gelรถscht. Ihre verรถffentlichten Briefe bleiben fรผr die "
1233+"รffentlichkeit verfรผgbar."
1234+1235+# Forms
1236+#~ msgid "Postal code (PLZ)"
1237+#~ msgstr "Postleitzahl (PLZ)"
1238+1239+#, fuzzy
1240+#~| msgid "Use your PLZ to narrow down representatives from your constituency."
1241+#~ msgid "Use your PLZ to narrow down representatives from your parliament."
1242+#~ msgstr ""
1243+#~ "Verwenden Sie Ihre PLZ, um Abgeordnete aus Ihrem Wahlkreis einzugrenzen."
1244+1245+#~ msgid "Comma-separated tags (e.g., \"climate, transport, education\")"
1246+#~ msgstr "Komma-getrennte Schlagwรถrter (z.B. \"Klima, Verkehr, Bildung\")"
1247+1248+#~ msgid "climate, transport, education"
1249+#~ msgstr "Klima, Verkehr, Bildung"
1250+1251+#~ msgid "Write your letter here"
1252+#~ msgstr "Schreiben Sie hier Ihren Brief"
1253+1254+#, fuzzy
1255+#~| msgid "Federal"
1256+#~ msgid "Federal district"
1257+#~ msgstr "Bund"
1258+1259+#~ msgid "Your postal code (PLZ):"
1260+#~ msgstr "Ihre Postleitzahl (PLZ):"
1261+1262+#~ msgid "Or select from suggestions on the right โ"
1263+#~ msgstr "Oder wรคhlen Sie aus den Vorschlรคgen rechts โ"
1264+1265+#~ msgid "Tags (optional):"
1266+#~ msgstr "Schlagwรถrter (optional):"
12671268#, python-format
1269+#~ msgid ""
1270+#~ "Based on the topic \"%(topic)s\", we suggest contacting representatives "
1271+#~ "from the %(level)s:"
1272+#~ msgstr ""
1273+#~ "Basierend auf dem Thema \"%(topic)s\" empfehlen wir, Abgeordnete des "
1274+#~ "%(level)s zu kontaktieren:"
1275+1276+#, fuzzy
1277+#~| msgid "Suggested Representatives"
1278+#~ msgid "Suggested Tags"
1279+#~ msgstr "Vorgeschlagene Abgeordnete"
1280+1281+#~ msgid "Similar Letters"
1282+#~ msgstr "รhnliche Briefe"
1283+1284+#~ msgid "Others have written about similar topics:"
1285+#~ msgstr "Andere haben รผber รคhnliche Themen geschrieben:"
12861287+#, fuzzy
1288+#~| msgid "To"
1289+#~ msgid "To:"
1290+#~ msgstr "An"
1291+1292+#~ msgid "Identity Verification"
1293+#~ msgstr "Identitรคtsverifizierung"
12941295+#~ msgid "Your signatures will be marked as verified constituent signatures."
1296+#~ msgstr ""
1297+#~ "Ihre Unterschriften werden als verifizierte Wรคhlerunterschriften markiert."
1298+1299+#~ msgid "Verification Pending"
1300+#~ msgstr "Verifizierung ausstehend"
1301+1302+#~ msgid "Verification Failed"
1303+#~ msgstr "Verifizierung fehlgeschlagen"
1304+1305+# Letter detail page
1306+#~ msgid "Signed on"
1307+#~ msgstr "Unterzeichnet am"
1308+1309+#~ msgid "Your comment:"
1310+#~ msgstr "Ihr Kommentar:"
1311+1312+# Representative detail
1313+#~ msgid "Party:"
1314+#~ msgstr "Partei:"
1315+1316+#~ msgid "Legislative Body:"
1317+#~ msgstr "Parlament:"
1318+1319+#~ msgid "Present"
1320+#~ msgstr "Heute"
1321+1322+#~ msgid "Inactive"
1323+#~ msgstr "Inaktiv"
1324+1325+#~ msgid ""
1326+#~ "Based on committee memberships, this representative works on the "
1327+#~ "following policy areas:"
1328+#~ msgstr ""
1329+#~ "Basierend auf Ausschussmitgliedschaften arbeitet dieser Abgeordnete in "
1330+#~ "folgenden Politikbereichen:"
1331+1332+#, python-format
1333+#~ msgid "Welcome, %(username)s! Your account has been created."
1334+#~ msgstr "Willkommen, %(username)s! Ihr Konto wurde erstellt."
13351336#, python-format
1337#~ msgid "<strong>%(counter)s</strong> other verified"
···13491350#~ msgid "Committee Memberships:"
1351#~ msgstr "Ausschussmitgliedschaften:"
00013521353# Services explanations
1354#~ msgid "No matching policy areas found. Please try different keywords."
···1+# SOME DESCRIPTIVE TITLE.
2+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3+# This file is distributed under the same license as the PACKAGE package.
4+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5+#
6+#, fuzzy
7+msgid ""
8+msgstr ""
9+"Project-Id-Version: PACKAGE VERSION\n"
10+"Report-Msgid-Bugs-To: \n"
11+"POT-Creation-Date: 2025-10-15 00:28+0200\n"
12+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14+"Language-Team: LANGUAGE <LL@li.org>\n"
15+"Language: \n"
16+"MIME-Version: 1.0\n"
17+"Content-Type: text/plain; charset=UTF-8\n"
18+"Content-Transfer-Encoding: 8bit\n"
19+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
20+21+#: letters/admin.py:75
22+msgid "Mandate Details"
23+msgstr "Mandate Details"
24+25+#: letters/admin.py:78
26+msgid "Focus Areas"
27+msgstr "Focus Areas"
28+29+#: letters/admin.py:81 letters/admin.py:95
30+msgid "Photo"
31+msgstr "Photo"
32+33+#: letters/admin.py:85
34+msgid "Metadata"
35+msgstr "Metadata"
36+37+#: letters/admin.py:94
38+msgid "No photo"
39+msgstr "No photo"
40+41+#: letters/admin.py:167
42+msgid "Topic Areas"
43+msgstr "Topic Areas"
44+45+#: letters/forms.py:25
46+msgid ""
47+"An account with this email already exists. If you registered before, please "
48+"check your inbox for the activation link or reset your password."
49+msgstr ""
50+"An account with this email already exists. If you registered before, please "
51+"check your inbox for the activation link or reset your password."
52+53+#: letters/forms.py:37
54+msgid "Title"
55+msgstr "Title"
56+57+#: letters/forms.py:38
58+msgid "Letter Body"
59+msgstr "Letter Body"
60+61+#: letters/forms.py:39
62+msgid "To Representative"
63+msgstr "To Representative"
64+65+#: letters/forms.py:42
66+msgid "Describe your concern briefly"
67+msgstr "Describe your concern briefly"
68+69+#: letters/forms.py:43
70+msgid ""
71+"Write your letter here. Markdown formatting (e.g. **bold**, _italic_) is "
72+"supported."
73+msgstr ""
74+"Write your letter here. Markdown formatting (e.g. **bold**, _italic_) is "
75+"supported."
76+77+#: letters/forms.py:46
78+msgid "Letter title"
79+msgstr "Letter title"
80+81+#: letters/forms.py:50
82+msgid "Write your letter here..."
83+msgstr "Write your letter here..."
84+85+#: letters/forms.py:110
86+msgid "Comment (optional)"
87+msgstr "Comment (optional)"
88+89+#: letters/forms.py:113
90+msgid "Add a personal note to your signature"
91+msgstr "Add a personal note to your signature"
92+93+#: letters/forms.py:119
94+msgid "Optional: Add your comment..."
95+msgstr "Optional: Add your comment..."
96+97+#: letters/forms.py:131
98+msgid "Reason"
99+msgstr "Reason"
100+101+#: letters/forms.py:132
102+msgid "Description"
103+msgstr "Description"
104+105+#: letters/forms.py:135
106+msgid "Please provide details about why you are reporting this letter"
107+msgstr "Please provide details about why you are reporting this letter"
108+109+#: letters/forms.py:142
110+msgid "Please describe the issue..."
111+msgstr "Please describe the issue..."
112+113+#: letters/forms.py:152 letters/templates/letters/letter_list.html:19
114+msgid "Search"
115+msgstr "Search"
116+117+#: letters/forms.py:155 letters/templates/letters/letter_list.html:18
118+msgid "Search letters..."
119+msgstr "Search letters..."
120+121+#: letters/forms.py:161
122+msgid "Tag"
123+msgstr "Tag"
124+125+#: letters/forms.py:164
126+msgid "Filter by tag..."
127+msgstr "Filter by tag..."
128+129+#: letters/forms.py:180
130+msgid "Bundestag constituency"
131+msgstr "Bundestag constituency"
132+133+#: letters/forms.py:181
134+msgid "Pick your Bundestag direct mandate constituency (Wahlkreis)."
135+msgstr "Pick your Bundestag direct mandate constituency (Wahlkreis)."
136+137+#: letters/forms.py:182 letters/forms.py:189
138+msgid "Select constituency"
139+msgstr "Select constituency"
140+141+#: letters/forms.py:187
142+msgid "State parliament constituency"
143+msgstr "State parliament constituency"
144+145+#: letters/forms.py:188
146+msgid "Optionally pick your Landtag constituency if applicable."
147+msgstr "Optionally pick your Landtag constituency if applicable."
148+149+#: letters/forms.py:240
150+msgid "Please select at least one constituency to save your profile."
151+msgstr "Please select at least one constituency to save your profile."
152+153+#: letters/forms.py:252
154+msgid "Straรe und Hausnummer"
155+msgstr "Straรe und Hausnummer"
156+157+#: letters/forms.py:255
158+msgid "z.B. Unter den Linden 77"
159+msgstr "z.B. Unter den Linden 77"
160+161+#: letters/forms.py:261
162+msgid "Postleitzahl"
163+msgstr "Postleitzahl"
164+165+#: letters/forms.py:264
166+msgid "z.B. 10117"
167+msgstr "z.B. 10117"
168+169+#: letters/forms.py:270
170+msgid "Stadt"
171+msgstr "Stadt"
172+173+#: letters/forms.py:273
174+msgid "z.B. Berlin"
175+msgstr "z.B. Berlin"
176+177+#: letters/forms.py:304
178+msgid ""
179+"Bitte geben Sie eine vollstรคndige Adresse ein (Straรe, PLZ und Stadt) oder "
180+"lassen Sie alle Felder leer."
181+msgstr ""
182+"Bitte geben Sie eine vollstรคndige Adresse ein (Straรe, PLZ und Stadt) oder "
183+"lassen Sie alle Felder leer."
184+185+#: letters/models.py:15
186+msgid "European Union"
187+msgstr "European Union"
188+189+#: letters/models.py:16
190+msgid "Federal"
191+msgstr "Federal"
192+193+#: letters/models.py:17
194+msgid "State"
195+msgstr "State"
196+197+#: letters/models.py:18
198+msgid "Local"
199+msgstr "Local"
200+201+#: letters/models.py:21
202+msgid "Name of the parliament"
203+msgstr "Name of the parliament"
204+205+#: letters/models.py:25
206+msgid "e.g., 'Bundestag', 'Bayerischer Landtag', 'Gemeinderat Mรผnchen'"
207+msgstr "e.g., 'Bundestag', 'Bayerischer Landtag', 'Gemeinderat Mรผnchen'"
208+209+#: letters/models.py:29
210+msgid "Geographic identifier (state code, municipality code, etc.)"
211+msgstr "Geographic identifier (state code, municipality code, etc.)"
212+213+#: letters/models.py:37
214+msgid "For hierarchical relationships (e.g., local within state)"
215+msgstr "For hierarchical relationships (e.g., local within state)"
216+217+#: letters/models.py:43 letters/models.py:70 letters/models.py:105
218+#: letters/models.py:165 letters/models.py:372 letters/models.py:421
219+msgid "Last time this was synced from external API"
220+msgstr "Last time this was synced from external API"
221+222+#: letters/models.py:47 letters/templates/letters/committee_detail.html:70
223+msgid "Parliament"
224+msgstr "Parliament"
225+226+#: letters/models.py:48
227+msgid "Parliaments"
228+msgstr "Parliaments"
229+230+#: letters/models.py:84
231+msgid "Federal electoral district"
232+msgstr "Federal electoral district"
233+234+#: letters/models.py:85
235+msgid "Bundestag state list"
236+msgstr "Bundestag state list"
237+238+#: letters/models.py:86
239+msgid "Bundestag federal list"
240+msgstr "Bundestag federal list"
241+242+#: letters/models.py:87
243+msgid "State electoral district"
244+msgstr "State electoral district"
245+246+#: letters/models.py:88
247+msgid "State regional list"
248+msgstr "State regional list"
249+250+#: letters/models.py:89
251+msgid "State wide list"
252+msgstr "State wide list"
253+254+#: letters/models.py:90
255+msgid "EU at large"
256+msgstr "EU at large"
257+258+#: letters/models.py:119
259+msgid "Direct mandate"
260+msgstr "Direct mandate"
261+262+#: letters/models.py:120
263+msgid "State list mandate"
264+msgstr "State list mandate"
265+266+#: letters/models.py:121
267+msgid "State regional list mandate"
268+msgstr "State regional list mandate"
269+270+#: letters/models.py:122
271+msgid "Federal list mandate"
272+msgstr "Federal list mandate"
273+274+#: letters/models.py:123
275+msgid "EU list mandate"
276+msgstr "EU list mandate"
277+278+#: letters/models.py:444
279+msgid "Draft"
280+msgstr "Draft"
281+282+#: letters/models.py:445
283+msgid "Published"
284+msgstr "Published"
285+286+#: letters/models.py:446
287+msgid "Flagged for Review"
288+msgstr "Flagged for Review"
289+290+#: letters/models.py:447
291+msgid "Removed"
292+msgstr "Removed"
293+294+#: letters/models.py:487
295+msgid "Deleted user"
296+msgstr "Deleted user"
297+298+#: letters/services.py:2451
299+#, python-format
300+msgid "Detected policy area: %(topic)s."
301+msgstr "Detected policy area: %(topic)s."
302+303+#: letters/services.py:2456
304+#, python-format
305+msgid "Prioritising representatives for %(constituencies)s."
306+msgstr "Prioritising representatives for %(constituencies)s."
307+308+#: letters/services.py:2461
309+#, python-format
310+msgid "Filtering by state %(state)s."
311+msgstr "Filtering by state %(state)s."
312+313+#: letters/services.py:2465
314+#, python-format
315+msgid ""
316+"Postal code %(plz)s had no direct match; showing broader representatives."
317+msgstr ""
318+"Postal code %(plz)s had no direct match; showing broader representatives."
319+320+#: letters/services.py:2469
321+msgid "Showing generally relevant representatives."
322+msgstr "Showing generally relevant representatives."
323+324+#: letters/templates/letters/account_activation_invalid.html:4
325+#: letters/templates/letters/account_activation_invalid.html:8
326+msgid "Activation link invalid"
327+msgstr "Activation link invalid"
328+329+#: letters/templates/letters/account_activation_invalid.html:10
330+msgid ""
331+"We could not verify your activation link. It may have already been used or "
332+"expired."
333+msgstr ""
334+"We could not verify your activation link. It may have already been used or "
335+"expired."
336+337+#: letters/templates/letters/account_activation_invalid.html:13
338+msgid ""
339+"If you still cannot access your account, try registering again or contact "
340+"support."
341+msgstr ""
342+"If you still cannot access your account, try registering again or contact "
343+"support."
344+345+#: letters/templates/letters/account_activation_invalid.html:15
346+msgid "Register again"
347+msgstr "Register again"
348+349+#: letters/templates/letters/account_activation_sent.html:4
350+msgid "Activate your account"
351+msgstr "Activate your account"
352+353+#: letters/templates/letters/account_activation_sent.html:8
354+#: letters/templates/letters/password_reset_done.html:8
355+msgid "Check your inbox"
356+msgstr "Check your inbox"
357+358+#: letters/templates/letters/account_activation_sent.html:10
359+msgid ""
360+"We sent you an email with a confirmation link. Please click it to activate "
361+"your account."
362+msgstr ""
363+"We sent you an email with a confirmation link. Please click it to activate "
364+"your account."
365+366+#: letters/templates/letters/account_activation_sent.html:13
367+msgid ""
368+"If you do not receive the email within a few minutes, check your spam folder "
369+"or try registering again."
370+msgstr ""
371+"If you do not receive the email within a few minutes, check your spam folder "
372+"or try registering again."
373+374+#: letters/templates/letters/account_activation_sent.html:15
375+msgid "Back to homepage"
376+msgstr "Back to homepage"
377+378+#: letters/templates/letters/account_delete_confirm.html:4
379+#: letters/templates/letters/profile.html:142
380+msgid "Delete account"
381+msgstr "Delete account"
382+383+#: letters/templates/letters/account_delete_confirm.html:8
384+msgid "Delete your account"
385+msgstr "Delete your account"
386+387+#: letters/templates/letters/account_delete_confirm.html:10
388+msgid ""
389+"Deleting your account will remove your personal data and signatures. Letters "
390+"you have published stay online but are shown without your name."
391+msgstr ""
392+"Deleting your account will remove your personal data and signatures. Letters "
393+"you have published stay online but are shown without your name."
394+395+#: letters/templates/letters/account_delete_confirm.html:14
396+msgid "Yes, delete my account"
397+msgstr "Yes, delete my account"
398+399+#: letters/templates/letters/account_delete_confirm.html:15
400+#: letters/templates/letters/letter_form.html:61
401+msgid "Cancel"
402+msgstr "Cancel"
403+404+#: letters/templates/letters/base.html:140
405+msgid "Letters"
406+msgstr "Letters"
407+408+#: letters/templates/letters/base.html:141
409+msgid "Competencies"
410+msgstr "Competencies"
411+412+#: letters/templates/letters/base.html:143
413+#: letters/templates/letters/representative_detail.html:149
414+msgid "Write Letter"
415+msgstr "Write Letter"
416+417+#: letters/templates/letters/base.html:144
418+#: letters/templates/letters/profile.html:4
419+msgid "Profile"
420+msgstr "Profile"
421+422+#: letters/templates/letters/base.html:145
423+msgid "Logout"
424+msgstr "Logout"
425+426+#: letters/templates/letters/base.html:147
427+#: letters/templates/letters/letter_detail.html:47
428+#: letters/templates/letters/letter_detail.html:81
429+#: letters/templates/letters/login.html:4
430+#: letters/templates/letters/login.html:8
431+#: letters/templates/letters/login.html:33
432+msgid "Login"
433+msgstr "Login"
434+435+#: letters/templates/letters/base.html:148
436+#: letters/templates/letters/register.html:4
437+#: letters/templates/letters/register.html:8
438+#: letters/templates/letters/register.html:66
439+msgid "Register"
440+msgstr "Register"
441+442+#: letters/templates/letters/base.html:151
443+msgid "Admin"
444+msgstr "Admin"
445+446+#: letters/templates/letters/base.html:157
447+msgid "Select language"
448+msgstr "Select language"
449+450+#: letters/templates/letters/base.html:182
451+msgid "Empowering citizens to write to their representatives"
452+msgstr "Empowering citizens to write to their representatives"
453+454+#: letters/templates/letters/committee_detail.html:22
455+msgid "Related Topics"
456+msgstr "Related Topics"
457+458+#: letters/templates/letters/committee_detail.html:36
459+msgid "Members"
460+msgstr "Members"
461+462+#: letters/templates/letters/committee_detail.html:46
463+msgid "Role"
464+msgstr "Role"
465+466+#: letters/templates/letters/committee_detail.html:48
467+#: letters/templates/letters/representative_detail.html:61
468+msgid "Active"
469+msgstr "Active"
470+471+#: letters/templates/letters/committee_detail.html:51
472+#: letters/templates/letters/partials/representative_card.html:29
473+msgid "Since"
474+msgstr "Since"
475+476+#: letters/templates/letters/committee_detail.html:58
477+msgid "No members recorded for this committee."
478+msgstr "No members recorded for this committee."
479+480+#: letters/templates/letters/committee_detail.html:67
481+msgid "Committee Info"
482+msgstr "Committee Info"
483+484+#: letters/templates/letters/committee_detail.html:71
485+msgid "Term"
486+msgstr "Term"
487+488+#: letters/templates/letters/committee_detail.html:74
489+#: letters/templates/letters/representative_detail.html:105
490+msgid "View on Abgeordnetenwatch"
491+msgstr "View on Abgeordnetenwatch"
492+493+#: letters/templates/letters/letter_detail.html:10
494+#: letters/templates/letters/partials/letter_card.html:5
495+msgid "By"
496+msgstr "By"
497+498+#: letters/templates/letters/letter_detail.html:29
499+#, python-format
500+msgid "Signatures (%(counter)s)"
501+msgid_plural "Signatures (%(counter)s)"
502+msgstr[0] "Signatures (%(counter)s)"
503+msgstr[1] "Signatures (%(counter)s)"
504+505+#: letters/templates/letters/letter_detail.html:31
506+#, python-format
507+msgid "%(counter)s constituent of %(constituency_name)s"
508+msgid_plural "%(counter)s constituents of %(constituency_name)s"
509+msgstr[0] "%(counter)s constituent of %(constituency_name)s"
510+msgstr[1] "%(counter)s constituents of %(constituency_name)s"
511+512+#: letters/templates/letters/letter_detail.html:32
513+#, python-format
514+msgid "%(counter)s other verified"
515+msgid_plural "%(counter)s other verified"
516+msgstr[0] "%(counter)s other verified"
517+msgstr[1] "%(counter)s other verified"
518+519+#: letters/templates/letters/letter_detail.html:33
520+#, python-format
521+msgid "%(counter)s unverified"
522+msgid_plural "%(counter)s unverified"
523+msgstr[0] "%(counter)s unverified"
524+msgstr[1] "%(counter)s unverified"
525+526+#: letters/templates/letters/letter_detail.html:41
527+msgid "Sign this letter"
528+msgstr "Sign this letter"
529+530+#: letters/templates/letters/letter_detail.html:44
531+msgid "You have signed this letter"
532+msgstr "You have signed this letter"
533+534+#: letters/templates/letters/letter_detail.html:47
535+msgid "to sign this letter"
536+msgstr "to sign this letter"
537+538+#: letters/templates/letters/letter_detail.html:58
539+msgid "โ Verified Constituent"
540+msgstr "โ Verified Constituent"
541+542+#: letters/templates/letters/letter_detail.html:60
543+msgid "โ Verified"
544+msgstr "โ Verified"
545+546+#: letters/templates/letters/letter_detail.html:70
547+msgid "No signatures yet. Be the first to sign!"
548+msgstr "No signatures yet. Be the first to sign!"
549+550+#: letters/templates/letters/letter_detail.html:75
551+#: letters/templates/letters/letter_detail.html:79
552+msgid "Report this letter"
553+msgstr "Report this letter"
554+555+#: letters/templates/letters/letter_detail.html:76
556+msgid "If you believe this letter violates our guidelines, please report it."
557+msgstr "If you believe this letter violates our guidelines, please report it."
558+559+#: letters/templates/letters/letter_detail.html:81
560+msgid "to report this letter"
561+msgstr "to report this letter"
562+563+#: letters/templates/letters/letter_detail.html:86
564+msgid "Back to all letters"
565+msgstr "Back to all letters"
566+567+#: letters/templates/letters/letter_form.html:4
568+#: letters/templates/letters/representative_detail.html:143
569+msgid "Write a Letter"
570+msgstr "Write a Letter"
571+572+#: letters/templates/letters/letter_form.html:10
573+msgid "Write an Open Letter"
574+msgstr "Write an Open Letter"
575+576+#: letters/templates/letters/letter_form.html:12
577+msgid ""
578+"Write an open letter to a political representative. Your letter will be "
579+"published publicly so others can read and sign it."
580+msgstr ""
581+"Write an open letter to a political representative. Your letter will be "
582+"published publicly so others can read and sign it."
583+584+#: letters/templates/letters/letter_form.html:16
585+msgid "Before you write"
586+msgstr "Before you write"
587+588+#: letters/templates/letters/letter_form.html:18
589+msgid "Be thoughtful but feel free to be critical."
590+msgstr "Be thoughtful but feel free to be critical."
591+592+#: letters/templates/letters/letter_form.html:19
593+msgid "Representatives are humans tooโstay respectful."
594+msgstr "Representatives are humans tooโstay respectful."
595+596+#: letters/templates/letters/letter_form.html:20
597+msgid "Keep your arguments clear and concise."
598+msgstr "Keep your arguments clear and concise."
599+600+#: letters/templates/letters/letter_form.html:21
601+msgid "No insults or hate speech."
602+msgstr "No insults or hate speech."
603+604+#: letters/templates/letters/letter_form.html:22
605+msgid "Stay within the bounds of the Grundgesetz when making demands."
606+msgstr "Stay within the bounds of the Grundgesetz when making demands."
607+608+#: letters/templates/letters/letter_form.html:30
609+msgid "Title:"
610+msgstr "Title:"
611+612+#: letters/templates/letters/letter_form.html:36
613+msgid ""
614+"Describe your concern in a sentence; we'll use it to suggest representatives."
615+msgstr ""
616+"Describe your concern in a sentence; we'll use it to suggest representatives."
617+618+#: letters/templates/letters/letter_form.html:41
619+msgid "To Representative:"
620+msgstr "To Representative:"
621+622+#: letters/templates/letters/letter_form.html:47
623+msgid ""
624+"Already know who to address? Pick them here. Otherwise, use the suggestions "
625+"below."
626+msgstr ""
627+"Already know who to address? Pick them here. Otherwise, use the suggestions "
628+"below."
629+630+#: letters/templates/letters/letter_form.html:53
631+msgid "Letter Body:"
632+msgstr "Letter Body:"
633+634+#: letters/templates/letters/letter_form.html:60
635+msgid "Publish Letter"
636+msgstr "Publish Letter"
637+638+#: letters/templates/letters/letter_form.html:67
639+msgid "Smart Suggestions"
640+msgstr "Smart Suggestions"
641+642+#: letters/templates/letters/letter_form.html:69
643+msgid ""
644+"Type your title and we'll use your verified profile to suggest "
645+"representatives, topics, and related letters."
646+msgstr ""
647+"Type your title and we'll use your verified profile to suggest "
648+"representatives, topics, and related letters."
649+650+#: letters/templates/letters/letter_form.html:81
651+msgid "Loading..."
652+msgstr "Loading..."
653+654+#: letters/templates/letters/letter_form.html:83
655+msgid "Analyzing your title..."
656+msgstr "Analyzing your title..."
657+658+#: letters/templates/letters/letter_list.html:4
659+msgid "Browse Letters"
660+msgstr "Browse Letters"
661+662+#: letters/templates/letters/letter_list.html:8
663+msgid "About This"
664+msgstr "About This"
665+666+#: letters/templates/letters/letter_list.html:9
667+msgid ""
668+"Make your voice heard, reach out to your representative, participate in "
669+"democracy."
670+msgstr ""
671+"Make your voice heard, reach out to your representative, participate in "
672+"democracy."
673+674+#: letters/templates/letters/letter_list.html:10
675+msgid "Open letters authored and signed by fellow citizens."
676+msgstr "Open letters authored and signed by fellow citizens."
677+678+#: letters/templates/letters/letter_list.html:11
679+msgid ""
680+"Physical letters mailed to representatives when number of verified "
681+"signatures > 100."
682+msgstr ""
683+"Physical letters mailed to representatives when number of verified "
684+"signatures > 100."
685+686+#: letters/templates/letters/letter_list.html:15
687+msgid "Browse Open Letters"
688+msgstr "Browse Open Letters"
689+690+#: letters/templates/letters/letter_list.html:25
691+msgid "Popular tags:"
692+msgstr "Popular tags:"
693+694+#: letters/templates/letters/letter_list.html:41
695+msgid "Previous"
696+msgstr "Previous"
697+698+#: letters/templates/letters/letter_list.html:43
699+#, python-format
700+msgid "Page %(page)s of %(total)s"
701+msgstr "Page %(page)s of %(total)s"
702+703+#: letters/templates/letters/letter_list.html:45
704+msgid "Next"
705+msgstr "Next"
706+707+#: letters/templates/letters/letter_list.html:51
708+msgid "No letters found."
709+msgstr "No letters found."
710+711+#: letters/templates/letters/letter_list.html:51
712+msgid "Be the first to write one!"
713+msgstr "Be the first to write one!"
714+715+#: letters/templates/letters/login.html:14
716+#: letters/templates/letters/register.html:15
717+msgid "Username:"
718+msgstr "Username:"
719+720+#: letters/templates/letters/login.html:22
721+#: letters/templates/letters/register.html:47
722+msgid "Password:"
723+msgstr "Password:"
724+725+#: letters/templates/letters/login.html:37
726+msgid "Forgot your password?"
727+msgstr "Forgot your password?"
728+729+#: letters/templates/letters/login.html:41
730+msgid "Don't have an account?"
731+msgstr "Don't have an account?"
732+733+#: letters/templates/letters/login.html:41
734+msgid "Register here"
735+msgstr "Register here"
736+737+#: letters/templates/letters/partials/letter_card.html:6
738+msgid "To"
739+msgstr "To"
740+741+#: letters/templates/letters/partials/letter_card.html:20
742+#, python-format
743+msgid "%(counter)s signature"
744+msgid_plural "%(counter)s signatures"
745+msgstr[0] "%(counter)s signature"
746+msgstr[1] "%(counter)s signatures"
747+748+#: letters/templates/letters/partials/letter_card.html:20
749+#, python-format
750+msgid "%(counter)s verified"
751+msgid_plural "%(counter)s verified"
752+msgstr[0] "%(counter)s verified"
753+msgstr[1] "%(counter)s verified"
754+755+#: letters/templates/letters/partials/representative_card.html:21
756+#: letters/templates/letters/partials/representative_card.html:23
757+msgid "Constituency"
758+msgstr "Constituency"
759+760+#: letters/templates/letters/partials/representative_card.html:27
761+msgid "Mandate"
762+msgstr "Mandate"
763+764+#: letters/templates/letters/partials/representative_card.html:34
765+msgid "Focus"
766+msgstr "Focus"
767+768+#: letters/templates/letters/partials/representative_card.html:34
769+msgid "self-declared"
770+msgstr "self-declared"
771+772+#: letters/templates/letters/partials/representative_card.html:45
773+msgid "Committees"
774+msgstr "Committees"
775+776+#: letters/templates/letters/partials/representative_card.html:57
777+msgid "Email"
778+msgstr "Email"
779+780+#: letters/templates/letters/partials/representative_card.html:60
781+msgid "Website"
782+msgstr "Website"
783+784+#: letters/templates/letters/partials/representative_card.html:66
785+msgid "View profile"
786+msgstr "View profile"
787+788+#: letters/templates/letters/partials/suggestions.html:10
789+msgid ""
790+"We couldn't match you to a constituency yet. Update your profile "
791+"verification to see local representatives."
792+msgstr ""
793+"We couldn't match you to a constituency yet. Update your profile "
794+"verification to see local representatives."
795+796+#: letters/templates/letters/partials/suggestions.html:16
797+msgid "Our Interpretation"
798+msgstr "Our Interpretation"
799+800+#: letters/templates/letters/partials/suggestions.html:21
801+msgid "Topic:"
802+msgstr "Topic:"
803+804+#: letters/templates/letters/partials/suggestions.html:28
805+msgid "No specific policy area detected. Try adding more keywords."
806+msgstr "No specific policy area detected. Try adding more keywords."
807+808+#: letters/templates/letters/partials/suggestions.html:37
809+msgid "Related Keywords"
810+msgstr "Related Keywords"
811+812+#: letters/templates/letters/partials/suggestions.html:51
813+msgid "Your Direct Representatives"
814+msgstr "Your Direct Representatives"
815+816+#: letters/templates/letters/partials/suggestions.html:56
817+msgid "These representatives directly represent your constituency:"
818+msgstr "These representatives directly represent your constituency:"
819+820+#: letters/templates/letters/partials/suggestions.html:67
821+#: letters/templates/letters/partials/suggestions.html:102
822+msgid "Select"
823+msgstr "Select"
824+825+#: letters/templates/letters/partials/suggestions.html:81
826+msgid "Topic Experts"
827+msgstr "Topic Experts"
828+829+#: letters/templates/letters/partials/suggestions.html:86
830+#, python-format
831+msgid ""
832+"These representatives are experts on \"%(topic)s\" based on their committee "
833+"memberships:"
834+msgstr ""
835+"These representatives are experts on \"%(topic)s\" based on their committee "
836+"memberships:"
837+838+#: letters/templates/letters/partials/suggestions.html:95
839+msgid "of"
840+msgstr "of"
841+842+#: letters/templates/letters/partials/suggestions.html:116
843+msgid "Suggested Representatives"
844+msgstr "Suggested Representatives"
845+846+#: letters/templates/letters/partials/suggestions.html:119
847+msgid ""
848+"No representatives found. Representatives may need to be synced for this "
849+"governmental level."
850+msgstr ""
851+"No representatives found. Representatives may need to be synced for this "
852+"governmental level."
853+854+#: letters/templates/letters/partials/suggestions.html:148
855+msgid "Selected:"
856+msgstr "Selected:"
857+858+#: letters/templates/letters/password_reset_complete.html:4
859+#: letters/templates/letters/password_reset_complete.html:8
860+msgid "Password updated"
861+msgstr "Password updated"
862+863+#: letters/templates/letters/password_reset_complete.html:9
864+msgid "You can now sign in using your new password."
865+msgstr "You can now sign in using your new password."
866+867+#: letters/templates/letters/password_reset_complete.html:10
868+msgid "Go to login"
869+msgstr "Go to login"
870+871+#: letters/templates/letters/password_reset_confirm.html:4
872+#: letters/templates/letters/password_reset_confirm.html:9
873+msgid "Choose a new password"
874+msgstr "Choose a new password"
875+876+#: letters/templates/letters/password_reset_confirm.html:13
877+msgid "New password"
878+msgstr "New password"
879+880+#: letters/templates/letters/password_reset_confirm.html:20
881+msgid "Confirm password"
882+msgstr "Confirm password"
883+884+#: letters/templates/letters/password_reset_confirm.html:26
885+msgid "Update password"
886+msgstr "Update password"
887+888+#: letters/templates/letters/password_reset_confirm.html:29
889+msgid "Reset link invalid"
890+msgstr "Reset link invalid"
891+892+#: letters/templates/letters/password_reset_confirm.html:30
893+msgid "This password reset link is no longer valid. Please request a new one."
894+msgstr "This password reset link is no longer valid. Please request a new one."
895+896+#: letters/templates/letters/password_reset_confirm.html:31
897+msgid "Request new link"
898+msgstr "Request new link"
899+900+#: letters/templates/letters/password_reset_done.html:4
901+msgid "Reset email sent"
902+msgstr "Reset email sent"
903+904+#: letters/templates/letters/password_reset_done.html:9
905+msgid ""
906+"If an account exists for that email address, we just sent you instructions "
907+"to choose a new password."
908+msgstr ""
909+"If an account exists for that email address, we just sent you instructions "
910+"to choose a new password."
911+912+#: letters/templates/letters/password_reset_done.html:10
913+msgid "The link will stay valid for a limited time."
914+msgstr "The link will stay valid for a limited time."
915+916+#: letters/templates/letters/password_reset_done.html:11
917+msgid "Back to login"
918+msgstr "Back to login"
919+920+#: letters/templates/letters/password_reset_form.html:4
921+msgid "Reset password"
922+msgstr "Reset password"
923+924+#: letters/templates/letters/password_reset_form.html:8
925+msgid "Reset your password"
926+msgstr "Reset your password"
927+928+#: letters/templates/letters/password_reset_form.html:9
929+msgid ""
930+"Enter the email address you used during registration. We will send you a "
931+"link to create a new password."
932+msgstr ""
933+"Enter the email address you used during registration. We will send you a "
934+"link to create a new password."
935+936+#: letters/templates/letters/password_reset_form.html:17
937+msgid "Send reset link"
938+msgstr "Send reset link"
939+940+#: letters/templates/letters/profile.html:13
941+#, python-format
942+msgid "%(username)s's Profile"
943+msgstr "%(username)s's Profile"
944+945+#: letters/templates/letters/profile.html:16
946+msgid "Identity & Constituency"
947+msgstr "Identity & Constituency"
948+949+#: letters/templates/letters/profile.html:19
950+msgid "Status:"
951+msgstr "Status:"
952+953+#: letters/templates/letters/profile.html:21
954+msgid "Type:"
955+msgstr "Type:"
956+957+#: letters/templates/letters/profile.html:28
958+msgid ""
959+"You self-declared your constituency. Representatives will see your "
960+"signatures as self-declared constituents."
961+msgstr ""
962+"You self-declared your constituency. Representatives will see your "
963+"signatures as self-declared constituents."
964+965+#: letters/templates/letters/profile.html:30
966+msgid "Start third-party verification"
967+msgstr "Start third-party verification"
968+969+#: letters/templates/letters/profile.html:33
970+msgid ""
971+"Your identity was verified via a third-party provider. Signatures will "
972+"appear as verified constituents."
973+msgstr ""
974+"Your identity was verified via a third-party provider. Signatures will "
975+"appear as verified constituents."
976+977+#: letters/templates/letters/profile.html:38
978+msgid "Your verification is being processed."
979+msgstr "Your verification is being processed."
980+981+#: letters/templates/letters/profile.html:39
982+msgid "Complete Verification (Stub)"
983+msgstr "Complete Verification (Stub)"
984+985+#: letters/templates/letters/profile.html:43
986+msgid "Verification failed. Please try again or contact support."
987+msgstr "Verification failed. Please try again or contact support."
988+989+#: letters/templates/letters/profile.html:48
990+msgid ""
991+"You can self-declare your constituency below or start a verification with a "
992+"trusted provider. Verified signatures carry more weight."
993+msgstr ""
994+"You can self-declare your constituency below or start a verification with a "
995+"trusted provider. Verified signatures carry more weight."
996+997+#: letters/templates/letters/profile.html:50
998+msgid "Start Third-party Verification"
999+msgstr "Start Third-party Verification"
1000+1001+#: letters/templates/letters/profile.html:55
1002+msgid "Ihre Adresse"
1003+msgstr "Ihre Adresse"
1004+1005+#: letters/templates/letters/profile.html:57
1006+msgid ""
1007+"Geben Sie Ihre vollstรคndige Adresse ein, um prรคzise Wahlkreis- und "
1008+"Abgeordnetenempfehlungen zu erhalten."
1009+msgstr ""
1010+"Geben Sie Ihre vollstรคndige Adresse ein, um prรคzise Wahlkreis- und "
1011+"Abgeordnetenempfehlungen zu erhalten."
1012+1013+#: letters/templates/letters/profile.html:61
1014+msgid "Gespeicherte Adresse:"
1015+msgstr "Gespeicherte Adresse:"
1016+1017+#: letters/templates/letters/profile.html:83
1018+msgid "Adresse speichern"
1019+msgstr "Adresse speichern"
1020+1021+#: letters/templates/letters/profile.html:88
1022+msgid "Self-declare your constituency"
1023+msgstr "Self-declare your constituency"
1024+1025+#: letters/templates/letters/profile.html:90
1026+msgid ""
1027+"Select the constituencies you live in so we can prioritise the right "
1028+"representatives."
1029+msgstr ""
1030+"Select the constituencies you live in so we can prioritise the right "
1031+"representatives."
1032+1033+#: letters/templates/letters/profile.html:109
1034+msgid "Save constituencies"
1035+msgstr "Save constituencies"
1036+1037+#: letters/templates/letters/profile.html:114
1038+msgid "Your Letters"
1039+msgstr "Your Letters"
1040+1041+#: letters/templates/letters/profile.html:120
1042+msgid "You haven't written any letters yet."
1043+msgstr "You haven't written any letters yet."
1044+1045+#: letters/templates/letters/profile.html:120
1046+msgid "Write one now!"
1047+msgstr "Write one now!"
1048+1049+#: letters/templates/letters/profile.html:125
1050+msgid "Letters You've Signed"
1051+msgstr "Letters You've Signed"
1052+1053+#: letters/templates/letters/profile.html:133
1054+msgid "You haven't signed any letters yet."
1055+msgstr "You haven't signed any letters yet."
1056+1057+#: letters/templates/letters/profile.html:133
1058+msgid "Browse letters"
1059+msgstr "Browse letters"
1060+1061+#: letters/templates/letters/profile.html:138
1062+msgid "Account"
1063+msgstr "Account"
1064+1065+#: letters/templates/letters/profile.html:140
1066+msgid ""
1067+"Need a fresh start? You can delete your account at any time. Your letters "
1068+"stay visible but without your name."
1069+msgstr ""
1070+"Need a fresh start? You can delete your account at any time. Your letters "
1071+"stay visible but without your name."
1072+1073+#: letters/templates/letters/register.html:9
1074+msgid ""
1075+"After registration we'll send you an email to confirm your address before "
1076+"you can sign in."
1077+msgstr ""
1078+"After registration we'll send you an email to confirm your address before "
1079+"you can sign in."
1080+1081+#: letters/templates/letters/register.html:23
1082+msgid "Email:"
1083+msgstr "Email:"
1084+1085+#: letters/templates/letters/register.html:31
1086+msgid "First Name (optional):"
1087+msgstr "First Name (optional):"
1088+1089+#: letters/templates/letters/register.html:39
1090+msgid "Last Name (optional):"
1091+msgstr "Last Name (optional):"
1092+1093+#: letters/templates/letters/register.html:55
1094+msgid "Confirm Password:"
1095+msgstr "Confirm Password:"
1096+1097+#: letters/templates/letters/register.html:70
1098+msgid "Already have an account?"
1099+msgstr "Already have an account?"
1100+1101+#: letters/templates/letters/register.html:70
1102+msgid "Login here"
1103+msgstr "Login here"
1104+1105+#: letters/templates/letters/representative_detail.html:19
1106+msgid "รber"
1107+msgstr "รber"
1108+1109+#: letters/templates/letters/representative_detail.html:30
1110+msgid "Committee Memberships"
1111+msgstr "Committee Memberships"
1112+1113+#: letters/templates/letters/representative_detail.html:75
1114+msgid "Open Letters"
1115+msgstr "Open Letters"
1116+1117+#: letters/templates/letters/representative_detail.html:83
1118+msgid "No letters have been written to this representative yet."
1119+msgstr "No letters have been written to this representative yet."
1120+1121+#: letters/templates/letters/representative_detail.html:85
1122+msgid "Write the First Letter"
1123+msgstr "Write the First Letter"
1124+1125+#: letters/templates/letters/representative_detail.html:95
1126+msgid "External Resources"
1127+msgstr "External Resources"
1128+1129+#: letters/templates/letters/representative_detail.html:100
1130+msgid "Abgeordnetenwatch Profile"
1131+msgstr "Abgeordnetenwatch Profile"
1132+1133+#: letters/templates/letters/representative_detail.html:102
1134+msgid ""
1135+"View voting record, questions, and detailed profile on Abgeordnetenwatch.de"
1136+msgstr ""
1137+"View voting record, questions, and detailed profile on Abgeordnetenwatch.de"
1138+1139+#: letters/templates/letters/representative_detail.html:112
1140+msgid "Wikipedia Article"
1141+msgstr "Wikipedia Article"
1142+1143+#: letters/templates/letters/representative_detail.html:114
1144+msgid "Read more about this representative on Wikipedia"
1145+msgstr "Read more about this representative on Wikipedia"
1146+1147+#: letters/templates/letters/representative_detail.html:117
1148+msgid "View on Wikipedia"
1149+msgstr "View on Wikipedia"
1150+1151+#: letters/templates/letters/representative_detail.html:123
1152+msgid "No external resources available for this representative."
1153+msgstr "No external resources available for this representative."
1154+1155+#: letters/templates/letters/representative_detail.html:130
1156+msgid "Kontakt"
1157+msgstr "Kontakt"
1158+1159+#: letters/templates/letters/representative_detail.html:145
1160+#, python-format
1161+msgid "Start a new open letter to %(name)s"
1162+msgstr "Start a new open letter to %(name)s"
1163+1164+#: letters/templates/letters/representative_detail.html:153
1165+msgid "Login to Write Letter"
1166+msgstr "Login to Write Letter"
1167+1168+#: letters/views.py:52
1169+msgid "Confirm your WriteThem.eu account"
1170+msgstr "Confirm your WriteThem.eu account"
1171+1172+#: letters/views.py:184
1173+msgid "Your letter has been published and your signature has been added!"
1174+msgstr "Your letter has been published and your signature has been added!"
1175+1176+#: letters/views.py:197
1177+msgid "You have already signed this letter."
1178+msgstr "You have already signed this letter."
1179+1180+#: letters/views.py:207
1181+msgid "Your signature has been added!"
1182+msgstr "Your signature has been added!"
1183+1184+#: letters/views.py:225
1185+msgid "Thank you for your report. Our team will review it."
1186+msgstr "Thank you for your report. Our team will review it."
1187+1188+#: letters/views.py:259
1189+msgid ""
1190+"Please confirm your email address. We sent you a link to activate your "
1191+"account."
1192+msgstr ""
1193+"Please confirm your email address. We sent you a link to activate your "
1194+"account."
1195+1196+#: letters/views.py:289
1197+msgid "Your account has been activated. You can now log in."
1198+msgstr "Your account has been activated. You can now log in."
1199+1200+#: letters/views.py:292
1201+msgid "Your account is already active."
1202+msgstr "Your account is already active."
1203+1204+#: letters/views.py:347
1205+msgid "Ihre Adresse wurde gespeichert."
1206+msgstr "Ihre Adresse wurde gespeichert."
1207+1208+#: letters/views.py:363
1209+msgid "Your constituency information has been updated."
1210+msgstr "Your constituency information has been updated."
1211+1212+#: letters/views.py:391
1213+msgid ""
1214+"Your account has been deleted. Your published letters remain available to "
1215+"the public."
1216+msgstr ""
1217+"Your account has been deleted. Your published letters remain available to "
1218+"the public."