Make branding configurable (#173)

* Remove orphan function

* Add centralized branding helpers and update locales

* Remove _plus and add (proper) brand

* No longer Sure, configurable

* Consistency with compose file naming

* Missed `product_name` mapping

* Fix brand/product name in mailers

* Product name in email reset flow

* Fix i18n errors/tests

* Fix password mailer brand/product name (again)

* Missed hardcoded `Sure` in onboarding goals

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Juan José Mata <jjmata@jjmata.com>

* PR nitpick on documentation

* Missing interpolation key for invited UI

* Orphan assets

* New logos

---------

Signed-off-by: Juan José Mata <jjmata@jjmata.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
This commit is contained in:
Juan José Mata
2025-10-22 19:14:03 +02:00
committed by GitHub
parent 192a3b6890
commit 7c5ddd674d
74 changed files with 348 additions and 366 deletions

View File

@@ -62,6 +62,10 @@ POSTGRES_USER=postgres
# This is the domain that your Sure instance will be hosted at. It is used to generate links in emails and other places.
APP_DOMAIN=
# Product/Brand Name
PRODUCT_NAME=
BRAND_NAME=
# Disable enforcing SSL connections
# DISABLE_SSL=true

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.1 KiB

After

Width:  |  Height:  |  Size: 895 B

View File

@@ -1,35 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="36" height="36" viewBox="0 0 512 512" fill="none">
<!-- single gold-to-amber gradient shared by every pill -->
<defs>
<linearGradient id="s-grad" x1="0" y1="0" x2="0" y2="1">
<stop offset="0%" stop-color="#FFBC47"/>
<stop offset="100%" stop-color="#C97700"/>
</linearGradient>
</defs>
<!-- the “S” from the 512-grid artwork, scaled & shifted so its
visible pixels sit inside the old-M bounding box (131-381 × 57-455) -->
<g transform="translate(131 131) scale(0.48828125)">
<rect x="80" y="0" width="140" height="63" rx="31.5" fill="url(#s-grad)"/>
<rect x="236" y="0" width="140" height="63" rx="31.5" fill="url(#s-grad)"/>
<rect x="0" y="74" width="140" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="252" y="74" width="140" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="0" y="149" width="140" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="80" y="224" width="144" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="240" y="224" width="192" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="376" y="299" width="136" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="120" y="374" width="136" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="376" y="374" width="136" height="64" rx="32" fill="url(#s-grad)"/>
<rect x="136" y="449" width="140" height="63" rx="31.5" fill="url(#s-grad)"/>
<rect x="292" y="449" width="140" height="63" rx="31.5" fill="url(#s-grad)"/>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 160 145" fill="none">
<path d="M116.51 119.37C120.062 119.37 122.809 118.751 124.752 117.513C126.696 116.274 127.701 114.58 127.768 112.429L158.828 122.303C157.621 126.409 155.042 130.156 151.088 133.545C147.201 136.869 142.276 139.509 136.312 141.464C130.348 143.419 123.68 144.397 116.309 144.397C110.01 144.397 104.113 143.712 98.6179 142.344C93.19 140.975 88.3986 138.922 84.2439 136.185C80.1562 133.382 76.9397 129.896 74.5943 125.725C72.2489 121.553 71.0762 116.698 71.0762 111.158C71.0762 105.618 72.2489 100.763 74.5943 96.5919C76.9397 92.4208 80.1562 88.9666 84.2439 86.2293C88.3986 83.4268 93.2234 81.3412 98.7184 79.9726C104.213 78.6039 110.077 77.9196 116.309 77.9196C122.675 77.9196 128.505 78.6039 133.799 79.9726C139.16 81.3412 143.75 83.4594 147.57 86.327C151.456 89.1295 154.438 92.714 156.516 97.0807C158.66 101.382 159.732 106.498 159.732 112.429H104.95C104.95 112.429 104.917 112.429 104.85 112.429C104.85 112.429 104.85 112.462 104.85 112.527C104.85 113.504 105.118 114.417 105.654 115.264C106.19 116.111 106.927 116.861 107.865 117.513C108.871 118.099 110.077 118.555 111.484 118.881C112.958 119.207 114.634 119.37 116.51 119.37ZM116.309 102.653C113.025 102.653 110.311 103.24 108.167 104.413C106.023 105.521 104.95 107.117 104.95 109.203C104.95 109.268 104.95 109.333 104.95 109.399C105.017 109.399 105.051 109.399 105.051 109.399H127.466C127.533 109.399 127.567 109.399 127.567 109.399C127.567 109.333 127.567 109.268 127.567 109.203C127.567 108.16 127.265 107.248 126.662 106.466C126.126 105.618 125.355 104.934 124.35 104.413C123.345 103.826 122.139 103.403 120.732 103.142C119.391 102.816 117.917 102.653 116.309 102.653Z" fill="#62a446"/>
<path d="M37.5666 81.9011C37.5666 85.8115 37.5666 89.7546 37.5666 93.7301C37.5666 97.6406 37.5666 101.584 37.5666 105.559C37.5666 109.47 37.5666 113.413 37.5666 117.388C37.5666 121.559 37.5666 125.73 37.5666 129.902C37.5666 134.073 37.5666 138.276 37.5666 142.513H2.74774C2.74774 136.06 2.74774 129.608 2.74774 123.156C2.74774 116.704 2.74774 110.252 2.74774 103.799C2.74774 100.15 2.74774 96.5 2.74774 92.8503C2.74774 89.2006 2.74774 85.5508 2.74774 81.9011H37.5666ZM37.466 119.246L42.9001 92.9481C43.5039 90.1456 44.678 87.8319 46.4222 86.0071C48.2336 84.117 50.3469 82.6832 52.7621 81.7056C55.1773 80.728 57.6596 80.1414 60.2089 79.9459C62.7583 79.6852 65.1063 79.783 67.2532 80.2392C69.4 80.6302 71.1108 81.3146 72.3854 82.2922L64.7374 118.659C62.7918 117.095 60.4102 116.02 57.5925 115.433C54.8418 114.846 52.0577 114.651 49.24 114.846C46.4223 114.977 43.94 115.433 41.7932 116.215C39.6463 116.997 38.2039 118.007 37.466 119.246Z" fill="#61a446"/>
<path d="M155.301 0.291725C155.301 4.65836 155.301 20.0576 155.301 24.4894C155.301 28.9212 155.301 33.353 155.301 37.7848C155.301 41.5649 155.301 45.3776 155.301 49.2228C155.301 53.0029 155.301 56.783 155.301 60.563C155.301 64.3431 155.301 68.1232 155.301 71.9033H121.476C121.476 69.166 121.476 66.3961 121.476 63.5936C121.476 60.7912 121.476 57.9887 121.476 55.1862C121.476 52.3186 121.476 49.5487 121.476 46.8766C121.476 40.8154 121.476 34.8846 121.476 29.0841C121.476 23.2185 121.476 6.28771 121.476 0.291725H155.301ZM111.113 5.29173C111.113 8.74593 111.113 18.2327 111.113 21.7521C111.113 25.2063 111.113 28.6605 111.113 32.1147C111.113 35.5689 111.113 39.0557 111.113 42.5751C111.113 44.0089 111.341 45.182 111.798 46.0945C112.319 46.9417 112.971 47.5609 113.753 47.9519C114.6 48.2778 115.48 48.4407 116.392 48.4407C117.305 48.4407 118.217 48.2778 119.13 47.9519C120.107 47.6261 120.889 47.235 121.476 46.7788L113.655 70.9257C111.83 71.8381 109.582 72.5876 106.909 73.1742C104.303 73.7607 101.565 74.054 98.6976 74.054C96.0906 74.054 93.5163 73.7281 90.9745 73.0764C88.4327 72.4898 86.1191 71.4796 84.0335 70.0458C82.0131 68.612 80.3838 66.722 79.1455 64.3757C77.9072 62.0295 77.288 59.0966 77.288 55.5773C77.288 50.8848 77.288 46.1922 77.288 41.4997C77.288 36.8072 77.288 32.1147 77.288 27.4222C77.288 24.7501 77.288 22.078 77.288 19.4058C77.288 16.6686 77.288 7.96384 77.288 5.29173H111.113Z" fill="black"/>
<path d="M0.698853 30.6484C0.698853 26.9335 1.74163 23.7074 3.82719 20.9701C5.97792 18.2328 8.87815 15.9517 12.5279 14.1269C16.1776 12.2368 20.3161 10.8356 24.9435 9.92315C29.5708 9.01072 34.3937 8.5545 39.412 8.5545C45.6035 8.5545 51.3388 9.10848 56.6179 10.2164C61.9621 11.3244 66.785 12.7908 71.0864 14.6157V37.2961C69.2616 35.9275 66.8502 34.7543 63.8522 33.7767C60.9194 32.7991 57.791 32.0496 54.4672 31.5282C51.2085 31.0068 48.1127 30.7461 45.1799 30.7461C43.2247 30.7461 41.4324 30.8765 39.8031 31.1372C38.2389 31.3327 36.968 31.6586 35.9904 32.1148C35.078 32.571 34.6218 33.1576 34.6218 33.8745C34.6218 34.2655 34.7521 34.5588 35.0128 34.7543C35.3387 34.9499 35.7949 35.0802 36.3815 35.1454C36.968 35.2105 37.7175 35.2431 38.63 35.2431C40.1289 35.2431 41.465 35.2431 42.6381 35.2431C43.8113 35.2431 45.1147 35.2431 46.5486 35.2431C49.8072 35.2431 53.0659 35.4712 56.3246 35.9275C59.6485 36.3185 62.6465 37.1332 65.3186 38.3715C68.0559 39.6098 70.2392 41.402 71.8685 43.7483C73.4979 46.0294 74.3125 49.06 74.3125 52.84C74.3125 56.8156 73.2046 60.2047 70.9887 63.0071C68.838 65.7444 65.8726 67.9929 62.0925 69.7526C58.3776 71.4471 54.1739 72.6854 49.4814 73.4675C44.854 74.2496 40.0312 74.6406 35.0128 74.6406C29.082 74.6406 23.2164 74.0867 17.4159 72.9787C11.6806 71.8708 6.76001 70.2414 2.65406 68.0907V44.2371C4.28341 45.9968 6.59707 47.4632 9.59506 48.6363C12.6582 49.7443 15.9495 50.5915 19.4689 51.1781C23.0534 51.6995 26.4099 51.9602 29.5382 51.9602C31.5586 51.9602 33.3835 51.8624 35.0128 51.6669C36.6421 51.4062 37.913 51.0478 38.8255 50.5915C39.8031 50.0701 40.2919 49.4184 40.2919 48.6363C40.2919 48.3105 40.1941 48.0823 39.9986 47.952C39.8031 47.8217 39.4772 47.7239 39.021 47.6587C38.63 47.5936 38.076 47.561 37.3591 47.561C36.3815 47.561 35.3713 47.561 34.3285 47.561C33.2857 47.561 32.3407 47.561 31.4934 47.561C29.2123 47.561 26.6706 47.4958 23.8681 47.3654C21.1308 47.1699 18.3935 46.8115 15.6562 46.2901C12.9189 45.7035 10.4097 44.8237 8.12865 43.6505C5.91275 42.4122 4.12047 40.7503 2.75182 38.6648C1.38318 36.514 0.698853 33.8419 0.698853 30.6484Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -1,36 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="233" height="233"
viewBox="0 0 512 512"
preserveAspectRatio="xMidYMid meet">
<!-- single-tone fill that matches the old “M” -->
<style>.pill{fill:#0E1017;}</style>
<!-- full “S” artwork: no extra translate, no non-uniform scaling -->
<!-- Row 0 -->
<rect class="pill" x="80" y="0" width="140" height="63" rx="31.5"/>
<rect class="pill" x="236" y="0" width="140" height="63" rx="31.5"/>
<!-- Row 1 -->
<rect class="pill" x="0" y="74" width="140" height="64" rx="32"/>
<rect class="pill" x="252" y="74" width="140" height="64" rx="32"/>
<!-- Row 2 -->
<rect class="pill" x="0" y="149" width="140" height="64" rx="32"/>
<!-- Row 3 -->
<rect class="pill" x="80" y="224" width="144" height="64" rx="32"/>
<rect class="pill" x="240" y="224" width="192" height="64" rx="32"/>
<!-- Row 4 -->
<rect class="pill" x="376" y="299" width="136" height="64" rx="32"/>
<!-- Row 5 -->
<rect class="pill" x="120" y="374" width="136" height="64" rx="32"/>
<rect class="pill" x="376" y="374" width="136" height="64" rx="32"/>
<!-- Row 6 -->
<rect class="pill" x="136" y="449" width="140" height="63" rx="31.5"/>
<rect class="pill" x="292" y="449" width="140" height="63" rx="31.5"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="300" height="300" viewBox="0 0 160 145" fill="none">
<path d="M116.51 119.37C120.062 119.37 122.809 118.751 124.752 117.513C126.696 116.274 127.701 114.58 127.768 112.429L158.828 122.303C157.621 126.409 155.042 130.156 151.088 133.545C147.201 136.869 142.276 139.509 136.312 141.464C130.348 143.419 123.68 144.397 116.309 144.397C110.01 144.397 104.113 143.712 98.6179 142.344C93.19 140.975 88.3986 138.922 84.2439 136.185C80.1562 133.382 76.9397 129.896 74.5943 125.725C72.2489 121.553 71.0762 116.698 71.0762 111.158C71.0762 105.618 72.2489 100.763 74.5943 96.5919C76.9397 92.4208 80.1562 88.9666 84.2439 86.2293C88.3986 83.4268 93.2234 81.3412 98.7184 79.9726C104.213 78.6039 110.077 77.9196 116.309 77.9196C122.675 77.9196 128.505 78.6039 133.799 79.9726C139.16 81.3412 143.75 83.4594 147.57 86.327C151.456 89.1295 154.438 92.714 156.516 97.0807C158.66 101.382 159.732 106.498 159.732 112.429H104.95C104.95 112.429 104.917 112.429 104.85 112.429C104.85 112.429 104.85 112.462 104.85 112.527C104.85 113.504 105.118 114.417 105.654 115.264C106.19 116.111 106.927 116.861 107.865 117.513C108.871 118.099 110.077 118.555 111.484 118.881C112.958 119.207 114.634 119.37 116.51 119.37ZM116.309 102.653C113.025 102.653 110.311 103.24 108.167 104.413C106.023 105.521 104.95 107.117 104.95 109.203C104.95 109.268 104.95 109.333 104.95 109.399C105.017 109.399 105.051 109.399 105.051 109.399H127.466C127.533 109.399 127.567 109.399 127.567 109.399C127.567 109.333 127.567 109.268 127.567 109.203C127.567 108.16 127.265 107.248 126.662 106.466C126.126 105.618 125.355 104.934 124.35 104.413C123.345 103.826 122.139 103.403 120.732 103.142C119.391 102.816 117.917 102.653 116.309 102.653Z" fill="#62a446"/>
<path d="M37.5666 81.9011C37.5666 85.8115 37.5666 89.7546 37.5666 93.7301C37.5666 97.6406 37.5666 101.584 37.5666 105.559C37.5666 109.47 37.5666 113.413 37.5666 117.388C37.5666 121.559 37.5666 125.73 37.5666 129.902C37.5666 134.073 37.5666 138.276 37.5666 142.513H2.74774C2.74774 136.06 2.74774 129.608 2.74774 123.156C2.74774 116.704 2.74774 110.252 2.74774 103.799C2.74774 100.15 2.74774 96.5 2.74774 92.8503C2.74774 89.2006 2.74774 85.5508 2.74774 81.9011H37.5666ZM37.466 119.246L42.9001 92.9481C43.5039 90.1456 44.678 87.8319 46.4222 86.0071C48.2336 84.117 50.3469 82.6832 52.7621 81.7056C55.1773 80.728 57.6596 80.1414 60.2089 79.9459C62.7583 79.6852 65.1063 79.783 67.2532 80.2392C69.4 80.6302 71.1108 81.3146 72.3854 82.2922L64.7374 118.659C62.7918 117.095 60.4102 116.02 57.5925 115.433C54.8418 114.846 52.0577 114.651 49.24 114.846C46.4223 114.977 43.94 115.433 41.7932 116.215C39.6463 116.997 38.2039 118.007 37.466 119.246Z" fill="#61a446"/>
<path d="M155.301 0.291725C155.301 4.65836 155.301 20.0576 155.301 24.4894C155.301 28.9212 155.301 33.353 155.301 37.7848C155.301 41.5649 155.301 45.3776 155.301 49.2228C155.301 53.0029 155.301 56.783 155.301 60.563C155.301 64.3431 155.301 68.1232 155.301 71.9033H121.476C121.476 69.166 121.476 66.3961 121.476 63.5936C121.476 60.7912 121.476 57.9887 121.476 55.1862C121.476 52.3186 121.476 49.5487 121.476 46.8766C121.476 40.8154 121.476 34.8846 121.476 29.0841C121.476 23.2185 121.476 6.28771 121.476 0.291725H155.301ZM111.113 5.29173C111.113 8.74593 111.113 18.2327 111.113 21.7521C111.113 25.2063 111.113 28.6605 111.113 32.1147C111.113 35.5689 111.113 39.0557 111.113 42.5751C111.113 44.0089 111.341 45.182 111.798 46.0945C112.319 46.9417 112.971 47.5609 113.753 47.9519C114.6 48.2778 115.48 48.4407 116.392 48.4407C117.305 48.4407 118.217 48.2778 119.13 47.9519C120.107 47.6261 120.889 47.235 121.476 46.7788L113.655 70.9257C111.83 71.8381 109.582 72.5876 106.909 73.1742C104.303 73.7607 101.565 74.054 98.6976 74.054C96.0906 74.054 93.5163 73.7281 90.9745 73.0764C88.4327 72.4898 86.1191 71.4796 84.0335 70.0458C82.0131 68.612 80.3838 66.722 79.1455 64.3757C77.9072 62.0295 77.288 59.0966 77.288 55.5773C77.288 50.8848 77.288 46.1922 77.288 41.4997C77.288 36.8072 77.288 32.1147 77.288 27.4222C77.288 24.7501 77.288 22.078 77.288 19.4058C77.288 16.6686 77.288 7.96384 77.288 5.29173H111.113Z" fill="black"/>
<path d="M0.698853 30.6484C0.698853 26.9335 1.74163 23.7074 3.82719 20.9701C5.97792 18.2328 8.87815 15.9517 12.5279 14.1269C16.1776 12.2368 20.3161 10.8356 24.9435 9.92315C29.5708 9.01072 34.3937 8.5545 39.412 8.5545C45.6035 8.5545 51.3388 9.10848 56.6179 10.2164C61.9621 11.3244 66.785 12.7908 71.0864 14.6157V37.2961C69.2616 35.9275 66.8502 34.7543 63.8522 33.7767C60.9194 32.7991 57.791 32.0496 54.4672 31.5282C51.2085 31.0068 48.1127 30.7461 45.1799 30.7461C43.2247 30.7461 41.4324 30.8765 39.8031 31.1372C38.2389 31.3327 36.968 31.6586 35.9904 32.1148C35.078 32.571 34.6218 33.1576 34.6218 33.8745C34.6218 34.2655 34.7521 34.5588 35.0128 34.7543C35.3387 34.9499 35.7949 35.0802 36.3815 35.1454C36.968 35.2105 37.7175 35.2431 38.63 35.2431C40.1289 35.2431 41.465 35.2431 42.6381 35.2431C43.8113 35.2431 45.1147 35.2431 46.5486 35.2431C49.8072 35.2431 53.0659 35.4712 56.3246 35.9275C59.6485 36.3185 62.6465 37.1332 65.3186 38.3715C68.0559 39.6098 70.2392 41.402 71.8685 43.7483C73.4979 46.0294 74.3125 49.06 74.3125 52.84C74.3125 56.8156 73.2046 60.2047 70.9887 63.0071C68.838 65.7444 65.8726 67.9929 62.0925 69.7526C58.3776 71.4471 54.1739 72.6854 49.4814 73.4675C44.854 74.2496 40.0312 74.6406 35.0128 74.6406C29.082 74.6406 23.2164 74.0867 17.4159 72.9787C11.6806 71.8708 6.76001 70.2414 2.65406 68.0907V44.2371C4.28341 45.9968 6.59707 47.4632 9.59506 48.6363C12.6582 49.7443 15.9495 50.5915 19.4689 51.1781C23.0534 51.6995 26.4099 51.9602 29.5382 51.9602C31.5586 51.9602 33.3835 51.8624 35.0128 51.6669C36.6421 51.4062 37.913 51.0478 38.8255 50.5915C39.8031 50.0701 40.2919 49.4184 40.2919 48.6363C40.2919 48.3105 40.1941 48.0823 39.9986 47.952C39.8031 47.8217 39.4772 47.7239 39.021 47.6587C38.63 47.5936 38.076 47.561 37.3591 47.561C36.3815 47.561 35.3713 47.561 34.3285 47.561C33.2857 47.561 32.3407 47.561 31.4934 47.561C29.2123 47.561 26.6706 47.4958 23.8681 47.3654C21.1308 47.1699 18.3935 46.8115 15.6562 46.2901C12.9189 45.7035 10.4097 44.8237 8.12865 43.6505C5.91275 42.4122 4.12047 40.7503 2.75182 38.6648C1.38318 36.514 0.698853 33.8419 0.698853 30.6484Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -1,6 +1,14 @@
module ApplicationHelper
include Pagy::Frontend
def product_name
Rails.configuration.x.product_name
end
def brand_name
Rails.configuration.x.brand_name
end
def styled_form_with(**options, &block)
options[:builder] = StyledFormBuilder
form_with(**options, &block)

View File

@@ -1,4 +1,25 @@
class ApplicationMailer < ActionMailer::Base
default from: email_address_with_name(ENV.fetch("EMAIL_SENDER", "sender@sure.local"), "Sure Finance")
default from: email_address_with_name(
ENV.fetch("EMAIL_SENDER", "sender@sure.local"),
"#{Rails.configuration.x.brand_name} #{Rails.configuration.x.product_name}"
)
layout "mailer"
before_action :assign_branding
helper_method :product_name, :brand_name
private
def assign_branding
@product_name = product_name
@brand_name = brand_name
end
def product_name
Rails.configuration.x.product_name
end
def brand_name
Rails.configuration.x.brand_name
end
end

View File

@@ -6,7 +6,7 @@ class EmailConfirmationMailer < ApplicationMailer
#
def confirmation_email
@user = params[:user]
@subject = t(".subject")
@subject = t(".subject", product_name: product_name)
@cta = t(".cta")
@confirmation_url = new_email_confirmation_url(token: @user.generate_token_for(:email_confirmation))

View File

@@ -5,7 +5,11 @@ class InvitationMailer < ApplicationMailer
mail(
to: @invitation.email,
subject: t(".subject", inviter: @invitation.inviter.display_name)
subject: t(
".subject",
inviter: @invitation.inviter.display_name,
product: product_name
)
)
end
end

View File

@@ -1,7 +1,7 @@
class PasswordMailer < ApplicationMailer
def password_reset
@user = params[:user]
@subject = t(".subject")
@subject = t(".subject", product_name: product_name)
@cta = t(".cta")
mail to: @user.email, subject: @subject

View File

@@ -146,10 +146,6 @@ class Demo::Generator
raise ActiveRecord::RecordNotFound, "No admin user with email #{email} found in family ##{family.id}"
end
def partner_email_for(email)
"partner_#{email}"
end
def create_family_and_users!(family_name, email, onboarded:, subscribed:)
family = Family.create!(
name: family_name,

View File

@@ -1,7 +1,7 @@
class Provider::Simplefin
include HTTParty
headers "User-Agent" => "Sure Finance SimpleFin Client"
headers "User-Agent" => "#{Rails.configuration.x.product_name} Finance SimpleFin Client"
default_options.merge!(verify: true, ssl_verify_mode: :peer)
def initialize

View File

@@ -12,7 +12,7 @@
<%= icon("chevron-down", color: "warning", class: "group-open:transform group-open:rotate-180") %>
</summary>
<div class="text-xs py-2 space-y-2">
<p>Sure uses third party providers to fetch historical exchange rates, security prices, and more. This data is required to calculate accurate historical account balances.</p>
<p><%= product_name %> uses third party providers to fetch historical exchange rates, security prices, and more. This data is required to calculate accurate historical account balances.</p>
<p>
<%= link_to "Configure your providers here.", settings_hosting_path, class: "text-yellow-600 underline" %>

View File

@@ -71,6 +71,6 @@
</div>
<p class="text-xs text-tertiary text-center">
By authorizing, you allow this app to access your Sure data according to the permissions above.
By authorizing, you allow this app to access your <%= product_name %> data according to the permissions above.
</p>
</div>

View File

@@ -43,7 +43,7 @@
<div class="bg-container-inset rounded-xl p-1 space-y-1 w-[650px] min-w-0 mx-auto">
<div class="grid grid-cols-3 gap-2 text-xs font-medium text-secondary uppercase px-5 py-3">
<p><%= t(".csv_mapping_label", mapping: mapping_label(mapping_class)) %></p>
<p><%= t(".maybe_mapping_label", mapping: mapping_label(mapping_class)) %></p>
<p><%= t(".sure_mapping_label", mapping: mapping_label(mapping_class), product_name: product_name) %></p>
<p class="justify-self-end"><%= t(".rows_label") %></p>
</div>

View File

@@ -1,9 +1,12 @@
<h1><%= t(".greeting") %></h1>
<h1><%= t(".greeting", product: product_name) %></h1>
<p>
<%= t(".body",
<%= t(
".body",
inviter: @invitation.inviter.display_name,
family: @invitation.family.name).html_safe %>
family: @invitation.family.name,
product: product_name
).html_safe %>
</p>
<%= link_to t(".accept_button"), @accept_url, class: "button" %>

View File

@@ -1,5 +1,5 @@
<%= render DS::Dialog.new do |dialog| %>
<% dialog.with_header(title: t(".title"), subtitle: t(".subtitle")) %>
<% dialog.with_header(title: t(".title"), subtitle: t(".subtitle", product: product_name)) %>
<% dialog.with_body do %>
<%= styled_form_with model: @invitation, class: "space-y-4", data: { turbo: false } do |form| %>

View File

@@ -26,7 +26,7 @@
<% end %>
<% if controller_name == "sessions" %>
<p class="text-sm text-center hidden md:block">
<%= tag.span t(".no_account"), class: "text-secondary" %> <%= link_to t(".sign_up"), new_registration_path, class: "font-medium text-primary hover:underline transition" %>
<%= tag.span t(".no_account", product: product_name), class: "text-secondary" %> <%= link_to t(".sign_up"), new_registration_path, class: "font-medium text-primary hover:underline transition" %>
</p>
<% elsif controller_name == "registrations" %>
<p class="text-sm text-center text-gray-600 hidden md:block">

View File

@@ -1,6 +1,6 @@
<footer class="p-6">
<div class="space-y-2 text-center text-xs text-secondary">
<p>&copy; <%= Date.current.year %>, Sure (community fork of Maybe Finance)</p>
<p>&copy; <%= Date.current.year %>, <%= brand_name %> <%= product_name %> (community fork of Maybe Finance)</p>
<div class="flex justify-center items-center gap-2">
<%= link_to "Privacy Policy", privacy_path, class: "text-secondary", target: "_blank" %>
<span>&bull;</span>

View File

@@ -1,5 +1,5 @@
<head>
<title><%= content_for(:title) || "Sure" %></title>
<title><%= content_for(:title) || product_name %></title>
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
@@ -18,7 +18,7 @@
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="Sure">
<meta name="apple-mobile-web-app-title" content="<%= product_name %>">
<meta name="msapplication-TileColor" content="#F9F9F9">
<meta name="theme-color" content="#F9F9F9">

View File

@@ -15,8 +15,8 @@
<div class="grow max-w-lg w-full mx-auto bg-surface flex flex-col justify-center md:py-0 py-6 px-4 md:px-0">
<div>
<div class="space-y-1 mb-6 text-center">
<h1 class="text-2xl font-medium md:text-2xl">What brings you to Sure?</h1>
<p class="text-secondary text-sm">Select one or more goals that you have with using Sure as your personal finance tool.</p>
<h1 class="text-2xl font-medium md:text-2xl">What brings you here?</h1>
<p class="text-secondary text-sm">Select one or more goals that you have with using <%= product_name %> as your personal finance tool.</p>
</div>
<%= form_with model: @user do |form| %>

View File

@@ -16,7 +16,7 @@
<%= link_to "https://discord.gg/36ZGBsxYEK", target: "_blank", rel: "noopener noreferrer", class: "w-full md:w-1/3 flex flex-col items-center p-4 border border-alpha-black-25 rounded-xl hover:bg-container-hover" do %>
<%= image_tag "discord-icon.svg", class: "w-8 h-8 mb-2" %>
<span class="text-sm font-medium text-primary text-center">Discuss Sure with others</span>
<span class="text-sm font-medium text-primary text-center">Discuss <%= product_name %> with others</span>
<% end %>
</div>
</div>

View File

@@ -1,4 +1,4 @@
<p><%= t(".request_made") %></p>
<p><%= t(".request_made", product_name: product_name) %></p>
<p><%= link_to t(".cta"), edit_password_reset_url(token: params[:token]) %></p>

View File

@@ -1,6 +1,6 @@
{
"name": "Sure",
"short_name": "Sure",
"name": "<%= j product_name %>",
"short_name": "<%= j product_name %>",
"icons": [
{
"src": "/logo-pwa.png",
@@ -18,7 +18,7 @@
"display": "standalone",
"display_override": ["fullscreen", "minimal-ui"],
"scope": "/",
"description": "Sure is your personal finance assistant.",
"description": "<%= j product_name %> is your personal finance assistant.",
"theme_color": "#F9F9F9",
"background_color": "#F9F9F9"
}

View File

@@ -21,14 +21,14 @@
</p>
<% elsif @family.trialing? %>
<p class="text-primary">
You are currently trialing Sure
You are currently trialing <%= product_name %>
<span class="text-secondary">
(<%= @family.days_left_in_trial %> days remaining)
</span>
</p>
<% else %>
<p class="text-primary">You are currently <span class="font-medium">not subscribed</span></p>
<p class="text-secondary">Once you subscribe to Sure+, you'll see your billing settings here.</p>
<p class="text-secondary">Once you subscribe to <%= product_name %>, you'll see your billing settings here.</p>
<% end %>
</div>
</div>

View File

@@ -2,7 +2,7 @@
<div class="flex items-center justify-between">
<div class="space-y-1">
<p class="text-sm"><%= t(".title") %></p>
<p class="text-secondary text-sm"><%= t(".description") %></p>
<p class="text-secondary text-sm"><%= t(".description", product: product_name) %></p>
</div>
<%= styled_form_with model: Setting.new,

View File

@@ -1,6 +1,6 @@
<%= content_for :page_title, t(".page_title") %>
<%= settings_section title: t(".profile_title"), subtitle: t(".profile_subtitle") do %>
<%= settings_section title: t(".profile_title"), subtitle: t(".profile_subtitle", product: product_name) do %>
<%= styled_form_with model: @user, url: user_path(@user), class: "space-y-4" do |form| %>
<%= render "settings/user_avatar_field", form: form, user: @user %>

View File

@@ -0,0 +1,4 @@
Rails.application.configure do
config.x.product_name = ENV.fetch("PRODUCT_NAME", "Sure")
config.x.brand_name = ENV.fetch("BRAND_NAME", "FOSS")
end

View File

@@ -1,5 +1,8 @@
---
en:
defaults:
brand_name: "%{brand_name}"
product_name: "%{product_name}"
activerecord:
errors:
messages:

View File

@@ -1,5 +1,8 @@
---
nb:
defaults:
brand_name: "%{brand_name}"
product_name: "%{product_name}"
activerecord:
errors:
messages:

View File

@@ -1,5 +1,8 @@
---
tr:
defaults:
brand_name: "%{brand_name}"
product_name: "%{product_name}"
activerecord:
errors:
messages:

View File

@@ -2,4 +2,4 @@
en:
invitation_mailer:
invite_email:
subject: "%{inviter} has invited you to join their household on Sure!"
subject: "%{inviter} has invited you to join their household on %{product_name}!"

View File

@@ -1,5 +1,5 @@
---
nb:
invitation_mailer:
invite_email:
subject: "%{inviter} har invitert deg til å bli med i husholdningen deres på Sure!"
---
nb:
invitation_mailer:
invite_email:
subject: "%{inviter} har invitert deg til å bli med i husholdningen deres på %{product_name}!"

View File

@@ -2,4 +2,4 @@
tr:
invitation_mailer:
invite_email:
subject: "%{inviter} seni Sure'de kendi ailesine katılmaya davet etti!"
subject: "%{inviter} seni %{product_name}'de kendi ailesine katılmaya davet etti!"

View File

@@ -7,4 +7,4 @@ en:
cta: Confirm email change
expiry_notice: This link will expire in %{hours} hours.
greeting: Hello!
subject: 'Maybe: Confirm your email change'
subject: '%{product_name}: Confirm your email change'

View File

@@ -1,10 +1,10 @@
---
nb:
email_confirmation_mailer:
confirmation_email:
body: Du ba nylig om å endre e-postadressen din. Klikk på knappen
nedenfor for å bekrefte denne endringen.
cta: Bekreft endring av e-post
expiry_notice: Denne lenken vil utløpe om %{hours} timer.
greeting: Hei!
subject: 'Sure: Bekreft endring av e-posten din'
---
nb:
email_confirmation_mailer:
confirmation_email:
body: Du ba nylig om å endre e-postadressen din. Klikk på knappen
nedenfor for å bekrefte denne endringen.
cta: Bekreft endring av e-post
expiry_notice: Denne lenken vil utløpe om %{hours} timer.
greeting: Hei!
subject: '%{product_name}: Bekreft endring av e-posten din'

View File

@@ -6,4 +6,4 @@ tr:
cta: E-posta değişikliğini onayla
expiry_notice: Bu bağlantı %{hours} saat içinde geçerliliğini yitirecek.
greeting: Merhaba!
subject: 'Sure: E-posta değişikliğinizi onaylayın'
subject: '%{product_name}: E-posta değişikliğinizi onaylayın'

View File

@@ -23,7 +23,7 @@ en:
mappings:
create_account: Create account
csv_mapping_label: "%{mapping} in CSV"
maybe_mapping_label: "%{mapping} in Maybe"
sure_mapping_label: "%{mapping} in %{product_name}"
no_accounts: You don't have any accounts yet. Please create an account that
we can use for (unassigned) rows in your CSV or go back to the Clean step
and provide an account name we can use.

View File

@@ -23,7 +23,7 @@ nb:
mappings:
create_account: Opprett konto
csv_mapping_label: "%{mapping} i CSV"
maybe_mapping_label: "%{mapping} i Sure"
sure_mapping_label: "%{mapping} i %{product_name}"
no_accounts: Du har ingen kontoer ennå. Vennligst opprett en konto som
vi kan bruke for (utilordnede) rader i CSV-filen din eller gå tilbake til Rengjør-trinnet
og oppgi et kontonavn vi kan bruke.

View File

@@ -21,18 +21,18 @@ tr:
mappings:
create_account: Hesap oluştur
csv_mapping_label: CSV'de %{mapping}
maybe_mapping_label: Sure'de %{mapping}
sure_mapping_label: "%{product_name}'de %{mapping}"
no_accounts: Henüz hiç hesabınız yok. Lütfen CSV'nizdeki (atanmamış) satırlar için kullanabileceğimiz bir hesap oluşturun veya Temizle adımına geri dönüp kullanabileceğimiz bir hesap adı girin.
rows_label: Satırlar
unassigned_account: Atanmamış satırlar için yeni bir hesap oluşturmak ister misiniz?
show:
account_mapping_description: İçe aktardığınız dosyadaki tüm hesapları Sure'deki mevcut hesaplara eşleyin. Ayrıca yeni hesaplar ekleyebilir veya kategorize etmeden bırakabilirsiniz.
account_mapping_description: "İçe aktardığınız dosyadaki tüm hesapları %{product_name}'deki mevcut hesaplara eşleyin. Ayrıca yeni hesaplar ekleyebilir veya kategorize etmeden bırakabilirsiniz."
account_mapping_title: Hesaplarınızı eşleyin
account_type_mapping_description: İçe aktardığınız dosyadaki tüm hesap türlerini Sure'deki hesap türlerine eşleyin.
account_type_mapping_description: "İçe aktardığınız dosyadaki tüm hesap türlerini %{product_name}'deki hesap türlerine eşleyin."
account_type_mapping_title: Hesap türlerinizi eşleyin
category_mapping_description: İçe aktardığınız dosyadaki tüm kategorileri Sure'deki mevcut kategorilere eşleyin. Ayrıca yeni kategoriler ekleyebilir veya kategorize etmeden bırakabilirsiniz.
category_mapping_description: "İçe aktardığınız dosyadaki tüm kategorileri %{product_name}'deki mevcut kategorilere eşleyin. Ayrıca yeni kategoriler ekleyebilir veya kategorize etmeden bırakabilirsiniz."
category_mapping_title: Kategorilerinizi eşleyin
tag_mapping_description: İçe aktardığınız dosyadaki tüm etiketleri Sure'deki mevcut etiketlere eşleyin. Ayrıca yeni etiketler ekleyebilir veya kategorize etmeden bırakabilirsiniz.
tag_mapping_description: "İçe aktardığınız dosyadaki tüm etiketleri %{product_name}'deki mevcut etiketlere eşleyin. Ayrıca yeni etiketler ekleyebilir veya kategorize etmeden bırakabilirsiniz."
tag_mapping_title: Etiketlerinizi eşleyin
uploads:
show:

View File

@@ -3,6 +3,6 @@ en:
invitation_mailer:
invite_email:
accept_button: Accept Invitation
body: "%{inviter} has invited you to join the %{family} family on Sure!"
body: "%{inviter} has invited you to join the %{family} family on %{product_name}!"
expiry_notice: This invitation will expire in %{days} days
greeting: Welcome to Sure!
greeting: Welcome to %{product_name}!

View File

@@ -1,8 +1,8 @@
---
nb:
invitation_mailer:
invite_email:
accept_button: Godta invitasjon
body: "%{inviter} har invitert deg til å bli med i %{family}-familien på Sure!"
expiry_notice: Denne invitasjonen vil utløpe om %{days} dager
greeting: Velkommen til Sure!
---
nb:
invitation_mailer:
invite_email:
accept_button: Godta invitasjon
body: "%{inviter} har invitert deg til å bli med i %{family}-familien på %{product_name}!"
expiry_notice: Denne invitasjonen vil utløpe om %{days} dager
greeting: Velkommen til %{product_name}!

View File

@@ -1,19 +1,19 @@
---
nb:
invitations:
create:
failure: Kunne ikke sende invitasjon
success: Invitasjon sendt vellykket
destroy:
failure: Det oppsto et problem med å fjerne invitasjonen.
not_authorized: Du er ikke autorisert til å administrere invitasjoner.
success: Invitasjonen ble fjernet vellykket.
new:
email_label: E-postadresse
email_placeholder: Angi e-postadresse
role_admin: Administrator
role_label: Rolle
role_member: Medlem
submit: Send invitasjon
subtitle: Send en invitasjon for å bli med i din familiekonto på Sure
---
nb:
invitations:
create:
failure: Kunne ikke sende invitasjon
success: Invitasjon sendt vellykket
destroy:
failure: Det oppsto et problem med å fjerne invitasjonen.
not_authorized: Du er ikke autorisert til å administrere invitasjoner.
success: Invitasjonen ble fjernet vellykket.
new:
email_label: E-postadresse
email_placeholder: Angi e-postadresse
role_admin: Administrator
role_label: Rolle
role_member: Medlem
submit: Send invitasjon
subtitle: Send en invitasjon for å bli med i din familiekonto på %{product_name}
title: Inviter noen

View File

@@ -3,7 +3,7 @@ en:
layouts:
auth:
existing_account: Already have an account?
no_account: New to Sure?
no_account: New to %{product_name}?
sign_in: Sign in
sign_up: Create account
your_account: Your account

View File

@@ -1,13 +1,13 @@
---
nb:
layouts:
auth:
existing_account: Har du allerede en konto?
no_account: Ny hos Sure?
sign_in: Logg inn
sign_up: Opprett konto
your_account: Din konto
shared:
footer:
privacy_policy: Personvernerklæring
---
nb:
layouts:
auth:
existing_account: Har du allerede en konto?
no_account: Ny hos %{product_name}?
sign_in: Logg inn
sign_up: Opprett konto
your_account: Din konto
shared:
footer:
privacy_policy: Personvernerklæring
terms_of_service: Vilkår for bruk

View File

@@ -25,4 +25,4 @@ en:
message: Were really excited youre here. In the next step well ask you a
few questions to complete your profile and then get you all set up.
setup: Set up account
title: Meet Sure
title: Meet %{product_name}

View File

@@ -1,28 +1,28 @@
---
nb:
onboardings:
header:
sign_out: Logg ut
preferences:
currency: Valuta
date_format: Datoformat
example: Eksempelkonto
locale: Språk
preview: Forhåndsvis hvordan data vises basert på preferanser.
submit: Fullfør
subtitle: La oss konfigurere preferansene dine.
title: Konfigurer preferansene dine
profile:
country: Land
first_name: Fornavn
household_name: Husholdningsnavn
last_name: Etternavn
profile_image: Profilbilde
submit: Fortsett
subtitle: La oss fullføre profilen din.
title: La oss sette opp det grunnleggende
show:
message: Vi er veldig glade for at du er her. I neste trinn vil vi stille deg noen
spørsmål for å fullføre profilen din og deretter få deg i gang.
setup: Sett opp konto
title: Møt Sure
---
nb:
onboardings:
header:
sign_out: Logg ut
preferences:
currency: Valuta
date_format: Datoformat
example: Eksempelkonto
locale: Språk
preview: Forhåndsvis hvordan data vises basert på preferanser.
submit: Fullfør
subtitle: La oss konfigurere preferansene dine.
title: Konfigurer preferansene dine
profile:
country: Land
first_name: Fornavn
household_name: Husholdningsnavn
last_name: Etternavn
profile_image: Profilbilde
submit: Fortsett
subtitle: La oss fullføre profilen din.
title: La oss sette opp det grunnleggende
show:
message: Vi er veldig glade for at du er her. I neste trinn vil vi stille deg noen
spørsmål for å fullføre profilen din og deretter få deg i gang.
setup: Sett opp konto
title: Møt %{product_name}

View File

@@ -5,6 +5,6 @@ en:
cta: Reset your password
ignore_if_not_requested: If you didn't make this request, you can ignore this
email.
request_made: A request was made to reset your Maybe password. Click the link
request_made: A request was made to reset your %{product_name} password. Click the link
to reset it.
subject: 'Maybe: Reset your password'
subject: '%{product_name}: Reset your password'

View File

@@ -1,10 +1,10 @@
---
nb:
password_mailer:
password_reset:
cta: Tilbakestill passordet ditt
ignore_if_not_requested: Hvis du ikke gjorde denne forespørselen, kan du ignorere denne
e-posten.
request_made: En forespørsel ble gjort for å tilbakestille ditt Sure-passord. Klikk på lenken
for å tilbakestille det.
subject: 'Sure: Tilbakestill passordet ditt'
---
nb:
password_mailer:
password_reset:
cta: Tilbakestill passordet ditt
ignore_if_not_requested: Hvis du ikke gjorde denne forespørselen, kan du ignorere denne
e-posten.
request_made: En forespørsel ble gjort for å tilbakestille %{product_name}-passordet ditt. Klikk på lenken
for å tilbakestille det.
subject: '%{product_name}: Tilbakestill passordet ditt'

View File

@@ -4,5 +4,5 @@ tr:
password_reset:
cta: Şifrenizi sıfırlayın
ignore_if_not_requested: Eğer bu isteği siz yapmadıysanız, bu e-postayı yok sayabilirsiniz.
request_made: Maybe şifrenizi sıfırlamak için bir istek yapıldı. Sıfırlamak için bağlantıya tıklayın.
subject: 'Maybe: Şifrenizi sıfırlayın'
request_made: "%{product_name} şifrenizi sıfırlamak için bir istek yapıldı. Sıfırlamak için bağlantıya tıklayın."
subject: '%{product_name}: Şifrenizi sıfırlayın'

View File

@@ -1,25 +1,25 @@
---
nb:
helpers:
label:
user:
invite_code: Invitasjonskode
submit:
user:
create: Fortsett
registrations:
create:
failure: Det oppsto et problem med registreringen.
invalid_invite_code: Ugyldig invitasjonskode, vennligst prøv igjen.
success: Du har blitt registrert.
new:
invitation_message: "%{inviter} har invitert deg til å bli med som %{role}"
join_family_title: Bli med i %{family}
role_admin: administrator
role_member: medlem
submit: Opprett konto
title: Opprett kontoen din
welcome_body: For å komme i gang må du registrere deg for en ny konto. Du vil
da kunne konfigurere flere innstillinger i appen.
welcome_title: Velkommen til Self Hosted Sure!
---
nb:
helpers:
label:
user:
invite_code: Invitasjonskode
submit:
user:
create: Fortsett
registrations:
create:
failure: Det oppsto et problem med registreringen.
invalid_invite_code: Ugyldig invitasjonskode, vennligst prøv igjen.
success: Du har blitt registrert.
new:
invitation_message: "%{inviter} har invitert deg til å bli med som %{role}"
join_family_title: Bli med i %{family}
role_admin: administrator
role_member: medlem
submit: Opprett konto
title: Opprett kontoen din
welcome_body: For å komme i gang må du registrere deg for en ny konto. Du vil
da kunne konfigurere flere innstillinger i appen.
welcome_title: Velkommen til Self Hosted %{product_name}!
password_placeholder: Angi passordet ditt

View File

@@ -1,75 +1,75 @@
---
nb:
settings:
api_keys_controller:
success: "API-nøkkel opprettet"
revoked_successfully: "API-nøkkelen er tilbakekalt"
revoke_failed: "Kunne ikke tilbakekalle API-nøkkel"
scope_descriptions:
read_accounts: "Vis kontoer"
read_transactions: "Vis transaksjoner"
read_balances: "Vis balanser"
write_transactions: "Opprett transaksjoner"
api_keys:
show:
title: "Administrasjon av API-nøkkel"
no_api_key:
title: "Opprett din API-nøkkel"
description: "Få programmatisk tilgang til dine Sure-data med en sikker API-nøkkel."
what_you_can_do: "Hva du kan gjøre med API-et:"
feature_1: "Få tilgang til konto dataene dine programmatisk"
feature_2: "Bygg tilpassede integrasjoner og applikasjoner"
feature_3: "Automatiser datahenting og analyse"
security_note_title: "Sikkerhet først"
security_note: "Din API-nøkkel vil ha begrensede tillatelser basert på omfangene du velger. Du kan bare ha én aktiv API-nøkkel om gangen."
create_api_key: "Opprett API-nøkkel"
current_api_key:
title: "Din API-nøkkel"
description: "Din aktive API-nøkkel er klar til bruk. Oppbevar den sikkert og del den aldri offentlig."
active: "Aktiv"
key_name: "Navn"
created_at: "Opprettet"
last_used: "Sist brukt"
expires: "Utløper"
ago: "siden"
never_used: "Aldri brukt"
never_expires: "Utløper aldri"
permissions: "Tillatelser"
usage_instructions_title: "Hvordan bruke din API-nøkkel"
usage_instructions: "Inkluder din API-nøkkel i X-Api-Key-headeren når du gjør forespørsler til Maybe API-et:"
regenerate_key: "Opprett ny nøkkel"
revoke_key: "Tilbakekall nøkkel"
revoke_confirmation: "Er du sikker på at du vil tilbakekalle denne API-nøkkelen? Denne handlingen kan ikke angres og vil umiddelbart deaktivere alle applikasjoner som bruker denne nøkkelen."
new:
title: "Opprett API-nøkkel"
create_new_key: "Opprett ny API-nøkkel"
description: "Konfigurer din nye API-nøkkel med et beskrivende navn og passende tillatelser."
name_label: "API-nøkkelnavn"
name_placeholder: "f.eks., Produksjonsapp, Analyse dashboard"
name_help: "Velg et beskrivende navn for å hjelpe deg med å identifisere denne nøkkelens formål."
permissions_label: "Tillatelser"
permissions_help: "Velg tillatelsene din API-nøkkel trenger. Du kan alltid opprette en ny nøkkel med andre tillatelser."
scope_details:
read_accounts: "Vis kontoinformasjon, balanser og konto-nivå data"
read_transactions: "Vis transaksjonsdata, kategorier og transaksjonsdetaljer"
read_balances: "Vis historiske balancedata og kontoverditrend"
write_transactions: "Opprett og oppdater transaksjonsregistre (kommer snart)"
security_warning_title: "Viktig sikkerhetsvarsel"
security_warning: "Din API-nøkkel vil bare vises én gang etter opprettelse. Lagre den sikkert og del den aldri offentlig. Hvis du mister den, må du opprette en ny."
create_key: "Opprett API-nøkkel"
cancel: "Avbryt"
created:
title: "API-nøkkel opprettet"
success_title: "API-nøkkel opprettet vellykket"
success_description: "Din nye API-nøkkel er klar til bruk. Sørg for å kopiere den nå siden du ikke vil kunne se den igjen."
your_api_key: "Din API-nøkkel"
key_name: "Navn"
permissions: "Tillatelser"
critical_warning_title: "⚠️ Kritisk: Lagre API-nøkkelen din nå"
critical_warning_1: "Dette er den eneste gangen du vil se din API-nøkkel i klartekst."
critical_warning_2: "Kopier og lagre den sikkert i din passordbehandler eller applikasjon."
critical_warning_3: "Hvis du mister denne nøkkelen, må du opprette en ny."
usage_instructions_title: "Hurtigstart"
usage_instructions: "Bruk din API-nøkkel ved å inkludere den i X-Api-Key-headeren:"
copy_key: "Kopier API-nøkkel"
---
nb:
settings:
api_keys_controller:
success: "API-nøkkel opprettet"
revoked_successfully: "API-nøkkelen er tilbakekalt"
revoke_failed: "Kunne ikke tilbakekalle API-nøkkel"
scope_descriptions:
read_accounts: "Vis kontoer"
read_transactions: "Vis transaksjoner"
read_balances: "Vis balanser"
write_transactions: "Opprett transaksjoner"
api_keys:
show:
title: "Administrasjon av API-nøkkel"
no_api_key:
title: "Opprett din API-nøkkel"
description: "Få programmatisk tilgang til dine %{product_name}-data med en sikker API-nøkkel."
what_you_can_do: "Hva du kan gjøre med API-et:"
feature_1: "Få tilgang til konto dataene dine programmatisk"
feature_2: "Bygg tilpassede integrasjoner og applikasjoner"
feature_3: "Automatiser datahenting og analyse"
security_note_title: "Sikkerhet først"
security_note: "Din API-nøkkel vil ha begrensede tillatelser basert på omfangene du velger. Du kan bare ha én aktiv API-nøkkel om gangen."
create_api_key: "Opprett API-nøkkel"
current_api_key:
title: "Din API-nøkkel"
description: "Din aktive API-nøkkel er klar til bruk. Oppbevar den sikkert og del den aldri offentlig."
active: "Aktiv"
key_name: "Navn"
created_at: "Opprettet"
last_used: "Sist brukt"
expires: "Utløper"
ago: "siden"
never_used: "Aldri brukt"
never_expires: "Utløper aldri"
permissions: "Tillatelser"
usage_instructions_title: "Hvordan bruke din API-nøkkel"
usage_instructions: "Inkluder din API-nøkkel i X-Api-Key-headeren når du gjør forespørsler til Maybe API-et:"
regenerate_key: "Opprett ny nøkkel"
revoke_key: "Tilbakekall nøkkel"
revoke_confirmation: "Er du sikker på at du vil tilbakekalle denne API-nøkkelen? Denne handlingen kan ikke angres og vil umiddelbart deaktivere alle applikasjoner som bruker denne nøkkelen."
new:
title: "Opprett API-nøkkel"
create_new_key: "Opprett ny API-nøkkel"
description: "Konfigurer din nye API-nøkkel med et beskrivende navn og passende tillatelser."
name_label: "API-nøkkelnavn"
name_placeholder: "f.eks., Produksjonsapp, Analyse dashboard"
name_help: "Velg et beskrivende navn for å hjelpe deg med å identifisere denne nøkkelens formål."
permissions_label: "Tillatelser"
permissions_help: "Velg tillatelsene din API-nøkkel trenger. Du kan alltid opprette en ny nøkkel med andre tillatelser."
scope_details:
read_accounts: "Vis kontoinformasjon, balanser og konto-nivå data"
read_transactions: "Vis transaksjonsdata, kategorier og transaksjonsdetaljer"
read_balances: "Vis historiske balancedata og kontoverditrend"
write_transactions: "Opprett og oppdater transaksjonsregistre (kommer snart)"
security_warning_title: "Viktig sikkerhetsvarsel"
security_warning: "Din API-nøkkel vil bare vises én gang etter opprettelse. Lagre den sikkert og del den aldri offentlig. Hvis du mister den, må du opprette en ny."
create_key: "Opprett API-nøkkel"
cancel: "Avbryt"
created:
title: "API-nøkkel opprettet"
success_title: "API-nøkkel opprettet vellykket"
success_description: "Din nye API-nøkkel er klar til bruk. Sørg for å kopiere den nå siden du ikke vil kunne se den igjen."
your_api_key: "Din API-nøkkel"
key_name: "Navn"
permissions: "Tillatelser"
critical_warning_title: "⚠️ Kritisk: Lagre API-nøkkelen din nå"
critical_warning_1: "Dette er den eneste gangen du vil se din API-nøkkel i klartekst."
critical_warning_2: "Kopier og lagre den sikkert i din passordbehandler eller applikasjon."
critical_warning_3: "Hvis du mister denne nøkkelen, må du opprette en ny."
usage_instructions_title: "Hurtigstart"
usage_instructions: "Bruk din API-nøkkel ved å inkludere den i X-Api-Key-headeren:"
copy_key: "Kopier API-nøkkel"
continue: "Fortsett til innstillinger for API-nøkkel"

View File

@@ -80,7 +80,7 @@ en:
last_name: Last Name
page_title: Profile Info
pending: Pending
profile_subtitle: Customize how you appear on Sure
profile_subtitle: Customize how you appear on %{product}
profile_title: Personal
remove_invitation: Remove Invitation
remove_member: Remove Member

View File

@@ -3,7 +3,7 @@ en:
settings:
hostings:
invite_code_settings:
description: Every new user that joins your instance of Maybe can only do
description: Every new user that joins your instance of %{product} can only do
so via an invite code
email_confirmation_description: When enabled, users must confirm their email
address when changing it.

View File

@@ -1,28 +1,28 @@
---
nb:
settings:
hostings:
invite_code_settings:
description: Hver ny bruker som blir med i din instans av Sure kan bare bli med via en invitasjonskode
email_confirmation_description: Når aktivert, må brukere bekrefte e-postadressen
sin når de endrer den.
email_confirmation_title: Krev e-postbekreftelse
generate_tokens: Generer ny kode
generated_tokens: Genererte koder
title: Krev invitasjonskode for registrering
show:
general: Generelle innstillinger
invites: Invitasjonskoder
title: Selvhosting
danger_zone: Fareområde
clear_cache: Tøm cache
clear_cache_warning: Tømming av cache vil fjerne alle valutakurser, verdipapirpriser, kontobalanser og andre data. Dette vil ikke slette kontoer, transaksjoner, kategorier eller andre bruker-eide data.
confirm_clear_cache:
title: Tøm cache?
body: Er du sikker på at du vil tømme cache? Dette vil fjerne alle valutakurser, verdipapirpriser, kontobalanser og andre data. Denne handlingen kan ikke angres.
update:
failure: Ugyldig innstillingsverdi
success: Innstillinger oppdatert
clear_cache:
cache_cleared: Cachen er tømt. Dette kan ta noen øyeblikk å fullføre.
---
nb:
settings:
hostings:
invite_code_settings:
description: Hver ny bruker som blir med i din instans av %{product_name} kan bare bli med via en invitasjonskode
email_confirmation_description: Når aktivert, må brukere bekrefte e-postadressen
sin når de endrer den.
email_confirmation_title: Krev e-postbekreftelse
generate_tokens: Generer ny kode
generated_tokens: Genererte koder
title: Krev invitasjonskode for registrering
show:
general: Generelle innstillinger
invites: Invitasjonskoder
title: Selvhosting
danger_zone: Fareområde
clear_cache: Tøm cache
clear_cache_warning: Tømming av cache vil fjerne alle valutakurser, verdipapirpriser, kontobalanser og andre data. Dette vil ikke slette kontoer, transaksjoner, kategorier eller andre bruker-eide data.
confirm_clear_cache:
title: Tøm cache?
body: Er du sikker på at du vil tømme cache? Dette vil fjerne alle valutakurser, verdipapirpriser, kontobalanser og andre data. Denne handlingen kan ikke angres.
update:
failure: Ugyldig innstillingsverdi
success: Innstillinger oppdatert
clear_cache:
cache_cleared: Cachen er tømt. Dette kan ta noen øyeblikk å fullføre.
not_authorized: Du er ikke autorisert til å utføre denne handlingen

View File

@@ -64,7 +64,7 @@ nb:
last_name: Etternavn
page_title: Konto
pending: Venter
profile_subtitle: Tilpass hvordan du vises på Sure
profile_subtitle: Tilpass hvordan du vises på %{product_name}
profile_title: Profil
remove_invitation: Fjern invitasjon
remove_member: Fjern medlem

View File

@@ -62,7 +62,7 @@ tr:
last_name: Soyad
page_title: Hesap
pending: Beklemede
profile_subtitle: Maybe'de nasıl göründüğünüzü özelleştirin
profile_subtitle: "%{product_name}'de nasıl göründüğünüzü özelleştirin"
profile_title: Profil
remove_invitation: Daveti Kaldır
remove_member: Üyeyi Kaldır

View File

@@ -1,3 +1,3 @@
en:
subscriptions:
self_hosted_alert: "Sure+ is not available in self-hosted mode."
self_hosted_alert: "%{product_name} is not available in self-hosted mode."

View File

@@ -1,4 +1,4 @@
---
nb:
subscriptions:
self_hosted_alert: "Sure+ er ikke tilgjengelig i selvhostet modus."
---
nb:
subscriptions:
self_hosted_alert: "%{product_name} er ikke tilgjengelig i selvhostet modus."

View File

@@ -1,4 +1,4 @@
---
tr:
subscriptions:
self_hosted_alert: "Sure+ kendi sunucunda barındırılan modda kullanılamaz."
self_hosted_alert: "%{product_name} kendi sunucunda barındırılan modda kullanılamaz."

View File

@@ -189,5 +189,5 @@ By running the commands below, you will delete your existing Sure database and "
docker compose down
docker volume rm sure_postgres-data # this is the name of the volume the DB is mounted to
docker compose up
docker exec -it sure-db-1 psql -U sure_user -d sure_production -c "SELECT 1;" # This will verify that the issue is fixed
docker compose exec db psql -U sure_user -d sure_development -c "SELECT 1;" # This will verify that the issue is fixed
```

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 695 B

After

Width:  |  Height:  |  Size: 267 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 220 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,14 +1,6 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect x="240" y="224.782" width="192" height="62.439" rx="31.2195" fill="black"/>
<rect x="80" y="224.782" width="144" height="62.439" rx="31.2195" fill="black"/>
<rect x="376" y="299.71" width="136" height="62.439" rx="31.2195" fill="black"/>
<rect x="376" y="374.633" width="136" height="62.439" rx="31.2195" fill="black"/>
<rect x="80" width="140" height="62.439" rx="31.2195" fill="black"/>
<rect x="236" width="140" height="62.439" rx="31.2195" fill="black"/>
<rect x="252" y="74.9292" width="140" height="62.439" rx="31.2195" fill="black"/>
<rect x="432" y="512" width="140" height="62.439" rx="31.2195" transform="rotate(180 432 512)" fill="black"/>
<rect x="276" y="512" width="140" height="62.439" rx="31.2195" transform="rotate(180 276 512)" fill="black"/>
<rect x="256" y="437.076" width="136" height="62.439" rx="31.2195" transform="rotate(180 256 437.076)" fill="black"/>
<rect y="74.9292" width="140" height="62.439" rx="31.2195" fill="black"/>
<rect y="149.857" width="140" height="62.439" rx="31.2195" fill="black"/>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 160 145" fill="none">
<path d="M116.51 119.37C120.062 119.37 122.809 118.751 124.752 117.513C126.696 116.274 127.701 114.58 127.768 112.429L158.828 122.303C157.621 126.409 155.042 130.156 151.088 133.545C147.201 136.869 142.276 139.509 136.312 141.464C130.348 143.419 123.68 144.397 116.309 144.397C110.01 144.397 104.113 143.712 98.6179 142.344C93.19 140.975 88.3986 138.922 84.2439 136.185C80.1562 133.382 76.9397 129.896 74.5943 125.725C72.2489 121.553 71.0762 116.698 71.0762 111.158C71.0762 105.618 72.2489 100.763 74.5943 96.5919C76.9397 92.4208 80.1562 88.9666 84.2439 86.2293C88.3986 83.4268 93.2234 81.3412 98.7184 79.9726C104.213 78.6039 110.077 77.9196 116.309 77.9196C122.675 77.9196 128.505 78.6039 133.799 79.9726C139.16 81.3412 143.75 83.4594 147.57 86.327C151.456 89.1295 154.438 92.714 156.516 97.0807C158.66 101.382 159.732 106.498 159.732 112.429H104.95C104.95 112.429 104.917 112.429 104.85 112.429C104.85 112.429 104.85 112.462 104.85 112.527C104.85 113.504 105.118 114.417 105.654 115.264C106.19 116.111 106.927 116.861 107.865 117.513C108.871 118.099 110.077 118.555 111.484 118.881C112.958 119.207 114.634 119.37 116.51 119.37ZM116.309 102.653C113.025 102.653 110.311 103.24 108.167 104.413C106.023 105.521 104.95 107.117 104.95 109.203C104.95 109.268 104.95 109.333 104.95 109.399C105.017 109.399 105.051 109.399 105.051 109.399H127.466C127.533 109.399 127.567 109.399 127.567 109.399C127.567 109.333 127.567 109.268 127.567 109.203C127.567 108.16 127.265 107.248 126.662 106.466C126.126 105.618 125.355 104.934 124.35 104.413C123.345 103.826 122.139 103.403 120.732 103.142C119.391 102.816 117.917 102.653 116.309 102.653Z" fill="#62a446"/>
<path d="M37.5666 81.9011C37.5666 85.8115 37.5666 89.7546 37.5666 93.7301C37.5666 97.6406 37.5666 101.584 37.5666 105.559C37.5666 109.47 37.5666 113.413 37.5666 117.388C37.5666 121.559 37.5666 125.73 37.5666 129.902C37.5666 134.073 37.5666 138.276 37.5666 142.513H2.74774C2.74774 136.06 2.74774 129.608 2.74774 123.156C2.74774 116.704 2.74774 110.252 2.74774 103.799C2.74774 100.15 2.74774 96.5 2.74774 92.8503C2.74774 89.2006 2.74774 85.5508 2.74774 81.9011H37.5666ZM37.466 119.246L42.9001 92.9481C43.5039 90.1456 44.678 87.8319 46.4222 86.0071C48.2336 84.117 50.3469 82.6832 52.7621 81.7056C55.1773 80.728 57.6596 80.1414 60.2089 79.9459C62.7583 79.6852 65.1063 79.783 67.2532 80.2392C69.4 80.6302 71.1108 81.3146 72.3854 82.2922L64.7374 118.659C62.7918 117.095 60.4102 116.02 57.5925 115.433C54.8418 114.846 52.0577 114.651 49.24 114.846C46.4223 114.977 43.94 115.433 41.7932 116.215C39.6463 116.997 38.2039 118.007 37.466 119.246Z" fill="#61a446"/>
<path d="M155.301 0.291725C155.301 4.65836 155.301 20.0576 155.301 24.4894C155.301 28.9212 155.301 33.353 155.301 37.7848C155.301 41.5649 155.301 45.3776 155.301 49.2228C155.301 53.0029 155.301 56.783 155.301 60.563C155.301 64.3431 155.301 68.1232 155.301 71.9033H121.476C121.476 69.166 121.476 66.3961 121.476 63.5936C121.476 60.7912 121.476 57.9887 121.476 55.1862C121.476 52.3186 121.476 49.5487 121.476 46.8766C121.476 40.8154 121.476 34.8846 121.476 29.0841C121.476 23.2185 121.476 6.28771 121.476 0.291725H155.301ZM111.113 5.29173C111.113 8.74593 111.113 18.2327 111.113 21.7521C111.113 25.2063 111.113 28.6605 111.113 32.1147C111.113 35.5689 111.113 39.0557 111.113 42.5751C111.113 44.0089 111.341 45.182 111.798 46.0945C112.319 46.9417 112.971 47.5609 113.753 47.9519C114.6 48.2778 115.48 48.4407 116.392 48.4407C117.305 48.4407 118.217 48.2778 119.13 47.9519C120.107 47.6261 120.889 47.235 121.476 46.7788L113.655 70.9257C111.83 71.8381 109.582 72.5876 106.909 73.1742C104.303 73.7607 101.565 74.054 98.6976 74.054C96.0906 74.054 93.5163 73.7281 90.9745 73.0764C88.4327 72.4898 86.1191 71.4796 84.0335 70.0458C82.0131 68.612 80.3838 66.722 79.1455 64.3757C77.9072 62.0295 77.288 59.0966 77.288 55.5773C77.288 50.8848 77.288 46.1922 77.288 41.4997C77.288 36.8072 77.288 32.1147 77.288 27.4222C77.288 24.7501 77.288 22.078 77.288 19.4058C77.288 16.6686 77.288 7.96384 77.288 5.29173H111.113Z" fill="black"/>
<path d="M0.698853 30.6484C0.698853 26.9335 1.74163 23.7074 3.82719 20.9701C5.97792 18.2328 8.87815 15.9517 12.5279 14.1269C16.1776 12.2368 20.3161 10.8356 24.9435 9.92315C29.5708 9.01072 34.3937 8.5545 39.412 8.5545C45.6035 8.5545 51.3388 9.10848 56.6179 10.2164C61.9621 11.3244 66.785 12.7908 71.0864 14.6157V37.2961C69.2616 35.9275 66.8502 34.7543 63.8522 33.7767C60.9194 32.7991 57.791 32.0496 54.4672 31.5282C51.2085 31.0068 48.1127 30.7461 45.1799 30.7461C43.2247 30.7461 41.4324 30.8765 39.8031 31.1372C38.2389 31.3327 36.968 31.6586 35.9904 32.1148C35.078 32.571 34.6218 33.1576 34.6218 33.8745C34.6218 34.2655 34.7521 34.5588 35.0128 34.7543C35.3387 34.9499 35.7949 35.0802 36.3815 35.1454C36.968 35.2105 37.7175 35.2431 38.63 35.2431C40.1289 35.2431 41.465 35.2431 42.6381 35.2431C43.8113 35.2431 45.1147 35.2431 46.5486 35.2431C49.8072 35.2431 53.0659 35.4712 56.3246 35.9275C59.6485 36.3185 62.6465 37.1332 65.3186 38.3715C68.0559 39.6098 70.2392 41.402 71.8685 43.7483C73.4979 46.0294 74.3125 49.06 74.3125 52.84C74.3125 56.8156 73.2046 60.2047 70.9887 63.0071C68.838 65.7444 65.8726 67.9929 62.0925 69.7526C58.3776 71.4471 54.1739 72.6854 49.4814 73.4675C44.854 74.2496 40.0312 74.6406 35.0128 74.6406C29.082 74.6406 23.2164 74.0867 17.4159 72.9787C11.6806 71.8708 6.76001 70.2414 2.65406 68.0907V44.2371C4.28341 45.9968 6.59707 47.4632 9.59506 48.6363C12.6582 49.7443 15.9495 50.5915 19.4689 51.1781C23.0534 51.6995 26.4099 51.9602 29.5382 51.9602C31.5586 51.9602 33.3835 51.8624 35.0128 51.6669C36.6421 51.4062 37.913 51.0478 38.8255 50.5915C39.8031 50.0701 40.2919 49.4184 40.2919 48.6363C40.2919 48.3105 40.1941 48.0823 39.9986 47.952C39.8031 47.8217 39.4772 47.7239 39.021 47.6587C38.63 47.5936 38.076 47.561 37.3591 47.561C36.3815 47.561 35.3713 47.561 34.3285 47.561C33.2857 47.561 32.3407 47.561 31.4934 47.561C29.2123 47.561 26.6706 47.4958 23.8681 47.3654C21.1308 47.1699 18.3935 46.8115 15.6562 46.2901C12.9189 45.7035 10.4097 44.8237 8.12865 43.6505C5.91275 42.4122 4.12047 40.7503 2.75182 38.6648C1.38318 36.514 0.698853 33.8419 0.698853 30.6484Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -82,7 +82,7 @@ class OnboardingsControllerTest < ActionDispatch::IntegrationTest
test "should get goals" do
get goals_onboarding_url
assert_response :success
assert_select "h1", text: /What brings you to Sure/i
assert_select "h1", text: /What brings you here/i
end
test "should get trial" do

View File

@@ -6,7 +6,7 @@ class EmailConfirmationMailerTest < ActionMailer::TestCase
user.unconfirmed_email = "new@example.com"
mail = EmailConfirmationMailer.with(user: user).confirmation_email
assert_equal I18n.t("email_confirmation_mailer.confirmation_email.subject"), mail.subject
assert_equal I18n.t("email_confirmation_mailer.confirmation_email.subject", product_name: Rails.configuration.x.product_name), mail.subject
assert_equal [ user.unconfirmed_email ], mail.to
assert_equal [ "hello@example.com" ], mail.from
assert_match "confirm", mail.body.encoded

View File

@@ -38,7 +38,7 @@ class OnboardingsTest < ApplicationSystemTestCase
# Should redirect to goals page
assert_current_path goals_onboarding_path
assert_text "What brings you to Sure?"
assert_text "What brings you here?"
end
test "preferences page renders chart without errors" do
@@ -137,7 +137,7 @@ class OnboardingsTest < ApplicationSystemTestCase
visit goals_onboarding_path
assert_text "What brings you to Sure?"
assert_text "What brings you here?"
assert_button "Next"
end