swift-foundation icon indicating copy to clipboard operation
swift-foundation copied to clipboard

Custom Dimension: how to support internationalisation in the symbols and UnitLength?

Open alpennec opened this issue 1 year ago • 1 comments

I've defined a custom Dimension to represent the pace.

public final class UnitPace: Dimension {
    public static let secondsPerMeter = UnitPace(
        symbol: "s/m",
        converter: UnitConverterLinear(coefficient: 1)
    )
}

extension Measurement where UnitType == UnitPace {
     public init(
        minutes: Int,
        seconds: Int,
        unit: UnitPace
    ) {
        let value = Double(minutes) + Double(seconds) / 60
        
        self.init(
            value: value,
            unit: unit
        )
    }
}

I want to format a Measurement<UnitPace> so it can be shown in the UI.

let paceMeasurement: Measurement<UnitPace> = Measurement<UnitPace>(
     minutes: 5, 
     seconds: 30, 
     unit: .secondsPerMeter
)
                                            
Text(paceMeasurement.formatted(.measurement(width: .narrow, numberFormatStyle: .number.precision(.fractionLength(0...1)))) ?? "-")

// "... s/m" is displayed

How can I specify the localised strings for the different UnitStyle (short, medium, long) / UnitWidth (wide, abbreviated, narrow) to use?

alpennec avatar Mar 22 '24 09:03 alpennec

It's currently impossible to extend localization support to custom Dimension, unfortunately. Currently we rely exclusively on ICU to fetch the localization. I imagine we'd need to add a hook in Measurement.FormatStyle to take localization via, say, our string localization infrastructure. Such "hook" will probably be public to allow extension in your own type, which means new API as well.

itingliu avatar Apr 04 '24 23:04 itingliu