Units
Translation components API.
See the Weblate's Web API documentation for detailed description of the API.
GET /api/translations/documentation/developer-architecture/en_GB/units/?format=api
https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Project architecture" ], "previous_source": "", "target": [ "" ], "id_hash": 9058575281241197723, "content_hash": 9058575281241197723, "location": "../../developer_documentation/architecture.md:1", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 1, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 2, "source_unit": "https://translate.funkwhale.audio/api/units/372746/?format=api", "priority": 100, "id": 372887, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=fdb6863951840c9b", "url": "https://translate.funkwhale.audio/api/units/372887/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.562275Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale is made up of several components. Understanding these components and what they do is important when contributing to Funkwhale's codebase. In this article, we'll break down each part of Funkwhale's architecture to help you understand what each component does." ], "previous_source": "", "target": [ "" ], "id_hash": -4366815679088269388, "content_hash": -4366815679088269388, "location": "../../developer_documentation/architecture.md:3", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 2, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 40, "source_unit": "https://translate.funkwhale.audio/api/units/372748/?format=api", "priority": 100, "id": 372888, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=4365f446b85667b4", "url": "https://translate.funkwhale.audio/api/units/372888/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.563328Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Below is a diagram of Funkwhale's project setup." ], "previous_source": "", "target": [ "" ], "id_hash": -786957679890523460, "content_hash": -786957679890523460, "location": "../../developer_documentation/architecture.md:5", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 3, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 8, "source_unit": "https://translate.funkwhale.audio/api/units/372752/?format=api", "priority": 100, "id": 372889, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=75142a28dcdc1abc", "url": "https://translate.funkwhale.audio/api/units/372889/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.564123Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Select a link below to see information about each component." ], "previous_source": "", "target": [ "" ], "id_hash": -7792994935670003838, "content_hash": -7792994935670003838, "location": "../../developer_documentation/architecture.md:29", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 4, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 10, "source_unit": "https://translate.funkwhale.audio/api/units/372756/?format=api", "priority": 100, "id": 372890, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=13d9b86522f8a782", "url": "https://translate.funkwhale.audio/api/units/372890/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.564931Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Entrypoints" ], "previous_source": "", "target": [ "" ], "id_hash": -3083733017616802841, "content_hash": -3083733017616802841, "location": "../../developer_documentation/architecture.md:35", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 5, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 1, "source_unit": "https://translate.funkwhale.audio/api/units/372760/?format=api", "priority": 100, "id": 372891, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=55346128a6ce9be7", "url": "https://translate.funkwhale.audio/api/units/372891/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.565736Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Users can access Funkwhale using a variety of entrypoints. They can make use of a Funkwhale application, a Subsonic-compatible application, or by calling the API directly. Each entrypoint interacts with the Funkwhale backend in the same way." ], "previous_source": "", "target": [ "" ], "id_hash": 3956485180186554477, "content_hash": 3956485180186554477, "location": "../../developer_documentation/architecture.md:37", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 6, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 37, "source_unit": "https://translate.funkwhale.audio/api/units/372764/?format=api", "priority": 100, "id": 372892, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=b6e8424f1c1df06d", "url": "https://translate.funkwhale.audio/api/units/372892/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.566555Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale web app" ], "previous_source": "", "target": [ "" ], "id_hash": -6341551261603375256, "content_hash": -6341551261603375256, "location": "../../developer_documentation/architecture.md:39", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 7, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 3, "source_unit": "https://translate.funkwhale.audio/api/units/372769/?format=api", "priority": 100, "id": 372893, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=27fe48b9ff335768", "url": "https://translate.funkwhale.audio/api/units/372893/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.567396Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "The Funkwhale web app is a {abbr}`SPA (Single Page Application)` written in [Vue.js](https://vuejs.org) and [Typescript](https://typescriptlang.org). This is the application most people associate with Funkwhale. Server admins usually run an instance of the web app alongside their Funkwhale {term}`pod`, but you can also connect a standalone web app to another pod." ], "previous_source": "", "target": [ "" ], "id_hash": -5239898872774402856, "content_hash": -5239898872774402856, "location": "../../developer_documentation/architecture.md:41", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 8, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 50, "source_unit": "https://translate.funkwhale.audio/api/units/372773/?format=api", "priority": 100, "id": 372895, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=374823bcc54fdcd8", "url": "https://translate.funkwhale.audio/api/units/372895/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.568173Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "The Funkwhale web app interacts with the Funkwhale API to fetch and update data. Using a service worker, the web app caches important information for offline use." ], "previous_source": "", "target": [ "" ], "id_hash": 5615768252335002, "content_hash": 5615768252335002, "location": "../../developer_documentation/architecture.md:43", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 9, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 27, "source_unit": "https://translate.funkwhale.audio/api/units/372777/?format=api", "priority": 100, "id": 372898, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=8013f382efd2439a", "url": "https://translate.funkwhale.audio/api/units/372898/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.568988Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale for Android" ], "previous_source": "", "target": [ "" ], "id_hash": -34967440246001958, "content_hash": -34967440246001958, "location": "../../developer_documentation/architecture.md:45", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 10, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 3, "source_unit": "https://translate.funkwhale.audio/api/units/372779/?format=api", "priority": 100, "id": 372904, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=7f83c54c616eaeda", "url": "https://translate.funkwhale.audio/api/units/372904/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.572397Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale for Android is the Funkwhale collective's official Android app written in [Kotlin](https://kotlinlang.org/). It interacts with the Funkwhale API to fetch and update data and stores information for offline playback." ], "previous_source": "", "target": [ "" ], "id_hash": 7207162699831573027, "content_hash": 7207162699831573027, "location": "../../developer_documentation/architecture.md:47", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 11, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 30, "source_unit": "https://translate.funkwhale.audio/api/units/372782/?format=api", "priority": 100, "id": 372907, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=e404fc4a51e7fa23", "url": "https://translate.funkwhale.audio/api/units/372907/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.573460Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Subsonic app" ], "previous_source": "", "target": [ "" ], "id_hash": 3825452207477468939, "content_hash": 3825452207477468939, "location": "../../developer_documentation/architecture.md:49", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 12, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 2, "source_unit": "https://translate.funkwhale.audio/api/units/372784/?format=api", "priority": 100, "id": 372913, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=b516bc83bbedaf0b", "url": "https://translate.funkwhale.audio/api/units/372913/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.574582Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale supports a limited subset of the [Subsonic API](http://www.subsonic.org/pages/api.jsp) to support existing Subsonic apps. These apps can request data stored on a Funkwhale server by calling these endpoints." ], "previous_source": "", "target": [ "" ], "id_hash": -7619597894564116065, "content_hash": -7619597894564116065, "location": "../../developer_documentation/architecture.md:51", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 13, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 28, "source_unit": "https://translate.funkwhale.audio/api/units/372786/?format=api", "priority": 100, "id": 372917, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=1641c015d331099f", "url": "https://translate.funkwhale.audio/api/units/372917/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.575648Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Nginx/Apache reverse proxy" ], "previous_source": "", "target": [ "" ], "id_hash": 5715641236079520574, "content_hash": 5715641236079520574, "location": "../../developer_documentation/architecture.md:53", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 14, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 3, "source_unit": "https://translate.funkwhale.audio/api/units/372788/?format=api", "priority": 100, "id": 372921, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=cf52096be4182b3e", "url": "https://translate.funkwhale.audio/api/units/372921/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.576734Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "The reverse proxy acts as a layer between a Funkwhale pod and the open internet. It enhances the pod's security and provides additional options to help increase performance." ], "previous_source": "", "target": [ "" ], "id_hash": -2300292846662773804, "content_hash": -2300292846662773804, "location": "../../developer_documentation/architecture.md:55", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 15, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 28, "source_unit": "https://translate.funkwhale.audio/api/units/372790/?format=api", "priority": 100, "id": 372924, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=6013b7d7eb4b13d4", "url": "https://translate.funkwhale.audio/api/units/372924/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.577783Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "When a user tries to communicate with a Funkwhale pod, the reverse proxy:" ], "previous_source": "", "target": [ "" ], "id_hash": -3941850313406551024, "content_hash": -3941850313406551024, "location": "../../developer_documentation/architecture.md:57", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 16, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 13, "source_unit": "https://translate.funkwhale.audio/api/units/372792/?format=api", "priority": 100, "id": 372927, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=494bbc0657a3ec10", "url": "https://translate.funkwhale.audio/api/units/372927/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.578880Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Handles the HTTP/HTTPS requests and proxies them to the Funkwhale API server" ], "previous_source": "", "target": [ "" ], "id_hash": -7885371614292459262, "content_hash": -7885371614292459262, "location": "../../developer_documentation/architecture.md:59", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 17, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 12, "source_unit": "https://translate.funkwhale.audio/api/units/372794/?format=api", "priority": 100, "id": 372930, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=1291884b98264102", "url": "https://translate.funkwhale.audio/api/units/372930/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.579979Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Serves requested static files, such as audio files and stylesheets" ], "previous_source": "", "target": [ "" ], "id_hash": -3711030035443864690, "content_hash": -3711030035443864690, "location": "../../developer_documentation/architecture.md:60", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 18, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 10, "source_unit": "https://translate.funkwhale.audio/api/units/372796/?format=api", "priority": 100, "id": 372932, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=4c7fc5d83a902b8e", "url": "https://translate.funkwhale.audio/api/units/372932/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.581044Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Backend" ], "previous_source": "", "target": [ "" ], "id_hash": -3629367083509855576, "content_hash": -3629367083509855576, "location": "../../developer_documentation/architecture.md:62", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 19, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 1, "source_unit": "https://translate.funkwhale.audio/api/units/372798/?format=api", "priority": 100, "id": 372934, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=4da1e5dde3e64aa8", "url": "https://translate.funkwhale.audio/api/units/372934/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.582143Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "The Funkwhale backend is made up of a few components which are responsible for:" ], "previous_source": "", "target": [ "" ], "id_hash": 7095296660888690915, "content_hash": 7095296660888690915, "location": "../../developer_documentation/architecture.md:64", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 20, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 14, "source_unit": "https://translate.funkwhale.audio/api/units/372800/?format=api", "priority": 100, "id": 372936, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=e2778eb8784920e3", "url": "https://translate.funkwhale.audio/api/units/372936/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.583168Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Communicating with the user's entrypoint and actioning requests" ], "previous_source": "", "target": [ "" ], "id_hash": 8909966439284496774, "content_hash": 8909966439284496774, "location": "../../developer_documentation/architecture.md:66", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 21, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 8, "source_unit": "https://translate.funkwhale.audio/api/units/372802/?format=api", "priority": 100, "id": 372938, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=fba68f44fe345986", "url": "https://translate.funkwhale.audio/api/units/372938/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.584173Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Maintaining data consistency" ], "previous_source": "", "target": [ "" ], "id_hash": -3213835878152464801, "content_hash": -3213835878152464801, "location": "../../developer_documentation/architecture.md:67", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 22, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 3, "source_unit": "https://translate.funkwhale.audio/api/units/372804/?format=api", "priority": 100, "id": 372940, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=5366294be451165f", "url": "https://translate.funkwhale.audio/api/units/372940/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.584939Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Communicating with other Funkwhale pods (if federation is enabled)" ], "previous_source": "", "target": [ "" ], "id_hash": -8333181357862520526, "content_hash": -8333181357862520526, "location": "../../developer_documentation/architecture.md:68", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 23, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 9, "source_unit": "https://translate.funkwhale.audio/api/units/372807/?format=api", "priority": 100, "id": 372942, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=0c5a97b4c3b27932", "url": "https://translate.funkwhale.audio/api/units/372942/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.585688Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Django API server" ], "previous_source": "", "target": [ "" ], "id_hash": 1466814829890135649, "content_hash": 1466814829890135649, "location": "../../developer_documentation/architecture.md:70", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 24, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 3, "source_unit": "https://translate.funkwhale.audio/api/units/372809/?format=api", "priority": 100, "id": 372944, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=945b2c50f6e06661", "url": "https://translate.funkwhale.audio/api/units/372944/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.586465Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "The Funkwhale API is a [REST API](https://developer.mozilla.org/en-US/docs/Glossary/REST) written in [Python](https://www.python.org/) using the [Django REST framework](https://www.django-rest-framework.org/). It is the central piece of the project and houses the application's logic." ], "previous_source": "", "target": [ "" ], "id_hash": 5584947622217829205, "content_hash": 5584947622217829205, "location": "../../developer_documentation/architecture.md:72", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 25, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 28, "source_unit": "https://translate.funkwhale.audio/api/units/372811/?format=api", "priority": 100, "id": 372946, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=cd81b845a774cb55", "url": "https://translate.funkwhale.audio/api/units/372946/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.587211Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "The Funkwhale API is responsible for:" ], "previous_source": "", "target": [ "" ], "id_hash": 1570446272070562140, "content_hash": 1570446272070562140, "location": "../../developer_documentation/architecture.md:74", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 26, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 6, "source_unit": "https://translate.funkwhale.audio/api/units/372821/?format=api", "priority": 100, "id": 372948, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=95cb5890599a315c", "url": "https://translate.funkwhale.audio/api/units/372948/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.588008Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Fetching requested data from the cache/database and returning it to the requester in a meaningful way" ], "previous_source": "", "target": [ "" ], "id_hash": -7836351000383268093, "content_hash": -7836351000383268093, "location": "../../developer_documentation/architecture.md:76", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 27, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 16, "source_unit": "https://translate.funkwhale.audio/api/units/372825/?format=api", "priority": 100, "id": 372950, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=133fb048aee0db03", "url": "https://translate.funkwhale.audio/api/units/372950/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.588745Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Processing incoming data and writing it to the database in a meaningful way" ], "previous_source": "", "target": [ "" ], "id_hash": 8536989128305438304, "content_hash": 8536989128305438304, "location": "../../developer_documentation/architecture.md:77", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 28, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 13, "source_unit": "https://translate.funkwhale.audio/api/units/372827/?format=api", "priority": 100, "id": 372952, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=f6797a619c046e60", "url": "https://translate.funkwhale.audio/api/units/372952/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.589495Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Delegating long-running tasks to workers to reduce load" ], "previous_source": "", "target": [ "" ], "id_hash": 2562115255376384713, "content_hash": 2562115255376384713, "location": "../../developer_documentation/architecture.md:78", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 29, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 8, "source_unit": "https://translate.funkwhale.audio/api/units/372829/?format=api", "priority": 100, "id": 372954, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=a38e7640065192c9", "url": "https://translate.funkwhale.audio/api/units/372954/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.590232Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "PostgreSQL database" ], "previous_source": "", "target": [ "" ], "id_hash": 4299928399852199991, "content_hash": 4299928399852199991, "location": "../../developer_documentation/architecture.md:80", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 30, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 2, "source_unit": "https://translate.funkwhale.audio/api/units/372831/?format=api", "priority": 100, "id": 372956, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=bbac6a1900cde037", "url": "https://translate.funkwhale.audio/api/units/372956/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.591054Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale uses a [PostgreSQL database](https://www.postgresql.org/) to store data. All information that is served by and sent to the Funkwhale API is stored in this database." ], "previous_source": "", "target": [ "" ], "id_hash": -902085482501743383, "content_hash": -902085482501743383, "location": "../../developer_documentation/architecture.md:82", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 31, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 25, "source_unit": "https://translate.funkwhale.audio/api/units/372833/?format=api", "priority": 100, "id": 372958, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=737b26087a725ce9", "url": "https://translate.funkwhale.audio/api/units/372958/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.591794Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "The Funkwhale database makes heavy use of [indexes](https://www.postgresql.org/docs/current/indexes.html) for enhanced performance." ], "previous_source": "", "target": [ "" ], "id_hash": -4827488238868443162, "content_hash": -4827488238868443162, "location": "../../developer_documentation/architecture.md:84", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 32, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 11, "source_unit": "https://translate.funkwhale.audio/api/units/372835/?format=api", "priority": 100, "id": 372960, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=3d0151061cdecfe6", "url": "https://translate.funkwhale.audio/api/units/372960/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.592555Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Redis cache and message queue" ], "previous_source": "", "target": [ "" ], "id_hash": -5896297132677406536, "content_hash": -5896297132677406536, "location": "../../developer_documentation/architecture.md:86", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 33, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 5, "source_unit": "https://translate.funkwhale.audio/api/units/372837/?format=api", "priority": 100, "id": 372962, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=2e2c24ff6c9be0b8", "url": "https://translate.funkwhale.audio/api/units/372962/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.593306Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale uses [Redis](https://redis.io/) to cache information from the database and to store a queue of messages to send. We use this cache to avoid locking database resources and to speed up requests." ], "previous_source": "", "target": [ "" ], "id_hash": -7065883611738233641, "content_hash": -7065883611738233641, "location": "../../developer_documentation/architecture.md:88", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 34, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 32, "source_unit": "https://translate.funkwhale.audio/api/units/372839/?format=api", "priority": 100, "id": 372964, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=1df0f04ab216a4d7", "url": "https://translate.funkwhale.audio/api/units/372964/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.594040Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Celery worker" ], "previous_source": "", "target": [ "" ], "id_hash": 8671052587644678337, "content_hash": 8671052587644678337, "location": "../../developer_documentation/architecture.md:90", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 35, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 2, "source_unit": "https://translate.funkwhale.audio/api/units/372841/?format=api", "priority": 100, "id": 372966, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=f855c463234af0c1", "url": "https://translate.funkwhale.audio/api/units/372966/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.594864Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Funkwhale has to handle a lot of tasks that take longer than the average HTTP request/response cycle. To ensure these tasks complete and don't impact the API's performance, they are offloaded to a [Celery](https://docs.celeryq.dev/en/stable/userguide/workers.html) task worker. The worker then works through all the tasks in its queue while the API handles real-time responses." ], "previous_source": "", "target": [ "" ], "id_hash": -2354775990916530024, "content_hash": -2354775990916530024, "location": "../../developer_documentation/architecture.md:92", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 36, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 53, "source_unit": "https://translate.funkwhale.audio/api/units/372843/?format=api", "priority": 100, "id": 372968, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=5f5227b65fcd4098", "url": "https://translate.funkwhale.audio/api/units/372968/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.595604Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Some common tasks the Celery worker handles are:" ], "previous_source": "", "target": [ "" ], "id_hash": -6813416482567844659, "content_hash": -6813416482567844659, "location": "../../developer_documentation/architecture.md:94", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 37, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 8, "source_unit": "https://translate.funkwhale.audio/api/units/372847/?format=api", "priority": 100, "id": 372970, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=2171e1cee1c08ccd", "url": "https://translate.funkwhale.audio/api/units/372970/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.596386Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Importing uploaded music to the database" ], "previous_source": "", "target": [ "" ], "id_hash": 5606028419656629557, "content_hash": 5606028419656629557, "location": "../../developer_documentation/architecture.md:96", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 38, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 6, "source_unit": "https://translate.funkwhale.audio/api/units/372856/?format=api", "priority": 100, "id": 372972, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=cdcc9d254a60bd35", "url": "https://translate.funkwhale.audio/api/units/372972/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.597112Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Handling [ActivityPub](https://www.w3.org/TR/activitypub/) messages from other {term}`Fediverse` servers" ], "previous_source": "", "target": [ "" ], "id_hash": 9002622885099556934, "content_hash": 9002622885099556934, "location": "../../developer_documentation/architecture.md:97", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 39, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 7, "source_unit": "https://translate.funkwhale.audio/api/units/372858/?format=api", "priority": 100, "id": 372974, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=fcefbdd0e9295046", "url": "https://translate.funkwhale.audio/api/units/372974/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.597855Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Scanning new content on remote pods" ], "previous_source": "", "target": [ "" ], "id_hash": -2720962179469472400, "content_hash": -2720962179469472400, "location": "../../developer_documentation/architecture.md:98", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 40, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 6, "source_unit": "https://translate.funkwhale.audio/api/units/372860/?format=api", "priority": 100, "id": 372976, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=5a3d335065730d70", "url": "https://translate.funkwhale.audio/api/units/372976/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.598619Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Celery beat task scheduler" ], "previous_source": "", "target": [ "" ], "id_hash": -189417895420337106, "content_hash": -189417895420337106, "location": "../../developer_documentation/architecture.md:100", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 41, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 4, "source_unit": "https://translate.funkwhale.audio/api/units/372862/?format=api", "priority": 100, "id": 372978, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=7d5f0d6d7d5e642e", "url": "https://translate.funkwhale.audio/api/units/372978/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.599342Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "In addition to handling tasks from the API, the Celery worker also needs to handle some recurring tasks. To manage these, we implement a [Celery beat](https://docs.celeryq.dev/en/stable/reference/celery.apps.beat.html#celery.apps.beat.Beat) scheduler. The scheduler is responsible for triggering tasks on a schedule and adding messages to the [queue](#redis-cache-and-message-queue) so the worker can work through them." ], "previous_source": "", "target": [ "" ], "id_hash": -6577433357293560664, "content_hash": -6577433357293560664, "location": "../../developer_documentation/architecture.md:102", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 42, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 50, "source_unit": "https://translate.funkwhale.audio/api/units/372864/?format=api", "priority": 100, "id": 372980, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=24b84335d4b65ca8", "url": "https://translate.funkwhale.audio/api/units/372980/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.600079Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Some common recurring tasks are:" ], "previous_source": "", "target": [ "" ], "id_hash": 3859770201619268123, "content_hash": 3859770201619268123, "location": "../../developer_documentation/architecture.md:104", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 43, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 5, "source_unit": "https://translate.funkwhale.audio/api/units/372866/?format=api", "priority": 100, "id": 372982, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=b590a88c6627821b", "url": "https://translate.funkwhale.audio/api/units/372982/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.600883Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Clearing the cache" ], "previous_source": "", "target": [ "" ], "id_hash": -6872401245818784319, "content_hash": -6872401245818784319, "location": "../../developer_documentation/architecture.md:106", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 44, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 3, "source_unit": "https://translate.funkwhale.audio/api/units/372868/?format=api", "priority": 100, "id": 372984, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=20a0537a7d04f5c1", "url": "https://translate.funkwhale.audio/api/units/372984/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.601611Z" }, { "translation": "https://translate.funkwhale.audio/api/translations/documentation/developer-architecture/en_GB/?format=api", "source": [ "Refreshing content metadata" ], "previous_source": "", "target": [ "" ], "id_hash": -5223748200811071863, "content_hash": -5223748200811071863, "location": "../../developer_documentation/architecture.md:107", "context": "", "note": "", "flags": "", "labels": [], "state": 0, "fuzzy": false, "translated": false, "approved": false, "position": 45, "has_suggestion": false, "has_comment": false, "has_failing_check": false, "num_words": 3, "source_unit": "https://translate.funkwhale.audio/api/units/372869/?format=api", "priority": 100, "id": 372986, "web_url": "https://translate.funkwhale.audio/translate/documentation/developer-architecture/en_GB/?checksum=378184b01e91f689", "url": "https://translate.funkwhale.audio/api/units/372986/?format=api", "explanation": "", "extra_flags": "", "pending": false, "timestamp": "2023-03-25T08:06:52.602350Z" } ] }{ "count": 45, "next": null, "previous": null, "results": [ { "translation": "