Prefer place name in UA/browser language #19

Merged
raucao merged 1 commits from feature/16-place_names into master 2026-02-10 15:20:23 +00:00
4 changed files with 38 additions and 5 deletions

View File

@ -2,6 +2,7 @@ import Component from '@glimmer/component';
import { fn } from '@ember/helper';
import { on } from '@ember/modifier';
import { humanizeOsmTag } from '../utils/format-text';
import { getLocalizedName } from '../utils/osm';
import Icon from '../components/icon';
import PlaceEditForm from './place-edit-form';
@ -22,8 +23,7 @@ export default class PlaceDetails extends Component {
get name() {
return (
this.place.title ||
this.tags.name ||
this.tags['name:en'] ||
getLocalizedName(this.tags) ||
'Unnamed Place'
);
}

View File

@ -7,6 +7,7 @@ import or from 'ember-truth-helpers/helpers/or';
import PlaceDetails from './place-details';
import Icon from './icon';
import humanizeOsmTag from '../helpers/humanize-osm-tag';
import { getLocalizedName } from '../utils/osm';
export default class PlacesSidebar extends Component {
@service storage;
@ -85,8 +86,7 @@ export default class PlacesSidebar extends Component {
} else {
// It's a fresh POI -> Save it
const placeData = {
title:
place.osmTags.name || place.osmTags['name:en'] || 'Untitled Place',
title: getLocalizedName(place.osmTags, 'Untitled Place'),
lat: place.lat,
lon: place.lon,
tags: [],

View File

@ -1,4 +1,5 @@
import Service, { service } from '@ember/service';
import { getLocalizedName } from '../utils/osm';
export default class OsmService extends Service {
@service settings;
@ -61,7 +62,7 @@ out center;
normalizePoi(poi) {
return {
title: poi.tags?.name || poi.tags?.['name:en'] || 'Untitled Place',
title: getLocalizedName(poi.tags),
lat: poi.lat || poi.center?.lat,
lon: poi.lon || poi.center?.lon,
url: poi.tags?.website,

32
app/utils/osm.js Normal file
View File

@ -0,0 +1,32 @@
export function getLocalizedName(tags, defaultName = 'Untitled Place') {
if (!tags) return defaultName;
// 1. Get user's preferred languages
const languages = navigator.languages || [navigator.language || 'en'];
// 2. Try to find a match for each preferred language
for (const lang of languages) {
if (!lang) continue;
// Handle "en-US", "de-DE", etc. -> look for "name:en", "name:de"
const shortLang = lang.split('-')[0];
const tagKey = `name:${shortLang}`;
if (tags[tagKey]) {
return tags[tagKey];
}
}
// 3. Fallback to standard "name"
if (tags.name) {
return tags.name;
}
// 4. Fallback to "name:en" (common in international places without local name)
if (tags['name:en']) {
return tags['name:en'];
}
// 5. Final fallback
return defaultName;
}