Added basic i18n

This commit is contained in:
2026-03-10 15:18:34 +08:00
parent 093a8745ac
commit 7d1de5f781
25 changed files with 660 additions and 105 deletions

View File

@@ -2,10 +2,12 @@ package kmb
import (
"fmt"
"math"
"sort"
"strings"
"time"
i18n "github.com/tgckpg/golifehk/i18n"
query "github.com/tgckpg/golifehk/query"
utils "github.com/tgckpg/golifehk/utils"
)
@@ -19,6 +21,9 @@ type QueryResult struct {
isConsumed bool
dataType string
tableData [][]query.TableCell
FallbackNearest int
NearestRange float64
}
func writeRouteHead(sb *strings.Builder, r *RouteStop) {
@@ -64,6 +69,11 @@ func (this *QueryResult) Message() (string, error) {
return "", this.Error
}
langPack, err := i18n.LoadKeys(this.Lang)
if err != nil {
return "", err
}
sb := strings.Builder{}
if 0 < len(*this.Query.Results) {
@@ -72,23 +82,38 @@ func (this *QueryResult) Message() (string, error) {
if this.Query.Key == "" {
loc := this.Query.Message.Location
if loc != nil {
sb.WriteString("九巴 100m")
this.dataType = "Table"
table := [][]query.TableCell{}
minDist := math.MaxFloat64
maxDist := -1.0
for _, item := range *this.Query.Results {
b := any(item).(*BusStop)
row := []query.TableCell{}
bDist := b.Dist(loc.Lat(), loc.Lon())
if bDist < minDist {
minDist = bDist
}
if maxDist < bDist {
maxDist = bDist
}
cell := query.TableCell{
Name: fmt.Sprintf("%.2fm %s", b.Dist(loc.Lat(), loc.Lon()), (*b.Name)[this.Lang]),
Name: fmt.Sprintf("%s (%s)", (*b.Name)[this.Lang], i18n.FormatDistance(langPack, bDist)),
Value: fmt.Sprintf("%s", b.BusStopId),
}
row = append(row, cell)
for _, r := range *b.Routes {
for colIndex, r := range *b.Routes {
if colIndex%6 == 0 {
table = append(table, row)
row = []query.TableCell{}
}
sb_i := strings.Builder{}
writeRouteHead(&sb_i, r)
cell := query.TableCell{
@@ -102,6 +127,13 @@ func (this *QueryResult) Message() (string, error) {
}
this.tableData = table
rangeText := i18n.FormatDistance(langPack, this.NearestRange)
if maxDist < this.NearestRange {
utils.WriteMDv2Text(&sb, i18n.DS_KMB_NEAREST_STOPS.Text(langPack, rangeText))
} else if this.NearestRange < minDist {
utils.WriteMDv2Text(&sb, i18n.DS_KMB_NO_NEAREST_STOPS.Text(langPack, rangeText, this.FallbackNearest))
}
} else {
busStops := map[string]*BusStop{}
for _, item := range *this.Query.Results {
@@ -149,16 +181,13 @@ func (this *QueryResult) Message() (string, error) {
_m := schedule.ETA.Sub(now).Minutes()
sb.WriteString(" \\* ")
txt := "%.0f min(s)"
if this.Lang == "zh-Hant" {
txt = "%.0f 分鐘"
}
utils.WriteMDv2Text(&sb, fmt.Sprintf(txt, _m))
eta := i18n.UNITS_MINUTE.Text(langPack, _m)
if _m < 0 {
sb.WriteString(" 走左了?")
utils.WriteMDv2Text(&sb, i18n.DS_KMB_ETA_DEPARTED.Text(langPack, eta))
} else {
utils.WriteMDv2Text(&sb, eta)
}
}

View File

@@ -14,7 +14,11 @@ func Query(q query.QueryMessage) query.IQueryResult {
var err error
var routeStops *[]query.ISearchable
qr := QueryResult{Lang: lang}
qr := QueryResult{
Lang: lang,
FallbackNearest: 3,
NearestRange: 50,
}
busStops, err := readBusStopsData()
if err != nil {
@@ -37,7 +41,7 @@ func Query(q query.QueryMessage) query.IQueryResult {
bList = append(bList, b)
}
qo, err = query.MatchNearest(*q.Location, &bList, 100, 3)
qo, err = query.MatchNearest(*q.Location, &bList, qr.NearestRange, qr.FallbackNearest)
}
qo.Message = &q

View File

@@ -1,36 +1,54 @@
package kmb
import (
"fmt"
"fmt"
query "github.com/tgckpg/golifehk/query"
"testing"
)
func TestQuerySchedule( t *testing.T ) {
qo := Query( "zh-Hant", "68X" )
mesg, err := qo.Message()
if err != nil {
t.Errorf( "Unexpected Error: %s", err )
}
fmt.Println( mesg )
func TestQuerySchedule(t *testing.T) {
qo := Query(query.QueryMessage{Lang: "zh-Hant", Text: "68X"})
mesg, err := qo.Message()
if err != nil {
t.Errorf("Unexpected Error: %s", err)
}
qo = Query( "zh-Hant", "K66 朗屏" )
mesg, err = qo.Message()
if err == nil {
t.Errorf( "Expected Error: %s, got \"\" instead", mesg )
}
qo = Query(query.QueryMessage{Lang: "zh-Hant", Text: "K66 朗屏"})
mesg, err = qo.Message()
if err == nil {
t.Errorf("Expected Error: %s, got \"\" instead", mesg)
}
qo = Query( "zh-Hant", "大欖" )
mesg, err = qo.Message()
if err != nil {
t.Errorf( "Unexpected Error: %s", err )
}
qo = Query(query.QueryMessage{Lang: "zh-Hant", Text: "大欖"})
mesg, err = qo.Message()
if err != nil {
t.Errorf("Unexpected Error: %s", err)
}
fmt.Println( mesg )
qo = Query(query.QueryMessage{Lang: "zh-Hant", Text: "261B 大欖"})
mesg, err = qo.Message()
if err != nil {
t.Errorf("Unexpected Error: %s", err)
}
qo = Query( "zh-Hant", "261B 大欖" )
mesg, err = qo.Message()
if err != nil {
t.Errorf( "Unexpected Error: %s", err )
}
fmt.Println( mesg )
qo = Query(query.QueryMessage{
Lang: "zh-Hant", Text: "",
// Yuen Long Plaza
// Location: &query.GeoLocation{22.444894482044997, 114.02393826485495},
// Nathan Rd
// Location: &query.GeoLocation{22.308944848482525, 114.17116565400259},
// GO PARK
Location: &query.GeoLocation{22.427238734660868, 114.26595846515744},
})
mesg, err = qo.Message()
if err != nil {
t.Errorf("Unexpected Error: %s", err)
}
for _, row := range qo.GetTableData() {
for _, cell := range row {
fmt.Printf("| %s |", cell.Name)
}
fmt.Print("\n")
}
}

View File

@@ -5,8 +5,9 @@ import (
)
func TestRouteStops(t *testing.T) {
_, err := getRouteStops()
if err != nil {
t.Error( err )
}
busStops, err := readBusStopsData()
_, err = getRouteStops(busStops)
if err != nil {
t.Error(err)
}
}