mirror of
https://github.com/spiral-project/ihatemoney.git
synced 2025-05-11 23:21:48 +02:00
Compare commits
154 commits
7ba6e81344
...
cff8d8335e
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cff8d8335e | ||
![]() |
cf77b4c346 | ||
![]() |
6582e2c0c3 | ||
![]() |
6e0a3689b8 | ||
![]() |
710aee9711 | ||
![]() |
eb6e156c32 | ||
![]() |
9ef46e2c5d | ||
4e7496e49d | |||
e5dfbf2f37 | |||
![]() |
3ac1bb8afe | ||
![]() |
a5f83de5ce | ||
![]() |
050de4e8f6 | ||
![]() |
f9a96b0e0d | ||
![]() |
a74cd97286 | ||
![]() |
a3009126dc | ||
![]() |
eef67cf84c | ||
![]() |
a3d4e4250d | ||
![]() |
ae1cc309d7 | ||
![]() |
510c8db07f | ||
![]() |
843f2df877 | ||
![]() |
178fc94cef | ||
![]() |
312dfef14b | ||
![]() |
a0409a296a | ||
![]() |
73f014e90e | ||
![]() |
4af4c10b1f | ||
![]() |
c399611660 | ||
![]() |
f090d81358 | ||
![]() |
d00f8063ed | ||
![]() |
720f0e52dd | ||
![]() |
ba117ba0a6 | ||
2bb535070a | |||
![]() |
1dcb0ba78b | ||
![]() |
fa4a881ae1 | ||
![]() |
edefb51cfb | ||
![]() |
9f7ecf6614 | ||
![]() |
7fd00344e2 | ||
![]() |
6ec3ba6f77 | ||
![]() |
511ba86c4c | ||
![]() |
54a5b0e63e | ||
![]() |
2ce1ea4bf2 | ||
![]() |
8bce025c15 | ||
![]() |
bb30813ec4 | ||
![]() |
ecf9a7b590 | ||
![]() |
b74ac1077c | ||
![]() |
76e8b3baf0 | ||
![]() |
8cd60c1bf5 | ||
![]() |
2d7c6486e9 | ||
![]() |
db7c9ea2b3 | ||
![]() |
d1382a691b | ||
![]() |
d02ec152f7 | ||
aab32a2c3b | |||
e507b44ee9 | |||
7c7efcc24c | |||
![]() |
ee7289f5d2 | ||
![]() |
c9a709953f | ||
![]() |
eb7338c76c | ||
![]() |
e360ee7dfb | ||
![]() |
c74935c03c | ||
![]() |
38f3dd0d56 | ||
![]() |
1a2fa0476b | ||
![]() |
c5c8dba631 | ||
![]() |
b92a36c049 | ||
![]() |
d4b178ed66 | ||
![]() |
3bcc9afb50 | ||
![]() |
cda60d1626 | ||
![]() |
6741d1056f | ||
![]() |
ff43a83262 | ||
![]() |
7412d67ed6 | ||
![]() |
c0f49cb124 | ||
![]() |
382780b05c | ||
![]() |
d393c39d42 | ||
![]() |
21408f8bc9 | ||
![]() |
2ce76158d2 | ||
![]() |
3681981a5c | ||
![]() |
438263826b | ||
![]() |
f70ad5367b | ||
![]() |
a642a17e40 | ||
![]() |
a27f678428 | ||
![]() |
3464c2cf33 | ||
![]() |
fcdc057dba | ||
![]() |
04c375e2e7 | ||
![]() |
a169b89563 | ||
![]() |
15c43f496e | ||
![]() |
857ca2d5b0 | ||
![]() |
0187932365 | ||
![]() |
11ec51d36b | ||
![]() |
d886218457 | ||
![]() |
35f434b031 | ||
![]() |
2a0ec05648 | ||
![]() |
e54302040b | ||
![]() |
33bb91a016 | ||
![]() |
154365456e | ||
![]() |
30ead1de0e | ||
![]() |
376b646dd5 | ||
![]() |
4ebe471131 | ||
![]() |
266fc42744 | ||
![]() |
32a79b17c5 | ||
![]() |
7a8fa22a0c | ||
![]() |
7d30794420 | ||
![]() |
3e5cd9e04e | ||
![]() |
73c8a31dd2 | ||
![]() |
5dc9984577 | ||
![]() |
68e1dac75c | ||
![]() |
b1d4f34193 | ||
![]() |
4d3bcf69d3 | ||
![]() |
ad5b108ec0 | ||
![]() |
be961e987d | ||
![]() |
db04f68652 | ||
![]() |
c9c6795b21 | ||
![]() |
8d4584d660 | ||
![]() |
7c782443d3 | ||
![]() |
284fb011f0 | ||
![]() |
f6ae1cbf59 | ||
![]() |
23d912b703 | ||
![]() |
b150c7adc5 | ||
![]() |
4919266072 | ||
![]() |
17a2e14c0e | ||
![]() |
59f3e9bac1 | ||
![]() |
d09d19af45 | ||
![]() |
e61540dbbe | ||
![]() |
3788b6f5e7 | ||
![]() |
5492e9eb6e | ||
![]() |
f06c49ce74 | ||
![]() |
9df4f0a3de | ||
![]() |
9f89cce097 | ||
![]() |
bff44ae415 | ||
![]() |
7d26870975 | ||
![]() |
c681fcd4c9 | ||
![]() |
7ef954eaad | ||
![]() |
f2ac083396 | ||
![]() |
2a5706df2b | ||
![]() |
f699ffcfe8 | ||
![]() |
92fd4f265f | ||
![]() |
296ee091f2 | ||
![]() |
76ab5b4ced | ||
![]() |
c7df581014 | ||
![]() |
fc3ceba216 | ||
![]() |
1d861605d4 | ||
![]() |
e11f04c29a | ||
![]() |
59ec85205b | ||
![]() |
d67097ce7f | ||
![]() |
3003572d5f | ||
![]() |
42512ce907 | ||
![]() |
7a09098124 | ||
![]() |
25c1fcc48a | ||
![]() |
e00cd8ad1c | ||
![]() |
9f8eb0af8b | ||
![]() |
f009533e82 | ||
![]() |
6222486301 | ||
![]() |
565bc81f7f | ||
![]() |
6a501aced3 | ||
![]() |
e979945631 | ||
![]() |
26dce717b2 | ||
![]() |
3666c248f2 |
129 changed files with 14032 additions and 6910 deletions
|
@ -14,9 +14,7 @@ CONTRIBUTORS
|
|||
docker-compose.*
|
||||
Dockerfile
|
||||
docs
|
||||
LICENSE
|
||||
Makefile
|
||||
MANIFEST.in
|
||||
README.md
|
||||
SECURITY.md
|
||||
tox.ini
|
||||
|
|
26
.github/workflows/check-doc.yml
vendored
Normal file
26
.github/workflows/check-doc.yml
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
name: Check doc
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ 'master', 'stable-*' ]
|
||||
pull_request:
|
||||
branches: [ 'master', 'stable-*' ]
|
||||
|
||||
jobs:
|
||||
|
||||
test_doc:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.11"
|
||||
cache: 'pip'
|
||||
cache-dependency-path: '**/pyproject.toml'
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install tox
|
||||
- name: Check we can generate documentation
|
||||
run: tox -e docs
|
10
.github/workflows/dockerhub.yml
vendored
10
.github/workflows/dockerhub.yml
vendored
|
@ -1,11 +1,11 @@
|
|||
name: CI to Docker Hub
|
||||
name: Docker build
|
||||
|
||||
on:
|
||||
push:
|
||||
tags: ['*']
|
||||
branches: [ master ]
|
||||
branches: [ 'master', 'stable-*' ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
branches: [ 'master', 'stable-*' ]
|
||||
|
||||
|
||||
jobs:
|
||||
|
@ -18,7 +18,7 @@ jobs:
|
|||
- name: Test image # Checks we are able to run the container.
|
||||
run: docker compose -f docker-compose.test.yml run sut
|
||||
|
||||
build:
|
||||
build_upload:
|
||||
runs-on: ubuntu-latest
|
||||
needs: test
|
||||
if: github.event_name != 'pull_request'
|
||||
|
@ -61,7 +61,7 @@ jobs:
|
|||
tags: ${{ steps.meta.outputs.tags }}
|
||||
cache-from: type=local,src=/tmp/.buildx-cache
|
||||
cache-to: type=local,dest=/tmp/.buildx-cache
|
||||
platform: linux/amd64,linux/arm64,linux/arm/v7
|
||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||
|
||||
- name: Image digest
|
||||
run: echo ${{ steps.docker_build.outputs.digest }}
|
||||
|
|
|
@ -1,20 +1,37 @@
|
|||
name: Test & Docs
|
||||
name: Lint & unit tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
branches: [ 'master', 'stable-*' ]
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
branches: [ 'master', 'stable-*' ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Set up Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: "3.11"
|
||||
cache: 'pip'
|
||||
cache-dependency-path: '**/pyproject.toml'
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
python -m pip install tox
|
||||
- name: Run Lint
|
||||
run: tox -e lint
|
||||
|
||||
# Use postgresql and MariaDB versions of Debian buster
|
||||
test:
|
||||
# Dependency on linting to avoid running our expensive matrix test for nothing
|
||||
needs: lint
|
||||
runs-on: ubuntu-latest
|
||||
# Use postgresql and MariaDB versions of Debian bookworm
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:11
|
||||
image: postgres:15
|
||||
ports:
|
||||
- 5432:5432
|
||||
env:
|
||||
|
@ -24,7 +41,7 @@ jobs:
|
|||
options:
|
||||
--health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5
|
||||
mariadb:
|
||||
image: mariadb:10.3
|
||||
image: mariadb:10.11
|
||||
env:
|
||||
MARIADB_ROOT_PASSWORD: ihatemoney
|
||||
MARIADB_DATABASE: ihatemoney_ci
|
||||
|
@ -36,27 +53,27 @@ jobs:
|
|||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
python-version: [3.7, 3.8, 3.9, "3.10", "3.11"]
|
||||
python-version: [3.7, 3.8, 3.9, "3.10", "3.11", "3.12"]
|
||||
dependencies: [normal]
|
||||
database: [sqlite]
|
||||
# Test other databases only with one version of Python (Debian buster has 3.7)
|
||||
# Test other databases with only a few versions of Python (Debian bullseye has 3.9, bookworm has 3.11)
|
||||
include:
|
||||
- python-version: 3.7
|
||||
- python-version: 3.9
|
||||
dependencies: normal
|
||||
database: postgresql
|
||||
- python-version: 3.7
|
||||
- python-version: 3.9
|
||||
dependencies: normal
|
||||
database: mariadb
|
||||
- python-version: 3.11
|
||||
dependencies: normal
|
||||
database: postgresql
|
||||
- python-version: 3.11
|
||||
dependencies: normal
|
||||
database: mariadb
|
||||
# Try a few variants with the minimal versions supported
|
||||
- python-version: 3.7
|
||||
dependencies: minimal
|
||||
database: sqlite
|
||||
- python-version: 3.7
|
||||
dependencies: minimal
|
||||
database: postgresql
|
||||
- python-version: 3.7
|
||||
dependencies: minimal
|
||||
database: mariadb
|
||||
- python-version: 3.9
|
||||
dependencies: minimal
|
||||
database: sqlite
|
||||
|
@ -66,6 +83,15 @@ jobs:
|
|||
- python-version: "3.11"
|
||||
dependencies: minimal
|
||||
database: sqlite
|
||||
- python-version: "3.11"
|
||||
dependencies: minimal
|
||||
database: postgresql
|
||||
- python-version: "3.11"
|
||||
dependencies: minimal
|
||||
database: mariadb
|
||||
- python-version: "3.12"
|
||||
dependencies: minimal
|
||||
database: sqlite
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
|
@ -74,9 +100,9 @@ jobs:
|
|||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
cache: 'pip'
|
||||
cache-dependency-path: '**/setup.cfg'
|
||||
cache-dependency-path: '**/pyproject.toml'
|
||||
- name: Change dependencies to minimal supported versions
|
||||
run: sed -i -e 's/>=/==/g; s/~=.*==\(.*\)/==\1/g; s/~=/==/g;' setup.cfg
|
||||
run: sed -i -e 's/>=/==/g; s/~=.*==\(.*\)/==\1/g; s/~=/==/g;' pyproject.toml
|
||||
if: matrix.dependencies == 'minimal'
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
|
@ -98,6 +124,3 @@ jobs:
|
|||
if: matrix.database == 'mariadb'
|
||||
env:
|
||||
TESTING_SQLALCHEMY_DATABASE_URI: 'mysql+pymysql://root:ihatemoney@localhost:3306/ihatemoney_ci'
|
||||
- name: Run Lint & Docs
|
||||
run: tox -e lint_docs
|
||||
if: matrix.python-version == '3.11'
|
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -1,5 +1,6 @@
|
|||
*.pyc
|
||||
*.egg-info
|
||||
*.mo
|
||||
dist
|
||||
.venv
|
||||
docs/_build/
|
||||
|
@ -16,4 +17,5 @@ ihatemoney/budget.db
|
|||
.DS_Store
|
||||
.idea
|
||||
.python-version
|
||||
|
||||
.coverage*
|
||||
prof
|
||||
|
|
|
@ -1,7 +1,11 @@
|
|||
version: 2
|
||||
|
||||
build:
|
||||
os: ubuntu-22.04
|
||||
tools:
|
||||
python: "3.11"
|
||||
|
||||
python:
|
||||
version: "3.7"
|
||||
install:
|
||||
- method: pip
|
||||
path: .
|
||||
|
|
11
.travis.yml
11
.travis.yml
|
@ -1,11 +0,0 @@
|
|||
sudo: false
|
||||
language: python
|
||||
python:
|
||||
- "3.7"
|
||||
- "3.8"
|
||||
- "3.9"
|
||||
script: tox
|
||||
before_install:
|
||||
- python -m pip install --upgrade pip virtualenv
|
||||
install:
|
||||
- pip install tox-travis
|
105
CHANGELOG.md
105
CHANGELOG.md
|
@ -2,9 +2,91 @@
|
|||
|
||||
This document describes changes between each past release.
|
||||
|
||||
## 6.0.0 (unreleased)
|
||||
## 6.2.0 (unreleased)
|
||||
|
||||
### Breaking
|
||||
- Add support for python 3.12 (#757)
|
||||
|
||||
|
||||
## 6.1.5 (2024-03-19)
|
||||
|
||||
- Fix README and changelog not being displayed on PyPI
|
||||
- Fix ability to change project settings when project has existing currency (#1292)
|
||||
- Update translations for Dutch and German
|
||||
|
||||
|
||||
## 6.1.4 (2023-12-14)
|
||||
|
||||
- Fix missing markdown include in manifest (#1274)
|
||||
- Update translations for Chinese, Turkish, Czech, Spanish (Latin America), Swedish
|
||||
|
||||
|
||||
## 6.1.3 (2023-11-23)
|
||||
|
||||
- Revert update to flask and werkzeug 2.3 because of a regression (see #1272)
|
||||
|
||||
|
||||
## 6.1.2 (2023-11-19)
|
||||
|
||||
- Fix password generation command line crash (#1242)
|
||||
- Update to flask and werkzeug 2.3 (#1244)
|
||||
|
||||
|
||||
## 6.1.1 (2023-10-04)
|
||||
|
||||
### Currency conversion API workarounds
|
||||
|
||||
We are using an external API for currency conversion. This API recently
|
||||
started requiring an API key, and this broke I Hate Money in many ways.
|
||||
|
||||
This release adds a set of workarounds for this issue. This should restore
|
||||
basic functionality such as adding bills. However, we had to disable
|
||||
some operations to prevent crashing:
|
||||
|
||||
- Setting or changing the default currency on an existing project is no longer possible.
|
||||
However, setting a project to "No currency" is still possible.
|
||||
- Adding or editing a bill with a currency that differs from the default currency
|
||||
of the project is no longer possible
|
||||
|
||||
[Longer-term solutions are being discussed](https://github.com/spiral-project/ihatemoney/issues/1232).
|
||||
If you are using currencies in your projects, your input is welcome.
|
||||
|
||||
### Added
|
||||
|
||||
- Simplifies adding a bill with keyboard only (#1221)
|
||||
- Add details of bills in history (#1223)
|
||||
- Remember last "For whom?" field when adding a new bill (#1222)
|
||||
- Speed up unit tests (#1214)
|
||||
- Update translations for Spanish, Russian, Kannada, Swedish, Polish, German, and Italian
|
||||
|
||||
### Fixed
|
||||
- Fix remembering the last selected payer when switching project (#1224)
|
||||
|
||||
|
||||
## 6.1.0 (2023-07-29)
|
||||
|
||||
### Added
|
||||
- Add RSS feed for each project (#1158)
|
||||
- Security: require private code to edit a project settings (#1204)
|
||||
|
||||
### Fixed
|
||||
- Fix 404 page crash (#1201)
|
||||
|
||||
|
||||
## 6.0.1 (2023-07-22)
|
||||
|
||||
### Added
|
||||
- Add support for `APPLICATION_ROOT` in Docker container (#1189)
|
||||
- Improve docker-compose example: admin password and volume for database (#1169)
|
||||
|
||||
### Fixed
|
||||
- Fix docker-compose example quoting (#1164)
|
||||
- Fix crash when using existing sessions (migrate them to dict) (#1194)
|
||||
- Add newly created projects to the list of projects (#1193)
|
||||
|
||||
|
||||
## 6.0.0 (2023-07-13)
|
||||
|
||||
### Breaking changes
|
||||
- Drop Python 3.6 support
|
||||
- Add Python 3.11 support
|
||||
|
||||
|
@ -12,12 +94,23 @@ The minimum supported version is now Python 3.7, and the project is
|
|||
tested with up to Python 3.11
|
||||
|
||||
### Added
|
||||
- Build ARM64 and ARMv7 Docker image
|
||||
- Enable new languages: Catalan, Czech, Spanish, Persian, Hebrew, Hungarian, Kannada, Serbian, Telugu, Thai
|
||||
- Build ARM64 and ARMv7 Docker image (#1141)
|
||||
- Allow bills with an amount of zero (#1133)
|
||||
- Add confirmation for expense deletion (#1096)
|
||||
- Display a QR code when inviting people (#1000)
|
||||
- Add a cancel button when editing a bill for better UX (#1013)
|
||||
|
||||
### Fixed
|
||||
- Fix project deletion in the dashboard (#1094)
|
||||
- Fix duplicate project name in dropdown list (#1082)
|
||||
- Fix captcha validation, it should be case insensitive on both side (#1061)
|
||||
- Fix CSRF on logout (#1040)
|
||||
- Fix XSS when inviting people by email (#1044)
|
||||
|
||||
### Changed
|
||||
- Add a cancel button when editing a bill for better UX
|
||||
- Translations: Bengali, Indonesian, Polish
|
||||
- Pin Werkzeug to avoid dropping Python 3.6 compatibility
|
||||
- Use a better quality favicon (#1102)
|
||||
- Use Flask-Limiter to implement rate limiting (#1054)
|
||||
|
||||
## 5.2.0 (2022-04-07)
|
||||
|
||||
|
|
|
@ -17,12 +17,15 @@ bmatticus
|
|||
Brice Maron
|
||||
Byron Ullauri
|
||||
Carey Metcalfe
|
||||
cbrosnan
|
||||
Daniel Schreiber
|
||||
DavidRThrashJr
|
||||
donkers
|
||||
Edwin Smulders
|
||||
Elizabeth Sherrock
|
||||
Éloi Rivard
|
||||
eMerzh
|
||||
Erwan Lacoudre
|
||||
Feth AREZKI
|
||||
Frédéric Sureau
|
||||
Gianluca De Cola
|
||||
|
@ -30,6 +33,8 @@ Glandos
|
|||
Heimen Stoffels
|
||||
James Leong
|
||||
Jocelyn Delalande
|
||||
Jojo144
|
||||
Lod
|
||||
Luc Didry
|
||||
Lucas Verney
|
||||
Marien Fressinaud
|
||||
|
@ -46,10 +51,12 @@ Quentin Roy
|
|||
Rémy HUBSCHER
|
||||
Richard Coates
|
||||
Salamandar
|
||||
Saroj Regmi
|
||||
THANOS SIOURDAKIS
|
||||
Toover
|
||||
Xavier Mehrenberger
|
||||
Youe Graillot
|
||||
zorun
|
||||
Zottelchen
|
||||
|
||||
The manual drawings are from Coline Billon, they are under CC BY 4.0.
|
||||
|
|
|
@ -26,6 +26,7 @@ ENV DEBUG="False" \
|
|||
SHOW_ADMIN_EMAIL="True" \
|
||||
SQLALCHEMY_DATABASE_URI="sqlite:////database/ihatemoney.db" \
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS="False" \
|
||||
APPLICATION_ROOT="/" \
|
||||
ENABLE_CAPTCHA="False" \
|
||||
LEGAL_LINK=""
|
||||
|
||||
|
|
|
@ -1,3 +0,0 @@
|
|||
include *.rst
|
||||
recursive-include ihatemoney *.rst *.py *.yaml *.po *.mo *.html *.css *.js *.eot *.svg *.woff *.txt *.png *.webp *.ini *.cfg *.j2 *.jpg *.gif *.ico
|
||||
include LICENSE CONTRIBUTORS CHANGELOG.rst
|
12
Makefile
12
Makefile
|
@ -11,7 +11,7 @@ MAGICK_MOGRIFY := mogrify
|
|||
.PHONY: all
|
||||
all: install ## Alias for install
|
||||
.PHONY: install
|
||||
install: virtualenv setup.cfg $(INSTALL_STAMP) ## Install dependencies
|
||||
install: virtualenv pyproject.toml $(INSTALL_STAMP) ## Install dependencies
|
||||
$(INSTALL_STAMP):
|
||||
$(VENV)/bin/pip install -U pip
|
||||
$(VENV)/bin/pip install -e .
|
||||
|
@ -23,7 +23,7 @@ $(PYTHON):
|
|||
$(VIRTUALENV) $(VENV)
|
||||
|
||||
.PHONY: install-dev
|
||||
install-dev: virtualenv setup.cfg $(INSTALL_STAMP) $(DEV_STAMP) ## Install development dependencies
|
||||
install-dev: virtualenv pyproject.toml $(INSTALL_STAMP) $(DEV_STAMP) ## Install development dependencies
|
||||
$(DEV_STAMP): $(PYTHON)
|
||||
$(VENV)/bin/pip install -Ue .[dev]
|
||||
touch $(DEV_STAMP)
|
||||
|
@ -36,9 +36,9 @@ remove-install-stamp:
|
|||
update: remove-install-stamp install ## Update the dependencies
|
||||
|
||||
.PHONY: serve
|
||||
serve: install ## Run the ihatemoney server
|
||||
serve: install build-translations ## Run the ihatemoney server
|
||||
@echo 'Running ihatemoney on http://localhost:5000'
|
||||
FLASK_DEBUG=1 FLASK_ENV=development FLASK_APP=ihatemoney.wsgi $(VENV)/bin/flask run --host=0.0.0.0
|
||||
FLASK_DEBUG=1 FLASK_APP=ihatemoney.wsgi $(VENV)/bin/flask run --host=0.0.0.0
|
||||
|
||||
.PHONY: test
|
||||
test: install-dev ## Run the tests
|
||||
|
@ -74,8 +74,8 @@ compress-assets: compress-showcase ## Compress static assets
|
|||
build-translations: ## Build the translations
|
||||
$(VENV)/bin/pybabel compile -d ihatemoney/translations
|
||||
|
||||
.PHONY: update-translations
|
||||
update-translations: ## Extract new translations from source code
|
||||
.PHONY: extract-translations
|
||||
extract-translations: ## Extract new translations from source code
|
||||
$(VENV)/bin/pybabel extract --add-comments "I18N:" --strip-comments --omit-header --no-location --mapping-file ihatemoney/babel.cfg -o ihatemoney/messages.pot ihatemoney
|
||||
$(VENV)/bin/pybabel update -i ihatemoney/messages.pot -d ihatemoney/translations/
|
||||
|
||||
|
|
33
README.md
33
README.md
|
@ -22,10 +22,41 @@ highly encouraged to do so.
|
|||
|
||||
## Requirements
|
||||
|
||||
- **Python**: version 3.7 to 3.11.
|
||||
- **Python**: version 3.7 to 3.12.
|
||||
- **Backends**: SQLite, PostgreSQL, MariaDB (version 10.3.2 or above),
|
||||
Memory.
|
||||
|
||||
## Current direction (as of 2024)
|
||||
|
||||
Ihatemoney was started in 2011, and we believe the project has reached a certain
|
||||
level of maturity now. The overall energy of contributors is not as high as it
|
||||
used to be.
|
||||
|
||||
In addition, there are now several self-hosted alternatives (for instance
|
||||
[cospend](https://github.com/julien-nc/cospend-nc/tree/main),
|
||||
[spliit](https://github.com/spliit-app/spliit)).
|
||||
|
||||
As maintainers, we believe that the project is still relevant but should gear
|
||||
towards some kind of "maintenance mode":
|
||||
|
||||
* **Simplicity** is now the main goal of the project. It has always been a compass
|
||||
for the project, and the resulting software is appreciated by both users and
|
||||
server administrators. For us, "simplicity" is positive and encompasses both
|
||||
technical aspects (very few javascript code, manageable dependencies, small code
|
||||
size...) and user-visible aspects (straightforward interface, no need to create
|
||||
accounts for people you invite, same web interface on mobile...)
|
||||
|
||||
* **Stability** is prioritized over adding major new features. We found ourselves
|
||||
complexifying the codebase (and the interface) while accepting some
|
||||
contributions. Our goal now is to have a minimal set of features that do most of
|
||||
the job. We believe this will help lower the maintainance burden.
|
||||
|
||||
* **User interface and user experience improvements** are always super welcome !
|
||||
|
||||
It is still possible to propose new features, but they should fit into
|
||||
this new direction. Simplicity of the UI/UX and simplicity of the technical
|
||||
implementation will be the main factors when deciding to accept new features.
|
||||
|
||||
## Contributing
|
||||
|
||||
Do you wish to contribute to IHateMoney? Fantastic! There's a lot of
|
||||
|
|
|
@ -4,9 +4,9 @@
|
|||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 5.0.x | :heavy_check_mark: |
|
||||
| 4.1.x | :heavy_check_mark: |
|
||||
| <= 4.0 | :x: |
|
||||
| 6.2.x | :heavy_check_mark: |
|
||||
| 6.1.x | :heavy_check_mark: |
|
||||
| <= 6.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ SHOW_ADMIN_EMAIL = $SHOW_ADMIN_EMAIL
|
|||
SQLACHEMY_DEBUG = DEBUG
|
||||
SQLALCHEMY_DATABASE_URI = "$SQLALCHEMY_DATABASE_URI"
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = $SQLALCHEMY_TRACK_MODIFICATIONS
|
||||
APPLICATION_ROOT = "$APPLICATION_ROOT"
|
||||
ENABLE_CAPTCHA = $ENABLE_CAPTCHA
|
||||
LEGAL_LINK = "$LEGAL_LINK"
|
||||
EOF
|
||||
|
|
|
@ -1,4 +1,14 @@
|
|||
# This is an example. Please change the configuration variables listed here.
|
||||
#
|
||||
# This example uses a volume to persist the sqlite database outside of the container,
|
||||
# please adapt the local path. If you use a custom PUID and PGID, you need to create
|
||||
# the local path beforehand with the correct user/group.
|
||||
#
|
||||
# You can generate an admin password with: docker run -it --rm --entrypoint ihatemoney ihatemoney/ihatemoney:latest generate_password_hash
|
||||
# IMPORTANT: replace every dollar character in the result with a double dollar ($ -> $$)
|
||||
# To disable admin access, simply set the password to an empty string (ADMIN_PASSWORD=)
|
||||
#
|
||||
# See https://ihatemoney.readthedocs.io/en/latest/configuration.html to understand all settings.
|
||||
|
||||
version: "3.9"
|
||||
|
||||
|
@ -7,13 +17,13 @@ services:
|
|||
image: ihatemoney/ihatemoney:latest
|
||||
environment:
|
||||
- DEBUG=False
|
||||
- ACTIVATE_ADMIN_DASHBOARD=False
|
||||
- ACTIVATE_DEMO_PROJECT=True
|
||||
- ACTIVATE_ADMIN_DASHBOARD=False
|
||||
- ADMIN_PASSWORD=
|
||||
- ALLOW_PUBLIC_PROJECT_CREATION=True
|
||||
- BABEL_DEFAULT_TIMEZONE=UTC
|
||||
- GREENLET_TEST_CPP=no
|
||||
- MAIL_DEFAULT_SENDER="Budget manager <admin@example.com>"
|
||||
- MAIL_DEFAULT_SENDER=Budget manager <admin@example.com>
|
||||
- MAIL_PASSWORD=
|
||||
- MAIL_PORT=25
|
||||
- MAIL_SERVER=localhost
|
||||
|
@ -25,10 +35,13 @@ services:
|
|||
- SHOW_ADMIN_EMAIL=True
|
||||
- SQLALCHEMY_DATABASE_URI=sqlite:////database/ihatemoney.db
|
||||
- SQLALCHEMY_TRACK_MODIFICATIONS=False
|
||||
- APPLICATION_ROOT=/
|
||||
- ENABLE_CAPTCHA=False
|
||||
- LEGAL_LINK=
|
||||
- PORT=8000
|
||||
- PUID=0
|
||||
- PGID=0
|
||||
volumes:
|
||||
- /path/to/local/dir/for/sqlite/db:/database
|
||||
ports:
|
||||
- "8000:8000"
|
||||
|
|
26
docs/api.md
26
docs/api.md
|
@ -34,9 +34,9 @@ the token (of course, you need to authenticate):
|
|||
$ curl --basic -u demo:demo https://ihatemoney.org/api/projects/demo/token
|
||||
{"token": "WyJ0ZXN0Il0.Rt04fNMmxp9YslCRq8hB6jE9s1Q"}
|
||||
|
||||
Make sure to store this token securely: it allows full access to the
|
||||
Make sure to store this token securely: it allows almost full access to the
|
||||
project. For instance, use it to obtain information about the project
|
||||
(replace PROJECT_TOKEN with the actual token):
|
||||
(replace `PROJECT_TOKEN` with the actual token):
|
||||
|
||||
$ curl --oauth2-bearer "PROJECT_TOKEN" https://ihatemoney.org/api/projects/demo
|
||||
|
||||
|
@ -51,7 +51,8 @@ simply create an URL of the form:
|
|||
|
||||
https://ihatemoney.org/demo/join/PROJECT_TOKEN
|
||||
|
||||
Such a link grants full access to the project associated with the token.
|
||||
Such a link grants read-write access to the project associated with the token,
|
||||
but it does not allow to change project settings.
|
||||
|
||||
### Projects
|
||||
|
||||
|
@ -67,8 +68,8 @@ A project needs the following arguments:
|
|||
- `name`: the project name (string)
|
||||
- `id`: the project identifier (string without special chars or
|
||||
spaces)
|
||||
- `password`: the project password / secret code (string)
|
||||
- `contact_email`: the contact email (string)
|
||||
- `password`: the project password / private code (string)
|
||||
- `contact_email`: the contact email, used to recover the private code (string)
|
||||
|
||||
Optional arguments:
|
||||
|
||||
|
@ -83,7 +84,9 @@ Here is the command:
|
|||
-d 'name=yay&id=yay&password=yay&contact_email=yay@notmyidea.org'
|
||||
"yay"
|
||||
|
||||
As you can see, the API returns the identifier of the project.
|
||||
As you can see, the API returns the identifier of the project. It might be different
|
||||
from what you requested, because the ID is normalized (remove special characters,
|
||||
change to lowercase, etc).
|
||||
|
||||
#### Getting information about the project
|
||||
|
||||
|
@ -108,7 +111,12 @@ Updating a project is done with the `PUT` verb:
|
|||
|
||||
$ curl --basic -u yay:yay -X PUT\
|
||||
https://ihatemoney.org/api/projects/yay -d\
|
||||
'name=yay&id=yay&password=yay&contact_email=youpi@notmyidea.org'
|
||||
'name=yay&id=yay¤t_password=yay&password=newyay&contact_email=youpi@notmyidea.org'
|
||||
|
||||
You need to give the current private code as the `current_password` field. This is a security
|
||||
measure to ensure that knowledge of an auth token is not enough to update settings.
|
||||
|
||||
Note that in any case you can never change the ID of a project.
|
||||
|
||||
#### Deleting a project
|
||||
|
||||
|
@ -125,7 +133,7 @@ You can get all the members with a `GET` on
|
|||
[{"weight": 1, "activated": true, "id": 31, "name": "Arnaud"},
|
||||
{"weight": 1, "activated": true, "id": 32, "name": "Alexis"},
|
||||
{"weight": 1, "activated": true, "id": 33, "name": "Olivier"},
|
||||
{"weight": 1, "activated": true, "id": 34, "name": "Fred"}]
|
||||
{"weight": 1, "activated": true, "id": 34, "name": "Jeanne"}]
|
||||
|
||||
Add a member with a `POST` request on `/api/projects/<id>/members`:
|
||||
|
||||
|
@ -236,7 +244,7 @@ You can get some project stats with a `GET` on
|
|||
"balance": 10.5
|
||||
},
|
||||
{
|
||||
"member": {"activated": true, "id": 2, "name": "fred", "weight": 1.0},
|
||||
"member": {"activated": true, "id": 2, "name": "jeanne", "weight": 1.0},
|
||||
"paid": 5,
|
||||
"spent": 15.5,
|
||||
"balance": -10.5
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
import datetime
|
||||
|
||||
templates_path = ["_templates"]
|
||||
source_suffix = ".rst"
|
||||
master_doc = "index"
|
||||
|
||||
project = "I hate money"
|
||||
copyright = "2011-2021, The 'I hate money' team"
|
||||
year = datetime.datetime.now().strftime("%Y")
|
||||
copyright = f"2011-{year}, The 'I hate money' team"
|
||||
|
||||
version = "5.0"
|
||||
release = "5.0"
|
||||
|
|
|
@ -30,9 +30,9 @@ Specifies the type of backend to use and its location. More information
|
|||
on the format used can be found on [the SQLAlchemy
|
||||
documentation](http://docs.sqlalchemy.org/en/latest/core/engines.html#database-urls).
|
||||
|
||||
- **Default value:** `sqlite:///tmp/ihatemoney.db`
|
||||
- **Default value:** `sqlite:////tmp/ihatemoney.db`
|
||||
- **Production value:** Set it to some path on your disk. Typically
|
||||
`sqlite:///home/ihatemoney/ihatemoney.db`. Do *not* store it under
|
||||
`sqlite:////home/ihatemoney/ihatemoney.db`. Do *not* store it under
|
||||
`/tmp` as this folder is cleared at each boot.
|
||||
|
||||
For example, if you're using MariaDB, use a configuration similar to
|
||||
|
@ -127,11 +127,11 @@ ADMIN_PASSWORD needs to be set.
|
|||
|
||||
## APPLICATION_ROOT
|
||||
|
||||
If empty, ihatemoney will be served at domain root (e.g:
|
||||
*http://domain.tld*), if set to `"somestring"`, it will be served from a
|
||||
By default, ihatemoney will be served at domain root (e.g:
|
||||
*http://domain.tld*), if set to `"/somestring"`, it will be served from a
|
||||
"folder" (e.g: *http://domain.tld/somestring*).
|
||||
|
||||
- **Default value:** `""` (empty string)
|
||||
- **Default value:** `"/"`
|
||||
|
||||
## BABEL_DEFAULT_TIMEZONE
|
||||
|
||||
|
@ -188,3 +188,12 @@ project](https://pythonhosted.org/flask-mail/#configuring-flask-mail)
|
|||
- **MAIL_USERNAME** : default **None**
|
||||
- **MAIL_PASSWORD** : default **None**
|
||||
- **DEFAULT_MAIL_SENDER** : default **None**
|
||||
|
||||
## Configuring password hashes
|
||||
|
||||
The werkzeug [generate_password_hash](https://werkzeug.palletsprojects.com/utils/#werkzeug.security.generate_password_hash)
|
||||
is used to create password hashes. By default the default werkzeug values
|
||||
are used, however you can customize those values with:
|
||||
|
||||
- **PASSWORD_HASH_METHOD** : default **None**
|
||||
- **PASSWORD_HASH_SALT_LENGTH** : default **None**
|
||||
|
|
|
@ -1,5 +1,37 @@
|
|||
# Contributing
|
||||
|
||||
## Current direction (as of 2024)
|
||||
|
||||
Ihatemoney was started in 2011, and we believe the project has reached a certain
|
||||
level of maturity now. The overall energy of contributors is not as high as it
|
||||
used to be.
|
||||
|
||||
In addition, there are now several self-hosted alternatives (for instance
|
||||
[cospend](https://github.com/julien-nc/cospend-nc/tree/main),
|
||||
[spliit](https://github.com/spliit-app/spliit)).
|
||||
|
||||
As maintainers, we believe that the project is still relevant but should gear
|
||||
towards some kind of "maintenance mode":
|
||||
|
||||
* **Simplicity** is now the main goal of the project. It has always been a compass
|
||||
for the project, and the resulting software is appreciated by both users and
|
||||
server administrators. For us, "simplicity" is positive and encompasses both
|
||||
technical aspects (very few javascript code, manageable dependencies, small code
|
||||
size...) and user-visible aspects (straightforward interface, no need to create
|
||||
accounts for people you invite, same web interface on mobile...)
|
||||
|
||||
* **Stability** is prioritized over adding major new features. We found ourselves
|
||||
complexifying the codebase (and the interface) while accepting some
|
||||
contributions. Our goal now is to have a minimal set of features that do most of
|
||||
the job. We believe this will help lower the maintainance burden.
|
||||
|
||||
* **User interface and user experience improvements** are always super welcome !
|
||||
|
||||
It is still possible to propose new features, but they should fit into
|
||||
this new direction. Simplicity of the UI/UX and simplicity of the technical
|
||||
implementation will be the main factors when deciding to accept new features.
|
||||
|
||||
|
||||
## How to contribute
|
||||
|
||||
You would like to contribute? First, thanks a bunch! This project is a
|
||||
|
@ -190,6 +222,19 @@ revision file which can be created with the following command:
|
|||
|
||||
You then need to write the migration steps yourself.
|
||||
|
||||
## Repository rules
|
||||
|
||||
- Please, try to keep it to **one pull request per feature:** if you want to do more
|
||||
than one thing, send multiple pull requests. It will be easier for us to review and
|
||||
merge.
|
||||
- **Document your code:** if you add a new feature, please document it in the
|
||||
- All the people working on this project do it on their spare time. So please, be
|
||||
patient if we don't answer right away.
|
||||
- We try to have two maintainers review the pull requests before merging it. So please,
|
||||
be patient if we don't merge it right away. After one week, only one maintainer approval
|
||||
is required.
|
||||
|
||||
|
||||
## How to build the documentation ?
|
||||
|
||||
The documentation is using
|
||||
|
@ -261,10 +306,9 @@ In order to issue a new release, follow the following steps:
|
|||
|
||||
make compress-assets
|
||||
|
||||
- Build the translations:
|
||||
- Extract the translations:
|
||||
|
||||
make update-translations
|
||||
make build-translations
|
||||
make extract-translations
|
||||
|
||||
- If you're not completely sure of yourself at this point, you can
|
||||
optionally: create a new branch, push it, open a pull request, check
|
||||
|
@ -281,7 +325,7 @@ Index](https://pypi.org) (PyPI) and publish a tag in the git repository.
|
|||
::: {note}
|
||||
|
||||
The above command will prompt for version number, handle
|
||||
`CHANGELOG.md` and `setup.cfg` updates, package creation,
|
||||
`CHANGELOG.md` and `pyproject.toml` updates, package creation,
|
||||
pypi upload. It will prompt you before each step to get your consent.
|
||||
:::
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ hub](https://hub.docker.com/r/ihatemoney/ihatemoney/).
|
|||
This is probably the simplest way to get something running. Once you
|
||||
have Docker installed on your system, just issue :
|
||||
|
||||
docker run -d -p 8000:8000 ihatemoney/ihatemoney
|
||||
docker run -d -p 8000:8000 ihatemoney/ihatemoney:latest
|
||||
|
||||
Ihatemoney is now available on <http://localhost:8000>.
|
||||
|
||||
|
@ -54,6 +54,10 @@ To enable the Admin dashboard, first generate a hashed password with:
|
|||
|
||||
docker run -it --rm --entrypoint ihatemoney ihatemoney/ihatemoney generate_password_hash
|
||||
|
||||
:::{note}
|
||||
The generated password hash is salted. Which means that the same password will generate a different hash each time. This is normal and expected behavior.
|
||||
:::
|
||||
|
||||
At the prompt, enter a password to use for the admin dashboard. The
|
||||
command will print the hashed password string.
|
||||
|
||||
|
@ -62,12 +66,18 @@ Add these additional environment variables to the docker run invocation:
|
|||
-e ACTIVATE_ADMIN_DASHBOARD=True \
|
||||
-e ADMIN_PASSWORD=<hashed_password_string> \
|
||||
|
||||
:::{note}
|
||||
If you are using a `docker-compose.yml` file and need to include a password hash, use `$$` instead of `$` to escape the dollar sign. This ensures that the hash is treated as a literal string rather than a variable in Bash.
|
||||
:::
|
||||
|
||||
Additional gunicorn parameters can be passed using the docker `CMD`
|
||||
parameter. For example, use the following command to add more gunicorn
|
||||
workers:
|
||||
|
||||
docker run -d -p 8000:8000 ihatemoney/ihatemoney -w 3
|
||||
|
||||
If needed, there is a `docker-compose.yml` file available as an example on the [project repository](https://github.com/spiral-project/ihatemoney/blob/master/docker-compose.yml)
|
||||
|
||||
(cloud)=
|
||||
## On a Cloud Provider
|
||||
|
||||
|
@ -83,7 +93,7 @@ Some Paas (Platform-as-a-Service), provide a documentation or even a quick insta
|
|||
|
||||
«Ihatemoney» depends on:
|
||||
|
||||
- **Python**: any version from 3.7 to 3.11 will work.
|
||||
- **Python**: any version from 3.7 to 3.12 will work.
|
||||
- **A database backend**: choose among SQLite, PostgreSQL, MariaDB (>=
|
||||
10.3.2).
|
||||
- **Virtual environment** (recommended): [python3-venv]{.title-ref}
|
||||
|
|
|
@ -11,39 +11,48 @@ expenses in the first place!
|
|||
That being said, there are a few mechanisms to limit the impact of a
|
||||
malicious member and to manage changes in membership (e.g. ensuring that
|
||||
a previous member can no longer access the project). But these
|
||||
mechanisms don\'t prevent a malicious member from breaking things in
|
||||
mechanisms don't prevent a malicious member from breaking things in
|
||||
your project!
|
||||
|
||||
## Security model
|
||||
|
||||
A project has three main parameters when it comes to security:
|
||||
A project has four main parameters when it comes to security:
|
||||
|
||||
- **project identifier** (equivalent to a \"login\")
|
||||
- **private code** (equivalent to a \"password\")
|
||||
- **token** (cryptographically derived from the private code)
|
||||
- **auth token** (cryptographically derived from the private code)
|
||||
- **feed token** (also cryptographically derived from the private code)
|
||||
|
||||
Somebody with the private code can:
|
||||
Somebody with the **private code** can:
|
||||
|
||||
- access the project through the web interface or the API
|
||||
- add, modify or remove participants
|
||||
- add, modify or remove bills
|
||||
- view statistics of the project
|
||||
- view project history
|
||||
- change basic settings of the project
|
||||
- change the email address associated to the project
|
||||
- change the private code of the project
|
||||
- delete the project
|
||||
|
||||
Somebody with the token can manipulate the project through the API to do
|
||||
essentially the same thing:
|
||||
Somebody with the **auth token** can manipulate the project through the API:
|
||||
|
||||
- access the project
|
||||
- add, modify or remove participants
|
||||
- add, modify or remove bills
|
||||
- change basic settings of the project
|
||||
- change the email address associated to the project
|
||||
- change the private code of the project
|
||||
- view statistics of the project
|
||||
- delete the project
|
||||
|
||||
The token can also be used to build \"invitation links\". These links
|
||||
The auth token is not enough to change basic settings of the project,
|
||||
or to change the email address or the private code.
|
||||
|
||||
The auth token can also be used to build "invitation links". These links
|
||||
allow to login on the web interface without knowing the private code,
|
||||
see below.
|
||||
|
||||
Somebody with the **feed token** can only access a read-only view of the project
|
||||
through a RSS feed (at `/<project_id>/feed/<token>.xml`).
|
||||
|
||||
## Giving access to a project
|
||||
|
||||
There are two main ways to give access to a project to a new person:
|
||||
|
@ -57,25 +66,36 @@ The second method is interesting because it does not reveal the private
|
|||
code. In particular, somebody that is logged-in through the invitation
|
||||
link will not be able to change the private code, because the web
|
||||
interface requires a confirmation of the existing private code to change
|
||||
it. However, a motivated person could extract the token from the
|
||||
it. Similarly, changing other important settings or deleting the project
|
||||
from the web interface requires knowledge of the private code.
|
||||
|
||||
However, a motivated person could extract the auth token from the
|
||||
invitation link, use it to access the project through the API, and
|
||||
change the private code through the API.
|
||||
delete the project through the API. This is a [known issue](https://github.com/spiral-project/ihatemoney/issues/1206).
|
||||
|
||||
## Removing access to a project
|
||||
|
||||
If a person should no longer be able to access a project, the only way
|
||||
is to change the private code.
|
||||
is to change the private code for the whole project.
|
||||
|
||||
This will also automatically change the token: old invitation links
|
||||
won\'t work anymore, and anybody with the old token will no longer be
|
||||
able to access the project through the API.
|
||||
This will prevent anybody from logging in with the old private code.
|
||||
However, anybody with an existing session cookie will still have
|
||||
access to the project. This is a [known issue](https://github.com/spiral-project/ihatemoney/issues/857)
|
||||
that should be fixed.
|
||||
|
||||
Changing the private code will automatically change the auth token:
|
||||
old invitation links won't work anymore, and anybody with the old token
|
||||
will no longer be able to access the project through the API.
|
||||
|
||||
This will also automatically change the feed token, so that existing
|
||||
links to the RSS feed for the project will no longer work.
|
||||
|
||||
## Recovering access to a project
|
||||
|
||||
If the private code is no longer known, the creator of the project can
|
||||
still recover access. He/she must have provided an email address when
|
||||
creating the project, and Ihatemoney can send a reset link to this email
|
||||
address (classical \"forgot your password\" functionality).
|
||||
address (classical "forgot your password" functionality).
|
||||
|
||||
Note, however, that somebody with the private code could have changed
|
||||
the email address in the settings at any time.
|
||||
|
@ -91,6 +111,6 @@ Note, however, that the history feature is primarily meant to protect
|
|||
against mistakes: a malicious member can easily remove all entries from
|
||||
the history!
|
||||
|
||||
The best defense against this kind of issues is\... backups! All data
|
||||
The best defense against this kind of issues is... backups! All data
|
||||
for a project can be exported through the settings page or through the
|
||||
API.
|
||||
API. The server administrator can also backup the database.
|
||||
|
|
11
hatch_build.py
Normal file
11
hatch_build.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
import sys
|
||||
|
||||
from hatchling.builders.hooks.plugin.interface import BuildHookInterface
|
||||
|
||||
|
||||
class CustomBuildHook(BuildHookInterface):
|
||||
def initialize(self, version, build_data):
|
||||
sys.path.insert(0, "./ihatemoney")
|
||||
from babel_utils import compile_catalogs
|
||||
|
||||
compile_catalogs()
|
|
@ -1,3 +1,2 @@
|
|||
[python: **.py]
|
||||
[jinja2: **/templates/**.html]
|
||||
extensions=jinja2.ext.autoescape,jinja2.ext.with_
|
||||
|
|
11
ihatemoney/babel_utils.py
Normal file
11
ihatemoney/babel_utils.py
Normal file
|
@ -0,0 +1,11 @@
|
|||
from pathlib import Path
|
||||
|
||||
from babel.messages.frontend import compile_catalog
|
||||
|
||||
|
||||
def compile_catalogs():
|
||||
cmd = compile_catalog()
|
||||
cmd.directory = Path(__file__).parent / "translations"
|
||||
cmd.statistics = True
|
||||
cmd.finalize_options()
|
||||
cmd.run()
|
|
@ -47,11 +47,14 @@ ACTIVATE_ADMIN_DASHBOARD = False
|
|||
# service over plain HTTP.
|
||||
SESSION_COOKIE_SECURE = True
|
||||
|
||||
# Set this to a URL path under which the application will be served. Defaults to "/"
|
||||
APPLICATION_ROOT = "/"
|
||||
|
||||
# You can activate an optional CAPTCHA if you want to. It can be helpful
|
||||
# to filter spammer bots.
|
||||
# ENABLE_CAPTCHA = True
|
||||
ENABLE_CAPTCHA = False
|
||||
|
||||
# You may want to point to a special legal page, for instance to give information
|
||||
# about GDPR, or how you handle the data of your users.
|
||||
# Set this variable to the URL you want.
|
||||
# LEGAL_LINK = ""
|
||||
LEGAL_LINK = ""
|
||||
|
|
|
@ -36,13 +36,181 @@ class CurrencyConverter(object, metaclass=Singleton):
|
|||
return rates
|
||||
|
||||
def get_currencies(self, with_no_currency=True):
|
||||
rates = [
|
||||
rate
|
||||
for rate in self.get_rates()
|
||||
if with_no_currency or rate != self.no_currency
|
||||
currencies = [
|
||||
"AED",
|
||||
"AFN",
|
||||
"ALL",
|
||||
"AMD",
|
||||
"ANG",
|
||||
"AOA",
|
||||
"ARS",
|
||||
"AUD",
|
||||
"AWG",
|
||||
"AZN",
|
||||
"BAM",
|
||||
"BBD",
|
||||
"BDT",
|
||||
"BGN",
|
||||
"BHD",
|
||||
"BIF",
|
||||
"BMD",
|
||||
"BND",
|
||||
"BOB",
|
||||
"BRL",
|
||||
"BSD",
|
||||
"BTC",
|
||||
"BTN",
|
||||
"BWP",
|
||||
"BYN",
|
||||
"BZD",
|
||||
"CAD",
|
||||
"CDF",
|
||||
"CHF",
|
||||
"CLF",
|
||||
"CLP",
|
||||
"CNH",
|
||||
"CNY",
|
||||
"COP",
|
||||
"CRC",
|
||||
"CUC",
|
||||
"CUP",
|
||||
"CVE",
|
||||
"CZK",
|
||||
"DJF",
|
||||
"DKK",
|
||||
"DOP",
|
||||
"DZD",
|
||||
"EGP",
|
||||
"ERN",
|
||||
"ETB",
|
||||
"EUR",
|
||||
"FJD",
|
||||
"FKP",
|
||||
"GBP",
|
||||
"GEL",
|
||||
"GGP",
|
||||
"GHS",
|
||||
"GIP",
|
||||
"GMD",
|
||||
"GNF",
|
||||
"GTQ",
|
||||
"GYD",
|
||||
"HKD",
|
||||
"HNL",
|
||||
"HRK",
|
||||
"HTG",
|
||||
"HUF",
|
||||
"IDR",
|
||||
"ILS",
|
||||
"IMP",
|
||||
"INR",
|
||||
"IQD",
|
||||
"IRR",
|
||||
"ISK",
|
||||
"JEP",
|
||||
"JMD",
|
||||
"JOD",
|
||||
"JPY",
|
||||
"KES",
|
||||
"KGS",
|
||||
"KHR",
|
||||
"KMF",
|
||||
"KPW",
|
||||
"KRW",
|
||||
"KWD",
|
||||
"KYD",
|
||||
"KZT",
|
||||
"LAK",
|
||||
"LBP",
|
||||
"LKR",
|
||||
"LRD",
|
||||
"LSL",
|
||||
"LYD",
|
||||
"MAD",
|
||||
"MDL",
|
||||
"MGA",
|
||||
"MKD",
|
||||
"MMK",
|
||||
"MNT",
|
||||
"MOP",
|
||||
"MRU",
|
||||
"MUR",
|
||||
"MVR",
|
||||
"MWK",
|
||||
"MXN",
|
||||
"MYR",
|
||||
"MZN",
|
||||
"NAD",
|
||||
"NGN",
|
||||
"NIO",
|
||||
"NOK",
|
||||
"NPR",
|
||||
"NZD",
|
||||
"OMR",
|
||||
"PAB",
|
||||
"PEN",
|
||||
"PGK",
|
||||
"PHP",
|
||||
"PKR",
|
||||
"PLN",
|
||||
"PYG",
|
||||
"QAR",
|
||||
"RON",
|
||||
"RSD",
|
||||
"RUB",
|
||||
"RWF",
|
||||
"SAR",
|
||||
"SBD",
|
||||
"SCR",
|
||||
"SDG",
|
||||
"SEK",
|
||||
"SGD",
|
||||
"SHP",
|
||||
"SLL",
|
||||
"SOS",
|
||||
"SRD",
|
||||
"SSP",
|
||||
"STD",
|
||||
"STN",
|
||||
"SVC",
|
||||
"SYP",
|
||||
"SZL",
|
||||
"THB",
|
||||
"TJS",
|
||||
"TMT",
|
||||
"TND",
|
||||
"TOP",
|
||||
"TRY",
|
||||
"TTD",
|
||||
"TWD",
|
||||
"TZS",
|
||||
"UAH",
|
||||
"UGX",
|
||||
"USD",
|
||||
"UYU",
|
||||
"UZS",
|
||||
"VEF",
|
||||
"VES",
|
||||
"VND",
|
||||
"VUV",
|
||||
"WST",
|
||||
"XAF",
|
||||
"XAG",
|
||||
"XAU",
|
||||
"XCD",
|
||||
"XDR",
|
||||
"XOF",
|
||||
"XPD",
|
||||
"XPF",
|
||||
"XPT",
|
||||
"YER",
|
||||
"ZAR",
|
||||
"ZMW",
|
||||
"ZWL",
|
||||
]
|
||||
rates.sort(key=lambda rate: "" if rate == self.no_currency else rate)
|
||||
return rates
|
||||
if with_no_currency:
|
||||
currencies.append(self.no_currency)
|
||||
return currencies
|
||||
|
||||
def exchange_currency(self, amount, source_currency, dest_currency):
|
||||
if (
|
||||
|
|
|
@ -6,32 +6,43 @@ SECRET_KEY = "tralala"
|
|||
MAIL_DEFAULT_SENDER = "Budget manager <admin@example.com>"
|
||||
SHOW_ADMIN_EMAIL = True
|
||||
ACTIVATE_DEMO_PROJECT = True
|
||||
ACTIVATE_ADMIN_DASHBOARD = False
|
||||
ADMIN_PASSWORD = ""
|
||||
ALLOW_PUBLIC_PROJECT_CREATION = True
|
||||
ACTIVATE_ADMIN_DASHBOARD = False
|
||||
SESSION_COOKIE_SECURE = True
|
||||
APPLICATION_ROOT = "/"
|
||||
ENABLE_CAPTCHA = False
|
||||
LEGAL_LINK = ""
|
||||
SUPPORTED_LANGUAGES = [
|
||||
"ca",
|
||||
"cs",
|
||||
"de",
|
||||
"el",
|
||||
"en",
|
||||
"eo",
|
||||
"es",
|
||||
"es_419",
|
||||
"fa",
|
||||
"fr",
|
||||
"he",
|
||||
"hi",
|
||||
"hu",
|
||||
"id",
|
||||
"it",
|
||||
"ja",
|
||||
"kn",
|
||||
"nb_NO",
|
||||
"nl",
|
||||
"pl",
|
||||
"pt",
|
||||
"pt_BR",
|
||||
"ru",
|
||||
"sr",
|
||||
"sv",
|
||||
"ta",
|
||||
"te",
|
||||
"th",
|
||||
"tr",
|
||||
"uk",
|
||||
"zh_Hans",
|
||||
]
|
||||
ENABLE_CAPTCHA = False
|
||||
LEGAL_LINK = ""
|
||||
|
|
|
@ -9,7 +9,7 @@ from flask_babel import lazy_gettext as _
|
|||
from flask_wtf.file import FileAllowed, FileField, FileRequired
|
||||
from flask_wtf.form import FlaskForm
|
||||
from markupsafe import Markup
|
||||
from werkzeug.security import check_password_hash, generate_password_hash
|
||||
from werkzeug.security import check_password_hash
|
||||
from wtforms.fields import (
|
||||
BooleanField,
|
||||
DateField,
|
||||
|
@ -39,10 +39,11 @@ from wtforms.validators import (
|
|||
)
|
||||
|
||||
from ihatemoney.currency_convertor import CurrencyConverter
|
||||
from ihatemoney.models import Bill, LoggingMode, Person, Project
|
||||
from ihatemoney.models import Bill, BillType, LoggingMode, Person, Project
|
||||
from ihatemoney.utils import (
|
||||
em_surround,
|
||||
eval_arithmetic_expression,
|
||||
generate_password_hash,
|
||||
render_localized_currency,
|
||||
slugify,
|
||||
)
|
||||
|
@ -66,6 +67,9 @@ def get_billform_for(project, set_default=True, **kwargs):
|
|||
if form.original_currency.data is None:
|
||||
form.original_currency.data = project.default_currency
|
||||
|
||||
# Used in validate_original_currency
|
||||
form.project_currency = project.default_currency
|
||||
|
||||
show_no_currency = form.original_currency.data == CurrencyConverter.no_currency
|
||||
|
||||
form.original_currency.choices = [
|
||||
|
@ -121,6 +125,11 @@ class CalculatorStringField(StringField):
|
|||
|
||||
class EditProjectForm(FlaskForm):
|
||||
name = StringField(_("Project name"), validators=[DataRequired()])
|
||||
current_password = PasswordField(
|
||||
_("Current private code"),
|
||||
description=_("Enter existing private code to edit project"),
|
||||
validators=[DataRequired()],
|
||||
)
|
||||
# If empty -> don't change the password
|
||||
password = PasswordField(
|
||||
_("New private code"),
|
||||
|
@ -154,6 +163,13 @@ class EditProjectForm(FlaskForm):
|
|||
for currency_name in self.currency_helper.get_currencies()
|
||||
]
|
||||
|
||||
def validate_current_password(self, field):
|
||||
project = Project.query.get(self.id.data)
|
||||
if project is None:
|
||||
raise ValidationError(_("Unknown error"))
|
||||
if not check_password_hash(project.password, self.current_password.data):
|
||||
raise ValidationError(_("Invalid private code."))
|
||||
|
||||
@property
|
||||
def logging_preference(self):
|
||||
"""Get the LoggingMode object corresponding to current form data."""
|
||||
|
@ -172,12 +188,20 @@ class EditProjectForm(FlaskForm):
|
|||
and field.data == CurrencyConverter.no_currency
|
||||
and project.has_multiple_currencies()
|
||||
):
|
||||
raise ValidationError(
|
||||
_(
|
||||
"This project cannot be set to 'no currency'"
|
||||
" because it contains bills in multiple currencies."
|
||||
)
|
||||
msg = _(
|
||||
"This project cannot be set to 'no currency'"
|
||||
" because it contains bills in multiple currencies."
|
||||
)
|
||||
raise ValidationError(msg)
|
||||
if (
|
||||
project is not None
|
||||
and field.data != project.default_currency
|
||||
and project.has_bills()
|
||||
):
|
||||
msg = _(
|
||||
"Cannot change project currency because currency conversion is broken"
|
||||
)
|
||||
raise ValidationError(msg)
|
||||
|
||||
def update(self, project):
|
||||
"""Update the project with the information from the form"""
|
||||
|
@ -212,7 +236,9 @@ class ImportProjectForm(FlaskForm):
|
|||
|
||||
class ProjectForm(EditProjectForm):
|
||||
id = StringField(_("Project identifier"), validators=[DataRequired()])
|
||||
# This field overrides the one from EditProjectForm
|
||||
# Remove this field that is inherited from EditProjectForm
|
||||
current_password = None
|
||||
# This field overrides the one from EditProjectForm (to make it mandatory)
|
||||
password = PasswordField(_("Private code"), validators=[DataRequired()])
|
||||
submit = SubmitField(_("Create the project"))
|
||||
|
||||
|
@ -338,6 +364,12 @@ class BillForm(FlaskForm):
|
|||
payed_for = SelectMultipleField(
|
||||
_("For whom?"), validators=[DataRequired()], coerce=int
|
||||
)
|
||||
bill_type = SelectField(
|
||||
_("Bill Type"),
|
||||
choices=BillType.choices(),
|
||||
coerce=BillType,
|
||||
default=BillType.EXPENSE,
|
||||
)
|
||||
submit = SubmitField(_("Submit"))
|
||||
submit2 = SubmitField(_("Submit and add a new one"))
|
||||
|
||||
|
@ -351,12 +383,14 @@ class BillForm(FlaskForm):
|
|||
payer_id=self.payer.data,
|
||||
project_default_currency=project.default_currency,
|
||||
what=self.what.data,
|
||||
bill_type=self.bill_type.data,
|
||||
)
|
||||
|
||||
def save(self, bill, project):
|
||||
bill.payer_id = self.payer.data
|
||||
bill.amount = self.amount.data
|
||||
bill.what = self.what.data
|
||||
bill.bill_type = BillType(self.bill_type.data)
|
||||
bill.external_link = self.external_link.data
|
||||
bill.date = self.date.data
|
||||
bill.owers = Person.query.get_by_ids(self.payed_for.data, project)
|
||||
|
@ -370,6 +404,7 @@ class BillForm(FlaskForm):
|
|||
self.payer.data = bill.payer_id
|
||||
self.amount.data = bill.amount
|
||||
self.what.data = bill.what
|
||||
self.bill_type.data = bill.bill_type
|
||||
self.external_link.data = bill.external_link
|
||||
self.original_currency.data = bill.original_currency
|
||||
self.date.data = bill.date
|
||||
|
@ -391,6 +426,17 @@ class BillForm(FlaskForm):
|
|||
# See https://github.com/python-babel/babel/issues/821
|
||||
raise ValidationError(f"Result is too high: {field.data}")
|
||||
|
||||
def validate_original_currency(self, field):
|
||||
# Workaround for currency API breakage
|
||||
# See #1232
|
||||
if field.data not in [CurrencyConverter.no_currency, self.project_currency]:
|
||||
msg = _(
|
||||
"Failed to convert from %(bill_currency)s currency to %(project_currency)s",
|
||||
bill_currency=field.data,
|
||||
project_currency=self.project_currency,
|
||||
)
|
||||
raise ValidationError(msg)
|
||||
|
||||
|
||||
class MemberForm(FlaskForm):
|
||||
name = StringField(_("Name"), validators=[DataRequired()], filters=[strip_filter])
|
||||
|
@ -432,7 +478,7 @@ class MemberForm(FlaskForm):
|
|||
|
||||
class InviteForm(FlaskForm):
|
||||
emails = StringField(_("People to notify"), render_kw={"class": "tag"})
|
||||
submit = SubmitField(_("Send invites"))
|
||||
submit = SubmitField(_("Send the invitations"))
|
||||
|
||||
def validate_emails(self, field):
|
||||
for email in [email.strip() for email in self.emails.data.split(",")]:
|
||||
|
|
|
@ -83,10 +83,26 @@ def get_history(project, human_readable_names=True):
|
|||
"time": version.transaction.issued_at,
|
||||
"operation_type": version.operation_type,
|
||||
"object_type": object_type,
|
||||
"bill_details": None,
|
||||
"object_desc": object_str,
|
||||
"ip": version.transaction.remote_addr,
|
||||
}
|
||||
|
||||
if object_type == "Bill":
|
||||
if version.operation_type == Operation.INSERT or not version.previous:
|
||||
detailed_version = version
|
||||
else:
|
||||
detailed_version = version.previous
|
||||
details = {
|
||||
"date": detailed_version.date,
|
||||
"payer": describe_version(detailed_version.payer),
|
||||
"amount": detailed_version.amount,
|
||||
"owers": [describe_version(o) for o in detailed_version.owers],
|
||||
"external_link": detailed_version.external_link,
|
||||
"original_currency": detailed_version.original_currency,
|
||||
}
|
||||
common_properties["bill_details"] = details
|
||||
|
||||
if version.operation_type == Operation.UPDATE:
|
||||
# Only iterate the changeset if the previous version
|
||||
# Was logged
|
||||
|
|
|
@ -7,11 +7,10 @@ import sys
|
|||
|
||||
import click
|
||||
from flask.cli import FlaskGroup
|
||||
from werkzeug.security import generate_password_hash
|
||||
|
||||
from ihatemoney.models import Project, db
|
||||
from ihatemoney.run import create_app
|
||||
from ihatemoney.utils import create_jinja_env
|
||||
from ihatemoney.utils import create_jinja_env, generate_password_hash
|
||||
|
||||
|
||||
@click.group(cls=FlaskGroup, create_app=create_app)
|
||||
|
@ -33,14 +32,14 @@ def runserver(ctx):
|
|||
ctx.forward(run)
|
||||
|
||||
|
||||
@click.command(name="generate_password_hash")
|
||||
@cli.command(name="generate_password_hash")
|
||||
def password_hash():
|
||||
"""Get password from user and hash it without printing it in clear text."""
|
||||
password = getpass.getpass(prompt="Password: ")
|
||||
print(generate_password_hash(password))
|
||||
|
||||
|
||||
@click.command()
|
||||
@cli.command()
|
||||
@click.argument(
|
||||
"config_file",
|
||||
type=click.Choice(
|
||||
|
|
|
@ -10,6 +10,12 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr ""
|
||||
|
||||
msgid "Current private code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr ""
|
||||
|
||||
|
@ -31,6 +37,12 @@ msgstr ""
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
|
@ -66,12 +78,6 @@ msgstr ""
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr ""
|
||||
|
||||
msgid "Get in"
|
||||
msgstr ""
|
||||
|
||||
|
@ -130,9 +136,6 @@ msgstr ""
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr ""
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
|
@ -154,7 +157,7 @@ msgstr ""
|
|||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -238,6 +241,9 @@ msgstr ""
|
|||
msgid "Password successfully reset."
|
||||
msgstr ""
|
||||
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
|
@ -379,9 +385,6 @@ msgstr ""
|
|||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid " show"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
msgstr ""
|
||||
|
||||
|
@ -424,7 +427,7 @@ msgstr ""
|
|||
msgid "Privacy Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the project"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
|
@ -463,9 +466,6 @@ msgstr ""
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
|
@ -530,23 +530,18 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -739,6 +734,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
|
@ -761,7 +759,7 @@ msgstr ""
|
|||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -815,13 +813,10 @@ msgstr ""
|
|||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgid "Add the first participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password reminder"
|
||||
|
@ -844,40 +839,48 @@ msgstr ""
|
|||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"On a mobile device, with <a href=\"%(download_mobile)s\">a compatible app"
|
||||
" installed</a>."
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr ""
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
"""new bill type attribute added
|
||||
|
||||
Revision ID: 7a9b38559992
|
||||
Revises: 927ed575acbd
|
||||
Create Date: 2022-12-10 17:25:38.387643
|
||||
|
||||
"""
|
||||
|
||||
# revision identifiers, used by Alembic.
|
||||
revision = "7a9b38559992"
|
||||
down_revision = "927ed575acbd"
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from ihatemoney.models import BillType
|
||||
|
||||
|
||||
def upgrade():
|
||||
billtype_enum = sa.Enum(BillType)
|
||||
billtype_enum.create(op.get_bind(), checkfirst=True)
|
||||
|
||||
op.add_column(
|
||||
"bill",
|
||||
sa.Column("bill_type", billtype_enum, server_default=BillType.EXPENSE.name),
|
||||
)
|
||||
op.add_column("bill_version", sa.Column("bill_type", sa.UnicodeText()))
|
||||
|
||||
|
||||
def downgrade():
|
||||
op.drop_column("bill", "bill_type")
|
||||
op.drop_column("bill_version", "bill_type")
|
||||
|
||||
billtype_enum = sa.Enum(BillType)
|
||||
billtype_enum.drop(op.get_bind())
|
|
@ -1,5 +1,6 @@
|
|||
from collections import defaultdict
|
||||
import datetime
|
||||
from enum import Enum
|
||||
import itertools
|
||||
|
||||
from dateutil.parser import parse
|
||||
|
@ -18,11 +19,10 @@ from sqlalchemy import orm
|
|||
from sqlalchemy.sql import func
|
||||
from sqlalchemy_continuum import make_versioned, version_class
|
||||
from sqlalchemy_continuum.plugins import FlaskPlugin
|
||||
from werkzeug.security import generate_password_hash
|
||||
|
||||
from ihatemoney.currency_convertor import CurrencyConverter
|
||||
from ihatemoney.monkeypath_continuum import PatchedTransactionFactory
|
||||
from ihatemoney.utils import get_members, same_bill
|
||||
from ihatemoney.utils import generate_password_hash, get_members, same_bill
|
||||
from ihatemoney.versioning import (
|
||||
ConditionalVersioningManager,
|
||||
LoggingMode,
|
||||
|
@ -51,6 +51,16 @@ make_versioned(
|
|||
],
|
||||
)
|
||||
|
||||
|
||||
class BillType(Enum):
|
||||
EXPENSE = "Expense"
|
||||
REIMBURSEMENT = "Reimbursement"
|
||||
|
||||
@classmethod
|
||||
def choices(cls):
|
||||
return [(choice.value, choice.value) for choice in cls]
|
||||
|
||||
|
||||
db = SQLAlchemy()
|
||||
|
||||
|
||||
|
@ -113,22 +123,33 @@ class Project(db.Model):
|
|||
- dict mapping each member to how much he/she should be paid by
|
||||
others (i.e. how much he/she has paid for bills)
|
||||
|
||||
balance spent paid
|
||||
"""
|
||||
balances, should_pay, should_receive = (defaultdict(int) for time in (1, 2, 3))
|
||||
|
||||
for bill in self.get_bills_unordered().all():
|
||||
should_receive[bill.payer.id] += bill.converted_amount
|
||||
total_weight = sum(ower.weight for ower in bill.owers)
|
||||
for ower in bill.owers:
|
||||
should_pay[ower.id] += (
|
||||
ower.weight * bill.converted_amount / total_weight
|
||||
)
|
||||
|
||||
if bill.bill_type == BillType.EXPENSE:
|
||||
should_receive[bill.payer.id] += bill.converted_amount
|
||||
for ower in bill.owers:
|
||||
should_pay[ower.id] += (
|
||||
ower.weight * bill.converted_amount / total_weight
|
||||
)
|
||||
|
||||
if bill.bill_type == BillType.REIMBURSEMENT:
|
||||
should_receive[bill.payer.id] += bill.converted_amount
|
||||
for ower in bill.owers:
|
||||
should_receive[ower.id] -= bill.converted_amount
|
||||
|
||||
for person in self.members:
|
||||
balance = should_receive[person.id] - should_pay[person.id]
|
||||
balances[person.id] = balance
|
||||
|
||||
return balances, should_pay, should_receive
|
||||
return (
|
||||
balances,
|
||||
should_pay,
|
||||
should_receive,
|
||||
)
|
||||
|
||||
@property
|
||||
def balance(self):
|
||||
|
@ -161,7 +182,8 @@ class Project(db.Model):
|
|||
"""
|
||||
monthly = defaultdict(lambda: defaultdict(float))
|
||||
for bill in self.get_bills_unordered().all():
|
||||
monthly[bill.date.year][bill.date.month] += bill.converted_amount
|
||||
if bill.bill_type == BillType.EXPENSE:
|
||||
monthly[bill.date.year][bill.date.month] += bill.converted_amount
|
||||
return monthly
|
||||
|
||||
@property
|
||||
|
@ -187,7 +209,6 @@ class Project(db.Model):
|
|||
)
|
||||
return pretty_transactions
|
||||
|
||||
# cache value for better performance
|
||||
members = {person.id: person for person in self.members}
|
||||
settle_plan = settle(self.balance.items()) or []
|
||||
|
||||
|
@ -203,22 +224,6 @@ class Project(db.Model):
|
|||
|
||||
return prettify(transactions, pretty_output)
|
||||
|
||||
def exactmatch(self, credit, debts):
|
||||
"""Recursively try and find subsets of 'debts' whose sum is equal to credit"""
|
||||
if not debts:
|
||||
return None
|
||||
if debts[0]["balance"] > credit:
|
||||
return self.exactmatch(credit, debts[1:])
|
||||
elif debts[0]["balance"] == credit:
|
||||
return [debts[0]]
|
||||
else:
|
||||
match = self.exactmatch(credit - debts[0]["balance"], debts[1:])
|
||||
if match:
|
||||
match.append(debts[0])
|
||||
else:
|
||||
match = self.exactmatch(credit, debts[1:])
|
||||
return match
|
||||
|
||||
def has_bills(self):
|
||||
"""return if the project do have bills or not"""
|
||||
return self.get_bills_unordered().count() > 0
|
||||
|
@ -337,6 +342,7 @@ class Project(db.Model):
|
|||
pretty_bills.append(
|
||||
{
|
||||
"what": bill.what,
|
||||
"bill_type": bill.bill_type.value,
|
||||
"amount": round(bill.amount, 2),
|
||||
"currency": bill.original_currency,
|
||||
"date": str(bill.date),
|
||||
|
@ -408,6 +414,7 @@ class Project(db.Model):
|
|||
new_bill = Bill(
|
||||
amount=b["amount"],
|
||||
date=parse(b["date"]),
|
||||
bill_type=b["bill_type"],
|
||||
external_link="",
|
||||
original_currency=b["currency"],
|
||||
owers=Person.query.get_by_names(b["owers"], self),
|
||||
|
@ -453,7 +460,8 @@ class Project(db.Model):
|
|||
"""Generate a timed and serialized JsonWebToken
|
||||
|
||||
:param token_type: Either "auth" for authentication (invalidated when project code changed),
|
||||
or "reset" for password reset (invalidated after expiration)
|
||||
or "reset" for password reset (invalidated after expiration),
|
||||
or "feed" for project feeds (invalidated when project code changed)
|
||||
"""
|
||||
|
||||
if token_type == "reset":
|
||||
|
@ -476,9 +484,10 @@ class Project(db.Model):
|
|||
|
||||
:param token: Serialized TimedJsonWebToken
|
||||
:param token_type: Either "auth" for authentication (invalidated when project code changed),
|
||||
or "reset" for password reset (invalidated after expiration)
|
||||
:param project_id: Project ID. Used for token_type "auth" to use the password as serializer
|
||||
secret key.
|
||||
or "reset" for password reset (invalidated after expiration),
|
||||
or "feed" for project feeds (invalidated when project code changed)
|
||||
:param project_id: Project ID. Used for token_type "auth" and "feed" to use the password
|
||||
as serializer secret key.
|
||||
:param max_age: Token expiration time (in seconds). Only used with token_type "reset"
|
||||
"""
|
||||
loads_kwargs = {}
|
||||
|
@ -536,14 +545,15 @@ class Project(db.Model):
|
|||
db.session.commit()
|
||||
|
||||
operations = (
|
||||
("Georg", 200, ("Amina", "Georg", "Alice"), "Food shopping"),
|
||||
("Alice", 20, ("Amina", "Alice"), "Beer !"),
|
||||
("Amina", 50, ("Amina", "Alice", "Georg"), "AMAP"),
|
||||
("Georg", 200, ("Amina", "Georg", "Alice"), "Food shopping", "Expense"),
|
||||
("Alice", 20, ("Amina", "Alice"), "Beer !", "Expense"),
|
||||
("Amina", 50, ("Amina", "Alice", "Georg"), "AMAP", "Expense"),
|
||||
)
|
||||
for payer, amount, owers, what in operations:
|
||||
for payer, amount, owers, what, bill_type in operations:
|
||||
db.session.add(
|
||||
Bill(
|
||||
amount=amount,
|
||||
bill_type=bill_type,
|
||||
original_currency=project.default_currency,
|
||||
owers=[members[name] for name in owers],
|
||||
payer_id=members[payer].id,
|
||||
|
@ -676,6 +686,7 @@ class Bill(db.Model):
|
|||
date = db.Column(db.Date, default=datetime.datetime.now)
|
||||
creation_date = db.Column(db.Date, default=datetime.datetime.now)
|
||||
what = db.Column(db.UnicodeText)
|
||||
bill_type = db.Column(db.Enum(BillType))
|
||||
external_link = db.Column(db.UnicodeText)
|
||||
|
||||
original_currency = db.Column(db.String(3))
|
||||
|
@ -695,6 +706,7 @@ class Bill(db.Model):
|
|||
payer_id: int = None,
|
||||
project_default_currency: str = "",
|
||||
what: str = "",
|
||||
bill_type: str = "Expense",
|
||||
):
|
||||
super().__init__()
|
||||
self.amount = amount
|
||||
|
@ -704,6 +716,7 @@ class Bill(db.Model):
|
|||
self.owers = owers
|
||||
self.payer_id = payer_id
|
||||
self.what = what
|
||||
self.bill_type = BillType(bill_type)
|
||||
self.converted_amount = self.currency_helper.exchange_currency(
|
||||
self.amount, self.original_currency, project_default_currency
|
||||
)
|
||||
|
@ -718,6 +731,7 @@ class Bill(db.Model):
|
|||
"date": self.date,
|
||||
"creation_date": self.creation_date,
|
||||
"what": self.what,
|
||||
"bill_type": self.bill_type.value,
|
||||
"external_link": self.external_link,
|
||||
"original_currency": self.original_currency,
|
||||
"converted_amount": self.converted_amount,
|
||||
|
|
|
@ -424,6 +424,15 @@ footer .footer-left {
|
|||
display: table-cell;
|
||||
}
|
||||
|
||||
/* used to tuncate long urls */
|
||||
.truncated {
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
max-width: 250px;
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
.balance .balance-value {
|
||||
text-align: right;
|
||||
|
|
|
@ -34,7 +34,7 @@
|
|||
|
||||
<button class="delete">{{ _("Delete project") }}</button>
|
||||
</form>
|
||||
<a class="show" href="{{ url_for('.list_bills', project_id=project.id) }}" title="{{ _(" show") }}">{{
|
||||
<a class="show" href="{{ url_for('.list_bills', project_id=project.id) }}" title="{{ _("show") }}">{{
|
||||
_('show') }}</a>
|
||||
</td>
|
||||
</tr>
|
||||
|
@ -51,4 +51,4 @@
|
|||
{% else %}
|
||||
<div class="alert alert-danger">{{ _("The Dashboard is currently deactivated.") }}</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -100,8 +100,9 @@
|
|||
</div>
|
||||
|
||||
{{ input(form.default_currency) }}
|
||||
{{ input(form.current_password) }}
|
||||
<div class="actions">
|
||||
<button class="btn btn-primary">{{ _("Edit the project") }}</button>
|
||||
<button class="btn btn-primary">{{ _("Save changes") }}</button>
|
||||
</div>
|
||||
|
||||
{% endmacro %}
|
||||
|
@ -113,7 +114,7 @@
|
|||
{{ form.hidden_tag() }}
|
||||
{{ input(form.password) }}
|
||||
<div class="actions">
|
||||
<button class="btn btn-primary">{{ _("Delete project") }}</button>
|
||||
<button class="btn btn-danger">{{ _("Delete project") }}</button>
|
||||
</div>
|
||||
|
||||
{% endmacro %}
|
||||
|
@ -164,6 +165,7 @@
|
|||
{% include "display_errors.html" %}
|
||||
{{ form.hidden_tag() }}
|
||||
{{ input(form.date, inline=True) }}
|
||||
{{ input(form.bill_type, inline=True) }}
|
||||
{{ input(form.what, inline=True) }}
|
||||
{{ input(form.payer, inline=True, class="form-control custom-select") }}
|
||||
<div data-toggle="tooltip" data-placement="top" title='{{ _("Simple operations are allowed, e.g. (18+36.2)/3") }}'>
|
||||
|
@ -178,7 +180,11 @@
|
|||
<a class="badge badge-secondary" href="#" id="selectnone" onclick="selectCheckboxes(false)">{{_("No one")}}</a>
|
||||
</p>
|
||||
<div class="d-flex flex-column flex-wrap overflow-auto" style="max-height: 20em;">
|
||||
{% for key, value, checked in form.payed_for.iter_choices() | sort(attribute='1') %}
|
||||
{% for choices in form.payed_for.iter_choices() | sort(attribute='1') %}
|
||||
{# Compatibility with wtforms<3.1 #}
|
||||
{% set key = choices[0] %}
|
||||
{% set value = choices[1] %}
|
||||
{% set checked = choices[2] %}
|
||||
<p class="form-check text-break" style="max-width: 50%;">
|
||||
<label for="payed_for-{{key}}" class="form-check-label">
|
||||
<input name="payed_for" type="checkbox" {% if checked %}checked{% endif %} class="form-check-input" value="{{key}}" id="payed_for-{{key}}"/>
|
||||
|
|
|
@ -91,6 +91,21 @@
|
|||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
{% macro bill_details(details, before=False) %}
|
||||
{% set owers_list_str=details.owers|localize_list|safe %}
|
||||
<details class="small">
|
||||
<summary>{% if before %} {{ _("Details of the bill (before the change)") }} {% else %} {{ _("Details of the bill") }} {% endif %}</summary>
|
||||
{{ _("Date:") }} {{ details.date|em_surround }}.
|
||||
{{ _("Payer:") }} {{ details.payer|em_surround }}.
|
||||
{{ _("Amount:") }} {{ details.amount|currency(details.original_currency)|em_surround }}.
|
||||
{{ _("Owers:") }} {{ owers_list_str }}.
|
||||
{% if details.external_link %}
|
||||
{{ _("External link:") }}
|
||||
<a class="truncated" href="{{ details.external_link }}">{{ details.external_link }}</a>
|
||||
{% endif %}
|
||||
</details>
|
||||
{% endmacro %}
|
||||
|
||||
{% block sidebar %}
|
||||
<div id="table_overflow">
|
||||
{{ balance_table(show_weight=False, show_header=True) }}
|
||||
|
@ -103,18 +118,17 @@
|
|||
{% if current_log_pref == LoggingMode.DISABLED or (current_log_pref != LoggingMode.RECORD_IP and any_ip_addresses) %}
|
||||
<div id="history_warnings" class="card card-body bg-light">
|
||||
{% if current_log_pref == LoggingMode.DISABLED %}
|
||||
<p>{% set url = url_for(".edit_project") %}
|
||||
{% trans %}
|
||||
<i>This project has history disabled. New actions won't appear below. You can enable history on the</i>
|
||||
<a href="{{ url }}">settings page</a>
|
||||
{% endtrans %}
|
||||
<p>
|
||||
<i>{{ _("This project has history disabled. New actions won't appear below.") }}
|
||||
<a href="{{ url_for(".edit_project") }}">{{ _("You can enable history on the settings page.") }}</a>
|
||||
</i>
|
||||
</p>
|
||||
{% if history %}
|
||||
<p>
|
||||
{% trans %}
|
||||
<i>The table below reflects actions recorded prior to disabling project history. You can
|
||||
<a href="#" data-toggle="modal" data-keyboard="false" data-target="#confirm-erase">clear project history</a> to remove them.</i></p>
|
||||
{% endtrans %}
|
||||
<i>{{ _("The table below reflects actions recorded prior to disabling project history.") }}
|
||||
<a href="#" data-toggle="modal" data-keyboard="false" data-target="#confirm-erase">{{ _("You can clear the project history to remove them.") }}</a>
|
||||
</i>
|
||||
</p>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if current_log_pref != LoggingMode.RECORD_IP and any_ip_addresses %}
|
||||
|
@ -178,13 +192,16 @@
|
|||
{% trans %}Project {{ name }} added{% endtrans %}
|
||||
{% elif event.object_type == "Bill" %}
|
||||
{% trans %}Bill {{ name }} added{% endtrans %}
|
||||
{{ bill_details(event.bill_details) }}
|
||||
|
||||
{% elif event.object_type == "Person" %}
|
||||
{% trans %}Participant {{ name }} added{% endtrans %}
|
||||
{% endif %}
|
||||
|
||||
{% elif event.operation_type == OperationType.UPDATE %}
|
||||
{% if event.object_type == "Project" %}
|
||||
{% if event.prop_changed == "password" %}
|
||||
{{ _("Project private code changed") }}
|
||||
{{ _("Project private code changed") }}
|
||||
{% elif event.prop_changed == "logging_preference" %}
|
||||
{{ change_to_logging_preference(event) }}
|
||||
{% elif event.prop_changed == "name" %}
|
||||
|
@ -196,51 +213,58 @@
|
|||
{% else %}
|
||||
{{ _("Project settings modified") }}
|
||||
{% endif %}
|
||||
{% elif event.prop_changed == "activated" %}
|
||||
{% if event.val_after == False %}
|
||||
{% trans %}Participant {{ name }} deactivated{% endtrans %}
|
||||
{% else %}
|
||||
{% trans %}Participant {{ name }} reactivated{% endtrans %}
|
||||
{% endif %}
|
||||
{% elif event.prop_changed == "name" %}
|
||||
{% set new_name=event.val_after|em_surround %}
|
||||
{% trans %}Participant {{ name }} renamed to {{ new_name }}{% endtrans %}
|
||||
{% elif event.prop_changed == "what" %}
|
||||
{% elif event.object_type == "Bill" %}
|
||||
{% if event.prop_changed == "what" %}
|
||||
{% set new_description=event.val_after|em_surround %}
|
||||
{% trans %}Bill {{ name }} renamed to {{ new_description }}{% endtrans %}
|
||||
{% elif event.prop_changed == "weight" %}
|
||||
{% set old_weight=event.val_before|em_surround %}
|
||||
{% set new_weight=event.val_after|em_surround %}
|
||||
{% trans %}Participant {{ name }}: weight changed from {{ old_weight }} to {{ new_weight }}{% endtrans %}
|
||||
{% elif event.prop_changed == "external_link" %}
|
||||
{{ bill_property_change(event, _("External link"), None, "<a href='{link}' >{link}</a>".format(link=event.val_after | escape) | safe | em_surround) }}
|
||||
{% elif event.prop_changed == "owers_added" %}
|
||||
{{ owers_changed(event, True)}}
|
||||
{% elif event.prop_changed == "owers_removed" %}
|
||||
{{ owers_changed(event, False)}}
|
||||
{% elif event.prop_changed == "payer" %}
|
||||
{{ bill_property_change(event, _("Payer"))}}
|
||||
{% elif event.prop_changed == "amount" %}
|
||||
{{ bill_property_change(event, _("Amount")) }}
|
||||
{% elif event.prop_changed == "date" %}
|
||||
{{ bill_property_change(event, _("Date")) }}
|
||||
{% elif event.prop_changed == "original_currency" %}
|
||||
{{ bill_property_change(event, _("Currency")) }}
|
||||
{% elif event.prop_changed == "converted_amount" %}
|
||||
{{ bill_property_change(event, _("Amount in %(currency)s", currency=g.project.default_currency)) }}
|
||||
{% else %}
|
||||
{% if event.object_type == "Bill" %}
|
||||
{% elif event.prop_changed == "external_link" %}
|
||||
{{ bill_property_change(event, _("External link"), None, "<a class='truncated' href='{link}' >{link}</a>".format(link=event.val_after | escape) | safe | em_surround) }}
|
||||
{% elif event.prop_changed == "owers_added" %}
|
||||
{{ owers_changed(event, True)}}
|
||||
{% elif event.prop_changed == "owers_removed" %}
|
||||
{{ owers_changed(event, False)}}
|
||||
{% elif event.prop_changed == "payer" %}
|
||||
{{ bill_property_change(event, _("Payer"))}}
|
||||
{% elif event.prop_changed == "amount" %}
|
||||
{{ bill_property_change(event, _("Amount")) }}
|
||||
{% elif event.prop_changed == "date" %}
|
||||
{{ bill_property_change(event, _("Date")) }}
|
||||
{% elif event.prop_changed == "original_currency" %}
|
||||
{{ bill_property_change(event, _("Currency")) }}
|
||||
{% elif event.prop_changed == "converted_amount" %}
|
||||
{{ bill_property_change(event, _("Amount in %(currency)s", currency=g.project.default_currency)) }}
|
||||
{% else %}
|
||||
{% trans %}Bill {{ name }} modified{% endtrans %}
|
||||
{% elif event.object_type == "Person" %}
|
||||
{% endif %}
|
||||
{{ bill_details(event.bill_details, before=True) }}
|
||||
|
||||
{% elif event.object_type == "Person" %}
|
||||
{% if event.prop_changed == "activated" %}
|
||||
{% if event.val_after == False %}
|
||||
{% trans %}Participant {{ name }} deactivated{% endtrans %}
|
||||
{% else %}
|
||||
{% trans %}Participant {{ name }} reactivated{% endtrans %}
|
||||
{% endif %}
|
||||
{% elif event.prop_changed == "name" %}
|
||||
{% set new_name=event.val_after|em_surround %}
|
||||
{% trans %}Participant {{ name }} renamed to {{ new_name }}{% endtrans %}
|
||||
{% elif event.prop_changed == "weight" %}
|
||||
{% set old_weight=event.val_before|em_surround %}
|
||||
{% set new_weight=event.val_after|em_surround %}
|
||||
{% trans %}Participant {{ name }}: weight changed from {{ old_weight }} to {{ new_weight }}{% endtrans %}
|
||||
{% else %}
|
||||
{% trans %}Participant {{ name }} modified{% endtrans %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
{% elif event.operation_type == OperationType.DELETE %}
|
||||
{% if event.object_type == "Bill" %}
|
||||
{% trans %}Bill {{ name }} removed{% endtrans %}
|
||||
{{ bill_details(event.bill_details) }}
|
||||
{% elif event.object_type == "Person" %}
|
||||
{% trans %}Participant {{ name }} removed{% endtrans %}
|
||||
{% endif %}
|
||||
|
||||
{% else %}
|
||||
{# Should be unreachable #}
|
||||
{% if event.object_type == "Project" %}
|
||||
|
|
|
@ -103,6 +103,7 @@
|
|||
{% if g.project %}
|
||||
<li><a class="dropdown-item" href="{{ url_for("main.history") }}">{{ _("History") }}</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for("main.edit_project") }}">{{ _("Settings") }}</a></li>
|
||||
<li><a class="dropdown-item" href="{{ url_for("main.feed", token=g.project.generate_token("feed")) }}">{{ _("RSS Feed") }}</a></li>
|
||||
{% endif %}
|
||||
|
||||
{% if session['projects'] and not ((session['projects'] | length) == 1 and g.project and g.project.id in session['projects']) %}
|
||||
|
@ -118,12 +119,14 @@
|
|||
{% if session['is_admin'] %}
|
||||
<li><a class="dropdown-item" href="{{ url_for("main.dashboard") }}">{{ _("Dashboard") }}</a></li>
|
||||
{% endif %}
|
||||
{% if g.logout_form %}
|
||||
<li>
|
||||
<form action="{{ url_for("main.exit") }}" method="post">
|
||||
{{ g.logout_form.hidden_tag() }}
|
||||
{{ g.logout_form.submit(class="dropdown-item") }}
|
||||
</form>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
@ -165,7 +168,7 @@
|
|||
<i class="icon book">{{ static_include("images/book.svg") | safe }}</i>
|
||||
</a>
|
||||
{% if g.show_admin_dashboard_link %}
|
||||
<a target="_blank" rel="noopener" data-toggle="tooltip" data-placement="top" title="{{ _('Administation Dashboard') }}" href="{{ url_for('main.dashboard') }}">
|
||||
<a target="_blank" rel="noopener" data-toggle="tooltip" data-placement="top" title="{{ _('Administration Dashboard') }}" href="{{ url_for('main.dashboard') }}">
|
||||
<i class="icon admin">{{ static_include("images/cog.svg") | safe }}</i>
|
||||
</a>
|
||||
{% endif %}
|
||||
|
|
|
@ -11,6 +11,11 @@
|
|||
{% block js %}
|
||||
{% if add_bill %} $('#new-bill > a').click(); {% endif %}
|
||||
|
||||
// focus on first field when adding a bill
|
||||
$("#bill-form").on('shown.bs.modal', function(){
|
||||
$(this).find('#what').focus();
|
||||
});
|
||||
|
||||
// ask for confirmation before removing an user
|
||||
$('.action.delete').each(function(){
|
||||
var link = $(this).find('button');
|
||||
|
@ -44,6 +49,9 @@
|
|||
|
||||
{% endblock %}
|
||||
|
||||
{% block head %}
|
||||
<link href="{{ url_for(".feed", token=g.project.generate_token("feed")) }}" type="application/rss+xml" rel="alternate" title="{{ g.project.name }}" />
|
||||
{% endblock %}
|
||||
|
||||
{% block sidebar %}
|
||||
<div class="sidebar_content">
|
||||
|
@ -98,7 +106,7 @@
|
|||
</ul>
|
||||
{% endif %}
|
||||
<span id="new-bill" class="ml-auto pb-2" {% if not g.project.members %} data-toggle="tooltip" title="{{_('You should start by adding participants')}}" {% endif %}>
|
||||
<a href="{{ url_for('.add_bill') }}" class="btn btn-primary {% if not g.project.members %} disabled {% endif %}" data-toggle="modal" data-keyboard="false" data-target="#bill-form">
|
||||
<a href="{{ url_for('.add_bill') }}" class="btn btn-primary {% if not g.project.members %} disabled {% endif %}" data-toggle="modal" data-keyboard="true" data-target="#bill-form" autofocus>
|
||||
<i class="icon icon-white before-text">{{ static_include("images/plus.svg") | safe }}</i>
|
||||
{{ _("Add a new bill") }}
|
||||
</a>
|
||||
|
@ -161,13 +169,14 @@
|
|||
<h3>{{ _('No bills')}}</h3>
|
||||
<p>
|
||||
{{ _("Nothing to list yet.")}}<br />
|
||||
{{ _("You probably want to") }}
|
||||
{%- if g.project.members %} <a href="{{ url_for('.add_bill') }}" data-toggle="modal" data-target="#bill-form">
|
||||
{{- _("add a bill") -}}
|
||||
</a> ?
|
||||
{% else %} <a href="{{ url_for('.add_member') }}">
|
||||
{{- _('add participants') -}}
|
||||
</a> ?
|
||||
{%- if g.project.members %}
|
||||
<a href="{{ url_for('.add_bill') }}" data-toggle="modal" data-target="#bill-form">
|
||||
{{- _("Add your first bill") -}}
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="{{ url_for('.add_member') }}">
|
||||
{{- _("Add the first participant") -}}
|
||||
</a>
|
||||
{%- endif -%}
|
||||
</p>
|
||||
</div>
|
||||
|
|
22
ihatemoney/templates/project_feed.xml
Normal file
22
ihatemoney/templates/project_feed.xml
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<rss version="2.0"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:atom="http://www.w3.org/2005/Atom"
|
||||
>
|
||||
<channel>
|
||||
<title>I Hate Money — {{ g.project.name }}</title>
|
||||
<description>{% trans project_name=g.project.name %}Latest bills from {{ project_name }}{% endtrans %}</description>
|
||||
<atom:link href="{{ url_for(".feed", token=g.project.generate_token("feed"), _external=True) }}" rel="self" type="application/rss+xml" />
|
||||
<link>{{ url_for(".list_bills", _external=True) }}</link>
|
||||
{% for (weights, bill) in bills.items -%}
|
||||
<item>
|
||||
<title>{{ bill.what }} - {{ bill.amount|currency(bill.original_currency) }}</title>
|
||||
<guid isPermaLink="false">{{ bill.id }}</guid>
|
||||
<dc:creator>{{ bill.payer }}</dc:creator>
|
||||
{% if bill.external_link %}<link>{{ bill.external_link }}</link>{% endif -%}
|
||||
<description>{{ bill.date|dateformat("long") }} - {{ bill.owers|join(', ', 'name') }} : {{ (bill.amount/weights)|currency(bill.original_currency) }}</description>
|
||||
<pubDate>{{ bill.creation_date.strftime("%a, %d %b %Y %T") }} +0000</pubDate>
|
||||
</item>
|
||||
{% endfor -%}
|
||||
</channel>
|
||||
</rss>
|
|
@ -7,20 +7,10 @@
|
|||
<tbody>
|
||||
<tr>
|
||||
<td>
|
||||
<h3>{{ _('Share Identifier & code') }}</h3>
|
||||
<h3>{{ _('Share an invitation link') }}</h3>
|
||||
</td>
|
||||
<td>
|
||||
{{ _("You can share the project identifier and the private code by any communication means.") }}
|
||||
<br />
|
||||
<strong>{{ _('Identifier:') }}</strong> <a href="{{ url_for("main.list_bills", project_id=g.project.id) }}">{{ g.project.id }}</a>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<h3>{{ _('Share the Link') }}</h3>
|
||||
</td>
|
||||
<td>
|
||||
{{ _("You can directly share the following link via your prefered medium") }}</br>
|
||||
{{ _("The easiest way to invite people is to give them the following invitation link.<br />They will be able to access the project, manage participants, add/edit/delete bills. However, they will not have access to important settings such as changing the private code or deleting the whole project.") }}</br>
|
||||
<a href="{{ url_for(".join_project", _external=True, project_id=g.project.id, token=g.project.generate_token()) }}">
|
||||
{{ url_for(".join_project", _external=True, project_id=g.project.id, token=g.project.generate_token()) }}
|
||||
</a>
|
||||
|
@ -29,7 +19,7 @@
|
|||
<tr>
|
||||
<td>
|
||||
<h3>{{ _('Scan QR code') }}</h3>
|
||||
<p><small>{% trans download_mobile=url_for(".mobile") %}On a mobile device, with <a href="{{ download_mobile }}">a compatible app installed</a>.{% endtrans %}</small></p>
|
||||
<p><small><a href="{{ url_for(".mobile") }}">{{ _("Use a mobile device with a compatible app.") }}</a></small></p>
|
||||
</td>
|
||||
<td>
|
||||
{{ qrcode | safe }}
|
||||
|
@ -40,14 +30,26 @@
|
|||
<h3>{{ _('Send via Emails') }}</h3>
|
||||
</td>
|
||||
<td>
|
||||
<p>{{ _("Specify a (comma separated) list of email adresses you want to notify about the
|
||||
creation of this budget management project and we will send them an email for you.") }}</p>
|
||||
<p>{{ _("Specify a list of email adresses (separated by comma) of people you want to notify about the creation of this project. We will send them an email with the invitation link.") }}</p>
|
||||
{% include "display_errors.html" %}
|
||||
<form class="invites form-horizontal" method="post" accept-charset="utf-8">
|
||||
{{ forms.invites(form) }}
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<h3>{{ _('Share Identifier & code') }}</h3>
|
||||
</td>
|
||||
<td>
|
||||
<p>{{ _("You can share the project identifier and the private code by any communication means.<br />Anyone with the private code will have access to the full project, including changing settings such as the private code or project email address, or even deleting the whole project.") }}</p>
|
||||
<p>
|
||||
<strong>{{ _('Identifier:') }}</strong> <a href="{{ url_for("main.list_bills", project_id=g.project.id) }}">{{ g.project.id }}</a>
|
||||
<br />
|
||||
<strong>{{ _('Private code:') }}</strong> {{ _('the private code was defined when you created the project') }}
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
|
|
|
@ -9,13 +9,20 @@
|
|||
|
||||
{% block content %}
|
||||
<table id="bill_table" class="split_bills table table-striped">
|
||||
<thead><tr><th>{{ _("Who pays?") }}</th><th>{{ _("To whom?") }}</th><th>{{ _("How much?") }}</th></tr></thead>
|
||||
<thead><tr><th>{{ _("Who pays?") }}</th><th>{{ _("To whom?") }}</th><th>{{ _("How much?") }}</th><th>{{ _("Settled?") }}</th></tr></thead>
|
||||
<tbody>
|
||||
{% for bill in bills %}
|
||||
<tr receiver={{bill.receiver.id}}>
|
||||
<td>{{ bill.ower }}</td>
|
||||
<td>{{ bill.receiver }}</td>
|
||||
<td>{{ bill.amount|currency }}</td>
|
||||
<td>
|
||||
<span id="settle-bill" class="ml-auto pb-2">
|
||||
<a href="{{ url_for('.settle', amount = bill.amount, ower_id = bill.ower.id, payer_id = bill.receiver.id) }}" class="btn btn-primary">
|
||||
{{ ("Settle") }}
|
||||
</a>
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
import base64
|
||||
import datetime
|
||||
import json
|
||||
import unittest
|
||||
|
||||
import pytest
|
||||
|
||||
from ihatemoney.tests.common.help_functions import em_surround
|
||||
from ihatemoney.tests.common.ihatemoney_testcase import IhatemoneyTestCase
|
||||
|
||||
|
||||
class APITestCase(IhatemoneyTestCase):
|
||||
class TestAPI(IhatemoneyTestCase):
|
||||
|
||||
"""Tests the API"""
|
||||
|
||||
|
@ -42,7 +43,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
def get_auth(self, username, password=None):
|
||||
password = password or username
|
||||
base64string = (
|
||||
base64.encodebytes(f"{username}:{password}".encode("utf-8"))
|
||||
base64.encodebytes(f"{username}:{password}".encode("utf-8")) # noqa: E231
|
||||
.decode("utf-8")
|
||||
.replace("\n", "")
|
||||
)
|
||||
|
@ -57,7 +58,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
resp = self.client.options(
|
||||
"/api/projects/raclette", headers=self.get_auth("raclette")
|
||||
)
|
||||
self.assertEqual(resp.headers["Access-Control-Allow-Origin"], "*")
|
||||
assert resp.headers["Access-Control-Allow-Origin"] == "*"
|
||||
|
||||
def test_basic_auth(self):
|
||||
# create a project
|
||||
|
@ -94,32 +95,32 @@ class APITestCase(IhatemoneyTestCase):
|
|||
},
|
||||
)
|
||||
|
||||
self.assertTrue(400, resp.status_code)
|
||||
self.assertEqual(
|
||||
'{"contact_email": ["Invalid email address."]}\n', resp.data.decode("utf-8")
|
||||
assert 400 == resp.status_code
|
||||
assert '{"contact_email": ["Invalid email address."]}\n' == resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
|
||||
# create it
|
||||
with self.app.mail.record_messages() as outbox:
|
||||
resp = self.api_create("raclette")
|
||||
self.assertTrue(201, resp.status_code)
|
||||
assert 201 == resp.status_code
|
||||
|
||||
# Check that email messages have been sent.
|
||||
self.assertEqual(len(outbox), 1)
|
||||
self.assertEqual(outbox[0].recipients, ["raclette@notmyidea.org"])
|
||||
assert len(outbox) == 1
|
||||
assert outbox[0].recipients == ["raclette@notmyidea.org"]
|
||||
|
||||
# create it twice should return a 400
|
||||
resp = self.api_create("raclette")
|
||||
|
||||
self.assertTrue(400, resp.status_code)
|
||||
self.assertIn("id", json.loads(resp.data.decode("utf-8")))
|
||||
assert 400 == resp.status_code
|
||||
assert "id" in json.loads(resp.data.decode("utf-8"))
|
||||
|
||||
# get information about it
|
||||
resp = self.client.get(
|
||||
"/api/projects/raclette", headers=self.get_auth("raclette")
|
||||
)
|
||||
|
||||
self.assertTrue(200, resp.status_code)
|
||||
assert 200 == resp.status_code
|
||||
expected = {
|
||||
"members": [],
|
||||
"name": "raclette",
|
||||
|
@ -129,9 +130,9 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"logging_preference": 1,
|
||||
}
|
||||
decoded_resp = json.loads(resp.data.decode("utf-8"))
|
||||
self.assertDictEqual(decoded_resp, expected)
|
||||
assert decoded_resp == expected
|
||||
|
||||
# edit should work
|
||||
# edit should fail if we don't provide the current private code
|
||||
resp = self.client.put(
|
||||
"/api/projects/raclette",
|
||||
data={
|
||||
|
@ -143,14 +144,43 @@ class APITestCase(IhatemoneyTestCase):
|
|||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
assert 400 == resp.status_code
|
||||
|
||||
self.assertEqual(200, resp.status_code)
|
||||
# edit should fail if we provide the wrong private code
|
||||
resp = self.client.put(
|
||||
"/api/projects/raclette",
|
||||
data={
|
||||
"contact_email": "yeah@notmyidea.org",
|
||||
"default_currency": "XXX",
|
||||
"current_password": "fromage aux patates",
|
||||
"password": "raclette",
|
||||
"name": "The raclette party",
|
||||
"project_history": "y",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
assert 400 == resp.status_code
|
||||
|
||||
# edit with the correct private code should work
|
||||
resp = self.client.put(
|
||||
"/api/projects/raclette",
|
||||
data={
|
||||
"contact_email": "yeah@notmyidea.org",
|
||||
"default_currency": "XXX",
|
||||
"current_password": "raclette",
|
||||
"password": "raclette",
|
||||
"name": "The raclette party",
|
||||
"project_history": "y",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
assert 200 == resp.status_code
|
||||
|
||||
resp = self.client.get(
|
||||
"/api/projects/raclette", headers=self.get_auth("raclette")
|
||||
)
|
||||
|
||||
self.assertEqual(200, resp.status_code)
|
||||
assert 200 == resp.status_code
|
||||
expected = {
|
||||
"name": "The raclette party",
|
||||
"contact_email": "yeah@notmyidea.org",
|
||||
|
@ -160,7 +190,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"logging_preference": 1,
|
||||
}
|
||||
decoded_resp = json.loads(resp.data.decode("utf-8"))
|
||||
self.assertDictEqual(decoded_resp, expected)
|
||||
assert decoded_resp == expected
|
||||
|
||||
# password change is possible via API
|
||||
resp = self.client.put(
|
||||
|
@ -168,18 +198,19 @@ class APITestCase(IhatemoneyTestCase):
|
|||
data={
|
||||
"contact_email": "yeah@notmyidea.org",
|
||||
"default_currency": "XXX",
|
||||
"current_password": "raclette",
|
||||
"password": "tartiflette",
|
||||
"name": "The raclette party",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
|
||||
self.assertEqual(200, resp.status_code)
|
||||
assert 200 == resp.status_code
|
||||
|
||||
resp = self.client.get(
|
||||
"/api/projects/raclette", headers=self.get_auth("raclette", "tartiflette")
|
||||
)
|
||||
self.assertEqual(200, resp.status_code)
|
||||
assert 200 == resp.status_code
|
||||
|
||||
# delete should work
|
||||
resp = self.client.delete(
|
||||
|
@ -190,21 +221,21 @@ class APITestCase(IhatemoneyTestCase):
|
|||
resp = self.client.get(
|
||||
"/api/projects/raclette", headers=self.get_auth("raclette")
|
||||
)
|
||||
self.assertEqual(401, resp.status_code)
|
||||
assert 401 == resp.status_code
|
||||
|
||||
def test_token_creation(self):
|
||||
"""Test that token of project is generated"""
|
||||
|
||||
# Create project
|
||||
resp = self.api_create("raclette")
|
||||
self.assertTrue(201, resp.status_code)
|
||||
assert 201 == resp.status_code
|
||||
|
||||
# Get token
|
||||
resp = self.client.get(
|
||||
"/api/projects/raclette/token", headers=self.get_auth("raclette")
|
||||
)
|
||||
|
||||
self.assertEqual(200, resp.status_code)
|
||||
assert 200 == resp.status_code
|
||||
|
||||
decoded_resp = json.loads(resp.data.decode("utf-8"))
|
||||
|
||||
|
@ -213,8 +244,22 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"/api/projects/raclette/token",
|
||||
headers={"Authorization": f"Basic {decoded_resp['token']}"},
|
||||
)
|
||||
assert 200 == resp.status_code
|
||||
|
||||
self.assertEqual(200, resp.status_code)
|
||||
# We shouldn't be able to edit project without private code
|
||||
resp = self.client.put(
|
||||
"/api/projects/raclette",
|
||||
data={
|
||||
"contact_email": "yeah@notmyidea.org",
|
||||
"default_currency": "XXX",
|
||||
"password": "tartiflette",
|
||||
"name": "The raclette party",
|
||||
},
|
||||
headers={"Authorization": f"Basic {decoded_resp['token']}"},
|
||||
)
|
||||
assert 400 == resp.status_code
|
||||
expected_resp = {"current_password": ["This field is required."]}
|
||||
assert expected_resp == json.loads(resp.data.decode("utf-8"))
|
||||
|
||||
def test_token_login(self):
|
||||
resp = self.api_create("raclette")
|
||||
|
@ -225,7 +270,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
decoded_resp = json.loads(resp.data.decode("utf-8"))
|
||||
resp = self.client.get(f"/raclette/join/{decoded_resp['token']}")
|
||||
# Test that we are redirected.
|
||||
self.assertEqual(302, resp.status_code)
|
||||
assert 302 == resp.status_code
|
||||
|
||||
def test_member(self):
|
||||
# create a project
|
||||
|
@ -237,7 +282,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
)
|
||||
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual("[]\n", req.data.decode("utf-8"))
|
||||
assert "[]\n" == req.data.decode("utf-8")
|
||||
|
||||
# add a member
|
||||
req = self.client.post(
|
||||
|
@ -248,7 +293,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# the id of the new member should be returned
|
||||
self.assertStatus(201, req)
|
||||
self.assertEqual("1\n", req.data.decode("utf-8"))
|
||||
assert "1\n" == req.data.decode("utf-8")
|
||||
|
||||
# the list of participants should contain one member
|
||||
req = self.client.get(
|
||||
|
@ -256,7 +301,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
)
|
||||
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual(len(json.loads(req.data.decode("utf-8"))), 1)
|
||||
assert len(json.loads(req.data.decode("utf-8"))) == 1
|
||||
|
||||
# Try to add another member with the same name.
|
||||
req = self.client.post(
|
||||
|
@ -269,7 +314,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
# edit the participant
|
||||
req = self.client.put(
|
||||
"/api/projects/raclette/members/1",
|
||||
data={"name": "Fred", "weight": 2},
|
||||
data={"name": "Jeanne", "weight": 2},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
|
||||
|
@ -281,14 +326,14 @@ class APITestCase(IhatemoneyTestCase):
|
|||
)
|
||||
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual("Fred", json.loads(req.data.decode("utf-8"))["name"])
|
||||
self.assertEqual(2, json.loads(req.data.decode("utf-8"))["weight"])
|
||||
assert "Jeanne" == json.loads(req.data.decode("utf-8"))["name"]
|
||||
assert 2 == json.loads(req.data.decode("utf-8"))["weight"]
|
||||
|
||||
# edit this member with same information
|
||||
# (test PUT idemopotence)
|
||||
# (test PUT idempotence)
|
||||
req = self.client.put(
|
||||
"/api/projects/raclette/members/1",
|
||||
data={"name": "Fred"},
|
||||
data={"name": "Jeanne"},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
|
||||
|
@ -297,7 +342,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
# de-activate the participant
|
||||
req = self.client.put(
|
||||
"/api/projects/raclette/members/1",
|
||||
data={"name": "Fred", "activated": False},
|
||||
data={"name": "Jeanne", "activated": False},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
self.assertStatus(200, req)
|
||||
|
@ -306,12 +351,12 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"/api/projects/raclette/members/1", headers=self.get_auth("raclette")
|
||||
)
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual(False, json.loads(req.data.decode("utf-8"))["activated"])
|
||||
assert not json.loads(req.data.decode("utf-8"))["activated"]
|
||||
|
||||
# re-activate the participant
|
||||
req = self.client.put(
|
||||
"/api/projects/raclette/members/1",
|
||||
data={"name": "Fred", "activated": True},
|
||||
data={"name": "Jeanne", "activated": True},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
|
||||
|
@ -319,7 +364,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"/api/projects/raclette/members/1", headers=self.get_auth("raclette")
|
||||
)
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual(True, json.loads(req.data.decode("utf-8"))["activated"])
|
||||
assert json.loads(req.data.decode("utf-8"))["activated"]
|
||||
|
||||
# delete a member
|
||||
|
||||
|
@ -335,7 +380,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
)
|
||||
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual("[]\n", req.data.decode("utf-8"))
|
||||
assert "[]\n" == req.data.decode("utf-8")
|
||||
|
||||
def test_bills(self):
|
||||
# create a project
|
||||
|
@ -343,7 +388,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# add participants
|
||||
self.api_add_member("raclette", "zorglub")
|
||||
self.api_add_member("raclette", "fred")
|
||||
self.api_add_member("raclette", "jeanne")
|
||||
self.api_add_member("raclette", "quentin")
|
||||
|
||||
# get the list of bills (should be empty)
|
||||
|
@ -352,7 +397,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
)
|
||||
self.assertStatus(200, req)
|
||||
|
||||
self.assertEqual("[]\n", req.data.decode("utf-8"))
|
||||
assert "[]\n" == req.data.decode("utf-8")
|
||||
|
||||
# add a bill
|
||||
req = self.client.post(
|
||||
|
@ -362,6 +407,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
"external_link": "https://raclette.fr",
|
||||
},
|
||||
|
@ -370,7 +416,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# should return the id
|
||||
self.assertStatus(201, req)
|
||||
self.assertEqual(req.data.decode("utf-8"), "1\n")
|
||||
assert req.data.decode("utf-8") == "1\n"
|
||||
|
||||
# get this bill details
|
||||
req = self.client.get(
|
||||
|
@ -384,8 +430,9 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"payer_id": 1,
|
||||
"owers": [
|
||||
{"activated": True, "id": 1, "name": "zorglub", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "fred", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "jeanne", "weight": 1},
|
||||
],
|
||||
"bill_type": "Expense",
|
||||
"amount": 25.0,
|
||||
"date": "2011-08-10",
|
||||
"id": 1,
|
||||
|
@ -395,19 +442,19 @@ class APITestCase(IhatemoneyTestCase):
|
|||
}
|
||||
|
||||
got = json.loads(req.data.decode("utf-8"))
|
||||
self.assertEqual(
|
||||
datetime.date.today(),
|
||||
datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date(),
|
||||
assert (
|
||||
datetime.date.today()
|
||||
== datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date()
|
||||
)
|
||||
del got["creation_date"]
|
||||
self.assertDictEqual(expected, got)
|
||||
assert expected == got
|
||||
|
||||
# the list of bills should length 1
|
||||
req = self.client.get(
|
||||
"/api/projects/raclette/bills", headers=self.get_auth("raclette")
|
||||
)
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual(1, len(json.loads(req.data.decode("utf-8"))))
|
||||
assert 1 == len(json.loads(req.data.decode("utf-8")))
|
||||
|
||||
# edit with errors should return an error
|
||||
req = self.client.put(
|
||||
|
@ -417,6 +464,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
"external_link": "https://raclette.fr",
|
||||
},
|
||||
|
@ -424,9 +472,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
)
|
||||
|
||||
self.assertStatus(400, req)
|
||||
self.assertEqual(
|
||||
'{"date": ["This field is required."]}\n', req.data.decode("utf-8")
|
||||
)
|
||||
assert '{"date": ["This field is required."]}\n' == req.data.decode("utf-8")
|
||||
|
||||
# edit a bill
|
||||
req = self.client.put(
|
||||
|
@ -436,6 +482,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "beer",
|
||||
"payer": "2",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
"external_link": "https://raclette.fr",
|
||||
},
|
||||
|
@ -455,8 +502,9 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"payer_id": 2,
|
||||
"owers": [
|
||||
{"activated": True, "id": 1, "name": "zorglub", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "fred", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "jeanne", "weight": 1},
|
||||
],
|
||||
"bill_type": "Expense",
|
||||
"amount": 25.0,
|
||||
"date": "2011-09-10",
|
||||
"external_link": "https://raclette.fr",
|
||||
|
@ -466,12 +514,12 @@ class APITestCase(IhatemoneyTestCase):
|
|||
}
|
||||
|
||||
got = json.loads(req.data.decode("utf-8"))
|
||||
self.assertEqual(
|
||||
creation_date,
|
||||
datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date(),
|
||||
assert (
|
||||
creation_date
|
||||
== datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date()
|
||||
)
|
||||
del got["creation_date"]
|
||||
self.assertDictEqual(expected, got)
|
||||
assert expected == got
|
||||
|
||||
# delete a bill
|
||||
req = self.client.delete(
|
||||
|
@ -491,7 +539,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# add participants
|
||||
self.api_add_member("raclette", "zorglub")
|
||||
self.api_add_member("raclette", "fred")
|
||||
self.api_add_member("raclette", "jeanne")
|
||||
|
||||
# valid amounts
|
||||
input_expected = [
|
||||
|
@ -511,6 +559,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": input_amount,
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
|
@ -518,7 +567,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# should return the id
|
||||
self.assertStatus(201, req)
|
||||
self.assertEqual(req.data.decode("utf-8"), "{}\n".format(id))
|
||||
assert req.data.decode("utf-8") == "{}\n".format(id)
|
||||
|
||||
# get this bill's details
|
||||
req = self.client.get(
|
||||
|
@ -533,8 +582,9 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"payer_id": 1,
|
||||
"owers": [
|
||||
{"activated": True, "id": 1, "name": "zorglub", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "fred", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "jeanne", "weight": 1},
|
||||
],
|
||||
"bill_type": "Expense",
|
||||
"amount": expected_amount,
|
||||
"date": "2011-08-10",
|
||||
"id": id,
|
||||
|
@ -544,12 +594,12 @@ class APITestCase(IhatemoneyTestCase):
|
|||
}
|
||||
|
||||
got = json.loads(req.data.decode("utf-8"))
|
||||
self.assertEqual(
|
||||
datetime.date.today(),
|
||||
datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date(),
|
||||
assert (
|
||||
datetime.date.today()
|
||||
== datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date()
|
||||
)
|
||||
del got["creation_date"]
|
||||
self.assertDictEqual(expected, got)
|
||||
assert expected == got
|
||||
|
||||
# should raise errors
|
||||
erroneous_amounts = [
|
||||
|
@ -568,28 +618,30 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": amount,
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
self.assertStatus(400, req)
|
||||
|
||||
@pytest.mark.skip(reason="Currency conversion is broken")
|
||||
def test_currencies(self):
|
||||
# check /currencies for list of supported currencies
|
||||
resp = self.client.get("/api/currencies")
|
||||
self.assertTrue(201, resp.status_code)
|
||||
self.assertIn("XXX", json.loads(resp.data.decode("utf-8")))
|
||||
assert 200 == resp.status_code
|
||||
assert "XXX" in json.loads(resp.data.decode("utf-8"))
|
||||
|
||||
# create project with a default currency
|
||||
resp = self.api_create("raclette", default_currency="EUR")
|
||||
self.assertTrue(201, resp.status_code)
|
||||
assert 201 == resp.status_code
|
||||
|
||||
# get information about it
|
||||
resp = self.client.get(
|
||||
"/api/projects/raclette", headers=self.get_auth("raclette")
|
||||
)
|
||||
|
||||
self.assertTrue(200, resp.status_code)
|
||||
assert 200 == resp.status_code
|
||||
expected = {
|
||||
"members": [],
|
||||
"name": "raclette",
|
||||
|
@ -599,11 +651,11 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"logging_preference": 1,
|
||||
}
|
||||
decoded_resp = json.loads(resp.data.decode("utf-8"))
|
||||
self.assertDictEqual(decoded_resp, expected)
|
||||
assert decoded_resp == expected
|
||||
|
||||
# Add participants
|
||||
self.api_add_member("raclette", "zorglub")
|
||||
self.api_add_member("raclette", "fred")
|
||||
self.api_add_member("raclette", "jeanne")
|
||||
self.api_add_member("raclette", "quentin")
|
||||
|
||||
# Add a bill without explicit currency
|
||||
|
@ -614,6 +666,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
"external_link": "https://raclette.fr",
|
||||
},
|
||||
|
@ -622,7 +675,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# should return the id
|
||||
self.assertStatus(201, req)
|
||||
self.assertEqual(req.data.decode("utf-8"), "1\n")
|
||||
assert req.data.decode("utf-8") == "1\n"
|
||||
|
||||
# get this bill details
|
||||
req = self.client.get(
|
||||
|
@ -636,8 +689,9 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"payer_id": 1,
|
||||
"owers": [
|
||||
{"activated": True, "id": 1, "name": "zorglub", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "fred", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "jeanne", "weight": 1},
|
||||
],
|
||||
"bill_type": "Expense",
|
||||
"amount": 25.0,
|
||||
"date": "2011-08-10",
|
||||
"id": 1,
|
||||
|
@ -647,12 +701,12 @@ class APITestCase(IhatemoneyTestCase):
|
|||
}
|
||||
|
||||
got = json.loads(req.data.decode("utf-8"))
|
||||
self.assertEqual(
|
||||
datetime.date.today(),
|
||||
datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date(),
|
||||
assert (
|
||||
datetime.date.today()
|
||||
== datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date()
|
||||
)
|
||||
del got["creation_date"]
|
||||
self.assertDictEqual(expected, got)
|
||||
assert expected == got
|
||||
|
||||
# Change bill amount and currency
|
||||
req = self.client.put(
|
||||
|
@ -662,6 +716,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "30",
|
||||
"external_link": "https://raclette.fr",
|
||||
"original_currency": "CAD",
|
||||
|
@ -681,8 +736,9 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"payer_id": 1,
|
||||
"owers": [
|
||||
{"activated": True, "id": 1, "name": "zorglub", "weight": 1.0},
|
||||
{"activated": True, "id": 2, "name": "fred", "weight": 1.0},
|
||||
{"activated": True, "id": 2, "name": "jeanne", "weight": 1.0},
|
||||
],
|
||||
"bill_type": "Expense",
|
||||
"amount": 30.0,
|
||||
"date": "2011-08-10",
|
||||
"id": 1,
|
||||
|
@ -693,7 +749,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
got = json.loads(req.data.decode("utf-8"))
|
||||
del got["creation_date"]
|
||||
self.assertDictEqual(expected, got)
|
||||
assert expected == got
|
||||
|
||||
# Add a bill with yet another currency
|
||||
req = self.client.post(
|
||||
|
@ -703,6 +759,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "Pierogi",
|
||||
"payer": "1",
|
||||
"payed_for": ["2", "3"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "80",
|
||||
"original_currency": "PLN",
|
||||
},
|
||||
|
@ -711,7 +768,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# should return the id
|
||||
self.assertStatus(201, req)
|
||||
self.assertEqual(req.data.decode("utf-8"), "2\n")
|
||||
assert req.data.decode("utf-8") == "2\n"
|
||||
|
||||
# Try to remove default project currency, it should fail
|
||||
req = self.client.put(
|
||||
|
@ -719,15 +776,16 @@ class APITestCase(IhatemoneyTestCase):
|
|||
data={
|
||||
"contact_email": "yeah@notmyidea.org",
|
||||
"default_currency": "XXX",
|
||||
"current_password": "raclette",
|
||||
"password": "raclette",
|
||||
"name": "The raclette party",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
self.assertStatus(400, req)
|
||||
self.assertIn("This project cannot be set", req.data.decode("utf-8"))
|
||||
self.assertIn(
|
||||
"because it contains bills in multiple currencies", req.data.decode("utf-8")
|
||||
assert "This project cannot be set" in req.data.decode("utf-8")
|
||||
assert "because it contains bills in multiple currencies" in req.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
|
||||
def test_statistics(self):
|
||||
|
@ -736,7 +794,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# add participants
|
||||
self.api_add_member("raclette", "zorglub")
|
||||
self.api_add_member("raclette", "fred")
|
||||
self.api_add_member("raclette", "jeanne")
|
||||
|
||||
# add a bill
|
||||
req = self.client.post(
|
||||
|
@ -746,6 +804,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
|
@ -756,33 +815,30 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"/api/projects/raclette/statistics", headers=self.get_auth("raclette")
|
||||
)
|
||||
self.assertStatus(200, req)
|
||||
self.assertEqual(
|
||||
[
|
||||
{
|
||||
"balance": 12.5,
|
||||
"member": {
|
||||
"activated": True,
|
||||
"id": 1,
|
||||
"name": "zorglub",
|
||||
"weight": 1.0,
|
||||
},
|
||||
"paid": 25.0,
|
||||
"spent": 12.5,
|
||||
assert [
|
||||
{
|
||||
"balance": 12.5,
|
||||
"member": {
|
||||
"activated": True,
|
||||
"id": 1,
|
||||
"name": "zorglub",
|
||||
"weight": 1.0,
|
||||
},
|
||||
{
|
||||
"balance": -12.5,
|
||||
"member": {
|
||||
"activated": True,
|
||||
"id": 2,
|
||||
"name": "fred",
|
||||
"weight": 1.0,
|
||||
},
|
||||
"paid": 0,
|
||||
"spent": 12.5,
|
||||
"paid": 25.0,
|
||||
"spent": 12.5,
|
||||
},
|
||||
{
|
||||
"balance": -12.5,
|
||||
"member": {
|
||||
"activated": True,
|
||||
"id": 2,
|
||||
"name": "jeanne",
|
||||
"weight": 1.0,
|
||||
},
|
||||
],
|
||||
json.loads(req.data.decode("utf-8")),
|
||||
)
|
||||
"paid": 0,
|
||||
"spent": 12.5,
|
||||
},
|
||||
] == json.loads(req.data.decode("utf-8"))
|
||||
|
||||
def test_username_xss(self):
|
||||
# create a project
|
||||
|
@ -794,7 +850,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
self.api_add_member("raclette", "<script>")
|
||||
|
||||
result = self.client.get("/raclette/")
|
||||
self.assertNotIn("<script>", result.data.decode("utf-8"))
|
||||
assert "<script>" not in result.data.decode("utf-8")
|
||||
|
||||
def test_weighted_bills(self):
|
||||
# create a project
|
||||
|
@ -802,7 +858,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
# add participants
|
||||
self.api_add_member("raclette", "zorglub")
|
||||
self.api_add_member("raclette", "freddy familly", 4)
|
||||
self.api_add_member("raclette", "jeannedy familly", 4)
|
||||
self.api_add_member("raclette", "quentin")
|
||||
|
||||
# add a bill
|
||||
|
@ -813,6 +869,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1", "2"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
|
@ -833,8 +890,9 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"payer_id": 1,
|
||||
"owers": [
|
||||
{"activated": True, "id": 1, "name": "zorglub", "weight": 1},
|
||||
{"activated": True, "id": 2, "name": "freddy familly", "weight": 4},
|
||||
{"activated": True, "id": 2, "name": "jeannedy familly", "weight": 4},
|
||||
],
|
||||
"bill_type": "Expense",
|
||||
"amount": 25.0,
|
||||
"date": "2011-08-10",
|
||||
"id": 1,
|
||||
|
@ -843,12 +901,12 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"original_currency": "XXX",
|
||||
}
|
||||
got = json.loads(req.data.decode("utf-8"))
|
||||
self.assertEqual(
|
||||
creation_date,
|
||||
datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date(),
|
||||
assert (
|
||||
creation_date
|
||||
== datetime.datetime.strptime(got["creation_date"], "%Y-%m-%d").date()
|
||||
)
|
||||
del got["creation_date"]
|
||||
self.assertDictEqual(expected, got)
|
||||
assert expected == got
|
||||
|
||||
# getting it should return a 404
|
||||
req = self.client.get(
|
||||
|
@ -867,7 +925,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
{
|
||||
"activated": True,
|
||||
"id": 2,
|
||||
"name": "freddy familly",
|
||||
"name": "jeannedy familly",
|
||||
"weight": 4.0,
|
||||
"balance": -20.0,
|
||||
},
|
||||
|
@ -888,7 +946,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
|
||||
self.assertStatus(200, req)
|
||||
decoded_req = json.loads(req.data.decode("utf-8"))
|
||||
self.assertDictEqual(decoded_req, expected)
|
||||
assert decoded_req == expected
|
||||
|
||||
def test_log_created_from_api_call(self):
|
||||
# create a project
|
||||
|
@ -899,15 +957,13 @@ class APITestCase(IhatemoneyTestCase):
|
|||
self.api_add_member("raclette", "zorglub")
|
||||
|
||||
resp = self.client.get("/raclette/history", follow_redirects=True)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
f"Participant {em_surround('zorglub')} added", resp.data.decode("utf-8")
|
||||
assert resp.status_code == 200
|
||||
assert f"Participant {em_surround('zorglub')} added" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
self.assertIn(
|
||||
f"Project {em_surround('raclette')} added", resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 2)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
assert f"Project {em_surround('raclette')} added" in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 2
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
|
||||
def test_amount_is_null(self):
|
||||
self.api_create("raclette")
|
||||
|
@ -922,6 +978,7 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "0",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
|
@ -950,12 +1007,71 @@ class APITestCase(IhatemoneyTestCase):
|
|||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "9347242149381274732472348728748723473278472843.12",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
self.assertStatus(400, req)
|
||||
|
||||
def test_validate_bill_type(self):
|
||||
self.api_create("raclette")
|
||||
self.api_add_member("raclette", "zorglub")
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
req = self.client.post(
|
||||
"/api/projects/raclette/bills",
|
||||
data={
|
||||
"date": "2011-08-10",
|
||||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1"],
|
||||
"bill_type": "wrong_bill_type",
|
||||
"amount": "50",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
|
||||
self.assertStatus(400, req)
|
||||
|
||||
req = self.client.post(
|
||||
"/api/projects/raclette/bills",
|
||||
data={
|
||||
"date": "2011-08-10",
|
||||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1"],
|
||||
"bill_type": "Expense",
|
||||
"amount": "50",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
|
||||
self.assertStatus(201, req)
|
||||
|
||||
def test_default_bill_type(self):
|
||||
self.api_create("raclette")
|
||||
self.api_add_member("raclette", "zorglub")
|
||||
|
||||
# Post a bill without adding a bill type
|
||||
req = self.client.post(
|
||||
"/api/projects/raclette/bills",
|
||||
data={
|
||||
"date": "2011-08-10",
|
||||
"what": "fromage",
|
||||
"payer": "1",
|
||||
"payed_for": ["1"],
|
||||
"amount": "50",
|
||||
},
|
||||
headers=self.get_auth("raclette"),
|
||||
)
|
||||
|
||||
self.assertStatus(201, req)
|
||||
|
||||
req = self.client.get(
|
||||
"/api/projects/raclette/bills/1", headers=self.get_auth("raclette")
|
||||
)
|
||||
self.assertStatus(200, req)
|
||||
|
||||
# Bill type should now be "Expense"
|
||||
got = json.loads(req.data.decode("utf-8"))
|
||||
assert got["bill_type"] == "Expense"
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,44 +1,20 @@
|
|||
import os
|
||||
from unittest.mock import MagicMock
|
||||
|
||||
from flask_testing import TestCase
|
||||
from werkzeug.security import generate_password_hash
|
||||
import pytest
|
||||
|
||||
from ihatemoney import models
|
||||
from ihatemoney.currency_convertor import CurrencyConverter
|
||||
from ihatemoney.run import create_app, db
|
||||
from ihatemoney.utils import generate_password_hash
|
||||
|
||||
|
||||
class BaseTestCase(TestCase):
|
||||
@pytest.mark.usefixtures("client", "converter")
|
||||
class BaseTestCase:
|
||||
SECRET_KEY = "TEST SESSION"
|
||||
SQLALCHEMY_DATABASE_URI = os.environ.get(
|
||||
"TESTING_SQLALCHEMY_DATABASE_URI", "sqlite://"
|
||||
)
|
||||
ENABLE_CAPTCHA = False
|
||||
|
||||
def create_app(self):
|
||||
# Pass the test object as a configuration.
|
||||
return create_app(self)
|
||||
|
||||
def setUp(self):
|
||||
db.create_all()
|
||||
# Add dummy data to CurrencyConverter for all tests (since it's a singleton)
|
||||
mock_data = {
|
||||
"USD": 1,
|
||||
"EUR": 0.8,
|
||||
"CAD": 1.2,
|
||||
"PLN": 4,
|
||||
CurrencyConverter.no_currency: 1,
|
||||
}
|
||||
converter = CurrencyConverter()
|
||||
converter.get_rates = MagicMock(return_value=mock_data)
|
||||
# Also add it to an attribute to make tests clearer
|
||||
self.converter = converter
|
||||
|
||||
def tearDown(self):
|
||||
# clean after testing
|
||||
db.session.remove()
|
||||
db.drop_all()
|
||||
PASSWORD_HASH_METHOD = "pbkdf2:sha1:1"
|
||||
PASSWORD_HASH_SALT_LENGTH = 1
|
||||
|
||||
def login(self, project, password=None, test_client=None):
|
||||
password = password or project
|
||||
|
@ -56,6 +32,7 @@ class BaseTestCase(TestCase):
|
|||
default_currency="XXX",
|
||||
name=None,
|
||||
password=None,
|
||||
project_history=True,
|
||||
):
|
||||
"""Create a fake project"""
|
||||
name = name or id
|
||||
|
@ -69,6 +46,7 @@ class BaseTestCase(TestCase):
|
|||
"password": password,
|
||||
"contact_email": f"{id}@notmyidea.org",
|
||||
"default_currency": default_currency,
|
||||
"project_history": project_history,
|
||||
},
|
||||
follow_redirects=follow_redirects,
|
||||
)
|
||||
|
@ -79,7 +57,7 @@ class BaseTestCase(TestCase):
|
|||
data=data,
|
||||
# follow_redirects=True,
|
||||
)
|
||||
self.assertEqual("/{id}/edit" in str(resp.response), not success)
|
||||
assert ("/{id}/edit" in str(resp.response)) == (not success)
|
||||
|
||||
def create_project(self, id, default_currency="XXX", name=None, password=None):
|
||||
name = name or str(id)
|
||||
|
@ -105,11 +83,9 @@ class IhatemoneyTestCase(BaseTestCase):
|
|||
def assertStatus(self, expected, resp, url=None):
|
||||
if url is None:
|
||||
url = resp.request.path
|
||||
return self.assertEqual(
|
||||
expected,
|
||||
resp.status_code,
|
||||
f"{url} expected {expected}, got {resp.status_code}",
|
||||
)
|
||||
assert (
|
||||
expected == resp.status_code
|
||||
), f"{url} expected {expected}, got {resp.status_code}"
|
||||
|
||||
def enable_admin(self, password="adminpass"):
|
||||
self.app.config["ACTIVATE_ADMIN_DASHBOARD"] = True
|
||||
|
|
64
ihatemoney/tests/conftest.py
Normal file
64
ihatemoney/tests/conftest.py
Normal file
|
@ -0,0 +1,64 @@
|
|||
from unittest.mock import MagicMock
|
||||
|
||||
from flask import Flask
|
||||
from jinja2 import FileSystemBytecodeCache
|
||||
import pytest
|
||||
|
||||
from ihatemoney.babel_utils import compile_catalogs
|
||||
from ihatemoney.currency_convertor import CurrencyConverter
|
||||
from ihatemoney.run import create_app, db
|
||||
|
||||
|
||||
@pytest.fixture(autouse=True, scope="session")
|
||||
def babel_catalogs():
|
||||
compile_catalogs()
|
||||
|
||||
|
||||
@pytest.fixture(scope="session")
|
||||
def jinja_cache_directory(tmp_path_factory):
|
||||
return tmp_path_factory.mktemp("cache")
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def app(request: pytest.FixtureRequest, jinja_cache_directory):
|
||||
"""Create the Flask app with database"""
|
||||
app = create_app(request.cls)
|
||||
|
||||
# Caches the jinja templates so they are compiled only once per test session
|
||||
app.jinja_env.bytecode_cache = FileSystemBytecodeCache(jinja_cache_directory)
|
||||
|
||||
with app.app_context():
|
||||
db.create_all()
|
||||
request.cls.app = app
|
||||
|
||||
yield app
|
||||
|
||||
# clean after testing
|
||||
db.session.remove()
|
||||
db.drop_all()
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def client(app: Flask, request: pytest.FixtureRequest):
|
||||
client = app.test_client()
|
||||
request.cls.client = client
|
||||
|
||||
yield client
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def converter(request: pytest.FixtureRequest):
|
||||
# Add dummy data to CurrencyConverter for all tests (since it's a singleton)
|
||||
mock_data = {
|
||||
"USD": 1,
|
||||
"EUR": 0.8,
|
||||
"CAD": 1.2,
|
||||
"PLN": 4,
|
||||
CurrencyConverter.no_currency: 1,
|
||||
}
|
||||
converter = CurrencyConverter()
|
||||
converter.get_rates = MagicMock(return_value=mock_data)
|
||||
# Also add it to an attribute to make tests clearer
|
||||
request.cls.converter = converter
|
||||
|
||||
yield converter
|
|
@ -1,4 +1,6 @@
|
|||
import unittest
|
||||
import re
|
||||
|
||||
import pytest
|
||||
|
||||
from ihatemoney import history, models
|
||||
from ihatemoney.tests.common.help_functions import em_surround
|
||||
|
@ -6,24 +8,40 @@ from ihatemoney.tests.common.ihatemoney_testcase import IhatemoneyTestCase
|
|||
from ihatemoney.versioning import LoggingMode
|
||||
|
||||
|
||||
class HistoryTestCase(IhatemoneyTestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.post_project("demo")
|
||||
self.login("demo")
|
||||
@pytest.fixture
|
||||
def demo(client):
|
||||
client.post(
|
||||
"/create",
|
||||
data={
|
||||
"name": "demo",
|
||||
"id": "demo",
|
||||
"password": "demo",
|
||||
"contact_email": "demo@notmyidea.org",
|
||||
"default_currency": "XXX",
|
||||
"project_history": True,
|
||||
},
|
||||
)
|
||||
client.post(
|
||||
"/authenticate",
|
||||
data=dict(id="demo", password="demo"),
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.usefixtures("demo")
|
||||
class TestHistory(IhatemoneyTestCase):
|
||||
def test_simple_create_logentry_no_ip(self):
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(f"Project {em_surround('demo')} added", resp.data.decode("utf-8"))
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 1)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
assert resp.status_code == 200
|
||||
assert f"Project {em_surround('demo')} added" in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 1
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
|
||||
def change_privacy_to(self, logging_preference):
|
||||
def change_privacy_to(self, current_password, logging_preference):
|
||||
# Change only logging_preferences
|
||||
new_data = {
|
||||
"name": "demo",
|
||||
"contact_email": "demo@notmyidea.org",
|
||||
"current_password": current_password,
|
||||
"password": "demo",
|
||||
"default_currency": "XXX",
|
||||
}
|
||||
|
@ -35,142 +53,136 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
|
||||
# Disable History
|
||||
resp = self.client.post("/demo/edit", data=new_data, follow_redirects=True)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertNotIn("alert-danger", resp.data.decode("utf-8"))
|
||||
assert resp.status_code == 200
|
||||
assert "alert-danger" not in resp.data.decode("utf-8")
|
||||
|
||||
resp = self.client.get("/demo/edit")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
if logging_preference == LoggingMode.DISABLED:
|
||||
self.assertIn('<input id="project_history"', resp.data.decode("utf-8"))
|
||||
assert '<input id="project_history"' in resp.data.decode("utf-8")
|
||||
else:
|
||||
self.assertIn(
|
||||
'<input checked id="project_history"', resp.data.decode("utf-8")
|
||||
)
|
||||
assert '<input checked id="project_history"' in resp.data.decode("utf-8")
|
||||
|
||||
if logging_preference == LoggingMode.RECORD_IP:
|
||||
self.assertIn('<input checked id="ip_recording"', resp.data.decode("utf-8"))
|
||||
assert '<input checked id="ip_recording"' in resp.data.decode("utf-8")
|
||||
else:
|
||||
self.assertIn('<input id="ip_recording"', resp.data.decode("utf-8"))
|
||||
assert '<input id="ip_recording"' in resp.data.decode("utf-8")
|
||||
|
||||
def assert_empty_history_logging_disabled(self):
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertIn(
|
||||
"This project has history disabled. New actions won't appear below. ",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"This project has history disabled. New actions won't appear below."
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertIn("Nothing to list", resp.data.decode("utf-8"))
|
||||
self.assertNotIn(
|
||||
"The table below reflects actions recorded prior to disabling project history.",
|
||||
resp.data.decode("utf-8"),
|
||||
assert "Nothing to list" in resp.data.decode("utf-8")
|
||||
assert (
|
||||
"The table below reflects actions recorded prior to disabling project history."
|
||||
not in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertNotIn(
|
||||
"Some entries below contain IP addresses,", resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
self.assertNotIn("<td> -- </td>", resp.data.decode("utf-8"))
|
||||
self.assertNotIn(
|
||||
f"Project {em_surround('demo')} added", resp.data.decode("utf-8")
|
||||
assert "Some entries below contain IP addresses," not in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
assert "<td> -- </td>" not in resp.data.decode("utf-8")
|
||||
assert f"Project {em_surround('demo')} added" not in resp.data.decode("utf-8")
|
||||
|
||||
def test_project_edit(self):
|
||||
new_data = {
|
||||
"name": "demo2",
|
||||
"contact_email": "demo2@notmyidea.org",
|
||||
"current_password": "demo",
|
||||
"password": "123456",
|
||||
"project_history": "y",
|
||||
"default_currency": "USD", # Currency changed from default
|
||||
}
|
||||
|
||||
resp = self.client.post("/demo/edit", data=new_data, follow_redirects=True)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(f"Project {em_surround('demo')} added", resp.data.decode("utf-8"))
|
||||
self.assertIn(
|
||||
f"Project contact email changed to {em_surround('demo2@notmyidea.org')}",
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert f"Project {em_surround('demo')} added" in resp.data.decode("utf-8")
|
||||
assert (
|
||||
f"Project contact email changed to {em_surround('demo2@notmyidea.org')}"
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertIn("Project private code changed", resp.data.decode("utf-8"))
|
||||
self.assertIn(
|
||||
f"Project renamed to {em_surround('demo2')}", resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertLess(
|
||||
resp.data.decode("utf-8").index("Project renamed "),
|
||||
resp.data.decode("utf-8").index("Project contact email changed to "),
|
||||
)
|
||||
self.assertLess(
|
||||
resp.data.decode("utf-8").index("Project renamed "),
|
||||
resp.data.decode("utf-8").index("Project private code changed"),
|
||||
)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 5)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
assert "Project private code changed" in resp.data.decode("utf-8")
|
||||
assert f"Project renamed to {em_surround('demo2')}" in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").index("Project renamed ") < resp.data.decode(
|
||||
"utf-8"
|
||||
).index("Project contact email changed to ")
|
||||
assert resp.data.decode("utf-8").index("Project renamed ") < resp.data.decode(
|
||||
"utf-8"
|
||||
).index("Project private code changed")
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 5
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
|
||||
def test_project_privacy_edit(self):
|
||||
resp = self.client.get("/demo/edit")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
'<input checked id="project_history" name="project_history" type="checkbox" value="y">',
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert (
|
||||
'<input checked id="project_history" name="project_history" type="checkbox" value="y">'
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
|
||||
self.change_privacy_to(LoggingMode.DISABLED)
|
||||
self.change_privacy_to("demo", LoggingMode.DISABLED)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn("Disabled Project History\n", resp.data.decode("utf-8"))
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 2)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
assert resp.status_code == 200
|
||||
assert "Disabled Project History\n" in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 2
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
|
||||
self.change_privacy_to(LoggingMode.RECORD_IP)
|
||||
self.change_privacy_to("demo", LoggingMode.RECORD_IP)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
"Enabled Project History & IP Address Recording", resp.data.decode("utf-8")
|
||||
assert resp.status_code == 200
|
||||
assert "Enabled Project History & IP Address Recording" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 2)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 1)
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 2
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 1
|
||||
|
||||
self.change_privacy_to(LoggingMode.ENABLED)
|
||||
self.change_privacy_to("demo", LoggingMode.ENABLED)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn("Disabled IP Address Recording\n", resp.data.decode("utf-8"))
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 2)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 2)
|
||||
assert resp.status_code == 200
|
||||
assert "Disabled IP Address Recording\n" in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 2
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 2
|
||||
|
||||
def test_project_privacy_edit2(self):
|
||||
self.change_privacy_to(LoggingMode.RECORD_IP)
|
||||
self.change_privacy_to("demo", LoggingMode.RECORD_IP)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn("Enabled IP Address Recording\n", resp.data.decode("utf-8"))
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 1)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 1)
|
||||
assert resp.status_code == 200
|
||||
assert "Enabled IP Address Recording\n" in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 1
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 1
|
||||
|
||||
self.change_privacy_to(LoggingMode.DISABLED)
|
||||
self.change_privacy_to("demo", LoggingMode.DISABLED)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
"Disabled Project History & IP Address Recording", resp.data.decode("utf-8")
|
||||
assert resp.status_code == 200
|
||||
assert "Disabled Project History & IP Address Recording" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 1)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 2)
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 1
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 2
|
||||
|
||||
self.change_privacy_to(LoggingMode.ENABLED)
|
||||
self.change_privacy_to("demo", LoggingMode.ENABLED)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn("Enabled Project History\n", resp.data.decode("utf-8"))
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 2)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 2)
|
||||
assert resp.status_code == 200
|
||||
assert "Enabled Project History\n" in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 2
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 2
|
||||
|
||||
def do_misc_database_operations(self, logging_mode):
|
||||
new_data = {
|
||||
"name": "demo2",
|
||||
"contact_email": "demo2@notmyidea.org",
|
||||
"current_password": "demo",
|
||||
"password": "123456",
|
||||
"default_currency": "USD",
|
||||
}
|
||||
|
@ -182,13 +194,13 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
new_data["ip_recording"] = "y"
|
||||
|
||||
resp = self.client.post("/demo/edit", data=new_data, follow_redirects=True)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
# adds a member to this project
|
||||
resp = self.client.post(
|
||||
"/demo/members/add", data={"name": "zorglub"}, follow_redirects=True
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
user_id = models.Person.query.one().id
|
||||
|
||||
|
@ -200,11 +212,12 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "fromage à raclette",
|
||||
"payer": user_id,
|
||||
"payed_for": [user_id],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
},
|
||||
follow_redirects=True,
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
bill_id = models.Bill.query.one().id
|
||||
|
||||
|
@ -216,48 +229,46 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "fromage à raclette",
|
||||
"payer": user_id,
|
||||
"payed_for": [user_id],
|
||||
"bill_type": "Expense",
|
||||
"amount": "10",
|
||||
},
|
||||
follow_redirects=True,
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
# delete the bill
|
||||
resp = self.client.post(f"/demo/delete/{bill_id}", follow_redirects=True)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
# delete user using POST method
|
||||
resp = self.client.post(
|
||||
f"/demo/members/{user_id}/delete", follow_redirects=True
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
def test_disable_clear_no_new_records(self):
|
||||
# Disable logging
|
||||
self.change_privacy_to(LoggingMode.DISABLED)
|
||||
self.change_privacy_to("demo", LoggingMode.DISABLED)
|
||||
|
||||
# Ensure we can't clear history with a GET or with a password-less POST
|
||||
resp = self.client.get("/demo/erase_history")
|
||||
self.assertEqual(resp.status_code, 405)
|
||||
assert resp.status_code == 405
|
||||
resp = self.client.post("/demo/erase_history", follow_redirects=True)
|
||||
self.assertIn(
|
||||
"Error deleting project history",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
assert "Error deleting project history" in resp.data.decode("utf-8")
|
||||
|
||||
# List history
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
"This project has history disabled. New actions won't appear below. ",
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert (
|
||||
"This project has history disabled. New actions won't appear below."
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertIn(
|
||||
"The table below reflects actions recorded prior to disabling project history.",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"The table below reflects actions recorded prior to disabling project history."
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertNotIn("Nothing to list", resp.data.decode("utf-8"))
|
||||
self.assertNotIn(
|
||||
"Some entries below contain IP addresses,", resp.data.decode("utf-8")
|
||||
assert "Nothing to list" not in resp.data.decode("utf-8")
|
||||
assert "Some entries below contain IP addresses," not in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
|
||||
# Clear Existing Entries
|
||||
|
@ -266,7 +277,7 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
data={"password": "demo"},
|
||||
follow_redirects=True,
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
self.assert_empty_history_logging_disabled()
|
||||
|
||||
# Do lots of database operations & check that there's still no history
|
||||
|
@ -276,52 +287,47 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
|
||||
def test_clear_ip_records(self):
|
||||
# Enable IP Recording
|
||||
self.change_privacy_to(LoggingMode.RECORD_IP)
|
||||
self.change_privacy_to("demo", LoggingMode.RECORD_IP)
|
||||
|
||||
# Do lots of database operations to generate IP address entries
|
||||
self.do_misc_database_operations(LoggingMode.RECORD_IP)
|
||||
|
||||
# Disable IP Recording
|
||||
self.change_privacy_to(LoggingMode.ENABLED)
|
||||
self.change_privacy_to("123456", LoggingMode.ENABLED)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertNotIn(
|
||||
"This project has history disabled. New actions won't appear below. ",
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert (
|
||||
"This project has history disabled. New actions won't appear below."
|
||||
not in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertNotIn(
|
||||
"The table below reflects actions recorded prior to disabling project history.",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"The table below reflects actions recorded prior to disabling project history."
|
||||
not in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertNotIn("Nothing to list", resp.data.decode("utf-8"))
|
||||
self.assertIn(
|
||||
"Some entries below contain IP addresses,", resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 12)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 1)
|
||||
assert "Nothing to list" not in resp.data.decode("utf-8")
|
||||
assert "Some entries below contain IP addresses," in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 12
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 1
|
||||
|
||||
# Generate more operations to confirm additional IP info isn't recorded
|
||||
self.do_misc_database_operations(LoggingMode.ENABLED)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 12)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 7)
|
||||
assert resp.status_code == 200
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 12
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 7
|
||||
|
||||
# Ensure we can't clear IP data with a GET or with a password-less POST
|
||||
resp = self.client.get("/demo/strip_ip_addresses")
|
||||
self.assertEqual(resp.status_code, 405)
|
||||
assert resp.status_code == 405
|
||||
resp = self.client.post("/demo/strip_ip_addresses", follow_redirects=True)
|
||||
self.assertIn(
|
||||
"Error deleting recorded IP addresses",
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
assert "Error deleting recorded IP addresses" in resp.data.decode("utf-8")
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 12)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 7)
|
||||
assert resp.status_code == 200
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 12
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 7
|
||||
|
||||
# Clear IP Data
|
||||
resp = self.client.post(
|
||||
|
@ -330,33 +336,33 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
follow_redirects=True,
|
||||
)
|
||||
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertNotIn(
|
||||
"This project has history disabled. New actions won't appear below. ",
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert (
|
||||
"This project has history disabled. New actions won't appear below."
|
||||
not in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertNotIn(
|
||||
"The table below reflects actions recorded prior to disabling project history.",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"The table below reflects actions recorded prior to disabling project history."
|
||||
not in resp.data.decode("utf-8")
|
||||
)
|
||||
self.assertNotIn("Nothing to list", resp.data.decode("utf-8"))
|
||||
self.assertNotIn(
|
||||
"Some entries below contain IP addresses,", resp.data.decode("utf-8")
|
||||
assert "Nothing to list" not in resp.data.decode("utf-8")
|
||||
assert "Some entries below contain IP addresses," not in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("127.0.0.1"), 0)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 19)
|
||||
assert resp.data.decode("utf-8").count("127.0.0.1") == 0
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 19
|
||||
|
||||
def test_logs_for_common_actions(self):
|
||||
# adds a member to this project
|
||||
resp = self.client.post(
|
||||
"/demo/members/add", data={"name": "zorglub"}, follow_redirects=True
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
f"Participant {em_surround('zorglub')} added", resp.data.decode("utf-8")
|
||||
assert resp.status_code == 200
|
||||
assert f"Participant {em_surround('zorglub')} added" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
|
||||
# create a bill
|
||||
|
@ -367,17 +373,17 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "fromage à raclette",
|
||||
"payer": 1,
|
||||
"payed_for": [1],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
},
|
||||
follow_redirects=True,
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
f"Bill {em_surround('fromage à raclette')} added",
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert f"Bill {em_surround('fromage à raclette')} added" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
|
||||
# edit the bill
|
||||
|
@ -388,48 +394,42 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "new thing",
|
||||
"payer": 1,
|
||||
"payed_for": [1],
|
||||
"bill_type": "Expense",
|
||||
"amount": "10",
|
||||
},
|
||||
follow_redirects=True,
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
f"Bill {em_surround('fromage à raclette')} added",
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert f"Bill {em_surround('fromage à raclette')} added" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
self.assertRegex(
|
||||
resp.data.decode("utf-8"),
|
||||
assert re.search(
|
||||
r"Bill %s:\s* Amount changed\s* from %s\s* to %s"
|
||||
% (
|
||||
em_surround("fromage à raclette", regex_escape=True),
|
||||
em_surround("25.0", regex_escape=True),
|
||||
em_surround("10.0", regex_escape=True),
|
||||
),
|
||||
)
|
||||
self.assertIn(
|
||||
"Bill %s renamed to %s"
|
||||
% (em_surround("fromage à raclette"), em_surround("new thing")),
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
self.assertLess(
|
||||
resp.data.decode("utf-8").index(
|
||||
f"Bill {em_surround('fromage à raclette')} renamed to"
|
||||
),
|
||||
resp.data.decode("utf-8").index("Amount changed"),
|
||||
)
|
||||
assert "Bill %s renamed to %s" % (
|
||||
em_surround("fromage à raclette"),
|
||||
em_surround("new thing"),
|
||||
) in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").index(
|
||||
f"Bill {em_surround('fromage à raclette')} renamed to"
|
||||
) < resp.data.decode("utf-8").index("Amount changed")
|
||||
|
||||
# delete the bill
|
||||
resp = self.client.post("/demo/delete/1", follow_redirects=True)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
f"Bill {em_surround('new thing')} removed", resp.data.decode("utf-8")
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert f"Bill {em_surround('new thing')} removed" in resp.data.decode("utf-8")
|
||||
|
||||
# edit user
|
||||
resp = self.client.post(
|
||||
|
@ -437,39 +437,35 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
data={"weight": 2, "name": "new name"},
|
||||
follow_redirects=True,
|
||||
)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertRegex(
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert re.search(
|
||||
r"Participant %s:\s* weight changed\s* from %s\s* to %s"
|
||||
% (
|
||||
em_surround("zorglub", regex_escape=True),
|
||||
em_surround("1.0", regex_escape=True),
|
||||
em_surround("2.0", regex_escape=True),
|
||||
),
|
||||
)
|
||||
self.assertIn(
|
||||
"Participant %s renamed to %s"
|
||||
% (em_surround("zorglub"), em_surround("new name")),
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
self.assertLess(
|
||||
resp.data.decode("utf-8").index(
|
||||
f"Participant {em_surround('zorglub')} renamed"
|
||||
),
|
||||
resp.data.decode("utf-8").index("weight changed"),
|
||||
)
|
||||
assert "Participant %s renamed to %s" % (
|
||||
em_surround("zorglub"),
|
||||
em_surround("new name"),
|
||||
) in resp.data.decode("utf-8")
|
||||
assert resp.data.decode("utf-8").index(
|
||||
f"Participant {em_surround('zorglub')} renamed"
|
||||
) < resp.data.decode("utf-8").index("weight changed")
|
||||
|
||||
# delete user using POST method
|
||||
resp = self.client.post("/demo/members/1/delete", follow_redirects=True)
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertIn(
|
||||
f"Participant {em_surround('new name')} removed", resp.data.decode("utf-8")
|
||||
assert resp.status_code == 200
|
||||
assert f"Participant {em_surround('new name')} removed" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
|
||||
def test_double_bill_double_person_edit_second(self):
|
||||
|
@ -485,6 +481,7 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "Bill 1",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
},
|
||||
)
|
||||
|
@ -495,15 +492,16 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "Bill 2",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2],
|
||||
"bill_type": "Expense",
|
||||
"amount": "20",
|
||||
},
|
||||
)
|
||||
|
||||
# Should be 5 history entries at this point
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 5)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
assert resp.status_code == 200
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 5
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
|
||||
# Edit ONLY the amount on the first bill
|
||||
self.client.post(
|
||||
|
@ -513,33 +511,33 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "Bill 1",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2],
|
||||
"bill_type": "Expense",
|
||||
"amount": "88",
|
||||
},
|
||||
)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertRegex(
|
||||
resp.data.decode("utf-8"),
|
||||
assert resp.status_code == 200
|
||||
assert re.search(
|
||||
r"Bill {}:\s* Amount changed\s* from {}\s* to {}".format(
|
||||
em_surround("Bill 1", regex_escape=True),
|
||||
em_surround("25.0", regex_escape=True),
|
||||
em_surround("88.0", regex_escape=True),
|
||||
),
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
|
||||
self.assertNotRegex(
|
||||
resp.data.decode("utf-8"),
|
||||
assert not re.search(
|
||||
r"Removed\s* {}\s* and\s* {}\s* from\s* owers list".format(
|
||||
em_surround("User 1", regex_escape=True),
|
||||
em_surround("User 2", regex_escape=True),
|
||||
),
|
||||
resp.data.decode("utf-8"),
|
||||
)
|
||||
), resp.data.decode("utf-8")
|
||||
|
||||
# Should be 6 history entries at this point
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 6)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 6
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
|
||||
def test_bill_add_remove_add(self):
|
||||
# add two members
|
||||
|
@ -554,6 +552,7 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "Bill 1",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2],
|
||||
"bill_type": "Expense",
|
||||
"amount": "25",
|
||||
},
|
||||
)
|
||||
|
@ -562,13 +561,11 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
self.client.post("/demo/delete/1", follow_redirects=True)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 5)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
self.assertIn(f"Bill {em_surround('Bill 1')} added", resp.data.decode("utf-8"))
|
||||
self.assertIn(
|
||||
f"Bill {em_surround('Bill 1')} removed", resp.data.decode("utf-8")
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 5
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
assert f"Bill {em_surround('Bill 1')} added" in resp.data.decode("utf-8")
|
||||
assert f"Bill {em_surround('Bill 1')} removed" in resp.data.decode("utf-8")
|
||||
|
||||
# Add a new bill
|
||||
self.client.post(
|
||||
|
@ -578,22 +575,21 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "Bill 2",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2],
|
||||
"bill_type": "Expense",
|
||||
"amount": "20",
|
||||
},
|
||||
)
|
||||
|
||||
resp = self.client.get("/demo/history")
|
||||
self.assertEqual(resp.status_code, 200)
|
||||
self.assertEqual(resp.data.decode("utf-8").count("<td> -- </td>"), 6)
|
||||
self.assertNotIn("127.0.0.1", resp.data.decode("utf-8"))
|
||||
self.assertIn(f"Bill {em_surround('Bill 1')} added", resp.data.decode("utf-8"))
|
||||
self.assertEqual(
|
||||
resp.data.decode("utf-8").count(f"Bill {em_surround('Bill 1')} added"), 1
|
||||
)
|
||||
self.assertIn(f"Bill {em_surround('Bill 2')} added", resp.data.decode("utf-8"))
|
||||
self.assertIn(
|
||||
f"Bill {em_surround('Bill 1')} removed", resp.data.decode("utf-8")
|
||||
assert resp.status_code == 200
|
||||
assert resp.data.decode("utf-8").count("<td> -- </td>") == 6
|
||||
assert "127.0.0.1" not in resp.data.decode("utf-8")
|
||||
assert f"Bill {em_surround('Bill 1')} added" in resp.data.decode("utf-8")
|
||||
assert (
|
||||
resp.data.decode("utf-8").count(f"Bill {em_surround('Bill 1')} added") == 1
|
||||
)
|
||||
assert f"Bill {em_surround('Bill 2')} added" in resp.data.decode("utf-8")
|
||||
assert f"Bill {em_surround('Bill 1')} removed" in resp.data.decode("utf-8")
|
||||
|
||||
def test_double_bill_double_person_edit_second_no_web(self):
|
||||
u1 = models.Person(project_id="demo", name="User 1")
|
||||
|
@ -614,7 +610,7 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
models.db.session.commit()
|
||||
|
||||
history_list = history.get_history(self.get_project("demo"))
|
||||
self.assertEqual(len(history_list), 5)
|
||||
assert len(history_list) == 5
|
||||
|
||||
# Change just the amount
|
||||
b1.amount = 5
|
||||
|
@ -623,8 +619,8 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
history_list = history.get_history(self.get_project("demo"))
|
||||
for entry in history_list:
|
||||
if "prop_changed" in entry:
|
||||
self.assertNotIn("owers", entry["prop_changed"])
|
||||
self.assertEqual(len(history_list), 6)
|
||||
assert "owers" not in entry["prop_changed"]
|
||||
assert len(history_list) == 6
|
||||
|
||||
def test_delete_history_with_project(self):
|
||||
self.post_project("raclette", password="party")
|
||||
|
@ -640,6 +636,7 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
"what": "fromage à raclette",
|
||||
"payer": 1,
|
||||
"payed_for": [1],
|
||||
"bill_type": "Expense",
|
||||
"amount": "10",
|
||||
"original_currency": "EUR",
|
||||
},
|
||||
|
@ -656,8 +653,4 @@ class HistoryTestCase(IhatemoneyTestCase):
|
|||
|
||||
# History should be equal to project creation
|
||||
history_list = history.get_history(self.get_project("raclette"))
|
||||
self.assertEqual(len(history_list), 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
assert len(history_list) == 1
|
||||
|
|
|
@ -7,3 +7,6 @@ SQLACHEMY_ECHO = DEBUG
|
|||
SECRET_KEY = "supersecret"
|
||||
|
||||
MAIL_DEFAULT_SENDER = "Budget manager <admin@example.com>"
|
||||
|
||||
PASSWORD_HASH_METHOD = "pbkdf2:sha1:1"
|
||||
PASSWORD_HASH_SALT_LENGTH = 1
|
||||
|
|
|
@ -7,3 +7,6 @@ SQLACHEMY_ECHO = DEBUG
|
|||
SECRET_KEY = "lalatra"
|
||||
|
||||
MAIL_DEFAULT_SENDER = "Budget manager <admin@example.com>"
|
||||
|
||||
PASSWORD_HASH_METHOD = "pbkdf2:sha1:1"
|
||||
PASSWORD_HASH_SALT_LENGTH = 1
|
||||
|
|
|
@ -1,12 +1,49 @@
|
|||
import copy
|
||||
import json
|
||||
import unittest
|
||||
|
||||
import pytest
|
||||
|
||||
from ihatemoney.tests.common.ihatemoney_testcase import IhatemoneyTestCase
|
||||
from ihatemoney.utils import list_of_dicts2csv, list_of_dicts2json
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def import_data(request: pytest.FixtureRequest):
|
||||
data = [
|
||||
{
|
||||
"date": "2017-01-01",
|
||||
"what": "refund",
|
||||
"amount": 13.33,
|
||||
"payer_name": "tata",
|
||||
"payer_weight": 1.0,
|
||||
"bill_type": "Expense",
|
||||
"owers": ["jeanne"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"what": "red wine",
|
||||
"bill_type": "Expense",
|
||||
"amount": 200.0,
|
||||
"payer_name": "jeanne",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["zorglub", "tata"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"bill_type": "Expense",
|
||||
"what": "fromage a raclette",
|
||||
"amount": 10.0,
|
||||
"payer_name": "zorglub",
|
||||
"payer_weight": 2.0,
|
||||
"owers": ["zorglub", "jeanne", "tata", "pepe"],
|
||||
},
|
||||
]
|
||||
request.cls.data = data
|
||||
yield data
|
||||
|
||||
|
||||
class CommonTestCase(object):
|
||||
@pytest.mark.usefixtures("import_data")
|
||||
class Import(IhatemoneyTestCase):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
@ -14,26 +51,29 @@ class CommonTestCase(object):
|
|||
{
|
||||
"date": "2017-01-01",
|
||||
"what": "refund",
|
||||
"bill_type": "Expense",
|
||||
"amount": 13.33,
|
||||
"payer_name": "tata",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["fred"],
|
||||
"owers": ["jeanne"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"what": "red wine",
|
||||
"bill_type": "Expense",
|
||||
"amount": 200.0,
|
||||
"payer_name": "fred",
|
||||
"payer_name": "jeanne",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["zorglub", "tata"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"what": "fromage a raclette",
|
||||
"what": "a raclette",
|
||||
"bill_type": "Expense",
|
||||
"amount": 10.0,
|
||||
"payer_name": "zorglub",
|
||||
"payer_weight": 2.0,
|
||||
"owers": ["zorglub", "fred", "tata", "pepe"],
|
||||
"owers": ["zorglub", "jeanne", "tata", "pepe"],
|
||||
},
|
||||
]
|
||||
|
||||
|
@ -55,7 +95,7 @@ class CommonTestCase(object):
|
|||
bills = project.get_pretty_bills()
|
||||
|
||||
# Check if all bills have been added
|
||||
self.assertEqual(len(bills), len(self.data))
|
||||
assert len(bills) == len(self.data)
|
||||
|
||||
# Check if name of bills are ok
|
||||
b = [e["what"] for e in bills]
|
||||
|
@ -63,22 +103,23 @@ class CommonTestCase(object):
|
|||
ref = [e["what"] for e in self.data]
|
||||
ref.sort()
|
||||
|
||||
self.assertEqual(b, ref)
|
||||
assert b == ref
|
||||
|
||||
# Check if other informations in bill are ok
|
||||
for d in self.data:
|
||||
for b in bills:
|
||||
if b["what"] == d["what"]:
|
||||
self.assertEqual(b["payer_name"], d["payer_name"])
|
||||
self.assertEqual(b["amount"], d["amount"])
|
||||
self.assertEqual(b["currency"], d["currency"])
|
||||
self.assertEqual(b["payer_weight"], d["payer_weight"])
|
||||
self.assertEqual(b["date"], d["date"])
|
||||
assert b["payer_name"] == d["payer_name"]
|
||||
assert b["amount"] == d["amount"]
|
||||
assert b["currency"] == d["currency"]
|
||||
assert b["payer_weight"] == d["payer_weight"]
|
||||
assert b["date"] == d["date"]
|
||||
assert b["bill_type"] == d["bill_type"]
|
||||
list_project = [ower for ower in b["owers"]]
|
||||
list_project.sort()
|
||||
list_json = [ower for ower in d["owers"]]
|
||||
list_json.sort()
|
||||
self.assertEqual(list_project, list_json)
|
||||
assert list_project == list_json
|
||||
|
||||
def test_import_single_currency_in_empty_project_without_currency(self):
|
||||
# Import JSON with a single currency in an empty project with no
|
||||
|
@ -96,7 +137,7 @@ class CommonTestCase(object):
|
|||
bills = project.get_pretty_bills()
|
||||
|
||||
# Check if all bills have been added
|
||||
self.assertEqual(len(bills), len(self.data))
|
||||
assert len(bills) == len(self.data)
|
||||
|
||||
# Check if name of bills are ok
|
||||
b = [e["what"] for e in bills]
|
||||
|
@ -104,23 +145,24 @@ class CommonTestCase(object):
|
|||
ref = [e["what"] for e in self.data]
|
||||
ref.sort()
|
||||
|
||||
self.assertEqual(b, ref)
|
||||
assert b == ref
|
||||
|
||||
# Check if other informations in bill are ok
|
||||
for d in self.data:
|
||||
for b in bills:
|
||||
if b["what"] == d["what"]:
|
||||
self.assertEqual(b["payer_name"], d["payer_name"])
|
||||
self.assertEqual(b["amount"], d["amount"])
|
||||
assert b["payer_name"] == d["payer_name"]
|
||||
assert b["amount"] == d["amount"]
|
||||
# Currency should have been stripped
|
||||
self.assertEqual(b["currency"], "XXX")
|
||||
self.assertEqual(b["payer_weight"], d["payer_weight"])
|
||||
self.assertEqual(b["date"], d["date"])
|
||||
assert b["currency"] == "XXX"
|
||||
assert b["payer_weight"] == d["payer_weight"]
|
||||
assert b["date"] == d["date"]
|
||||
assert b["bill_type"] == d["bill_type"]
|
||||
list_project = [ower for ower in b["owers"]]
|
||||
list_project.sort()
|
||||
list_json = [ower for ower in d["owers"]]
|
||||
list_json.sort()
|
||||
self.assertEqual(list_project, list_json)
|
||||
assert list_project == list_json
|
||||
|
||||
def test_import_multiple_currencies_in_empty_project_without_currency(self):
|
||||
# Import JSON with multiple currencies in an empty project with no
|
||||
|
@ -138,7 +180,7 @@ class CommonTestCase(object):
|
|||
bills = project.get_pretty_bills()
|
||||
|
||||
# Check that there are no bills
|
||||
self.assertEqual(len(bills), 0)
|
||||
assert len(bills) == 0
|
||||
|
||||
def test_import_no_currency_in_empty_project_with_currency(self):
|
||||
# Import JSON without currencies (from ihatemoney < 5) in an empty
|
||||
|
@ -154,7 +196,7 @@ class CommonTestCase(object):
|
|||
bills = project.get_pretty_bills()
|
||||
|
||||
# Check if all bills have been added
|
||||
self.assertEqual(len(bills), len(self.data))
|
||||
assert len(bills) == len(self.data)
|
||||
|
||||
# Check if name of bills are ok
|
||||
b = [e["what"] for e in bills]
|
||||
|
@ -162,23 +204,24 @@ class CommonTestCase(object):
|
|||
ref = [e["what"] for e in self.data]
|
||||
ref.sort()
|
||||
|
||||
self.assertEqual(b, ref)
|
||||
assert b == ref
|
||||
|
||||
# Check if other informations in bill are ok
|
||||
for d in self.data:
|
||||
for b in bills:
|
||||
if b["what"] == d["what"]:
|
||||
self.assertEqual(b["payer_name"], d["payer_name"])
|
||||
self.assertEqual(b["amount"], d["amount"])
|
||||
assert b["payer_name"] == d["payer_name"]
|
||||
assert b["amount"] == d["amount"]
|
||||
# All bills are converted to default project currency
|
||||
self.assertEqual(b["currency"], "EUR")
|
||||
self.assertEqual(b["payer_weight"], d["payer_weight"])
|
||||
self.assertEqual(b["date"], d["date"])
|
||||
assert b["currency"] == "EUR"
|
||||
assert b["payer_weight"] == d["payer_weight"]
|
||||
assert b["date"] == d["date"]
|
||||
assert b["bill_type"] == d["bill_type"]
|
||||
list_project = [ower for ower in b["owers"]]
|
||||
list_project.sort()
|
||||
list_json = [ower for ower in d["owers"]]
|
||||
list_json.sort()
|
||||
self.assertEqual(list_project, list_json)
|
||||
assert list_project == list_json
|
||||
|
||||
def test_import_no_currency_in_empty_project_without_currency(self):
|
||||
# Import JSON without currencies (from ihatemoney < 5) in an empty
|
||||
|
@ -194,7 +237,7 @@ class CommonTestCase(object):
|
|||
bills = project.get_pretty_bills()
|
||||
|
||||
# Check if all bills have been added
|
||||
self.assertEqual(len(bills), len(self.data))
|
||||
assert len(bills) == len(self.data)
|
||||
|
||||
# Check if name of bills are ok
|
||||
b = [e["what"] for e in bills]
|
||||
|
@ -202,22 +245,23 @@ class CommonTestCase(object):
|
|||
ref = [e["what"] for e in self.data]
|
||||
ref.sort()
|
||||
|
||||
self.assertEqual(b, ref)
|
||||
assert b == ref
|
||||
|
||||
# Check if other informations in bill are ok
|
||||
for d in self.data:
|
||||
for b in bills:
|
||||
if b["what"] == d["what"]:
|
||||
self.assertEqual(b["payer_name"], d["payer_name"])
|
||||
self.assertEqual(b["amount"], d["amount"])
|
||||
self.assertEqual(b["currency"], "XXX")
|
||||
self.assertEqual(b["payer_weight"], d["payer_weight"])
|
||||
self.assertEqual(b["date"], d["date"])
|
||||
assert b["payer_name"] == d["payer_name"]
|
||||
assert b["amount"] == d["amount"]
|
||||
assert b["currency"] == "XXX"
|
||||
assert b["payer_weight"] == d["payer_weight"]
|
||||
assert b["date"] == d["date"]
|
||||
assert b["bill_type"] == d["bill_type"]
|
||||
list_project = [ower for ower in b["owers"]]
|
||||
list_project.sort()
|
||||
list_json = [ower for ower in d["owers"]]
|
||||
list_json.sort()
|
||||
self.assertEqual(list_project, list_json)
|
||||
assert list_project == list_json
|
||||
|
||||
def test_import_partial_project(self):
|
||||
# Import a JSON in a project with already existing data
|
||||
|
@ -230,13 +274,14 @@ class CommonTestCase(object):
|
|||
self.client.post(
|
||||
"/raclette/members/add", data={"name": "zorglub", "weight": 2}
|
||||
)
|
||||
self.client.post("/raclette/members/add", data={"name": "fred"})
|
||||
self.client.post("/raclette/members/add", data={"name": "jeanne"})
|
||||
self.client.post("/raclette/members/add", data={"name": "tata"})
|
||||
self.client.post(
|
||||
"/raclette/add",
|
||||
data={
|
||||
"date": "2016-12-31",
|
||||
"what": "red wine",
|
||||
"bill_type": "Expense",
|
||||
"payer": 2,
|
||||
"payed_for": [1, 3],
|
||||
"amount": "200",
|
||||
|
@ -250,7 +295,7 @@ class CommonTestCase(object):
|
|||
bills = project.get_pretty_bills()
|
||||
|
||||
# Check if all bills have been added
|
||||
self.assertEqual(len(bills), len(self.data))
|
||||
assert len(bills) == len(self.data)
|
||||
|
||||
# Check if name of bills are ok
|
||||
b = [e["what"] for e in bills]
|
||||
|
@ -258,22 +303,23 @@ class CommonTestCase(object):
|
|||
ref = [e["what"] for e in self.data]
|
||||
ref.sort()
|
||||
|
||||
self.assertEqual(b, ref)
|
||||
assert b == ref
|
||||
|
||||
# Check if other informations in bill are ok
|
||||
for d in self.data:
|
||||
for b in bills:
|
||||
if b["what"] == d["what"]:
|
||||
self.assertEqual(b["payer_name"], d["payer_name"])
|
||||
self.assertEqual(b["amount"], d["amount"])
|
||||
self.assertEqual(b["currency"], d["currency"])
|
||||
self.assertEqual(b["payer_weight"], d["payer_weight"])
|
||||
self.assertEqual(b["date"], d["date"])
|
||||
assert b["payer_name"] == d["payer_name"]
|
||||
assert b["amount"] == d["amount"]
|
||||
assert b["currency"] == d["currency"]
|
||||
assert b["payer_weight"] == d["payer_weight"]
|
||||
assert b["date"] == d["date"]
|
||||
assert b["bill_type"] == d["bill_type"]
|
||||
list_project = [ower for ower in b["owers"]]
|
||||
list_project.sort()
|
||||
list_json = [ower for ower in d["owers"]]
|
||||
list_json.sort()
|
||||
self.assertEqual(list_project, list_json)
|
||||
assert list_project == list_json
|
||||
|
||||
def test_import_wrong_data(self):
|
||||
self.post_project("raclette")
|
||||
|
@ -292,9 +338,10 @@ class CommonTestCase(object):
|
|||
{
|
||||
"date": "2017-01-01",
|
||||
"what": "refund",
|
||||
"bill_type": "Reimbursement",
|
||||
"payer_name": "tata",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["fred"],
|
||||
"owers": ["jeanne"],
|
||||
}
|
||||
]
|
||||
for data in [data_wrong_keys, data_amount_missing]:
|
||||
|
@ -302,7 +349,7 @@ class CommonTestCase(object):
|
|||
self.import_project("raclette", self.generate_form_data(data), 400)
|
||||
|
||||
|
||||
class ExportTestCase(IhatemoneyTestCase):
|
||||
class TestExport(IhatemoneyTestCase):
|
||||
def test_export(self):
|
||||
# Export a simple project without currencies
|
||||
|
||||
|
@ -310,7 +357,7 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
|
||||
# add participants
|
||||
self.client.post("/raclette/members/add", data={"name": "zorglub", "weight": 2})
|
||||
self.client.post("/raclette/members/add", data={"name": "fred"})
|
||||
self.client.post("/raclette/members/add", data={"name": "jeanne"})
|
||||
self.client.post("/raclette/members/add", data={"name": "tata"})
|
||||
self.client.post("/raclette/members/add", data={"name": "pépé"})
|
||||
|
||||
|
@ -319,7 +366,8 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
"/raclette/add",
|
||||
data={
|
||||
"date": "2016-12-31",
|
||||
"what": "fromage à raclette",
|
||||
"bill_type": "Expense",
|
||||
"what": "à raclette",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2, 3, 4],
|
||||
"amount": "10.0",
|
||||
|
@ -330,6 +378,7 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
"/raclette/add",
|
||||
data={
|
||||
"date": "2016-12-31",
|
||||
"bill_type": "Expense",
|
||||
"what": "red wine",
|
||||
"payer": 2,
|
||||
"payed_for": [1, 3],
|
||||
|
@ -341,6 +390,7 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
"/raclette/add",
|
||||
data={
|
||||
"date": "2017-01-01",
|
||||
"bill_type": "Reimbursement",
|
||||
"what": "refund",
|
||||
"payer": 3,
|
||||
"payed_for": [2],
|
||||
|
@ -353,48 +403,49 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
expected = [
|
||||
{
|
||||
"date": "2017-01-01",
|
||||
"bill_type": "Reimbursement",
|
||||
"what": "refund",
|
||||
"amount": 13.33,
|
||||
"currency": "XXX",
|
||||
"payer_name": "tata",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["fred"],
|
||||
"owers": ["jeanne"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"bill_type": "Expense",
|
||||
"what": "red wine",
|
||||
"amount": 200.0,
|
||||
"currency": "XXX",
|
||||
"payer_name": "fred",
|
||||
"payer_name": "jeanne",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["zorglub", "tata"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"what": "fromage \xe0 raclette",
|
||||
"bill_type": "Expense",
|
||||
"what": "\xe0 raclette",
|
||||
"amount": 10.0,
|
||||
"currency": "XXX",
|
||||
"payer_name": "zorglub",
|
||||
"payer_weight": 2.0,
|
||||
"owers": ["zorglub", "fred", "tata", "p\xe9p\xe9"],
|
||||
"owers": ["zorglub", "jeanne", "tata", "p\xe9p\xe9"],
|
||||
},
|
||||
]
|
||||
self.assertEqual(json.loads(resp.data.decode("utf-8")), expected)
|
||||
assert json.loads(resp.data.decode("utf-8")) == expected
|
||||
|
||||
# generate csv export of bills
|
||||
resp = self.client.get("/raclette/export/bills.csv")
|
||||
expected = [
|
||||
"date,what,amount,currency,payer_name,payer_weight,owers",
|
||||
"2017-01-01,refund,XXX,13.33,tata,1.0,fred",
|
||||
'2016-12-31,red wine,XXX,200.0,fred,1.0,"zorglub, tata"',
|
||||
'2016-12-31,fromage à raclette,10.0,XXX,zorglub,2.0,"zorglub, fred, tata, pépé"',
|
||||
"date,what,bill_type,amount,currency,payer_name,payer_weight,owers",
|
||||
"2017-01-01,refund,Reimbursement,XXX,13.33,tata,1.0,jeanne",
|
||||
'2016-12-31,red wine,Expense,XXX,200.0,jeanne,1.0,"zorglub, tata"',
|
||||
'2016-12-31,à raclette,Expense,10.0,XXX,zorglub,2.0,"zorglub, jeanne, tata, pépé"',
|
||||
]
|
||||
received_lines = resp.data.decode("utf-8").split("\n")
|
||||
|
||||
for i, line in enumerate(expected):
|
||||
self.assertEqual(
|
||||
set(line.split(",")), set(received_lines[i].strip("\r").split(","))
|
||||
)
|
||||
assert set(line.split(",")) == set(received_lines[i].strip("\r").split(","))
|
||||
|
||||
# generate json export of transactions
|
||||
resp = self.client.get("/raclette/export/transactions.json")
|
||||
|
@ -402,46 +453,45 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
{
|
||||
"amount": 2.00,
|
||||
"currency": "XXX",
|
||||
"receiver": "fred",
|
||||
"receiver": "jeanne",
|
||||
"ower": "p\xe9p\xe9",
|
||||
},
|
||||
{"amount": 55.34, "currency": "XXX", "receiver": "fred", "ower": "tata"},
|
||||
{"amount": 55.34, "currency": "XXX", "receiver": "jeanne", "ower": "tata"},
|
||||
{
|
||||
"amount": 127.33,
|
||||
"currency": "XXX",
|
||||
"receiver": "fred",
|
||||
"receiver": "jeanne",
|
||||
"ower": "zorglub",
|
||||
},
|
||||
]
|
||||
|
||||
self.assertEqual(json.loads(resp.data.decode("utf-8")), expected)
|
||||
assert json.loads(resp.data.decode("utf-8")) == expected
|
||||
|
||||
# generate csv export of transactions
|
||||
resp = self.client.get("/raclette/export/transactions.csv")
|
||||
|
||||
expected = [
|
||||
"amount,currency,receiver,ower",
|
||||
"2.0,XXX,fred,pépé",
|
||||
"55.34,XXX,fred,tata",
|
||||
"127.33,XXX,fred,zorglub",
|
||||
"2.0,XXX,jeanne,pépé",
|
||||
"55.34,XXX,jeanne,tata",
|
||||
"127.33,XXX,jeanne,zorglub",
|
||||
]
|
||||
received_lines = resp.data.decode("utf-8").split("\n")
|
||||
|
||||
for i, line in enumerate(expected):
|
||||
self.assertEqual(
|
||||
set(line.split(",")), set(received_lines[i].strip("\r").split(","))
|
||||
)
|
||||
assert set(line.split(",")) == set(received_lines[i].strip("\r").split(","))
|
||||
|
||||
# wrong export_format should return a 404
|
||||
resp = self.client.get("/raclette/export/transactions.wrong")
|
||||
self.assertEqual(resp.status_code, 404)
|
||||
assert resp.status_code == 404
|
||||
|
||||
@pytest.mark.skip(reason="Currency conversion is broken")
|
||||
def test_export_with_currencies(self):
|
||||
self.post_project("raclette", default_currency="EUR")
|
||||
|
||||
# add participants
|
||||
self.client.post("/raclette/members/add", data={"name": "zorglub", "weight": 2})
|
||||
self.client.post("/raclette/members/add", data={"name": "fred"})
|
||||
self.client.post("/raclette/members/add", data={"name": "jeanne"})
|
||||
self.client.post("/raclette/members/add", data={"name": "tata"})
|
||||
self.client.post("/raclette/members/add", data={"name": "pépé"})
|
||||
|
||||
|
@ -450,7 +500,8 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
"/raclette/add",
|
||||
data={
|
||||
"date": "2016-12-31",
|
||||
"what": "fromage à raclette",
|
||||
"what": "à raclette",
|
||||
"bill_type": "Expense",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2, 3, 4],
|
||||
"amount": "10.0",
|
||||
|
@ -463,6 +514,7 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
data={
|
||||
"date": "2016-12-31",
|
||||
"what": "poutine from Québec",
|
||||
"bill_type": "Expense",
|
||||
"payer": 2,
|
||||
"payed_for": [1, 3],
|
||||
"amount": "100",
|
||||
|
@ -475,6 +527,7 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
data={
|
||||
"date": "2017-01-01",
|
||||
"what": "refund",
|
||||
"bill_type": "Reimbursement",
|
||||
"payer": 3,
|
||||
"payed_for": [2],
|
||||
"amount": "13.33",
|
||||
|
@ -488,47 +541,48 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
{
|
||||
"date": "2017-01-01",
|
||||
"what": "refund",
|
||||
"bill_type": "Reimbursement",
|
||||
"amount": 13.33,
|
||||
"currency": "EUR",
|
||||
"payer_name": "tata",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["fred"],
|
||||
"owers": ["jeanne"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"what": "poutine from Qu\xe9bec",
|
||||
"bill_type": "Expense",
|
||||
"amount": 100.0,
|
||||
"currency": "CAD",
|
||||
"payer_name": "fred",
|
||||
"payer_name": "jeanne",
|
||||
"payer_weight": 1.0,
|
||||
"owers": ["zorglub", "tata"],
|
||||
},
|
||||
{
|
||||
"date": "2016-12-31",
|
||||
"what": "fromage \xe0 raclette",
|
||||
"bill_type": "Expense",
|
||||
"amount": 10.0,
|
||||
"currency": "EUR",
|
||||
"payer_name": "zorglub",
|
||||
"payer_weight": 2.0,
|
||||
"owers": ["zorglub", "fred", "tata", "p\xe9p\xe9"],
|
||||
"owers": ["zorglub", "jeanne", "tata", "p\xe9p\xe9"],
|
||||
},
|
||||
]
|
||||
self.assertEqual(json.loads(resp.data.decode("utf-8")), expected)
|
||||
assert json.loads(resp.data.decode("utf-8")) == expected
|
||||
|
||||
# generate csv export of bills
|
||||
resp = self.client.get("/raclette/export/bills.csv")
|
||||
expected = [
|
||||
"date,what,amount,currency,payer_name,payer_weight,owers",
|
||||
"2017-01-01,refund,13.33,EUR,tata,1.0,fred",
|
||||
'2016-12-31,poutine from Québec,100.0,CAD,fred,1.0,"zorglub, tata"',
|
||||
'2016-12-31,fromage à raclette,10.0,EUR,zorglub,2.0,"zorglub, fred, tata, pépé"',
|
||||
"date,what,bill_type,amount,currency,payer_name,payer_weight,owers",
|
||||
"2017-01-01,refund,Reimbursement,13.33,EUR,tata,1.0,jeanne",
|
||||
'2016-12-31,poutine from Québec,Expense,100.0,CAD,jeanne,1.0,"zorglub, tata"',
|
||||
'2016-12-31,à raclette,Expense,10.0,EUR,zorglub,2.0,"zorglub, jeanne, tata, pépé"',
|
||||
]
|
||||
received_lines = resp.data.decode("utf-8").split("\n")
|
||||
|
||||
for i, line in enumerate(expected):
|
||||
self.assertEqual(
|
||||
set(line.split(",")), set(received_lines[i].strip("\r").split(","))
|
||||
)
|
||||
assert set(line.split(",")) == set(received_lines[i].strip("\r").split(","))
|
||||
|
||||
# generate json export of transactions (in EUR!)
|
||||
resp = self.client.get("/raclette/export/transactions.json")
|
||||
|
@ -536,30 +590,33 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
{
|
||||
"amount": 2.00,
|
||||
"currency": "EUR",
|
||||
"receiver": "fred",
|
||||
"receiver": "jeanne",
|
||||
"ower": "p\xe9p\xe9",
|
||||
},
|
||||
{"amount": 10.89, "currency": "EUR", "receiver": "fred", "ower": "tata"},
|
||||
{"amount": 38.45, "currency": "EUR", "receiver": "fred", "ower": "zorglub"},
|
||||
{"amount": 10.89, "currency": "EUR", "receiver": "jeanne", "ower": "tata"},
|
||||
{
|
||||
"amount": 38.45,
|
||||
"currency": "EUR",
|
||||
"receiver": "jeanne",
|
||||
"ower": "zorglub",
|
||||
},
|
||||
]
|
||||
|
||||
self.assertEqual(json.loads(resp.data.decode("utf-8")), expected)
|
||||
assert json.loads(resp.data.decode("utf-8")) == expected
|
||||
|
||||
# generate csv export of transactions
|
||||
resp = self.client.get("/raclette/export/transactions.csv")
|
||||
|
||||
expected = [
|
||||
"amount,currency,receiver,ower",
|
||||
"2.0,EUR,fred,pépé",
|
||||
"10.89,EUR,fred,tata",
|
||||
"38.45,EUR,fred,zorglub",
|
||||
"2.0,EUR,jeanne,pépé",
|
||||
"10.89,EUR,jeanne,tata",
|
||||
"38.45,EUR,jeanne,zorglub",
|
||||
]
|
||||
received_lines = resp.data.decode("utf-8").split("\n")
|
||||
|
||||
for i, line in enumerate(expected):
|
||||
self.assertEqual(
|
||||
set(line.split(",")), set(received_lines[i].strip("\r").split(","))
|
||||
)
|
||||
assert set(line.split(",")) == set(received_lines[i].strip("\r").split(","))
|
||||
|
||||
# Change project currency to CAD
|
||||
project = self.get_project("raclette")
|
||||
|
@ -571,30 +628,33 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
{
|
||||
"amount": 3.00,
|
||||
"currency": "CAD",
|
||||
"receiver": "fred",
|
||||
"receiver": "jeanne",
|
||||
"ower": "p\xe9p\xe9",
|
||||
},
|
||||
{"amount": 16.34, "currency": "CAD", "receiver": "fred", "ower": "tata"},
|
||||
{"amount": 57.67, "currency": "CAD", "receiver": "fred", "ower": "zorglub"},
|
||||
{"amount": 16.34, "currency": "CAD", "receiver": "jeanne", "ower": "tata"},
|
||||
{
|
||||
"amount": 57.67,
|
||||
"currency": "CAD",
|
||||
"receiver": "jeanne",
|
||||
"ower": "zorglub",
|
||||
},
|
||||
]
|
||||
|
||||
self.assertEqual(json.loads(resp.data.decode("utf-8")), expected)
|
||||
assert json.loads(resp.data.decode("utf-8")) == expected
|
||||
|
||||
# generate csv export of transactions
|
||||
resp = self.client.get("/raclette/export/transactions.csv")
|
||||
|
||||
expected = [
|
||||
"amount,currency,receiver,ower",
|
||||
"3.0,CAD,fred,pépé",
|
||||
"16.34,CAD,fred,tata",
|
||||
"57.67,CAD,fred,zorglub",
|
||||
"3.0,CAD,jeanne,pépé",
|
||||
"16.34,CAD,jeanne,tata",
|
||||
"57.67,CAD,jeanne,zorglub",
|
||||
]
|
||||
received_lines = resp.data.decode("utf-8").split("\n")
|
||||
|
||||
for i, line in enumerate(expected):
|
||||
self.assertEqual(
|
||||
set(line.split(",")), set(received_lines[i].strip("\r").split(","))
|
||||
)
|
||||
assert set(line.split(",")) == set(received_lines[i].strip("\r").split(","))
|
||||
|
||||
def test_export_escape_formulae(self):
|
||||
self.post_project("raclette", default_currency="EUR")
|
||||
|
@ -608,6 +668,7 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
data={
|
||||
"date": "2016-12-31",
|
||||
"what": "=COS(36)",
|
||||
"bill_type": "Expense",
|
||||
"payer": 1,
|
||||
"payed_for": [1],
|
||||
"amount": "10.0",
|
||||
|
@ -618,29 +679,23 @@ class ExportTestCase(IhatemoneyTestCase):
|
|||
# generate csv export of bills
|
||||
resp = self.client.get("/raclette/export/bills.csv")
|
||||
expected = [
|
||||
"date,what,amount,currency,payer_name,payer_weight,owers",
|
||||
"2016-12-31,'=COS(36),10.0,EUR,zorglub,1.0,zorglub",
|
||||
"date,what,bill_type,amount,currency,payer_name,payer_weight,owers",
|
||||
"2016-12-31,'=COS(36),Expense,10.0,EUR,zorglub,1.0,zorglub",
|
||||
]
|
||||
received_lines = resp.data.decode("utf-8").split("\n")
|
||||
|
||||
for i, line in enumerate(expected):
|
||||
self.assertEqual(
|
||||
set(line.split(",")), set(received_lines[i].strip("\r").split(","))
|
||||
)
|
||||
assert set(line.split(",")) == set(received_lines[i].strip("\r").split(","))
|
||||
|
||||
|
||||
class ImportTestCaseJSON(CommonTestCase.Import):
|
||||
class TestImportJSON(CommonTestCase.Import):
|
||||
def generate_form_data(self, data):
|
||||
return {"file": (list_of_dicts2json(data), "test.json")}
|
||||
|
||||
|
||||
class ImportTestCaseCSV(CommonTestCase.Import):
|
||||
class TestImportCSV(CommonTestCase.Import):
|
||||
def generate_form_data(self, data):
|
||||
formatted_data = copy.deepcopy(data)
|
||||
for d in formatted_data:
|
||||
d["owers"] = ", ".join([o for o in d.get("owers", [])])
|
||||
return {"file": (list_of_dicts2csv(formatted_data), "test.csv")}
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
import os
|
||||
import smtplib
|
||||
import socket
|
||||
import unittest
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import orm
|
||||
from werkzeug.security import check_password_hash
|
||||
|
||||
|
@ -19,19 +19,18 @@ os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None)
|
|||
__HERE__ = os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
|
||||
class ConfigurationTestCase(BaseTestCase):
|
||||
class TestConfiguration(BaseTestCase):
|
||||
def test_default_configuration(self):
|
||||
"""Test that default settings are loaded when no other configuration file is specified"""
|
||||
self.assertFalse(self.app.config["DEBUG"])
|
||||
self.assertFalse(self.app.config["SQLALCHEMY_TRACK_MODIFICATIONS"])
|
||||
self.assertEqual(
|
||||
self.app.config["MAIL_DEFAULT_SENDER"],
|
||||
("Budget manager <admin@example.com>"),
|
||||
assert not self.app.config["DEBUG"]
|
||||
assert not self.app.config["SQLALCHEMY_TRACK_MODIFICATIONS"]
|
||||
assert self.app.config["MAIL_DEFAULT_SENDER"] == (
|
||||
"Budget manager <admin@example.com>"
|
||||
)
|
||||
self.assertTrue(self.app.config["ACTIVATE_DEMO_PROJECT"])
|
||||
self.assertTrue(self.app.config["ALLOW_PUBLIC_PROJECT_CREATION"])
|
||||
self.assertFalse(self.app.config["ACTIVATE_ADMIN_DASHBOARD"])
|
||||
self.assertFalse(self.app.config["ENABLE_CAPTCHA"])
|
||||
assert self.app.config["ACTIVATE_DEMO_PROJECT"]
|
||||
assert self.app.config["ALLOW_PUBLIC_PROJECT_CREATION"]
|
||||
assert not self.app.config["ACTIVATE_ADMIN_DASHBOARD"]
|
||||
assert not self.app.config["ENABLE_CAPTCHA"]
|
||||
|
||||
def test_env_var_configuration_file(self):
|
||||
"""Test that settings are loaded from a configuration file specified
|
||||
|
@ -40,7 +39,7 @@ class ConfigurationTestCase(BaseTestCase):
|
|||
__HERE__, "ihatemoney_envvar.cfg"
|
||||
)
|
||||
load_configuration(self.app)
|
||||
self.assertEqual(self.app.config["SECRET_KEY"], "lalatra")
|
||||
assert self.app.config["SECRET_KEY"] == "lalatra"
|
||||
|
||||
# Test that the specified configuration file is loaded
|
||||
# even if the default configuration file ihatemoney.cfg exists
|
||||
|
@ -50,7 +49,7 @@ class ConfigurationTestCase(BaseTestCase):
|
|||
)
|
||||
self.app.config.root_path = __HERE__
|
||||
load_configuration(self.app)
|
||||
self.assertEqual(self.app.config["SECRET_KEY"], "lalatra")
|
||||
assert self.app.config["SECRET_KEY"] == "lalatra"
|
||||
|
||||
os.environ.pop("IHATEMONEY_SETTINGS_FILE_PATH", None)
|
||||
|
||||
|
@ -59,10 +58,10 @@ class ConfigurationTestCase(BaseTestCase):
|
|||
in the current directory."""
|
||||
self.app.config.root_path = __HERE__
|
||||
load_configuration(self.app)
|
||||
self.assertEqual(self.app.config["SECRET_KEY"], "supersecret")
|
||||
assert self.app.config["SECRET_KEY"] == "supersecret"
|
||||
|
||||
|
||||
class ServerTestCase(IhatemoneyTestCase):
|
||||
class TestServer(IhatemoneyTestCase):
|
||||
def test_homepage(self):
|
||||
# See https://github.com/spiral-project/ihatemoney/pull/358
|
||||
self.app.config["APPLICATION_ROOT"] = "/"
|
||||
|
@ -80,7 +79,7 @@ class ServerTestCase(IhatemoneyTestCase):
|
|||
self.assertStatus(200, req)
|
||||
|
||||
|
||||
class CommandTestCase(BaseTestCase):
|
||||
class TestCommand(BaseTestCase):
|
||||
def test_generate_config(self):
|
||||
"""Simply checks that all config file generation
|
||||
- raise no exception
|
||||
|
@ -89,32 +88,32 @@ class CommandTestCase(BaseTestCase):
|
|||
runner = self.app.test_cli_runner()
|
||||
for config_file in generate_config.params[0].type.choices:
|
||||
result = runner.invoke(generate_config, config_file)
|
||||
self.assertNotEqual(len(result.output.strip()), 0)
|
||||
assert len(result.output.strip()) != 0
|
||||
|
||||
def test_generate_password_hash(self):
|
||||
runner = self.app.test_cli_runner()
|
||||
with patch("getpass.getpass", new=lambda prompt: "secret"):
|
||||
result = runner.invoke(password_hash)
|
||||
self.assertTrue(check_password_hash(result.output.strip(), "secret"))
|
||||
assert check_password_hash(result.output.strip(), "secret")
|
||||
|
||||
def test_demo_project_deletion(self):
|
||||
self.create_project("demo")
|
||||
self.assertEqual(self.get_project("demo").name, "demo")
|
||||
assert self.get_project("demo").name == "demo"
|
||||
|
||||
runner = self.app.test_cli_runner()
|
||||
runner.invoke(delete_project, "demo")
|
||||
|
||||
self.assertEqual(len(models.Project.query.all()), 0)
|
||||
assert len(models.Project.query.all()) == 0
|
||||
|
||||
|
||||
class ModelsTestCase(IhatemoneyTestCase):
|
||||
class TestModels(IhatemoneyTestCase):
|
||||
def test_weighted_bills(self):
|
||||
"""Test the SQL request that fetch all bills and weights"""
|
||||
self.post_project("raclette")
|
||||
|
||||
# add members
|
||||
self.client.post("/raclette/members/add", data={"name": "zorglub", "weight": 2})
|
||||
self.client.post("/raclette/members/add", data={"name": "fred"})
|
||||
self.client.post("/raclette/members/add", data={"name": "jeanne"})
|
||||
self.client.post("/raclette/members/add", data={"name": "tata"})
|
||||
# Add a member with a balance=0 :
|
||||
self.client.post("/raclette/members/add", data={"name": "pépé"})
|
||||
|
@ -127,6 +126,7 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
"what": "fromage à raclette",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2, 3],
|
||||
"bill_type": "Expense",
|
||||
"amount": "10.0",
|
||||
},
|
||||
)
|
||||
|
@ -138,6 +138,7 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
"what": "red wine",
|
||||
"payer": 2,
|
||||
"payed_for": [1],
|
||||
"bill_type": "Expense",
|
||||
"amount": "20",
|
||||
},
|
||||
)
|
||||
|
@ -149,6 +150,7 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
"what": "delicatessen",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2],
|
||||
"bill_type": "Expense",
|
||||
"amount": "10",
|
||||
},
|
||||
)
|
||||
|
@ -156,20 +158,20 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
for weight, bill in project.get_bill_weights().all():
|
||||
if bill.what == "red wine":
|
||||
pay_each_expected = 20 / 2
|
||||
self.assertEqual(bill.amount / weight, pay_each_expected)
|
||||
assert bill.amount / weight == pay_each_expected
|
||||
if bill.what == "fromage à raclette":
|
||||
pay_each_expected = 10 / 4
|
||||
self.assertEqual(bill.amount / weight, pay_each_expected)
|
||||
assert bill.amount / weight == pay_each_expected
|
||||
if bill.what == "delicatessen":
|
||||
pay_each_expected = 10 / 3
|
||||
self.assertEqual(bill.amount / weight, pay_each_expected)
|
||||
assert bill.amount / weight == pay_each_expected
|
||||
|
||||
def test_bill_pay_each(self):
|
||||
self.post_project("raclette")
|
||||
|
||||
# add members
|
||||
self.client.post("/raclette/members/add", data={"name": "zorglub", "weight": 2})
|
||||
self.client.post("/raclette/members/add", data={"name": "fred"})
|
||||
self.client.post("/raclette/members/add", data={"name": "jeanne"})
|
||||
self.client.post("/raclette/members/add", data={"name": "tata"})
|
||||
# Add a member with a balance=0 :
|
||||
self.client.post("/raclette/members/add", data={"name": "pépé"})
|
||||
|
@ -182,6 +184,7 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
"what": "fromage à raclette",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2, 3],
|
||||
"bill_type": "Expense",
|
||||
"amount": "10.0",
|
||||
},
|
||||
)
|
||||
|
@ -193,6 +196,7 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
"what": "red wine",
|
||||
"payer": 2,
|
||||
"payed_for": [1],
|
||||
"bill_type": "Expense",
|
||||
"amount": "20",
|
||||
},
|
||||
)
|
||||
|
@ -204,6 +208,7 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
"what": "delicatessen",
|
||||
"payer": 1,
|
||||
"payed_for": [1, 2],
|
||||
"bill_type": "Expense",
|
||||
"amount": "10",
|
||||
},
|
||||
)
|
||||
|
@ -216,16 +221,16 @@ class ModelsTestCase(IhatemoneyTestCase):
|
|||
for bill in zorglub_bills.all():
|
||||
if bill.what == "red wine":
|
||||
pay_each_expected = 20 / 2
|
||||
self.assertEqual(bill.pay_each(), pay_each_expected)
|
||||
assert bill.pay_each() == pay_each_expected
|
||||
if bill.what == "fromage à raclette":
|
||||
pay_each_expected = 10 / 4
|
||||
self.assertEqual(bill.pay_each(), pay_each_expected)
|
||||
assert bill.pay_each() == pay_each_expected
|
||||
if bill.what == "delicatessen":
|
||||
pay_each_expected = 10 / 3
|
||||
self.assertEqual(bill.pay_each(), pay_each_expected)
|
||||
assert bill.pay_each() == pay_each_expected
|
||||
|
||||
|
||||
class EmailFailureTestCase(IhatemoneyTestCase):
|
||||
class TestEmailFailure(IhatemoneyTestCase):
|
||||
def test_creation_email_failure_smtp(self):
|
||||
self.login("raclette")
|
||||
with patch.object(
|
||||
|
@ -233,14 +238,14 @@ class EmailFailureTestCase(IhatemoneyTestCase):
|
|||
):
|
||||
resp = self.post_project("raclette")
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"We tried to send you an reminder email, but there was an error",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"We tried to send you an reminder email, but there was an error"
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
# Check that we were redirected to the home page anyway
|
||||
self.assertIn(
|
||||
'You probably want to <a href="/raclette/members/add"',
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
'<a href="/raclette/members/add">Add the first participant'
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
|
||||
def test_creation_email_failure_socket(self):
|
||||
|
@ -248,14 +253,14 @@ class EmailFailureTestCase(IhatemoneyTestCase):
|
|||
with patch.object(self.app.mail, "send", MagicMock(side_effect=socket.error)):
|
||||
resp = self.post_project("raclette")
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"We tried to send you an reminder email, but there was an error",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"We tried to send you an reminder email, but there was an error"
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
# Check that we were redirected to the home page anyway
|
||||
self.assertIn(
|
||||
'You probably want to <a href="/raclette/members/add"',
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
'<a href="/raclette/members/add">Add the first participant'
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
|
||||
def test_password_reset_email_failure(self):
|
||||
|
@ -266,14 +271,13 @@ class EmailFailureTestCase(IhatemoneyTestCase):
|
|||
"/password-reminder", data={"id": "raclette"}, follow_redirects=True
|
||||
)
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"there was an error while sending you an email",
|
||||
resp.data.decode("utf-8"),
|
||||
assert "there was an error while sending you an email" in resp.data.decode(
|
||||
"utf-8"
|
||||
)
|
||||
# Check that we were not redirected to the success page
|
||||
self.assertNotIn(
|
||||
"A link to reset your password has been sent to you",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"A link to reset your password has been sent to you"
|
||||
not in resp.data.decode("utf-8")
|
||||
)
|
||||
|
||||
def test_invitation_email_failure(self):
|
||||
|
@ -287,17 +291,15 @@ class EmailFailureTestCase(IhatemoneyTestCase):
|
|||
follow_redirects=True,
|
||||
)
|
||||
# Check that an error message is displayed
|
||||
self.assertIn(
|
||||
"there was an error while trying to send the invitation emails",
|
||||
resp.data.decode("utf-8"),
|
||||
assert (
|
||||
"there was an error while trying to send the invitation emails"
|
||||
in resp.data.decode("utf-8")
|
||||
)
|
||||
# Check that we are still on the same page (no redirection)
|
||||
self.assertIn(
|
||||
"Invite people to join this project", resp.data.decode("utf-8")
|
||||
)
|
||||
assert "Invite people to join this project" in resp.data.decode("utf-8")
|
||||
|
||||
|
||||
class CaptchaTestCase(IhatemoneyTestCase):
|
||||
class TestCaptcha(IhatemoneyTestCase):
|
||||
ENABLE_CAPTCHA = True
|
||||
|
||||
def test_project_creation_with_captcha_case_insensitive(self):
|
||||
|
@ -315,7 +317,7 @@ class CaptchaTestCase(IhatemoneyTestCase):
|
|||
"captcha": "éùüß",
|
||||
},
|
||||
)
|
||||
self.assertEqual(len(models.Project.query.all()), 1)
|
||||
assert len(models.Project.query.all()) == 1
|
||||
|
||||
def test_project_creation_with_captcha(self):
|
||||
with self.client as c:
|
||||
|
@ -329,7 +331,7 @@ class CaptchaTestCase(IhatemoneyTestCase):
|
|||
"default_currency": "USD",
|
||||
},
|
||||
)
|
||||
self.assertEqual(len(models.Project.query.all()), 0)
|
||||
assert len(models.Project.query.all()) == 0
|
||||
|
||||
c.post(
|
||||
"/create",
|
||||
|
@ -342,7 +344,7 @@ class CaptchaTestCase(IhatemoneyTestCase):
|
|||
"captcha": "nope",
|
||||
},
|
||||
)
|
||||
self.assertEqual(len(models.Project.query.all()), 0)
|
||||
assert len(models.Project.query.all()) == 0
|
||||
|
||||
c.post(
|
||||
"/create",
|
||||
|
@ -355,7 +357,7 @@ class CaptchaTestCase(IhatemoneyTestCase):
|
|||
"captcha": "euro",
|
||||
},
|
||||
)
|
||||
self.assertEqual(len(models.Project.query.all()), 1)
|
||||
assert len(models.Project.query.all()) == 1
|
||||
|
||||
def test_api_project_creation_does_not_need_captcha(self):
|
||||
self.client.get("/")
|
||||
|
@ -368,11 +370,11 @@ class CaptchaTestCase(IhatemoneyTestCase):
|
|||
"contact_email": "raclette@notmyidea.org",
|
||||
},
|
||||
)
|
||||
self.assertTrue(resp.status, 201)
|
||||
self.assertEqual(len(models.Project.query.all()), 1)
|
||||
assert resp.status_code == 201
|
||||
assert len(models.Project.query.all()) == 1
|
||||
|
||||
|
||||
class TestCurrencyConverter(unittest.TestCase):
|
||||
class TestCurrencyConverter:
|
||||
converter = CurrencyConverter()
|
||||
mock_data = {
|
||||
"USD": 1,
|
||||
|
@ -386,28 +388,23 @@ class TestCurrencyConverter(unittest.TestCase):
|
|||
def test_only_one_instance(self):
|
||||
one = id(CurrencyConverter())
|
||||
two = id(CurrencyConverter())
|
||||
self.assertEqual(one, two)
|
||||
assert one == two
|
||||
|
||||
def test_get_currencies(self):
|
||||
self.assertCountEqual(
|
||||
self.converter.get_currencies(),
|
||||
["USD", "EUR", "CAD", "PLN", CurrencyConverter.no_currency],
|
||||
)
|
||||
currencies = self.converter.get_currencies()
|
||||
for currency in ["USD", "EUR", "CAD", "PLN", CurrencyConverter.no_currency]:
|
||||
assert currency in currencies
|
||||
|
||||
def test_exchange_currency(self):
|
||||
result = self.converter.exchange_currency(100, "USD", "EUR")
|
||||
self.assertEqual(result, 80.0)
|
||||
assert result == 80.0
|
||||
|
||||
def test_failing_remote(self):
|
||||
rates = {}
|
||||
with patch("requests.Response.json", new=lambda _: {}), self.assertWarns(
|
||||
with patch("requests.Response.json", new=lambda _: {}), pytest.warns(
|
||||
UserWarning
|
||||
):
|
||||
# we need a non-patched converter, but it seems that MagickMock
|
||||
# is mocking EVERY instance of the class method. Too bad.
|
||||
rates = CurrencyConverter.get_rates(self.converter)
|
||||
self.assertDictEqual(rates, {CurrencyConverter.no_currency: 1})
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
assert rates == {CurrencyConverter.no_currency: 1}
|
||||
|
|
Binary file not shown.
|
@ -1,18 +1,23 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-04-13 21:42+0200\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2022-04-14 21:10+0000\n"
|
||||
"Last-Translator: Hasidul Islam <ihasidul@gmail.com>\n"
|
||||
"Language-Team: Bengali <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/bn/>\n"
|
||||
"Language: bn\n"
|
||||
"Language-Team: Bengali <https://hosted.weblate.org/projects/i-hate-"
|
||||
"money/i-hate-money/bn/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -22,6 +27,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "প্রজেক্টের নাম"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "নতুন ব্যক্তিগত কোড"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "নতুন ব্যক্তিগত কোড"
|
||||
|
||||
|
@ -43,6 +55,12 @@ msgstr "ডিফল্ট মুদ্রা"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "অজানা ত্রুটি"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "অবৈধ ব্যক্তিগত কোড."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
|
@ -50,10 +68,7 @@ msgstr ""
|
|||
"এই প্রজেক্টটি 'নো কারেন্সি' সেট করা যাবে না কারণ এতে একাধিক মুদ্রার বিল "
|
||||
"রয়েছে৷"
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
|
@ -70,8 +85,8 @@ msgid ""
|
|||
"A project with this identifier (\"%(project)s\") already exists. Please "
|
||||
"choose a new identifier"
|
||||
msgstr ""
|
||||
"এই শনাক্তকারী(\"%(project)s\")সহ একটি প্রজেক্ট ইতিমধ্যেই বিদ্যমান৷ একটি নতুন "
|
||||
"শনাক্তকারী ঠিক করুন"
|
||||
"এই শনাক্তকারী(\"%(project)s\")সহ একটি প্রজেক্ট ইতিমধ্যেই বিদ্যমান৷ একটি "
|
||||
"নতুন শনাক্তকারী ঠিক করুন"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr "কোনটি আসল মুদ্রা: ইউরো না পেট্রো ডলার?"
|
||||
|
@ -85,12 +100,6 @@ msgstr "অনুগ্রহ করে, এগিয়ে যেতে ক্
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "মুছে ফেলা নিশ্চিত করতে ব্যক্তিগত কোড লিখুন"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "অজানা ত্রুটি"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "অবৈধ ব্যক্তিগত কোড."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "প্রবেশ করুন"
|
||||
|
||||
|
@ -115,16 +124,16 @@ msgstr "পাসওয়ার্ড নিশ্চিতকরণ"
|
|||
msgid "Reset password"
|
||||
msgstr "পাসওয়ার্ড রিসেট করুন"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "তারিখ"
|
||||
msgid "When?"
|
||||
msgstr ""
|
||||
|
||||
msgid "What?"
|
||||
msgstr "কি?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "প্রদানকারী"
|
||||
msgid "Who paid?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Amount paid"
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Currency"
|
||||
|
@ -149,9 +158,6 @@ msgstr ""
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr ""
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
|
@ -173,13 +179,25 @@ msgstr ""
|
|||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
|
@ -207,7 +225,7 @@ msgstr ""
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -220,10 +238,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
|
@ -232,14 +246,9 @@ msgid ""
|
|||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
|
@ -254,10 +263,14 @@ msgstr ""
|
|||
msgid "Password successfully reset."
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -265,12 +278,18 @@ msgid ""
|
|||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
@ -278,10 +297,7 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -324,6 +340,10 @@ msgstr ""
|
|||
msgid "The bill has been modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr ""
|
||||
|
||||
|
@ -384,7 +404,7 @@ msgstr ""
|
|||
msgid "edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
|
@ -399,20 +419,12 @@ msgstr ""
|
|||
msgid "Get it on"
|
||||
msgstr ""
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "প্রজেক্ট তৈরি করুন"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr ""
|
||||
|
@ -438,18 +450,27 @@ msgstr ""
|
|||
msgid "Privacy Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the project"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr ""
|
||||
|
||||
|
@ -468,9 +489,6 @@ msgstr ""
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
|
@ -535,23 +553,18 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -562,18 +575,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
|
||||
|
@ -635,9 +648,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "প্রদানকারী"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr ""
|
||||
|
||||
msgid "Date"
|
||||
msgstr "তারিখ"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr ""
|
||||
|
@ -738,6 +757,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
|
@ -747,7 +769,8 @@ msgstr ""
|
|||
msgid "Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
|
@ -759,7 +782,7 @@ msgstr ""
|
|||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -781,30 +804,21 @@ msgstr ""
|
|||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "When?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who paid?"
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For what?"
|
||||
msgstr ""
|
||||
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr ""
|
||||
|
@ -813,19 +827,19 @@ msgstr ""
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "No bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgid "Add the first participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password reminder"
|
||||
|
@ -848,31 +862,49 @@ msgstr ""
|
|||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "ব্যক্তিগত কোড"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
@ -904,3 +936,118 @@ msgstr ""
|
|||
|
||||
msgid "Period"
|
||||
msgstr ""
|
||||
|
||||
#~ msgid "Import previously exported JSON file"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Too many failed login attempts, please retry later."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "sending you an email with password "
|
||||
#~ "reset instructions. Please check the "
|
||||
#~ "email configuration of the server or "
|
||||
#~ "contact the administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "trying to send the invitation emails."
|
||||
#~ " Please check the email configuration "
|
||||
#~ "of the server or contact the "
|
||||
#~ "administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add a bill"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email for you."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email with the invitation "
|
||||
#~ "link."
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2020-08-01 10:41+0000\n"
|
||||
"Last-Translator: Oymate <dhruboadittya96@gmail.com>\n"
|
||||
"Language: bn_BD\n"
|
||||
|
@ -15,6 +15,10 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,6 +29,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "প্রকল্পের নাম"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "ব্যক্তিগত কোড"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "New private code"
|
||||
msgstr "ব্যক্তিগত কোড"
|
||||
|
@ -47,16 +58,20 @@ msgstr "ডিফল্ট মুদ্রা"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "অজানা ত্রুট"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "ব্যক্তিগত কোড"
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "পূর্বে রপ্তানি করা JSON ফাইল আমদানি করুন"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "আমদানি"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "প্রকল্প শনাক্তকারী"
|
||||
|
@ -85,13 +100,6 @@ msgstr ""
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "মুছে ফেলার জন্য ব্যক্তিগত কোড লিখুন"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "অজানা ত্রুট"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "ব্যক্তিগত কোড"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "ভিতরে আস"
|
||||
|
||||
|
@ -116,16 +124,16 @@ msgstr ""
|
|||
msgid "Reset password"
|
||||
msgstr ""
|
||||
|
||||
msgid "Date"
|
||||
msgid "When?"
|
||||
msgstr ""
|
||||
|
||||
msgid "What?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgid "Who paid?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Amount paid"
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Currency"
|
||||
|
@ -150,9 +158,6 @@ msgstr ""
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr ""
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
|
@ -174,13 +179,25 @@ msgstr ""
|
|||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
|
@ -208,7 +225,7 @@ msgstr ""
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -221,10 +238,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
|
@ -233,14 +246,9 @@ msgid ""
|
|||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
|
@ -255,10 +263,14 @@ msgstr ""
|
|||
msgid "Password successfully reset."
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -266,12 +278,18 @@ msgid ""
|
|||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
@ -279,10 +297,7 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -325,6 +340,10 @@ msgstr ""
|
|||
msgid "The bill has been modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting project history"
|
||||
msgstr "প্রকল্পের ইতিহাস সক্রিয় করো"
|
||||
|
@ -387,7 +406,7 @@ msgstr ""
|
|||
msgid "edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
|
@ -402,20 +421,12 @@ msgstr ""
|
|||
msgid "Get it on"
|
||||
msgstr ""
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "প্রকল্প তৈরি করুন"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr ""
|
||||
|
@ -441,18 +452,28 @@ msgstr ""
|
|||
msgid "Privacy Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the project"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "পূর্বে রপ্তানি করা JSON ফাইল আমদানি করুন"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr ""
|
||||
|
||||
|
@ -471,9 +492,6 @@ msgstr ""
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
|
@ -538,23 +556,18 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -565,18 +578,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
|
||||
|
@ -638,9 +651,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr ""
|
||||
|
||||
msgid "Amount"
|
||||
msgstr ""
|
||||
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr ""
|
||||
|
@ -741,6 +760,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
|
@ -750,7 +772,8 @@ msgstr ""
|
|||
msgid "Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
|
@ -762,7 +785,7 @@ msgstr ""
|
|||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -784,30 +807,21 @@ msgstr ""
|
|||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "When?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who paid?"
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For what?"
|
||||
msgstr ""
|
||||
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr ""
|
||||
|
@ -816,19 +830,19 @@ msgstr ""
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "No bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgid "Add the first participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password reminder"
|
||||
|
@ -851,31 +865,49 @@ msgstr ""
|
|||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "ব্যক্তিগত কোড"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
@ -1012,3 +1044,115 @@ msgstr ""
|
|||
|
||||
#~ msgid "Participants to notify"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "আমদানি"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Too many failed login attempts, please retry later."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "sending you an email with password "
|
||||
#~ "reset instructions. Please check the "
|
||||
#~ "email configuration of the server or "
|
||||
#~ "contact the administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "trying to send the invitation emails."
|
||||
#~ " Please check the email configuration "
|
||||
#~ "of the server or contact the "
|
||||
#~ "administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add a bill"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email for you."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email with the invitation "
|
||||
#~ "link."
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
Binary file not shown.
|
@ -2,28 +2,40 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-08-29 18:51+0200\n"
|
||||
"PO-Revision-Date: 2022-09-12 15:25+0000\n"
|
||||
"Last-Translator: Maite Guix <maite.guix@gmail.com>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2024-07-03 19:09+0000\n"
|
||||
"Last-Translator: Quentin PAGÈS <quentinantonin@free.fr>\n"
|
||||
"Language-Team: Catalan <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/ca/>\n"
|
||||
"Language: ca\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.14.1-dev\n"
|
||||
"X-Generator: Weblate 5.7-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Acabes de crear '%(project)s' per a compartir les teves despeses"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
msgstr ""
|
||||
"No és un import o expressió vàlida. Només s'accepten números i els operadors "
|
||||
"+ - * /."
|
||||
"No és un import o expressió vàlida. Només s'accepten números i els "
|
||||
"operadors + - * /."
|
||||
|
||||
msgid "Project name"
|
||||
msgstr "Nom del projecte"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Codi privat nou"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Codi privat nou"
|
||||
|
||||
|
@ -47,18 +59,21 @@ msgstr ""
|
|||
"L'establiment d'una moneda predeterminada permet la conversió de moneda "
|
||||
"entre factures"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Error desconegut"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Codi privat no vàlid."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"Aquest projecte no es pot definir com a «cap moneda» perquè conté factures "
|
||||
"en diverses monedes."
|
||||
"Aquest projecte no es pot definir com a «cap moneda» perquè conté "
|
||||
"factures en diverses monedes."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Importar el fitxer JSON anteriorment exportat"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Identificador del projecte"
|
||||
|
@ -74,8 +89,8 @@ msgid ""
|
|||
"A project with this identifier (\"%(project)s\") already exists. Please "
|
||||
"choose a new identifier"
|
||||
msgstr ""
|
||||
"Ja existeix un projecte amb aquest identificador (\"%(project)s\"). Si us "
|
||||
"plau, tria un identificador nou"
|
||||
"Ja existeix un projecte amb aquest identificador (\"%(project)s\"). Si us"
|
||||
" plau, tria un identificador nou"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr "En quina moneda: euro o petrodòlar?"
|
||||
|
@ -89,12 +104,6 @@ msgstr "Si us plau, valida el captcha per a continuar."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Introdueix el codi privat per a confirmar la supressió"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Error desconegut"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Codi privat no vàlid."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Entrar-hi"
|
||||
|
||||
|
@ -119,17 +128,17 @@ msgstr "Confirmació de contrasenya"
|
|||
msgid "Reset password"
|
||||
msgstr "Restablir la contrasenya"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
msgid "When?"
|
||||
msgstr "Quan?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Què?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pagador"
|
||||
msgid "Who paid?"
|
||||
msgstr "Qui va pagar?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Import pagat"
|
||||
msgid "How much?"
|
||||
msgstr "Quant?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Moneda"
|
||||
|
@ -153,9 +162,6 @@ msgstr "Enviar i afegir-ne un de nou"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Moneda predeterminada del projecte: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Les factures no poden ser nul·les"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
|
@ -177,13 +183,28 @@ msgstr "Aquest projecte ja compta amb aquest participant"
|
|||
msgid "People to notify"
|
||||
msgstr "Gent a notificar"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "Enviar invitacions"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Enviar les invitacions"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "El correu electrònic %(email)s no és vàlid"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Tancar sessió"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Ho sentim, s'ha produït un error en intentar enviar els correus "
|
||||
"electrònics d'invitació. Comprova la configuració de correu electrònic "
|
||||
"del servidor o posa't en contacte amb l'administrador."
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} i {dual_object_1}"
|
||||
|
@ -201,7 +222,7 @@ msgid "{start_object}, {next_object}"
|
|||
msgstr "{start_object}, {next_object}"
|
||||
|
||||
msgid "No Currency"
|
||||
msgstr "Sense moneda"
|
||||
msgstr "Cap moneda"
|
||||
|
||||
#. Form error with only one error
|
||||
msgid "{prefix}: {error}"
|
||||
|
@ -211,14 +232,15 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Massa intents d'inici de sessió fallits, torna-ho a provar més tard."
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
msgstr ""
|
||||
"Aquesta contrasenya d'administrador no és la correcta. Només queden %(num)d "
|
||||
"intents."
|
||||
"Aquesta contrasenya d'administrador no és la correcta. Només queden "
|
||||
"%(num)d intents."
|
||||
|
||||
msgid "Provided token is invalid"
|
||||
msgstr "El testimoni proporcionat no és vàlid"
|
||||
|
@ -226,10 +248,6 @@ msgstr "El testimoni proporcionat no és vàlid"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Aquest codi privat no és el correcte"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Acabes de crear '%(project)s' per a compartir les teves despeses"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "T'acaben d'enviar un correu electrònic de recordatori"
|
||||
|
||||
|
@ -240,18 +258,15 @@ msgstr ""
|
|||
"Hem intentat enviar-vos un correu electrònic de recordatori, però s'ha "
|
||||
"produït un error. Encara podeu utilitzar el projecte amb normalitat."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "L'identificador del projecte és %(project)s"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Ho sentim, s'ha produït un error en enviar-te un correu electrònic amb "
|
||||
"instruccions de restabliment de la contrasenya. Comprova la configuració de "
|
||||
"correu electrònic del servidor o posa't en contacte amb l'administrador."
|
||||
"instruccions de restabliment de la contrasenya. Comprova la configuració "
|
||||
"de correu electrònic del servidor o posa't en contacte amb "
|
||||
"l'administrador."
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "No s'ha proporcionat cap testimoni"
|
||||
|
@ -265,18 +280,25 @@ msgstr "Projecte desconegut"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "La contrasenya s'ha restablert correctament."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "El projecte s'ha penjat correctament"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "JSON no vàlid"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
"No es poden afegir factures en diverses monedes a un projecte sense moneda "
|
||||
"predeterminada"
|
||||
"No es poden afegir factures en diverses monedes a un projecte sense "
|
||||
"moneda predeterminada"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "El projecte s'ha penjat correctament"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "El projecte s'ha suprimit correctament"
|
||||
|
@ -284,6 +306,9 @@ msgstr "El projecte s'ha suprimit correctament"
|
|||
msgid "Error deleting project"
|
||||
msgstr "S'ha produït un error en suprimir el projecte"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "T'han convidat a compartir les teves despeses per a %(project)s"
|
||||
|
@ -291,14 +316,12 @@ msgstr "T'han convidat a compartir les teves despeses per a %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "S'han enviat les teves invitacions"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
#, fuzzy
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Ho sentim, s'ha produït un error en intentar enviar els correus electrònics "
|
||||
"d'invitació. Comprova la configuració de correu electrònic del servidor o "
|
||||
"posa't en contacte amb l'administrador."
|
||||
"Ho sentim, s'ha produït un error en intentar enviar els correus "
|
||||
"electrònics d'invitació. Comprova la configuració de correu electrònic "
|
||||
"del servidor o posa't en contacte amb l'administrador."
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
|
@ -319,8 +342,8 @@ msgid ""
|
|||
"Participant '%(name)s' has been deactivated. It will still appear in the "
|
||||
"list until its balance reach zero."
|
||||
msgstr ""
|
||||
"El participant «%(name)s» ha estat desactivat. Continuarà apareixent a la "
|
||||
"llista fins que el seu saldo arribi a zero."
|
||||
"El participant «%(name)s» ha estat desactivat. Continuarà apareixent a la"
|
||||
" llista fins que el seu saldo arribi a zero."
|
||||
|
||||
#, python-format
|
||||
msgid "Participant '%(name)s' has been removed"
|
||||
|
@ -342,6 +365,10 @@ msgstr "La factura s'ha suprimit"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "La factura ha estat modificada"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "S'ha produït un error en suprimir l'historial del projecte"
|
||||
|
||||
|
@ -402,8 +429,8 @@ msgstr "Accions"
|
|||
msgid "edit"
|
||||
msgstr "editar"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "suprimir"
|
||||
msgid "Delete project"
|
||||
msgstr "Suprimir el projecte"
|
||||
|
||||
msgid "show"
|
||||
msgstr "mostrar"
|
||||
|
@ -417,20 +444,12 @@ msgstr "Descarregar l'aplicació mòbil"
|
|||
msgid "Get it on"
|
||||
msgstr "Aconsegueix-ho"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "N'estàs segur?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Editar el projecte"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Suprimir el projecte"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Importar JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Triar fitxer"
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "Editar el projecte"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Descarregar les dades del projecte"
|
||||
|
@ -446,8 +465,8 @@ msgstr "Plans de liquidació"
|
|||
|
||||
msgid "Download the list of transactions needed to settle the current bills."
|
||||
msgstr ""
|
||||
"Descarregar la llista transaccions necessàries per a liquidar les factures "
|
||||
"actuals."
|
||||
"Descarregar la llista transaccions necessàries per a liquidar les "
|
||||
"factures actuals."
|
||||
|
||||
msgid "Can't remember the password?"
|
||||
msgstr "No recordes la contrasenya?"
|
||||
|
@ -458,12 +477,20 @@ msgstr "Cancel·lar"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Configuració de la privacitat"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Editar el projecte"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
"Això eliminarà totes les factures i tots els participants en aquest projecte!"
|
||||
"Això eliminarà totes les factures i tots els participants en aquest "
|
||||
"projecte!"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Importar el fitxer JSON anteriorment exportat"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Triar fitxer"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Editar aquesta factura"
|
||||
|
@ -471,6 +498,9 @@ msgstr "Editar aquesta factura"
|
|||
msgid "Add a bill"
|
||||
msgstr "Afegir una factura"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Tothom"
|
||||
|
||||
|
@ -489,9 +519,6 @@ msgstr "Editar aquest participant"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "eloi.serra@exemple.cat, maria.canut@lloc.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Enviar les invitacions"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Descarregar"
|
||||
|
||||
|
@ -518,8 +545,7 @@ msgstr "S'ha canviat la configuració de l'historial"
|
|||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed from %(before)s to %(after)s"
|
||||
msgstr ""
|
||||
"Factura %(name)s: %(property_name)s ha canviat de %(before)s a %(after)s"
|
||||
msgstr "Factura %(name)s: %(property_name)s ha canviat de %(before)s a %(after)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed to %(after)s"
|
||||
|
@ -534,10 +560,10 @@ msgid ""
|
|||
" The rest of the project history will be unaffected. This "
|
||||
"action cannot be undone."
|
||||
msgstr ""
|
||||
"Estàs segur que vols suprimir totes les adreces IP enregistrades d'aquest "
|
||||
"projecte?\n"
|
||||
" La resta de l'historial del projecte no es veurà afectat. "
|
||||
"Aquesta acció no es pot desfer."
|
||||
"Estàs segur que vols suprimir totes les adreces IP enregistrades d'aquest"
|
||||
" projecte?\n"
|
||||
" La resta de l'historial del projecte no es veurà afectat."
|
||||
" Aquesta acció no es pot desfer."
|
||||
|
||||
msgid "Confirm deletion"
|
||||
msgstr "Confirmar la supressió"
|
||||
|
@ -561,39 +587,23 @@ msgstr "Factura %(name)s: afegida a la llista de propietaris %(owers_list_str)s"
|
|||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
"Factura %(name)s: eliminada de la llista de propietaris %(owers_list_str)s"
|
||||
msgstr "Factura %(name)s: eliminada de la llista de propietaris %(owers_list_str)s"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Aquest projecte té l'historial deshabilitat. Les accions "
|
||||
"noves no apareixeran a continuació. Pots habilitar l'historial a la </i>\n"
|
||||
" <a href=\"%(url)s\">pàgina de configuració</a>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "L'enregistrament d'adreces IP es pot habilitar a la pàgina de configuració"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>La taula següent reflecteix les accions enregistrades abans "
|
||||
"de deshabilitar l'historial de projectes. Pots \n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
"target=\"#confirm-erase\"> netejar l'historial del projecte</a> per a "
|
||||
"eliminar-les.</i></p>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Probablement algú ha netejat l'historial del projecte."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -605,18 +615,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Suprimir les adreces IP emmagatzemades"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "No hi ha historial a esborrar"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Netejar l'historial del projecte"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "No hi ha adreces IP a esborrar"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Suprimir les adreces IP emmagatzemades"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "No hi ha historial a esborrar"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Netejar l'historial del projecte"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Hora"
|
||||
|
||||
|
@ -624,12 +634,12 @@ msgid "Event"
|
|||
msgstr "Esdeveniment"
|
||||
|
||||
msgid "IP address recording can be enabled on the settings page"
|
||||
msgstr ""
|
||||
"L'enregistrament d'adreces IP es pot habilitar a la pàgina de configuració"
|
||||
msgstr "L'enregistrament d'adreces IP es pot habilitar a la pàgina de configuració"
|
||||
|
||||
msgid "IP address recording can be disabled on the settings page"
|
||||
msgstr ""
|
||||
"L'enregistrament d'adreces IP es pot deshabilitar a la pàgina de configuració"
|
||||
"L'enregistrament d'adreces IP es pot deshabilitar a la pàgina de "
|
||||
"configuració"
|
||||
|
||||
msgid "From IP"
|
||||
msgstr "Des d'IP"
|
||||
|
@ -655,8 +665,7 @@ msgstr "S'ha canviat el nom del projecte a %(new_project_name)s"
|
|||
|
||||
#, python-format
|
||||
msgid "Project contact email changed to %(new_email)s"
|
||||
msgstr ""
|
||||
"El correu electrònic de contacte del projecte ha canviat a %(new_email)s"
|
||||
msgstr "El correu electrònic de contacte del projecte ha canviat a %(new_email)s"
|
||||
|
||||
msgid "Project settings modified"
|
||||
msgstr "S'ha modificat la configuració del projecte"
|
||||
|
@ -679,12 +688,17 @@ msgstr "Factura %(name)s ha canviat el nom a %(new_description)s"
|
|||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
"Participant %(name)s: el pes ha canviat de %(old_weight)s a %(new_weight)s"
|
||||
msgstr "Participant %(name)s: el pes ha canviat de %(old_weight)s a %(new_weight)s"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pagador"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Import"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Import en %(currency)s"
|
||||
|
@ -757,8 +771,8 @@ msgid ""
|
|||
"Don\\'t reuse a personal password. Choose a private code and send it to "
|
||||
"your friends"
|
||||
msgstr ""
|
||||
"No reutilitzis una contrasenya personal. Tria un codi privat i envia'l als "
|
||||
"teus amics"
|
||||
"No reutilitzis una contrasenya personal. Tria un codi privat i envia'l "
|
||||
"als teus amics"
|
||||
|
||||
msgid "Account manager"
|
||||
msgstr "Gestor de comptes"
|
||||
|
@ -787,6 +801,9 @@ msgstr "Historial"
|
|||
msgid "Settings"
|
||||
msgstr "Configuració"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Altres projectes:"
|
||||
|
||||
|
@ -796,8 +813,9 @@ msgstr "commutar a"
|
|||
msgid "Dashboard"
|
||||
msgstr "Panell"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Tancar sessió"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Codi"
|
||||
|
@ -808,7 +826,7 @@ msgstr "Aplicació mòbil"
|
|||
msgid "Documentation"
|
||||
msgstr "Documentació"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Panell d'administració"
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -830,30 +848,21 @@ msgstr "n'estàs segur?"
|
|||
msgid "Invite people"
|
||||
msgstr "Convidar gent"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Hauries de començar afegint participants"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Afegir una factura nova"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Factures més noves"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Factures més antigues"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Quan?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Hauries de començar afegint participants"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Qui va pagar?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Afegir una factura nova"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Què va pagar?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Quant?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Afegida el %(date)s"
|
||||
|
@ -862,20 +871,22 @@ msgstr "Afegida el %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Tothom menys %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "suprimir"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Sense factures"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Res a enumerar encara."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Probablement vulguis"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "afegir una factura"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "afegir participants"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Editar aquest participant"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Recordatori de contrasenya"
|
||||
|
@ -884,8 +895,8 @@ msgid ""
|
|||
"A link to reset your password has been sent to you, please check your "
|
||||
"emails."
|
||||
msgstr ""
|
||||
"Se t'ha enviat un enllaç per a restablir la vostra contrasenya, comprova els "
|
||||
"teus correus electrònics."
|
||||
"Se t'ha enviat un enllaç per a restablir la vostra contrasenya, comprova "
|
||||
"els teus correus electrònics."
|
||||
|
||||
msgid "Return to home page"
|
||||
msgstr "Tornar a la pàgina d'inici"
|
||||
|
@ -899,39 +910,55 @@ msgstr "Restablir la contrasenya"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Convidar a persones a unir-se a aquest projecte"
|
||||
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Enviar per correu electrònic"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Especifica una llista (separada per comes) dels correus electrònic als "
|
||||
"que vols notificar la\n"
|
||||
" creació d'aquest projecte de gestió pressupostària i els "
|
||||
"hi enviarem un correu electrònic."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Compartir l'identificador i el codi"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
"Pots compartir l'identificador del projecte i el codi privat per qualsevol "
|
||||
"mitjà de comunicació."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identificador:"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Compartir l'enllaç"
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Codi privat"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
"Pots compartir directament l'enllaç següent a través del teu mitjà preferit"
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Enviar per correu electrònic"
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
msgstr ""
|
||||
"Especifica una llista (separada per comes) dels correus electrònic als que "
|
||||
"vols notificar la\n"
|
||||
" creació d'aquest projecte de gestió pressupostària i els hi "
|
||||
"enviarem un correu electrònic."
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Qui ha de pagar?"
|
||||
|
@ -962,3 +989,96 @@ msgstr "Despeses per mes"
|
|||
|
||||
msgid "Period"
|
||||
msgstr "Període"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importar"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Import pagat"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Les factures no poden ser nul·les"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "L'identificador del projecte és %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "JSON no vàlid"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "N'estàs segur?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Importar JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Aquest projecte té l'historial"
|
||||
#~ " deshabilitat. Les accions noves no "
|
||||
#~ "apareixeran a continuació. Pots habilitar "
|
||||
#~ "l'historial a la </i>\n"
|
||||
#~ " <a href=\"%(url)s\">pàgina de configuració</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>La taula següent reflecteix "
|
||||
#~ "les accions enregistrades abans de "
|
||||
#~ "deshabilitar l'historial de projectes. Pots"
|
||||
#~ " \n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\"> netejar l'historial "
|
||||
#~ "del projecte</a> per a eliminar-"
|
||||
#~ "les.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Enviar invitacions"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "mostrar"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Editar el projecte"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Probablement vulguis"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "afegir participants"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Pots compartir l'identificador del projecte"
|
||||
#~ " i el codi privat per qualsevol "
|
||||
#~ "mitjà de comunicació."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Compartir l'enllaç"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
#~ "Pots compartir directament l'enllaç següent"
|
||||
#~ " a través del teu mitjà preferit"
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
@ -2,9 +2,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2021-11-29 23:53+0000\n"
|
||||
"Last-Translator: Jannik Lang <jannik.lang@posteo.de>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2024-02-24 00:03+0000\n"
|
||||
"Last-Translator: Peter <peteramried@web.de>\n"
|
||||
"Language-Team: German <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/de/>\n"
|
||||
"Language: de\n"
|
||||
|
@ -12,9 +12,15 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.10-dev\n"
|
||||
"X-Generator: Weblate 5.5-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
"Du hast gerade das Projekt '%(project)s' erstellt, um deine Ausgaben zu "
|
||||
"teilen"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,6 +31,12 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Projektname"
|
||||
|
||||
msgid "Current private code"
|
||||
msgstr "Aktueller privater Code"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "Geben Sie Ihren privaten Code ein, um das Projekt zu bearbeiten"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Neuer privater Code"
|
||||
|
||||
|
@ -48,6 +60,12 @@ msgstr ""
|
|||
"Das Festlegen einer Standardwährung ermöglicht die Währungsumrechnung "
|
||||
"zwischen Rechnungen"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Unbekannter Fehler"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "ungültiger privater Code."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
|
@ -55,11 +73,8 @@ msgstr ""
|
|||
"Dieses Projekt kann nicht auf \"ohne Währung\" eingestellt werden, weil "
|
||||
"es Rechnungen unterschiedlicher Währungen enthält."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Zuvor exportierte JSON-Datei importieren"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importieren"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "Kompatibel mit Cospend"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Projektkennung"
|
||||
|
@ -90,12 +105,6 @@ msgstr "Bitte bestätige das Captcha, um fortzufahren."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Geben Sie Ihren privaten Code ein, um die Löschung zu bestätigen"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Unbekannter Fehler"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "ungültiger privater Code."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Eintreten"
|
||||
|
||||
|
@ -120,17 +129,17 @@ msgstr "Passwort bestätigen"
|
|||
msgid "Reset password"
|
||||
msgstr "Passwort zurücksetzen"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
msgid "When?"
|
||||
msgstr "Wann?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Was?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Von"
|
||||
msgid "Who paid?"
|
||||
msgstr "Wer hat bezahlt?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Betrag"
|
||||
msgid "How much?"
|
||||
msgstr "Wieviel?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Währung"
|
||||
|
@ -156,9 +165,6 @@ msgstr "Hinzufügen und neuen erstellen"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Projekt Standardwährung: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Der Betrag darf nicht null sein"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Name"
|
||||
|
||||
|
@ -180,13 +186,27 @@ msgstr "Der Benutzer ist bereits diesem Projekt zugeordnet"
|
|||
msgid "People to notify"
|
||||
msgstr "Personen, die informiert werden sollen"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "Einladungen senden"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Einladung versenden"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "Die E-Mail-Adresse(n) %(email)s ist/sind nicht gültig"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Ausloggen"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr "Bitte überprüfen Sie die E-Mail Konfiguration des Servers."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Bitte überprüfe die E-Mail Konfiguration des Servers oder kontaktiere einen "
|
||||
"Administrator: %(admin_email)s"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} und {dual_object_1}"
|
||||
|
@ -214,9 +234,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgstr ""
|
||||
"Zu viele fehlgeschlagene Anmeldeversuche, bitte versuche es später nochmal."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Zu viele fehlgeschlagene Anmeldeversuche."
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
|
@ -230,12 +249,6 @@ msgstr "Bereitgestelltes Token ist ungültig"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Der private Code ist nicht korrekt"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
"Du hast gerade das Projekt '%(project)s' erstellt, um deine Ausgaben zu "
|
||||
"teilen"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Dir wurde soeben eine Erinnerungsmail gesendet"
|
||||
|
||||
|
@ -246,14 +259,10 @@ msgstr ""
|
|||
"Wir haben versucht dir eine Erinnerungsmail zu senden, aber das hat nicht"
|
||||
" geklappt. Du kannst das Projekt weiterhin wie gewohnt nutzen."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "Die Projektkennung ist %(project)s"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Entschuldigung, es trat ein Fehler beim Senden der E-Mail zur Passwort "
|
||||
"Zurücksetzung auf. Bitte überprüfe die E-Mail Konfiguration des Servers "
|
||||
|
@ -271,18 +280,26 @@ msgstr "Unbekanntes Projekt"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Passwort erfolgreich zurückgesetzt."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projekt erfolgreich hochgeladen"
|
||||
#, fuzzy
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr "Einstellungen wurden erfolgreich übernommen."
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "Ungültiges JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "Fehlendes Attribut: %(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
"Rechnungen in mehreren Währungen können einem Projekt ohne Standardwährung "
|
||||
"nicht hinzugefügt werden"
|
||||
"Rechnungen in mehreren Währungen können einem Projekt ohne "
|
||||
"Standardwährung nicht hinzugefügt werden"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projekt erfolgreich hochgeladen"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Projekt erfolgreich gelöscht"
|
||||
|
@ -290,6 +307,9 @@ msgstr "Projekt erfolgreich gelöscht"
|
|||
msgid "Error deleting project"
|
||||
msgstr "Fehler bei Projektlöschung"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "Verlassen nicht möglich"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Du wurdest eingeladen, deine Ausgaben für %(project)s zu teilen"
|
||||
|
@ -297,14 +317,9 @@ msgstr "Du wurdest eingeladen, deine Ausgaben für %(project)s zu teilen"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Deine Einladungen wurden versendet"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Entschuldigung, es trat ein Fehler beim Versenden der Einladungsmails "
|
||||
"auf. Bitte überprüfe die E-Mail Konfiguration des Servers oder "
|
||||
"kontaktiere einen Administrator."
|
||||
"Entschuldigung, es trat ein Fehler beim Versenden der Einladungsmails auf."
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
|
@ -348,6 +363,10 @@ msgstr "Die Ausgabe wurde entfernt"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "Die Ausgabe wurde bearbeitet"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr "%(lang)s ist keine unterstützte Sprache"
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Projekthistorie konnte nicht gelöscht werden"
|
||||
|
||||
|
@ -379,7 +398,7 @@ msgid "The project you are trying to access do not exist, do you want to"
|
|||
msgstr "Das Projekt existiert nicht, willst du"
|
||||
|
||||
msgid "create it"
|
||||
msgstr "Erstellen"
|
||||
msgstr "es erstellen"
|
||||
|
||||
msgid "?"
|
||||
msgstr "?"
|
||||
|
@ -408,8 +427,8 @@ msgstr "Aktionen"
|
|||
msgid "edit"
|
||||
msgstr "Bearbeiten"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "Löschen"
|
||||
msgid "Delete project"
|
||||
msgstr "Projekt löschen"
|
||||
|
||||
msgid "show"
|
||||
msgstr "Zeigen"
|
||||
|
@ -423,20 +442,11 @@ msgstr "Handy-Applikation herunterladen"
|
|||
msgid "Get it on"
|
||||
msgstr "Mach mit"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "Bist du sicher?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Projekt bearbeiten"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Projekt löschen"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "JSON importieren"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Datei auswählen"
|
||||
msgid "Import project"
|
||||
msgstr "Projekt importieren"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Projektdaten herunterladen"
|
||||
|
@ -462,18 +472,29 @@ msgstr "Abbrechen"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Datenschutzeinstellungen"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Projekt bearbeiten"
|
||||
msgid "Save changes"
|
||||
msgstr "Änderungen speichern"
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr "Dies wird alle Ausgaben und Mitglieder dieses Projektes löschen!"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Zuvor exportierte Projekt-Datei importieren"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Datei auswählen"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Ausgabe bearbeiten"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Ausgabe hinzufügen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr "einfache Operationen sind erlaubt, z.B. (18+36.2)/3"
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Jeder"
|
||||
|
||||
|
@ -492,9 +513,6 @@ msgstr "Diesen Benutzer bearbeiten"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "max.mustermann@beispiel.com, mary.moe@site.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Einladung versenden"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Herunterladen"
|
||||
|
||||
|
@ -567,36 +585,23 @@ msgstr "Rechnung %(name)s: %(owers_list_str)s zur Eigentümerliste hinzugefügt"
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr "Rechnung %(name)s: %(owers_list_str)s von der Eigentümerliste entfernt"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
#, fuzzy
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Der Verlauf dieses Projekts ist deaktiviert. Neue Aktionen"
|
||||
" werden nicht im Folgenden auftauchen. Du kannst den Verlauf auf der\n"
|
||||
"<a href=\"%(url)s\">Einstellungsseite</a> aktivieren.</i>\n"
|
||||
" "
|
||||
"Dieses Projekt hat den Projektverlauf deaktiviert. Neue Aktionen werden "
|
||||
"unten nicht mehr angezeigt."
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "Der Verlauf kann in den Einstellungen aktiviert werden."
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <I>Die folgende Tabelle zeigt alle aufgezeichneten Aktionen "
|
||||
"bevor der Projektverlauf deaktiviert wurde. Du kannst den\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">Projektverlauf löschen</a>, um sie zu "
|
||||
"entfernen.</i></p>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Wahrscheinlich hat jemand den Projektverlauf gelöscht."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -608,18 +613,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Gespeicherte IP-Adressen löschen"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Kein Verlauf zu löschen"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Projektverlauf löschen"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Keine IP-Adressen zu löschen"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Gespeicherte IP-Adressen löschen"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Kein Verlauf zu löschen"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Projektverlauf löschen"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Zeit"
|
||||
|
||||
|
@ -683,9 +688,15 @@ msgstr ""
|
|||
"Teinehmer %(name)s: Gewichtung von %(old_weight)s auf %(new_weight)s "
|
||||
"geändert"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Von"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Betrag"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Betrag in %(currency)s"
|
||||
|
@ -788,6 +799,9 @@ msgstr "Verlauf"
|
|||
msgid "Settings"
|
||||
msgstr "Einstellungen"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Andere Projekte:"
|
||||
|
||||
|
@ -797,8 +811,9 @@ msgstr "wechseln zu"
|
|||
msgid "Dashboard"
|
||||
msgstr "Dashboard"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Ausloggen"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr "Bitte nach %(date)s erneut versuchen."
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Code"
|
||||
|
@ -809,7 +824,7 @@ msgstr "Handy-Applikation"
|
|||
msgid "Documentation"
|
||||
msgstr "Dokumentation"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Dashboard Administration"
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -831,37 +846,31 @@ msgstr "Bist du sicher?"
|
|||
msgid "Invite people"
|
||||
msgstr "Leute einladen"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Du kannst anfangen, Teilnehmer hinzuzufügen"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Neue Ausgabe"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Aktuellere Rechnungen"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Ältere Rechnungen"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Wann?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Du kannst anfangen, Teilnehmer hinzuzufügen"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Wer hat bezahlt?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Neue Ausgabe"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Wofür?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Wieviel?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Hinzugefügt am %(date)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Jeder außer %(excluded)s"
|
||||
msgstr "Alle außer %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "Löschen"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Keine Ausgaben"
|
||||
|
@ -869,14 +878,12 @@ msgstr "Keine Ausgaben"
|
|||
msgid "Nothing to list yet."
|
||||
msgstr "Noch nichts aufzulisten."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Du willst wahrscheinlich"
|
||||
msgid "Add your first bill"
|
||||
msgstr "Mach deine erste Rechnung"
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr "eine Ausgabe hinzufügen"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "Teilnehmer hinzufügen"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Diesen Benutzer bearbeiten"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Passwort-Erinnerung"
|
||||
|
@ -900,38 +907,57 @@ msgstr "Setze dein Passwort zurück"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Lade Leute ein, diesem Projekt beizutreten"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Teile die ID & den Code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr "Einladung verschicken"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Du kannst die Projekt-ID und den privaten Code auf jedem "
|
||||
"Kommunikationsweg weitergeben."
|
||||
"Am einfachsten lädt man jemanden ein, indem man folgenden Einladungs-Link "
|
||||
"teilt. <br /> Sie werden dann in der Lage sein dem Projekt beizutreten, zu "
|
||||
"bearbeiten und Rechnungen hinzuzufügen, bearbeiten und löschen. Sie werden "
|
||||
"allerdings keinen Zugriff auf wichtige Einstellungen bekommen, wie Privaten "
|
||||
"Code zu ändern oder gar das ganze Projekt zu löschen."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "ID:"
|
||||
msgid "Scan QR code"
|
||||
msgstr "QR-Code scannen"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Link teilen"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr "Du kannst den folgenden Link direkt über dein bevorzugtes Medium teilen"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr "Benutzen sie ein Smartphone mit Kompatibler App."
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Per E-Mail versenden"
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Gib eine (durch Kommas getrennte) Liste von E-Mail-Adressen an, die du "
|
||||
"über die\n"
|
||||
"\t\t\tErstellung dieses Projekts informieren möchtest, und wir senden "
|
||||
"ihnen eine E-Mail."
|
||||
"Gib eine (durch Kommas getrennte) Liste von E-Mail-Adressen an, die du über "
|
||||
"die Erstellung dieses Projekts informieren möchtest, und wir werden ihnen "
|
||||
"eine E-Mail senden."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Teile die ID & den Code"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "ID:"
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr "Privater Code:"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr "Der Private Code wurde beim erstellen des Projekts von Ihnen festgelegt"
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Wer zahlt?"
|
||||
|
@ -1068,3 +1094,93 @@ msgstr "Zeitraum"
|
|||
|
||||
#~ msgid "Participants to notify"
|
||||
#~ msgstr "Teilnehmer hinzufügen"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importieren"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Betrag"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Der Betrag darf nicht null sein"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "Die Projektkennung ist %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "Ungültiges JSON"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "Bist du sicher?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "JSON importieren"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Der Verlauf dieses Projekts "
|
||||
#~ "ist deaktiviert. Neue Aktionen werden "
|
||||
#~ "nicht im Folgenden auftauchen. Du kannst"
|
||||
#~ " den Verlauf auf der\n"
|
||||
#~ "<a href=\"%(url)s\">Einstellungsseite</a> aktivieren.</i>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <I>Die folgende Tabelle zeigt "
|
||||
#~ "alle aufgezeichneten Aktionen bevor der "
|
||||
#~ "Projektverlauf deaktiviert wurde. Du kannst"
|
||||
#~ " den\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">Projektverlauf löschen</a>, "
|
||||
#~ "um sie zu entfernen.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Einladungen senden"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "Zeigen"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Projekt bearbeiten"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Du willst wahrscheinlich"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "Teilnehmer hinzufügen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Du kannst die Projekt-ID und den"
|
||||
#~ " privaten Code auf jedem Kommunikationsweg"
|
||||
#~ " weitergeben."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Link teilen"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "Du kannst den folgenden Link direkt über dein bevorzugtes Medium teilen"
|
||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2021-08-01 08:34+0000\n"
|
||||
"Last-Translator: Eugenia Russell <eugenia.russell2019@gmail.com>\n"
|
||||
"Language: el\n"
|
||||
|
@ -15,6 +15,10 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -23,6 +27,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Τίτλος εργασίας"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Ιδιωτικός κωδικός"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "New private code"
|
||||
msgstr "Ιδιωτικός κωδικός"
|
||||
|
@ -45,6 +56,14 @@ msgstr "Προεπιλεγμένο Νόμισμα"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "Άγνωστο πρότζεκτ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "Ιδιωτικός κωδικός"
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
|
@ -52,11 +71,8 @@ msgstr ""
|
|||
"Αυτό το έργο δεν μπορεί να οριστεί σε \"χωρίς νόμισμα\" επειδή περιέχει "
|
||||
"λογαριασμούς σε πολλαπλά νομίσματα."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Εισαγωγή αρχείου JSON που έχει εξαχθεί προηγουμένως"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Εισαγωγή"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Αναγνωριστικό έργου"
|
||||
|
@ -88,14 +104,6 @@ msgstr ""
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Εισαγάγετε ιδιωτικό κωδικό για επιβεβαίωση της διαγραφής"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "Άγνωστο πρότζεκτ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "Ιδιωτικός κωδικός"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Συνδεθείτε"
|
||||
|
||||
|
@ -120,17 +128,17 @@ msgstr "Επιβεβαίωση κωδικού πρόσβασης"
|
|||
msgid "Reset password"
|
||||
msgstr "Επαναφορά κωδικού πρόσβασης"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Ημερομηνία"
|
||||
msgid "When?"
|
||||
msgstr ""
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Τι?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Φορέας πληρωμής"
|
||||
msgid "Who paid?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Καταβληθέν ποσό"
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Νόμισμα"
|
||||
|
@ -156,9 +164,6 @@ msgstr "Υποβολή και προσθήκη νέου"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Προεπιλογή έργου: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Οι λογαριασμοί δεν μπορούν να είναι μηδενικοί"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Όνομα"
|
||||
|
||||
|
@ -182,13 +187,25 @@ msgstr "Αυτό το έργο έχει ήδη αυτό το μέλος"
|
|||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "Αποστολή προσκλήσεων"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Αποστολή των προσκλήσεων"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "Το μήνυμα ηλεκτρονικού ταχυδρομείου %(email)s δεν είναι έγκυρο"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
|
@ -216,7 +233,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Πάρα πολλές αποτυχημένες προσπάθειες σύνδεσης, δοκιμάστε ξανά αργότερα."
|
||||
|
||||
#, python-format
|
||||
|
@ -231,10 +249,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Αυτός ο ιδιωτικός κωδικός δεν είναι ο σωστός"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Ένα εμάιλ υπενθύμισης μόλις σας στάλθηκε"
|
||||
|
||||
|
@ -245,14 +259,9 @@ msgstr ""
|
|||
"Προσπαθήσαμε να σας στείλουμε ένα εμάιλ υπενθύμισης, αλλά υπήρξε ένα "
|
||||
"λάθος. Μπορείτε ακόμα να χρησιμοποιήσετε το πρότζεκτ κανονικά."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "Το αναγνωριστικό έργου είναι %(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
|
@ -267,23 +276,33 @@ msgstr "Άγνωστο πρότζεκτ"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Επαναφορά του κωδικού επιτυχώς."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Έργο που φορτώθηκε επιτυχώς"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "Η JSON δεν είναι έγκυρη"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Έργο που φορτώθηκε επιτυχώς"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Το πρότζεκτ διαγράφηκε επιτυχώς"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Έχετε κληθεί να μοιραστείτε τα έξοδά σας για %(project)s"
|
||||
|
@ -291,10 +310,7 @@ msgstr "Έχετε κληθεί να μοιραστείτε τα έξοδά σα
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Οι προσκλήσεις έχουν σταλθεί"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -337,6 +353,10 @@ msgstr "Ο λογαριασμός έχει διαγραφεί"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "Ο λογαριασμός έχει τροποποιηθεί"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Ενεργοποίηση ιστορικού έργων"
|
||||
|
@ -403,8 +423,9 @@ msgstr "Ενέργειες"
|
|||
msgid "edit"
|
||||
msgstr "επιμελειθήτε"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "διαγραφή"
|
||||
#, fuzzy
|
||||
msgid "Delete project"
|
||||
msgstr "Επεξεργασία έργου"
|
||||
|
||||
msgid "show"
|
||||
msgstr "εμφάνιση"
|
||||
|
@ -419,23 +440,13 @@ msgstr ""
|
|||
msgid "Get it on"
|
||||
msgstr "Συνδεθείτε"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Are you sure?"
|
||||
msgstr "Είστε σίγουρος;"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Επεξεργασία έργου"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Delete project"
|
||||
msgid "Import project"
|
||||
msgstr "Επεξεργασία έργου"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Εισαγωγή JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Επιλογή αρχείου"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Κατεβάστε τα δεδομένα του έργου"
|
||||
|
||||
|
@ -464,18 +475,28 @@ msgstr "Ακύρωση"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Ρυθμίσεις απορρήτου"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Επεξεργαστείτε το έργο"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Εισαγωγή αρχείου JSON που έχει εξαχθεί προηγουμένως"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Επιλογή αρχείου"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Επεξεργαστείτε αυτόν τον λογαριασμό"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Προσθήκη λογαριασμού"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr ""
|
||||
|
||||
|
@ -495,9 +516,6 @@ msgstr "Προσθήκη συμμετέχοντος"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Αποστολή των προσκλήσεων"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Κατεβάστε"
|
||||
|
||||
|
@ -563,25 +581,21 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Κάποιος πιθανώς διέγραψε το ιστορικό του έργου."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
"recording disabled. "
|
||||
|
@ -590,18 +604,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Διαγραφή αποθηκευμένων διευθύνσεων IP"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Δεν υπάρχει ιστορία για διαγραφή"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Απαλοιφή ιστορικού έργου"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Δεν υπάρχουν διευθύνσεις IP προς διαγραφή"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Διαγραφή αποθηκευμένων διευθύνσεων IP"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Δεν υπάρχει ιστορία για διαγραφή"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Απαλοιφή ιστορικού έργου"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Ώρα"
|
||||
|
||||
|
@ -663,9 +677,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Φορέας πληρωμής"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Ποσό"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Ημερομηνία"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Ποσό σε %(currency)s"
|
||||
|
@ -766,6 +786,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
|
@ -775,7 +798,8 @@ msgstr ""
|
|||
msgid "Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
|
@ -787,7 +811,7 @@ msgstr ""
|
|||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
|
@ -810,30 +834,21 @@ msgstr "Είστε σίγουρος;"
|
|||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "When?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who paid?"
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For what?"
|
||||
msgstr ""
|
||||
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr ""
|
||||
|
@ -842,20 +857,21 @@ msgstr ""
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr "διαγραφή"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Προσθήκη συμμετέχοντος"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr ""
|
||||
|
@ -877,31 +893,49 @@ msgstr ""
|
|||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Ιδιωτικός κωδικός"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
@ -1017,3 +1051,112 @@ msgstr "Περίοδος"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "Πρόσωπα προς ενημέρωση"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Εισαγωγή"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Καταβληθέν ποσό"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Οι λογαριασμοί δεν μπορούν να είναι μηδενικοί"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "Το αναγνωριστικό έργου είναι %(project)s"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "sending you an email with password "
|
||||
#~ "reset instructions. Please check the "
|
||||
#~ "email configuration of the server or "
|
||||
#~ "contact the administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "Η JSON δεν είναι έγκυρη"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "trying to send the invitation emails."
|
||||
#~ " Please check the email configuration "
|
||||
#~ "of the server or contact the "
|
||||
#~ "administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "Είστε σίγουρος;"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Εισαγωγή JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Αποστολή προσκλήσεων"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "εμφάνιση"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Επεξεργαστείτε το έργο"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add a bill"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email for you."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email with the invitation "
|
||||
#~ "link."
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2021-10-01 20:35+0000\n"
|
||||
"Last-Translator: phlostically <phlostically@mailinator.com>\n"
|
||||
"Language: eo\n"
|
||||
|
@ -15,6 +15,10 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Vi ĵus kreis la projekton «%(project)s» por dividi viajn elspezojn"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,6 +29,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Nomo de projekto"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Nova privata kodo"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Nova privata kodo"
|
||||
|
||||
|
@ -46,6 +57,12 @@ msgstr "Implicita valuto"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Nekonata eraro"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Nevalida privata kodo."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
|
@ -53,11 +70,8 @@ msgstr ""
|
|||
"Ĉi tiu projekto ne povas esti agordita al «neniu valuto», ĉar ĝi enhavas "
|
||||
"fakturojn en pluraj valutoj."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Importi antaŭe elportitan JSON-dosieron"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Enporti"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Identigilo de projekto"
|
||||
|
@ -89,12 +103,6 @@ msgstr ""
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Nekonata eraro"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Nevalida privata kodo."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Eniri"
|
||||
|
||||
|
@ -119,17 +127,17 @@ msgstr "Konfirmo de pasvorto"
|
|||
msgid "Reset password"
|
||||
msgstr "Restarigi pasvorton"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Dato"
|
||||
msgid "When?"
|
||||
msgstr "Kiam?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Kio?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Paganto"
|
||||
msgid "Who paid?"
|
||||
msgstr "Kiu pagis?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Kvanto pagita"
|
||||
msgid "How much?"
|
||||
msgstr "Kiom?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Valuto"
|
||||
|
@ -153,9 +161,6 @@ msgstr "Submeti kaj aldoni novan"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Implicita valuto de la projekto: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Fakturoj ne povas esti nulaj"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nomo"
|
||||
|
||||
|
@ -179,13 +184,27 @@ msgstr "Ĉi tiu projekto jam havas ĉi tiun anon"
|
|||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "Sendi invitojn"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Sendi la invitojn"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "La retpoŝta adreso %(email)s ne validas"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Adiaŭi"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Pardonu, okazis eraro dum sendado de la invitoj. Bonvolu kontroli la "
|
||||
"retpoŝtan agordon de la servilo aŭ kontakti la administranton."
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} kaj {dual_object_1}"
|
||||
|
@ -213,7 +232,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Tro da malsukcesaj provoj de salutado; bonvolu reprovi poste."
|
||||
|
||||
#, python-format
|
||||
|
@ -226,10 +246,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Ĉi tiu privata kodo ne ĝustas"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Vi ĵus kreis la projekton «%(project)s» por dividi viajn elspezojn"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Rememoriga retpoŝta mesaĝo ĵus estis sendita al vi"
|
||||
|
||||
|
@ -240,14 +256,10 @@ msgstr ""
|
|||
"Ni provis sendi al vi rememorigan retpoŝtan mesaĝon, sed okazis eraro. Vi"
|
||||
" ankoraŭ povas uzi la projekton normale."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "La identigilo de la projekto estas %(project)s"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Pardonu, okazis eraro dum sendado al vi de retpoŝta mesaĝo de instrukcioj"
|
||||
" pri restarigo de pasvorto. Bonvolu kontroli la retpoŝtan agordon de la "
|
||||
|
@ -265,23 +277,33 @@ msgstr "Nekonata projekto"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Pasvorto sukcese restarigita."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projekto sukcese alŝutita"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "Nevalida JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projekto sukcese alŝutita"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "La projekto estis sukcese forigitaj"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Vi estis invitita dividi viajn elspezojn por %(project)s"
|
||||
|
@ -289,10 +311,8 @@ msgstr "Vi estis invitita dividi viajn elspezojn por %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Viaj invitoj estis senditaj"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
#, fuzzy
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Pardonu, okazis eraro dum sendado de la invitoj. Bonvolu kontroli la "
|
||||
"retpoŝtan agordon de la servilo aŭ kontakti la administranton."
|
||||
|
@ -339,6 +359,10 @@ msgstr "La fakturo estis forigita"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "La fakturo estis modifita"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Ŝalti projektan historion"
|
||||
|
@ -404,8 +428,8 @@ msgstr "Agoj"
|
|||
msgid "edit"
|
||||
msgstr "redakti"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "forigi"
|
||||
msgid "Delete project"
|
||||
msgstr "Forviŝi projekton"
|
||||
|
||||
msgid "show"
|
||||
msgstr "montri"
|
||||
|
@ -419,20 +443,12 @@ msgstr "Elŝuti programon por poŝaparato"
|
|||
msgid "Get it on"
|
||||
msgstr "Elŝuti ĝin ĉe"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "Ĉu vi certas?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Redakti projekton"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Forviŝi projekton"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Enporti JSON-dosieron"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Elekti dosieron"
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "Redakti projekton"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Elŝuti projektajn datenojn"
|
||||
|
@ -458,18 +474,28 @@ msgstr "Nuligi"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Agordoj pri privateco"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Redakti la projekton"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Importi antaŭe elportitan JSON-dosieron"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Elekti dosieron"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Redakti ĉi tiun fakturon"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Aldoni fakturon"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Ĉiuj"
|
||||
|
||||
|
@ -489,9 +515,6 @@ msgstr "Aldono partoprenanton"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "johano.zamenhof@example.com, maria.baghy@example.net"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Sendi la invitojn"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Elŝuti"
|
||||
|
||||
|
@ -563,36 +586,21 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Historio estis malŝaltita por ĉi tiu projekto. Novaj agoj "
|
||||
"ne aperos ĉi-sube. Vi povas ŝalti historion ĉe la</i>\n"
|
||||
" <a href=\"%(url)s\">paĝo pri agordoj</a>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "Registrado de IP-adresoj estas ŝaltebla per la agorda paĝo"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>La ĉi-suba tabelo montras agojn registritajn antaŭ "
|
||||
"malŝalto de la projekta historio. Vi povas\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">forviŝi la projektan historion</a> por "
|
||||
"forigi ilin.</i></ p >\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Iu verŝajne forviŝis la historion de la projekto."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -604,18 +612,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Forviŝi konservitajn IP-adresojn"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Neniom da forviŝebla historio"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Forviŝi historion de projekto"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Neniom da forviŝeblaj IP-adresoj"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Forviŝi konservitajn IP-adresojn"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Neniom da forviŝebla historio"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Forviŝi historion de projekto"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Tempo"
|
||||
|
||||
|
@ -677,9 +685,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Paganto"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Kvanto"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Dato"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Kvanto en %(currency)s"
|
||||
|
@ -782,6 +796,9 @@ msgstr "Historio"
|
|||
msgid "Settings"
|
||||
msgstr "Agordoj"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Aliaj projektoj:"
|
||||
|
||||
|
@ -791,8 +808,9 @@ msgstr "salti al"
|
|||
msgid "Dashboard"
|
||||
msgstr "Panelo"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Adiaŭi"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Kodo"
|
||||
|
@ -803,7 +821,7 @@ msgstr "Poŝaparata programo"
|
|||
msgid "Documentation"
|
||||
msgstr "Dokumentaro"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Administra panelo"
|
||||
|
||||
#, fuzzy
|
||||
|
@ -826,30 +844,21 @@ msgstr "ĉu vi certas?"
|
|||
msgid "Invite people"
|
||||
msgstr "Inviti homojn"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Vi komencu aldonante partoprenantojn"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Aldoni novan fakturon"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Pli novaj fakturoj"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Pli malnovaj fakturoj"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Kiam?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Vi komencu aldonante partoprenantojn"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Kiu pagis?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Aldoni novan fakturon"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Por kio?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Kiom?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Aldonita en %(date)s"
|
||||
|
@ -858,20 +867,22 @@ msgstr "Aldonita en %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Ĉiuj krom %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "forigi"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Neniu fakturo"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Nenio listigebla ankoraŭ."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Vi probable volas"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "aldoni fakturon"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "aldoni partoprenantojn"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Aldono partoprenanton"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Rememorigilo pri pasvorto"
|
||||
|
@ -895,37 +906,56 @@ msgstr "Restarigi vian pasvorton"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Inviti homojn aliĝi al ĉi tiu projekto"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Konigi identigilon kaj kodon"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
msgstr "Vi povas iel ajn konigi la projektan identigilon kaj la privatan kodon."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identigilo:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Sendi la ligon"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr "Vi povas rekte sendi la jenan hiperligon per via preferata komunikilo"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Sendi retpoŝte"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Specifu (kome apartigitan) liston de tiuj retpoŝtaj adresoj, kiujn vi "
|
||||
"volas sciigi pri la\n"
|
||||
" kreado de ĉi tiu buĝet-administra projekto, kaj ni sendos"
|
||||
" al ili retpoŝtajn mesaĝojn por vi."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Konigi identigilon kaj kodon"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identigilo:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Privata kodo"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Kiu pagas?"
|
||||
|
||||
|
@ -1021,3 +1051,91 @@ msgstr "Periodo"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "Sciigotaj homoj"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Enporti"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Kvanto pagita"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Fakturoj ne povas esti nulaj"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "La identigilo de la projekto estas %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "Nevalida JSON"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "Ĉu vi certas?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Enporti JSON-dosieron"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Historio estis malŝaltita por"
|
||||
#~ " ĉi tiu projekto. Novaj agoj ne "
|
||||
#~ "aperos ĉi-sube. Vi povas ŝalti "
|
||||
#~ "historion ĉe la</i>\n"
|
||||
#~ " <a href=\"%(url)s\">paĝo pri agordoj</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>La ĉi-suba tabelo montras"
|
||||
#~ " agojn registritajn antaŭ malŝalto de "
|
||||
#~ "la projekta historio. Vi povas\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">forviŝi la projektan "
|
||||
#~ "historion</a> por forigi ilin.</i></ p >"
|
||||
#~ "\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Sendi invitojn"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "montri"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Redakti la projekton"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Vi probable volas"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "aldoni partoprenantojn"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr "Vi povas iel ajn konigi la projektan identigilon kaj la privatan kodon."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Sendi la ligon"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "Vi povas rekte sendi la jenan hiperligon per via preferata komunikilo"
|
||||
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
@ -2,10 +2,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2022-04-11 17:12+0000\n"
|
||||
"Last-Translator: Santiago José Gutiérrez Llanos <gutierrezapata17@gmail.com>"
|
||||
"\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2023-11-27 05:02+0000\n"
|
||||
"Last-Translator: Wilfredo Gomez <thepageguy@mailfence.com>\n"
|
||||
"Language-Team: Spanish (Latin America) <https://hosted.weblate.org/projects/"
|
||||
"i-hate-money/i-hate-money/es_419/>\n"
|
||||
"Language: es_419\n"
|
||||
|
@ -13,9 +12,13 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
"X-Generator: Weblate 5.2.1-rc\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Acabas de crear '%(project)s' para compartir tus gastos"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -26,11 +29,17 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Nombre del Proyecto"
|
||||
|
||||
msgid "Current private code"
|
||||
msgstr "código privado actual"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "Ingrese el código privado existente para editar el proyecto"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Nuevo código privado"
|
||||
msgstr "Nuevo Código privado"
|
||||
|
||||
msgid "Enter a new code if you want to change it"
|
||||
msgstr "Entra un nuevo código si tu quieres cambiarlo"
|
||||
msgstr "Introduce un nuevo código si quieres cambiarlo"
|
||||
|
||||
msgid "Email"
|
||||
msgstr "Correo Electrónico"
|
||||
|
@ -39,28 +48,31 @@ msgid "Enable project history"
|
|||
msgstr "Habilitar historial del proyecto"
|
||||
|
||||
msgid "Use IP tracking for project history"
|
||||
msgstr "Registrar la IPs para el historial del proyecto"
|
||||
msgstr "Utilice el seguimiento de IP para el historial del proyecto"
|
||||
|
||||
msgid "Default Currency"
|
||||
msgstr "Moneda por defecto"
|
||||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
"Establecer una moneda predeterminada permite la conversión de divisas entre "
|
||||
"facturas"
|
||||
"Establecer una moneda predeterminada permite la conversión de moneda entre "
|
||||
"billetes"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Error desconocido"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Código privado no válido."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"Este proyecto no se puede establecer en 'ninguna moneda' porque contiene "
|
||||
"facturas en varias monedas."
|
||||
"Este proyecto no se puede configurar como \"sin moneda\" porque contiene "
|
||||
"billetes en varias monedas."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Importar archivo JSON previamente exportado"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "Compatible con Cospend"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Identificador de proyecto"
|
||||
|
@ -80,22 +92,16 @@ msgstr ""
|
|||
"favor, elija un nuevo identificador"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr "¿Cuál es una moneda real: euro o petro dólar?"
|
||||
msgstr "¿Cuál es la moneda real: el euro o el petrodólar?"
|
||||
|
||||
msgid "euro"
|
||||
msgstr "Euro"
|
||||
msgstr "euro"
|
||||
|
||||
msgid "Please, validate the captcha to proceed."
|
||||
msgstr "Por favor, completa el captcha para seguir."
|
||||
msgstr "Por favor, valide la captcha para proceder."
|
||||
|
||||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Introduzca el código privado para confirmar la eliminación"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Error desconocido"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Código privado inválido."
|
||||
msgstr "Ingrese el código privado para confirmar la eliminación"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Entrar"
|
||||
|
@ -116,22 +122,22 @@ msgid "Password"
|
|||
msgstr "Contraseña"
|
||||
|
||||
msgid "Password confirmation"
|
||||
msgstr "Confirmar contraseña"
|
||||
msgstr "confirmación de contraseña"
|
||||
|
||||
msgid "Reset password"
|
||||
msgstr "Restablecer contraseña"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Fecha"
|
||||
msgid "When?"
|
||||
msgstr "¿Cuando?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "¿Qué?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Paga"
|
||||
msgid "Who paid?"
|
||||
msgstr "¿Quién pagó?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Cantidad pagada"
|
||||
msgid "How much?"
|
||||
msgstr "¿Cuánto?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Moneda"
|
||||
|
@ -153,10 +159,7 @@ msgstr "Enviar y agregar uno nuevo"
|
|||
|
||||
#, python-format
|
||||
msgid "Project default: %(currency)s"
|
||||
msgstr "moneda predeterminada del projecto: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Las facturas no pueden ser nulas"
|
||||
msgstr "Projecto por defecto: %(currency)s"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
@ -179,13 +182,28 @@ msgstr "Este proyecto ya tiene a este participante"
|
|||
msgid "People to notify"
|
||||
msgstr "Personas para notificar"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "Enviar invitaciones"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Enviar las invitaciones"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "El correo electrónico %(email)s no es válido"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Cerrar sesión"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
"Por favor verifique la configuración de correo electrónico del servidor."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Verifique la configuración de correo electrónico del servidor o comuníquese "
|
||||
"con el administrador: %(admin_email)s"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} y {dual_object_1}"
|
||||
|
@ -203,60 +221,47 @@ msgid "{start_object}, {next_object}"
|
|||
msgstr "{start_object}, {next_object}"
|
||||
|
||||
msgid "No Currency"
|
||||
msgstr "no moneda"
|
||||
msgstr "No Moneda"
|
||||
|
||||
#. Form error with only one error
|
||||
msgid "{prefix}: {error}"
|
||||
msgstr "{prefijo}: {error}"
|
||||
msgstr "{prefix}: {error}"
|
||||
|
||||
#. Form error with a list of errors
|
||||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefijo}:<br />{errores}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgstr ""
|
||||
"Demasiados intentos fallidos de inicio de sesión, vuelva a intentarlo más"
|
||||
" tarde."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Demasiados intentos fallidos de inicio de sesión."
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
msgstr ""
|
||||
"Esta contraseña de administrador no es la correcta. Solo quedan %(num)d "
|
||||
"intentos."
|
||||
"intentos restantes."
|
||||
|
||||
msgid "Provided token is invalid"
|
||||
msgstr "La muestra proporcionada no es válida"
|
||||
msgstr "El token proporcionado no es válido"
|
||||
|
||||
msgid "This private code is not the right one"
|
||||
msgstr "Este código privado no es el correcto"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Acabas de crear '%(project)s' para compartir tus gastos"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Acabamos de enviarte un email de recordatorio"
|
||||
msgstr "Se le acaba de enviar un correo electrónico de recordatorio"
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
"Te hemos intentado enviar un correo electrónico recordatorio pero ha "
|
||||
"habido un error. Todavía puedes usar el proyecto habitualmente."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "El identificador del proyecto es %(project)s"
|
||||
"Intentamos enviarte un correo electrónico de recordatorio, pero hubo un "
|
||||
"error. Aún puedes usar el proyecto normalmente."
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Lo sentimos, hubo un error al enviarle un correo electrónico con las "
|
||||
"instrucciones de restablecimiento de contraseña. Compruebe la configuración "
|
||||
"de correo electrónico del servidor o póngase en contacto con el "
|
||||
"administrador."
|
||||
"Lo sentimos, hubo un error al enviarle un correo electrónico con "
|
||||
"instrucciones para restablecer la contraseña."
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "No se proporciono ningún token"
|
||||
|
@ -270,24 +275,34 @@ msgstr "Proyecto desconocido"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Contraseña restablecida con éxito."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "El proyecto se subió exitosamente"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr "La configuración del proyecto se ha cambiado correctamente."
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "JSON inválido"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr "No se puede analizar CSV"
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "Atributo faltante: %(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
"No se pueden agregar facturas en varias monedas a un proyecto sin la moneda "
|
||||
"No se pueden agregar billetes en varias monedas a un proyecto sin moneda "
|
||||
"predeterminada"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Proyecto cargado exitosamente"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Proyecto eliminado correctamente"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr "Error al borrar poryecto"
|
||||
msgstr "Error al borrar proyecto"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "No se puede cerrar sesión"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
|
@ -296,36 +311,32 @@ msgstr "Usted ha sido invitado a compartir sus gastos para %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Sus invitaciones han sido enviadas"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Lo sentimos, hubo un error cuando intentamos enviarle correos de "
|
||||
"invitación. Por favor, revise la configuración de correo en el servidor o"
|
||||
" contactese con el administrador."
|
||||
"Lo sentimos, hubo un error al intentar enviar los correos electrónicos de "
|
||||
"invitación."
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr "Se añadieron %(member)s"
|
||||
msgstr "%(member)s ha sido añadido"
|
||||
|
||||
msgid "Error activating participant"
|
||||
msgstr "Error activando participante"
|
||||
msgstr "Error al activar el participante"
|
||||
|
||||
#, python-format
|
||||
msgid "%(name)s is part of this project again"
|
||||
msgstr "%(name)s es parte de este nuevo proyecto"
|
||||
msgstr "%(name)s es parte de este proyecto otra vez"
|
||||
|
||||
msgid "Error removing participant"
|
||||
msgstr "Error eliminando participante"
|
||||
msgstr "Error al eliminar el participante"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Participant '%(name)s' has been deactivated. It will still appear in the "
|
||||
"list until its balance reach zero."
|
||||
msgstr ""
|
||||
"El participante '%(name)s' ha sido desactivado. Seguirá apareciendo en la "
|
||||
"lista hasta que su saldo llegue a cero."
|
||||
"El participante '%(name)s' ha sido desactivado. Seguirá apareciendo en la"
|
||||
" lista hasta que su saldo llegue a cero."
|
||||
|
||||
#, python-format
|
||||
msgid "Participant '%(name)s' has been removed"
|
||||
|
@ -339,7 +350,7 @@ msgid "The bill has been added"
|
|||
msgstr "La factura ha sido agregada"
|
||||
|
||||
msgid "Error deleting bill"
|
||||
msgstr "Error eliminando factura"
|
||||
msgstr "Error al eliminar la factura"
|
||||
|
||||
msgid "The bill has been deleted"
|
||||
msgstr "La factura ha sido eliminada"
|
||||
|
@ -347,6 +358,10 @@ msgstr "La factura ha sido eliminada"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "La factura ha sido modificada"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr "%(lang)s no es un idioma admitido"
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Error al eliminar el historial del proyecto"
|
||||
|
||||
|
@ -407,8 +422,8 @@ msgstr "Acciones"
|
|||
msgid "edit"
|
||||
msgstr "Editar"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "Eliminar"
|
||||
msgid "Delete project"
|
||||
msgstr "Borrar proyecto"
|
||||
|
||||
msgid "show"
|
||||
msgstr "enseñar"
|
||||
|
@ -422,20 +437,11 @@ msgstr "Instalar aplicación móvil"
|
|||
msgid "Get it on"
|
||||
msgstr "Conseguir en"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "¿Estás segura?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Editar proyecto"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Borrar proyecto"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Importar JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Escoger un archivo"
|
||||
msgid "Import project"
|
||||
msgstr "Importar proyecto"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Descargar datos del proyecto"
|
||||
|
@ -463,18 +469,27 @@ msgstr "Cancelar"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Ajustes de privacidad"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Editar el proyecto"
|
||||
msgid "Save changes"
|
||||
msgstr "Guardar cambios"
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr "Esto va a remover todas las facturas y participantes en este proyecto!"
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Importar proyecto previamente exportado"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Escoger un archivo"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Editar esta factura"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Agregar una factura"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr "Se permiten operaciones simples, e.j. (18+36.2)/3"
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Todos"
|
||||
|
||||
|
@ -493,20 +508,17 @@ msgstr "Editar este participante"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "john.doe@example.com, mary.moe@site.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Enviar las invitaciones"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Descargar"
|
||||
|
||||
msgid "Disabled Project History"
|
||||
msgstr "Historial de proyecto activo"
|
||||
msgstr "Historial de proyectos deshabilitado"
|
||||
|
||||
msgid "Disabled Project History & IP Address Recording"
|
||||
msgstr "Historial de proyecto y registros de dirección IP inactivos"
|
||||
|
||||
msgid "Enabled Project History"
|
||||
msgstr "Historial de proyecto activo"
|
||||
msgstr "Historial de proyectos habilitado"
|
||||
|
||||
msgid "Disabled IP Address Recording"
|
||||
msgstr "Registro de direcciones IP activo"
|
||||
|
@ -522,8 +534,7 @@ msgstr "Se cambiaron los ajustes del historial"
|
|||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed from %(before)s to %(after)s"
|
||||
msgstr ""
|
||||
"Factura %(name)s: %(property_name)s ha cambiado de %(before)s a %(after)s"
|
||||
msgstr "Factura %(name)s: %(property_name)s ha cambiado de %(before)s a %(after)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed to %(after)s"
|
||||
|
@ -567,37 +578,23 @@ msgstr "Factura%(name)s: añadida %(owers_list_str)s a la lista de dueños"
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr "Factura %(name)s: removida %(owers_list_str)s de la lista de dueños"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>El historial de este proyecto ha sido desactivado. Nuevas "
|
||||
"operaciones no apareceran a continuacion. El historial se puede "
|
||||
"agregar</i> \n"
|
||||
" <a href=\"%(url)s\">en la página de ajustes</a>\n"
|
||||
" "
|
||||
"Este proyecto tiene el historial deshabilitado. Las nuevas acciones no "
|
||||
"aparecerán a continuación."
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "Puede habilitar el historial en la página de configuración."
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Este registro muestra la actividad previa a la "
|
||||
"desactivación del historial del proyecto. Use la opción \n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">Eliminar historial del proyecto</a> para "
|
||||
"borrarlo.</i></p>\n"
|
||||
" "
|
||||
"La siguiente tabla refleja las acciones registradas antes de deshabilitar el "
|
||||
"historial del proyecto."
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Puede borrar el historial del proyecto para eliminarlos."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -609,18 +606,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Borrar las direcciones IP registradas"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "No hay historial para borrar"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Borrar el historial del proyecto"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "No hay direcciones IP para borrar"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Borrar direcciones IP registradas"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "No hay historial para borrar"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Borrar el historial del proyecto"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Hora"
|
||||
|
||||
|
@ -682,9 +679,15 @@ msgstr "Factura %(name)s renombrada a %(new_description)s"
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr "Participante %(name)s: peso cambiado de %(old_weight)s a %(new_weight)s"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Paga"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Cantidad"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Fecha"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Cantidad en %(currency)s"
|
||||
|
@ -757,8 +760,8 @@ msgid ""
|
|||
"Don\\'t reuse a personal password. Choose a private code and send it to "
|
||||
"your friends"
|
||||
msgstr ""
|
||||
"No reutilice una contraseña personal. Elija un código privado y envíelo a "
|
||||
"sus amigos"
|
||||
"No reutilice una contraseña personal. Elija un código privado y envíelo a"
|
||||
" sus amigos"
|
||||
|
||||
msgid "Account manager"
|
||||
msgstr "Gestor de cuentas"
|
||||
|
@ -787,6 +790,9 @@ msgstr "Historial"
|
|||
msgid "Settings"
|
||||
msgstr "Configuración"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr "rss Feed"
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Otros proyectos :"
|
||||
|
||||
|
@ -796,8 +802,9 @@ msgstr "cambiar a"
|
|||
msgid "Dashboard"
|
||||
msgstr "Tablero"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Cerrar sesión"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr "Vuelva a intentarlo después de %(date)s."
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Código"
|
||||
|
@ -808,7 +815,7 @@ msgstr "Aplicación móvil"
|
|||
msgid "Documentation"
|
||||
msgstr "Documentación"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Panel de administración"
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -830,30 +837,21 @@ msgstr "¿Estás seguro?"
|
|||
msgid "Invite people"
|
||||
msgstr "Invitar personas"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Deberías comenzar agregando participantes"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Añadir una nueva factura"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Nuevas facturas"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Facturas anteriores"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "¿Cuando?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Deberías comenzar agregando participantes"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "¿Quién pagó?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Añadir una nueva factura"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "¿Para qué?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "¿Cuánto?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Agregado el %(date)s"
|
||||
|
@ -862,20 +860,20 @@ msgstr "Agregado el %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Todo el mundo menos %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "Eliminar"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Sin facturas"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Aún no hay nada que listar."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Probablemente quieras"
|
||||
msgid "Add your first bill"
|
||||
msgstr "Añade tu primera factura"
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr "agregar una factura"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "agregar participantes"
|
||||
msgid "Add the first participant"
|
||||
msgstr "Agregar el primer participante"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Recordar contraseña"
|
||||
|
@ -899,40 +897,62 @@ msgstr "Restablecer su contraseña"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Invita a personas a unirse a este proyecto"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Compartir identificador y código"
|
||||
msgid "Share an invitation link"
|
||||
msgstr "Compartir un enlace de invitación"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Puede compartir el identificador del proyecto y el código privado por "
|
||||
"cualquier medio de comunicación."
|
||||
"La forma más sencilla de invitar personas es dándoles el siguiente enlace de "
|
||||
"invitación.<br />Podrán acceder al proyecto, administrar participantes, "
|
||||
"agregar/editar/eliminar facturas. Sin embargo, no tendrán acceso a "
|
||||
"configuraciones importantes como cambiar el código privado o eliminar todo "
|
||||
"el proyecto."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identificador:"
|
||||
msgid "Scan QR code"
|
||||
msgstr "Escanear código QR"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Comparte el enlace"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr ""
|
||||
"Puedes compartir directamente el siguiente enlace a través de tu medio "
|
||||
"preferido"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr "Utilice un dispositivo móvil con una aplicación compatible."
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Enviar por correo electrónico"
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Especifique una lista (separada por comas) de las direcciones de correo "
|
||||
"electrónico a las que desea notificar acerca de la\n"
|
||||
"creación de este proyecto de gestión presupuestaria y les enviaremos un "
|
||||
"correo electrónico para usted."
|
||||
"Especifique una lista de direcciones de correo electrónico (separadas por "
|
||||
"comas) de las personas a las que desea notificar sobre la creación de este "
|
||||
"proyecto. Les enviaremos un correo electrónico con el enlace de invitación."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Compartir identificador y código"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
"Puede compartir el identificador del proyecto y el código privado por "
|
||||
"cualquier medio de comunicación.<br />Cualquier persona con el código "
|
||||
"privado tendrá acceso al proyecto completo, incluido el cambio de "
|
||||
"configuraciones como el código privado o la dirección de correo electrónico "
|
||||
"del proyecto, o incluso la eliminación completa. proyecto."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identificador:"
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr "Código privado:"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr "el código privado se definió cuando creaste el proyecto"
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "¿Quién paga?"
|
||||
|
@ -1052,3 +1072,96 @@ msgstr "Período"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "Personas a notificar"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importar"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Cantidad pagada"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Las facturas no pueden ser nulas"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "El identificador del proyecto es %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "JSON inválido"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "¿Estás segura?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Importar JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>El historial de este "
|
||||
#~ "proyecto ha sido desactivado. Nuevas "
|
||||
#~ "operaciones no apareceran a continuacion. "
|
||||
#~ "El historial se puede agregar</i> \n"
|
||||
#~ " <a href=\"%(url)s\">en la página de ajustes</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Este registro muestra la "
|
||||
#~ "actividad previa a la desactivación del"
|
||||
#~ " historial del proyecto. Use la "
|
||||
#~ "opción \n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">Eliminar historial del "
|
||||
#~ "proyecto</a> para borrarlo.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Enviar invitaciones"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "enseñar"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Editar el proyecto"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Probablemente quieras"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "agregar participantes"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Puede compartir el identificador del "
|
||||
#~ "proyecto y el código privado por "
|
||||
#~ "cualquier medio de comunicación."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Comparte el enlace"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
#~ "Puedes compartir directamente el siguiente "
|
||||
#~ "enlace a través de tu medio "
|
||||
#~ "preferido"
|
||||
|
|
Binary file not shown.
|
@ -1,179 +1,201 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2024-05-23 03:01+0000\n"
|
||||
"Last-Translator: Yamin Siahmargooei <yamin8000@yahoo.com>\n"
|
||||
"Language-Team: Persian <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/fa/>\n"
|
||||
"Language: fa\n"
|
||||
"Language-Team: none\n"
|
||||
"Plural-Forms: nplurals=1; plural=0\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.6-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
msgstr ""
|
||||
msgstr "مقدار یا عبارت نامعتبر. فقط اعداد و عملیاتهای + - * / مجاز هستند."
|
||||
|
||||
msgid "Project name"
|
||||
msgstr "نام پروژه"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "کد خصوصی جدید"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr ""
|
||||
msgstr "کد خصوصی جدید"
|
||||
|
||||
msgid "Enter a new code if you want to change it"
|
||||
msgstr ""
|
||||
msgstr "اگر مایل به تغییر هستید یه کد جدید وارد کنید"
|
||||
|
||||
msgid "Email"
|
||||
msgstr ""
|
||||
msgstr "ایمیل"
|
||||
|
||||
msgid "Enable project history"
|
||||
msgstr ""
|
||||
msgstr "فعال کردن تاریخچهی پروژه"
|
||||
|
||||
msgid "Use IP tracking for project history"
|
||||
msgstr ""
|
||||
msgstr "برای تاریخچهی پروژه از ردیابی آدرس IP استفاده شود"
|
||||
|
||||
msgid "Default Currency"
|
||||
msgstr ""
|
||||
msgstr "واحد پولی پیش فرض"
|
||||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
msgstr "تنظیم واحد پولی پیش فرض امکان تبدیل ارز بین قبضها رو فراهم میکنه"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "خطای ناشناخته"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "کد خصوصی نامعتبر."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"این پروژه نمیتونه به صورت «بدون واحد پولی» تنظیم بشه چون شامل قبوض با "
|
||||
"ارزهای مختلفه."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr ""
|
||||
msgstr "شناسه پروژه"
|
||||
|
||||
msgid "Private code"
|
||||
msgstr ""
|
||||
msgstr "کد خصوصی"
|
||||
|
||||
msgid "Create the project"
|
||||
msgstr ""
|
||||
msgstr "ساخت پروژه"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"A project with this identifier (\"%(project)s\") already exists. Please "
|
||||
"choose a new identifier"
|
||||
msgstr ""
|
||||
"پروژهای با شناسهی (\"%(project)s\") از قبل وجود داره. لطفا یه شناسهی "
|
||||
"جدید وارد کن"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr ""
|
||||
msgstr "کدوم یکی واقعا واحد پولیه: یورو یا دلار نفتی؟"
|
||||
|
||||
msgid "euro"
|
||||
msgstr ""
|
||||
msgstr "یورو"
|
||||
|
||||
msgid "Please, validate the captcha to proceed."
|
||||
msgstr ""
|
||||
msgstr "لطفا برای ادامه کپچا رو تایید کن."
|
||||
|
||||
msgid "Enter private code to confirm deletion"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr ""
|
||||
msgstr "کد خصوصی رو برای تایید حذف وارد کن"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr ""
|
||||
msgstr "بیا تو"
|
||||
|
||||
msgid "Admin password"
|
||||
msgstr ""
|
||||
msgstr "گذرواژهی مدیر"
|
||||
|
||||
msgid "Send me the code by email"
|
||||
msgstr ""
|
||||
msgstr "کد رو برام ایمیل کن"
|
||||
|
||||
msgid "This project does not exists"
|
||||
msgstr ""
|
||||
msgstr "این پروژه وجود نداره"
|
||||
|
||||
msgid "Password mismatch"
|
||||
msgstr ""
|
||||
msgstr "گذرواژهها با هم نمیخونه"
|
||||
|
||||
msgid "Password"
|
||||
msgstr ""
|
||||
msgstr "گذرواژه"
|
||||
|
||||
msgid "Password confirmation"
|
||||
msgstr ""
|
||||
msgstr "تایید گذرواژه"
|
||||
|
||||
msgid "Reset password"
|
||||
msgstr ""
|
||||
msgstr "بازنشانی گذرواژه"
|
||||
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
msgid "When?"
|
||||
msgstr "چه زمانی؟"
|
||||
|
||||
msgid "What?"
|
||||
msgstr ""
|
||||
msgstr "چی؟"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr ""
|
||||
msgid "Who paid?"
|
||||
msgstr "چه کسی پرداخت کرد؟"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr ""
|
||||
msgid "How much?"
|
||||
msgstr "چقدر؟"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr ""
|
||||
msgstr "واحد پولی"
|
||||
|
||||
msgid "External link"
|
||||
msgstr ""
|
||||
msgstr "لینک خارجی"
|
||||
|
||||
msgid "A link to an external document, related to this bill"
|
||||
msgstr ""
|
||||
msgstr "یه لینک به سند خارجی به این قبض مربوطه"
|
||||
|
||||
msgid "For whom?"
|
||||
msgstr ""
|
||||
msgstr "برای کی؟"
|
||||
|
||||
msgid "Submit"
|
||||
msgstr ""
|
||||
msgstr "ثبت"
|
||||
|
||||
msgid "Submit and add a new one"
|
||||
msgstr ""
|
||||
msgstr "ثبت و اضافه کردن جدید"
|
||||
|
||||
#, python-format
|
||||
msgid "Project default: %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr ""
|
||||
msgstr "پیش فرض پروژه: %(currency)s"
|
||||
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
msgstr "نام"
|
||||
|
||||
msgid "Weights should be positive"
|
||||
msgstr ""
|
||||
msgstr "وزن باید مثبت باشه"
|
||||
|
||||
msgid "Weight"
|
||||
msgstr ""
|
||||
msgstr "وزن"
|
||||
|
||||
msgid "Add"
|
||||
msgstr ""
|
||||
msgstr "اضافه"
|
||||
|
||||
msgid "The participant name is invalid"
|
||||
msgstr ""
|
||||
msgstr "نام شرکت کننده نامعتبره"
|
||||
|
||||
msgid "This project already have this participant"
|
||||
msgstr ""
|
||||
msgstr "این شرکت کننده از قبل عضو پروژه هست"
|
||||
|
||||
msgid "People to notify"
|
||||
msgstr ""
|
||||
msgstr "افرادی که براشون نوتیفیکیشن ارسال میشه"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr ""
|
||||
msgid "Send the invitations"
|
||||
msgstr "ارسال دعوت نامه ها"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "ایمیل %(email)s نامعتبره"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "خروج"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
|
||||
#. List with two items only
|
||||
|
@ -193,7 +215,7 @@ msgid "{start_object}, {next_object}"
|
|||
msgstr ""
|
||||
|
||||
msgid "No Currency"
|
||||
msgstr ""
|
||||
msgstr "بدون واحد پولی"
|
||||
|
||||
#. Form error with only one error
|
||||
msgid "{prefix}: {error}"
|
||||
|
@ -203,22 +225,18 @@ msgstr ""
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
msgstr ""
|
||||
msgstr "گذرواژهی مدیر صحیح نیست. فقط %(num)d بار دیگه میشه سعی کنی."
|
||||
|
||||
msgid "Provided token is invalid"
|
||||
msgstr ""
|
||||
msgstr "توکن وارد شده نامعتبره"
|
||||
|
||||
msgid "This private code is not the right one"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
msgstr "این کد خصوصی اون کد خصوصی درست نیست"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
@ -228,14 +246,9 @@ msgid ""
|
|||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
|
@ -250,10 +263,14 @@ msgstr ""
|
|||
msgid "Password successfully reset."
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -261,12 +278,18 @@ msgid ""
|
|||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
@ -274,10 +297,7 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -320,6 +340,10 @@ msgstr ""
|
|||
msgid "The bill has been modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr ""
|
||||
|
||||
|
@ -380,7 +404,7 @@ msgstr ""
|
|||
msgid "edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
|
@ -395,20 +419,12 @@ msgstr ""
|
|||
msgid "Get it on"
|
||||
msgstr ""
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "ساخت پروژه"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr ""
|
||||
|
@ -434,18 +450,27 @@ msgstr ""
|
|||
msgid "Privacy Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the project"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr ""
|
||||
|
||||
|
@ -464,9 +489,6 @@ msgstr ""
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
|
@ -531,23 +553,18 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -558,18 +575,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
|
||||
|
@ -631,9 +648,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "پرداخت کننده"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr ""
|
||||
|
||||
msgid "Date"
|
||||
msgstr "تاریخ"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr ""
|
||||
|
@ -734,6 +757,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
|
@ -743,7 +769,8 @@ msgstr ""
|
|||
msgid "Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
|
@ -755,7 +782,7 @@ msgstr ""
|
|||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -777,30 +804,21 @@ msgstr ""
|
|||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "When?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who paid?"
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For what?"
|
||||
msgstr ""
|
||||
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr ""
|
||||
|
@ -809,19 +827,19 @@ msgstr ""
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "No bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgid "Add the first participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password reminder"
|
||||
|
@ -844,31 +862,49 @@ msgstr ""
|
|||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "کد خصوصی"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
@ -943,3 +979,116 @@ msgstr ""
|
|||
#~ msgid "Participants to notify"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import previously exported JSON file"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "قبضها نمیتونند تهی باشن"
|
||||
|
||||
#~ msgid "Too many failed login attempts, please retry later."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "sending you an email with password "
|
||||
#~ "reset instructions. Please check the "
|
||||
#~ "email configuration of the server or "
|
||||
#~ "contact the administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "trying to send the invitation emails."
|
||||
#~ " Please check the email configuration "
|
||||
#~ "of the server or contact the "
|
||||
#~ "administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "فرستادن دعوت نامه"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add a bill"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email for you."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email with the invitation "
|
||||
#~ "link."
|
||||
#~ msgstr ""
|
||||
|
|
Binary file not shown.
|
@ -7,9 +7,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2023-01-29 15:17+0000\n"
|
||||
"Last-Translator: Glandos <bugs-github@antipoul.fr>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2023-07-29 13:07+0000\n"
|
||||
"Last-Translator: Baptiste <weblate@bitsofnetworks.org>\n"
|
||||
"Language-Team: French <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/fr/>\n"
|
||||
"Language: fr\n"
|
||||
|
@ -17,9 +17,13 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.16-dev\n"
|
||||
"X-Generator: Weblate 5.0-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Vous venez de créer « %(project)s » pour partager vos dépenses"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -30,6 +34,12 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Nom de projet"
|
||||
|
||||
msgid "Current private code"
|
||||
msgstr "Code d’accès actuel"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "Entrez le code d'accès existant pour éditer le projet"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Nouveau code d’accès"
|
||||
|
||||
|
@ -53,6 +63,12 @@ msgstr ""
|
|||
"Choisir une devise par défaut permet d'activer la conversion de devises "
|
||||
"entre les factures"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Erreur inconnue"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Code d’accès invalide."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
|
@ -60,11 +76,8 @@ msgstr ""
|
|||
"Ce projet ne peut pas être sans devise car il contient des factures "
|
||||
"utilisant des devises différentes."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Importer un fichier JSON précédemment exporté"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importer"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "Compatible avec Cospend"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Identifiant du projet"
|
||||
|
@ -80,11 +93,11 @@ msgid ""
|
|||
"A project with this identifier (\"%(project)s\") already exists. Please "
|
||||
"choose a new identifier"
|
||||
msgstr ""
|
||||
"Il existe déjà un projet avec l'identifiant (\"%(project)s\"). Merci d'en "
|
||||
"choisir un autre"
|
||||
"Il existe déjà un projet avec l'identifiant (\"%(project)s\"). Merci d'en"
|
||||
" choisir un autre"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr "Euro ou Petrodollar ?"
|
||||
msgstr "Quelle est la vraie monnaie : Euro ou Petrodollar ?"
|
||||
|
||||
msgid "euro"
|
||||
msgstr "euro"
|
||||
|
@ -95,12 +108,6 @@ msgstr "Merci de valider le captcha avant de continuer."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Entrez le code d'accès pour confirmer la suppression"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Erreur inconnue"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Code d’accès invalide."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Entrer"
|
||||
|
||||
|
@ -125,17 +132,17 @@ msgstr "Confirmation du mot de passe"
|
|||
msgid "Reset password"
|
||||
msgstr "Réinitialiser le mot de passe"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Date"
|
||||
msgid "When?"
|
||||
msgstr "Quand ?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Quoi ?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Payeur"
|
||||
msgid "Who paid?"
|
||||
msgstr "Qui a payé ?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Montant"
|
||||
msgid "How much?"
|
||||
msgstr "Combien ?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Devise"
|
||||
|
@ -159,9 +166,6 @@ msgstr "Valider et ajouter une autre facture"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Devise du projet : %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Le montant d’une facture ne peut pas être vide"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
|
@ -175,7 +179,7 @@ msgid "Add"
|
|||
msgstr "Ajouter"
|
||||
|
||||
msgid "The participant name is invalid"
|
||||
msgstr "Participant⋅e %(name)s réactivé⋅e"
|
||||
msgstr "Le nom du participant est incorrect"
|
||||
|
||||
msgid "This project already have this participant"
|
||||
msgstr "Ce⋅tte membre existe déjà pour ce projet"
|
||||
|
@ -183,13 +187,27 @@ msgstr "Ce⋅tte membre existe déjà pour ce projet"
|
|||
msgid "People to notify"
|
||||
msgstr "Personnes à inviter"
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Envoyer les invitations"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "L’email %(email)s est invalide"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Se déconnecter"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr "Veuillez vérifier la configuration email du serveur."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Veuillez vérifier la configuration email du serveur ou contacter "
|
||||
"l’administrateur⋅ice : %(admin_email)s"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} et {dual_object_1}"
|
||||
|
@ -217,14 +235,14 @@ msgstr "{prefix} : {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix} :<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgstr "Trop d'échecs d’authentification successifs, veuillez réessayer plus tard."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Trop d'échecs d’authentification successifs."
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
msgstr ""
|
||||
"Le mot de passe administrateur⋅ice que vous avez entré n’est pas correct. "
|
||||
"Plus que %(num)d tentatives."
|
||||
"Le mot de passe administrateur⋅ice que vous avez entré n’est pas correct."
|
||||
" Plus que %(num)d tentatives."
|
||||
|
||||
msgid "Provided token is invalid"
|
||||
msgstr "Ce jeton est invalide"
|
||||
|
@ -232,10 +250,6 @@ msgstr "Ce jeton est invalide"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Le code d'accès n’est pas correct"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Vous venez de créer « %(project)s » pour partager vos dépenses"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Un courriel de rappel vient de vous être envoyé"
|
||||
|
||||
|
@ -247,18 +261,12 @@ msgstr ""
|
|||
"s’est produite. Il est toujours possible d’utiliser le projet "
|
||||
"normalement."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "L’identifiant de ce projet est %(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Désolé, une erreur s’est produite lors de l’envoi du courriel contenant les "
|
||||
"instructions de réinitialisation de mot de passe. Veuillez vérifier la "
|
||||
"configuration des courriels du serveur ou contacter l’administrateur⋅ice."
|
||||
"Désolé, une erreur s’est produite lors de l’envoi du courriel contenant "
|
||||
"les instructions de réinitialisation de mot de passe."
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Aucun jeton n’a été fourni"
|
||||
|
@ -272,23 +280,33 @@ msgstr "Projet inconnu"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Le mot de passe a été changé avec succès."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Le projet a été correctement importé"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr "Les paramètres du projet ont bien été enregistrés."
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "Le fichier JSON est invalide"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr "Erreur lors de la lecture du fichier CSV"
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "Attribut manquant : %(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr "Impossible d'ajouter plusieurs devises à un projet sans devise par défaut"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Le projet a été correctement importé"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Projet supprimé"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr "Erreur lors de la suppression du projet"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "Impossible de se déconnecter"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Vous avez été invité⋅e à partager vos dépenses pour %(project)s"
|
||||
|
@ -296,14 +314,10 @@ msgstr "Vous avez été invité⋅e à partager vos dépenses pour %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Vos invitations ont bien été envoyées"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Désolé, une erreur s’est produite lors de l’envoi du courriel d’invitation. "
|
||||
"Veuillez vérifier la configuration des courriels du serveur ou contacter "
|
||||
"l’administrateur⋅ice."
|
||||
"Désolé, une erreur s’est produite lors de l’envoi du courriel "
|
||||
"d’invitation."
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
|
@ -324,8 +338,8 @@ msgid ""
|
|||
"Participant '%(name)s' has been deactivated. It will still appear in the "
|
||||
"list until its balance reach zero."
|
||||
msgstr ""
|
||||
"« %(name)s » a été désactivé⋅e. Il⋅elle continuera d’apparaître jusqu'à ce "
|
||||
"que son solde soit nul."
|
||||
"« %(name)s » a été désactivé⋅e. Il⋅elle continuera d’apparaître jusqu'à "
|
||||
"ce que son solde soit nul."
|
||||
|
||||
#, python-format
|
||||
msgid "Participant '%(name)s' has been removed"
|
||||
|
@ -347,6 +361,10 @@ msgstr "La facture a été supprimée"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "La facture a été modifiée"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr "La langue %(lang)s n'est pas prise en charge"
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Erreur lors de la suppression de l'historique du projet"
|
||||
|
||||
|
@ -407,8 +425,8 @@ msgstr "Actions"
|
|||
msgid "edit"
|
||||
msgstr "éditer"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "supprimer"
|
||||
msgid "Delete project"
|
||||
msgstr "Supprimer le projet"
|
||||
|
||||
msgid "show"
|
||||
msgstr "voir"
|
||||
|
@ -422,20 +440,11 @@ msgstr "Télécharger l’application mobile"
|
|||
msgid "Get it on"
|
||||
msgstr "Télécharger depuis"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "Êtes-vous sûr⋅e ?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Éditer le projet"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Supprimer le projet"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Importer le fichier JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Choisir un fichier"
|
||||
msgid "Import project"
|
||||
msgstr "Importer le projet"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Télécharger les données du projet"
|
||||
|
@ -461,18 +470,27 @@ msgstr "Annuler"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Vie privée"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Éditer le projet"
|
||||
msgid "Save changes"
|
||||
msgstr "Sauvegarder les modifications"
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr "Cela supprimera toutes les factures et participant⋅es du projet !"
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Importer un projet précédemment exporté"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Choisir un fichier"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Éditer cette facture"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Ajouter une facture"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr "Les opérations simples sont possibles, par exemple (18+36.2)/3"
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Tout le monde"
|
||||
|
||||
|
@ -486,14 +504,11 @@ msgid "Add participant"
|
|||
msgstr "Ajouter un⋅e participant⋅e"
|
||||
|
||||
msgid "Edit this participant"
|
||||
msgstr "Ajouter un⋅e participant⋅e"
|
||||
msgstr "Modifier un⋅e participant⋅e"
|
||||
|
||||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "marie@site.com, jean.dupont@exemple.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Envoyer les invitations"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Télécharger"
|
||||
|
||||
|
@ -558,45 +573,31 @@ msgstr ""
|
|||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: added %(owers_list_str)s to owers list"
|
||||
msgstr ""
|
||||
"Facture %(name)s : %(owers_list_str)s ajouté à la liste des débiteur⋅ices"
|
||||
msgstr "Facture %(name)s : %(owers_list_str)s ajouté à la liste des débiteur⋅ices"
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
"Facture %(name)s : %(owers_list_str)s supprimé de la liste des débiteur⋅ices"
|
||||
"Facture %(name)s : %(owers_list_str)s supprimé de la liste des "
|
||||
"débiteur⋅ices"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>L'historique de ce projet a été désactivé. Les nouvelles "
|
||||
"actions n'apparaîtront pas ci-dessous. Vous pouvez réactiver l'historique"
|
||||
" du projet dans les </i>\n"
|
||||
" <a href=\"%(url)s\">paramètres du projet</a>\n"
|
||||
" "
|
||||
"L'historique de ce projet est désactivé. Les nouvelles actions "
|
||||
"n'apparaîtront pas ci-dessous."
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "Vous pouvez activer l'historique dans les paramètres."
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Le tableau ci-dessous liste les actions enregistrées avant la "
|
||||
"désactivation de l'historique du projet. Vous pouvez\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
"target=\"#confirm-erase\">supprimer l'historique du projet</a> pour les "
|
||||
"supprimer.</i></p>\n"
|
||||
" "
|
||||
"Le tableau ci-dessous affiche uniquement les actions enregistrées avant "
|
||||
"que l'historique n'ait été désactivé pour ce projet."
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Vous pouvez supprimer l'historique du projet pour les enlever."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -608,18 +609,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Supprimer toutes les adresses IP enregistrées"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Aucun historique à supprimer"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Supprimer les entrées de l'historique du projet"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Aucune adresse IP à supprimer"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Supprimer les adresses IP enregistrées"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Aucun historique à supprimer"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Supprimer les entrées de l'historique du projet"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Heure"
|
||||
|
||||
|
@ -628,8 +629,8 @@ msgstr "Évènement"
|
|||
|
||||
msgid "IP address recording can be enabled on the settings page"
|
||||
msgstr ""
|
||||
"Vous pouvez activer l'enregistrement des adresses IP dans les paramètres de "
|
||||
"la page"
|
||||
"Vous pouvez activer l'enregistrement des adresses IP dans les paramètres "
|
||||
"de la page"
|
||||
|
||||
msgid "IP address recording can be disabled on the settings page"
|
||||
msgstr ""
|
||||
|
@ -687,9 +688,15 @@ msgstr ""
|
|||
"Participant⋅e %(name)s : nombre de parts changé de %(old_weight)s en "
|
||||
"%(new_weight)s"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Payeur"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Montant"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Date"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Montant en %(currency)s"
|
||||
|
@ -792,6 +799,9 @@ msgstr "Historique"
|
|||
msgid "Settings"
|
||||
msgstr "Options"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr "Flux RSS"
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Autres projets :"
|
||||
|
||||
|
@ -801,8 +811,9 @@ msgstr "aller à"
|
|||
msgid "Dashboard"
|
||||
msgstr "Tableau de bord"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Se déconnecter"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr "Veuillez réessayer après %(date)s."
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Code"
|
||||
|
@ -813,7 +824,7 @@ msgstr "Application mobile"
|
|||
msgid "Documentation"
|
||||
msgstr "Documentation"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Panneau d'administration"
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -835,30 +846,21 @@ msgstr "vous confirmez ?"
|
|||
msgid "Invite people"
|
||||
msgstr "Inviter des gens"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Vous devriez commencer par ajouter des participant⋅es"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Nouvelle facture"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Factures suivantes"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Factures précédentes"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Quand ?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Vous devriez commencer par ajouter des participant⋅es"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Qui a payé ?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Nouvelle facture"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Pour quoi ?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Combien ?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Ajouté le %(date)s"
|
||||
|
@ -867,20 +869,20 @@ msgstr "Ajouté le %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Tout le monde sauf %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "supprimer"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Pas encore de factures"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Rien à lister pour le moment."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Vous souhaitez sûrement"
|
||||
msgid "Add your first bill"
|
||||
msgstr "Ajouter votre première facture"
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr "ajouter une facture"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "ajouter des participant⋅es"
|
||||
msgid "Add the first participant"
|
||||
msgstr "Ajouter le premier participant ou la première participante"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Rappel du code d’accès"
|
||||
|
@ -904,36 +906,62 @@ msgstr "Changez votre code d'accès"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Invitez des personnes à rejoindre ce projet"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Partager l'identifiant et le code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr "Partager un lien d'invitation"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Vous pouvez partager l'identifiant de ce projet et le code d'accès par "
|
||||
"d'autres moyens."
|
||||
"Pour inviter des personnes dans ce projet, vous pouvez leur donner le "
|
||||
"lien d'invitation ci-dessous.<br />Elles pourront ainsi accéder au "
|
||||
"projet, gérer les participants, ajouter/modifier/supprimer des factures. "
|
||||
"En revanche, elles ne pourront pas modifier des paramètres importants "
|
||||
"tels que le code d'accès ou supprimer le projet."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identifiant :"
|
||||
msgid "Scan QR code"
|
||||
msgstr "Scannez le QR code"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Partagez le lien"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr "Vous pouvez directement partager le lien suivant"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr "Utilisez un appareil mobile avec une application compatible."
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Envoyer par email(s)"
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Entrez les emails des personnes avec qui vous souhaitez partager ce projet, "
|
||||
"nous leur enverrons un lien d'invitation."
|
||||
"Entrez les emails des personnes avec qui vous souhaitez partager ce projet ("
|
||||
"en séparant les adresses emails avec des virgules). Nous leur enverrons un "
|
||||
"mail avec le lien d'invitation."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Partager l'identifiant et le code"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
"Vous pouvez partager l'identifiant de ce projet et le code d'accès par "
|
||||
"tout moyen de votre choix.<br />Une personne possédant le code d'accès "
|
||||
"aura un accès complet au projet, y compris pour changer le code d'accès "
|
||||
"ou l'adresse email associée au projet, voire même supprimer complètement "
|
||||
"le projet."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identifiant :"
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr "Code d’accès :"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr "le code d'accès a été défini lorsque vous avez créé le projet"
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Qui doit payer ?"
|
||||
|
@ -1269,3 +1297,94 @@ msgstr "Période"
|
|||
|
||||
#~ msgid "Participants to notify"
|
||||
#~ msgstr "ajouter des participant⋅e⋅s"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importer"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Montant"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Le montant d’une facture ne peut pas être vide"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "L’identifiant de ce projet est %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "Le fichier JSON est invalide"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "Êtes-vous sûr⋅e ?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Importer le fichier JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>L'historique de ce projet "
|
||||
#~ "a été désactivé. Les nouvelles actions"
|
||||
#~ " n'apparaîtront pas ci-dessous. Vous "
|
||||
#~ "pouvez réactiver l'historique du projet "
|
||||
#~ "dans les </i>\n"
|
||||
#~ " <a href=\"%(url)s\">paramètres du projet</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Le tableau ci-dessous "
|
||||
#~ "liste les actions enregistrées avant la"
|
||||
#~ " désactivation de l'historique du projet."
|
||||
#~ " Vous pouvez\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">supprimer l'historique du"
|
||||
#~ " projet</a> pour les supprimer.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Envoyer les invitations"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "voir"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Éditer le projet"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Vous souhaitez sûrement"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "ajouter des participant⋅es"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Vous pouvez partager l'identifiant de ce"
|
||||
#~ " projet et le code d'accès par "
|
||||
#~ "d'autres moyens."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Partagez le lien"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "Vous pouvez directement partager le lien suivant"
|
||||
|
|
Binary file not shown.
|
@ -1,19 +1,24 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-05-22 20:21+0200\n"
|
||||
"PO-Revision-Date: 2022-11-07 10:07+0000\n"
|
||||
"Last-Translator: Raanan Katz <raakatz97@gmail.com>\n"
|
||||
"Language-Team: Hebrew <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/he/>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2023-07-24 07:07+0000\n"
|
||||
"Last-Translator: Nati Lintzer <nlintzer@gmail.com>\n"
|
||||
"Language: he\n"
|
||||
"Language-Team: Hebrew <https://hosted.weblate.org/projects/i-hate-money/i"
|
||||
"-hate-money/he/>\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 "
|
||||
"&& n % 10 == 0) ? 2 : 3))\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
|
||||
"n % 10 == 0) ? 2 : 3));\n"
|
||||
"X-Generator: Weblate 4.14.2\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "יצרת את פרויקט '%(project)s' כדי לחלוק את הוצאותיך"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
|
@ -23,6 +28,13 @@ msgstr "כמות או ביטוי לא תקין. יש להזין רק מספרי
|
|||
msgid "Project name"
|
||||
msgstr "שם הפרויקט"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "קוד פרטי חדש"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "קוד פרטי חדש"
|
||||
|
||||
|
@ -44,17 +56,21 @@ msgstr "מטבע ברירת המחדל"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr "בחירת מטבע ברירת מחדל מאפשרת המרת מטבע בין חשבונות"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "שגיאה לא ידועה"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "קוד פרטי לא תקין."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"בפרויקט זה לא ניתן להגדיר 'ללא מטבע' מכיוון שהוא כולל חשבונות במספר מטבעות."
|
||||
"בפרויקט זה לא ניתן להגדיר 'ללא מטבע' מכיוון שהוא כולל חשבונות במספר "
|
||||
"מטבעות."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "ייבא קובץ JSON מיוצא"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "ייבא"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "מזהה פרויקט"
|
||||
|
@ -83,12 +99,6 @@ msgstr "אנא אמת את ה-Captcha כדי להמשיך."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "הזן את הקוד הפרטי כדי לאשר מחיקה"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "שגיאה לא ידועה"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "קוד פרטי לא תקין."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "היכנס"
|
||||
|
||||
|
@ -113,17 +123,17 @@ msgstr "אימות סיסמה"
|
|||
msgid "Reset password"
|
||||
msgstr "איפוס סיסמה"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "תאריך"
|
||||
msgid "When?"
|
||||
msgstr "מתי?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "מה?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "משלם"
|
||||
msgid "Who paid?"
|
||||
msgstr "מי שילם?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "כמות ששולמה"
|
||||
msgid "How much?"
|
||||
msgstr "כמה?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "מטבע"
|
||||
|
@ -147,9 +157,6 @@ msgstr "הזן והוסף אחד חדש"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "ברירת המחדל בפרויקט: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "חשבונות לא יכולים להיות ריקים"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "שם"
|
||||
|
||||
|
@ -171,13 +178,27 @@ msgstr "המשתתף כבר נמצא בפרויקט זה"
|
|||
msgid "People to notify"
|
||||
msgstr "אנשים להתריע להם"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "שלח הזמנות"
|
||||
msgid "Send the invitations"
|
||||
msgstr "שלח את ההזמנות"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "כתובת הדוא\"ל %(email)s אינה תקינה"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "להתנתק"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"מצטערים, אך אירעה שגיאה בעת ששלחנו לכם את המייל עם הוראות איפוס הסיסמה. "
|
||||
"אנא בדקו את הגדרות המייל בשרת או פנו למנהל השרת:%(admin_email)s"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} ו- {dual_object_1}"
|
||||
|
@ -205,8 +226,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgstr "יותר מדי ניסיון התחברות כושלים, אנא נסו שם מאוחר יותר."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "יותר מדי ניסיון התחברות כושלים."
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
|
@ -218,10 +239,6 @@ msgstr "הטוקן שהוזן אינו תקין"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "קוד פרטי זה שגוי"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "יצרת את פרויקט '%(project)s' כדי לחלוק את הוצאותיך"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "דוא\"ל תזכורת נשלח אליך כעת"
|
||||
|
||||
|
@ -229,17 +246,13 @@ msgid ""
|
|||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
"ניסינו לשלוח לך דוא\"ל תזכורת, אבל הייתה שגיאה. תוכל.י להמשיך להשתמש בפרויקט "
|
||||
"כרגיל."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "מזהה הפרויקט הוא %(project)s"
|
||||
"ניסינו לשלוח לך דוא\"ל תזכורת, אבל הייתה שגיאה. תוכל.י להמשיך להשתמש "
|
||||
"בפרויקט כרגיל."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"מצטערים, אך אירעה שגיאה בעת ששלחנו לכם את המייל עם הוראות איפוס הסיסמה. "
|
||||
"בבקשה תבדקו את הגדרות המייל בשרת או פנו למנהל השרת."
|
||||
|
@ -256,23 +269,33 @@ msgstr "פרויקט לא ידוע"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "הסיסמה אופסה בהצלחה."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "הפרויקט הועלה בהצלחה"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "פורמט JSON לא תקין"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "תכונה חסרה:%(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr "לא ניתן להוסיף חשבונות במספר מטבעות לפרויקט ללא מטבע ברירת מחדל"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "הפרויקט הועלה בהצלחה"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "הפרויקט נמחק בהצלחה"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr "שגיאה במחיקת הפרויקט"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "לא ניתן להתנתק"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "הוזמנת לשתף הוצאות בפרויקט %(project)s"
|
||||
|
@ -280,11 +303,8 @@ msgstr "הוזמנת לשתף הוצאות בפרויקט %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "ההזמנות שלך נשלחו"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgstr ""
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr "מצטערים, אך אירעה שגיאה בעת שליחת ההזמנות."
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
|
@ -315,17 +335,22 @@ msgid "Participant '%(name)s' has been modified"
|
|||
msgstr ""
|
||||
|
||||
msgid "The bill has been added"
|
||||
msgstr ""
|
||||
msgstr "החשבון נוסף"
|
||||
|
||||
msgid "Error deleting bill"
|
||||
msgstr ""
|
||||
msgstr "שגיאה בעת מחיקת החשבון"
|
||||
|
||||
#, fuzzy
|
||||
msgid "The bill has been deleted"
|
||||
msgstr ""
|
||||
msgstr "ההוצאה נמחקה"
|
||||
|
||||
msgid "The bill has been modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr "%(lang)s אינה שפה נתמכת"
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "שגיאה במחיקת הסטוריית הפרויקט"
|
||||
|
||||
|
@ -339,7 +364,7 @@ msgid "Deleted recorded IP addresses in project history."
|
|||
msgstr ""
|
||||
|
||||
msgid "Sorry, we were unable to find the page you've asked for."
|
||||
msgstr ""
|
||||
msgstr "מצטערים, לא הצלחנו לגשת לדף שחיפשת."
|
||||
|
||||
msgid "The best thing to do is probably to get back to the main page."
|
||||
msgstr "כנראה שהדבר הטוב ביותר לעשות הוא לחזור לעמוד הראשי."
|
||||
|
@ -363,7 +388,7 @@ msgid "?"
|
|||
msgstr "?"
|
||||
|
||||
msgid "Create a new project"
|
||||
msgstr "צור פרויקט"
|
||||
msgstr "צור פרויקט חדש"
|
||||
|
||||
msgid "Project"
|
||||
msgstr "פרויקט"
|
||||
|
@ -384,10 +409,10 @@ msgid "Actions"
|
|||
msgstr "פעולות"
|
||||
|
||||
msgid "edit"
|
||||
msgstr ""
|
||||
msgstr "ערוך"
|
||||
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
msgid "Delete project"
|
||||
msgstr "מחק פרויקט"
|
||||
|
||||
msgid "show"
|
||||
msgstr ""
|
||||
|
@ -401,20 +426,11 @@ msgstr "הורד אפליקציית מובייל"
|
|||
msgid "Get it on"
|
||||
msgstr ""
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "מחק פרויקט"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "ייבא JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "בחר קובץ"
|
||||
msgid "Import project"
|
||||
msgstr "ייבא פרוייקטים"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr ""
|
||||
|
@ -440,44 +456,50 @@ msgstr ""
|
|||
msgid "Privacy Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the project"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr "ייבא פרוייקט קודם מיוצא"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "בחר קובץ"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
msgstr "ערוך את החשבון"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "הוסף חשבון"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr ""
|
||||
msgstr "כולם"
|
||||
|
||||
msgid "No one"
|
||||
msgstr ""
|
||||
msgstr "אף אחד"
|
||||
|
||||
msgid "More options"
|
||||
msgstr ""
|
||||
msgstr "יותר אפשרויות"
|
||||
|
||||
msgid "Add participant"
|
||||
msgstr ""
|
||||
msgstr "הוסף משתתפים"
|
||||
|
||||
msgid "Edit this participant"
|
||||
msgstr ""
|
||||
msgstr "ערוך את המשתתף"
|
||||
|
||||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
msgstr "john.doe@example.com, mary.moe@site.com"
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
msgstr "הורד"
|
||||
|
||||
msgid "Disabled Project History"
|
||||
msgstr ""
|
||||
msgstr "היסטורית פרויקט מושבתת"
|
||||
|
||||
msgid "Disabled Project History & IP Address Recording"
|
||||
msgstr ""
|
||||
|
@ -537,23 +559,18 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -564,18 +581,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time"
|
||||
msgstr "זמן"
|
||||
|
||||
|
@ -637,9 +654,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "משלם"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "סכום"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "תאריך"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr ""
|
||||
|
@ -732,7 +755,7 @@ msgid "Projects"
|
|||
msgstr "פרויקטים"
|
||||
|
||||
msgid "Start a new project"
|
||||
msgstr ""
|
||||
msgstr "התחל פרוייקט חדש"
|
||||
|
||||
msgid "History"
|
||||
msgstr "הסטוריה"
|
||||
|
@ -740,28 +763,32 @@ msgstr "הסטוריה"
|
|||
msgid "Settings"
|
||||
msgstr "הגדרות"
|
||||
|
||||
msgid "Other projects :"
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "פרויקטים אחרים:"
|
||||
|
||||
msgid "switch to"
|
||||
msgstr ""
|
||||
msgstr "שנה ל"
|
||||
|
||||
msgid "Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "קוד"
|
||||
|
||||
msgid "Mobile Application"
|
||||
msgstr ""
|
||||
msgstr "יישום לנייד"
|
||||
|
||||
msgid "Documentation"
|
||||
msgstr "דוקומנטציה"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -771,42 +798,33 @@ msgid "\"I hate money\" is free software"
|
|||
msgstr "\"אני שונא כסף\" היא תוכנה חינמית"
|
||||
|
||||
msgid "you can contribute and improve it!"
|
||||
msgstr ""
|
||||
msgstr "אתה יכול לתרום ולשפר אותו!"
|
||||
|
||||
#, python-format
|
||||
msgid "%(amount)s each"
|
||||
msgstr ""
|
||||
|
||||
msgid "you sure?"
|
||||
msgstr ""
|
||||
msgstr "האם אתה בטוח?"
|
||||
|
||||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
msgstr "הזמן אנשים"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
msgstr "הוצאות ישנות"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "מתי?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "כדאי להתחיל בהוספת משתמשים"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "מי שילם?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "הוסף הוצאה חדשה"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "עבור מה?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "כמה?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "נוסף בתאריך %(date)s"
|
||||
|
@ -815,20 +833,21 @@ msgstr "נוסף בתאריך %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr "מחק"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr ""
|
||||
msgstr "אין הוצאות"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "ערוך את המשתתף"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "תזכורת סיסמה"
|
||||
|
@ -836,7 +855,7 @@ msgstr "תזכורת סיסמה"
|
|||
msgid ""
|
||||
"A link to reset your password has been sent to you, please check your "
|
||||
"emails."
|
||||
msgstr ""
|
||||
msgstr "נשלח לחשבונך לינק לאיפוס הסיסמה, אנא בדוק את תיבת הדוא\"ל שלך."
|
||||
|
||||
msgid "Return to home page"
|
||||
msgstr "חזור לעמוד הבית"
|
||||
|
@ -845,36 +864,54 @@ msgid "Your projects"
|
|||
msgstr "הפרויקטים שלך"
|
||||
|
||||
msgid "Reset your password"
|
||||
msgstr ""
|
||||
msgstr "אפס את סיסמתך"
|
||||
|
||||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
msgstr "הזמן אנשים להצטרף לפרויקט"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Scan QR code"
|
||||
msgstr "סרוק את הברקוד"
|
||||
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr "השתמש במכשיר נייד עם יישום תואם."
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "שלח באמצעות דוא\"ל"
|
||||
|
||||
msgid ""
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "שתף מזהה וקוד"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "מזהה:"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "קוד פרטי"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
@ -887,7 +924,7 @@ msgid "Who?"
|
|||
msgstr "מי?"
|
||||
|
||||
msgid "Balance"
|
||||
msgstr ""
|
||||
msgstr "מאזן"
|
||||
|
||||
msgid "deactivate"
|
||||
msgstr ""
|
||||
|
@ -902,7 +939,108 @@ msgid "Spent"
|
|||
msgstr ""
|
||||
|
||||
msgid "Expenses by Month"
|
||||
msgstr ""
|
||||
msgstr "הוצאות לפי חודש"
|
||||
|
||||
msgid "Period"
|
||||
msgstr "תקופה"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "ייבא"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "כמות ששולמה"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "חשבונות לא יכולים להיות ריקים"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "מזהה הפרויקט הוא %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "פורמט JSON לא תקין"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "trying to send the invitation emails."
|
||||
#~ " Please check the email configuration "
|
||||
#~ "of the server or contact the "
|
||||
#~ "administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "ייבא JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "שלח הזמנות"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "אתה כנראה רוצה"
|
||||
|
||||
#~ msgid "add a bill"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "הוסף משתמשים"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr "אתה יכול לשתף את מזהה הפרויקט והקוד הפרטי באמצעות כל אמצעי תקשורת."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "שתף את הלינק"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "אתה יכול לשתף ישירות את הלינק באמצעי המועדף עליך"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email for you."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email with the invitation "
|
||||
#~ "link."
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2020-06-14 14:41+0000\n"
|
||||
"Last-Translator: raghupalash <singhpalash0@gmail.com>\n"
|
||||
"Language: hi\n"
|
||||
|
@ -15,6 +15,10 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "आपने अभी अभी अपने खर्चों को साझा करने के लिए '%(project)s' बनाया है"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,6 +29,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "परियोजना का नाम"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "निजी कोड"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "New private code"
|
||||
msgstr "निजी कोड"
|
||||
|
@ -47,16 +58,21 @@ msgstr "डिफ़ॉल्ट मुद्रा"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "अज्ञात परियोजना"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "निजी कोड"
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "पूर्व में निर्यात की गई JSON फ़ाइल आयात करें"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "आयात"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "परियोजना पहचानकर्ता"
|
||||
|
@ -88,14 +104,6 @@ msgstr ""
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "अज्ञात परियोजना"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "निजी कोड"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "अंदर जाइये"
|
||||
|
||||
|
@ -120,17 +128,17 @@ msgstr "पासवर्ड पुष्टीकरण"
|
|||
msgid "Reset password"
|
||||
msgstr "पासवर्ड रीसेट"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "तारीख"
|
||||
msgid "When?"
|
||||
msgstr "कब?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "क्या?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "भुगतानकर्ता"
|
||||
msgid "Who paid?"
|
||||
msgstr "किसने भुगतान किया?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "भुगतान की गई राशि"
|
||||
msgid "How much?"
|
||||
msgstr "कितना?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "मुद्रा"
|
||||
|
@ -154,9 +162,6 @@ msgstr "जमा करें और एक नया जोड़ें"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "प्रोजेक्ट डिफ़ॉल्ट:%(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "बिल शून्य नहीं हो सकते"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "नाम"
|
||||
|
||||
|
@ -180,13 +185,27 @@ msgstr "इस परियोजना में पहले से ही य
|
|||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "आमंत्रण भेजें"
|
||||
msgid "Send the invitations"
|
||||
msgstr "निमंत्रण भेजें"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "ईमेल %(email)s मान्य नहीं है"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "लॉग आउट"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"क्षमा करें, आमंत्रण ईमेल भेजने का प्रयास करते समय कोई त्रुटि हुई। कृपया "
|
||||
"सर्वर के ईमेल कॉन्फ़िगरेशन की जाँच करें या व्यवस्थापक से संपर्क करें।"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
|
@ -214,7 +233,8 @@ msgstr ""
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "बहुत से विफल लॉगिन प्रयास, कृपया बाद में पुनः प्रयास करें।"
|
||||
|
||||
#, python-format
|
||||
|
@ -227,10 +247,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "यह निजी कोड सही नहीं है"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "आपने अभी अभी अपने खर्चों को साझा करने के लिए '%(project)s' बनाया है"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "आपको अभी एक अनुस्मारक ईमेल भेजा गया है"
|
||||
|
||||
|
@ -241,14 +257,10 @@ msgstr ""
|
|||
"हमने आपको एक अनुस्मारक ईमेल भेजने की कोशिश की, लेकिन कोई त्रुटि थी। आप "
|
||||
"अभी भी सामान्य रूप से प्रोजेक्ट का उपयोग कर सकते हैं।"
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "प्रोजेक्ट पहचानकर्ता %(project)s है"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"क्षमा करें, पासवर्ड रीसेट निर्देशों के साथ आपको एक ईमेल भेजते समय कोई "
|
||||
"त्रुटि हुई थी। कृपया सर्वर के ईमेल कॉन्फ़िगरेशन की जाँच करें या "
|
||||
|
@ -266,23 +278,33 @@ msgstr "अज्ञात परियोजना"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "पासवर्ड सफलतापूर्वक रीसेट हो गया है।"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "प्रोजेक्ट सफलतापूर्वक अपलोड किया गया"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "अमान्य JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "प्रोजेक्ट सफलतापूर्वक अपलोड किया गया"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "प्रोजेक्ट सफलतापूर्वक हटा दिया गया"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
@ -292,10 +314,8 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "आपके निमंत्रण भेज दिए गए हैं"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
#, fuzzy
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"क्षमा करें, आमंत्रण ईमेल भेजने का प्रयास करते समय कोई त्रुटि हुई। कृपया "
|
||||
"सर्वर के ईमेल कॉन्फ़िगरेशन की जाँच करें या व्यवस्थापक से संपर्क करें।"
|
||||
|
@ -342,6 +362,10 @@ msgstr "बिल को हटा दिया गया है"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "बिल को संशोधित कर दिया गया है"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting project history"
|
||||
msgstr "प्रोजेक्ट इतिहास सक्षम करें"
|
||||
|
@ -409,8 +433,9 @@ msgstr "कार्य"
|
|||
msgid "edit"
|
||||
msgstr "संपादित करें"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "हटाइये"
|
||||
#, fuzzy
|
||||
msgid "Delete project"
|
||||
msgstr "परियोजना संपादित करें"
|
||||
|
||||
msgid "show"
|
||||
msgstr "प्रदर्शन"
|
||||
|
@ -426,23 +451,13 @@ msgstr "मोबाइल एप्लीकेशन"
|
|||
msgid "Get it on"
|
||||
msgstr "अंदर जाइये"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Are you sure?"
|
||||
msgstr "आपको यकीन है?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "परियोजना संपादित करें"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Delete project"
|
||||
msgid "Import project"
|
||||
msgstr "परियोजना संपादित करें"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "JSON को आयात करे"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "फ़ाइल चुनें"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "प्रोजेक्ट का डेटा डाउनलोड करें"
|
||||
|
||||
|
@ -467,18 +482,28 @@ msgstr "रद्द करें"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "प्राइवेसी सेटिंग्स"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "प्रोजेक्ट संपादित करें"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "पूर्व में निर्यात की गई JSON फ़ाइल आयात करें"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "फ़ाइल चुनें"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "इस बिल को संपादित करें"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "बिल जोड़ें"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "सब"
|
||||
|
||||
|
@ -498,9 +523,6 @@ msgstr "प्रतिभागी जोड़ें"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "john.doe@example.com, mary.moe@site.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "निमंत्रण भेजें"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "डाउनलोड"
|
||||
|
||||
|
@ -572,36 +594,21 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>इस प्रोजेक्ट में इतिहास अक्षम है। नई कार्रवाइयां नीचे "
|
||||
"दिखाई नहीं देंगी। आप इतिहास को यहाँ से सक्षम कर सकते हैं</i>\n"
|
||||
" <a href=\"%(url)s\">सेटिंग्स पृष्ठ</a>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "आईपी पता रिकॉर्डिंग को सेटिंग पेज पर सक्षम किया जा सकता है"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>नीचे दी गई तालिका परियोजना इतिहास को अक्षम करने से पहले "
|
||||
"दर्ज की गई कार्रवाइयों को दर्शाती है। आप उन्हें हटाने के लिए\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">प्रोजेक्ट इतिहास हटा</a>सकते हैं।</i></p>"
|
||||
"\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "किसी ने शायद परियोजना के इतिहास को हटा दिया है।"
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -613,18 +620,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "संग्रहीत IP पते हटाएं"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "मिटाने के लिए कोई इतिहास नहीं है"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "प्रोजेक्ट इतिहास हटाएं"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "मिटाने के लिए कोई IP पते नहीं हैं"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "संग्रहीत IP पते हटाएं"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "मिटाने के लिए कोई इतिहास नहीं है"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "प्रोजेक्ट इतिहास हटाएं"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "समय"
|
||||
|
||||
|
@ -686,9 +693,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "भुगतानकर्ता"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "रकम"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "तारीख"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "%(currency)s में राशि"
|
||||
|
@ -791,6 +804,9 @@ msgstr "इतिहास"
|
|||
msgid "Settings"
|
||||
msgstr "सेटिंग्स"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "अन्य परियोजनाएँ :"
|
||||
|
||||
|
@ -800,8 +816,9 @@ msgstr "पर स्विच करें"
|
|||
msgid "Dashboard"
|
||||
msgstr "डैशबोर्ड"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "लॉग आउट"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "कोड"
|
||||
|
@ -812,7 +829,7 @@ msgstr "मोबाइल एप्लीकेशन"
|
|||
msgid "Documentation"
|
||||
msgstr "प्रलेखन"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "व्यवस्थापन डैशबोर्ड"
|
||||
|
||||
#, fuzzy
|
||||
|
@ -835,30 +852,21 @@ msgstr "आपको यकीन है?"
|
|||
msgid "Invite people"
|
||||
msgstr "लोगों को निमंत्रण भेजें"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "शुरू करने के लिए प्रतिभागियों को जोड़ें"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "नया बिल जोड़ें"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "नए बिल"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "पुराने बिल"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "कब?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "शुरू करने के लिए प्रतिभागियों को जोड़ें"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "किसने भुगतान किया?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "नया बिल जोड़ें"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "किस लिए?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "कितना?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "%(date)s पर जोड़ा गया"
|
||||
|
@ -867,20 +875,22 @@ msgstr "%(date)s पर जोड़ा गया"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "%(excluded)s को छोड़ के बाकी सब"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "हटाइये"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "कोई बिल नहीं"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "सूचि बनाने के लिए कुछ नहीं।"
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "आप शायद यह करना चाहते हैं"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "बिल जोड़ें"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "प्रतिभागियों को जोड़ें"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "प्रतिभागी जोड़ें"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "पासवर्ड अनुस्मारक"
|
||||
|
@ -904,39 +914,56 @@ msgstr "अपना पासवर्ड रीसेट करें"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "इस परियोजना से जुड़ने के लिए लोगों को आमंत्रित करें"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "पहचानकर्ता और कोड साझा करें"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"आप किसी भी संचार माध्यम से परियोजना पहचानकर्ता और निजी कोड साझा कर सकते "
|
||||
"हैं।"
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "पहचानकर्ता:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "लिंक साझा करें"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr "आप नीचे दिए गए लिंक को सीधे अपने पसंदीदा माध्यम से साझा कर सकते हैं"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "ईमेल के माध्यम से भेजें"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"उन ईमेल पतों की एक (अल्पविराम से अलग की गयी) सूची निर्दिष्ट करें जिन्हे "
|
||||
"आप इस \n"
|
||||
"\t\t बजट प्रबंधन परियोजना के निर्माण के बारे में सूचित करना चाहते हैं "
|
||||
"और हम उन्हें आपके लिए एक ईमेल भेजेंगे।"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "पहचानकर्ता और कोड साझा करें"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "पहचानकर्ता:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "निजी कोड"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "किसे भुगतान करना है?"
|
||||
|
||||
|
@ -1035,3 +1062,95 @@ msgstr "अवधि"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "सूचित किये जाने वाले लोग"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "आयात"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "भुगतान की गई राशि"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "बिल शून्य नहीं हो सकते"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "प्रोजेक्ट पहचानकर्ता %(project)s है"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "अमान्य JSON"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "आपको यकीन है?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "JSON को आयात करे"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>इस प्रोजेक्ट में इतिहास "
|
||||
#~ "अक्षम है। नई कार्रवाइयां नीचे दिखाई "
|
||||
#~ "नहीं देंगी। आप इतिहास को यहाँ से"
|
||||
#~ " सक्षम कर सकते हैं</i>\n"
|
||||
#~ " <a href=\"%(url)s\">सेटिंग्स पृष्ठ</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>नीचे दी गई तालिका "
|
||||
#~ "परियोजना इतिहास को अक्षम करने से "
|
||||
#~ "पहले दर्ज की गई कार्रवाइयों को "
|
||||
#~ "दर्शाती है। आप उन्हें हटाने के लिए"
|
||||
#~ "\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">प्रोजेक्ट इतिहास "
|
||||
#~ "हटा</a>सकते हैं।</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "आमंत्रण भेजें"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "प्रदर्शन"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "प्रोजेक्ट संपादित करें"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "आप शायद यह करना चाहते हैं"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "प्रतिभागियों को जोड़ें"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "आप किसी भी संचार माध्यम से "
|
||||
#~ "परियोजना पहचानकर्ता और निजी कोड साझा "
|
||||
#~ "कर सकते हैं।"
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "लिंक साझा करें"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "आप नीचे दिए गए लिंक को सीधे अपने पसंदीदा माध्यम से साझा कर सकते हैं"
|
||||
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
@ -1,21 +1,25 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2022-04-11 17:12+0000\n"
|
||||
"Last-Translator: Santiago José Gutiérrez Llanos <gutierrezapata17@gmail.com>"
|
||||
"\n"
|
||||
"Language-Team: Indonesian <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/id/>\n"
|
||||
"Last-Translator: Santiago José Gutiérrez Llanos "
|
||||
"<gutierrezapata17@gmail.com>\n"
|
||||
"Language: id\n"
|
||||
"Language-Team: Indonesian <https://hosted.weblate.org/projects/i-hate-"
|
||||
"money/i-hate-money/id/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Anda baru saja membuat %(project)s untuk membagikan harga Anda"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -26,6 +30,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Nama proyek"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Kode pribadi baru"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Kode pribadi baru"
|
||||
|
||||
|
@ -45,8 +56,13 @@ msgid "Default Currency"
|
|||
msgstr "Mata Uang Standar"
|
||||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
"Menetapkan mata uang default memungkinkan konversi mata uang antar tagihan"
|
||||
msgstr "Menetapkan mata uang default memungkinkan konversi mata uang antar tagihan"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Kesalahan tidak diketahui"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Kode pribadi tidak valid."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
|
@ -55,11 +71,8 @@ msgstr ""
|
|||
"Proyek ini tidak dapat disetel ke 'tanpa mata uang' karena berisi tagihan"
|
||||
" dalam berbagai mata uang."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Impor file JSON yang sudah diekspor sebelumnya"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Impor"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Pengidentifikasi proyek"
|
||||
|
@ -90,12 +103,6 @@ msgstr "Mohon, silahkan validasi captcha untuk melanjutkan."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Masukkan kode pribadi untuk mengkonfirmasi penghapusan"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Kesalahan tidak diketahui"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Kode pribadi tidak valid."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Masuk"
|
||||
|
||||
|
@ -120,17 +127,17 @@ msgstr "Konfirmasi kata sandi"
|
|||
msgid "Reset password"
|
||||
msgstr "Atur ulang kata sandi"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Tanggal"
|
||||
msgid "When?"
|
||||
msgstr "Kapan?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Apa?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pembayar"
|
||||
msgid "Who paid?"
|
||||
msgstr "Siapa yang bayar?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Jumlah bayar"
|
||||
msgid "How much?"
|
||||
msgstr "Berapa banyak?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Mata Uang"
|
||||
|
@ -154,9 +161,6 @@ msgstr "Ajukan dan tambah yang baru"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Default proyek: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Tagihan tidak boleh kosong"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nama"
|
||||
|
||||
|
@ -178,13 +182,27 @@ msgstr "Proyek ini sudah mempunyai /ada anggota ini"
|
|||
msgid "People to notify"
|
||||
msgstr "Orang yang akan dinotifikasi"
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Kirim undangan"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "Surel %(email)s tidak valid"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Keluar"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Maaf, ada galat saat mencoba mengirim email undangan. Silakan periksa "
|
||||
"konfigurasi email peladen atau hubungi administrator."
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} dan {dual_object_1}"
|
||||
|
@ -212,7 +230,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:1<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Terlalu banyak percobaan masuk, silakan coba lagi nanti."
|
||||
|
||||
#, python-format
|
||||
|
@ -225,10 +244,6 @@ msgstr "Token yang disediakan tidak valid"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Kode pribadi ini tidak benar"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Anda baru saja membuat %(project)s untuk membagikan harga Anda"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Email pengingat baru saja dikirimkan kepada Anda"
|
||||
|
||||
|
@ -239,14 +254,10 @@ msgstr ""
|
|||
"Kami telah mengirimi Anda email pengingat, tetapi ada kesalahan. Anda "
|
||||
"masih dapat menggunakan proyek secara normal."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "Pengidentifikasi proyek adalah %(project)s"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Maaf, ada galat saat mengirim email berisi instruksi pengaturan ulang "
|
||||
"kata sandi. Silakan periksa konfigurasi email peladen atau hubungi "
|
||||
|
@ -264,23 +275,33 @@ msgstr "Proyek tidak diketahui"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Kata sandi berhasil diatur ulang."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Proyek berhasil diunggah"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "JSON tidak valid"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Proyek berhasil diunggah"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Proyek berhasil dihapus"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Anda telah diundang untuk membagikan harga Anda untuk %(project)s"
|
||||
|
@ -288,10 +309,8 @@ msgstr "Anda telah diundang untuk membagikan harga Anda untuk %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Undangan Anda telah dikirim"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
#, fuzzy
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Maaf, ada galat saat mencoba mengirim email undangan. Silakan periksa "
|
||||
"konfigurasi email peladen atau hubungi administrator."
|
||||
|
@ -338,6 +357,10 @@ msgstr "Tagihan telah dihapus"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "Tagihan telah diperbarui"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Kesalahan saat menghapus riwayat proyek"
|
||||
|
||||
|
@ -398,8 +421,8 @@ msgstr "Aksi"
|
|||
msgid "edit"
|
||||
msgstr "ubah"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "hapus"
|
||||
msgid "Delete project"
|
||||
msgstr "Hapus proyek"
|
||||
|
||||
msgid "show"
|
||||
msgstr "tampilkan"
|
||||
|
@ -413,20 +436,12 @@ msgstr "Unduh Aplikasi Seluler"
|
|||
msgid "Get it on"
|
||||
msgstr "Dapatkan di"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "Apakah Anda yakin?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Ubah proyek"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Hapus proyek"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Impor JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Pilih berkas"
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "Ubah proyek"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Unduh data proyek"
|
||||
|
@ -452,18 +467,28 @@ msgstr "Batalkan"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Pengaturan Privasi"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Ubah proyek"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Impor file JSON yang sudah diekspor sebelumnya"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Pilih berkas"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Ubah tagihan ini"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Tambah tagihan"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Semua orang"
|
||||
|
||||
|
@ -482,9 +507,6 @@ msgstr "Sunting anggota ini"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "john.doe@example.com, mary.moe@site.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Kirim undangan"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Unduh"
|
||||
|
||||
|
@ -555,37 +577,21 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i> Proyek ini memiliki riwayat yang dinonaktifkan. Tindakan "
|
||||
"baru tidak akan muncul di bawah ini. Anda dapat mengaktifkan riwayat "
|
||||
"pada</i>\n"
|
||||
" <a href=\"%(url)s\">halaman pengaturan</a>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "Perekaman alamat IP dapat diaktifkan di halaman pengaturan"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i> Tabel di bawah mencerminkan tindakan yang direkam sebelum"
|
||||
" menonaktifkan riwayat proyek. Anda bisa\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\"> membersihkan riwayat proyek </a> untuk "
|
||||
"menghapusnya. </i> </ p >\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Seseorang mungkin membersihkan riwayat proyek."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -597,18 +603,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Hapus alamat IP yang disimpan"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Tidak ada riwayat untuk dihapus"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Bersihkan Riwayat Proyek"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Tidak ada Alamat IP untuk dihapus"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Hapus alamat IP yang disimpan"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Tidak ada riwayat untuk dihapus"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Bersihkan Riwayat Proyek"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Waktu"
|
||||
|
||||
|
@ -670,9 +676,15 @@ msgstr "Tagihan %(name)s diganti ke %(new_description)s"
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr "Pengguna %(name)s: berat berubah dari %(old_weight)s ke %(new_weight)s"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pembayar"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Jumlah"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Tanggal"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Jumlah dalam %(currency)s"
|
||||
|
@ -775,6 +787,9 @@ msgstr "Riwayat"
|
|||
msgid "Settings"
|
||||
msgstr "Pengaturan"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Proyek lainnya:"
|
||||
|
||||
|
@ -784,8 +799,9 @@ msgstr "ganti ke"
|
|||
msgid "Dashboard"
|
||||
msgstr "Dasbor"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Keluar"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Kode"
|
||||
|
@ -796,7 +812,7 @@ msgstr "Aplikasi Gawai"
|
|||
msgid "Documentation"
|
||||
msgstr "Dokumentasi"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Dasbor Administrasi"
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -818,30 +834,21 @@ msgstr "Anda yakin?"
|
|||
msgid "Invite people"
|
||||
msgstr "Undang orang"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Anda harus mulai dengan menambahkan partisipan"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Tambah tagihan baru"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Tagihan terbaru"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Tagihan terdahulu"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Kapan?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Anda harus mulai dengan menambahkan partisipan"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Siapa yang bayar?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Tambah tagihan baru"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Untuk apa?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Berapa banyak?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Ditambahkan pada %(date)s"
|
||||
|
@ -850,20 +857,22 @@ msgstr "Ditambahkan pada %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Semua orang kecuali %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "hapus"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Tidak ada tagihan"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Belum ada untuk didaftarkan."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Anda mungkin menginginkan"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "tambah tagihan"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "tambah partisipan"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Sunting anggota ini"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Pengingat kata sandi"
|
||||
|
@ -887,41 +896,56 @@ msgstr "Atur ulang kata sandi Anda"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Undang orang untuk bergabung dalam proyek ini"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Bagikan ID & kode"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Anda bisa membagikan ID proyek dan kode pribadi dengan cara komunikasi "
|
||||
"apapun."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "ID:"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Bagikan tautan"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
"Anda bisa membagikan tautan secara langsung melalui media yang Anda "
|
||||
"inginkan"
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Kirim melalui surel"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Spesifikkan daftar alamat surel (dipisah dengan koma) yang akan Anda "
|
||||
"kirim pemberitahuan tentang\n"
|
||||
" pembuatan dari manajemen anggaran proyek ini dan kami "
|
||||
"akan memngirim mereka sebuah surel."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Bagikan ID & kode"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "ID:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Kode pribadi"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Siapa membayar?"
|
||||
|
||||
|
@ -1046,3 +1070,99 @@ msgstr "Periode"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "Orang yang akan diberi pemberitahuan"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Impor"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Jumlah bayar"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Tagihan tidak boleh kosong"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "Pengidentifikasi proyek adalah %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "JSON tidak valid"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "Apakah Anda yakin?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Impor JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i> Proyek ini memiliki "
|
||||
#~ "riwayat yang dinonaktifkan. Tindakan baru "
|
||||
#~ "tidak akan muncul di bawah ini. "
|
||||
#~ "Anda dapat mengaktifkan riwayat pada</i>\n"
|
||||
#~ ""
|
||||
#~ " <a href=\"%(url)s\">halaman pengaturan</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i> Tabel di bawah "
|
||||
#~ "mencerminkan tindakan yang direkam sebelum "
|
||||
#~ "menonaktifkan riwayat proyek. Anda bisa\n"
|
||||
#~ ""
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\"> membersihkan riwayat "
|
||||
#~ "proyek </a> untuk menghapusnya. </i> </"
|
||||
#~ " p >\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Kirim undangan"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "tampilkan"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Ubah proyek"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Anda mungkin menginginkan"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "tambah partisipan"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Anda bisa membagikan ID proyek dan "
|
||||
#~ "kode pribadi dengan cara komunikasi "
|
||||
#~ "apapun."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Bagikan tautan"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
#~ "Anda bisa membagikan tautan secara "
|
||||
#~ "langsung melalui media yang Anda "
|
||||
#~ "inginkan"
|
||||
|
||||
|
|
Binary file not shown.
File diff suppressed because it is too large
Load diff
Binary file not shown.
|
@ -1,20 +1,24 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2020-11-11 16:28+0000\n"
|
||||
"Last-Translator: Jwen921 <yangjingwen0921@gmail.com>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2024-06-24 15:09+0000\n"
|
||||
"Last-Translator: Khang Tran <tranchikhang@outlook.com>\n"
|
||||
"Language-Team: Japanese <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/ja/>\n"
|
||||
"Language: ja\n"
|
||||
"Language-Team: Japanese <https://hosted.weblate.org/projects/i-hate-"
|
||||
"money/i-hate-money/ja/>\n"
|
||||
"Plural-Forms: nplurals=1; plural=0\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 5.6-rc\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "費用を共有するため、%(project)sが作られました"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -23,12 +27,17 @@ msgstr "無効な入力です。数字と「+ - * / 」の演算子しか入力
|
|||
msgid "Project name"
|
||||
msgstr "プロジェクトの名前"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "現在の暗証コード"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "プロジェクトを編集するために、暗証コードを入力してください"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "暗証コード"
|
||||
msgstr "新暗証コード"
|
||||
|
||||
msgid "Enter a new code if you want to change it"
|
||||
msgstr ""
|
||||
msgstr "変更するために、新しい暗証コードを入力してください"
|
||||
|
||||
msgid "Email"
|
||||
msgstr "メールアドレス"
|
||||
|
@ -43,18 +52,21 @@ msgid "Default Currency"
|
|||
msgstr "初期設定にする通貨"
|
||||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
msgstr "明細通貨変換のため、デフォルトの通貨を設定してください"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "不明エラー"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "無効な暗証コード。"
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "以前のJSONファイルをインポートする"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "インポート"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "プロジェクトの名前"
|
||||
|
@ -84,14 +96,6 @@ msgstr ""
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "未知のプロジェクト"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "暗証コード"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "入る"
|
||||
|
||||
|
@ -116,17 +120,17 @@ msgstr "パスワードの確認"
|
|||
msgid "Reset password"
|
||||
msgstr "パスワードの再設定"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "日付"
|
||||
msgid "When?"
|
||||
msgstr "いつ?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "何ですか?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "支払人"
|
||||
msgid "Who paid?"
|
||||
msgstr "誰が支払った?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "支払額"
|
||||
msgid "How much?"
|
||||
msgstr "いくら?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "通貨"
|
||||
|
@ -150,9 +154,6 @@ msgstr "確認して、新しいのを作成します"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "初期プロジェクト: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "数値を空値にしてはいけません"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "名前"
|
||||
|
||||
|
@ -174,15 +175,28 @@ msgid "This project already have this participant"
|
|||
msgstr "プロジェクトはすでにこのメンバーを含めています"
|
||||
|
||||
msgid "People to notify"
|
||||
msgstr ""
|
||||
msgstr "通知したい人"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "招待状を出す"
|
||||
msgid "Send the invitations"
|
||||
msgstr "招待状を送る"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "メールアドレス%(email)sは無効"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "ログアウト"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr "申し訳ございませんが、エラーが発生しました。メールアドレスを再度チェックする"
|
||||
"か、または管理者( %(admin_email)s)に連絡ください"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
|
@ -210,7 +224,8 @@ msgstr ""
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "何度もログインに失敗したので、時間をおいてから再度ログインして下さい。"
|
||||
|
||||
#, python-format
|
||||
|
@ -223,10 +238,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "私用コードは正しくない"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "費用を共有するため、%(project)sが作られました"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "催促メールがただいまあなたに送りました"
|
||||
|
||||
|
@ -235,14 +246,10 @@ msgid ""
|
|||
"still use the project normally."
|
||||
msgstr "催促メールを送った時、エラーが発生しました。このプロジェクトはまだ使えます。"
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "プロジェクト名は%(project)s"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr "申し訳ございませんが、パスワード再設定の説明メールを送った時、エラーが発生しました。メールアドレスを一度確認してまたは管理者に連絡してください。"
|
||||
|
||||
msgid "No token provided"
|
||||
|
@ -257,23 +264,33 @@ msgstr "未知のプロジェクト"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "パスワードを再設定できました。"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "プロジェクトをアップロードできました"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "無効なJSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr "CSVを読み込むことができません"
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "プロジェクトをアップロードできました"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "プロジェクトを削除できました"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "ログアウトできません"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "%(project)sの費用を共有すると、あなたが誘われた"
|
||||
|
@ -281,10 +298,8 @@ msgstr "%(project)sの費用を共有すると、あなたが誘われた"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "あなたの招待状が送られました"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
#, fuzzy
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr "申し訳ございませんが、招待メールを送ったとき、エラーが発生しました。メールアドレスを再度チェックするかまたは管理者に連絡ください。"
|
||||
|
||||
#, python-format
|
||||
|
@ -327,13 +342,16 @@ msgstr "明細が削除されました"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "明細が変更されました"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting project history"
|
||||
msgstr "プロジェクトの歴史を有効にする"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Deleted project history."
|
||||
msgstr "プロジェクトの歴史を有効にする"
|
||||
msgstr "プロジェクトの歴史を削除しました。"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting recorded IP addresses"
|
||||
|
@ -392,8 +410,9 @@ msgstr "操作"
|
|||
msgid "edit"
|
||||
msgstr "編集"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "削除"
|
||||
#, fuzzy
|
||||
msgid "Delete project"
|
||||
msgstr "プロジェクトを編集する"
|
||||
|
||||
msgid "show"
|
||||
msgstr "表示"
|
||||
|
@ -409,23 +428,13 @@ msgstr "携帯アプリ"
|
|||
msgid "Get it on"
|
||||
msgstr "入る"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Are you sure?"
|
||||
msgstr "確認?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "プロジェクトを編集する"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Delete project"
|
||||
msgid "Import project"
|
||||
msgstr "プロジェクトを編集する"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "JSONを導入する"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "ファイルを選択する"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "プロジェクトのデータをダウンロードする"
|
||||
|
||||
|
@ -450,18 +459,28 @@ msgstr "キャンセル"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "プライバシーの設定"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "プロジェクトを編集する"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "以前のJSONファイルをインポートする"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "ファイルを選択する"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "明細を編集する"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "新しい明細書を追加する"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "皆"
|
||||
|
||||
|
@ -481,9 +500,6 @@ msgstr "参加者を追加する"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "john.doe@example.com, mary.moe@site.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "招待状を送る"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "ダウンロードする"
|
||||
|
||||
|
@ -551,33 +567,20 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>このプロジェクトの歴史は操作できません。新しい操作は下に出ません。</i>で歴史を操作可能にすることができます。\n"
|
||||
"<a href=\"%(url)s\">設定ページ</a>\n"
|
||||
" "
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "設定ページでIPアドレス記録を編集可能にすることができる。"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>下の表では操作不可になる前に、プロジェクトの歴史に対して記録された操作が反映されています。…できます。\n"
|
||||
"<a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" data-target"
|
||||
"=\"#confirm-erase\">プロジェクトの歴史を取り除く</a> で取り除きます.</i></p>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "プロジェクトの歴史が誰かに取り除かれたかもしれません。"
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -587,18 +590,18 @@ msgstr "このプロジェクトのIP記録が操作できない一方、下の
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "保存されたIPアドレスを削除する"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "削除できる歴史はない"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "プロジェクトの歴史を取り除く"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "削除できるIPアドレスはない"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "保存されたIPアドレスを削除する"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "削除できる歴史はない"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "プロジェクトの歴史を取り除く"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "時間"
|
||||
|
||||
|
@ -614,13 +617,13 @@ msgstr "設定ページでIPアドレス記録を編集不可にすることが
|
|||
msgid "From IP"
|
||||
msgstr "IPから"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "Project %(name)s added"
|
||||
msgstr "プロジェクトの名前"
|
||||
msgstr "プロジェクト%(name)sが作成されました"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "Bill %(name)s added"
|
||||
msgstr "明細が追加されました"
|
||||
msgstr "%(name)s明細が追加されました"
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s added"
|
||||
|
@ -633,9 +636,9 @@ msgstr "プロジェクトの私用コードが変更された"
|
|||
msgid "Project renamed to %(new_project_name)s"
|
||||
msgstr "プロジェクト名は%(new_project_name)s"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "Project contact email changed to %(new_email)s"
|
||||
msgstr "プロジェクトの連絡メールが…に変更された"
|
||||
msgstr "プロジェクトの連絡メールが%(new_email)sに変更されました"
|
||||
|
||||
msgid "Project settings modified"
|
||||
msgstr "プロジェクトの設定が修正された"
|
||||
|
@ -660,16 +663,22 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "支払人"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "金額"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "日付"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "%(currency)sでの金額"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "Bill %(name)s modified"
|
||||
msgstr "明細が変更されました"
|
||||
msgstr "%(name)s明細が変更されました"
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s modified"
|
||||
|
@ -683,17 +692,17 @@ msgstr "ユーザー%(name)sが既に取り除かれました"
|
|||
msgid "Participant %(name)s removed"
|
||||
msgstr "ユーザー%(name)sが既に取り除かれました"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "Project %(name)s changed in an unknown way"
|
||||
msgstr "未知の方法で変更された"
|
||||
msgstr "プロジェクト%(name)sが不明な方法で変更されました"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "Bill %(name)s changed in an unknown way"
|
||||
msgstr "未知の方法で変更された"
|
||||
msgstr "明細%(name)sが不明な方法で変更されました"
|
||||
|
||||
#, fuzzy, python-format
|
||||
#, python-format
|
||||
msgid "Participant %(name)s changed in an unknown way"
|
||||
msgstr "未知の方法で変更された"
|
||||
msgstr "参加者%(name)sが不明な方法で変更されました"
|
||||
|
||||
msgid "Nothing to list"
|
||||
msgstr "表示できるものがない"
|
||||
|
@ -763,6 +772,9 @@ msgstr "歴史"
|
|||
msgid "Settings"
|
||||
msgstr "設定"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "他のプロジェクト:"
|
||||
|
||||
|
@ -772,8 +784,9 @@ msgstr "…に切り替える"
|
|||
msgid "Dashboard"
|
||||
msgstr "ダッシュボード"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "ログアウト"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "コード"
|
||||
|
@ -784,7 +797,7 @@ msgstr "携帯アプリ"
|
|||
msgid "Documentation"
|
||||
msgstr "書類"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "管理ダッシュボード"
|
||||
|
||||
#, fuzzy
|
||||
|
@ -807,30 +820,21 @@ msgstr "確認?"
|
|||
msgid "Invite people"
|
||||
msgstr "人を誘う"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "参加者を追加して始めましょう"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "新しい明細を追加する"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "もっと新しい明細"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "もっと古い明細"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "いつ?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "参加者を追加して始めましょう"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "誰が支払った?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "新しい明細を追加する"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "何のため?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "いくら?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "%(date)sに追加された"
|
||||
|
@ -839,19 +843,21 @@ msgstr "%(date)sに追加された"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "%(excluded)s以外にみんな"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "削除"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "明細なし"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "表示できるものはありません。"
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "…したいかもしれない"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "明細を追加する"
|
||||
|
||||
msgid "add participants"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "参加者を追加する"
|
||||
|
||||
msgid "Password reminder"
|
||||
|
@ -874,34 +880,50 @@ msgstr "パスワードを再設定する"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "他人をこのプロジェクトに招待する"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "名前とコードを共有する"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
msgstr "プロジェクト名と私用コードは何の方法でも共有できます。"
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "名前:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "リンクを共有する"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr "好きの手段で以下のリンクを直接に共有できる"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "メールで送る"
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr "知らせたいメールアドレスのリスト(カンマ区切り)を指定してください。メールで"
|
||||
"招待リンクを送信します。"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "名前とコードを共有する"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "名前:"
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr "暗証コード:"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
"…を知らせたいメールアドレスのリストを特定する(カンマ区切り)\n"
|
||||
"彼らにこの予算管理プロジェクトの作成をメールでお知らせします。"
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "誰が支払った?"
|
||||
|
@ -998,3 +1020,84 @@ msgstr "期間"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "知らせたい人"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "インポート"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "支払額"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "数値を空値にしてはいけません"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "プロジェクト名は%(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "無効なJSON"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "確認?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "JSONを導入する"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " "
|
||||
#~ "<i>このプロジェクトの歴史は操作できません。新しい操作は下に出ません。</i>で歴史を操作可能にすることができます。\n"
|
||||
#~ "<a href=\"%(url)s\">設定ページ</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>下の表では操作不可になる前に、プロジェクトの歴史に対して記録された操作が反映されています。…できます。\n"
|
||||
#~ "<a href=\"#\" data-toggle=\"modal\" data-"
|
||||
#~ "keyboard=\"false\" data-target=\"#confirm-"
|
||||
#~ "erase\">プロジェクトの歴史を取り除く</a> で取り除きます.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "招待状を出す"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "表示"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "プロジェクトを編集する"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "…したいかもしれない"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "参加者を追加する"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr "プロジェクト名と私用コードは何の方法でも共有できます。"
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "リンクを共有する"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "好きの手段で以下のリンクを直接に共有できる"
|
||||
|
|
Binary file not shown.
|
@ -1,20 +1,26 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2021-10-17 04:56+0000\n"
|
||||
"Last-Translator: a-g-rao <athrigrao@gmail.com>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2023-09-16 10:59+0000\n"
|
||||
"Last-Translator: Baptiste <weblate@bitsofnetworks.org>\n"
|
||||
"Language-Team: Kannada <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/kn/>\n"
|
||||
"Language: kn\n"
|
||||
"Language-Team: Kannada <https://hosted.weblate.org/projects/i-hate-"
|
||||
"money/i-hate-money/kn/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.0.2\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
"ನೀವು ನಿಮ್ಮ ಖರ್ಚು/ವೆಚ್ಚವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು %(project)s ಯೋಜನೆಯನ್ನು "
|
||||
"ಸೃಷ್ಟಿಸಿದ್ದೀರಿ"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,11 +31,17 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "ಯೋಜನೆಯ ಹೆಸರು"
|
||||
|
||||
msgid "Current private code"
|
||||
msgstr "ಪ್ರಸ್ತುತ ಸಂಕೇತಪದ"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "ಯೋಜನೆಯನ್ನು ಪರಿಷ್ಕರಿಸಲು ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಸಂಕೇತಪದವನ್ನು ನಮೂದಿಸಿ"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "ಹೊಸ ಸಂಕೇತಪದ"
|
||||
|
||||
msgid "Enter a new code if you want to change it"
|
||||
msgstr "ಸಂಕೇತಪದ ಬದಲಾಯಿಸಬೇಕೆಂದರೆ ನಮೂದಿಸಿ."
|
||||
msgstr "ಸಂಕೇತಪದ ಬದಲಾಯಿಸಬೇಕೆಂದರೆ ನಮೂದಿಸಿ"
|
||||
|
||||
msgid "Email"
|
||||
msgstr "ಮಿನ್ನಂಚೆ"
|
||||
|
@ -41,24 +53,31 @@ msgid "Use IP tracking for project history"
|
|||
msgstr ""
|
||||
|
||||
msgid "Default Currency"
|
||||
msgstr ""
|
||||
msgstr "ಪುರ್ವನಿಯೋಜಿತ ಕರನ್ಸಿ"
|
||||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
"ಪುರ್ವನಿಯೋಜಿತ ಕರನ್ಸಿಯನ್ನು ನಮೋದಿಸುವುದರಿಂದ ರಶೀದಿಗಳ ನಡುವೆ ಕರನ್ಸಿ ಪರಿವರ್ತನೆಯನ್ನು "
|
||||
"ಸಕ್ರಿಯಗೊಳಿಸುತ್ತದೆ"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "ಅಜ್ಞಾತ ದೋಷ"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "ನಮೂದಿಸಿರುವ ಸಂಕೇತಪದ ಅಮಾನ್ಯವಾಗಿದೆ."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"ಅನೇಕ ಕರೆನ್ಸಿಯ ರಶೀದಿ ಇರುವುದರಿಂದ ಈ ಯೋಜನೆಯನ್ನು \"ಯಾವುದೆ ಕರೆನ್ಸಿ ಇಲ್ಲ\" ಯಂದು "
|
||||
"ನಮೋದಿಸಲು ಆಗುವುದಿಲ್ಲ."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import"
|
||||
msgstr "ಆಮದು"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "ಖರ್ಚನ್ನು ಜೊತೆಗಾರನೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಬಹುದು"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr ""
|
||||
msgstr "ಯೋಜನೆ ಸಂಕೇತ"
|
||||
|
||||
msgid "Private code"
|
||||
msgstr "ಸಂಕೇತಪದ"
|
||||
|
@ -71,25 +90,21 @@ msgid ""
|
|||
"A project with this identifier (\"%(project)s\") already exists. Please "
|
||||
"choose a new identifier"
|
||||
msgstr ""
|
||||
"ಈ ಸಂಕೇತದ (\"%(project)s\") ಇನೊಂದು ಯೋಜನೆ ಆಗಲೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ದಯವಿಟ್ಟು ಹೊಸ "
|
||||
"ಸಂಕೇತವನ್ನು ಆರಿಸಿ"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr ""
|
||||
msgstr "ನಿಜವಾದ ಕರೆನ್ಸಿ ಯಾವುದು: ಯುರೋ ಅಥವಾ ಪೆಟ್ರೋ ಡಾಲರ್?"
|
||||
|
||||
msgid "euro"
|
||||
msgstr "ಯೂರೋ"
|
||||
|
||||
msgid "Please, validate the captcha to proceed."
|
||||
msgstr ""
|
||||
msgstr "ಮುಂದುವರೆಯಲು ದಯವಿಟ್ಟು, ಕ್ಯಾಪ್ಚಾವನ್ನು ಮೌಲ್ಯೀಕರಿಸಿ."
|
||||
|
||||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "ತೆಗೆದುಹಾಕಲು ನಿಮ್ಮ ಸಂಕೇತಪದವನ್ನು ನಮೂದಿಸಿ"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "ಅಜ್ಞಾತ ದೋಷ"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "ನಮೂದಿಸಿರುವ ಸಂಕೇತಪದ ಅಮಾನ್ಯವಾಗಿದೆ."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "ಒಳಹೊಗು"
|
||||
|
||||
|
@ -114,26 +129,27 @@ msgstr "ಪ್ರವೇಶಪದ ದೃಢೀಕರಿಸಿ"
|
|||
msgid "Reset password"
|
||||
msgstr "ಪ್ರವೇಶಪದ ಮರುಹೊಂದಿಸಿ"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "ದಿನಾಂಕ"
|
||||
msgid "When?"
|
||||
msgstr "ಯಾವಾಗ?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "ಏನು?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "ಪಾವತಿಸಿದವರು"
|
||||
msgid "Who paid?"
|
||||
msgstr "ಯಾರು ಪಾವತಿಸಿದ್ದಾರೆ?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "ಪಾವತಿಸಿದ ಮೊತ್ತ"
|
||||
msgid "How much?"
|
||||
msgstr "ಎಷ್ಟು?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "ನಾಣ್ಯಪದ್ಧತಿ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "External link"
|
||||
msgstr ""
|
||||
msgstr "ಬಾಹ್ಯ ಲಿಂಕ್"
|
||||
|
||||
msgid "A link to an external document, related to this bill"
|
||||
msgstr ""
|
||||
msgstr "ಈ ರಶೀದಿಗೆ ಸಂಬಂಧಿಸಿದ ಬಾಹ್ಯ ಕಡತದ ಲಿಂಕ್"
|
||||
|
||||
msgid "For whom?"
|
||||
msgstr "ಯಾರಿಂದ?"
|
||||
|
@ -146,16 +162,13 @@ msgstr "ಕೋರಿಕೆ ಸಲ್ಲಿಸಿ ಹೊಸದನ್ನುಸೇ
|
|||
|
||||
#, python-format
|
||||
msgid "Project default: %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr ""
|
||||
msgstr "ಯೋಜನೆಯ ಪೂರ್ವನಿಯೋಜಿತ ಕರೆನ್ಸಿ: %(currency)s"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "ಹೆಸರು"
|
||||
|
||||
msgid "Weights should be positive"
|
||||
msgstr ""
|
||||
msgstr "ತೂಕವು ಧನಾತ್ಮಕವಾಗಿರಬೇಕು"
|
||||
|
||||
msgid "Weight"
|
||||
msgstr "ತೂಕ"
|
||||
|
@ -164,22 +177,34 @@ msgid "Add"
|
|||
msgstr "ಕೂಡು"
|
||||
|
||||
msgid "The participant name is invalid"
|
||||
msgstr ""
|
||||
msgstr "ಸದಸ್ಯರ ಹೆಸರು ಅಮಾನ್ಯವಾಗಿದೆ"
|
||||
|
||||
#, fuzzy
|
||||
msgid "This project already have this participant"
|
||||
msgstr "ಈ ಸದಸ್ಯರು ಈಗಾಗಲೆ ಈ ಯೋಜನೆಯ ಸದಸ್ಯರಾಗಿದ್ದಾರೆ"
|
||||
|
||||
msgid "People to notify"
|
||||
msgstr ""
|
||||
msgstr "ಸೂಚಿಸಬೇಕಾದ ಜನರು"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "ಆಮಂತ್ರಣ ಕಳುಹಿಸು"
|
||||
msgid "Send the invitations"
|
||||
msgstr "ಆಮಂತ್ರಣಗಳನ್ನು ಕಳುಹಿಸಿ"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "ಮಿನ್ನಂಚೆ %(email)s ಸಮಂಜಸವಾಗಿಲ್ಲ"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "ನಿರ್ಗಮಿಸಿ"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr "ದಯವಿಟ್ಟು, ಇಮೇಲ್ ಸಂರಚನೆ ಪರಿಶೀಲಿಸಿ."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"ದಯವಿಟ್ಟು, ಇಮೇಲ್ ಸಂರಚನೆ ಪರಿಶೀಲಿಸಿ ಅಥವಾ ನಿರ್ವಾಹಕನನ್ನು ಸಂಪರ್ಕಿಸಿ:%(admin_email)s"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} ಮತ್ತು {dual_object_1}"
|
||||
|
@ -197,7 +222,7 @@ msgid "{start_object}, {next_object}"
|
|||
msgstr "{start_object}, {next_object}"
|
||||
|
||||
msgid "No Currency"
|
||||
msgstr ""
|
||||
msgstr "ಯಾವುದೆ ಕರೆನ್ಸಿ ಇಲ್ಲ"
|
||||
|
||||
#. Form error with only one error
|
||||
msgid "{prefix}: {error}"
|
||||
|
@ -207,7 +232,7 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -220,12 +245,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
"ನೀವು ನಿಮ್ಮ ಖರ್ಚು/ವೆಚ್ಚವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು %(project)s ಯೋಜನೆಯನ್ನು "
|
||||
"ಸೃಷ್ಟಿಸಿದ್ದೀರಿ"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "ನಿಮಗೆ ನೆನೆವಿ ಮಿನ್ನಂಚೆಯನ್ನು ಈಗ ಕಳುಹಿಸಲಾಗಿದೆ"
|
||||
|
||||
|
@ -236,14 +255,9 @@ msgstr ""
|
|||
"ನಿಮಗೆ ನೆನವಿ ಮಿನ್ನಂಚೆ ಕಳುಹಿಸಲು ಪ್ರಯತ್ನಿಸಿದ್ದೆವೆ, ಆದರೆ ದೋಷವಿತ್ತು. ನೀವು "
|
||||
"ಯೋಜನೆಯನ್ನು ಸಾಮಾನ್ಯ ಪದತಿಯಂತೆ ಉಪಯೋಗಿಸ ಬಹುದು."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
|
@ -258,10 +272,14 @@ msgstr "ಗೊತ್ತಿಲ್ಲದ ಯೋಜನೆ"
|
|||
msgid "Password successfully reset."
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -269,12 +287,18 @@ msgid ""
|
|||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
@ -284,10 +308,7 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "ನಿಮ್ಮ ಆಮಂತ್ರಣವನ್ನು ಕಳುಹಿಸಲಾಗಿದೆ"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -330,6 +351,10 @@ msgstr "ಬೆಲೆಪಟ್ಟಿಯನ್ನುತೆಗೆಯಲಾಗಿದ
|
|||
msgid "The bill has been modified"
|
||||
msgstr "ಬೆಲೆಪಟ್ಟಿಯನ್ನು ಮಾರ್ಪಡಿಸಲಾಗಿದೆ"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "ಯೋಜನೆಯ ಇತಿಹಾಸವನ್ನು ತೆಗೆಯಲು ದೋಷವಾಗಿದೆ"
|
||||
|
||||
|
@ -390,8 +415,8 @@ msgstr "ಕಾರ್ಯಗಳು"
|
|||
msgid "edit"
|
||||
msgstr "ಪರಿಷ್ಕರಿಸಿ"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "ತೆಗೆಯಿರಿ"
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
msgstr "ತೋರಿಸಿ"
|
||||
|
@ -405,20 +430,12 @@ msgstr ""
|
|||
msgid "Get it on"
|
||||
msgstr ""
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "ಯೋಜನೆಯನ್ನು ರಚಿಸಿ/ಸೃಷ್ಟಿಸಿ"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr ""
|
||||
|
@ -444,18 +461,27 @@ msgstr ""
|
|||
msgid "Privacy Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the project"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr ""
|
||||
|
||||
|
@ -474,9 +500,6 @@ msgstr ""
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
|
@ -541,23 +564,18 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -568,18 +586,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
|
||||
|
@ -641,9 +659,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "ಪಾವತಿಸಿದವರು"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr ""
|
||||
|
||||
msgid "Date"
|
||||
msgstr "ದಿನಾಂಕ"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr ""
|
||||
|
@ -744,6 +768,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
|
@ -753,7 +780,8 @@ msgstr ""
|
|||
msgid "Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
|
@ -765,7 +793,7 @@ msgstr ""
|
|||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -787,30 +815,21 @@ msgstr ""
|
|||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "When?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who paid?"
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For what?"
|
||||
msgstr ""
|
||||
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr ""
|
||||
|
@ -819,19 +838,19 @@ msgstr ""
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr "ತೆಗೆಯಿರಿ"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgid "Add the first participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password reminder"
|
||||
|
@ -854,31 +873,48 @@ msgstr ""
|
|||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr "ಸಂಕೇತಪದ:"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
@ -944,3 +980,116 @@ msgstr ""
|
|||
#~ msgid "Participants to notify"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import previously exported JSON file"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "ಆಮದು"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "ಪಾವತಿಸಿದ ಮೊತ್ತ"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Too many failed login attempts, please retry later."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "sending you an email with password "
|
||||
#~ "reset instructions. Please check the "
|
||||
#~ "email configuration of the server or "
|
||||
#~ "contact the administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "trying to send the invitation emails."
|
||||
#~ " Please check the email configuration "
|
||||
#~ "of the server or contact the "
|
||||
#~ "administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "ಆಮಂತ್ರಣ ಕಳುಹಿಸು"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "ತೋರಿಸಿ"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add a bill"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email for you."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email with the invitation "
|
||||
#~ "link."
|
||||
#~ msgstr ""
|
||||
|
|
Binary file not shown.
|
@ -3,7 +3,7 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2021-07-18 12:32+0000\n"
|
||||
"Last-Translator: Kemystra <izzmin97@gmail.com>\n"
|
||||
"Language: ms\n"
|
||||
|
@ -15,6 +15,10 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -23,6 +27,13 @@ msgstr "Nilai atau ungkapan yang sah. Hanya nombor dan operasi + - * / diterima.
|
|||
msgid "Project name"
|
||||
msgstr "Nama projek"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Kod peribadi baharu"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Kod peribadi baharu"
|
||||
|
||||
|
@ -47,6 +58,13 @@ msgstr "Mata wang asal"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "Ralat yang tidak dikenalpasti"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Kod peribadi tidak sah."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
|
@ -55,12 +73,8 @@ msgstr ""
|
|||
"Projek ini tidak boleh disetkan kepada 'tiada mata wang' kerana projek "
|
||||
"ini mempunyai wang dalam beberapa bentuk mata wang"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Import fail JSON yang telah dieksport sebelum ini"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Import"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr ""
|
||||
|
@ -89,13 +103,6 @@ msgstr ""
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Masukkan kod peribadi untuk mengesahkan penghapusan"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "Ralat yang tidak dikenalpasti"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Kod peribadi tidak sah."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Masuk"
|
||||
|
||||
|
@ -122,17 +129,17 @@ msgstr "Pengesahan kata laluan"
|
|||
msgid "Reset password"
|
||||
msgstr "Tetapkan semula kata laluan"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Tarikh"
|
||||
msgid "When?"
|
||||
msgstr ""
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Apa?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pembayar"
|
||||
msgid "Who paid?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Jumlah dibayar"
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Mata wang"
|
||||
|
@ -158,10 +165,6 @@ msgstr "Hantar dan tambah yang baharu"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Bil tidak boleh kosong"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nama"
|
||||
|
||||
|
@ -186,13 +189,25 @@ msgstr "Projek ini sudah mempunyai ahli"
|
|||
msgid "People to notify"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
msgstr ""
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
|
@ -220,7 +235,7 @@ msgstr ""
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -233,10 +248,6 @@ msgstr ""
|
|||
msgid "This private code is not the right one"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
|
@ -245,14 +256,9 @@ msgid ""
|
|||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
|
@ -267,10 +273,14 @@ msgstr ""
|
|||
msgid "Password successfully reset."
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -278,12 +288,18 @@ msgid ""
|
|||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
@ -291,10 +307,7 @@ msgstr ""
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
|
@ -337,6 +350,10 @@ msgstr ""
|
|||
msgid "The bill has been modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr ""
|
||||
|
||||
|
@ -397,7 +414,7 @@ msgstr ""
|
|||
msgid "edit"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
|
@ -412,20 +429,12 @@ msgstr ""
|
|||
msgid "Get it on"
|
||||
msgstr ""
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "Cipta projek ini"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr ""
|
||||
|
@ -451,18 +460,28 @@ msgstr ""
|
|||
msgid "Privacy Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit the project"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Import fail JSON yang telah dieksport sebelum ini"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr ""
|
||||
|
||||
|
@ -481,9 +500,6 @@ msgstr ""
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
|
@ -548,23 +564,18 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
|
@ -575,18 +586,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
|
||||
|
@ -648,9 +659,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pembayar"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr ""
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Tarikh"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr ""
|
||||
|
@ -751,6 +768,9 @@ msgstr ""
|
|||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
|
@ -760,7 +780,8 @@ msgstr ""
|
|||
msgid "Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
|
@ -772,7 +793,7 @@ msgstr ""
|
|||
msgid "Documentation"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr ""
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -794,30 +815,21 @@ msgstr ""
|
|||
msgid "Invite people"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "When?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who paid?"
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For what?"
|
||||
msgstr ""
|
||||
|
||||
msgid "How much?"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr ""
|
||||
|
@ -826,19 +838,19 @@ msgstr ""
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
msgid "No bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr ""
|
||||
|
||||
msgid "You probably want to"
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "add participants"
|
||||
msgid "Add the first participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password reminder"
|
||||
|
@ -861,31 +873,49 @@ msgstr ""
|
|||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr ""
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Kod peribadi"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
|
@ -954,3 +984,114 @@ msgstr ""
|
|||
#~ msgid "Participants to notify"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Import"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Jumlah dibayar"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Bil tidak boleh kosong"
|
||||
|
||||
#~ msgid "Too many failed login attempts, please retry later."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "sending you an email with password "
|
||||
#~ "reset instructions. Please check the "
|
||||
#~ "email configuration of the server or "
|
||||
#~ "contact the administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Sorry, there was an error while "
|
||||
#~ "trying to send the invitation emails."
|
||||
#~ " Please check the email configuration "
|
||||
#~ "of the server or contact the "
|
||||
#~ "administrator."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add a bill"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email for you."
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Specify a (comma separated) list of "
|
||||
#~ "email adresses you want to notify "
|
||||
#~ "about the\n"
|
||||
#~ " creation of this budget "
|
||||
#~ "management project and we will send "
|
||||
#~ "them an email with the invitation "
|
||||
#~ "link."
|
||||
#~ msgstr ""
|
||||
|
||||
|
|
Binary file not shown.
|
@ -1,20 +1,24 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2022-02-13 16:54+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
|
||||
"i-hate-money/i-hate-money/nb_NO/>\n"
|
||||
"Language: nb_NO\n"
|
||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/i"
|
||||
"-hate-money/i-hate-money/nb_NO/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.11-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Du har akkurat opprettet \"%(project)s\" for å dele dine utgifter"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,6 +29,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Prosjektnavn"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Ny privat kode"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Ny privat kode"
|
||||
|
||||
|
@ -46,6 +57,12 @@ msgstr "Forvalgt valuta"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr "En forvalg valutainnstilling skrur på konvertering mellom regninger"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Ukjent feil"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Ugyldig privat kode"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
|
@ -54,11 +71,8 @@ msgstr ""
|
|||
"Dette prosjektet kan ikke settes til «Ingen valuta» fordi det inneholder "
|
||||
"regninger i flere valutaer."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Importer tidligere eksportert JSON-fil"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importer"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Prosjektidentifikator"
|
||||
|
@ -90,12 +104,6 @@ msgstr "Bekreft CAPTCHA-en for å fortsette."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Skriv inn privat kode for å bekrefte sletting"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Ukjent feil"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Ugyldig privat kode"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Get in"
|
||||
msgstr "Til prosjektet"
|
||||
|
@ -121,17 +129,17 @@ msgstr "Passordbekreftelse"
|
|||
msgid "Reset password"
|
||||
msgstr "Tilbakestill passord"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Dato"
|
||||
msgid "When?"
|
||||
msgstr "Når?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Hva?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Betaler"
|
||||
msgid "Who paid?"
|
||||
msgstr "Hvem betalte?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Beløp betalt"
|
||||
msgid "How much?"
|
||||
msgstr "Hvor meget?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Valuta"
|
||||
|
@ -155,9 +163,6 @@ msgstr "Send inn og legg til ny"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Prosjektforvalg: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Regninger kan ikke være null"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Navn"
|
||||
|
||||
|
@ -181,13 +186,28 @@ msgstr "Allerede medlem av prosjektet"
|
|||
msgid "People to notify"
|
||||
msgstr "Folk å varsle"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "Send invitasjoner"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Send ut invitasjonene"
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "E-posten \"%(email)s\" er ikke gyldig"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Logout"
|
||||
msgstr "Logg ut"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Kunne ikke sende invitasjoner per e-post. Sjekk at e-postoppsettet på "
|
||||
"tjeneren stemmer, eller kontakt administratoren."
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} og {dual_object_1}"
|
||||
|
@ -215,7 +235,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "For mange mislykkede innloggingsforsøk, prøv igjen senere."
|
||||
|
||||
#, python-format
|
||||
|
@ -228,10 +249,6 @@ msgstr "Angitt symbol er ugyldig"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Denne private koden er ikke rett"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Du har akkurat opprettet \"%(project)s\" for å dele dine utgifter"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "En påminnelse har blitt sendt til deg per e-post"
|
||||
|
||||
|
@ -243,15 +260,10 @@ msgstr ""
|
|||
"En påminnelse ble sendt til deg per e-post, men en feil inntraff. Du kan "
|
||||
"fremdeles bruke prosjektet normalt."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "Prosjektidentifikatoren er %(project)s"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"En feil inntraff under forsendelse av passordtilbakestilling til deg per "
|
||||
"e-post. Sjekk at e-postoppsettet til tjeneren er rett, eller kontakt "
|
||||
|
@ -270,19 +282,26 @@ msgstr "Ukjent prosjekt"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Passord tilbakestilt."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Prosjekt opplastet"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "Ugyldig JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
"Kan ikke legge til regninger i flere valutaer i et prosjekt uten forvalgt "
|
||||
"valuta"
|
||||
"Kan ikke legge til regninger i flere valutaer i et prosjekt uten forvalgt"
|
||||
" valuta"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Prosjekt opplastet"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Project successfully deleted"
|
||||
|
@ -292,6 +311,9 @@ msgstr "Prosjekt slettet"
|
|||
msgid "Error deleting project"
|
||||
msgstr "Kunne ikke slette prosjekt"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
@ -302,10 +324,7 @@ msgid "Your invitations have been sent"
|
|||
msgstr "Invitasjonene dine har blitt sendt"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Kunne ikke sende invitasjoner per e-post. Sjekk at e-postoppsettet på "
|
||||
"tjeneren stemmer, eller kontakt administratoren."
|
||||
|
@ -354,6 +373,10 @@ msgstr "Regningen har blitt slettet"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "Regningen har blitt endret"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Skru på prosjekthistorikk"
|
||||
|
@ -421,8 +444,8 @@ msgstr "Handlinger"
|
|||
msgid "edit"
|
||||
msgstr "rediger"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "slett"
|
||||
msgid "Delete project"
|
||||
msgstr "Slett prosjekt"
|
||||
|
||||
msgid "show"
|
||||
msgstr "vis"
|
||||
|
@ -437,21 +460,12 @@ msgstr "Last ned mobilprogram"
|
|||
msgid "Get it on"
|
||||
msgstr "Til prosjektet"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Are you sure?"
|
||||
msgstr "er du sikker?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Rediger prosjekt"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Slett prosjekt"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Importer JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Velg fil"
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "Rediger prosjekt"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Last ned prosjektets data"
|
||||
|
@ -480,18 +494,28 @@ msgstr "Avbryt"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Personvernsinnstillinger"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Rediger prosjektet"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr "Dette vil fjerne alle regninger og deltagere i prosjektet!"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Importer tidligere eksportert JSON-fil"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Velg fil"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Rediger denne regningen"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Legg til en regning"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Alle"
|
||||
|
||||
|
@ -512,9 +536,6 @@ msgstr "Legg til deltager"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "ola@eksempel.no, kari@eksempel.no"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Send ut invitasjonene"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Last nd"
|
||||
|
||||
|
@ -591,37 +612,21 @@ msgstr "Regning %(name)s: La til %(owers_list_str)s på eierlisten"
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr "Regning %(name)s: fjernet %(owers_list_str)s fra eierlisten"
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Prosjektets historikk er avskrudd. Nye handlinger vil ikke"
|
||||
" vises nedenfor. Du kan skru på hisorikk på</i>\n"
|
||||
" <a href=\"%(url)s\">innstillingssiden</a>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "IP-adresseregistrering kan skrus på fra innstillingssiden"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Tabellen nedenfor viser handlinger registrert før "
|
||||
"prosjekthistorikken ble avskrudd. Du kan\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">tømme prosjekthistorikken</a> for å fjerne"
|
||||
" dem.</i></p>\n"
|
||||
" "
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Noen tømte antagelig prosjekthistorikken."
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
|
@ -634,12 +639,6 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Slett lagrede IP-adresser"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Ingen historikk å slette"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Tøm prosjekthistorikk"
|
||||
|
||||
#, fuzzy
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Ingen IP-adresser å slette"
|
||||
|
@ -648,6 +647,12 @@ msgstr "Ingen IP-adresser å slette"
|
|||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Slett lagrede IP-adresser"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Ingen historikk å slette"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Tøm prosjekthistorikk"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Tid"
|
||||
|
||||
|
@ -711,9 +716,15 @@ msgstr "Regningen %(name)s fikk sitt navn endret til %(new_description)s"
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr "Deltager %(name)s: vekting endret fra %(old_weight)s til %(new_weight)s"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Betaler"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Beløp"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Dato"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Beløp i %(currency)s"
|
||||
|
@ -818,6 +829,9 @@ msgstr "Historikk"
|
|||
msgid "Settings"
|
||||
msgstr "Innstillinger"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Other projects :"
|
||||
msgstr "Andre prosjekter:"
|
||||
|
@ -828,9 +842,9 @@ msgstr "bytt til"
|
|||
msgid "Dashboard"
|
||||
msgstr "Oversikt"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Logout"
|
||||
msgstr "Logg ut"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Kode"
|
||||
|
@ -841,7 +855,7 @@ msgstr "Mobilprogram"
|
|||
msgid "Documentation"
|
||||
msgstr "Dokumentasjon"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Administrasjonsoversiktspanel"
|
||||
|
||||
#, fuzzy
|
||||
|
@ -865,30 +879,21 @@ msgstr "er du sikker?"
|
|||
msgid "Invite people"
|
||||
msgstr "Inviter folk"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Du kan starte ved å legge til deltagere"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Legg til en ny regning"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Nyere regninger"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Eldre regninger"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Når?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Du kan starte ved å legge til deltagere"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Hvem betalte?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Legg til en ny regning"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "For hva?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Hvor meget?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Lagt til %(date)s"
|
||||
|
@ -897,6 +902,9 @@ msgstr "Lagt til %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Alle, unntagen %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "slett"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Ingen regninger"
|
||||
|
||||
|
@ -904,14 +912,13 @@ msgstr "Ingen regninger"
|
|||
msgid "Nothing to list yet."
|
||||
msgstr "Ingenting å liste opp enda."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Du ønsker antagelig å"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "legge til en regning"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "legge til deltagere"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Legg til deltager"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Passordpåminner"
|
||||
|
@ -935,26 +942,21 @@ msgstr "Tilbakestill passordet ditt"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Inviter folk til å ta del i dette prosjektet"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Del identifikator og kode"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Du kan dele prosjektidentifikatoren og den private koden slik det måtte "
|
||||
"passe deg."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identifikator:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Share the Link"
|
||||
msgstr "Del lenken"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr "Du kan dele denne lenken slik du ønsker"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Send via Emails"
|
||||
|
@ -962,15 +964,35 @@ msgstr "Send via e-poster"
|
|||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Angi en (kommainndelt) liste over e-postadresser du ønsker å varsle om\n"
|
||||
"opprettelsen av dette budsjetthåndteringsprosjektet, og de vil få en "
|
||||
"e-post om det."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Del identifikator og kode"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identifikator:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Privat kode"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Hvem betaler?"
|
||||
|
||||
|
@ -1227,3 +1249,93 @@ msgstr "Periode"
|
|||
|
||||
#~ msgid "Participants to notify"
|
||||
#~ msgstr "legge til deltagere"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importer"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Beløp betalt"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Regninger kan ikke være null"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "Prosjektidentifikatoren er %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "Ugyldig JSON"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "er du sikker?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Importer JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Prosjektets historikk er "
|
||||
#~ "avskrudd. Nye handlinger vil ikke vises"
|
||||
#~ " nedenfor. Du kan skru på hisorikk"
|
||||
#~ " på</i>\n"
|
||||
#~ " <a href=\"%(url)s\">innstillingssiden</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Tabellen nedenfor viser "
|
||||
#~ "handlinger registrert før prosjekthistorikken "
|
||||
#~ "ble avskrudd. Du kan\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">tømme prosjekthistorikken</a>"
|
||||
#~ " for å fjerne dem.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Send invitasjoner"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "vis"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Rediger prosjektet"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Du ønsker antagelig å"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "legge til deltagere"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Du kan dele prosjektidentifikatoren og "
|
||||
#~ "den private koden slik det måtte "
|
||||
#~ "passe deg."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Del lenken"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "Du kan dele denne lenken slik du ønsker"
|
||||
|
||||
|
|
Binary file not shown.
|
@ -1,20 +1,26 @@
|
|||
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2021-02-17 02:50+0000\n"
|
||||
"Last-Translator: Sander Kooijmans <weblate@gogognome.nl>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2024-03-17 12:01+0000\n"
|
||||
"Last-Translator: Xander Jennie <xanderjennie21@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/nl/>\n"
|
||||
"Language: nl\n"
|
||||
"Language-Team: Dutch <https://hosted.weblate.org/projects/i-hate-money/i"
|
||||
"-hate-money/nl/>\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 5.5-dev\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
"Je hebt zojuist het project '%(project)s' aangemaakt om je uitgaven te "
|
||||
"verdelen"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,12 +31,17 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Projectnaam"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Huidige Privécode"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "Voer het huidige privécode in om dit project te bewerken"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Privécode"
|
||||
msgstr "Nieuwe privécode"
|
||||
|
||||
msgid "Enter a new code if you want to change it"
|
||||
msgstr ""
|
||||
msgstr "Voer een nieuwe code in als u deze wilt wijzigen"
|
||||
|
||||
msgid "Email"
|
||||
msgstr "E-mailadres"
|
||||
|
@ -46,17 +57,24 @@ msgstr "Standaard munteenheid"
|
|||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
"Door een standaardvaluta in te stellen, is valutaconversie tussen facturen "
|
||||
"mogelijk"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Onbekende fout"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Ongeldige privécode."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"Dit project kan niet op 'geen valuta' worden gezet, omdat het facturen in "
|
||||
"meerdere valuta's bevat."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Eerder geëxporteerd JSON-bestand importeren"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importeren"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "Compatibel met mede besteden"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Project-id"
|
||||
|
@ -74,25 +92,16 @@ msgid ""
|
|||
msgstr "Er is al een project genaamd (\"%(project)s\"). Kies een andere naam"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr ""
|
||||
msgstr "Wat is een echte valuta: de euro of de petro-dollar?"
|
||||
|
||||
#, fuzzy
|
||||
msgid "euro"
|
||||
msgstr "Periode"
|
||||
msgstr "euro"
|
||||
|
||||
msgid "Please, validate the captcha to proceed."
|
||||
msgstr ""
|
||||
msgstr "Valideer de captcha om door te gaan."
|
||||
|
||||
msgid "Enter private code to confirm deletion"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Unknown error"
|
||||
msgstr "Onbekend project"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Invalid private code."
|
||||
msgstr "Privécode"
|
||||
msgstr "Voer de privécode in om de verwijder opdracht te bevestigen"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Inloggen"
|
||||
|
@ -116,19 +125,19 @@ msgid "Password confirmation"
|
|||
msgstr "Wachtwoord bevestigen"
|
||||
|
||||
msgid "Reset password"
|
||||
msgstr "Wachtwoord herstellen"
|
||||
msgstr "Wachtwoord opnieuw instellen"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
msgid "When?"
|
||||
msgstr "Wanneer?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Wat?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Betaler"
|
||||
msgid "Who paid?"
|
||||
msgstr "Wie heeft er betaald?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Betaald bedrag"
|
||||
msgid "How much?"
|
||||
msgstr "Hoeveel?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Munteenheid"
|
||||
|
@ -152,9 +161,6 @@ msgstr "Versturen en nieuwe toevoegen"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Projectstandaard: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Rekeningen mogen niet null zijn"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Naam"
|
||||
|
||||
|
@ -167,70 +173,76 @@ msgstr "Gewicht"
|
|||
msgid "Add"
|
||||
msgstr "Toevoegen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "The participant name is invalid"
|
||||
msgstr "De gebruiker '%(name)s' is verwijderd"
|
||||
msgstr "De naam van de deelnemer is ongeldig"
|
||||
|
||||
#, fuzzy
|
||||
msgid "This project already have this participant"
|
||||
msgstr "Deze deelnemer is al lid van het project"
|
||||
|
||||
msgid "People to notify"
|
||||
msgstr ""
|
||||
msgstr "Mensen om op de hoogte te stellen"
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Uitnodigingen versturen"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "Het e-mailadres '%(email)s' is onjuist"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Uitloggen"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr "Controleer de e-mailconfiguratie van de server."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Controleer de e-mailinstellingen van de server of neem contact op met de "
|
||||
"beheerder: %(admin_email)s"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
msgstr "{dual_object_0} en {dual_object_1}"
|
||||
|
||||
#. Last two items of a list with more than 3 items
|
||||
msgid "{previous_object}, and {end_object}"
|
||||
msgstr ""
|
||||
msgstr "{previous_object} en{end_object}"
|
||||
|
||||
#. Two items in a middle of a list with more than 5 objects
|
||||
msgid "{previous_object}, {next_object}"
|
||||
msgstr ""
|
||||
msgstr "{previous_object}, {next_object}"
|
||||
|
||||
#. First two items of a list with more than 3 items
|
||||
msgid "{start_object}, {next_object}"
|
||||
msgstr ""
|
||||
msgstr "{start_object}, {next_object}"
|
||||
|
||||
msgid "No Currency"
|
||||
msgstr "Geen munteenheid"
|
||||
msgstr "Geen valuta"
|
||||
|
||||
#. Form error with only one error
|
||||
msgid "{prefix}: {error}"
|
||||
msgstr ""
|
||||
msgstr "{prefix}: {error}"
|
||||
|
||||
#. Form error with a list of errors
|
||||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr ""
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgstr "Te vaak onjuist ingelogd. Probeer het later opnieuw."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Te veel mislukte inlogpogingen."
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
msgstr "Het admin-wachtwoord is onjuist. Je kunt het nog %(num)d keer proberen."
|
||||
|
||||
msgid "Provided token is invalid"
|
||||
msgstr ""
|
||||
msgstr "Het opgegeven token is ongeldig"
|
||||
|
||||
msgid "This private code is not the right one"
|
||||
msgstr "Deze privécode is onjuist"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr ""
|
||||
"Je hebt zojuist het project '%(project)s' aangemaakt om je uitgaven te "
|
||||
"verdelen"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Een herinneringsmail is zojuist naar u verzonden"
|
||||
|
||||
|
@ -241,18 +253,12 @@ msgstr ""
|
|||
"We hebben geprobeerd een herinneringsmail te versturen, maar er is iets "
|
||||
"fout gegaan. Je kunt het project nog steeds normaal gebruiken."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "Het project-id is %(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Sorry, er is iets fout gegaan bij het verzenden van een e-mail met "
|
||||
"instructies om je wachtwoord te herstellen. Controleer de "
|
||||
"e-mailinstellingen van de server of neem contact op met de beheerder."
|
||||
"instructies om je wachtwoord te herstellen."
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Geen toegangssleutel opgegeven"
|
||||
|
@ -266,23 +272,33 @@ msgstr "Onbekend project"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Wachtwoord is hersteld."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Project succesvol geüpload"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "Ongeldige JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr "Kan CSV niet parseren"
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "Ontbrekende attribute: %(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Project succesvol geüpload"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Project is verwijderd"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "Kan niet uitloggen"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Je bent uitgenodigd om je uitgaven te delen met %(project)s"
|
||||
|
@ -290,10 +306,8 @@ msgstr "Je bent uitgenodigd om je uitgaven te delen met %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Je uitnodigingen zijn verstuurd"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
#, fuzzy
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Sorry, er is iets fout gegaan bij het verzenden van de uitnodigingsmails."
|
||||
" Controleer de e-mailinstellingen van de server of neem contact op met de"
|
||||
|
@ -333,14 +347,18 @@ msgid "The bill has been added"
|
|||
msgstr "De rekening is toegevoegd"
|
||||
|
||||
msgid "Error deleting bill"
|
||||
msgstr ""
|
||||
msgstr "Fout bij verwijderen factuur"
|
||||
|
||||
msgid "The bill has been deleted"
|
||||
msgstr "De rekening is verwijderd"
|
||||
msgstr "De factuur is verwijderd"
|
||||
|
||||
msgid "The bill has been modified"
|
||||
msgstr "De rekening is aangepast"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Projectgeschiedenis inschakelen"
|
||||
|
@ -368,9 +386,8 @@ msgstr "Terug naar de lijst"
|
|||
msgid "Administration tasks are currently disabled."
|
||||
msgstr "Beheerderstaken zijn momenteel uitgeschakeld."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Authentication"
|
||||
msgstr "Documentatie"
|
||||
msgstr "Authenticatie"
|
||||
|
||||
msgid "The project you are trying to access do not exist, do you want to"
|
||||
msgstr "Het project dat je probeert te benaderen bestaat niet. Wil je"
|
||||
|
@ -387,18 +404,17 @@ msgstr "Nieuw project aanmaken"
|
|||
msgid "Project"
|
||||
msgstr "Project"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Number of participants"
|
||||
msgstr "deelnemers toevoegen"
|
||||
msgstr "Aantal deelnemers"
|
||||
|
||||
msgid "Number of bills"
|
||||
msgstr "Aantal rekeningen"
|
||||
msgstr "Aantal facturen"
|
||||
|
||||
msgid "Newest bill"
|
||||
msgstr "Nieuwste rekening"
|
||||
msgstr "Nieuwste factuur"
|
||||
|
||||
msgid "Oldest bill"
|
||||
msgstr "Oudste rekening"
|
||||
msgstr "Oudste factuur"
|
||||
|
||||
msgid "Actions"
|
||||
msgstr "Acties"
|
||||
|
@ -406,8 +422,8 @@ msgstr "Acties"
|
|||
msgid "edit"
|
||||
msgstr "bewerken"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "verwijderen"
|
||||
msgid "Delete project"
|
||||
msgstr "Project verwijderen"
|
||||
|
||||
msgid "show"
|
||||
msgstr "tonen"
|
||||
|
@ -415,30 +431,18 @@ msgstr "tonen"
|
|||
msgid "The Dashboard is currently deactivated."
|
||||
msgstr "De overzichtspagina is momenteel uitgeschakeld."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Download Mobile Application"
|
||||
msgstr "Mobiele app"
|
||||
msgstr "Mobiele applicatie downloaden"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Get it on"
|
||||
msgstr "Inloggen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Are you sure?"
|
||||
msgstr "weet je het zeker?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Project aanpassen"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Delete project"
|
||||
msgstr "Project aanpassen"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "JSON importeren"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Bestand kiezen"
|
||||
msgid "Import project"
|
||||
msgstr "Project importeren"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Projectgegevens downloaden"
|
||||
|
@ -466,18 +470,28 @@ msgstr "Annuleren"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Privacy-instellingen"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Project bewerken"
|
||||
msgid "Save changes"
|
||||
msgstr ""
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Eerder geëxporteerd JSON-bestand importeren"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Bestand kiezen"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Deze rekening bewerken"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Rekening toevoegen"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Iedereen"
|
||||
|
||||
|
@ -497,9 +511,6 @@ msgstr "Deelnemer toevoegen"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "jan.jansen@voorbeeld.nl, maria.magdalena@website.nl"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Uitnodigingen versturen"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Downloaden"
|
||||
|
||||
|
@ -571,31 +582,21 @@ msgstr ""
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Dit project heeft de geschiedenis uitgeschakeld. Nieuwe "
|
||||
"acties zullen niet hieronder verschijnen. Je kunt de geschiedenis "
|
||||
"aanzetten op de </i>\n"
|
||||
" <a href=\"%(url)s\">instellingen-pagina</a>\n"
|
||||
" "
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Iemand heeft waarschijnlijk de projectgeschiedenis verwijderd."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
"recording disabled. "
|
||||
|
@ -604,18 +605,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Geen geschiedenis om te wissen"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Verwijder Projectgeschiedenis"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Geen IP-adressen te verwijderen"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Verwijder opgeslagen IP-adressen"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Geen geschiedenis om te wissen"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Verwijder Projectgeschiedenis"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Tijd"
|
||||
|
||||
|
@ -677,9 +678,15 @@ msgstr ""
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Betaler"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Hoeveelheid"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Datum"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Hoeveelheid in %(currency)s"
|
||||
|
@ -782,6 +789,9 @@ msgstr "Geschiedenis"
|
|||
msgid "Settings"
|
||||
msgstr "Instellingen"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Overige projecten:"
|
||||
|
||||
|
@ -791,8 +801,9 @@ msgstr "overschakelen naar"
|
|||
msgid "Dashboard"
|
||||
msgstr "Overzicht"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Uitloggen"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Code"
|
||||
|
@ -803,7 +814,7 @@ msgstr "Mobiele app"
|
|||
msgid "Documentation"
|
||||
msgstr "Documentatie"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Administratie-overzicht"
|
||||
|
||||
#, fuzzy
|
||||
|
@ -826,30 +837,21 @@ msgstr "weet je het zeker?"
|
|||
msgid "Invite people"
|
||||
msgstr "Anderen uitnodigen"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Begin met het toevoegen van deelnemers"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Nieuwe rekening toevoegen"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Wanneer?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Begin met het toevoegen van deelnemers"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Wie heeft er betaald?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Nieuwe rekening toevoegen"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Voor wat?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Hoeveel?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Toegevoegd op %(date)s"
|
||||
|
@ -858,20 +860,22 @@ msgstr "Toegevoegd op %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Iedereen, behalve %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "verwijderen"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Geen rekeningen"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Nog niks."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Waarschijnlijk wil je"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "een rekening toevoegen"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "deelnemers toevoegen"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Deelnemer toevoegen"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Wachtwoordhint"
|
||||
|
@ -895,39 +899,56 @@ msgstr "Wachtwoord herstellen"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Nodig mensen uit voor dit project"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Identificatie en code delen"
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Je kunt de projectidentificatie en privécode delen via welk "
|
||||
"communicatieplatform dan ook."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identificatie:"
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Link delen"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr "Je kunt de volgende link direct delen"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Versturen via e-mail"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Stel een (kommagescheiden) lijst op met e-mailadressen van personen die "
|
||||
"je op de\n"
|
||||
" hoogte wilt stellen van dit project - wij sturen hen een "
|
||||
"e-mail."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Identificatie en code delen"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identificatie:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Privécode"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Wie betaalt?"
|
||||
|
||||
|
@ -1049,3 +1070,84 @@ msgstr "Periode"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "Te melden personen"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importeren"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Betaald bedrag"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Rekeningen mogen niet null zijn"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "Het project-id is %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "Ongeldige JSON"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "weet je het zeker?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "JSON importeren"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Dit project heeft de "
|
||||
#~ "geschiedenis uitgeschakeld. Nieuwe acties "
|
||||
#~ "zullen niet hieronder verschijnen. Je "
|
||||
#~ "kunt de geschiedenis aanzetten op de "
|
||||
#~ "</i>\n"
|
||||
#~ " <a href=\"%(url)s\">instellingen-pagina</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Uitnodigingen versturen"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "tonen"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Project bewerken"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Waarschijnlijk wil je"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "deelnemers toevoegen"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Je kunt de projectidentificatie en "
|
||||
#~ "privécode delen via welk communicatieplatform"
|
||||
#~ " dan ook."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Link delen"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr "Je kunt de volgende link direct delen"
|
||||
|
|
932
ihatemoney/translations/oc/LC_MESSAGES/messages.po
Normal file
932
ihatemoney/translations/oc/LC_MESSAGES/messages.po
Normal file
|
@ -0,0 +1,932 @@
|
|||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-06-15 16:06+0200\n"
|
||||
"PO-Revision-Date: 2024-07-03 19:09+0000\n"
|
||||
"Last-Translator: Quentin PAGÈS <quentinantonin@free.fr>\n"
|
||||
"Language-Team: Occitan <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/oc/>\n"
|
||||
"Language: oc\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 5.7-dev\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Venètz de crear « %(project)s » per despartir vòstras despensas"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
msgstr ""
|
||||
"Quantitat o expression non valida. Sonque los nombre e operator +-*/ son "
|
||||
"acceptats."
|
||||
|
||||
msgid "Project name"
|
||||
msgstr "Nom del projècte"
|
||||
|
||||
msgid "Current private code"
|
||||
msgstr "Còdi d’accès actual"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "Picatz lo còdi d’accès existissent per editar lo projècte"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Còdi privat novèl"
|
||||
|
||||
msgid "Enter a new code if you want to change it"
|
||||
msgstr "Picatz lo còdi novèl se lo volètz cambiar"
|
||||
|
||||
msgid "Email"
|
||||
msgstr "Adreça electronica"
|
||||
|
||||
msgid "Enable project history"
|
||||
msgstr "Activar l’istoric de projècte"
|
||||
|
||||
msgid "Use IP tracking for project history"
|
||||
msgstr "Reculhir las adreças IP dins l’istoric de projècte"
|
||||
|
||||
msgid "Default Currency"
|
||||
msgstr "Moneda predeterminada"
|
||||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Error desconeguda"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Còdi d’accès invalid."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "Compatible amb Cospend"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Identificant del projècte"
|
||||
|
||||
msgid "Private code"
|
||||
msgstr "Còdi privat"
|
||||
|
||||
msgid "Create the project"
|
||||
msgstr "Crear lo projècte"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"A project with this identifier (\"%(project)s\") already exists. Please "
|
||||
"choose a new identifier"
|
||||
msgstr ""
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr ""
|
||||
|
||||
msgid "euro"
|
||||
msgstr "èuro"
|
||||
|
||||
msgid "Please, validate the captcha to proceed."
|
||||
msgstr "Se vos plai, validatz el captcha per contunhar."
|
||||
|
||||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Picatz lo còdi d’accès per confirmar la supression"
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Dintrar"
|
||||
|
||||
msgid "Admin password"
|
||||
msgstr "Senhal d’administracion"
|
||||
|
||||
msgid "Send me the code by email"
|
||||
msgstr "Mandatz-me lo còdi per corrièl"
|
||||
|
||||
msgid "This project does not exists"
|
||||
msgstr "Aqueste projècte existís pas"
|
||||
|
||||
msgid "Password mismatch"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password"
|
||||
msgstr "Senhal"
|
||||
|
||||
msgid "Password confirmation"
|
||||
msgstr "Confirmacion del senhla"
|
||||
|
||||
msgid "Reset password"
|
||||
msgstr "Reïnicializar lo senhal"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Quand ?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Qué ?"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Qual paguèt ?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Quant ?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Moneda"
|
||||
|
||||
msgid "External link"
|
||||
msgstr "Ligam extèrne"
|
||||
|
||||
msgid "A link to an external document, related to this bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For whom?"
|
||||
msgstr "Per qual ?"
|
||||
|
||||
msgid "Submit"
|
||||
msgstr "Enviar"
|
||||
|
||||
msgid "Submit and add a new one"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Project default: %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
msgid "Weights should be positive"
|
||||
msgstr ""
|
||||
|
||||
msgid "Weight"
|
||||
msgstr "Pes"
|
||||
|
||||
msgid "Add"
|
||||
msgstr "Apondre"
|
||||
|
||||
msgid "The participant name is invalid"
|
||||
msgstr "Lo nom del participant es incorrècte"
|
||||
|
||||
msgid "This project already have this participant"
|
||||
msgstr "Aqueste projècte a ja aqueste participant"
|
||||
|
||||
msgid "People to notify"
|
||||
msgstr "Personas de convidar"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Enviar las invitacions"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr ""
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Desconnexion"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr ""
|
||||
|
||||
#. Last two items of a list with more than 3 items
|
||||
msgid "{previous_object}, and {end_object}"
|
||||
msgstr ""
|
||||
|
||||
#. Two items in a middle of a list with more than 5 objects
|
||||
msgid "{previous_object}, {next_object}"
|
||||
msgstr "{previous_object}, {next_object}"
|
||||
|
||||
#. First two items of a list with more than 3 items
|
||||
msgid "{start_object}, {next_object}"
|
||||
msgstr "{start_object}, {next_object}"
|
||||
|
||||
msgid "No Currency"
|
||||
msgstr "Cap de moneda"
|
||||
|
||||
#. Form error with only one error
|
||||
msgid "{prefix}: {error}"
|
||||
msgstr "{prefix} : {error}"
|
||||
|
||||
#. Form error with a list of errors
|
||||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix} :<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
msgstr ""
|
||||
|
||||
msgid "Provided token is invalid"
|
||||
msgstr "Aqueste geton es invalid"
|
||||
|
||||
msgid "This private code is not the right one"
|
||||
msgstr ""
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"We tried to send you an reminder email, but there was an error. You can "
|
||||
"still use the project normally."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions."
|
||||
msgstr ""
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invalid token"
|
||||
msgstr "Geton invalid"
|
||||
|
||||
msgid "Unknown project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password successfully reset."
|
||||
msgstr ""
|
||||
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "Atribut mancant : %(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Your invitations have been sent"
|
||||
msgstr ""
|
||||
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error activating participant"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(name)s is part of this project again"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error removing participant"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Participant '%(name)s' has been deactivated. It will still appear in the "
|
||||
"list until its balance reach zero."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant '%(name)s' has been removed"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant '%(name)s' has been modified"
|
||||
msgstr ""
|
||||
|
||||
msgid "The bill has been added"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "The bill has been deleted"
|
||||
msgstr ""
|
||||
|
||||
msgid "The bill has been modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr ""
|
||||
|
||||
msgid "Deleted project history."
|
||||
msgstr ""
|
||||
|
||||
msgid "Error deleting recorded IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "Deleted recorded IP addresses in project history."
|
||||
msgstr ""
|
||||
|
||||
msgid "Sorry, we were unable to find the page you've asked for."
|
||||
msgstr ""
|
||||
|
||||
msgid "The best thing to do is probably to get back to the main page."
|
||||
msgstr ""
|
||||
|
||||
msgid "Back to the list"
|
||||
msgstr ""
|
||||
|
||||
msgid "Administration tasks are currently disabled."
|
||||
msgstr ""
|
||||
|
||||
msgid "Authentication"
|
||||
msgstr ""
|
||||
|
||||
msgid "The project you are trying to access do not exist, do you want to"
|
||||
msgstr ""
|
||||
|
||||
msgid "create it"
|
||||
msgstr ""
|
||||
|
||||
msgid "?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Create a new project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project"
|
||||
msgstr "Projècte"
|
||||
|
||||
msgid "Number of participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Number of bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Newest bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Oldest bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Actions"
|
||||
msgstr ""
|
||||
|
||||
msgid "edit"
|
||||
msgstr "modifica"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr ""
|
||||
|
||||
msgid "show"
|
||||
msgstr "mostrar"
|
||||
|
||||
msgid "The Dashboard is currently deactivated."
|
||||
msgstr ""
|
||||
|
||||
msgid "Download Mobile Application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Get it on"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr ""
|
||||
|
||||
msgid "Bill items"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download the list of bills with owner, amount, reason,... "
|
||||
msgstr ""
|
||||
|
||||
msgid "Settle plans"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download the list of transactions needed to settle the current bills."
|
||||
msgstr ""
|
||||
|
||||
msgid "Can't remember the password?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Cancel"
|
||||
msgstr "Anullar"
|
||||
|
||||
msgid "Privacy Settings"
|
||||
msgstr "Paramètres de confidencialitat"
|
||||
|
||||
msgid "Save changes"
|
||||
msgstr "Enregistrar las modificacions"
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr ""
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Tot lo monde"
|
||||
|
||||
msgid "No one"
|
||||
msgstr "Degun"
|
||||
|
||||
msgid "More options"
|
||||
msgstr "Mai d'opcions"
|
||||
|
||||
msgid "Add participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Edit this participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr ""
|
||||
|
||||
msgid "Download"
|
||||
msgstr ""
|
||||
|
||||
msgid "Disabled Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Disabled Project History & IP Address Recording"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enabled Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Disabled IP Address Recording"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enabled Project History & IP Address Recording"
|
||||
msgstr ""
|
||||
|
||||
msgid "Enabled IP Address Recording"
|
||||
msgstr ""
|
||||
|
||||
msgid "History Settings Changed"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed from %(before)s to %(after)s"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed to %(after)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Confirm Remove IP Adresses"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Are you sure you want to delete all recorded IP addresses from this "
|
||||
"project?\n"
|
||||
" The rest of the project history will be unaffected. This "
|
||||
"action cannot be undone."
|
||||
msgstr ""
|
||||
|
||||
msgid "Confirm deletion"
|
||||
msgstr "Confirmar la supression"
|
||||
|
||||
msgid "Close"
|
||||
msgstr "Tampar"
|
||||
|
||||
msgid "Delete Confirmation"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Are you sure you want to erase all history for this project? This action "
|
||||
"cannot be undone."
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: added %(owers_list_str)s to owers list"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr ""
|
||||
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
"recording disabled. "
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete stored IP addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr ""
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr ""
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Time"
|
||||
msgstr ""
|
||||
|
||||
msgid "Event"
|
||||
msgstr ""
|
||||
|
||||
msgid "IP address recording can be enabled on the settings page"
|
||||
msgstr ""
|
||||
|
||||
msgid "IP address recording can be disabled on the settings page"
|
||||
msgstr ""
|
||||
|
||||
msgid "From IP"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Project %(name)s added"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s added"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s added"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project private code changed"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Project renamed to %(new_project_name)s"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Project contact email changed to %(new_email)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Project settings modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s deactivated"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s reactivated"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s renamed to %(new_name)s"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s renamed to %(new_description)s"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pagaire"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Soma"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s modified"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s removed"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s removed"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Project %(name)s changed in an unknown way"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s changed in an unknown way"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Participant %(name)s changed in an unknown way"
|
||||
msgstr ""
|
||||
|
||||
msgid "Nothing to list"
|
||||
msgstr "Pas res a listar"
|
||||
|
||||
msgid "Someone probably cleared the project history."
|
||||
msgstr ""
|
||||
|
||||
msgid "Manage your shared <br />expenses, easily"
|
||||
msgstr ""
|
||||
|
||||
msgid "Try out the demo"
|
||||
msgstr ""
|
||||
|
||||
msgid "You're sharing a house?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Going on holidays with friends?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Simply sharing money with others?"
|
||||
msgstr ""
|
||||
|
||||
msgid "We can help!"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log in to an existing project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Log in"
|
||||
msgstr "Connexion"
|
||||
|
||||
msgid "can't remember your password?"
|
||||
msgstr ""
|
||||
|
||||
msgid "Create"
|
||||
msgstr "Crear"
|
||||
|
||||
msgid ""
|
||||
"Don\\'t reuse a personal password. Choose a private code and send it to "
|
||||
"your friends"
|
||||
msgstr ""
|
||||
|
||||
msgid "Account manager"
|
||||
msgstr "Gestionari de compte"
|
||||
|
||||
msgid "Bills"
|
||||
msgstr "Facturas"
|
||||
|
||||
msgid "Settle"
|
||||
msgstr ""
|
||||
|
||||
msgid "Statistics"
|
||||
msgstr "Estatisticas"
|
||||
|
||||
msgid "Languages"
|
||||
msgstr "Lengas"
|
||||
|
||||
msgid "Projects"
|
||||
msgstr "Projèctes"
|
||||
|
||||
msgid "Start a new project"
|
||||
msgstr ""
|
||||
|
||||
msgid "History"
|
||||
msgstr ""
|
||||
|
||||
msgid "Settings"
|
||||
msgstr ""
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr ""
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr ""
|
||||
|
||||
msgid "switch to"
|
||||
msgstr ""
|
||||
|
||||
msgid "Dashboard"
|
||||
msgstr "Panèl d’administracion"
|
||||
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr ""
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Còdi"
|
||||
|
||||
msgid "Mobile Application"
|
||||
msgstr ""
|
||||
|
||||
msgid "Documentation"
|
||||
msgstr "Documentacion"
|
||||
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Panèl d’administracion"
|
||||
|
||||
msgid "Legal information"
|
||||
msgstr ""
|
||||
|
||||
msgid "\"I hate money\" is free software"
|
||||
msgstr ""
|
||||
|
||||
msgid "you can contribute and improve it!"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "%(amount)s each"
|
||||
msgstr "%(amount)s cadun"
|
||||
|
||||
msgid "you sure?"
|
||||
msgstr "O volètz vertadièrament ?"
|
||||
|
||||
msgid "Invite people"
|
||||
msgstr "Convidar de monde"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr ""
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Per qué ?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr ""
|
||||
|
||||
#, python-format
|
||||
msgid "Everyone but %(excluded)s"
|
||||
msgstr ""
|
||||
|
||||
msgid "delete"
|
||||
msgstr "suprimir"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Cap de factura"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Pas res a listar pel moment."
|
||||
|
||||
msgid "Add your first bill"
|
||||
msgstr ""
|
||||
|
||||
msgid "Add the first participant"
|
||||
msgstr ""
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"A link to reset your password has been sent to you, please check your "
|
||||
"emails."
|
||||
msgstr ""
|
||||
|
||||
msgid "Return to home page"
|
||||
msgstr ""
|
||||
|
||||
msgid "Your projects"
|
||||
msgstr ""
|
||||
|
||||
msgid "Reset your password"
|
||||
msgstr ""
|
||||
|
||||
msgid "Invite people to join this project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Share an invitation link"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Scan QR code"
|
||||
msgstr ""
|
||||
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr ""
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr ""
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr ""
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr "Còdi privat :"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr ""
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Qual paga ?"
|
||||
|
||||
msgid "To whom?"
|
||||
msgstr "A qual ?"
|
||||
|
||||
msgid "Who?"
|
||||
msgstr "Qual ?"
|
||||
|
||||
msgid "Balance"
|
||||
msgstr ""
|
||||
|
||||
msgid "deactivate"
|
||||
msgstr ""
|
||||
|
||||
msgid "reactivate"
|
||||
msgstr ""
|
||||
|
||||
msgid "Paid"
|
||||
msgstr "Pagat"
|
||||
|
||||
msgid "Spent"
|
||||
msgstr "Despensat"
|
||||
|
||||
msgid "Expenses by Month"
|
||||
msgstr "Despensas per mes"
|
||||
|
||||
msgid "Period"
|
||||
msgstr "Periòde"
|
Binary file not shown.
|
@ -2,9 +2,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2022-09-27 14:19+0000\n"
|
||||
"Last-Translator: Andrzej Ochodek <andrzej.ochodek@gmail.com>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2023-08-24 18:48+0000\n"
|
||||
"Last-Translator: Eryk Michalak <gnu.ewm@protonmail.com>\n"
|
||||
"Language-Team: Polish <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/pl/>\n"
|
||||
"Language: pl\n"
|
||||
|
@ -13,9 +13,13 @@ msgstr ""
|
|||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.14.1\n"
|
||||
"X-Generator: Weblate 5.0\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Właśnie utworzyłeś „%(project)s”, aby podzielić się wydatkami"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -26,6 +30,12 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Nazwa projektu"
|
||||
|
||||
msgid "Current private code"
|
||||
msgstr "Bieżący kod prywatny"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "Wprowadź kod prywatny aby edytować projekt"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Nowy kod prywatny"
|
||||
|
||||
|
@ -46,20 +56,24 @@ msgstr "Domyślna waluta"
|
|||
|
||||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr ""
|
||||
"Wybranie domyślnej waluty pozwala na konwersję walutową pomiędzy rachunkami"
|
||||
"Wybranie domyślnej waluty pozwala na konwersję walutową pomiędzy "
|
||||
"rachunkami"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Nieznany błąd"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Nieprawidłowy kod prywatny."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"Ten projekt nie może zostać oznaczony jako 'bez waluty', ponieważ zawiera on "
|
||||
"rachunki w różnych walutach."
|
||||
"Ten projekt nie może zostać oznaczony jako 'bez waluty', ponieważ zawiera"
|
||||
" on rachunki w różnych walutach."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Zaimportuj wcześniej wyeksportowany plik JSON"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importuj"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "Zgodne z Cospend"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Identyfikator projektu"
|
||||
|
@ -75,8 +89,8 @@ msgid ""
|
|||
"A project with this identifier (\"%(project)s\") already exists. Please "
|
||||
"choose a new identifier"
|
||||
msgstr ""
|
||||
"Projekt o tym identyfikatorze (\"%(project)s\") już istnieje. Wybierz nowy "
|
||||
"identyfikator"
|
||||
"Projekt o tym identyfikatorze (\"%(project)s\") już istnieje. Wybierz "
|
||||
"nowy identyfikator"
|
||||
|
||||
msgid "Which is a real currency: Euro or Petro dollar?"
|
||||
msgstr "Która waluta jest prawdziwa: euro czy petrodolar?"
|
||||
|
@ -90,12 +104,6 @@ msgstr "Rozwiąż captcha, by kontynuować."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Wprowadź kod prywatny w celu potwierdzenia usunięcia"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Nieznany błąd"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Nieprawidłowy kod prywatny."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Wejdź"
|
||||
|
||||
|
@ -120,17 +128,17 @@ msgstr "Potwierdzenie hasła"
|
|||
msgid "Reset password"
|
||||
msgstr "Zmień hasło"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
msgid "When?"
|
||||
msgstr "Kiedy?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "Co?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Płatnik"
|
||||
msgid "Who paid?"
|
||||
msgstr "Kto zapłacił?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Zapłacona kwota"
|
||||
msgid "How much?"
|
||||
msgstr "Jak dużo?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Waluta"
|
||||
|
@ -154,9 +162,6 @@ msgstr "Zatwierdź i dodaj nowy"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Wartość domyślna projektu: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Rachunki nie mogą być zerowe"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nazwa"
|
||||
|
||||
|
@ -178,13 +183,27 @@ msgstr "Ten projekt ma już tego członka"
|
|||
msgid "People to notify"
|
||||
msgstr "Osoby do powiadomienia"
|
||||
|
||||
msgid "Send invites"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Wyślij zaproszenia"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "Ten email %(email)s jest nieprawidłowy"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Wyloguj"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr "Prosimy sprawdzić konfigurację e-mail serwera."
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Prosimy sprawdzić konfigurację e-mail serwera lub skontaktować się z "
|
||||
"administratorem: %(admin_email)s"
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} i {dual_object_1}"
|
||||
|
@ -212,8 +231,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
msgstr "Zbyt wiele nieudanych prób logowania, spróbuj ponownie później."
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Zbyt wiele nieudanych prób logowania."
|
||||
|
||||
#, python-format
|
||||
msgid "This admin password is not the right one. Only %(num)d attempts left."
|
||||
|
@ -225,10 +244,6 @@ msgstr "Podany token jest niepoprawny"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Ten prywatny kod jest niewłaściwy"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Właśnie utworzyłeś „%(project)s”, aby podzielić się wydatkami"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Wiadomość e-mail z przypomnieniem została właśnie wysłana"
|
||||
|
||||
|
@ -239,18 +254,12 @@ msgstr ""
|
|||
"Próbowaliśmy wysłać Ci wiadomość e-mail z przypomnieniem, ale wystąpił "
|
||||
"błąd. Nadal możesz normalnie korzystać z projektu."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "Identyfikator projektu to %(project)s"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Przepraszamy, wystąpił błąd podczas wysyłania wiadomości e-mail z "
|
||||
"instrukcjami resetowania hasła. Sprawdź konfigurację e-mail serwera lub "
|
||||
"skontaktuj się z administratorem."
|
||||
"instrukcjami resetowania hasła."
|
||||
|
||||
msgid "No token provided"
|
||||
msgstr "Nie podano tokena"
|
||||
|
@ -264,17 +273,25 @@ msgstr "Nieznany projekt"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Hasło zostało pomyślnie zresetowane."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projekt został pomyślnie przesłany"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr "Ustawienia projektu zostały pomyślnie zmienione."
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "Niepoprawny JSON"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr "Nie udało się odczytać pliku CSV"
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "Brakujący atrybut: %(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
"currency"
|
||||
msgstr ""
|
||||
"Nie można dodawać rachunków w wielu walutach do projektu bez waluty domyślnej"
|
||||
"Nie można dodawać rachunków w wielu walutach do projektu bez waluty "
|
||||
"domyślnej"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projekt został pomyślnie przesłany"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Projekt został pomyślnie usunięty"
|
||||
|
@ -282,6 +299,9 @@ msgstr "Projekt został pomyślnie usunięty"
|
|||
msgid "Error deleting project"
|
||||
msgstr "Błąd podczas usuwania projektu"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "Nie można się wylogować"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Zostałeś zaproszony do podzielenia się swoimi wydatkami w %(project)s"
|
||||
|
@ -289,14 +309,10 @@ msgstr "Zostałeś zaproszony do podzielenia się swoimi wydatkami w %(project)s
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Twoje zaproszenia zostały wysłane"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Przepraszamy, wystąpił błąd podczas próby wysłania wiadomości e-mail z "
|
||||
"zaproszeniem. Sprawdź konfigurację e-mail serwera lub skontaktuj się z "
|
||||
"administratorem."
|
||||
"zaproszeniem."
|
||||
|
||||
#, python-format
|
||||
msgid "%(member)s has been added"
|
||||
|
@ -317,8 +333,8 @@ msgid ""
|
|||
"Participant '%(name)s' has been deactivated. It will still appear in the "
|
||||
"list until its balance reach zero."
|
||||
msgstr ""
|
||||
"Uczestnik „%(name)s” został wyłączony. Będzie nadal pojawiać się na liście "
|
||||
"użytkowników, dopóki jego saldo nie wyniesie zero."
|
||||
"Uczestnik „%(name)s” został wyłączony. Będzie nadal pojawiać się na "
|
||||
"liście użytkowników, dopóki jego saldo nie wyniesie zero."
|
||||
|
||||
#, python-format
|
||||
msgid "Participant '%(name)s' has been removed"
|
||||
|
@ -340,6 +356,10 @@ msgstr "Rachunek został usunięty"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "Rachunek został zmieniony"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr "%(lang)s nie jest obsługowanym językiem"
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Błąd podczas usuwania historii projektu"
|
||||
|
||||
|
@ -402,8 +422,8 @@ msgstr "Akcje"
|
|||
msgid "edit"
|
||||
msgstr "edytuj"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "usuń"
|
||||
msgid "Delete project"
|
||||
msgstr "Usuń projekt"
|
||||
|
||||
msgid "show"
|
||||
msgstr "pokaż"
|
||||
|
@ -417,20 +437,11 @@ msgstr "Pobierz aplikację mobilną"
|
|||
msgid "Get it on"
|
||||
msgstr "Pobierz na"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "Czy jesteś pewien?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Edytuj projekt"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Usuń projekt"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Importuj JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Wybierz plik"
|
||||
msgid "Import project"
|
||||
msgstr "Importuj projekt"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Pobierz dane projektu"
|
||||
|
@ -456,12 +467,17 @@ msgstr "Anuluj"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Ustawienia prywatności"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Edytuj projekt"
|
||||
msgid "Save changes"
|
||||
msgstr "Zapisz zmiany"
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr ""
|
||||
"Spowoduje to usunięcie wszystkich rachunków i uczestników tego projektu!"
|
||||
msgstr "Spowoduje to usunięcie wszystkich rachunków i uczestników tego projektu!"
|
||||
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Zaimportuj wcześniej wyeksportowany projekt"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Wybierz plik"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Edytuj ten rachunek"
|
||||
|
@ -469,6 +485,9 @@ msgstr "Edytuj ten rachunek"
|
|||
msgid "Add a bill"
|
||||
msgstr "Dodaj rachunek"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr "Dozwolone są proste operacje, np. (18+36.2)/3"
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Wszyscy"
|
||||
|
||||
|
@ -487,9 +506,6 @@ msgstr "Edytuj tego uczestnika"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "jan.kowalski@przykład.com, anna.nowak@strona.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Wyślij zaproszenia"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Pobierz"
|
||||
|
||||
|
@ -516,8 +532,7 @@ msgstr "Ustawienia historii zmienione"
|
|||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed from %(before)s to %(after)s"
|
||||
msgstr ""
|
||||
"Rachunek %(name)s: %(property_name)s zmieniono z %(before)s na %(after)s"
|
||||
msgstr "Rachunek %(name)s: %(property_name)s zmieniono z %(before)s na %(after)s"
|
||||
|
||||
#, python-format
|
||||
msgid "Bill %(name)s: %(property_name)s changed to %(after)s"
|
||||
|
@ -561,36 +576,22 @@ msgstr "Bill %(name)s: dodano %(owers_list_str)s do listy właścicieli"
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr "Bill %(name)s: usunięto %(owers_list_str)s z listy właścicieli"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Historia tego projektu została wyłączona. Nowe działania "
|
||||
"nie pojawią się poniżej. Możesz włączyć historię w</i>\n"
|
||||
" <a href=\"%(url)s\">ustawieniach</a>\n"
|
||||
" "
|
||||
"Ten projekt ma wyłączoną historię. Nowe działania nie pojawią się poniżej."
|
||||
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "Możliwe jest włączenie historii na stronie ustawień."
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Poniższa tabela przedstawia działania zarejestrowane przed"
|
||||
" wyłączeniem historii projektu. Możesz\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">wyczyścić historię projektu</a>, aby je "
|
||||
"usunąć.</i></p>\n"
|
||||
" "
|
||||
"Poniższa tabela przedstawia działania zarejestrowane przed wyłączeniem "
|
||||
"historii projektu."
|
||||
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Możesz wyczyścić historię projektu aby ją usunąć."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -602,18 +603,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Usuń przechowywane adresy IP"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Brak historii do usunięcia"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Wyczyść historię projektu"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Brak adresów IP do usunięcia"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Usuń przechowywane adresy IP"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Brak historii do usunięcia"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Wyczyść historię projektu"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Czas"
|
||||
|
||||
|
@ -650,8 +651,7 @@ msgstr "Nazwa projektu zmieniona na %(new_project_name)s"
|
|||
|
||||
#, python-format
|
||||
msgid "Project contact email changed to %(new_email)s"
|
||||
msgstr ""
|
||||
"Adres e-mail osoby kontaktowej projektu został zmieniony na %(new_email)s"
|
||||
msgstr "Adres e-mail osoby kontaktowej projektu został zmieniony na %(new_email)s"
|
||||
|
||||
msgid "Project settings modified"
|
||||
msgstr "Zmieniono ustawienia projektu"
|
||||
|
@ -676,9 +676,15 @@ msgstr "Rachunek %(name)s zmienił nazwę na %(new_description)s"
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr "Uczestnik %(name)s: zmiana wagi z %(old_weight)s na %(new_weight)s"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Płatnik"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Ilość"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Ilość w %(currency)s"
|
||||
|
@ -781,6 +787,9 @@ msgstr "Historia"
|
|||
msgid "Settings"
|
||||
msgstr "Ustawienia"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr "Kanał RSS"
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Inne projekty:"
|
||||
|
||||
|
@ -790,8 +799,9 @@ msgstr "przełącz na"
|
|||
msgid "Dashboard"
|
||||
msgstr "Kokpit"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Wyloguj"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr "Prosimy spróbować ponownie po %(date)s."
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Kod"
|
||||
|
@ -802,7 +812,7 @@ msgstr "Aplikacja mobilna"
|
|||
msgid "Documentation"
|
||||
msgstr "Dokumentacja"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Kokpit administracyjny"
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -824,30 +834,21 @@ msgstr "jesteś pewny?"
|
|||
msgid "Invite people"
|
||||
msgstr "Zaproś ludzi"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Powinieneś zacząć od dodania uczestników"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Dodaj nowy rachunek"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Nowsze rachunki"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Starsze rachunki"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Kiedy?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Powinieneś zacząć od dodania uczestników"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Kto zapłacił?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Dodaj nowy rachunek"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Za co?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Jak dużo?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Dodano %(date)s"
|
||||
|
@ -856,20 +857,20 @@ msgstr "Dodano %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Wszyscy poza %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "usuń"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Brak rachunków"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Nie ma jeszcze żadnej listy."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Prawdopodobnie chcesz"
|
||||
msgid "Add your first bill"
|
||||
msgstr "Dodaj swój pierwszy rachunek"
|
||||
|
||||
msgid "add a bill"
|
||||
msgstr "dodać rachunek"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "dodać członków"
|
||||
msgid "Add the first participant"
|
||||
msgstr "Dodaj pierwszego uczestnika"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Przypomnienie hasła"
|
||||
|
@ -893,40 +894,61 @@ msgstr "Zresetuj swoje hasło"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Zaproś ludzi do dołączenia do tego projektu"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Udostępnij identyfikator i kod"
|
||||
msgid "Share an invitation link"
|
||||
msgstr "Udostępnij link z zaproszeniem"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Identyfikator projektu i kod prywatny można udostępniać dowolnymi "
|
||||
"środkami komunikacji."
|
||||
"Najłatwiejszym sposobem zapraszania nowych osób jest podanie im poniższego "
|
||||
"linku ze zaproszeniem.<br />Osoby te będą mogły uzyskać dostęp do projektu, "
|
||||
"zarządzać uczestnikami, dodawać/edytować/usuwać rachunki. Nie będą jednak "
|
||||
"mieli dostępu do ważnych ustawień, takich jak zmiana kodu prywatnego lub "
|
||||
"usunięcie całego projektu."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identyfikator:"
|
||||
msgid "Scan QR code"
|
||||
msgstr "Skanuj kod QR"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Udostępnij link"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr ""
|
||||
"Możesz bezpośrednio udostępnić poniższy link za pośrednictwem "
|
||||
"preferowanego medium"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr "Użyj urządzenia mobilnego ze zgodną aplikacją."
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Wyślij przez maile"
|
||||
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Podaj (adresy rozdzielone przecinkami) adresy email, które chcesz "
|
||||
"powiadomić o \n"
|
||||
" utworzeniu tego projektu zarządzania budżetem, a my "
|
||||
"wyślemy Ci wiadomość email."
|
||||
"Podaj listę adresów e-mail (oddzielonych przecinkami) osób, które chcesz "
|
||||
"powiadomić o utworzeniu tego projektu. Wyślemy im wiadomość e-mail z linkiem "
|
||||
"zaproszającym."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Udostępnij identyfikator i kod"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
"Identyfikator projektu i kod prywatny można udostępniać za pomocą dowolnych "
|
||||
"środków komunikacji.<br />Każda osoba posiadająca kod prywatny będzie miała "
|
||||
"dostęp do całego projektu, w tym do zmiany ustawień, takich jak kod prywatny "
|
||||
"lub adres e-mail projektu, a nawet do usunięcia całego projektu."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identyfikator:"
|
||||
|
||||
msgid "Private code:"
|
||||
msgstr "Kod prywatny:"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr "kod prywatny został zdefiniowany podczas tworzenia projektu"
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Kto płaci?"
|
||||
|
@ -1043,3 +1065,94 @@ msgstr "Okres"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "Osoby do powiadomienia"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importuj"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Zapłacona kwota"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Rachunki nie mogą być zerowe"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "Identyfikator projektu to %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "Niepoprawny JSON"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "Czy jesteś pewien?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Importuj JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Historia tego projektu została"
|
||||
#~ " wyłączona. Nowe działania nie pojawią "
|
||||
#~ "się poniżej. Możesz włączyć historię "
|
||||
#~ "w</i>\n"
|
||||
#~ " <a href=\"%(url)s\">ustawieniach</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Poniższa tabela przedstawia "
|
||||
#~ "działania zarejestrowane przed wyłączeniem "
|
||||
#~ "historii projektu. Możesz\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">wyczyścić historię "
|
||||
#~ "projektu</a>, aby je usunąć.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Wyślij zaproszenia"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "pokaż"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Edytuj projekt"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Prawdopodobnie chcesz"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "dodać członków"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Identyfikator projektu i kod prywatny "
|
||||
#~ "można udostępniać dowolnymi środkami "
|
||||
#~ "komunikacji."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Udostępnij link"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
#~ "Możesz bezpośrednio udostępnić poniższy link"
|
||||
#~ " za pośrednictwem preferowanego medium"
|
||||
|
|
Binary file not shown.
|
@ -2,9 +2,9 @@ msgid ""
|
|||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2021-11-01 18:01+0100\n"
|
||||
"PO-Revision-Date: 2023-01-10 12:50+0000\n"
|
||||
"Last-Translator: ssantos <ssantos@web.de>\n"
|
||||
"POT-Creation-Date: 2023-07-29 14:24+0200\n"
|
||||
"PO-Revision-Date: 2024-05-10 07:26+0000\n"
|
||||
"Last-Translator: Gesiane Pajarinen <gesianef@hotmail.com>\n"
|
||||
"Language-Team: Portuguese <https://hosted.weblate.org/projects/i-hate-money/"
|
||||
"i-hate-money/pt/>\n"
|
||||
"Language: pt\n"
|
||||
|
@ -12,9 +12,13 @@ msgstr ""
|
|||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.15.1-dev\n"
|
||||
"X-Generator: Weblate 5.5.4-rc\n"
|
||||
"Generated-By: Babel 2.9.0\n"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Acabou de criar '%(project)s' para compartilhar as suas despesas"
|
||||
|
||||
msgid ""
|
||||
"Not a valid amount or expression. Only numbers and + - * / operators are "
|
||||
"accepted."
|
||||
|
@ -25,6 +29,13 @@ msgstr ""
|
|||
msgid "Project name"
|
||||
msgstr "Nome do projeto"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Current private code"
|
||||
msgstr "Código privado novo"
|
||||
|
||||
msgid "Enter existing private code to edit project"
|
||||
msgstr "Insira o código privado existente para editar o projeto"
|
||||
|
||||
msgid "New private code"
|
||||
msgstr "Código privado novo"
|
||||
|
||||
|
@ -46,18 +57,21 @@ msgstr "Moeda predefinida"
|
|||
msgid "Setting a default currency enables currency conversion between bills"
|
||||
msgstr "Definir uma moeda padrão permite a conversão de moeda entre faturas"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Erro desconhecido"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Código privado inválido."
|
||||
|
||||
msgid ""
|
||||
"This project cannot be set to 'no currency' because it contains bills in "
|
||||
"multiple currencies."
|
||||
msgstr ""
|
||||
"Este projeto não pode ser definido como 'sem moeda' porque contém faturas em "
|
||||
"várias moedas."
|
||||
"Este projeto não pode ser definido como 'sem moeda' porque contém faturas"
|
||||
" em várias moedas."
|
||||
|
||||
msgid "Import previously exported JSON file"
|
||||
msgstr "Importar ficheiro JSON exportado anteriormente"
|
||||
|
||||
msgid "Import"
|
||||
msgstr "Importar"
|
||||
msgid "Compatible with Cospend"
|
||||
msgstr "Compatível com Cospend"
|
||||
|
||||
msgid "Project identifier"
|
||||
msgstr "Identificador do projeto"
|
||||
|
@ -88,12 +102,6 @@ msgstr "Por favor, valide o captcha para prosseguir."
|
|||
msgid "Enter private code to confirm deletion"
|
||||
msgstr "Digite o código privado para confirmar a exclusão"
|
||||
|
||||
msgid "Unknown error"
|
||||
msgstr "Erro desconhecido"
|
||||
|
||||
msgid "Invalid private code."
|
||||
msgstr "Código privado inválido."
|
||||
|
||||
msgid "Get in"
|
||||
msgstr "Entrar"
|
||||
|
||||
|
@ -118,17 +126,17 @@ msgstr "Confirmação da palavra-passe"
|
|||
msgid "Reset password"
|
||||
msgstr "Redefinir palavra-passe"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
msgid "When?"
|
||||
msgstr "Quando?"
|
||||
|
||||
msgid "What?"
|
||||
msgstr "O quê?"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pagador"
|
||||
msgid "Who paid?"
|
||||
msgstr "Quem pagou?"
|
||||
|
||||
msgid "Amount paid"
|
||||
msgstr "Quantia paga"
|
||||
msgid "How much?"
|
||||
msgstr "Quanto?"
|
||||
|
||||
msgid "Currency"
|
||||
msgstr "Moeda"
|
||||
|
@ -152,9 +160,6 @@ msgstr "Enviar e adicionar um novo"
|
|||
msgid "Project default: %(currency)s"
|
||||
msgstr "Projeto predefinido: %(currency)s"
|
||||
|
||||
msgid "Bills can't be null"
|
||||
msgstr "Contas não podem ser null"
|
||||
|
||||
msgid "Name"
|
||||
msgstr "Nome"
|
||||
|
||||
|
@ -176,13 +181,28 @@ msgstr "Este projeto já tem este participante"
|
|||
msgid "People to notify"
|
||||
msgstr "Pessoas a notificar"
|
||||
|
||||
msgid "Send invites"
|
||||
msgstr "Enviar convites"
|
||||
msgid "Send the invitations"
|
||||
msgstr "Enviar os convites"
|
||||
|
||||
#, python-format
|
||||
msgid "The email %(email)s is not valid"
|
||||
msgstr "O email %(email)s não é válido"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Sair"
|
||||
|
||||
msgid "Please check the email configuration of the server."
|
||||
msgstr "Verifique a configuração de e-mail do servidor."
|
||||
|
||||
#, fuzzy, python-format
|
||||
msgid ""
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator: %(admin_email)s"
|
||||
msgstr ""
|
||||
"Desculpe, houve um erro ao enviar os convites via e-mail. Por favor, "
|
||||
"confira a configuração de email do servidor ou entre em contato com um "
|
||||
"administrador."
|
||||
|
||||
#. List with two items only
|
||||
msgid "{dual_object_0} and {dual_object_1}"
|
||||
msgstr "{dual_object_0} e {dual_object_1"
|
||||
|
@ -210,7 +230,8 @@ msgstr "{prefix}: {error}"
|
|||
msgid "{prefix}:<br />{errors}"
|
||||
msgstr "{prefix}:<br />{errors}"
|
||||
|
||||
msgid "Too many failed login attempts, please retry later."
|
||||
#, fuzzy
|
||||
msgid "Too many failed login attempts."
|
||||
msgstr "Muitas tentativas de login falhas, por favor, tente novamente mais tarde."
|
||||
|
||||
#, python-format
|
||||
|
@ -226,10 +247,6 @@ msgstr "O token fornecido é inválido"
|
|||
msgid "This private code is not the right one"
|
||||
msgstr "Este código privado não é o correto"
|
||||
|
||||
#, python-format
|
||||
msgid "You have just created '%(project)s' to share your expenses"
|
||||
msgstr "Acabou de criar '%(project)s' para compartilhar as suas despesas"
|
||||
|
||||
msgid "A reminder email has just been sent to you"
|
||||
msgstr "Um email de lembrete acabou de ser enviado a si"
|
||||
|
||||
|
@ -240,14 +257,10 @@ msgstr ""
|
|||
"Tentamos lhe enviar um email de lembrete, mas aconteceu um erro. Pode "
|
||||
"continuar usando o projeto normalmente."
|
||||
|
||||
#, python-format
|
||||
msgid "The project identifier is %(project)s"
|
||||
msgstr "O identificador do projeto é %(project)s"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Sorry, there was an error while sending you an email with password reset "
|
||||
"instructions. Please check the email configuration of the server or "
|
||||
"contact the administrator."
|
||||
"instructions."
|
||||
msgstr ""
|
||||
"Desculpe, houve um erro ao te enviar um email com as instruções de "
|
||||
"redefinição de palavra-passe. Por favor, confira a configuração de e-mail"
|
||||
|
@ -265,11 +278,15 @@ msgstr "Projeto desconhecido"
|
|||
msgid "Password successfully reset."
|
||||
msgstr "Palavra-passe redefinida corretamente."
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projeto enviado corretamente"
|
||||
msgid "Project settings have been changed successfully."
|
||||
msgstr "As configurações do projeto foram alteradas com sucesso."
|
||||
|
||||
msgid "Invalid JSON"
|
||||
msgstr "JSON inválido"
|
||||
msgid "Unable to parse CSV"
|
||||
msgstr "Não foi possível processar o CSV"
|
||||
|
||||
#, python-format
|
||||
msgid "Missing attribute: %(attribute)s"
|
||||
msgstr "Faltando o atributo: %(attribute)s"
|
||||
|
||||
msgid ""
|
||||
"Cannot add bills in multiple currencies to a project without default "
|
||||
|
@ -278,12 +295,18 @@ msgstr ""
|
|||
"Não é possível adicionar faturas em várias moedas a um projeto sem moeda "
|
||||
"padrão"
|
||||
|
||||
msgid "Project successfully uploaded"
|
||||
msgstr "Projeto enviado corretamente"
|
||||
|
||||
msgid "Project successfully deleted"
|
||||
msgstr "Projeto deletado com sucesso"
|
||||
|
||||
msgid "Error deleting project"
|
||||
msgstr "Erro ao apagar o projeto"
|
||||
|
||||
msgid "Unable to logout"
|
||||
msgstr "Não é possível sair"
|
||||
|
||||
#, python-format
|
||||
msgid "You have been invited to share your expenses for %(project)s"
|
||||
msgstr "Foi convidado a compartilhar suas despesas com %(project)s"
|
||||
|
@ -291,10 +314,8 @@ msgstr "Foi convidado a compartilhar suas despesas com %(project)s"
|
|||
msgid "Your invitations have been sent"
|
||||
msgstr "Seus convites foram enviados"
|
||||
|
||||
msgid ""
|
||||
"Sorry, there was an error while trying to send the invitation emails. "
|
||||
"Please check the email configuration of the server or contact the "
|
||||
"administrator."
|
||||
#, fuzzy
|
||||
msgid "Sorry, there was an error while trying to send the invitation emails."
|
||||
msgstr ""
|
||||
"Desculpe, houve um erro ao enviar os convites via e-mail. Por favor, "
|
||||
"confira a configuração de email do servidor ou entre em contato com um "
|
||||
|
@ -319,8 +340,8 @@ msgid ""
|
|||
"Participant '%(name)s' has been deactivated. It will still appear in the "
|
||||
"list until its balance reach zero."
|
||||
msgstr ""
|
||||
"O participante '%(name)s' foi desativado. Ele ainda aparecerá na lista até "
|
||||
"que o saldo dele seja zero."
|
||||
"O participante '%(name)s' foi desativado. Ele ainda aparecerá na lista "
|
||||
"até que o saldo dele seja zero."
|
||||
|
||||
#, python-format
|
||||
msgid "Participant '%(name)s' has been removed"
|
||||
|
@ -342,6 +363,10 @@ msgstr "A fatura foi apagada"
|
|||
msgid "The bill has been modified"
|
||||
msgstr "A fatura foi modificada"
|
||||
|
||||
#, python-format
|
||||
msgid "%(lang)s is not a supported language"
|
||||
msgstr "Não temos configuração para o idioma %(lang)s"
|
||||
|
||||
msgid "Error deleting project history"
|
||||
msgstr "Erro ao apagar o histórico do projeto"
|
||||
|
||||
|
@ -402,8 +427,8 @@ msgstr "Ações"
|
|||
msgid "edit"
|
||||
msgstr "editar"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "deletar"
|
||||
msgid "Delete project"
|
||||
msgstr "Apagarr projeto"
|
||||
|
||||
msgid "show"
|
||||
msgstr "exibir"
|
||||
|
@ -417,20 +442,12 @@ msgstr "Descarregar Aplicação Mobile"
|
|||
msgid "Get it on"
|
||||
msgstr "Vamos"
|
||||
|
||||
msgid "Are you sure?"
|
||||
msgstr "Tem certeza?"
|
||||
|
||||
msgid "Edit project"
|
||||
msgstr "Editar projeto"
|
||||
|
||||
msgid "Delete project"
|
||||
msgstr "Apagarr projeto"
|
||||
|
||||
msgid "Import JSON"
|
||||
msgstr "Importar JSON"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Escolher ficheiro"
|
||||
#, fuzzy
|
||||
msgid "Import project"
|
||||
msgstr "Editar projeto"
|
||||
|
||||
msgid "Download project's data"
|
||||
msgstr "Descarregar dados do projeto"
|
||||
|
@ -458,18 +475,28 @@ msgstr "Cancelar"
|
|||
msgid "Privacy Settings"
|
||||
msgstr "Configurações de Privacidade"
|
||||
|
||||
msgid "Edit the project"
|
||||
msgstr "Editar o projeto"
|
||||
msgid "Save changes"
|
||||
msgstr "Salvar as alterações"
|
||||
|
||||
msgid "This will remove all bills and participants in this project!"
|
||||
msgstr "Isso removerá todas as faturas e os participantes deste projeto!"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Import previously exported project"
|
||||
msgstr "Importar ficheiro JSON exportado anteriormente"
|
||||
|
||||
msgid "Choose file"
|
||||
msgstr "Escolher ficheiro"
|
||||
|
||||
msgid "Edit this bill"
|
||||
msgstr "Editar esta fatura"
|
||||
|
||||
msgid "Add a bill"
|
||||
msgstr "Adicionar uma fatura"
|
||||
|
||||
msgid "Simple operations are allowed, e.g. (18+36.2)/3"
|
||||
msgstr "Operações simples são permitidas, por ex. (18+36,2)/3"
|
||||
|
||||
msgid "Everyone"
|
||||
msgstr "Todos"
|
||||
|
||||
|
@ -488,9 +515,6 @@ msgstr "Editar este participante"
|
|||
msgid "john.doe@example.com, mary.moe@site.com"
|
||||
msgstr "flano.tal@exemplo.com, flana.maria@site.com"
|
||||
|
||||
msgid "Send the invitations"
|
||||
msgstr "Enviar os convites"
|
||||
|
||||
msgid "Download"
|
||||
msgstr "Descarregar"
|
||||
|
||||
|
@ -537,9 +561,8 @@ msgstr ""
|
|||
" O resto do histórico do projeto não será afetado. Esta "
|
||||
"ação não pode ser desfeita."
|
||||
|
||||
#, fuzzy
|
||||
msgid "Confirm deletion"
|
||||
msgstr "Confirmar eliminação"
|
||||
msgstr "Confirmar exclusão"
|
||||
|
||||
msgid "Close"
|
||||
msgstr "Fechar"
|
||||
|
@ -562,36 +585,24 @@ msgstr "Fatura %(name)s: adicionado %(owers_list_str)s à lista de proprietário
|
|||
msgid "Bill %(name)s: removed %(owers_list_str)s from owers list"
|
||||
msgstr "Fatura %(name)s: removido %(owers_list_str)s da lista de proprietários"
|
||||
|
||||
#, python-format
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>This project has history disabled. New actions won't "
|
||||
"appear below. You can enable history on the</i>\n"
|
||||
" <a href=\"%(url)s\">settings page</a>\n"
|
||||
" "
|
||||
msgid "This project has history disabled. New actions won't appear below."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>Este projeto tem o histórico desativado. Novas ações não "
|
||||
"serão exibidas abaixo. Pode ativar o histórico na</i>\n"
|
||||
" <a href=\"%(url)s\">página de configurações</a>\n"
|
||||
" "
|
||||
"Este projeto tem o histórico desativado. Novas ações não aparecerão abaixo."
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can enable history on the settings page."
|
||||
msgstr "A gravação do endereço IP pode ser ativada na página de configurações"
|
||||
|
||||
msgid ""
|
||||
"\n"
|
||||
" <i>The table below reflects actions recorded prior to "
|
||||
"disabling project history. You can\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">clear project history</a> to remove "
|
||||
"them.</i></p>\n"
|
||||
" "
|
||||
"The table below reflects actions recorded prior to disabling project "
|
||||
"history."
|
||||
msgstr ""
|
||||
"\n"
|
||||
" <i>A tabela abaixo reflete as ações registadas antes da "
|
||||
"desativação do histórico do projeto. Pode\n"
|
||||
" <a href=\"#\" data-toggle=\"modal\" data-keyboard=\"false\" "
|
||||
"data-target=\"#confirm-erase\">limpar o histórico do projeto</a> para "
|
||||
"removê-las.</i></p>\n"
|
||||
" "
|
||||
"A tabela abaixo contém as ações registradas antes da desativação do "
|
||||
"histórico do projeto."
|
||||
|
||||
#, fuzzy
|
||||
msgid "You can clear the project history to remove them."
|
||||
msgstr "Alguém provavelmente limpou o histórico do projeto."
|
||||
|
||||
msgid ""
|
||||
"Some entries below contain IP addresses, even though this project has IP "
|
||||
|
@ -603,18 +614,18 @@ msgstr ""
|
|||
msgid "Delete stored IP addresses"
|
||||
msgstr "Deletar endereços IP gravados"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Não há histórico para apagar"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Limpar Histórico do Projeto"
|
||||
|
||||
msgid "No IP Addresses to erase"
|
||||
msgstr "Não há endereços IP para apagar"
|
||||
|
||||
msgid "Delete Stored IP Addresses"
|
||||
msgstr "Deletar endereços IP gravados"
|
||||
|
||||
msgid "No history to erase"
|
||||
msgstr "Não há histórico para apagar"
|
||||
|
||||
msgid "Clear Project History"
|
||||
msgstr "Limpar Histórico do Projeto"
|
||||
|
||||
msgid "Time"
|
||||
msgstr "Tempo"
|
||||
|
||||
|
@ -676,9 +687,15 @@ msgstr "Fatura %(name)s renomeada a %(new_description)s"
|
|||
msgid "Participant %(name)s: weight changed from %(old_weight)s to %(new_weight)s"
|
||||
msgstr "Participante %(name)s: peso alterado de %(old_weight)s a %(new_weight)s"
|
||||
|
||||
msgid "Payer"
|
||||
msgstr "Pagador"
|
||||
|
||||
msgid "Amount"
|
||||
msgstr "Quantia"
|
||||
|
||||
msgid "Date"
|
||||
msgstr "Data"
|
||||
|
||||
#, python-format
|
||||
msgid "Amount in %(currency)s"
|
||||
msgstr "Quantia em %(currency)s"
|
||||
|
@ -781,6 +798,9 @@ msgstr "Histórico"
|
|||
msgid "Settings"
|
||||
msgstr "Configurações"
|
||||
|
||||
msgid "RSS Feed"
|
||||
msgstr "RSS Feed"
|
||||
|
||||
msgid "Other projects :"
|
||||
msgstr "Outros projetos:"
|
||||
|
||||
|
@ -790,8 +810,9 @@ msgstr "mudar para"
|
|||
msgid "Dashboard"
|
||||
msgstr "Painel de controle"
|
||||
|
||||
msgid "Logout"
|
||||
msgstr "Sair"
|
||||
#, python-format
|
||||
msgid "Please retry after %(date)s."
|
||||
msgstr "Por favor, tente novamente após %(date)s."
|
||||
|
||||
msgid "Code"
|
||||
msgstr "Código"
|
||||
|
@ -802,7 +823,7 @@ msgstr "Aplicação Mobile"
|
|||
msgid "Documentation"
|
||||
msgstr "Documentação"
|
||||
|
||||
msgid "Administation Dashboard"
|
||||
msgid "Administration Dashboard"
|
||||
msgstr "Painel de Administração"
|
||||
|
||||
msgid "Legal information"
|
||||
|
@ -824,30 +845,21 @@ msgstr "tem certeza?"
|
|||
msgid "Invite people"
|
||||
msgstr "Convidar pessoas"
|
||||
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Deveria começar adicionando pessoas"
|
||||
|
||||
msgid "Add a new bill"
|
||||
msgstr "Adicionar uma nova fatura"
|
||||
|
||||
msgid "Newer bills"
|
||||
msgstr "Contas mais recentes"
|
||||
|
||||
msgid "Older bills"
|
||||
msgstr "Contas mais antigas"
|
||||
|
||||
msgid "When?"
|
||||
msgstr "Quando?"
|
||||
msgid "You should start by adding participants"
|
||||
msgstr "Deveria começar adicionando pessoas"
|
||||
|
||||
msgid "Who paid?"
|
||||
msgstr "Quem pagou?"
|
||||
msgid "Add a new bill"
|
||||
msgstr "Adicionar uma nova fatura"
|
||||
|
||||
msgid "For what?"
|
||||
msgstr "Para quê?"
|
||||
|
||||
msgid "How much?"
|
||||
msgstr "Quanto?"
|
||||
|
||||
#, python-format
|
||||
msgid "Added on %(date)s"
|
||||
msgstr "Adicionado em %(date)s"
|
||||
|
@ -856,20 +868,22 @@ msgstr "Adicionado em %(date)s"
|
|||
msgid "Everyone but %(excluded)s"
|
||||
msgstr "Todos menos %(excluded)s"
|
||||
|
||||
msgid "delete"
|
||||
msgstr "deletar"
|
||||
|
||||
msgid "No bills"
|
||||
msgstr "Sem faturas"
|
||||
|
||||
msgid "Nothing to list yet."
|
||||
msgstr "Nada para listar ainda."
|
||||
|
||||
msgid "You probably want to"
|
||||
msgstr "Provavelmente gostaria de"
|
||||
|
||||
msgid "add a bill"
|
||||
#, fuzzy
|
||||
msgid "Add your first bill"
|
||||
msgstr "adicionar uma fatura"
|
||||
|
||||
msgid "add participants"
|
||||
msgstr "adicionar participantes"
|
||||
#, fuzzy
|
||||
msgid "Add the first participant"
|
||||
msgstr "Editar este participante"
|
||||
|
||||
msgid "Password reminder"
|
||||
msgstr "Lembrete de palavra-passe"
|
||||
|
@ -893,41 +907,66 @@ msgstr "Redefinir sua palavra-passe"
|
|||
msgid "Invite people to join this project"
|
||||
msgstr "Convide pessoas para participar deste projeto"
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Compartilhar Identificador & código"
|
||||
msgid "Share an invitation link"
|
||||
msgstr "Compartilhe um link do convite"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means."
|
||||
"The easiest way to invite people is to give them the following invitation"
|
||||
" link.<br />They will be able to access the project, manage participants,"
|
||||
" add/edit/delete bills. However, they will not have access to important "
|
||||
"settings such as changing the private code or deleting the whole project."
|
||||
msgstr ""
|
||||
"Pode compartilhar o identificador do projeto e o código privado por "
|
||||
"qualquer meio de comunicação."
|
||||
"A maneira mais fácil de convidar as pessoas é compartilhando o seguinte link "
|
||||
"do convite.<br />Eles poderão acessar o projeto, gerenciar participantes, "
|
||||
"adicionar/editar/excluir contas. No entanto, eles não terão acesso a "
|
||||
"configurações importantes, como alterar o código privado ou excluir todo o "
|
||||
"projeto."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identificador:"
|
||||
msgid "Scan QR code"
|
||||
msgstr "Escanear o código QR"
|
||||
|
||||
msgid "Share the Link"
|
||||
msgstr "Compartilhar a ligação"
|
||||
|
||||
msgid "You can directly share the following link via your prefered medium"
|
||||
msgstr ""
|
||||
"Pode compartilhar diretamente o seguinte ligação através do seu meio "
|
||||
"preferido"
|
||||
msgid "Use a mobile device with a compatible app."
|
||||
msgstr "Use um telefone celular ou tablet com um aplicativo compatível."
|
||||
|
||||
msgid "Send via Emails"
|
||||
msgstr "Enviar via E-mails"
|
||||
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"Specify a (comma separated) list of email adresses you want to notify "
|
||||
"about the\n"
|
||||
" creation of this budget management project and we will "
|
||||
"send them an email for you."
|
||||
"Specify a list of email adresses (separated by comma) of people you want "
|
||||
"to notify about the creation of this project. We will send them an email "
|
||||
"with the invitation link."
|
||||
msgstr ""
|
||||
"Especifique uma lista (separada por vírgulas) de endereços de e-mail que "
|
||||
"deseja notificar sobre a\n"
|
||||
" criação deste projeto de gestão orçamental e enviaremos "
|
||||
"um e-mail para si."
|
||||
|
||||
msgid "Share Identifier & code"
|
||||
msgstr "Compartilhar Identificador & código"
|
||||
|
||||
msgid ""
|
||||
"You can share the project identifier and the private code by any "
|
||||
"communication means.<br />Anyone with the private code will have access "
|
||||
"to the full project, including changing settings such as the private code"
|
||||
" or project email address, or even deleting the whole project."
|
||||
msgstr ""
|
||||
"Você pode compartilhar o identificador do projeto e o código privado por "
|
||||
"qualquer meio de comunicação.<br />Qualquer pessoa com o código privado terá "
|
||||
"acesso a todo o projeto, incluindo a alteração de configurações como o "
|
||||
"código privado ou o endereço do e-mail, ou até mesmo a exclusão de todo o "
|
||||
"projeto."
|
||||
|
||||
msgid "Identifier:"
|
||||
msgstr "Identificador:"
|
||||
|
||||
#, fuzzy
|
||||
msgid "Private code:"
|
||||
msgstr "Código privado"
|
||||
|
||||
msgid "the private code was defined when you created the project"
|
||||
msgstr "o código privado foi definido quando você criou o projeto"
|
||||
|
||||
msgid "Who pays?"
|
||||
msgstr "Quem paga?"
|
||||
|
||||
|
@ -1023,3 +1062,94 @@ msgstr "Período"
|
|||
|
||||
#~ msgid "People to notify"
|
||||
#~ msgstr "Pessoas para notificar"
|
||||
|
||||
#~ msgid "Import"
|
||||
#~ msgstr "Importar"
|
||||
|
||||
#~ msgid "Amount paid"
|
||||
#~ msgstr "Quantia paga"
|
||||
|
||||
#~ msgid "Bills can't be null"
|
||||
#~ msgstr "Contas não podem ser null"
|
||||
|
||||
#~ msgid "The project identifier is %(project)s"
|
||||
#~ msgstr "O identificador do projeto é %(project)s"
|
||||
|
||||
#~ msgid "Invalid JSON"
|
||||
#~ msgstr "JSON inválido"
|
||||
|
||||
#~ msgid "Are you sure?"
|
||||
#~ msgstr "Tem certeza?"
|
||||
|
||||
#~ msgid "Import JSON"
|
||||
#~ msgstr "Importar JSON"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>This project has history "
|
||||
#~ "disabled. New actions won't appear "
|
||||
#~ "below. You can enable history on "
|
||||
#~ "the</i>\n"
|
||||
#~ " <a href=\"%(url)s\">settings page</a>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>Este projeto tem o "
|
||||
#~ "histórico desativado. Novas ações não "
|
||||
#~ "serão exibidas abaixo. Pode ativar o "
|
||||
#~ "histórico na</i>\n"
|
||||
#~ " <a href=\"%(url)s\">página de configurações</a>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid ""
|
||||
#~ "\n"
|
||||
#~ " <i>The table below reflects "
|
||||
#~ "actions recorded prior to disabling "
|
||||
#~ "project history. You can\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">clear project history</a>"
|
||||
#~ " to remove them.</i></p>\n"
|
||||
#~ " "
|
||||
#~ msgstr ""
|
||||
#~ "\n"
|
||||
#~ " <i>A tabela abaixo reflete "
|
||||
#~ "as ações registadas antes da desativação"
|
||||
#~ " do histórico do projeto. Pode\n"
|
||||
#~ " <a href=\"#\" data-"
|
||||
#~ "toggle=\"modal\" data-keyboard=\"false\" data-"
|
||||
#~ "target=\"#confirm-erase\">limpar o histórico "
|
||||
#~ "do projeto</a> para removê-las.</i></p>\n"
|
||||
#~ " "
|
||||
|
||||
#~ msgid "Send invites"
|
||||
#~ msgstr "Enviar convites"
|
||||
|
||||
#~ msgid " show"
|
||||
#~ msgstr "exibir"
|
||||
|
||||
#~ msgid "Edit the project"
|
||||
#~ msgstr "Editar o projeto"
|
||||
|
||||
#~ msgid "You probably want to"
|
||||
#~ msgstr "Provavelmente gostaria de"
|
||||
|
||||
#~ msgid "add participants"
|
||||
#~ msgstr "adicionar participantes"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "You can share the project identifier "
|
||||
#~ "and the private code by any "
|
||||
#~ "communication means."
|
||||
#~ msgstr ""
|
||||
#~ "Pode compartilhar o identificador do "
|
||||
#~ "projeto e o código privado por "
|
||||
#~ "qualquer meio de comunicação."
|
||||
|
||||
#~ msgid "Share the Link"
|
||||
#~ msgstr "Compartilhar a ligação"
|
||||
|
||||
#~ msgid "You can directly share the following link via your prefered medium"
|
||||
#~ msgstr ""
|
||||
#~ "Pode compartilhar diretamente o seguinte "
|
||||
#~ "ligação através do seu meio preferido"
|
||||
|
|
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue