mehr sprachen

This commit is contained in:
pauli 2026-05-20 09:18:40 +02:00
parent 84fc5b1b07
commit add2e6aa46

152
app.py
View File

@ -142,6 +142,13 @@ TRANSLATIONS = {
'es': 'Estos dos equipos no se enfrentaron en las simulaciones.',
'ru': 'Эти две команды не встретились в симуляциях.',
},
'did_not_reach_stage': {
'de': '{team} hat das {stage} in den Simulationen nicht erreicht.',
'en': '{team} did not reach the {stage} in the simulations.',
'fr': '{team} na pas atteint le {stage} dans les simulations.',
'es': '{team} no alcanzó {stage} en las simulaciones.',
'ru': '{team} не вышла в {stage} в симуляциях.',
},
'total_encounters': {
'de': '- Insgesamt {count} Begegnungen mit Deutschland ({prob} der Simulationen)',
'en': '- Total {count} meetings with Germany ({prob} of simulations)',
@ -240,6 +247,27 @@ TRANSLATIONS = {
'es': '{team} llega a {stage} en **{value}** de las simulaciones.',
'ru': '{team} выходит в {stage} в **{value}** симуляциях.',
},
'select_team': {
'de': 'Team auswählen',
'en': 'Select team',
'fr': 'Choisir une équipe',
'es': 'Selecciona un equipo',
'ru': 'Выберите команду',
},
'column_opponent': {
'de': 'Gegner',
'en': 'Opponent',
'fr': 'Adversaire',
'es': 'Rival',
'ru': 'Соперник',
},
'Probability': {
'de': 'Wahrscheinlichkeit',
'en': 'Probability',
'fr': 'Probabilité',
'es': 'Probabilidad',
'ru': 'Вероятность',
},
'possible_opponents': {
'de': 'Mögliche Gegner von {team}',
'en': 'Possible opponents for {team}',
@ -285,11 +313,11 @@ TRANSLATIONS = {
}
ROUND_NAMES = {
'de': {'R32': 'Runde der letzten 32', 'R16': 'Achtelfinale', 'QF': 'Viertelfinale', 'SF': 'Halbfinale', 'Final': 'Finale'},
'en': {'R32': 'Round of 32', 'R16': 'Round of 16', 'QF': 'Quarterfinal', 'SF': 'Semifinal', 'Final': 'Final'},
'fr': {'R32': '8es', 'R16': '8es', 'QF': 'Quarts', 'SF': 'Démis', 'Final': 'Finale'},
'es': {'R32': 'Octavos', 'R16': 'Octavos', 'QF': 'Cuartos', 'SF': 'Semifinales', 'Final': 'Final'},
'ru': {'R32': '1/8', 'R16': '1/8', 'QF': '1/4', 'SF': '1/2', 'Final': 'Финал'},
'de': {'R32': 'Runde der letzten 32', 'R16': 'Achtelfinale', 'QF': 'Viertelfinale', 'SF': 'Halbfinale', 'Final': 'Finale', 'Winner': 'Sieg'},
'en': {'R32': 'Round of 32', 'R16': 'Round of 16', 'QF': 'Quarterfinal', 'SF': 'Semifinal', 'Final': 'Final', 'Winner': 'Winner'},
'fr': {'R32': '8es', 'R16': '8es', 'QF': 'Quarts', 'SF': 'Démis', 'Final': 'Finale', 'Winner': 'Victoire'},
'es': {'R32': 'Octavos', 'R16': 'Octavos', 'QF': 'Cuartos', 'SF': 'Semifinales', 'Final': 'Final', 'Winner': 'Victoria'},
'ru': {'R32': '1/8', 'R16': '1/8', 'QF': '1/4', 'SF': '1/2', 'Final': 'Финал', 'Winner': 'Победа'},
}
COLUMN_LABELS = {
@ -1129,13 +1157,113 @@ def main():
with tab2:
st.subheader(translate('germany_comparison_header', lang))
st.markdown(
translate(
'germany_reaches',
lang,
team=display_team_name('Germany', lang),
stage=stage_label('R16', lang),
value=f'{germany[
for r in ['R16', 'QF', 'SF', 'Final', 'Winner']:
st.markdown(
translate(
'germany_reaches',
lang,
team=display_team_name('Germany', lang),
stage=stage_label(r, lang),
value=f"{germany[r] / n:.1%}",
)
)
st.subheader(translate('possible_opponents', lang, team=display_team_name('Germany', lang)))
for r in ['R32', 'R16', 'QF', 'SF', 'Final']:
cnt = counters[r]
total = sum(cnt.values())
st.markdown(f"**{stage_label(r, lang)}**")
if total == 0:
st.write(
translate(
'did_not_reach_stage',
lang,
team=display_team_name('Germany', lang),
stage=stage_label(r, lang),
)
)
continue
df = pd.DataFrame([
{'Opponent': k, 'Count': v, 'Probability': v / total}
for k, v in cnt.most_common()
])
df = df.rename(columns={
'Opponent': translate('column_opponent', lang),
'Count': label('Count', lang),
'Probability': translate('Probability', lang),
})
st.dataframe(df)
st.subheader(translate('team_summary_header', lang))
team_rows = []
for team, stats in team_stats.items():
team_rows.append({
label('team', lang): display_team_name(team, lang),
label('avg_group_wins', lang): stats['group_wins'] / n,
label('avg_group_draws', lang): stats['group_draws'] / n,
label('avg_group_losses', lang): stats['group_losses'] / n,
label('place_1', lang): stats['group_positions'][1] / n,
label('place_2', lang): stats['group_positions'][2] / n,
label('place_3', lang): stats['group_positions'][3] / n,
label('place_4', lang): stats['group_positions'][4] / n,
label('R16', lang): stats['R16'] / n,
label('QF', lang): stats['QF'] / n,
label('SF', lang): stats['SF'] / n,
label('Final', lang): stats['Final'] / n,
label('Winner', lang): stats['Winner'] / n,
})
summary_df = pd.DataFrame(team_rows).sort_values(label('R16', lang), ascending=False)
st.dataframe(summary_df)
team_options = ['Germany'] + [t for t in sorted(teams) if t != 'Germany']
selected_team = st.selectbox(
translate('select_team', lang),
team_options,
format_func=lambda t: display_team_name(t, lang),
)
if selected_team:
selected = team_stats[selected_team]
st.subheader(
translate('detailed_overview', lang, team=display_team_name(selected_team, lang))
)
st.markdown(
translate(
'group_place_line',
lang,
p1=f"{selected['group_positions'][1] / n:.1%}",
p2=f"{selected['group_positions'][2] / n:.1%}",
p3=f"{selected['group_positions'][3] / n:.1%}",
p4=f"{selected['group_positions'][4] / n:.1%}",
)
)
st.markdown(
translate(
'average_group_results',
lang,
wins=f"{selected['group_wins'] / n:.2f}",
draws=f"{selected['group_draws'] / n:.2f}",
losses=f"{selected['group_losses'] / n:.2f}",
)
)
st.markdown(
translate(
'stage_stats_line',
lang,
r16=f"{selected['R16'] / n:.1%}",
qf=f"{selected['QF'] / n:.1%}",
sf=f"{selected['SF'] / n:.1%}",
final=f"{selected['Final'] / n:.1%}",
winner=f"{selected['Winner'] / n:.1%}",
)
)
else:
st.warning(translate('please_start', lang))
st.markdown(translate('final_note', lang))
if __name__ == '__main__':
main()
if __name__ == '__main__':
main()