Skip to content

Show translation status in README.md#7715

Merged
Alkarex merged 22 commits intoFreshRSS:edgefrom
Inverle:translation-status
Jul 16, 2025
Merged

Show translation status in README.md#7715
Alkarex merged 22 commits intoFreshRSS:edgefrom
Inverle:translation-status

Conversation

@Inverle
Copy link
Member

@Inverle Inverle commented Jul 4, 2025

Increases size of:

This should improve the visibility of which languages need help with translation and hopefully invite more contributors.

See the new README.md with translation status or the new README.fr.md

@Alkarex Alkarex added this to the 1.27.0 milestone Jul 5, 2025
Inverle added 2 commits July 6, 2025 02:19
* Only `oc.svg` remains in an image format
* `check.translation.php` still supports `.png` even though there aren't any PNGs as of right now
@Alkarex
Copy link
Member

Alkarex commented Jul 6, 2025

I think we can do it without using any third-party likebadge.io using a simple local SVG.

Something like that, but the code can be improved, and links added. I will try to find time later tonight but others are welcome

<svg xmlns="http://www.w3.org/2000/svg" width="1400" height="40">
	<g fill="white" font-size="11" font-family="Verdana" text-anchor="middle">
		<g transform="translate(0,0)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇨🇿 91%</text>
		</g>
		<g transform="translate(140,0)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇩🇪 96%</text>
		</g>
		<g transform="translate(280,0)">
			<rect rx="3" width="140" height="20" fill="darkred"/>
			<text x="70" y="14.0">🇬🇷 23%</text>
		</g>
		<g transform="translate(420,0)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇬🇧 100%</text>
		</g>
		<g transform="translate(560,0)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇺🇸 99%</text>
		</g>
		<g transform="translate(700,0)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇪🇸 94%</text>
		</g>
		<g transform="translate(840,0)">
			<rect rx="3" width="140" height="20" fill="gold"/>
			<text x="70" y="14.0">🇮🇷 79%</text>
		</g>
		<g transform="translate(980,0)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇫🇮 94%</text>
		</g>
		<g transform="translate(1120,0)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇫🇷 99%</text>
		</g>
		<g transform="translate(1260,0)">
			<rect rx="3" width="140" height="20" fill="darkred"/>
			<text x="70" y="14.0">🇮🇱 46%</text>
		</g>
		<g transform="translate(0,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇭🇺 98%</text>
		</g>
		<g transform="translate(140,20)">
			<rect rx="3" width="140" height="20" fill="gold"/>
			<text x="70" y="14.0">🇮🇩 70%</text>
		</g>
		<g transform="translate(280,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇮🇹 99%</text>
		</g>
		<g transform="translate(420,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇯🇵 98%</text>
		</g>
		<g transform="translate(560,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇰🇷 91%</text>
		</g>
		<g transform="translate(700,20)">
			<rect rx="3" width="140" height="20" fill="gold"/>
			<text x="70" y="14.0">🇱🇻 85%</text>
		</g>
		<g transform="translate(840,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇳🇱 92%</text>
		</g>
		<g transform="translate(980,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇵🇱 99%</text>
		</g>
		<g transform="translate(1120,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇧🇷 90%</text>
		</g>
		<g transform="translate(1260,20)">
			<rect rx="3" width="140" height="20" fill="green"/>
			<text x="70" y="14.0">🇵🇹 90%</text>
		</g>
	</g>
</svg>

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

I think that would have to be multiple SVG files at least?

https://github.com/Inverle/FreshRSS/blob/test/README.md

something like this

<svg xmlns="http://www.w3.org/2000/svg">
	<g fill="white" font-size="11" font-family="Verdana" text-anchor="middle">
		<rect rx="3" width="60" height="20" fill="green" />
		<text x="30" y="14">&#x1f1e8;&#x1f1ff; 99%</text>
	</g>
</svg>

@Alkarex
Copy link
Member

Alkarex commented Jul 6, 2025

I think that would have to be multiple SVG files at least?

Multiple files are an option, but less efficient than a consolidated one

@Alkarex
Copy link
Member

Alkarex commented Jul 6, 2025

P.S. And no need for XML entities, the native Unicode is easier

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

And something like this if we want to embed an image flag

<svg xmlns="http://www.w3.org/2000/svg">
	<g fill="white" font-size="11" font-family="Verdana" text-anchor="middle">
		<rect rx="3" width="65" height="20" fill="green" />
		<image x="7" y="2" width="16" height="16" href="oc.svg" />
		<text x="42" y="14">99%</text>
	</g>
</svg>

P.S. And no need for XML entities, the native Unicode is easier

These flag characters don't display correctly in my terminal, it's just for testing

Multiple files are an option, but less efficient than a consolidated one

The status for each language is supposed to be a clickable link to a GH code search which shows the TODO entries, so it's needed anyway

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

Is #7715 (comment) a better option than generating local SVGs?

edit: that looks like this, and is inconsistent with image flags

image

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

Oops https://github.com/FreshRSS/FreshRSS/blob/16cacbe38db8906750d69b0b4e0653d798781829/README.md
(I'll fix this later, probably have to set width and height for svg)

note: github is blocking the ../oc.svg with CSP... - https://raw.githubusercontent.com/FreshRSS/FreshRSS/16cacbe38db8906750d69b0b4e0653d798781829/cli/flags/gen/oc.svg
maybe embedding the svg directly inside the generated svg will work

@Alkarex
Copy link
Member

Alkarex commented Jul 6, 2025

I still think a single SVG would be the best option, having a single place to update, single HTTP request, no third-part tool involved. Quick improvement below. More work on sizes, margins needed.

<svg xmlns="http://www.w3.org/2000/svg" width="700" height="120">
	<g fill="white" font-size="11" font-family="Verdana" text-anchor="middle">
		<g transform="translate(0,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fcs+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇨🇿 91%</text>
			</a>
		</g>
		<g transform="translate(70,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fde+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇩🇪 96%</text>
			</a>
		</g>
		<g transform="translate(140,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fel+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="darkred"/>
				<text x="35" y="14.0">🇬🇷 23%</text>
			</a>
		</g>
		<g transform="translate(210,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇬🇧 100%</text>
			</a>
		</g>
		<g transform="translate(280,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fen-us+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇺🇸 99%</text>
			</a>
		</g>
		<g transform="translate(350,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fes+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇪🇸 94%</text>
			</a>
		</g>
		<g transform="translate(420,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffa+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="gold"/>
				<text x="35" y="14.0">🇮🇷 79%</text>
			</a>
		</g>
		<g transform="translate(490,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffi+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇫🇮 94%</text>
			</a>
		</g>
		<g transform="translate(560,0)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ffr+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇫🇷 99%</text>
			</a>
		</g>
		<g transform="translate(0,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhe+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="darkred"/>
				<text x="35" y="14.0">🇮🇱 46%</text>
			</a>
		</g>
		<g transform="translate(70,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fhu+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇭🇺 98%</text>
			</a>
		</g>
		<g transform="translate(140,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fid+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="gold"/>
				<text x="35" y="14.0">🇮🇩 70%</text>
			</a>
		</g>
		<g transform="translate(210,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fit+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇮🇹 99%</text>
			</a>
		</g>
		<g transform="translate(280,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fja+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇯🇵 98%</text>
			</a>
		</g>
		<g transform="translate(350,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fko+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇰🇷 91%</text>
			</a>
		</g>
		<g transform="translate(420,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Flv+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="gold"/>
				<text x="35" y="14.0">🇱🇻 85%</text>
			</a>
		</g>
		<g transform="translate(490,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fnl+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇳🇱 92%</text>
			</a>
		</g>
		<g transform="translate(490,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Foc+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<g transform="translate(12, 5) scale(0.017)">
					<desc>Flag of Occitania</desc>
					<path fill="#d4001c" d="M0 0h797.96v530.973H0z"/>
					<g fill="#fddd00">
						<path d="m184.195 267 9.126 7.138c14.632 11.443 38.501 35.909 45.015 77.3l1.721 10.924 8.361-7.312c14.038-12.277 55.754-44.434 116.757-53.224-8.792 61.003-40.948 102.718-53.224 116.756l-7.313 8.361 10.924 1.721c41.392 6.515 65.857 30.383 77.301 45.015l7.137 9.126 7.138-9.126c11.443-14.632 35.908-38.5 77.3-45.015l10.924-1.721-7.313-8.361c-12.276-14.038-44.432-55.753-53.224-116.756 61.003 8.79 102.719 40.947 116.757 53.224l8.361 7.312 1.72-10.924c6.515-41.391 30.384-65.857 45.015-77.3l9.127-7.138-9.127-7.138c-14.631-11.443-38.5-35.908-45.015-77.299l-1.72-10.925-8.361 7.312c-14.038 12.277-55.754 44.434-116.757 53.225 8.792-61.003 40.948-102.719 53.224-116.756l7.313-8.362-10.924-1.72c-41.392-6.516-65.857-30.384-77.3-45.016L400 51.195l-7.137 9.126c-11.444 14.632-35.909 38.5-77.301 45.016l-10.924 1.72 7.313 8.362c12.276 14.037 44.432 55.753 53.224 116.756-61.003-8.791-102.719-40.948-116.757-53.225l-8.361-7.312-1.721 10.925c-6.514 41.391-30.383 65.856-45.015 77.299zm35.126 0c27.829-25.798 34.255-54.425 34.255-54.425 40.626 34.242 103.986 41.96 135.665 43.666-1.707-31.679-9.424-95.039-43.666-135.666 0 0 28.626-6.425 54.425-34.255 25.799 27.83 54.425 34.255 54.425 34.255-34.242 40.627-41.959 103.987-43.666 135.666 31.679-1.706 95.039-9.424 135.665-43.666 0 0 6.426 28.627 34.255 54.425-27.829 25.799-34.255 54.425-34.255 54.425-40.626-34.242-103.986-41.96-135.665-43.666 1.707 31.679 9.424 95.039 43.666 135.666 0 0-28.626 6.425-54.425 34.255-25.799-27.83-54.425-34.255-54.425-34.255 34.242-40.627 41.959-103.987 43.666-135.666-31.679 1.706-95.039 9.424-135.665 43.666 0 0-6.426-28.626-34.255-54.425"/>
						<circle cx="176.775" cy="267" r="18"/>
						<circle cx="237.575" cy="164.576" r="18"/>
						<circle cx="237.575" cy="369.425" r="18"/>
						<circle cx="297.576" cy="104.575" r="18"/>
						<circle cx="297.576" cy="429.426" r="18"/>
						<circle cx="400" cy="43.774" r="18"/>
						<circle cx="400" cy="490.226" r="18"/>
						<circle cx="502.424" cy="104.575" r="18"/>
						<circle cx="502.424" cy="429.426" r="18"/>
						<circle cx="562.425" cy="164.576" r="18"/>
						<circle cx="562.425" cy="369.425" r="18"/>
						<circle cx="623.226" cy="267" r="18"/>
					</g>
				</g>
				<text x="43" y="14.0">92%</text>
			</a>
		</g>
		<g transform="translate(560,20)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpl+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇵🇱 99%</text>
			</a>
		</g>
		<g transform="translate(0,40)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-br+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇧🇷 90%</text>
			</a>
		</g>
		<g transform="translate(70,40)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fpt-pt+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="gold"/>
				<text x="35" y="14.0">🇵🇹 89%</text>
			</a>
		</g>
		<g transform="translate(140,40)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fru+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="gold"/>
				<text x="35" y="14.0">🇷🇺 88%</text>
			</a>
		</g>
		<g transform="translate(210,40)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fsk+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="gold"/>
				<text x="35" y="14.0">🇸🇰 86%</text>
			</a>
		</g>
		<g transform="translate(280,40)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Ftr+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="gold"/>
				<text x="35" y="14.0">🇹🇷 89%</text>
			</a>
		</g>
		<g transform="translate(350,40)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-cn+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇨🇳 91%</text>
			</a>
		</g>
		<g transform="translate(420,40)">
			<a href="https://github.com/search?q=repo%3AFreshRSS%2FFreshRSS+path%3Aapp%2Fi18n%2Fzh-tw+%2F%28TODO%7CDIRTY%29%24%2F">
				<rect rx="3" width="70" height="20" fill="green"/>
				<text x="35" y="14.0">🇹🇼 91%</text>
			</a>
		</g>
	</g>
</svg>

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

@Alkarex Question: how are the links in the SVG going to work if GH embeds the SVG in <img> and <svg> directly is not allowed?

edit: here you can see that the links do not work https://github.com/Inverle/FreshRSS/blob/test/README.md

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

@Alkarex
Copy link
Member

Alkarex commented Jul 6, 2025

Question: how are the links in the SVG going to work if GH embeds the SVG in <img> and <svg> directly is not allowed?

edit: here you can see that the links do not work https://github.com/Inverle/FreshRSS/blob/test/README.md

Thanks for the test. I did not know.

I suggest removing the decimal precision in the percentages to reduce the noise

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

@Alkarex

I suggest removing the decimal precision in the percentages to reduce the noise

https://github.com/FreshRSS/FreshRSS/blob/db725d9c41f51872cf518536a23788b93c324e52/README.md

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

Is this fine?

$color = 'green';
if ($percentageInt < 90) {
$color = 'gold';
}
if ($percentageInt < 70) {
$color = 'darkred';
}

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

Okay

@Inverle
Copy link
Member Author

Inverle commented Jul 6, 2025

  • Move the flags under ./docs/i18n/ instead of under ./cli/
  • Add a short <!--- comment --> after <translations> to tell that this section is automatically generated
  • Try to avoid the .txt files. For instance, the Unicode values could be in a new entry in the language files themselves such as in app/i18n/pl/gen.php with a new key flag on the same model than the dir key
    • not sure how to do this

@Inverle
Copy link
Member Author

Inverle commented Jul 7, 2025

I somehow broke the syntax highlighting

@Alkarex
Copy link
Member

Alkarex commented Jul 7, 2025

I somehow broke the syntax highlighting

Fixed

@Alkarex
Copy link
Member

Alkarex commented Jul 14, 2025

@Inverle I have implemented what I meant by using the existing translation files to store the Unicode flags df4e99e

@Alkarex Alkarex merged commit f9a42ad into FreshRSS:edge Jul 16, 2025
1 check passed
@Inverle
Copy link
Member Author

Inverle commented Aug 15, 2025

By the way, emoji flags don't display in Chrome on Windows:

image

because Windows doesn't include flag emojis, and Chrome refuses to add a font for them like Firefox did

@Inverle Inverle deleted the translation-status branch August 15, 2025 00:17
@Alkarex
Copy link
Member

Alkarex commented Aug 15, 2025

Ok, it is not so bad though, with the fallback letters

@math-GH
Copy link
Contributor

math-GH commented Aug 19, 2025

Microsoft Edge users cannot see the flags:
grafik

It is a Microsoft reason: Microsoft do not want (!) to provide the flags because of political reasons. Maybe they do not want to support updates for new flags and do not want to provide the one or the other flag for critical regions. (Think about f.e. Taiwan. You will find this topic in the internet when you search for it. I had this topic last week too)

One more point to think about it: Countries are countries and languages are languages that are not binded to country borders. Simple example: De for German. But the Austrian people speak German as language too. English is splitted (in FreshRSS) into British (British flag or England flag?) and USA English.

@Inverle
Copy link
Member Author

Inverle commented Aug 19, 2025

Yes, Microsoft Edge is based on Chromium too, so that's why.
If you check Edge on Linux then the flags will appear.

One more point to think about it: Countries are countries and languages are languages that are not binded to country borders. Simple example: De for German. But the Austrian people speak German as language too. English is splitted (in FreshRSS) into British (British flag or England flag?) and USA English.

I have been wondering recently if it would be better to change flags for names instead, but it would probably take more space in the readme if in image form.
Maybe this could be switched for text form instead (or in a table):

Translation progress

or hidden like this on the top of the readme (although less visible):

Translation progress

Ideas are welcome

@Frenzie
Copy link
Member

Frenzie commented Aug 19, 2025

I have been wondering recently if it would be better to change flags for names instead, but it would probably take more space in the readme if in image form.

That way you can ctrl+f it.

Weblate displays status like this btw. I'm not suggesting to copy it, but it illustrates regular text is frequently if not typically used in these contexts for the reasons cited above.
image

@Inverle
Copy link
Member Author

Inverle commented Aug 19, 2025

How about something like this on top of readme?

🌍 Translation progress
Language Translated (%)
English ✅ 100% contribute
English (United States) ✅ 100% contribute
German ⚠️ 85% contribute
French ❌ 65% contribute
...

(percentages aren't real, just an example)

@Frenzie
Copy link
Member

Frenzie commented Aug 19, 2025

Looks nice. I wouldn't be inclined to go for <details> (or the top, but that probably follows automatically).

@Inverle
Copy link
Member Author

Inverle commented Aug 19, 2025

Should it be somewhere below instead? (like other tables)

Perhaps there should be an anchor link to the table in the readme on the top, or link to a markdown file

@Frenzie
Copy link
Member

Frenzie commented Aug 19, 2025

Yes, I'd add something like this at the top (that's the second paragraph):

It is lightweight, easy to work with, powerful, customizable, and has been [translated](#relevant-id) into many languages.

And then above or below APIs & native apps the actual table.

@Inverle
Copy link
Member Author

Inverle commented Aug 19, 2025

#7842

alexlebens pushed a commit to alexlebens/infrastructure that referenced this pull request Aug 20, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [freshrss/freshrss](https://freshrss.org/) ([source](https://github.com/FreshRSS/FreshRSS)) | minor | `1.26.3` -> `1.27.0` |

---

### Release Notes

<details>
<summary>FreshRSS/FreshRSS (freshrss/freshrss)</summary>

### [`v1.27.0`](https://github.com/FreshRSS/FreshRSS/blob/HEAD/CHANGELOG.md#2025-08-18-FreshRSS-1270)

[Compare Source](FreshRSS/FreshRSS@1.26.3...1.27.0)

- Features
  - Implement support for HTTP `429 Too Many Requests` and `503 Service Unavailable`, obey `Retry-After` [#&#8203;7760](FreshRSS/FreshRSS#7760)
  - Add sort by category title, or by feed title [#&#8203;7702](FreshRSS/FreshRSS#7702)
  - Add search operator `c:` for categories like `c:23,34` or `!c:45,56` [#&#8203;7696](FreshRSS/FreshRSS#7696)
  - Custom feed favicons [#&#8203;7646](FreshRSS/FreshRSS#7646), [#&#8203;7704](FreshRSS/FreshRSS#7704), [#&#8203;7717](FreshRSS/FreshRSS#7717),
    [#&#8203;7792](FreshRSS/FreshRSS#7792)
  - Rework fetch favicons for fewer HTTP requests [#&#8203;7767](FreshRSS/FreshRSS#7767)
  - Add more unicity criteria based on title and/or content [#&#8203;7789](FreshRSS/FreshRSS#7789)
  - Automatically restore user configuration from backup [#&#8203;7682](FreshRSS/FreshRSS#7682)
  - API add support for states in `s` parameter of `streamId` [#&#8203;7695](FreshRSS/FreshRSS#7695)
  - Improve sharing via Print [#&#8203;7728](FreshRSS/FreshRSS#7728)
  - Redirect to the login page from bookmarklet instead of 403 [#&#8203;7782](FreshRSS/FreshRSS#7782)
  - Clean local cache more often, when refreshing feeds [#&#8203;7827](FreshRSS/FreshRSS#7827)
- Security
  - Implement reauthentication (*sudo* mode) [#&#8203;7753](FreshRSS/FreshRSS#7753)
  - Add `Content-Security-Policy: frame-ancestors` [#&#8203;7677](FreshRSS/FreshRSS#7677)
  - Ensure CSP everywhere [#&#8203;7810](FreshRSS/FreshRSS#7810)
  - Show warning when unsafe CSP policy is in use [#&#8203;7804](FreshRSS/FreshRSS#7804)
  - Fix access rights when creating a new user [#&#8203;7783](FreshRSS/FreshRSS#7783)
  - Improve security of form for user details [#&#8203;7771](FreshRSS/FreshRSS#7771), [#&#8203;7786](FreshRSS/FreshRSS#7786)
  - Disallow setting non-existent theme [#&#8203;7722](FreshRSS/FreshRSS#7722)
  - Regenerate cookie ID after logging out [#&#8203;7762](FreshRSS/FreshRSS#7762)
  - Require current password when setting new password [#&#8203;7763](FreshRSS/FreshRSS#7763)
  - Add missing access checks for feed-related actions [#&#8203;7768](FreshRSS/FreshRSS#7768)
  - Strip more unsafe attributes such as `referrerpolicy`, `ping` [#&#8203;7770](FreshRSS/FreshRSS#7770)
  - Remove unneeded execution permissions [#&#8203;7802](FreshRSS/FreshRSS#7802)
- Bug fixing
  - Fix redirections when scraping from HTML [#&#8203;7654](FreshRSS/FreshRSS#7654), [#&#8203;7741](FreshRSS/FreshRSS#7741)
  - Fix multiple authentication HTTP headers [#&#8203;7703](FreshRSS/FreshRSS#7703)
  - Fix HTML queries with a single feed [#&#8203;7730](FreshRSS/FreshRSS#7730)
  - WebSub: only perform a redirection when coming from WebSub [#&#8203;7738](FreshRSS/FreshRSS#7738)
  - Include enclosures in entries’ hash [#&#8203;7719](FreshRSS/FreshRSS#7719)
    - Negative side-effect: users of the option to *automatically mark updated articles as unread* will once have some articles with enclosures re-appear as unread
  - Fix cancellation of slider exit UI [#&#8203;7705](FreshRSS/FreshRSS#7705)
  - Honor *disable update* on update page [#&#8203;7733](FreshRSS/FreshRSS#7733)
  - Fix no registration limit setting [#&#8203;7751](FreshRSS/FreshRSS#7751)
  - Fix XML encoding of sharing functions [#&#8203;7822](FreshRSS/FreshRSS#7822)
- SimplePie
  - Fix propagation of HTTP error codes [#&#8203;7670](FreshRSS/FreshRSS#7670)
  - Fix support for XML feeds with HTML entities [#&#8203;7689](FreshRSS/FreshRSS#7689), [simplepie#915](simplepie/simplepie#915)
  - Fix feeds encoded in UTF-16LE [#&#8203;7691](FreshRSS/FreshRSS#7691), [simplepie#916](simplepie/simplepie#916)
  - Various upstream contributions [simplepie#917](simplepie/simplepie#917), [simplepie#924](simplepie/simplepie#924),
    [simplepie#926](simplepie/simplepie#926), [simplepie#932](simplepie/simplepie#932), [simplepie#933](simplepie/simplepie#933)
  - Sync upstream [#&#8203;7706](FreshRSS/FreshRSS#7706), [FreshRSS/simplepie#45](FreshRSS/simplepie#45), [#&#8203;7775](FreshRSS/FreshRSS#7775),
    [FreshRSS/simplepie#50](FreshRSS/simplepie#50), [#&#8203;7824](FreshRSS/FreshRSS#7824), [#&#8203;7825](FreshRSS/FreshRSS#7825),
  - Fix regex *Backtrack limit was exhausted* in `clean_hash()` [#&#8203;7813](FreshRSS/FreshRSS#7813), [FreshRSS/simplepie#48](FreshRSS/simplepie#48)
- Deployment
  - Docker default image (Debian 12 Bookworm) updated to PHP 8.2.29 [#&#8203;7805](FreshRSS/FreshRSS#7805)
  - Docker alternative image updated to Alpine 3.22 with PHP 8.4.11 and Apache 2.4.65 [#&#8203;7740](FreshRSS/FreshRSS#7740), [#&#8203;7740](FreshRSS/FreshRSS#7740),
    [#&#8203;7803](FreshRSS/FreshRSS#7803)
  - Start supporting PHP 8.5+ [#&#8203;7787](FreshRSS/FreshRSS#7787), [#&#8203;7826](FreshRSS/FreshRSS#7826)
    - Docker Alpine dev image `:newest` updated to PHP 8.5-alpha and Apache 2.4.65 [#&#8203;7773](FreshRSS/FreshRSS#7773)
  - Docker: interpolate `FRESHRSS_INSTALL` and `FRESHRSS_USER` variables [#&#8203;7725](FreshRSS/FreshRSS#7725)
  - Docker: Reduce how much data needs to be chown/chmod’ed on container startup [#&#8203;7793](FreshRSS/FreshRSS#7793)
  - Test for database PDO typing support during install (relevant for MySQL / MariaDB with obsolete driver) [#&#8203;7651](FreshRSS/FreshRSS#7651)
- Extensions
  - Add API endpoint for extensions [#&#8203;7576](FreshRSS/FreshRSS#7576)
  - Expose the reading modes for extensions [#&#8203;7668](FreshRSS/FreshRSS#7668), [#&#8203;7688](FreshRSS/FreshRSS#7688)
  - New extension hook `before_login_btn` [#&#8203;7761](FreshRSS/FreshRSS#7761)
- UI
  - Improve *mark as read* request showing popup due to `onbeforeunload` [#&#8203;7554](FreshRSS/FreshRSS#7554)
  - Fix lazy-loading for `<video poster="...">` and `<image>` [#&#8203;7636](FreshRSS/FreshRSS#7636)
  - Avoid styling `<code>` inside of `<pre>` [#&#8203;7797](FreshRSS/FreshRSS#7797)
  - Improve confirmation logic with `data-auto-leave-validation` [#&#8203;7785](FreshRSS/FreshRSS#7785)
  - Update `chart.js` to 4.5.0 [#&#8203;7752](FreshRSS/FreshRSS#7752), [#&#8203;7816](FreshRSS/FreshRSS#7816)
  - Various UI and style improvements: [#&#8203;7616](FreshRSS/FreshRSS#7616), [#&#8203;7811](FreshRSS/FreshRSS#7811)
- I18n
  - Show translation status in README [#&#8203;7715](FreshRSS/FreshRSS#7715)
  - Improve Indonesian [#&#8203;7654](FreshRSS/FreshRSS#7654), [#&#8203;7721](FreshRSS/FreshRSS#7721)
  - Improve Persian [#&#8203;7795](FreshRSS/FreshRSS#7795)
- Misc.
  - Improve PHP code [#&#8203;7642](FreshRSS/FreshRSS#7642), [#&#8203;7665](FreshRSS/FreshRSS#7665), [#&#8203;7761](FreshRSS/FreshRSS#7761),
    [#&#8203;7781](FreshRSS/FreshRSS#7781), [#&#8203;7794](FreshRSS/FreshRSS#7794)
  - Update dev dependencies [#&#8203;7708](FreshRSS/FreshRSS#7708), [#&#8203;7709](FreshRSS/FreshRSS#7709), [#&#8203;7710](FreshRSS/FreshRSS#7710),
    [#&#8203;7711](FreshRSS/FreshRSS#7711), [#&#8203;7776](FreshRSS/FreshRSS#7776), [#&#8203;7777](FreshRSS/FreshRSS#7777)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MS4zNS4wIiwidXBkYXRlZEluVmVyIjoiNDEuMzUuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiaW1hZ2UiXX0=-->

Reviewed-on: https://gitea.alexlebens.dev/alexlebens/infrastructure/pulls/1253
Co-authored-by: Renovate Bot <renovate-bot@alexlebens.net>
Co-committed-by: Renovate Bot <renovate-bot@alexlebens.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants